diff --git a/src/applications/repository/daemon/PhabricatorGitGraphStream.php b/src/applications/repository/daemon/PhabricatorGitGraphStream.php index 669cf9c105..b175053528 100644 --- a/src/applications/repository/daemon/PhabricatorGitGraphStream.php +++ b/src/applications/repository/daemon/PhabricatorGitGraphStream.php @@ -5,6 +5,7 @@ final class PhabricatorGitGraphStream private $repository; private $iterator; + private $startCommit; private $parents = array(); private $dates = array(); @@ -14,6 +15,7 @@ final class PhabricatorGitGraphStream $start_commit = null) { $this->repository = $repository; + $this->startCommit = $start_commit; if ($start_commit !== null) { $future = $repository->getLocalCommandFuture( @@ -82,10 +84,18 @@ final class PhabricatorGitGraphStream } } - throw new Exception( - pht( - "No such commit '%s' in repository!", - $commit)); + if ($this->startCommit !== null) { + throw new Exception( + pht( + 'Commit "%s" is not a reachable ancestor of "%s".', + $commit, + $this->startCommit)); + } else { + throw new Exception( + pht( + 'Commit "%s" is not a reachable ancestor of any ref.', + $commit)); + } } private function isParsed($commit) { diff --git a/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php b/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php index cdb7e11d03..fd8c57e9b4 100644 --- a/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php +++ b/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php @@ -157,7 +157,12 @@ final class PhabricatorRepositoryDiscoveryEngine $name = $ref->getShortName(); $commit = $ref->getCommitIdentifier(); - $this->log(pht('Examining ref "%s", at "%s".', $name, $commit)); + $this->log( + pht( + 'Examining "%s" (%s) at "%s".', + $name, + $ref->getRefType(), + $commit)); if (!$repository->shouldTrackRef($ref)) { $this->log(pht('Skipping, ref is untracked.')); @@ -169,6 +174,15 @@ final class PhabricatorRepositoryDiscoveryEngine continue; } + // In Git, it's possible to tag a tag. We just skip these, we'll discover + // them when we process the target tag. See T11180. + $fields = $ref->getRawFields(); + $tag_type = idx($fields, '*objecttype'); + if ($tag_type == 'tag') { + $this->log(pht('Skipping, this is a tag of a tag.')); + continue; + } + $this->log(pht('Looking for new commits.')); $head_refs = $this->discoverStreamAncestry(