[PATCH 4 of 8] graphlog: fix --follow --rev combinations

Patrick Mezard patrick at mezard.eu
Wed Apr 11 05:08:41 CDT 2012


# HG changeset patch
# User Patrick Mezard <patrick at mezard.eu>
# Date 1334136160 -7200
# Node ID ad9d7e769dedbfce2b48ae19d26ecf2009bca7a1
# Parent  82b1bd4e27864470a1bfef3a2736367091266465
graphlog: fix --follow --rev combinations

The previous behaviour of --follow was really a subset of what is really
happening in log command:
- If --rev is not passed, default to '.:0'
- Resolve --rev into a revision list "revs"
- Set the starting revision to revs[0]
- If revs[1] > revs[0] keep descendants(revs[0]) in revs, otherwise keep
  ancestors.

diff --git a/hgext/graphlog.py b/hgext/graphlog.py
--- a/hgext/graphlog.py
+++ b/hgext/graphlog.py
@@ -279,10 +279,11 @@
     the files to be detailed when displaying the revision.
     """
     opt2revset = {
-        'follow':           ('follow()', None),
         'follow_first':     ('_followfirst()', None),
         'no_merges':        ('not merge()', None),
         'only_merges':      ('merge()', None),
+        '_ancestors':       ('ancestors(%(val)s)', None),
+        '_descendants':     ('descendants(%(val)s)', None),
         '_matchfiles':      ('_matchfiles(%(val)s)', None),
         'date':             ('date(%(val)r)', None),
         'branch':           ('branch(%(val)r)', ' or '),
@@ -298,10 +299,11 @@
     # follow or not follow?
     follow = opts.get('follow') or opts.get('follow_first')
     followfirst = opts.get('follow_first')
-    if 'follow' in opts:
-        del opts['follow']
     if 'follow_first' in opts:
         del opts['follow_first']
+    # --follow with FILE behaviour depends on revs...
+    startrev = revs[0]
+    followdescendants = len(revs) > 1 and revs[0] < revs[1]
 
     # branch and only_branch are really aliases and must be handled at
     # the same time
@@ -359,7 +361,10 @@
                 if pats:
                     opts['_patsfollow'] = list(pats)
                 else:
-                    opts['follow'] = True
+                    if followdescendants:
+                        opts['_descendants'] = str(startrev)
+                    else:
+                        opts['_ancestors'] = str(startrev)
         else:
             opts['_patslog'] = list(pats)
 
@@ -402,10 +407,16 @@
     """
     if not len(repo):
         return [], None, None
+    # Default --rev value depends on --follow but --follow behaviour
+    # depends on revisions resolved from --rev...
+    follow = opts.get('follow') or opts.get('follow_first')
     if opts.get('rev'):
         revs = scmutil.revrange(repo, opts['rev'])
     else:
-        revs = range(len(repo))
+        if follow and len(repo) > 0:
+            revs = scmutil.revrange(repo, ['.:0'])
+        else:
+            revs = range(len(repo) - 1, -1, -1)
     if not revs:
         return [], None, None
     expr, filematcher = _makelogrevset(repo, pats, opts, revs)
diff --git a/tests/test-glog.t b/tests/test-glog.t
--- a/tests/test-glog.t
+++ b/tests/test-glog.t
@@ -1538,13 +1538,13 @@
   $ cd ..
   $ hg init follow
   $ cd follow
+  $ testlog --follow
+  []
+  []
   $ echo a > a
   $ echo aa > aa
   $ echo f > f
-  $ hg ci -Am "add a"
-  adding a
-  adding aa
-  adding f
+  $ hg ci -Am "add a" a aa f
   $ hg cp a b
   $ hg cp f g
   $ hg ci -m "copy a b"
@@ -1925,3 +1925,54 @@
   $ testlog -r 'foo-bar'
   ['foo-bar']
   []
+
+Test --follow and forward --rev
+
+  $ hg up -q 6
+  $ echo g > g
+  $ hg ci -Am 'add g' g
+  created new head
+  $ hg up -q 2
+  $ hg log -G --template "{rev} {desc|firstline}\n"
+  o  8 add g
+  |
+  | o  7 Added tag foo-bar for changeset fc281d8ff18d
+  |/
+  o    6 merge 5 and 4
+  |\
+  | o  5 add another e
+  | |
+  o |  4 mv dir/b e
+  |/
+  o  3 mv a b; add d
+  |
+  @  2 mv b dir/b
+  |
+  o  1 copy a b
+  |
+  o  0 add a
+  
+  $ testlog --follow -r6 -r8 -r5 -r7 -r4
+  ['6', '8', '5', '7', '4']
+  (group
+    (func
+      ('symbol', 'descendants')
+      ('symbol', '6')))
+  --- log.nodes	* (glob)
+  +++ glog.nodes	* (glob)
+  @@ -1,3 +1,3 @@
+  -nodetag 6
+   nodetag 8
+   nodetag 7
+  +nodetag 6
+  [1]
+
+Test --follow and backward --rev
+
+  $ testlog --follow -r6 -r5 -r7 -r8 -r4
+  ['6', '5', '7', '8', '4']
+  (group
+    (func
+      ('symbol', 'ancestors')
+      ('symbol', '6')))
+


More information about the Mercurial-devel mailing list