diff --git a/src/applications/differential/view/DifferentialChangesetDetailView.php b/src/applications/differential/view/DifferentialChangesetDetailView.php index 219dfaaa1f..42be1c6444 100644 --- a/src/applications/differential/view/DifferentialChangesetDetailView.php +++ b/src/applications/differential/view/DifferentialChangesetDetailView.php @@ -1,199 +1,215 @@ <?php final class DifferentialChangesetDetailView extends AphrontView { private $changeset; private $buttons = array(); private $editable; private $symbolIndex; private $id; private $vsChangesetID; private $renderURI; private $whitespace; private $renderingRef; private $autoload; private $loaded; private $renderer; public function setAutoload($autoload) { $this->autoload = $autoload; return $this; } public function getAutoload() { return $this->autoload; } public function setLoaded($loaded) { $this->loaded = $loaded; return $this; } public function getLoaded() { return $this->loaded; } public function setRenderingRef($rendering_ref) { $this->renderingRef = $rendering_ref; return $this; } public function getRenderingRef() { return $this->renderingRef; } public function setWhitespace($whitespace) { $this->whitespace = $whitespace; return $this; } public function getWhitespace() { return $this->whitespace; } public function setRenderURI($render_uri) { $this->renderURI = $render_uri; return $this; } public function getRenderURI() { return $this->renderURI; } public function setChangeset($changeset) { $this->changeset = $changeset; return $this; } public function addButton($button) { $this->buttons[] = $button; return $this; } public function setEditable($editable) { $this->editable = $editable; return $this; } public function setSymbolIndex($symbol_index) { $this->symbolIndex = $symbol_index; return $this; } public function setRenderer($renderer) { $this->renderer = $renderer; return $this; } public function getRenderer() { return $this->renderer; } public function getID() { if (!$this->id) { $this->id = celerity_generate_unique_node_id(); } return $this->id; } public function setID($id) { $this->id = $id; return $this; } public function setVsChangesetID($vs_changeset_id) { $this->vsChangesetID = $vs_changeset_id; return $this; } public function getVsChangesetID() { return $this->vsChangesetID; } public function render() { $this->requireResource('differential-changeset-view-css'); $this->requireResource('syntax-highlighting-css'); Javelin::initBehavior('phabricator-oncopy', array()); $changeset = $this->changeset; $class = 'differential-changeset'; if (!$this->editable) { $class .= ' differential-changeset-immutable'; } $buttons = null; if ($this->buttons) { $buttons = phutil_tag( 'div', array( 'class' => 'differential-changeset-buttons', ), $this->buttons); } $id = $this->getID(); if ($this->symbolIndex) { Javelin::initBehavior( 'repository-crossreference', array( 'container' => $id, ) + $this->symbolIndex); } $display_filename = $changeset->getDisplayFilename(); $display_icon = FileTypeIcon::getFileIcon($display_filename); $icon = id(new PHUIIconView()) ->setIcon($display_icon); $renderer = DifferentialChangesetHTMLRenderer::getHTMLRendererByKey( $this->getRenderer()); + $changeset_id = $this->changeset->getID(); + + $vs_id = $this->getVsChangesetID(); + if (!$vs_id) { + // Showing a changeset normally. + $left_id = $changeset_id; + $right_id = $changeset_id; + } else if ($vs_id == -1) { + // Showing a synthetic "deleted" changeset for a file which was + // removed between changes. + $left_id = $changeset_id; + $right_id = null; + } else { + // Showing a diff-of-diffs. + $left_id = $vs_id; + $right_id = $changeset_id; + } + return javelin_tag( 'div', array( 'sigil' => 'differential-changeset', 'meta' => array( - 'left' => nonempty( - $this->getVsChangesetID(), - $this->changeset->getID()), - 'right' => $this->changeset->getID(), + 'left' => $left_id, + 'right' => $right_id, 'renderURI' => $this->getRenderURI(), 'whitespace' => $this->getWhitespace(), 'highlight' => null, 'renderer' => $this->getRenderer(), 'ref' => $this->getRenderingRef(), 'autoload' => $this->getAutoload(), 'loaded' => $this->getLoaded(), 'undoTemplates' => hsprintf('%s', $renderer->renderUndoTemplates()), ), 'class' => $class, 'id' => $id, ), array( id(new PhabricatorAnchorView()) ->setAnchorName($changeset->getAnchorName()) ->setNavigationMarker(true) ->render(), $buttons, phutil_tag('h1', array( 'class' => 'differential-file-icon-header', ), array( $icon, $display_filename, )), javelin_tag( 'div', array( 'class' => 'changeset-view-content', 'sigil' => 'changeset-view-content', ), $this->renderChildren()), )); } }