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