diff --git a/src/constants/SprintConstants.php b/src/constants/SprintConstants.php index 69d4a50611700eb23118d07c1adcacaf4bd83298..03d24826cd25c872e8206137c7e06ec9ed3d9063 100644 --- a/src/constants/SprintConstants.php +++ b/src/constants/SprintConstants.php @@ -2,16 +2,11 @@ final class SprintConstants { - const CUSTOMFIELD_TYPE_STATUS = 'core:customfield'; const PHABRICATOR_ROOT_DIR = 'vendor/phabricator/phabricator'; const LIBPHUTIL_ROOT_DIR = 'vendor/libphutil/libphutil'; const ROOT_DIR = '/srv/phab'; const POINTFIELD_INDEX = 'yERhvoZPNPtM'; const SPRINTFIELD_INDEX = 'scsOmkpB9Tqi'; - const TYPE_CLOSED_STATUS_COLUMN = 'Done'; - const TYPE_REVIEW_STATUS_COLUMN = 'Review'; - const TYPE_DOING_STATUS_COLUMN = 'Doing'; - const TYPE_BACKLOG_STATUS_COLUMN = 'Backlog'; const PANEL_BURNDOWN = 'project.sprint'; const PANEL_PHRAGILE = 'project.phragile'; diff --git a/src/storage/BoardDataProvider.php b/src/storage/BoardDataProvider.php index 5efe05e7ec961be8eae1f360986233f1db06ab88..d9418c5d030d0030c62a8968373d0fbc05376aa4 100644 --- a/src/storage/BoardDataProvider.php +++ b/src/storage/BoardDataProvider.php @@ -163,23 +163,22 @@ final class BoardDataProvider { return $points_sum; } - private function getProjectColumnXactions() { + private function getProjectTaskStatusXactions() { $xactions = array(); $scope_phid = $this->project->getPHID(); $task_phids = mpull($this->tasks, 'getPHID'); $query = new ManiphestTransactionQuery(); - $query->withTransactionTypes(array(PhabricatorTransactions::TYPE_COLUMNS)); + $query->withTransactionTypes(array(ManiphestTransaction::TYPE_STATUS)); $query->withObjectPHIDs($task_phids); $query->setViewer($this->viewer); - $col_xactions = $query->execute(); - foreach ($col_xactions as $xaction) { + $stories = $query->execute(); + // FIXME: This should _really_ have ManiphestTransactionQuery take a + // date range, rather than getting the entire list and filtering + // client-side ... + foreach ($stories as $xaction) { $xaction_date = $xaction->getDateCreated(); if ($xaction_date >= $this->start && $xaction_date <= $this->end) { - $newval = $xaction->getNewValue(); - $newArr = call_user_func_array('array_merge', $newval); - if ($newArr['boardPHID'] == $scope_phid) { - $xactions[] = $xaction; - } + $xactions[] = $xaction; } } return $xactions; @@ -189,7 +188,8 @@ final class BoardDataProvider { $date_array = $this->stats->buildDateArray($this->start, $this->end, $this->timezone); - $xactions = $this->getProjectColumnXactions(); + $xactions = $this->getProjectTaskStatusXactions(); + $xaction_map = mpull($xactions, null, 'getPHID'); $sprint_xaction = id(new SprintColumnTransaction()) @@ -197,7 +197,7 @@ final class BoardDataProvider { ->setTasks($this->tasks) ->setQuery($this->query) ->setProject($this->project) - ->setEvents($xactions); + ->setEventsTaskStatus($xactions); $dates = $sprint_xaction->parseEvents($date_array, $xaction_map); $this->stats->setTasks($this->tasks); diff --git a/src/storage/SprintColumnTransaction.php b/src/storage/SprintColumnTransaction.php index a5de31f7d60fe82b6316ee7de9c57c56241c4f4f..1795553e4bd765d2816117542c3a2b1651703003 100644 --- a/src/storage/SprintColumnTransaction.php +++ b/src/storage/SprintColumnTransaction.php @@ -90,70 +90,37 @@ final class SprintColumnTransaction { return $dates; } - private function setXActionEventType($old_col_name, $new_col_name) { - $old_is_closed = ($old_col_name = SprintConstants::TYPE_CLOSED_STATUS_COLUMN and $new_col_name != SprintConstants::TYPE_CLOSED_STATUS_COLUMN); - - if ($old_is_closed) { - return 'reopen'; - } else if ($new_col_name) { - switch ($new_col_name) { - case SprintConstants::TYPE_CLOSED_STATUS_COLUMN: - return 'close'; - case SprintConstants::TYPE_REVIEW_STATUS_COLUMN: - return 'review'; - case SprintConstants::TYPE_DOING_STATUS_COLUMN: - return 'doing'; - case SprintConstants::TYPE_BACKLOG_STATUS_COLUMN: - return 'backlog'; - default: - break; - } + private function setXActionTaskStatusEventType($was_open, $is_open) { + if ($was_open == $is_open) { + return null; // no change, ignore + } + if ($was_open && !$is_open) { + return 'close'; // task has been closed } else { - return null; + return 'reopen'; // task was closed and has been reopened } } - public function setEvents($xactions) { + public function setEventsTaskStatus($xactions) { assert_instances_of($xactions, 'ManiphestTransaction'); - $old_col_name = null; - $new_col_name = null; $events = array(); foreach ($xactions as $xaction) { - $oldval = $xaction->getOldValue(); - if (!empty($oldval)) { - $newArr = call_user_func_array('array_merge', $oldval); - $old_col_phid = idx($newArr, 'columnPHID'); - foreach ($old_col_phid as $phid) { - $old_col = $this->query->getColumnforPHID($phid); - foreach ($old_col as $obj) { - $old_col_name = $obj->getDisplayName(); - } - } + if ($xaction->getOldValue() == null) { + continue; } - $newval = $xaction->getNewValue(); - if (!empty($newval)) { - $newArr = call_user_func_array('array_merge', $newval); - $new_col_phid = idx($newArr, 'columnPHID'); - $xaction_scope_phid = idx($newArr, 'boardPHID'); - $new_col = $this->query->getColumnforPHID($new_col_phid); - foreach ($new_col as $obj) { - $new_col_name = $obj->getDisplayName(); - } - } - $scope_phid = $this->project->getPHID(); - if ($scope_phid == $xaction_scope_phid) { - $event_type = $this->setXActionEventType($old_col_name, $new_col_name); - if ($event_type !== null) { - $events[] = array( - 'transactionPHID' => $xaction->getPHID(), - 'objectPHID' => $xaction->getObjectPHID(), - 'created' => $xaction->getDateCreated(), - 'modified' => $xaction->getDateModified(), - 'key' => $xaction->getMetadataValue('customfield:key'), - 'type' => $event_type, - 'title' => $xaction->getTitle(), - ); - } + $was_open = ManiphestTaskStatus::isOpenStatus($xaction->getOldValue()); + $is_open = ManiphestTaskStatus::isOpenStatus($xaction->getNewValue()); + $event_type = $this->setXActionTaskStatusEventType($was_open, $is_open); + if ($event_type !== null) { + $events[] = array( + 'transactionPHID' => $xaction->getPHID(), + 'objectPHID' => $xaction->getObjectPHID(), + 'created' => $xaction->getDateCreated(), + 'modified' => $xaction->getDateModified(), + 'key' => $xaction->getMetadataValue('customfield:key'), + 'type' => $event_type, + 'title' => $xaction->getTitle(), + ); } }