Permalink
Browse files

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
  • Loading branch information...
1 parent 3f2c6b6 commit ac0aa330f5972d7ca04483b243e3b9802e2b897a @epriestley epriestley committed Apr 2, 2013
Showing with 18 additions and 10 deletions.
  1. +7 −3 src/repository/api/ArcanistMercurialAPI.php
  2. +11 −7 src/workflow/ArcanistExportWorkflow.php
@@ -199,8 +199,8 @@ public function getLocalCommitInformation() {
if ($this->localCommitInfo === null) {
$base_commit = $this->getBaseCommit();
list($info) = $this->execxLocal(
- "log --template '%C' --rev %s --branch %s --",
- "{node}\1{rev}\1{author|emailuser}\1{author|email}\1".
+ "log --template %s --rev %s --branch %s --",
+ "{node}\1{rev}\1{author}\1".
"{date|rfc822date}\1{branch}\1{tag}\1{parents}\1{desc}\2",
hgsprintf('(%s::. - %s)', $base_commit, $base_commit),
$this->getBranchName());
@@ -212,9 +212,13 @@ public function getLocalCommitInformation() {
$commits = array();
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);
+ $email = new PhutilEmailAddress($full_author);
+ $author = $email->getDisplayName();
+ $author_email = $email->getAddress();
+
// NOTE: If a commit has only one parent, {parents} returns empty.
// 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
@@ -186,22 +186,23 @@ public function run() {
'phids' => array($this->getUserPHID()),
));
$author_dict = reset($authors);
+
+ list($email) = $repository_api->execxLocal('config user.email');
+
$author = sprintf('%s <%s>',
$author_dict['realName'],
- $repository_api->execxLocal('config user.email'));
+ $email);
} else if ($repository_api instanceof ArcanistMercurialAPI) {
- $repository_api->parseBaseCommitArgument($this->getArgument('paths'));
+ $this->parseBaseCommitArgument($this->getArgument('paths'));
$diff = $repository_api->getFullMercurialDiff();
$changes = $parser->parseDiff($diff);
$authors = $this->getConduit()->callMethodSynchronous(
'user.query',
array(
'phids' => array($this->getUserPHID()),
));
- $author_dict = reset($authors);
- $author = sprintf('%s <%s>',
- $author_dict['realName'],
- $repository_api->execxLocal('showconfig ui.username'));
+
+ list($author) = $repository_api->execxLocal('showconfig ui.username');
} else {
// TODO: paths support
$paths = $repository_api->getWorkingCopyStatus();
@@ -216,7 +217,10 @@ public function run() {
$bundle->setBaseRevision(
$repository_api->getSourceControlBaseRevision());
// 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;
case self::SOURCE_REVISION:
$bundle = $this->loadRevisionBundleFromConduit(

0 comments on commit ac0aa33

Please sign in to comment.