コード例 #1
0
ファイル: Controller.php プロジェクト: comdeng/firegit
 /**
  * 合并到master    ---------后期要重新优化代码@-----------
  * @param $mergeIds
  * @throws \Exception
  */
 function _mergemaster_action()
 {
     $mergeIds = $this->post('merge_ids');
     if (empty($mergeIds)) {
         throw new \Exception('firegit.merge_id_empty');
     }
     $repoTmp = TMP_ROOT . '/merge/';
     $api = new \firegit\app\mod\git\Merge();
     foreach ($mergeIds as $mergeId) {
         $repoDir = $repoTmp . '/master';
         if (is_dir($repoDir)) {
             //  stat beta
             system('rm ' . $repoDir . ' -rf');
         }
         mkdir($repoDir, 0777, true);
         chdir($repoDir);
         $mergeinfo = $api->getMerge($mergeId);
         if (!$mergeinfo) {
             throw new \Exception('firegit.u_notfound');
         }
         // 检查合并状态  只允许预上线已确认的
         if ($mergeinfo['deploy_status'] != 4) {
             throw new \Exception('firegit.u_mergeedFailed');
         }
         $origDir = GIT_REPO . $mergeinfo['repo_group'] . '/' . $mergeinfo['repo_name'] . '.git';
         // clone远程分支
         $cmd = sprintf('git clone %s -b master ./', $origDir);
         exec($cmd, $outputs, $code);
         unset($outputs);
         system('git config user.name ' . $this->user);
         system('git config user.email ' . $this->user . '@hunbasha.com');
         $cmd = sprintf('git fetch origin %s:%s', $mergeinfo['orig_branch'], $mergeinfo['orig_branch']);
         exec($cmd, $outputs, $code);
         unset($outputs);
         $cmd = sprintf('git merge -m "Merge remote-tracking branch \'%s\' into %s" %s', $mergeinfo['orig_branch'], 'master', $mergeinfo['orig_branch']);
         exec($cmd, $outputs, $code);
         $merge = new \firegit\app\mod\git\Merge();
         if ($code) {
             $merge->endMerge($mergeId, false, implode("\n", $outputs));
             throw new \Exception('firegit.merge_master_error:' . $mergeinfo['orig_branch']);
         }
         unset($outputs);
         //push 到远程
         $cmd = sprintf('git push origin master:master');
         exec($cmd, $outputs, $code);
         if ($code != 0) {
             throw new \Exception('firegit.push_master_error:' . $mergeinfo['orig_branch']);
         }
         $repo = new \firegit\git\Reposite($mergeinfo['repo_group'], $mergeinfo['repo_name']);
         //删除合并的分支
         if (!$repo->isProtected($mergeinfo['orig_branch'])) {
             $repo->delBranch($mergeinfo['orig_branch']);
             $repos = new \firegit\app\mod\git\Reposite();
             $repos->delBranch($mergeinfo['repo_group'], $mergeinfo['repo_name'], $mergeinfo['orig_branch']);
             \firegit\log\Logger::trace('merge.delBranch branch=%s hash=%s', $mergeinfo['orig_branch'], $mergeinfo['orig_hash']);
         }
         $merge->updateDeployStatus($mergeId, 0x11);
     }
 }
コード例 #2
0
ファイル: MergeTrait.php プロジェクト: comdeng/firegit
 /**
  * 处理合并请求
  */
 function _handle_merge_action()
 {
     if ($this->role != 16) {
         throw new \Exception('firegit.u_power');
     }
     $mergeId = intval($this->post('merge_id'));
     $passed = $this->post('passed') == 1;
     $remark = $this->post('remark');
     if (!$mergeId) {
         throw new \Exception('firegit.u_notfound');
     }
     $api = new \firegit\app\mod\git\Merge();
     $merge = $api->getMerge($mergeId);
     if (!$merge) {
         throw new \Exception('firegit.u_notfound');
     }
     // 检查合并状态
     switch ($merge['merge_status']) {
         case 2:
             throw new \Exception('firegit.u_mergeing');
         case 4:
             throw new \Exception('firegit.u_mergedSuccess');
         case 8:
             throw new \Exception('firegit.u_mergeedFailed');
     }
     $user = isset($this->user) ? $this->user : '';
     $api->beginMerge($mergeId, $user, $passed, $remark);
     if (!$passed) {
         return;
     }
     // 执行真正的合并请求
     $repoTmp = TMP_ROOT . '/merge/';
     $repoDir = $repoTmp . '/' . $mergeId;
     $origDir = GIT_REPO . '/' . $merge['repo_group'] . '/' . $merge['repo_name'] . '.git';
     if (is_dir($repoDir)) {
         system('rm ' . $repoDir . ' -rf');
     }
     mkdir($repoDir, 0777, true);
     chdir($repoDir);
     // clone远程分支
     $cmd = sprintf('git clone %s -b %s ./', $origDir, $merge['dest_branch']);
     exec($cmd, $outputs, $code);
     unset($outputs);
     system('git config user.name ' . $this->user);
     system('git config user.email ' . $this->user . '@hunbasha.com');
     $cmd = sprintf('git fetch origin %s:%s', $merge['orig_branch'], $merge['orig_branch']);
     exec($cmd, $outputs, $code);
     unset($outputs);
     $cmd = sprintf('git merge -m "Merge remote-tracking branch \'%s\' into %s" --no-ff refs/heads/%s', $merge['orig_branch'], $merge['dest_branch'], $merge['orig_branch']);
     exec($cmd, $outputs, $code);
     // 只有合并执行成功才将其提交
     if ($code == 0) {
         unset($outputs);
         $api->updateDeployStatus($mergeId, 0x1);
         //更改为 等待预上线 状态
         $cmd = sprintf('git push origin ' . $merge['dest_branch']);
         exec($cmd, $outputs, $code);
     } else {
         $merge = new \firegit\app\mod\git\Merge();
         $merge->endMerge($mergeId, false, implode("\n", $outputs));
     }
 }