Path: blob/master/src/applications/differential/controller/DifferentialDiffViewController.php
12256 views
<?php12final class DifferentialDiffViewController extends DifferentialController {34public function shouldAllowPublic() {5return true;6}78public function handleRequest(AphrontRequest $request) {9$viewer = $this->getViewer();10$id = $request->getURIData('id');1112$diff = id(new DifferentialDiffQuery())13->setViewer($viewer)14->withIDs(array($id))15->executeOne();16if (!$diff) {17return new Aphront404Response();18}1920if ($diff->getRevisionID()) {21return id(new AphrontRedirectResponse())22->setURI('/D'.$diff->getRevisionID().'?id='.$diff->getID());23}2425if ($request->isFormPost()) {26$diff_id = $diff->getID();27$revision_id = $request->getInt('revisionID');28if ($revision_id) {29$attach_uri = "/revision/attach/{$diff_id}/to/{$revision_id}/";30} else {31$attach_uri = "/revision/attach/{$diff_id}/to/";32}33$attach_uri = $this->getApplicationURI($attach_uri);3435return id(new AphrontRedirectResponse())36->setURI($attach_uri);37}3839$diff_phid = $diff->getPHID();40$buildables = id(new HarbormasterBuildableQuery())41->setViewer($viewer)42->withBuildablePHIDs(array($diff_phid))43->withManualBuildables(false)44->needBuilds(true)45->needTargets(true)46->execute();47$buildables = mpull($buildables, null, 'getBuildablePHID');48$diff->attachBuildable(idx($buildables, $diff_phid));4950// TODO: implement optgroup support in AphrontFormSelectControl?51$select = array();52$select[] = hsprintf('<optgroup label="%s">', pht('Create New Revision'));53$select[] = phutil_tag(54'option',55array('value' => ''),56pht('Create a new Revision...'));57$select[] = hsprintf('</optgroup>');5859$selected_id = $request->getInt('revisionID');6061$revisions = $this->loadSelectableRevisions($viewer, $selected_id);6263if ($revisions) {64$select[] = hsprintf(65'<optgroup label="%s">',66pht('Update Existing Revision'));67foreach ($revisions as $revision) {68if ($selected_id == $revision->getID()) {69$selected = 'selected';70} else {71$selected = null;72}7374$select[] = phutil_tag(75'option',76array(77'value' => $revision->getID(),78'selected' => $selected,79),80id(new PhutilUTF8StringTruncator())81->setMaximumGlyphs(128)82->truncateString(83'D'.$revision->getID().' '.$revision->getTitle()));84}85$select[] = hsprintf('</optgroup>');86}8788$select = phutil_tag(89'select',90array('name' => 'revisionID'),91$select);9293$form = id(new AphrontFormView())94->setViewer($viewer)95->appendRemarkupInstructions(96pht(97'Review the diff for correctness. When you are satisfied, either '.98'**create a new revision** or **update an existing revision**.'))99->appendChild(100id(new AphrontFormMarkupControl())101->setLabel(pht('Attach To'))102->setValue($select))103->appendChild(104id(new AphrontFormSubmitControl())105->setValue(pht('Continue')));106107$props = id(new DifferentialDiffProperty())->loadAllWhere(108'diffID = %d',109$diff->getID());110$props = mpull($props, 'getData', 'getName');111112$property_head = id(new PHUIHeaderView())113->setHeader(pht('Properties'));114115$property_view = new PHUIPropertyListView();116117$changesets = $diff->loadChangesets();118$changesets = msort($changesets, 'getSortKey');119120$this->buildPackageMaps($changesets);121122$table_of_contents = $this->buildTableOfContents(123$changesets,124$changesets,125$diff->loadCoverageMap($viewer));126127$refs = array();128foreach ($changesets as $changeset) {129$refs[$changeset->getID()] = $changeset->getID();130}131132$details = id(new DifferentialChangesetListView())133->setChangesets($changesets)134->setVisibleChangesets($changesets)135->setRenderingReferences($refs)136->setStandaloneURI('/differential/changeset/')137->setDiff($diff)138->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)139->setTitle(pht('Diff %d', $diff->getID()))140->setUser($request->getUser());141142$title = pht('Diff %d', $diff->getID());143$crumbs = $this->buildApplicationCrumbs();144$crumbs->addTextCrumb($title);145$crumbs->setBorder(true);146147$header = id(new PHUIHeaderView())148->setHeader($title);149150$prop_box = id(new PHUIObjectBoxView())151->setHeader($property_head)152->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)153->addPropertyList($property_view)154->setForm($form);155156$view = id(new PHUITwoColumnView())157->setHeader($header)158->setMainColumn(array(159160))161->setFooter(array(162$prop_box,163$table_of_contents,164$details,165));166167$page = $this->newPage()168->setTitle(pht('Diff View'))169->setCrumbs($crumbs)170->appendChild($view);171return $page;172}173174private function loadSelectableRevisions(175PhabricatorUser $viewer,176$selected_id) {177178$revisions = id(new DifferentialRevisionQuery())179->setViewer($viewer)180->withAuthors(array($viewer->getPHID()))181->withIsOpen(true)182->requireCapabilities(183array(184PhabricatorPolicyCapability::CAN_VIEW,185PhabricatorPolicyCapability::CAN_EDIT,186))187->execute();188$revisions = mpull($revisions, null, 'getID');189190// If a specific revision is selected (for example, because the user is191// following the "Update Diff" workflow), but not present in the dropdown,192// try to add it to the dropdown even if it is closed. This allows the193// workflow to be used to update abandoned revisions.194195if ($selected_id) {196if (empty($revisions[$selected_id])) {197$selected = id(new DifferentialRevisionQuery())198->setViewer($viewer)199->withAuthors(array($viewer->getPHID()))200->withIDs(array($selected_id))201->requireCapabilities(202array(203PhabricatorPolicyCapability::CAN_VIEW,204PhabricatorPolicyCapability::CAN_EDIT,205))206->execute();207$revisions = mpull($selected, null, 'getID') + $revisions;208}209}210211return $revisions;212}213214215}216217218