mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 16:52:41 +01:00
Show the difference between a committer and an author
Summary: Git and hg (supposedly..) differentiate between an author (who wrote the patch) and a committer (who applied the patch). This patch allows Phabricator to note when a patch is committed by someone other than the Author. Test Plan: Created 2 accounts, - U (Account with a PHID) - U' (Account without a PHID) and had them create and commit commits testing if their username/real name would be displayed correctly in Diffusion, - BrowserTable - HistoryTable - Code revision Teztz, A(uthor)/C(ommitter) If it's A/A then Author committed UL = User link (<a href="/p/username">username</a>) UN = User name ("Firstname Lastname") Tezt | Expected in table | Got ------------------------------------------- A/A | UL/UL | UL/UL A'/C | UN/UL | UN/UL A/C' | UL/UN | UL/UN A'/C' | UN/UN | UN/UN Reviewers: epriestley Reviewed By: epriestley CC: aran, Koolvin Maniphest Tasks: T688 Differential Revision: https://secure.phabricator.com/D2541
This commit is contained in:
parent
e4e56bb431
commit
a438c87c52
8 changed files with 95 additions and 7 deletions
|
@ -287,6 +287,9 @@ final class DiffusionCommitController extends DiffusionController {
|
||||||
if ($data->getCommitDetail('reviewerPHID')) {
|
if ($data->getCommitDetail('reviewerPHID')) {
|
||||||
$phids[] = $data->getCommitDetail('reviewerPHID');
|
$phids[] = $data->getCommitDetail('reviewerPHID');
|
||||||
}
|
}
|
||||||
|
if ($data->getCommitDetail('committerPHID')) {
|
||||||
|
$phids[] = $data->getCommitDetail('committerPHID');
|
||||||
|
}
|
||||||
if ($data->getCommitDetail('differential.revisionPHID')) {
|
if ($data->getCommitDetail('differential.revisionPHID')) {
|
||||||
$phids[] = $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);
|
$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');
|
$revision_phid = $data->getCommitDetail('differential.revisionPHID');
|
||||||
if ($revision_phid) {
|
if ($revision_phid) {
|
||||||
$props['Differential Revision'] = $handles[$revision_phid]->renderLink();
|
$props['Differential Revision'] = $handles[$revision_phid]->renderLink();
|
||||||
|
|
|
@ -27,10 +27,16 @@ final class DiffusionLastModifiedController extends DiffusionController {
|
||||||
list($commit, $commit_data) = $modified_query->loadLastModification();
|
list($commit, $commit_data) = $modified_query->loadLastModification();
|
||||||
|
|
||||||
$phids = array();
|
$phids = array();
|
||||||
if ($commit_data && $commit_data->getCommitDetail('authorPHID')) {
|
if ($commit_data) {
|
||||||
$phids = array($commit_data->getCommitDetail('authorPHID'));
|
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();
|
$handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
|
||||||
|
|
||||||
$output = DiffusionBrowseTableView::renderLastModifiedColumns(
|
$output = DiffusionBrowseTableView::renderLastModifiedColumns(
|
||||||
|
|
|
@ -45,6 +45,9 @@ final class DiffusionRepositoryController extends DiffusionController {
|
||||||
if ($data->getCommitDetail('authorPHID')) {
|
if ($data->getCommitDetail('authorPHID')) {
|
||||||
$phids[$data->getCommitDetail('authorPHID')] = true;
|
$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')) {
|
if ($data->getCommitDetail('authorPHID')) {
|
||||||
$phids[$data->getCommitDetail('authorPHID')] = true;
|
$phids[$data->getCommitDetail('authorPHID')] = true;
|
||||||
}
|
}
|
||||||
|
if ($data->getCommitDetail('committerPHID')) {
|
||||||
|
$phids[$data->getCommitDetail('committerPHID')] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,11 +60,25 @@ final class DiffusionBrowseTableView extends DiffusionView {
|
||||||
} else {
|
} else {
|
||||||
$author = phutil_escape_html($data->getAuthorName());
|
$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(
|
$details = AphrontTableView::renderSingleDisplayLine(
|
||||||
phutil_escape_html($data->getSummary()));
|
phutil_escape_html($data->getSummary()));
|
||||||
} else {
|
} else {
|
||||||
$author = '';
|
$author = '';
|
||||||
$details = '';
|
$details = '';
|
||||||
|
$committer = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
@ -72,6 +86,7 @@ final class DiffusionBrowseTableView extends DiffusionView {
|
||||||
'date' => $date,
|
'date' => $date,
|
||||||
'time' => $time,
|
'time' => $time,
|
||||||
'author' => $author,
|
'author' => $author,
|
||||||
|
'committer' => $committer,
|
||||||
'details' => $details,
|
'details' => $details,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -140,6 +155,7 @@ final class DiffusionBrowseTableView extends DiffusionView {
|
||||||
'date' => celerity_generate_unique_node_id(),
|
'date' => celerity_generate_unique_node_id(),
|
||||||
'time' => celerity_generate_unique_node_id(),
|
'time' => celerity_generate_unique_node_id(),
|
||||||
'author' => celerity_generate_unique_node_id(),
|
'author' => celerity_generate_unique_node_id(),
|
||||||
|
'committer' => celerity_generate_unique_node_id(),
|
||||||
'details' => celerity_generate_unique_node_id(),
|
'details' => celerity_generate_unique_node_id(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -162,6 +178,7 @@ final class DiffusionBrowseTableView extends DiffusionView {
|
||||||
$dict['date'],
|
$dict['date'],
|
||||||
$dict['time'],
|
$dict['time'],
|
||||||
$dict['author'],
|
$dict['author'],
|
||||||
|
$dict['committer'],
|
||||||
$dict['details'],
|
$dict['details'],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -179,6 +196,7 @@ final class DiffusionBrowseTableView extends DiffusionView {
|
||||||
'Date',
|
'Date',
|
||||||
'Time',
|
'Time',
|
||||||
'Author',
|
'Author',
|
||||||
|
'Committer',
|
||||||
'Details',
|
'Details',
|
||||||
));
|
));
|
||||||
$view->setColumnClasses(
|
$view->setColumnClasses(
|
||||||
|
@ -189,6 +207,7 @@ final class DiffusionBrowseTableView extends DiffusionView {
|
||||||
'',
|
'',
|
||||||
'right',
|
'right',
|
||||||
'',
|
'',
|
||||||
|
'',
|
||||||
'wide',
|
'wide',
|
||||||
));
|
));
|
||||||
return $view->render();
|
return $view->render();
|
||||||
|
|
|
@ -43,6 +43,9 @@ final class DiffusionHistoryTableView extends DiffusionView {
|
||||||
if ($data->getCommitDetail('authorPHID')) {
|
if ($data->getCommitDetail('authorPHID')) {
|
||||||
$phids[$data->getCommitDetail('authorPHID')] = true;
|
$phids[$data->getCommitDetail('authorPHID')] = true;
|
||||||
}
|
}
|
||||||
|
if ($data->getCommitDetail('committerPHID')) {
|
||||||
|
$phids[$data->getCommitDetail('committerPHID')] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return array_keys($phids);
|
return array_keys($phids);
|
||||||
|
@ -82,9 +85,11 @@ final class DiffusionHistoryTableView extends DiffusionView {
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = $history->getCommitData();
|
$data = $history->getCommitData();
|
||||||
$author_phid = null;
|
$author_phid = $committer = $committer_phid = null;
|
||||||
if ($data) {
|
if ($data) {
|
||||||
$author_phid = $data->getCommitDetail('authorPHID');
|
$author_phid = $data->getCommitDetail('authorPHID');
|
||||||
|
$committer_phid = $data->getCommitDetail('committerPHID');
|
||||||
|
$committer = $data->getCommitDetail('committer');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($author_phid && isset($handles[$author_phid])) {
|
if ($author_phid && isset($handles[$author_phid])) {
|
||||||
|
@ -93,6 +98,18 @@ final class DiffusionHistoryTableView extends DiffusionView {
|
||||||
$author = phutil_escape_html($history->getAuthorName());
|
$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();
|
$commit = $history->getCommit();
|
||||||
if ($commit && !$commit->getIsUnparsed() && $data) {
|
if ($commit && !$commit->getIsUnparsed() && $data) {
|
||||||
$change = $this->linkChange(
|
$change = $this->linkChange(
|
||||||
|
@ -118,6 +135,7 @@ final class DiffusionHistoryTableView extends DiffusionView {
|
||||||
$date,
|
$date,
|
||||||
$time,
|
$time,
|
||||||
$author,
|
$author,
|
||||||
|
$committer,
|
||||||
AphrontTableView::renderSingleDisplayLine(
|
AphrontTableView::renderSingleDisplayLine(
|
||||||
phutil_escape_html($history->getSummary())),
|
phutil_escape_html($history->getSummary())),
|
||||||
// TODO: etc etc
|
// TODO: etc etc
|
||||||
|
@ -134,6 +152,7 @@ final class DiffusionHistoryTableView extends DiffusionView {
|
||||||
'Date',
|
'Date',
|
||||||
'Time',
|
'Time',
|
||||||
'Author',
|
'Author',
|
||||||
|
'Committer',
|
||||||
'Details',
|
'Details',
|
||||||
));
|
));
|
||||||
$view->setColumnClasses(
|
$view->setColumnClasses(
|
||||||
|
@ -145,6 +164,7 @@ final class DiffusionHistoryTableView extends DiffusionView {
|
||||||
'',
|
'',
|
||||||
'right',
|
'right',
|
||||||
'',
|
'',
|
||||||
|
'',
|
||||||
'wide',
|
'wide',
|
||||||
));
|
));
|
||||||
$view->setColumnVisibility(
|
$view->setColumnVisibility(
|
||||||
|
|
|
@ -82,6 +82,15 @@ class PhabricatorRepositoryDefaultCommitMessageDetailParser
|
||||||
unset($details['authorPHID']);
|
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);
|
$data->setCommitDetails($details);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,9 @@ abstract class PhabricatorRepositoryCommitMessageParserWorker
|
||||||
PhabricatorRepository $repository,
|
PhabricatorRepository $repository,
|
||||||
PhabricatorRepositoryCommit $commit);
|
PhabricatorRepositoryCommit $commit);
|
||||||
|
|
||||||
final protected function updateCommitData($author, $message) {
|
final protected function updateCommitData($author, $message,
|
||||||
|
$committer = null) {
|
||||||
|
|
||||||
$commit = $this->commit;
|
$commit = $this->commit;
|
||||||
|
|
||||||
$data = id(new PhabricatorRepositoryCommitData())->loadOneWhere(
|
$data = id(new PhabricatorRepositoryCommitData())->loadOneWhere(
|
||||||
|
@ -36,6 +38,12 @@ abstract class PhabricatorRepositoryCommitMessageParserWorker
|
||||||
$data->setAuthorName($author);
|
$data->setAuthorName($author);
|
||||||
$data->setCommitMessage($message);
|
$data->setCommitMessage($message);
|
||||||
|
|
||||||
|
if ($committer) {
|
||||||
|
$details = $data->getCommitDetails();
|
||||||
|
$details['committer'] = $committer;
|
||||||
|
$data->setCommitDetails($details);
|
||||||
|
}
|
||||||
|
|
||||||
$repository = $this->repository;
|
$repository = $this->repository;
|
||||||
$detail_parser = $repository->getDetail(
|
$detail_parser = $repository->getDetail(
|
||||||
'detail-parser',
|
'detail-parser',
|
||||||
|
|
|
@ -26,17 +26,23 @@ final class PhabricatorRepositoryGitCommitMessageParserWorker
|
||||||
// NOTE: %B was introduced somewhat recently in git's history, so pull
|
// NOTE: %B was introduced somewhat recently in git's history, so pull
|
||||||
// commit message information with %s and %b instead.
|
// commit message information with %s and %b instead.
|
||||||
list($info) = $repository->execxLocalCommand(
|
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());
|
$commit->getCommitIdentifier());
|
||||||
|
|
||||||
list($author, $message) = explode("\0", $info);
|
list($committer, $author, $message) = explode("\0", $info);
|
||||||
|
|
||||||
// Make sure these are valid UTF-8.
|
// Make sure these are valid UTF-8.
|
||||||
|
$committer = phutil_utf8ize($committer);
|
||||||
$author = phutil_utf8ize($author);
|
$author = phutil_utf8ize($author);
|
||||||
$message = phutil_utf8ize($message);
|
$message = phutil_utf8ize($message);
|
||||||
$message = trim($message);
|
$message = trim($message);
|
||||||
|
|
||||||
$this->updateCommitData($author, $message);
|
if ($committer == $author) {
|
||||||
|
$committer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->updateCommitData($author, $message, $committer);
|
||||||
|
|
||||||
if ($this->shouldQueueFollowupTasks()) {
|
if ($this->shouldQueueFollowupTasks()) {
|
||||||
$task = new PhabricatorWorkerTask();
|
$task = new PhabricatorWorkerTask();
|
||||||
|
|
Loading…
Reference in a new issue