diff --git a/src/applications/diffusion/controller/commit/DiffusionCommitController.php b/src/applications/diffusion/controller/commit/DiffusionCommitController.php index 7b4f3eed2a..c043b7f698 100644 --- a/src/applications/diffusion/controller/commit/DiffusionCommitController.php +++ b/src/applications/diffusion/controller/commit/DiffusionCommitController.php @@ -287,6 +287,9 @@ final class DiffusionCommitController extends DiffusionController { if ($data->getCommitDetail('reviewerPHID')) { $phids[] = $data->getCommitDetail('reviewerPHID'); } + if ($data->getCommitDetail('committerPHID')) { + $phids[] = $data->getCommitDetail('committerPHID'); + } if ($data->getCommitDetail('differential.revisionPHID')) { $phids[] = $data->getCommitDetail('differential.revisionPHID'); } @@ -330,6 +333,17 @@ final class DiffusionCommitController extends DiffusionController { $props['Reviewer'] = phutil_escape_html($reviewer_name); } + $committer = $data->getCommitDetail('committer'); + if ($committer) { + $committer_phid = $data->getCommitDetail('committerPHID'); + if ($data->getCommitDetail('committerPHID')) { + $props['Committer'] = $handles[$committer_phid]->renderLink(); + } else { + $props['Committer'] = phutil_escape_html($committer); + } + } + + $revision_phid = $data->getCommitDetail('differential.revisionPHID'); if ($revision_phid) { $props['Differential Revision'] = $handles[$revision_phid]->renderLink(); diff --git a/src/applications/diffusion/controller/lastmodified/DiffusionLastModifiedController.php b/src/applications/diffusion/controller/lastmodified/DiffusionLastModifiedController.php index 26380b6848..bd475b9b2a 100644 --- a/src/applications/diffusion/controller/lastmodified/DiffusionLastModifiedController.php +++ b/src/applications/diffusion/controller/lastmodified/DiffusionLastModifiedController.php @@ -27,10 +27,16 @@ final class DiffusionLastModifiedController extends DiffusionController { list($commit, $commit_data) = $modified_query->loadLastModification(); $phids = array(); - if ($commit_data && $commit_data->getCommitDetail('authorPHID')) { - $phids = array($commit_data->getCommitDetail('authorPHID')); + if ($commit_data) { + if ($commit_data->getCommitDetail('authorPHID')) { + $phids[$commit_data->getCommitDetail('authorPHID')] = true; + } + if ($commit_data->getCommitDetail('committerPHID')) { + $phids[$commit_data->getCommitDetail('committerPHID')] = true; + } } + $phids = array_keys($phids); $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles(); $output = DiffusionBrowseTableView::renderLastModifiedColumns( diff --git a/src/applications/diffusion/controller/repository/DiffusionRepositoryController.php b/src/applications/diffusion/controller/repository/DiffusionRepositoryController.php index 462e1f589f..dc994ba090 100644 --- a/src/applications/diffusion/controller/repository/DiffusionRepositoryController.php +++ b/src/applications/diffusion/controller/repository/DiffusionRepositoryController.php @@ -45,6 +45,9 @@ final class DiffusionRepositoryController extends DiffusionController { if ($data->getCommitDetail('authorPHID')) { $phids[$data->getCommitDetail('authorPHID')] = true; } + if ($data->getCommitDetail('committerPHID')) { + $phids[$data->getCommitDetail('committerPHID')] = true; + } } } @@ -54,6 +57,9 @@ final class DiffusionRepositoryController extends DiffusionController { if ($data->getCommitDetail('authorPHID')) { $phids[$data->getCommitDetail('authorPHID')] = true; } + if ($data->getCommitDetail('committerPHID')) { + $phids[$data->getCommitDetail('committerPHID')] = true; + } } } diff --git a/src/applications/diffusion/view/browsetable/DiffusionBrowseTableView.php b/src/applications/diffusion/view/browsetable/DiffusionBrowseTableView.php index 148b9925e4..652c5d3716 100644 --- a/src/applications/diffusion/view/browsetable/DiffusionBrowseTableView.php +++ b/src/applications/diffusion/view/browsetable/DiffusionBrowseTableView.php @@ -60,11 +60,25 @@ final class DiffusionBrowseTableView extends DiffusionView { } else { $author = phutil_escape_html($data->getAuthorName()); } + + $committer = $data->getCommitDetail('committer'); + if ($committer) { + $committer_phid = $data->getCommitDetail('committerPHID'); + if ($committer_phid && isset($handles[$committer_phid])) { + $committer = $handles[$committer_phid]->renderLink(); + } else { + $committer = phutil_escape_html($data->getCommitDetail('committer')); + } + } else { + $committer = $author; + } + $details = AphrontTableView::renderSingleDisplayLine( phutil_escape_html($data->getSummary())); } else { $author = ''; $details = ''; + $committer = ''; } return array( @@ -72,6 +86,7 @@ final class DiffusionBrowseTableView extends DiffusionView { 'date' => $date, 'time' => $time, 'author' => $author, + 'committer' => $committer, 'details' => $details, ); } @@ -140,6 +155,7 @@ final class DiffusionBrowseTableView extends DiffusionView { 'date' => celerity_generate_unique_node_id(), 'time' => celerity_generate_unique_node_id(), 'author' => celerity_generate_unique_node_id(), + 'committer' => celerity_generate_unique_node_id(), 'details' => celerity_generate_unique_node_id(), ); @@ -162,6 +178,7 @@ final class DiffusionBrowseTableView extends DiffusionView { $dict['date'], $dict['time'], $dict['author'], + $dict['committer'], $dict['details'], ); } @@ -179,6 +196,7 @@ final class DiffusionBrowseTableView extends DiffusionView { 'Date', 'Time', 'Author', + 'Committer', 'Details', )); $view->setColumnClasses( @@ -189,6 +207,7 @@ final class DiffusionBrowseTableView extends DiffusionView { '', 'right', '', + '', 'wide', )); return $view->render(); diff --git a/src/applications/diffusion/view/historytable/DiffusionHistoryTableView.php b/src/applications/diffusion/view/historytable/DiffusionHistoryTableView.php index d392a14766..e023485b24 100644 --- a/src/applications/diffusion/view/historytable/DiffusionHistoryTableView.php +++ b/src/applications/diffusion/view/historytable/DiffusionHistoryTableView.php @@ -43,6 +43,9 @@ final class DiffusionHistoryTableView extends DiffusionView { if ($data->getCommitDetail('authorPHID')) { $phids[$data->getCommitDetail('authorPHID')] = true; } + if ($data->getCommitDetail('committerPHID')) { + $phids[$data->getCommitDetail('committerPHID')] = true; + } } } return array_keys($phids); @@ -82,9 +85,11 @@ final class DiffusionHistoryTableView extends DiffusionView { } $data = $history->getCommitData(); - $author_phid = null; + $author_phid = $committer = $committer_phid = null; if ($data) { $author_phid = $data->getCommitDetail('authorPHID'); + $committer_phid = $data->getCommitDetail('committerPHID'); + $committer = $data->getCommitDetail('committer'); } if ($author_phid && isset($handles[$author_phid])) { @@ -93,6 +98,18 @@ final class DiffusionHistoryTableView extends DiffusionView { $author = phutil_escape_html($history->getAuthorName()); } + if ($committer) { + if ($committer_phid && isset($handles[$committer_phid])) { + $committer = $handles[$committer_phid]->renderLink(); + } else { + $committer = phutil_escape_html($committer); + } + } + else { + $committer = $author; + } + + $commit = $history->getCommit(); if ($commit && !$commit->getIsUnparsed() && $data) { $change = $this->linkChange( @@ -118,6 +135,7 @@ final class DiffusionHistoryTableView extends DiffusionView { $date, $time, $author, + $committer, AphrontTableView::renderSingleDisplayLine( phutil_escape_html($history->getSummary())), // TODO: etc etc @@ -134,6 +152,7 @@ final class DiffusionHistoryTableView extends DiffusionView { 'Date', 'Time', 'Author', + 'Committer', 'Details', )); $view->setColumnClasses( @@ -145,6 +164,7 @@ final class DiffusionHistoryTableView extends DiffusionView { '', 'right', '', + '', 'wide', )); $view->setColumnVisibility( diff --git a/src/applications/repository/parser/default/PhabricatorRepositoryDefaultCommitMessageDetailParser.php b/src/applications/repository/parser/default/PhabricatorRepositoryDefaultCommitMessageDetailParser.php index 3be0bbbe87..98fa07a7a7 100644 --- a/src/applications/repository/parser/default/PhabricatorRepositoryDefaultCommitMessageDetailParser.php +++ b/src/applications/repository/parser/default/PhabricatorRepositoryDefaultCommitMessageDetailParser.php @@ -82,6 +82,15 @@ class PhabricatorRepositoryDefaultCommitMessageDetailParser unset($details['authorPHID']); } + if (isset($details['committer'])) { + $committer_phid = $this->resolveUserPHID($details['committer']); + if ($committer_phid) { + $details['committerPHID'] = $committer_phid; + } else { + unset($details['committerPHID']); + } + } + $data->setCommitDetails($details); } diff --git a/src/applications/repository/worker/commitmessageparser/base/PhabricatorRepositoryCommitMessageParserWorker.php b/src/applications/repository/worker/commitmessageparser/base/PhabricatorRepositoryCommitMessageParserWorker.php index 6436a7260f..27f064efbc 100644 --- a/src/applications/repository/worker/commitmessageparser/base/PhabricatorRepositoryCommitMessageParserWorker.php +++ b/src/applications/repository/worker/commitmessageparser/base/PhabricatorRepositoryCommitMessageParserWorker.php @@ -23,7 +23,9 @@ abstract class PhabricatorRepositoryCommitMessageParserWorker PhabricatorRepository $repository, PhabricatorRepositoryCommit $commit); - final protected function updateCommitData($author, $message) { + final protected function updateCommitData($author, $message, + $committer = null) { + $commit = $this->commit; $data = id(new PhabricatorRepositoryCommitData())->loadOneWhere( @@ -36,6 +38,12 @@ abstract class PhabricatorRepositoryCommitMessageParserWorker $data->setAuthorName($author); $data->setCommitMessage($message); + if ($committer) { + $details = $data->getCommitDetails(); + $details['committer'] = $committer; + $data->setCommitDetails($details); + } + $repository = $this->repository; $detail_parser = $repository->getDetail( 'detail-parser', diff --git a/src/applications/repository/worker/commitmessageparser/git/PhabricatorRepositoryGitCommitMessageParserWorker.php b/src/applications/repository/worker/commitmessageparser/git/PhabricatorRepositoryGitCommitMessageParserWorker.php index ebe0aead5b..5e3841c95f 100644 --- a/src/applications/repository/worker/commitmessageparser/git/PhabricatorRepositoryGitCommitMessageParserWorker.php +++ b/src/applications/repository/worker/commitmessageparser/git/PhabricatorRepositoryGitCommitMessageParserWorker.php @@ -26,17 +26,23 @@ final class PhabricatorRepositoryGitCommitMessageParserWorker // NOTE: %B was introduced somewhat recently in git's history, so pull // commit message information with %s and %b instead. list($info) = $repository->execxLocalCommand( - "log -n 1 --encoding='UTF-8' --pretty=format:%%an%%x00%%s%%n%%n%%b %s", + "log -n 1 --encoding='UTF-8' " . + "--pretty=format:%%cn%%x00%%an%%x00%%s%%n%%n%%b %s", $commit->getCommitIdentifier()); - list($author, $message) = explode("\0", $info); + list($committer, $author, $message) = explode("\0", $info); // Make sure these are valid UTF-8. + $committer = phutil_utf8ize($committer); $author = phutil_utf8ize($author); $message = phutil_utf8ize($message); $message = trim($message); - $this->updateCommitData($author, $message); + if ($committer == $author) { + $committer = null; + } + + $this->updateCommitData($author, $message, $committer); if ($this->shouldQueueFollowupTasks()) { $task = new PhabricatorWorkerTask();