/** * 合并到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); } }
/** * 处理合并请求 */ 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)); } }