public function indexAction() { $this->view->headLink()->appendStylesheet("/css/template/form.css"); $this->view->headLink()->appendStylesheet("/css/template/table.css"); $this->view->headLink()->appendStylesheet("/css/pages/project_settings.css"); $projects = new GD_Model_ProjectsMapper(); $project_slug = $this->_getParam("project"); if ($project_slug != "new") { $this->view->headTitle('Edit Project'); $project = $projects->getProjectBySlug($project_slug); $new_project = false; } else { $this->view->headTitle('Add Project'); $project = new GD_Model_Project(); $project->setName("New Project"); $project->setDeploymentBranch('master'); // Usually default for git // Load the ssh key $ssh_keys_map = new GD_Model_SSHKeysMapper(); $ssh_keys = new GD_Model_SSHKey(); $ssh_keys_map->find(1, $ssh_keys); $project->setSSHKey($ssh_keys); $new_project = true; } $this->view->project = $project; $this->view->new_project = $new_project; // Populate list of servers for this project if ($project->getId() > 0) { $servers = new GD_Model_ServersMapper(); $this->view->servers = $servers->getServersByProject($project->getId()); } $form = new GDApp_Form_ProjectSettings($project, null, $new_project); $this->view->form = $form; if ($this->getRequest()->isPost()) { if ($form->isValid($this->getRequest()->getParams())) { $result = $this->saveProject($projects, $project, $new_project, $this->_getParam("errored") == "true"); if ($result !== true) { $form->repositoryUrl->addError("Could not clone the git repository [" . $result . "]. Please check the URL is correct and try again."); } else { $this->_redirect($this->getFrontController()->getBaseUrl() . "project/" . $project->getSlug() . '/settings'); } } } else { if (!$new_project) { $git = new GD_Git($project); try { $git->checkValidRepository(); $this->view->valid_repository = true; } catch (GD_Exception $ex) { $this->view->valid_repository = false; $form->repositoryUrl->addError("Check this git repository URL - is it correct?"); GD_Debug::Log("Reclone required for {$project->getName()} (project settings)", GD_Debug::DEBUG_BASIC); } } $data = array('name' => $project->getName(), 'repositoryUrl' => $project->getRepositoryUrl(), 'deploymentBranch' => $project->getDeploymentBranch(), 'publicKey' => $project->getSSHKey()->getPublicKey()); $form->populate($data); } }
public function isValid($value) { $this->_setValue($value); $git = new GD_Git($this->_project); try { if ($git->checkValidRepository()) { if ($git->gitCheckout($value)) { return true; } } $this->_error(self::INVALID); return false; } catch (GD_Exception $ex) { $this->_error(self::NO_REPO); return false; } }
public function indexAction() { $this->view->headTitle('New Deployment'); $this->view->headScript()->appendFile($this->getFrontController()->getBaseUrl() . "/js/pages/deploy_setup.js"); $this->view->headLink()->appendStylesheet("/css/template/form.css"); $this->view->headLink()->appendStylesheet("/css/pages/deploy.css"); $projects = new GD_Model_ProjectsMapper(); $project_slug = $this->_getParam("project"); if ($project_slug != "") { $project = $projects->getProjectBySlug($project_slug); } if (is_null($project)) { throw new GD_Exception("Project '{$project_slug}' was not set up."); } $this->view->project = $project; $form = new GDApp_Form_DeploymentSetup($project->getId()); $this->view->form = $form; $deployments = new GD_Model_DeploymentsMapper(); if ($this->getRequest()->isPost()) { if ($form->isValid($this->getRequest()->getParams())) { $user = GD_Auth_Database::GetLoggedInUser(); $server_id = $this->_request->getParam('serverId', false); $last_deployment = $deployments->getLastSuccessfulDeployment($project->getId(), $server_id); if (!is_null($last_deployment)) { $from_rev = $last_deployment->getToRevision(); } else { $from_rev = ""; } $git = new GD_Git($project); $git->gitPull(); $input_to_rev = $this->_request->getParam('toRevision', false); $comment = $this->_request->getParam('comment', ''); try { $to_rev = $git->getFullHash($input_to_rev); $deployment = new GD_Model_Deployment(); $deployment->setUsersId($user->getId())->setProjectsId($project->getId())->setWhen(date("Y-m-d H:i:s"))->setServersId($server_id)->setFromRevision($from_rev)->setToRevision($to_rev)->setComment($comment)->setDeploymentStatusesId(1); $deployments->save($deployment); // Generate the list of files to deploy and save in deployment_files table try { $files_changed = $git->getFilesChangedList($deployment->getFromRevision(), $deployment->getToRevision()); } catch (GD_Exception $ex) { if ($ex->getStringCode() == GD_Git::GIT_GENERAL_NO_FILES_CHANGED) { $files_changed = array(); } else { throw $ex; } } $deployment_files = new GD_Model_DeploymentFilesMapper(); $deployment_file_statuses = new GD_Model_DeploymentFileStatusesMapper(); $deployment_file_actions = new GD_Model_DeploymentFileActionsMapper(); foreach ($files_changed as $fc) { $deployment_file = new GD_Model_DeploymentFile(); $deployment_file->setDeploymentsId($deployment->getId()); $deployment_file->setDeploymentFileActionsId($deployment_file_actions->getDeploymentFileActionByGitStatus($fc['action'])->getId()); $deployment_file->setDeploymentFileStatusesId($deployment_file_statuses->getDeploymentFileStatusByCode('NEW')->getId()); $deployment_file->setDetails($fc['file']); $deployment_files->save($deployment_file); } // Forward to either run or preview page... if ($this->_request->getParam('submitRun_x') > 0) { // go to run $this->_redirect($this->getFrontController()->getBaseUrl() . "/project/" . $this->_getParam("project") . "/deploy/run/" . $deployment->getId()); } else { if ($this->_request->getParam('submitPreview_x') > 0) { // go to preview $this->_redirect($this->getFrontController()->getBaseUrl() . "/project/" . $this->_getParam("project") . "/deploy/preview/" . $deployment->getId()); } } } catch (GD_Exception $ex) { if ($ex->getStringCode() === GD_Git::GIT_GENERAL_EMPTY_REF) { $form->toRevision->addError("Empty ref: " . $ex->getMessage()); } else { if ($ex->getStringCode() === GD_Git::GIT_GENERAL_INVALID_REF) { $form->toRevision->addError("This revision could not be found in this project. Please check it."); $form->addError("error"); } else { throw $ex; } } } } } else { $git = new GD_Git($project); try { $git->checkValidRepository(); } catch (GD_Exception $ex) { if ($ex->getStringCode() == GD_Git::GIT_STATUS_ERROR_NOT_A_REPOSITORY || $ex->getStringCode() == GD_Git::GIT_STATUS_ERROR_DIFFERENT_REPOSITORY) { $return_url = base64_encode($_SERVER['SCRIPT_URI']); $this->_redirect($this->getFrontController()->getBaseUrl() . "/error/reclone?project=" . $this->_getParam("project") . "&return=" . $return_url); } else { throw $ex; } } $data = array(); if (count($data) > 0) { $form->populate($data); } } }