evolve: Fix crash when reading docstring stable
authorJuntao Li <juntaoli@fb.com>
Thu, 17 Mar 2016 17:03:51 -0700
branchstable
changeset 1632 498329a3c900
parent 1622 d49f4ad04fbd
child 1633 9bcb24c3ba8d
child 1674 854421a48e0c
evolve: Fix crash when reading docstring Before this patch, hg evolve --divergent could crash when looking for docstring of function of merge.update. We were checking the docstring to work properly with older version of Mercurial. It could crash if an extension would wrap merge.update without keeping the docstring. This patch fixes the crash.
hgext/evolve.py
tests/test-divergent.t
--- a/hgext/evolve.py	Sat Mar 12 13:15:28 2016 +0800
+++ b/hgext/evolve.py	Thu Mar 17 17:03:51 2016 -0700
@@ -1998,7 +1998,14 @@
         hg.update(repo, divergent.rev())
     repo.ui.note(_('merging divergent changeset\n'))
     if progresscb: progresscb()
-    if 'partial' in merge.update.__doc__:
+    try:
+        stats = merge.update(repo,
+                             other.node(),
+                             branchmerge=True,
+                             force=False,
+                             ancestor=base.node(),
+                             mergeancestor=True)
+    except TypeError:
         # Mercurial  < 43c00ca887d1 (3.7)
         stats = merge.update(repo,
                              other.node(),
@@ -2007,13 +2014,6 @@
                              partial=None,
                              ancestor=base.node(),
                              mergeancestor=True)
-    else:
-        stats = merge.update(repo,
-                             other.node(),
-                             branchmerge=True,
-                             force=False,
-                             ancestor=base.node(),
-                             mergeancestor=True)
 
     hg._showstats(repo, stats)
     if stats[3]:
--- a/tests/test-divergent.t	Sat Mar 12 13:15:28 2016 +0800
+++ b/tests/test-divergent.t	Thu Mar 17 17:03:51 2016 -0700
@@ -107,5 +107,53 @@
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 6602ff5a79dc
- 
-  $ cd ..  
+
+Test None docstring issue of evolve divergent, which caused hg crush
+
+  $ hg init test2
+  $ cd test2
+  $ mkcommits _a _b
+  $ hg up "desc(_a)"
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit bdivergent1
+  created new head
+  $ hg up "desc(_a)"
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit bdivergent2
+  created new head
+  $ hg prune -s "desc(bdivergent1)" "desc(_b)"
+  1 changesets pruned
+  $ hg prune -s "desc(bdivergent2)" "desc(_b)" --hidden
+  1 changesets pruned
+  2 new divergent changesets
+  $ hg log -G
+  @  3:e708fd28d5cf@default(draft) add bdivergent2 [divergent]
+  |
+  | o  2:c2f698071cba@default(draft) add bdivergent1 [divergent]
+  |/
+  o  0:135f39f4bd78@default(draft) add _a []
+  
+  $ cat >$TESTTMP/test_extension.py  << EOF
+  > from mercurial import merge
+  > origupdate = merge.update
+  > def newupdate(*args, **kwargs):
+  >   return origupdate(*args, **kwargs)
+  > merge.update = newupdate
+  > EOF
+  $ cat >> $HGRCPATH << EOF
+  > [extensions]
+  > testextension=$TESTTMP/test_extension.py
+  > EOF
+  $ hg evolve --all
+  nothing to evolve on current working copy parent
+  (do you want to use --divergent)
+  [2]
+  $ hg evolve --divergent
+  merge:[3] add bdivergent2
+  with: [2] add bdivergent1
+  base: [1] add _b
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at aa26817f6fbe
+
+
+  $ cd ..