diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -10,7 +10,7 @@ 'core.pkg.css' => 'fb144113', 'core.pkg.js' => 'd3fecc57', 'darkconsole.pkg.js' => 'ca8671ce', - 'differential.pkg.css' => 'cb97e095', + 'differential.pkg.css' => '3ad9692c', 'differential.pkg.js' => '11a5b750', 'diffusion.pkg.css' => '3783278d', 'diffusion.pkg.js' => '5b4010f4', @@ -57,7 +57,6 @@ 'rsrc/css/application/differential/add-comment.css' => 'c478bcaa', 'rsrc/css/application/differential/changeset-view.css' => 'e710a360', 'rsrc/css/application/differential/core.css' => '7ac3cabc', - 'rsrc/css/application/differential/local-commits-view.css' => '19649019', 'rsrc/css/application/differential/results-table.css' => '239924f9', 'rsrc/css/application/differential/revision-comment.css' => '48186045', 'rsrc/css/application/differential/revision-history.css' => '0e8eb855', @@ -509,7 +508,6 @@ 'differential-changeset-view-css' => 'e710a360', 'differential-core-view-css' => '7ac3cabc', 'differential-inline-comment-editor' => 'f2441746', - 'differential-local-commits-view-css' => '19649019', 'differential-results-table-css' => '239924f9', 'differential-revision-add-comment-css' => 'c478bcaa', 'differential-revision-comment-css' => '48186045', @@ -2121,8 +2119,7 @@ 7 => 'differential-revision-add-comment-css', 8 => 'phabricator-object-selector-css', 9 => 'phabricator-content-source-view-css', - 10 => 'differential-local-commits-view-css', - 11 => 'inline-comment-summary-css', + 10 => 'inline-comment-summary-css', ), 'differential.pkg.js' => array( diff --git a/resources/celerity/packages.php b/resources/celerity/packages.php --- a/resources/celerity/packages.php +++ b/resources/celerity/packages.php @@ -126,7 +126,6 @@ 'differential-revision-add-comment-css', 'phabricator-object-selector-css', 'phabricator-content-source-view-css', - 'differential-local-commits-view-css', 'inline-comment-summary-css', ), 'differential.pkg.js' => array( diff --git a/src/applications/differential/controller/DifferentialRevisionViewController.php b/src/applications/differential/controller/DifferentialRevisionViewController.php --- a/src/applications/differential/controller/DifferentialRevisionViewController.php +++ b/src/applications/differential/controller/DifferentialRevisionViewController.php @@ -186,6 +186,18 @@ } } + $commit_hashes = mpull($diffs, 'getSourceControlBaseRevision'); + $local_commits = idx($props, 'local:commits', array()); + foreach ($local_commits as $local_commit) { + $commit_hashes[] = idx($local_commit, 'tree'); + $commit_hashes[] = idx($local_commit, 'local'); + } + $commit_hashes = array_unique(array_filter($commit_hashes)); + $commits_for_links = id(new DiffusionCommitQuery()) + ->setViewer($user) + ->withIdentifiers($commit_hashes) + ->execute(); + $commits_for_links = mpull($commits_for_links, null, 'getCommitIdentifier'); $revision_detail = id(new DifferentialRevisionDetailView()) ->setUser($user) @@ -267,16 +279,18 @@ $changeset_view->setSymbolIndexes($symbol_indexes); $changeset_view->setTitle('Diff '.$target->getID()); - $diff_history = new DifferentialRevisionUpdateHistoryView(); - $diff_history->setDiffs($diffs); - $diff_history->setSelectedVersusDiffID($diff_vs); - $diff_history->setSelectedDiffID($target->getID()); - $diff_history->setSelectedWhitespace($whitespace); - $diff_history->setUser($user); + $diff_history = id(new DifferentialRevisionUpdateHistoryView()) + ->setUser($user) + ->setDiffs($diffs) + ->setSelectedVersusDiffID($diff_vs) + ->setSelectedDiffID($target->getID()) + ->setSelectedWhitespace($whitespace) + ->setCommitsForLinks($commits_for_links); - $local_view = new DifferentialLocalCommitsView(); - $local_view->setUser($user); - $local_view->setLocalCommits(idx($props, 'local:commits')); + $local_view = id(new DifferentialLocalCommitsView()) + ->setUser($user) + ->setLocalCommits(idx($props, 'local:commits')) + ->setCommitsForLinks($commits_for_links); if ($repository) { $other_revisions = $this->loadOtherRevisions( diff --git a/src/applications/differential/view/DifferentialLocalCommitsView.php b/src/applications/differential/view/DifferentialLocalCommitsView.php --- a/src/applications/differential/view/DifferentialLocalCommitsView.php +++ b/src/applications/differential/view/DifferentialLocalCommitsView.php @@ -3,12 +3,19 @@ final class DifferentialLocalCommitsView extends AphrontView { private $localCommits; + private $commitsForLinks = array(); public function setLocalCommits($local_commits) { $this->localCommits = $local_commits; return $this; } + public function setCommitsForLinks(array $commits) { + assert_instances_of($commits, 'PhabricatorRepositoryCommit'); + $this->commitsForLinks = $commits; + return $this; + } + public function render() { $user = $this->user; if (!$user) { @@ -20,8 +27,6 @@ return null; } - $this->requireResource('differential-local-commits-view-css'); - $has_tree = false; $has_local = false; @@ -35,36 +40,23 @@ } $rows = array(); - $highlight = true; foreach ($local as $commit) { - if ($highlight) { - $class = 'alt'; - $highlight = false; - } else { - $class = ''; - $highlight = true; - } - - $row = array(); if (idx($commit, 'commit')) { - $commit_hash = self::formatCommit($commit['commit']); + $commit_link = $this->buildCommitLink($commit['commit']); } else if (isset($commit['rev'])) { - $commit_hash = self::formatCommit($commit['rev']); + $commit_link = $this->buildCommitLink($commit['rev']); } else { - $commit_hash = null; + $commit_link = null; } - $row[] = phutil_tag('td', array(), $commit_hash); + $row[] = $commit_link; if ($has_tree) { - $tree = idx($commit, 'tree'); - $tree = self::formatCommit($tree); - $row[] = phutil_tag('td', array(), $tree); + $row[] = $this->buildCommitLink($commit['tree']); } if ($has_local) { - $local_rev = idx($commit, 'local', null); - $row[] = phutil_tag('td', array(), $local_rev); + $row[] = $this->buildCommitLink($commit['local']); } $parents = idx($commit, 'parents', array()); @@ -72,15 +64,15 @@ if (is_array($parent)) { $parent = idx($parent, 'rev'); } - $parents[$k] = self::formatCommit($parent); + $parents[$k] = $this->buildCommitLink($parent); } $parents = phutil_implode_html(phutil_tag('br'), $parents); - $row[] = phutil_tag('td', array(), $parents); + $row[] = $parents; $author = nonempty( idx($commit, 'user'), idx($commit, 'author')); - $row[] = phutil_tag('td', array(), $author); + $row[] = $author; $message = idx($commit, 'message'); @@ -94,12 +86,7 @@ $view->setMore(phutil_escape_html_newlines($message)); } - $row[] = phutil_tag( - 'td', - array( - 'class' => 'summary', - ), - $view->render()); + $row[] = $view->render(); $date = nonempty( idx($commit, 'date'), @@ -107,39 +94,60 @@ if ($date) { $date = phabricator_datetime($date, $user); } - $row[] = phutil_tag('td', array(), $date); + $row[] = $date; - $rows[] = phutil_tag('tr', array('class' => $class), $row); + $rows[] = $row; } - + $column_classes = array(''); + if ($has_tree) { + $column_classes[] = ''; + } + if ($has_local) { + $column_classes[] = ''; + } + $column_classes[] = ''; + $column_classes[] = ''; + $column_classes[] = 'wide'; + $column_classes[] = 'date'; + $table = id(new AphrontTableView($rows)) + ->setColumnClasses($column_classes); $headers = array(); - $headers[] = phutil_tag('th', array(), pht('Commit')); + $headers[] = pht('Commit'); if ($has_tree) { - $headers[] = phutil_tag('th', array(), pht('Tree')); + $headers[] = pht('Tree'); } if ($has_local) { - $headers[] = phutil_tag('th', array(), pht('Local')); + $headers[] = pht('Local'); } - $headers[] = phutil_tag('th', array(), pht('Parents')); - $headers[] = phutil_tag('th', array(), pht('Author')); - $headers[] = phutil_tag('th', array(), pht('Summary')); - $headers[] = phutil_tag('th', array(), pht('Date')); - - $headers = phutil_tag('tr', array(), $headers); - - $content = phutil_tag_div('differential-panel', phutil_tag( - 'table', - array('class' => 'differential-local-commits-table'), - array($headers, phutil_implode_html("\n", $rows)))); + $headers[] = pht('Parents'); + $headers[] = pht('Author'); + $headers[] = pht('Summary'); + $headers[] = pht('Date'); + $table->setHeaders($headers); return id(new PHUIObjectBoxView()) ->setHeaderText(pht('Local Commits')) - ->appendChild($content); + ->appendChild($table); } private static function formatCommit($commit) { return substr($commit, 0, 12); } + private function buildCommitLink($hash) { + $commit_for_link = idx($this->commitsForLinks, $hash); + $commit_hash = self::formatCommit($hash); + if ($commit_for_link) { + $link = phutil_tag( + 'a', + array( + 'href' => $commit_for_link->getURI()), + $commit_hash); + } else { + $link = $commit_hash; + } + return $link; + } + } diff --git a/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php b/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php --- a/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php +++ b/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php @@ -6,6 +6,7 @@ private $selectedVersusDiffID; private $selectedDiffID; private $selectedWhitespace; + private $commitsForLinks = array(); public function setDiffs(array $diffs) { assert_instances_of($diffs, 'DifferentialDiff'); @@ -28,6 +29,12 @@ return $this; } + public function setCommitsForLinks(array $commits) { + assert_instances_of($commits, 'PhabricatorRepositoryCommit'); + $this->commitsForLinks = $commits; + return $this; + } + public function render() { $this->requireResource('differential-core-view-css'); @@ -378,20 +385,38 @@ case 'git': $base = $diff->getSourceControlBaseRevision(); if (strpos($base, '@') === false) { - return substr($base, 0, 7); + $label = substr($base, 0, 7); } else { // The diff is from git-svn $base = explode('@', $base); $base = last($base); - return $base; + $label = $base; } + break; case 'svn': $base = $diff->getSourceControlBaseRevision(); $base = explode('@', $base); $base = last($base); - return $base; + $label = $base; + break; default: - return null; + $label = null; + break; + } + $link = null; + if ($label) { + $commit_for_link = idx( + $this->commitsForLinks, + $diff->getSourceControlBaseRevision()); + if ($commit_for_link) { + $link = phutil_tag( + 'a', + array('href' => $commit_for_link->getURI()), + $label); + } else { + $link = $label; + } } + return $link; } } diff --git a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php --- a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php +++ b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php @@ -32,7 +32,6 @@ foreach ($handles as $phid => $handle) { $commit = $objects[$phid]; $repository = $commit->getRepository(); - $callsign = $repository->getCallsign(); $commit_identifier = $commit->getCommitIdentifier(); $name = $repository->formatCommitName($commit_identifier); @@ -45,7 +44,7 @@ $handle->setName($name); $handle->setFullName($full_name); - $handle->setURI('/r'.$callsign.$commit_identifier); + $handle->setURI($commit->getURI()); $handle->setTimestamp($commit->getEpoch()); } } diff --git a/src/applications/repository/storage/PhabricatorRepositoryCommit.php b/src/applications/repository/storage/PhabricatorRepositoryCommit.php --- a/src/applications/repository/storage/PhabricatorRepositoryCommit.php +++ b/src/applications/repository/storage/PhabricatorRepositoryCommit.php @@ -130,6 +130,13 @@ return $this->getEpoch(); } + public function getURI() { + $repository = $this->getRepository(); + $callsign = $repository->getCallsign(); + $commit_identifier = $this->getCommitIdentifier(); + return '/r'.$callsign.$commit_identifier; + } + /** * Synchronize a commit's overall audit status with the individual audit * triggers. diff --git a/webroot/rsrc/css/application/differential/local-commits-view.css b/webroot/rsrc/css/application/differential/local-commits-view.css deleted file mode 100644 --- a/webroot/rsrc/css/application/differential/local-commits-view.css +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @provides differential-local-commits-view-css - */ - -.differential-local-commits-table { - width: 100%; - border-collapse: separate; - border-spacing: 1px 2px; -} - -.differential-local-commits-table th { - color: {$darkbluetext}; - padding: 4px 6px; -} - -.differential-local-commits-table tr.alt td { - background: {$lightgreybackground}; -} - -.differential-local-commits-table td { - padding: 4px 6px; - white-space: nowrap; - vertical-align: top; -} - -.differential-local-commits-table td.summary { - white-space: normal; - width: 100%; -}