[PATCH 2 of 2] bookmarks: show details of difference between local and remote bookmarks
FUJIWARA Katsunori
foozy at lares.dti.ne.jp
Sat Sep 22 00:56:42 CDT 2012
# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1348293230 -32400
# Node ID fb900c89f96b209486068ef2cdb4b9af43db1de6
# Parent 750be2c38db4e86c3f09d0cae83e9af9d49795e7
bookmarks: show details of difference between local and remote bookmarks
Before this patch, "hg incoming"/"hg outgoing" with -B show only
bookmarks newly added on the source repository.
So, users can't know whether "hg push"/"hg pull" cause divergence or
overwriting of specific bookmark or not, before execution of them.
This patch shows not only newly added bookmarks, but also details of
difference between local and remote bookmarks.
For local bookmarks which are different from ones on remote, details
of them are decided as below: each of "b at local" and "b at remote" are
assumed to mean revisions referred by bookmarks on each sides.
- if "b at remote" is contained in the local:
- if "b at local" and "b at remote" are diverged, show as "(diverged)"
- if "b at local" < "b at remote", show as "(advanced on the remote)"
- otherwise("b at remoet" < "b at local"), show as "(advanced on the local)"
- otherwise:
- show as "(different from the remote)", because "b at local" is
different from "b at remote", but divergence of them can't be
examined with low cost
Examination divergence between revisions by 'changectx.descendant()'
costs "O(N)" for the number of revisions between ones referred by
local and remote bookmarks at most.
diff -r 750be2c38db4 -r fb900c89f96b mercurial/bookmarks.py
--- a/mercurial/bookmarks.py Sat Sep 22 14:53:50 2012 +0900
+++ b/mercurial/bookmarks.py Sat Sep 22 14:53:50 2012 +0900
@@ -237,16 +237,55 @@
if changed:
write(repo)
-def diff(ui, dst, src):
+def diff(ui, dst, src, local):
ui.status(_("searching for changed bookmarks\n"))
smarks = src.listkeys('bookmarks')
dmarks = dst.listkeys('bookmarks')
- diff = sorted(set(smarks) - set(dmarks))
- for k in diff:
+ smarkset = set(smarks)
+ dmarkset = set(dmarks)
+ diff = smarkset - dmarkset
+ for k in smarkset & dmarkset:
+ if smarks[k] != dmarks[k]:
+ diff.add(k)
+ if dst.local() == local:
+ # incoming
+ advmsgs = [
+ _("(advanced on the local)"), # b at src < b at dst(local)
+ _("(advanced on the remote)"), # b at dst(local) < b at src
+ ]
+ addmsg = _("(added on the remote)")
+ else:
+ # outgoing
+ advmsgs = [
+ _("(advanced on the remote)"), # b at src(local) < b at dst
+ _("(advanced on the local)"), # b at dst < b at src(local)
+ ]
+ addmsg = _("(added on the local)")
+ for k in sorted(diff):
mark = ui.debugflag and smarks[k] or smarks[k][:12]
- ui.write(" %-25s %s\n" % (k, mark))
+ if k in dmarks:
+ scid = smarks[k]
+ dcid = dmarks[k]
+ if scid in local and dcid in local:
+ sctx = local[scid]
+ dctx = local[dcid]
+ if sctx.rev() < dctx.rev():
+ if sctx.descendant(dctx):
+ msg = advmsgs[0]
+ else:
+ msg = _("(diverged)")
+ else:
+ if dctx.descendant(sctx):
+ msg = advmsgs[1]
+ else:
+ msg = _("(diverged)")
+ else:
+ msg = _("(different from the remote)")
+ else:
+ msg = addmsg
+ ui.write(" %-25s %s %s\n" % (k, mark, msg))
if len(diff) <= 0:
ui.status(_("no changed bookmarks found\n"))
diff -r 750be2c38db4 -r fb900c89f96b mercurial/commands.py
--- a/mercurial/commands.py Sat Sep 22 14:53:50 2012 +0900
+++ b/mercurial/commands.py Sat Sep 22 14:53:50 2012 +0900
@@ -3894,7 +3894,7 @@
ui.warn(_("remote doesn't support bookmarks\n"))
return 0
ui.status(_('comparing with %s\n') % util.hidepassword(source))
- return bookmarks.diff(ui, repo, other)
+ return bookmarks.diff(ui, repo, other, repo)
repo._subtoppath = ui.expandpath(source)
try:
@@ -4358,7 +4358,7 @@
ui.warn(_("remote doesn't support bookmarks\n"))
return 0
ui.status(_('comparing with %s\n') % util.hidepassword(dest))
- return bookmarks.diff(ui, other, repo)
+ return bookmarks.diff(ui, other, repo, repo)
repo._subtoppath = ui.expandpath(dest or 'default-push', dest or 'default')
try:
diff -r 750be2c38db4 -r fb900c89f96b tests/test-bookmarks-pushpull.t
--- a/tests/test-bookmarks-pushpull.t Sat Sep 22 14:53:50 2012 +0900
+++ b/tests/test-bookmarks-pushpull.t Sat Sep 22 14:53:50 2012 +0900
@@ -268,11 +268,19 @@
Z 0d2164f0ce0d8f1d6f94351eba04b794909be66c
foo 0000000000000000000000000000000000000000
X 9b140be1080824d768c5a4691a564088eede71f9
+ $ hg log -G --template '{node|short} ({bookmarks})'
+ o 4efff6d98829 (Y)
+ |
+ | o 9b140be10808 ()
+ |/
+ | @ 0d2164f0ce0d (X Z)
+ |/
+ o 4e3505fd9583 ()
+
$ hg out -B http://localhost:$HGPORT/
comparing with http://localhost:$HGPORT/
searching for changed bookmarks
- no changed bookmarks found
- [1]
+ X 0d2164f0ce0d (diverged)
$ hg push -B Z http://localhost:$HGPORT/
pushing to http://localhost:$HGPORT/
searching for changes
@@ -283,9 +291,10 @@
$ hg in -B http://localhost:$HGPORT/
comparing with http://localhost:$HGPORT/
searching for changed bookmarks
- Z 0d2164f0ce0d
- foo 000000000000
- foobar 9b140be10808
+ X 9b140be10808 (diverged)
+ Z 0d2164f0ce0d (added on the remote)
+ foo 000000000000 (added on the remote)
+ foobar 9b140be10808 (added on the remote)
$ hg pull -B Z http://localhost:$HGPORT/
pulling from http://localhost:$HGPORT/
no changes found
@@ -344,3 +353,101 @@
exporting bookmark add-foo
$ cd ..
+
+Test to show result of bookmarks comparision with kind of difference:
+this also tests to show not only added bookmarks but also changed
+bookmarks.
+
+ $ mkdir bookmarkdiff
+ $ cd bookmarkdiff
+
+ $ hg init source
+ $ hg -R source debugbuilddag '+2*2*3*4'
+ $ hg -R source log -G --template '{rev}:{node|short}'
+ o 4:e7bd5218ca15
+ |
+ | o 3:6100d3090acf
+ |/
+ | o 2:fa942426a6fd
+ |/
+ | o 1:66f7d451a68b
+ |/
+ o 0:1ea73414a91b
+
+ $ hg -R source bookmarks -r 0 SAME
+ $ hg -R source bookmarks -r 0 ADV_ON_REPO2
+ $ hg -R source bookmarks -r 1 DIVERGED
+ $ hg -R source bookmarks -r 0 DIFF_ADV_ON_REPO1
+ $ hg -R source bookmarks -r 0 DIFF_ADV_ON_REPO2
+
+ $ hg clone -U source repo1
+ $ hg -R repo1 bookmarks -f -r 1 ADD_ON_REPO1
+ $ hg -R repo1 bookmarks -f -r 3 DIFF_ADV_ON_REPO1
+ $ hg -R repo1 bookmarks -f -r 3 DIFF_DIVERGED
+ $ hg -R repo1 -q --config extensions.mq= strip 4
+ $ hg -R repo1 log -G --template '{node|short} ({bookmarks})'
+ o 6100d3090acf (DIFF_ADV_ON_REPO1 DIFF_DIVERGED)
+ |
+ | o fa942426a6fd ()
+ |/
+ | o 66f7d451a68b (ADD_ON_REPO1 DIVERGED)
+ |/
+ o 1ea73414a91b (ADV_ON_REPO2 DIFF_ADV_ON_REPO2 SAME)
+
+
+ $ hg clone -U source repo2
+ $ hg -R repo2 bookmarks -f -r 1 ADD_ON_REPO2
+ $ hg -R repo2 bookmarks -f -r 1 ADV_ON_REPO2
+ $ hg -R repo2 bookmarks -f -r 2 DIVERGED
+ $ hg -R repo2 bookmarks -f -r 4 DIFF_ADV_ON_REPO2
+ $ hg -R repo2 bookmarks -f -r 4 DIFF_DIVERGED
+ $ hg -R repo2 -q --config extensions.mq= strip 3
+ $ hg -R repo2 log -G --template '{node|short} ({bookmarks})'
+ o e7bd5218ca15 (DIFF_ADV_ON_REPO2 DIFF_DIVERGED)
+ |
+ | o fa942426a6fd (DIVERGED)
+ |/
+ | o 66f7d451a68b (ADD_ON_REPO2 ADV_ON_REPO2)
+ |/
+ o 1ea73414a91b (DIFF_ADV_ON_REPO1 SAME)
+
+
+ $ hg -R repo1 incoming -B repo2
+ comparing with repo2
+ searching for changed bookmarks
+ ADD_ON_REPO2 66f7d451a68b (added on the remote)
+ ADV_ON_REPO2 66f7d451a68b (advanced on the remote)
+ DIFF_ADV_ON_REPO1 1ea73414a91b (advanced on the local)
+ DIFF_ADV_ON_REPO2 e7bd5218ca15 (different from the remote)
+ DIFF_DIVERGED e7bd5218ca15 (different from the remote)
+ DIVERGED fa942426a6fd (diverged)
+ $ hg -R repo1 outgoing -B repo2
+ comparing with repo2
+ searching for changed bookmarks
+ ADD_ON_REPO1 66f7d451a68b (added on the local)
+ ADV_ON_REPO2 1ea73414a91b (advanced on the remote)
+ DIFF_ADV_ON_REPO1 6100d3090acf (advanced on the local)
+ DIFF_ADV_ON_REPO2 1ea73414a91b (different from the remote)
+ DIFF_DIVERGED 6100d3090acf (different from the remote)
+ DIVERGED 66f7d451a68b (diverged)
+
+ $ hg -R repo2 incoming -B repo1
+ comparing with repo1
+ searching for changed bookmarks
+ ADD_ON_REPO1 66f7d451a68b (added on the remote)
+ ADV_ON_REPO2 1ea73414a91b (advanced on the local)
+ DIFF_ADV_ON_REPO1 6100d3090acf (different from the remote)
+ DIFF_ADV_ON_REPO2 1ea73414a91b (advanced on the local)
+ DIFF_DIVERGED 6100d3090acf (different from the remote)
+ DIVERGED 66f7d451a68b (diverged)
+ $ hg -R repo2 outgoing -B repo1
+ comparing with repo1
+ searching for changed bookmarks
+ ADD_ON_REPO2 66f7d451a68b (added on the local)
+ ADV_ON_REPO2 66f7d451a68b (advanced on the local)
+ DIFF_ADV_ON_REPO1 1ea73414a91b (different from the remote)
+ DIFF_ADV_ON_REPO2 e7bd5218ca15 (advanced on the local)
+ DIFF_DIVERGED e7bd5218ca15 (different from the remote)
+ DIVERGED fa942426a6fd (diverged)
+
+ $ cd ..
diff -r 750be2c38db4 -r fb900c89f96b tests/test-ssh.t
--- a/tests/test-ssh.t Sat Sep 22 14:53:50 2012 +0900
+++ b/tests/test-ssh.t Sat Sep 22 14:53:50 2012 +0900
@@ -171,7 +171,7 @@
$ hg out -B
comparing with ssh://user@dummy/remote
searching for changed bookmarks
- foo 1160648e36ce
+ foo 1160648e36ce (added on the local)
$ hg push -B foo
pushing to ssh://user@dummy/remote
searching for changes
@@ -191,7 +191,7 @@
$ hg in -B
comparing with ssh://user@dummy/remote
searching for changed bookmarks
- foo a28a9d1a809c
+ foo a28a9d1a809c (added on the remote)
$ hg book -f -r 0 foo
$ hg pull -B foo
pulling from ssh://user@dummy/remote
More information about the Mercurial-devel
mailing list