[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