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);
     }
 }
Example #2
0
 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);
         }
     }
 }