bookmarks: rewrite pushing bookmarks in "localrepository.push()" by "compare()"
This patch adds "updateremote()", which uses "compare()" to compare
bookmarks between the local and the remote repositories, to replace
pushing local bookmarks in "localrepository.push()".
--- a/mercurial/bookmarks.py Fri Nov 08 12:45:52 2013 +0900
+++ b/mercurial/bookmarks.py Fri Nov 08 12:45:52 2013 +0900
@@ -364,6 +364,22 @@
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'),
--- a/mercurial/localrepo.py Fri Nov 08 12:45:52 2013 +0900
+++ b/mercurial/localrepo.py Fri Nov 08 12:45:52 2013 +0900
@@ -1976,27 +1976,7 @@
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):