1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-22 14:52:40 +01:00

Don't use emailuser in Mercurial

Summary:
The `emailuser` template is a relatively recent addition to Mercurial, and a few users have complained about it. It also doesn't actually do what I thought it did, e.g. in an address like this:

  "Abraham Lincoln" <alincoln@whitehouse.gov>
   ^^^^^^^^^^^^^^^   ^^^^^^^^
         (1)            (2)

                     ^^^^^^^^^^^^^^^^^^^^^^^
                              (3)

...I want (1), but `emailuser` means (2). Instead, extract (1) with `getDisplayName()` and (3) with `getAddress()` using PhutilEmailAddress.

The implementation in Mercurial is not particularly sophisticated or magical (it just looks for "@" and "<") so we aren't really missing anything by doing this ourselves, at least today.

Also fix some issues in `arc export`, which literally no one uses, but which is occasionally useful for testing (as here).

Test Plan:
  - Ran `arc diff --only` in an `hg` repo, checked DB to see that name/email were correctly extracted.
  - Ran `arc export --git` in an `hg` repo, didn't get a long series of fatals.

Reviewers: btrahan, DurhamGoode

Reviewed By: DurhamGoode

CC: aran

Maniphest Tasks: T2866, T2858

Differential Revision: https://secure.phabricator.com/D5539
This commit is contained in:
epriestley 2013-04-02 14:06:46 -07:00
parent 3f2c6b629f
commit ac0aa330f5
2 changed files with 18 additions and 10 deletions

View file

@ -199,8 +199,8 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
if ($this->localCommitInfo === null) { if ($this->localCommitInfo === null) {
$base_commit = $this->getBaseCommit(); $base_commit = $this->getBaseCommit();
list($info) = $this->execxLocal( list($info) = $this->execxLocal(
"log --template '%C' --rev %s --branch %s --", "log --template %s --rev %s --branch %s --",
"{node}\1{rev}\1{author|emailuser}\1{author|email}\1". "{node}\1{rev}\1{author}\1".
"{date|rfc822date}\1{branch}\1{tag}\1{parents}\1{desc}\2", "{date|rfc822date}\1{branch}\1{tag}\1{parents}\1{desc}\2",
hgsprintf('(%s::. - %s)', $base_commit, $base_commit), hgsprintf('(%s::. - %s)', $base_commit, $base_commit),
$this->getBranchName()); $this->getBranchName());
@ -212,9 +212,13 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
$commits = array(); $commits = array();
foreach ($logs as $log) { foreach ($logs as $log) {
list($node, $rev, $author, $author_email, $date, $branch, $tag, list($node, $rev, $full_author, $date, $branch, $tag,
$parents, $desc) = explode("\1", $log, 9); $parents, $desc) = explode("\1", $log, 9);
$email = new PhutilEmailAddress($full_author);
$author = $email->getDisplayName();
$author_email = $email->getAddress();
// NOTE: If a commit has only one parent, {parents} returns empty. // NOTE: If a commit has only one parent, {parents} returns empty.
// If it has two parents, {parents} returns revs and short hashes, not // If it has two parents, {parents} returns revs and short hashes, not
// full hashes. Try to avoid making calls to "hg parents" because it's // full hashes. Try to avoid making calls to "hg parents" because it's

View file

@ -186,11 +186,14 @@ EOTEXT
'phids' => array($this->getUserPHID()), 'phids' => array($this->getUserPHID()),
)); ));
$author_dict = reset($authors); $author_dict = reset($authors);
list($email) = $repository_api->execxLocal('config user.email');
$author = sprintf('%s <%s>', $author = sprintf('%s <%s>',
$author_dict['realName'], $author_dict['realName'],
$repository_api->execxLocal('config user.email')); $email);
} else if ($repository_api instanceof ArcanistMercurialAPI) { } else if ($repository_api instanceof ArcanistMercurialAPI) {
$repository_api->parseBaseCommitArgument($this->getArgument('paths')); $this->parseBaseCommitArgument($this->getArgument('paths'));
$diff = $repository_api->getFullMercurialDiff(); $diff = $repository_api->getFullMercurialDiff();
$changes = $parser->parseDiff($diff); $changes = $parser->parseDiff($diff);
$authors = $this->getConduit()->callMethodSynchronous( $authors = $this->getConduit()->callMethodSynchronous(
@ -198,10 +201,8 @@ EOTEXT
array( array(
'phids' => array($this->getUserPHID()), 'phids' => array($this->getUserPHID()),
)); ));
$author_dict = reset($authors);
$author = sprintf('%s <%s>', list($author) = $repository_api->execxLocal('showconfig ui.username');
$author_dict['realName'],
$repository_api->execxLocal('showconfig ui.username'));
} else { } else {
// TODO: paths support // TODO: paths support
$paths = $repository_api->getWorkingCopyStatus(); $paths = $repository_api->getWorkingCopyStatus();
@ -216,7 +217,10 @@ EOTEXT
$bundle->setBaseRevision( $bundle->setBaseRevision(
$repository_api->getSourceControlBaseRevision()); $repository_api->getSourceControlBaseRevision());
// note we can't get a revision ID for SOURCE_LOCAL // note we can't get a revision ID for SOURCE_LOCAL
$bundle->setAuthor($author);
$parser = new PhutilEmailAddress($author);
$bundle->setAuthorName($parser->getDisplayName());
$bundle->setAuthorEmail($parser->getAddress());
break; break;
case self::SOURCE_REVISION: case self::SOURCE_REVISION:
$bundle = $this->loadRevisionBundleFromConduit( $bundle = $this->loadRevisionBundleFromConduit(