protected function changeStatus($workitem, $newStatus, $user) { $allowable = array("Draft", "Suggestion", "Code Review", "QA Ready", "Pass", "Merged"); if ($workitem->getIsRelRunner() || $user->getIs_admin() == 1 && $is_runner) { if ($newStatus == 'Bidding' && in_array($workitem->getStatus(), $allowable)) { $workitem->setRunnerId($user->getId()); } } if ($newStatus == 'Done' && $workitem->getProjectId() == 0) { return false; } // Set all 0.00 fees as paid if ($newStatus == 'Done') { if (!$workitem->flagAll0FeesAsPaid()) { return false; } } $workitem->setStatus($newStatus); $projectId = $workitem->getProjectId(); $thisProject = new Project($projectId); $repoType = $thisProject->getRepo_type(); // Generate diff and send to pastebin if we're in REVIEW if ($newStatus == "Code Review") { //reset code_review flags $workitem->resetCRFlags(); if ($repoType == 'svn') { if (substr($workitem->getSandbox(), 0, 4) == "http") { // Sandbox URLs look like: // https://dev.worklist.net/~johncarlson21/worklist // 0 12 3 4 $sandbox_array = explode("/", $workitem->getSandbox()); $username = isset($sandbox_array[3]) ? $sandbox_array[3] : "~"; $username = substr($username, 1); // eliminate the tilde $sandbox = isset($sandbox_array[4]) ? $sandbox_array[4] : ""; try { $result = SandBoxUtil::pasteSandboxDiff($username, $workitem->getId(), $sandbox); $comment = "Code Review available here:\n{$result}"; $rt = $this->addComment($workitem->getId(), $user->getId(), $comment); } catch (Exception $ex) { error_log("Could not paste diff: \n{$ex}"); } } } elseif ($repoType == 'git') { $GitHubUser = new User($workitem->getMechanicId()); $pullResults = $GitHubUser->createPullRequest($workitem->getId(), $workitem->getSummary(), $thisProject); if (!$pullResults['error'] && !isset($pullResults['data']['errors'])) { $codeReviewURL = $pullResults['data']['html_url'] . '/files'; $comment = "Code Review available here:\n" . $codeReviewURL; } else { $comment = $pullResults['error'] ? "We had problems making your request to GitHub\n" : "The following error was returned when making your pull request:\n"; $comment .= isset($pullResults['data']['errors']) ? $pullResults['data']['errors'][0]['message'] : "Unknown error"; } $rt = $this->addComment($workitem->getId(), $user->getId(), $comment); } } if ($newStatus == 'QA Ready' && $repoType == 'git') { $runner = $workitem->getRunnerId(); $GitHubUser = new User($runner); $runnerEmail = $GitHubUser->getUsername(); $GitHubBidder = new User($workitem->getMechanicId()); $githubDetails = $GitHubBidder->getGitHubUserDetails($thisProject); $gitHubUsername = $githubDetails['data']['login']; $repoDetails = $thisProject->extractOwnerAndNameFromRepoURL(); $usersFork = 'https://github.com/' . $gitHubUsername . "/" . $repoDetails['name'] . ".git"; $data = array('branch_name' => $workitem->getId(), 'runner' => $GitHubUser->getNickname(), 'users_fork' => $usersFork, 'master_repo' => str_replace('https://', 'git://', $thisProject->getRepository())); $senderEmail = 'Worklist <*****@*****.**>'; Utils::sendTemplateEmail($runnerEmail, $emailTemplate, $data, $senderEmail); } else { if ($newStatus == 'QA Ready' && !($workitem->getIsRelRunner() || $user->getIs_admin() == 1)) { return true; } } if ($newStatus == 'In Progress') { $thisProject->setActive(1); $thisProject->save(); $options = array('type' => 'status-notify', 'workitem' => $workitem); $data = array('nick' => $user->getNickname(), 'status' => $newStatus); Notification::workitemNotifyHipchat($options, $data); } // notifications for subscribed users Notification::massStatusNotify($workitem); if ($newStatus == 'Bidding') { $options = array('type' => 'new_bidding', 'workitem' => $workitem); Notification::massStatusNotify($workitem); } if ($newStatus == 'Code Review') { $options = array('type' => 'new_review', 'workitem' => $workitem); Notification::massStatusNotify($workitem); } return true; }