diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py --- a/mercurial/bookmarks.py +++ b/mercurial/bookmarks.py @@ -364,6 +364,22 @@ def updatefromremote(ui, repo, remotemar writer(msg) localmarks.write() +def updateremote(ui, repo, remote, revs): + ui.debug("checking for updated bookmarks\n") + revnums = map(repo.changelog.rev, revs or []) + ancestors = [a for a in repo.changelog.ancestors(revnums, inclusive=True)] + (addsrc, adddst, advsrc, advdst, diverge, differ, invalid + ) = compare(repo, repo._bookmarks, remote.listkeys('bookmarks'), + srchex=hex) + + for b, scid, dcid in advsrc: + if ancestors and repo[scid].rev() not in ancestors: + continue + if remote.pushkey('bookmarks', b, dcid, scid): + ui.status(_("updating bookmark %s\n") % b) + else: + ui.warn(_('updating bookmark %s failed!\n') % b) + def pushtoremote(ui, repo, remote, targets): (addsrc, adddst, advsrc, advdst, diverge, differ, invalid ) = compare(repo, repo._bookmarks, remote.listkeys('bookmarks'), diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1976,27 +1976,7 @@ class localrepository(object): if locallock is not None: locallock.release() - self.ui.debug("checking for updated bookmarks\n") - rb = remote.listkeys('bookmarks') - revnums = map(unfi.changelog.rev, revs or []) - ancestors = [ - a for a in unfi.changelog.ancestors(revnums, inclusive=True)] - for k in rb.keys(): - if k in unfi._bookmarks: - nr, nl = rb[k], hex(self._bookmarks[k]) - if nr in unfi: - cr = unfi[nr] - cl = unfi[nl] - if bookmarks.validdest(unfi, cr, cl): - if ancestors and cl.rev() not in ancestors: - continue - r = remote.pushkey('bookmarks', k, nr, nl) - if r: - self.ui.status(_("updating bookmark %s\n") % k) - else: - self.ui.warn(_('updating bookmark %s' - ' failed!\n') % k) - + bookmarks.updateremote(self.ui, unfi, remote, revs) return ret def changegroupinfo(self, nodes, source):