/** * Add new gitolite repository * @throws ValidationErrors */ function add_git_repo() { $is_gitolite = GitoliteAdmin::is_gitolite(); if (!ProjectSourceRepositories::canAdd($this->logged_user, $this->active_project)) { $this->response->forbidden(); } // if $project = $this->active_project; $project_id = $project->getId(); $logged_user = $this->logged_user; $user_id = $logged_user->getId(); $no_key_warning = FALSE; $view_url = ""; if (AngieApplication::isModuleLoaded("source") && $this->getControllerName() == 'project_tracking_gitolite') { $do_continue = true; } if ($do_continue) { $project_users = Projects::findById($project_id); // Prepare users map $users_details = $this->active_project->users()->describe($this->logged_user, true, true, STATE_VISIBLE); $user_detail_permissions = array(); $repoobj = new ProjectSourceRepositories(); if (is_foreachable($users_details)) { foreach ($users_details as $key => $value) { // check key exists $user_keys = GitoliteAc::check_keys_added($value['user']['id']); if ($user_keys > 0) { $objuser = new rtmUser($value['user']['id']); $user_detail_permissions[$value['user']['id']] = array('readaccess' => $repoobj->canAccess($objuser, $project), 'writeaccess' => $repoobj->canAdd($objuser, $project), 'writeaccessplus' => $repoobj->canManage($objuser, $project), 'user_keys' => $user_keys); $allowed_users[$value['user']['id']] = $value['user']['name']; } } } // Add Administrator , Leaders and Project Manager in allowed people list if ($this->logged_user->isAdministrator() || $this->logged_user->isProjectManager()) { $objuser = new rtmUser($user_id); $user_keys = GitoliteAc::check_keys_added($user_id); if ($user_keys) { $user_detail_permissions[$user_id] = array('readaccess' => $repoobj->canAccess($objuser, $project), 'writeaccess' => $repoobj->canAdd($objuser, $project), 'writeaccessplus' => $repoobj->canManage($objuser, $project), 'user_keys' => $user_keys); $allowed_users[$user_id] = $logged_user->getName(); } else { $no_key_warning = TRUE; $view_url = $this->logged_user->getViewUrl(); } } $this->response->assign(array('curr_users' => $allowed_users, 'user_detail_permissions' => $user_detail_permissions, 'form_action' => Router::assemble('add_git_repository', array('project_slug' => $project->getSlug())), 'noaccess' => GITOLITE_NOACCESS, 'readaccess' => GITOLITE_READACCESS, 'manageaccess' => GITOLITE_MANAGEACCESS, 'is_gitolite' => $is_gitolite, 'no_key_warning' => $no_key_warning, 'view_url' => $view_url)); } else { $this->response->assign(array('add_error' => TRUE)); } if ($this->request->isSubmitted()) { // check for form submission try { /* Check form with validation error */ $repository_data = $this->request->post('repository'); /* print_r($repository_data); die(); */ $errors = new ValidationErrors(); $post_data = $this->request->post(); /* print_r($post_data['access']); die(); */ $settings = GitoliteAdmin::get_admin_settings(); $is_remote = !isset($settings["git_server_location"]) || $settings["git_server_location"] != "remote" ? FALSE : TRUE; if ($is_remote == FALSE) { $sever_user_path = GitoliteAdmin::get_server_user_path(); if (!$sever_user_path) { $errors->addError('Repository path on server invalid'); } } $repo_name = trim($repository_data['name']); $access = $post_data['access']; if ($repo_name == "") { $errors->addError('Please enter repository name', 'repo_name'); } if (!is_array($access) && count($access) == 0) { $errors->addError('Select access levels for user', 'access'); } /* Check for duplications repository name and Key */ if (!$errors->hasErrors()) { if (!preg_match("/^[A-Za-z0-9-]+\$/", $repo_name)) { $errors->addError('Please enter valid repository name.', 'repo_name'); } $dup_cnt = ProjectGitolite::check_duplication($project_id, $repository_data); if (count($dup_cnt) == 0) { $errors->addError('Problem occured while saving data, please try again.'); } elseif (count($dup_cnt) > 0) { if ($dup_cnt[0]['dup_name_cnt'] > 0) { $errors->addError('Repository name already used'); } } } // if errors found throw error exception if ($errors->hasErrors()) { throw $errors; } /** save gitolite details in database * */ // save reponame try { DB::beginWork('Creating a new repository @ ' . __CLASS__); /** * if gitolite is setup on remote, change repo path */ if (!$is_remote) { $repo_path = $sever_user_path . "/repositories/" . $repository_data['name'] . ".git"; } elseif ($is_remote) { $repo_path = GIT_FILES_PATH . "/" . $repo_name; } if (is_array($post_data)) { $repository_path_url = array('repository_path_url' => $repo_path); $notif_setting = isset($repository_data["disable_notifications"]) ? "yes" : "no"; $repo_notification_setting = array('repo_notification_setting' => $notif_setting); } $repository_data = array_merge($repository_data, $repository_path_url); $repository_data = array_merge($repository_data, $repo_notification_setting); $this->active_repository = new GitRepository(); $this->active_repository->setAttributes($repository_data); $this->active_repository->setCreatedBy($this->logged_user); $this->active_repository->save(); $repo_fk = $this->active_repository->getId(); if ($repo_fk) { $clone_url = $settings['git_clone_url'] . $repo_name; $body = $clone_url; $this->project_object_repository->setName($this->active_repository->getName()); $this->project_object_repository->setBody($body); $this->project_object_repository->setParentId($this->active_repository->getId()); $this->project_object_repository->setVisibility($repository_data['visibility']); $this->project_object_repository->setProjectId($this->active_project->getId()); $this->project_object_repository->setCreatedBy($this->logged_user); $this->project_object_repository->setState(STATE_VISIBLE); $this->project_object_repository->save(); $repo_id = ProjectGitolite::add_repo_details($repo_fk, $project_id, $user_id, $repo_path, $repository_data, $clone_url); if ($repo_id) { $add_access = ProjectGitolite::add_access_levels($repo_id, serialize($post_data['access']), $user_id, 1); if ($add_access) { $res = ProjectGitolite::render_conf_file(); $dir = $settings['gitoliteadminpath'] . "gitolite-admin"; $command = "cd " . $dir . " && git add * && git commit -am 'render conf file' && git push || echo 'Not found'"; exec($command, $output, $return_var); if ($is_remote) { $git_server = $settings['git_clone_url']; //$command = "cd ".$settings['gitoliteadminpath']." && git clone ".$git_server.":".$repo_name; chdir(GIT_FILES_PATH); $command = "git clone " . $git_server . $repo_name; exec($command, $output, $return_var); /* @set_time_limit(0); $pull_all_branches = ProjectGitolite::pull_branches($repo_path); if(!$pull_all_branches) { @ProjectGitolite::remove_directory($work_git_path); $errors->addError('Error while saving branches.'); throw $errors; } */ } } else { $errors->addError('Error while saving access levels.'); throw $errors; } } else { $errors->addError('Error while saving repository.'); throw $errors; } } else { $errors->addError('Error while saving repository.'); throw $errors; } DB::commit('Repository created @ ' . __CLASS__); $this->response->respondWithData($this->active_repository); } catch (Exception $e) { DB::rollback('Failed to create a repository @ ' . __CLASS__); $this->response->exception($e); } } catch (Exception $e) { DB::rollback('Failed to create a repository @ ' . __CLASS__); $this->response->exception($e); } } }
function add_source_gitolite_repository() { $is_gitolite = GitoliteAdmin::is_gitolite(); $logged_user = $this->logged_user; $user_id = $logged_user->getId(); $no_key_warning = FALSE; $view_url = ""; if (AngieApplication::isModuleLoaded("source") && $this->getControllerName() == 'ac_gitolite_source') { $do_continue = true; } if ($do_continue) { // Add Administrator , Leaders and Project Manager in allowed people list //$role = new Roles(); //$admins = $role::findAdministrators(); $usrobj = new Users(); $users_details = $usrobj->findAdministrators(); if (is_foreachable($users_details)) { foreach ($users_details as $key => $value) { // check key exists $user_keys = GitoliteAc::check_keys_added($value->getId()); if ($user_keys > 0) { $user_detail_permissions[$value->getId()] = array('readaccess' => 0, 'writeaccess' => 0, 'writeaccessplus' => 1, 'user_keys' => $user_keys); $allowed_users[$value->getId()] = $value->getDisplayName(); } } } $this->response->assign(array('curr_users' => $allowed_users, 'user_detail_permissions' => $user_detail_permissions, 'form_action' => Router::assemble('add_source_gitolite_repository'), 'noaccess' => GITOLITE_NOACCESS, 'readaccess' => GITOLITE_READACCESS, 'manageaccess' => GITOLITE_MANAGEACCESS, 'is_gitolite' => $is_gitolite, 'no_key_warning' => $no_key_warning, 'view_url' => $view_url)); } else { $this->response->assign(array('add_error' => TRUE)); } if ($this->request->isSubmitted()) { // check for form submission try { /* Check form with validation error */ $repository_data = $this->request->post('repository'); if (!isset($repository_data["repo_notification_setting"])) { $repository_data["repo_notification_setting"] = "no"; } $errors = new ValidationErrors(); $post_data = $this->request->post(); $settings = GitoliteAdmin::get_admin_settings(); $is_remote = !isset($settings["git_server_location"]) || $settings["git_server_location"] != "remote" ? false : true; if (!$is_remote) { $sever_user_path = GitoliteAdmin::get_server_user_path(); if (!$sever_user_path) { $errors->addError('Repository path on server invalid'); } } $repo_name = trim($repository_data['name']); $access = $post_data['access']; if ($repo_name == "") { $errors->addError('Please enter repository name', 'repo_name'); } if (!is_array($access) && count($access) == 0) { $errors->addError('Select access levels for user', 'access'); } /* Check for duplications repository name and Key */ if (!$errors->hasErrors()) { if (!preg_match("/^[A-Za-z0-9-]+\$/", $repo_name)) { $errors->addError('Please enter valid repository name.', 'repo_name'); } $dup_cnt = ProjectGitolite::check_source_git_dup($repository_data); if (count($dup_cnt) == 0) { $errors->addError('Problem occured while saving data, please try again.'); } elseif (count($dup_cnt) > 0) { if ($dup_cnt[0]['dup_name_cnt'] > 0) { $errors->addError('Repository name already used'); } } } // if errors found throw error exception if ($errors->hasErrors()) { throw $errors; } /** save gitolite details in database * */ // save reponame try { DB::beginWork('Creating a new repository @ ' . __CLASS__); /** * if gitolite is setup on remote, change repo path */ if (!$is_remote) { $repo_path = $sever_user_path . "/repositories/" . $repository_data['name'] . ".git"; } elseif ($is_remote) { $repo_path = GIT_FILES_PATH . "/" . $repo_name; } if (is_array($post_data)) { $repository_path_url = array('repository_path_url' => $repo_path); } $repository_data = array_merge($repository_data, $repository_path_url); $clone_url = $settings['git_clone_url'] . $repo_name; $this->active_repository = new GitRepository(); $this->active_repository->setAttributes($repository_data); $this->active_repository->setCreatedBy($this->logged_user); $this->active_repository->save(); $repo_fk = $this->active_repository->getId(); if ($repo_fk) { $repo_id = ProjectGitolite::add_repo_details($repo_fk, 0, $user_id, $repo_path, $repository_data, $clone_url); if ($repo_id) { $add_access = ProjectGitolite::add_access_levels($repo_id, serialize($post_data['access']), $user_id, 1); if ($add_access) { $res = ProjectGitolite::render_conf_file(); $dir = $settings['gitoliteadminpath'] . "gitolite-admin"; $command = "cd " . $dir . " && git add * && git commit -am 'render conf file' && git push || echo 'Not found'"; exec($command, $output, $return_var); if ($is_remote) { $git_server = $settings['gitoliteuser'] . "@" . $settings['gitoliteserveradd']; //$command = "cd ".$settings['gitoliteadminpath']." && git clone ".$git_server.":".$repo_name; chdir(GIT_FILES_PATH); $command = "git clone " . $git_server . ":" . $repo_name; exec($command, $output, $return_var); } } else { $errors->addError('Error while saving access levels.'); throw $errors; } } else { $errors->addError('Error while saving repository.'); throw $errors; } } else { $errors->addError('Error while saving repository.'); throw $errors; } DB::commit('Repository created @ ' . __CLASS__); $this->response->respondWithData($this->active_repository, array('as' => 'repository')); } catch (Exception $e) { DB::rollback('Failed to create a repository @ ' . __CLASS__); $this->response->exception($e); } } catch (Exception $e) { DB::rollback('Failed to create a repository @ ' . __CLASS__); $this->response->exception($e); } } }
/** * Map conf Repositories with activecollab projects * @return string message */ function map_conf_repos() { $repo_array = array(); if (count($repo_array) == 0) { $conf_file_path = GIT_FILES_PATH . "/gitolite/gitolite-admin/conf/gitolite.conf"; if (file_exists($conf_file_path)) { $conf_file_contents = file($conf_file_path); foreach ($conf_file_contents as $key => $value) { if (preg_match('/^repo\\s+(.+)/', $value, $matches) && !preg_match('/^repo\\s+(gitolite-admin)/', $value) && !preg_match('/^repo\\s+(@all)/', $value)) { $repo_name = trim($matches[1]); if (!array_key_exists($repo_name, $conf_parsed)) { $repo_array[$repo_name] = array(); } } elseif (preg_match('/(.*)=\\s(.*)/', $value, $matches)) { $pub_key = trim($matches[2]); $pub_key_access = trim($matches[1]); $repo_array[$repo_name][] = array("key_name" => $pub_key, "pub_key_access" => $pub_key_access); } } } } if (isset($_GET["prj_name"])) { $prj_id = $_GET["prj_name"]; $repo_name = $_GET["repo_name"]; $user_id = $this->logged_user->getId(); $project_obj = new Project($prj_id); $users_details = $project_obj->users()->describe($this->logged_user, true, true, STATE_VISIBLE); $users_array = array(); if (is_foreachable($users_details)) { foreach ($users_details as $key => $value) { $users_array[] = $value['user']['id']; } } $access_array = array(); try { DB::beginWork('Mapping Repositories @ ' . __CLASS__); $selected_prj = new Project($prj_id); $repository_data = array('name' => $repo_name, 'update_type' => 1, 'visibility' => 0); $settings = GitoliteAdmin::get_admin_settings(); $clone_url = $settings['gitoliteuser'] . "@" . $settings['gitoliteserveradd'] . ":" . $repo_name; $dup_cnt = ProjectGitolite::check_remote_duplication($prj_id, $repository_data, $clone_url); if ($dup_cnt[1]['dup_name_cnt'] > 0) { die('Remote URL already cloned under this project.'); } /** * Create access data * */ /* define('GITOLITE_NOACCESS', '1'); define('GITOLITE_READACCESS', '2'); define('GITOLITE_MANAGEACCESS', '3'); */ if (is_array($repo_array) && count($repo_array) > 0) { if (array_key_exists($repo_name, $repo_array)) { if (is_foreachable($repo_array[$repo_name])) { foreach ($repo_array[$repo_name] as $key => $value) { //echo $value["key_name"]."====".$value["pub_key_access"]; $key_details = GitoliteAc::get_key_details($value["key_name"]); if (is_array($key_details) && in_array($key_details["user_id"], $users_array)) { $access_array[$key_details["user_id"]] = $value["pub_key_access"] == "RW+" ? 3 : 2; } } } } } /** * Add rrepositories */ $actual_git_repo_name = $repo_name; $chk_actual_name_exists_cnt = ProjectGitolite::check_actual_name_count_gitolite($actual_git_repo_name); if (is_array($chk_actual_name_exists_cnt) && isset($chk_actual_name_exists_cnt["actual_name_cnt"])) { $cnt = $chk_actual_name_exists_cnt["actual_name_cnt"] > 0 ? $chk_actual_name_exists_cnt["actual_name_cnt"] + 1 : ""; $folder_append = $cnt != "" ? "-{$cnt}" : ""; } else { $folder_append = "-1"; } // if git repsitory name is same , we need to change the folder name while cloning the repository $folder_name = $actual_git_repo_name . $folder_append; $work_git_path = GIT_FILES_PATH . "/" . $folder_name . "/"; $repository_path_url = array('repository_path_url' => $work_git_path); $repository_data = array_merge($repository_data, $repository_path_url); $this->active_repository = new GitRepository(); $this->active_repository->setAttributes($repository_data); $this->active_repository->setCreatedBy($this->logged_user); $this->active_repository->save(); $repo_fk = $this->active_repository->getId(); if ($repo_fk) { $clone_url = $settings['gitoliteuser'] . "@" . $settings['gitoliteserveradd'] . ":" . $repo_name; $body = $clone_url; $prj_obj = new ProjectSourceRepository(); $prj_obj->setName($this->active_repository->getName()); $prj_obj->setBody($body); $prj_obj->setVisibility($repository_data['visibility']); $prj_obj->setProjectId($prj_id); $prj_obj->setCreatedBy($this->logged_user); $prj_obj->setType("ProjectSourceRepository"); $prj_obj->setModule("source"); $prj_obj->setState(STATE_VISIBLE); $prj_obj->setParentId($this->active_repository->getId()); $prj_obj->save(); $repo_id = ProjectGitolite::add_repo_details($repo_fk, $prj_id, $user_id, $work_git_path, $repository_data, $clone_url); if ($repo_id) { $add_access = ProjectGitolite::add_access_levels($repo_id, serialize($access_array), $user_id, 1); if ($add_access) { DB::commit('Repository mapped @ ' . __CLASS__); $git_server = $settings['git_clone_url']; chdir(GIT_FILES_PATH); //cd ".GIT_FILES_PATH." && $command = "git clone " . $git_server . $repo_name . " {$folder_name}"; //$command = "git clone ".$git_server.":".$repo_name; exec($command, $output, $return_var); $out = GitoliteAdmin::update_remote_repo($repo_fk); ini_set('max_execution_time', 500); $pull_all_branches = ProjectGitolite::pull_branches($actual_repo_path); if (!$pull_all_branches) { @ProjectGitolite::remove_directory($work_git_path); die("Error while saving branches."); throw $errors; } die("ok"); } else { DB::rollback('Failed to map repository @ ' . __CLASS__); echo "Error while saving access levels."; } } else { DB::rollback('Failed to map repository @ ' . __CLASS__); echo "Error while saving repository"; } } } catch (Exception $e) { DB::rollback('Mapping repositories @ ' . __CLASS__); die("Cannot map repository, try again."); } /**/ } }