Path: blob/master/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php
12256 views
<?php12final class DifferentialRevisionUpdateHistoryView extends AphrontView {34private $diffs = array();5private $selectedVersusDiffID;6private $selectedDiffID;7private $commitsForLinks = array();8private $unitStatus = array();910public function setDiffs(array $diffs) {11assert_instances_of($diffs, 'DifferentialDiff');12$this->diffs = $diffs;13return $this;14}1516public function setSelectedVersusDiffID($id) {17$this->selectedVersusDiffID = $id;18return $this;19}2021public function setSelectedDiffID($id) {22$this->selectedDiffID = $id;23return $this;24}2526public function setCommitsForLinks(array $commits) {27assert_instances_of($commits, 'PhabricatorRepositoryCommit');28$this->commitsForLinks = $commits;29return $this;30}3132public function setDiffUnitStatuses(array $unit_status) {33$this->unitStatus = $unit_status;34return $this;35}3637public function render() {38$this->requireResource('differential-core-view-css');39$this->requireResource('differential-revision-history-css');4041$data = array(42array(43'name' => pht('Base'),44'id' => null,45'desc' => pht('Base'),46'age' => null,47'obj' => null,48),49);5051$seq = 0;52foreach ($this->diffs as $diff) {53$data[] = array(54'name' => pht('Diff %d', ++$seq),55'id' => $diff->getID(),56'desc' => $diff->getDescription(),57'age' => $diff->getDateCreated(),58'obj' => $diff,59);60}6162$max_id = $diff->getID();63$revision_id = $diff->getRevisionID();6465$idx = 0;66$rows = array();67$disable = false;68$radios = array();69$last_base = null;70$rowc = array();71foreach ($data as $row) {7273$diff = $row['obj'];74$name = $row['name'];75$id = $row['id'];7677$old_class = false;78$new_class = false;7980if ($id) {81$new_checked = ($this->selectedDiffID == $id);82$new = javelin_tag(83'input',84array(85'type' => 'radio',86'name' => 'id',87'value' => $id,88'checked' => $new_checked ? 'checked' : null,89'sigil' => 'differential-new-radio',90));91if ($new_checked) {92$new_class = true;93$disable = true;94}95$new = phutil_tag(96'div',97array(98'class' => 'differential-update-history-radio',99),100$new);101} else {102$new = null;103}104105if ($max_id != $id) {106$uniq = celerity_generate_unique_node_id();107$old_checked = ($this->selectedVersusDiffID == $id);108$old = phutil_tag(109'input',110array(111'type' => 'radio',112'name' => 'vs',113'value' => $id,114'id' => $uniq,115'checked' => $old_checked ? 'checked' : null,116'disabled' => $disable ? 'disabled' : null,117));118$radios[] = $uniq;119if ($old_checked) {120$old_class = true;121}122$old = phutil_tag(123'div',124array(125'class' => 'differential-update-history-radio',126),127$old);128} else {129$old = null;130}131132$desc = $row['desc'];133134if ($row['age']) {135$age = phabricator_datetime($row['age'], $this->getUser());136} else {137$age = null;138}139140if ($diff) {141$lint = $this->newLintStatusView($diff);142$unit = $this->newUnitStatusView($diff);143$base = $this->renderBaseRevision($diff);144} else {145$lint = null;146$unit = null;147$base = null;148}149150if ($last_base !== null && $base !== $last_base) {151// TODO: Render some kind of notice about rebases.152}153$last_base = $base;154155if ($revision_id) {156$id_link = phutil_tag(157'a',158array(159'href' => '/D'.$revision_id.'?id='.$id,160),161$id);162} else {163$id_link = phutil_tag(164'a',165array(166'href' => '/differential/diff/'.$id.'/',167),168$id);169}170171$rows[] = array(172$name,173$id_link,174$base,175$desc,176$age,177$lint,178$unit,179$old,180$new,181);182183$classes = array();184if ($old_class) {185$classes[] = 'differential-update-history-old-now';186}187if ($new_class) {188$classes[] = 'differential-update-history-new-now';189}190$rowc[] = nonempty(implode(' ', $classes), null);191}192193Javelin::initBehavior(194'differential-diff-radios',195array(196'radios' => $radios,197));198199$table = id(new AphrontTableView($rows));200$table->setHeaders(201array(202pht('Diff'),203pht('ID'),204pht('Base'),205pht('Description'),206pht('Created'),207pht('Lint'),208pht('Unit'),209'',210'',211));212$table->setColumnClasses(213array(214'pri',215'',216'',217'wide',218'date',219'center',220'center',221'center differential-update-history-old',222'center differential-update-history-new',223));224$table->setRowClasses($rowc);225$table->setDeviceVisibility(226array(227true,228true,229false,230true,231false,232false,233false,234true,235true,236));237238$show_diff = phutil_tag(239'div',240array(241'class' => 'differential-update-history-footer',242),243array(244phutil_tag(245'button',246array(),247pht('Show Diff')),248));249250$content = phabricator_form(251$this->getUser(),252array(253'method' => 'GET',254'action' => '/D'.$revision_id.'#toc',255),256array(257$table,258$show_diff,259));260261return $content;262}263264private function renderBaseRevision(DifferentialDiff $diff) {265switch ($diff->getSourceControlSystem()) {266case 'git':267$base = $diff->getSourceControlBaseRevision();268if (strpos($base, '@') === false) {269$label = substr($base, 0, 7);270} else {271// The diff is from git-svn272$base = explode('@', $base);273$base = last($base);274$label = $base;275}276break;277case 'svn':278$base = $diff->getSourceControlBaseRevision();279$base = explode('@', $base);280$base = last($base);281$label = $base;282break;283default:284$label = null;285break;286}287$link = null;288if ($label) {289$commit_for_link = idx(290$this->commitsForLinks,291$diff->getSourceControlBaseRevision());292if ($commit_for_link) {293$link = phutil_tag(294'a',295array('href' => $commit_for_link->getURI()),296$label);297} else {298$link = $label;299}300}301return $link;302}303304private function newLintStatusView(DifferentialDiff $diff) {305$value = $diff->getLintStatus();306$status = DifferentialLintStatus::newStatusFromValue($value);307308$icon = $status->getIconIcon();309$color = $status->getIconColor();310$name = $status->getName();311312return $this->newDiffStatusIconView($icon, $color, $name);313}314315private function newUnitStatusView(DifferentialDiff $diff) {316$value = $diff->getUnitStatus();317318// NOTE: We may be overriding the value on the diff with a value from319// Harbormaster.320$value = idx($this->unitStatus, $diff->getPHID(), $value);321322$status = DifferentialUnitStatus::newStatusFromValue($value);323324$icon = $status->getIconIcon();325$color = $status->getIconColor();326$name = $status->getName();327328return $this->newDiffStatusIconView($icon, $color, $name);329}330331private function newDiffStatusIconView($icon, $color, $name) {332return id(new PHUIIconView())333->setIcon($icon, $color)334->addSigil('has-tooltip')335->setMetadata(336array(337'tip' => $name,338));339}340341}342343344