# HG changeset patch # User mpm@selenic.com # Date 1117386403 28800 # Node ID 3dd5ce2fddb65c05da9c5eded60fe738dc186bc5 # Parent 37625132fe375d694c60a497ac962d02ea87a9d9 merge: short-circuit search for merge into empty repo -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 merge: short-circuit search for merge into empty repo We should have 3 cases for merge: - - we have no changesets - - we have less than half the changesets - - we have more than half the changesets For no changesets, we can immediately tell that we need everything. This happens when we initially branch from a remote repo, so we simply shortcircuit the search and grab everything from the root When we're actually tracking a project, we should generally have most of the changesets, so the current search algorithm should minimize searching. It should rarely occur that upstreams gets far ahead of us, in which case, we suffer a longer search. manifest hash: eabd55841b03225176ea72b985aad36431a438a9 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCmfajywK+sNU5EO8RAuyKAKCf7Nw6XSK5HEzbrZae7Q06e3dk4wCgjbK6 YUTEfkpPP1h3mNHIHRKz+aI= =eGMq -----END PGP SIGNATURE----- diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -525,15 +525,21 @@ class localrepository: return nl def getchangegroup(self, remote): - tip = remote.branches([])[0] - self.ui.debug("remote tip branch is %s:%s\n" % - (short(tip[0]), short(tip[1]))) m = self.changelog.nodemap - unknown = [tip] search = [] fetch = [] seen = {} seenbranch = {} + tip = remote.branches([])[0] + self.ui.debug("remote tip branch is %s:%s\n" % + (short(tip[0]), short(tip[1]))) + + # if we have an empty repo, fetch everything + if self.changelog.tip() == nullid: + return remote.changegroup([nullid]) + + # otherwise, assume we're closer to the tip than the root + unknown = [tip] if tip[0] in m: self.ui.note("nothing to do!\n")