changeset 37125:6f570c501e3e

merge: deprecate accessing update results by index Now that we have named attributes, let's convert the code base to use them. We also add deprecation warnings so legacy consumers are aware of their transgressions. ``stats.unresolvedcount`` is much easier to read than ``stats[3]``, don't you think? Differential Revision: https://phab.mercurial-scm.org/D2694
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 05 Mar 2018 00:30:00 -0500
parents 6715e8035b4f
children 4bd73a955ab0
files hgext/histedit.py hgext/rebase.py mercurial/commands.py mercurial/hg.py mercurial/merge.py
diffstat 5 files changed, 20 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/histedit.py	Sun Mar 25 11:58:05 2018 +0900
+++ b/hgext/histedit.py	Mon Mar 05 00:30:00 2018 -0500
@@ -499,7 +499,7 @@
         hg.update(repo, self.state.parentctxnode, quietempty=True)
         stats = applychanges(repo.ui, repo, rulectx, {})
         repo.dirstate.setbranch(rulectx.branch())
-        if stats and stats[3] > 0:
+        if stats.unresolvedcount:
             buf = repo.ui.popbuffer()
             repo.ui.write(buf)
             raise error.InterventionRequired(
--- a/hgext/rebase.py	Sun Mar 25 11:58:05 2018 +0900
+++ b/hgext/rebase.py	Mon Mar 05 00:30:00 2018 -0500
@@ -525,7 +525,7 @@
                 with ui.configoverride(overrides, 'rebase'):
                     stats = rebasenode(repo, rev, p1, base, self.collapsef,
                                        dest, wctx=self.wctx)
-                    if stats[3] > 0:
+                    if stats.unresolvedcount > 0:
                         if self.inmemory:
                             raise error.InMemoryMergeConflictsError()
                         else:
--- a/mercurial/commands.py	Sun Mar 25 11:58:05 2018 +0900
+++ b/mercurial/commands.py	Mon Mar 05 00:30:00 2018 -0500
@@ -629,7 +629,7 @@
             repo.setparents(op1, op2)
             dsguard.close()
             hg._showstats(repo, stats)
-            if stats[3]:
+            if stats.unresolvedcount:
                 repo.ui.status(_("use 'hg resolve' to retry unresolved "
                                  "file merges\n"))
                 return 1
@@ -2311,7 +2311,7 @@
             finally:
                 repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
             # report any conflicts
-            if stats[3] > 0:
+            if stats.unresolvedcount > 0:
                 # write out state for --continue
                 nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
                 repo.vfs.write('graftstate', ''.join(nodelines))
--- a/mercurial/hg.py	Sun Mar 25 11:58:05 2018 +0900
+++ b/mercurial/hg.py	Mon Mar 05 00:30:00 2018 -0500
@@ -749,7 +749,7 @@
     return srcpeer, destpeer
 
 def _showstats(repo, stats, quietempty=False):
-    if quietempty and not any(stats):
+    if quietempty and stats.isempty():
         return
     repo.ui.status(_("%d files updated, %d files merged, "
                      "%d files removed, %d files unresolved\n") % (
@@ -770,9 +770,9 @@
     """update the working directory to node"""
     stats = updaterepo(repo, node, False, updatecheck=updatecheck)
     _showstats(repo, stats, quietempty)
-    if stats[3]:
+    if stats.unresolvedcount:
         repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
-    return stats[3] > 0
+    return stats.unresolvedcount > 0
 
 # naming conflict in clone()
 _update = update
@@ -783,7 +783,7 @@
     repo.vfs.unlinkpath('graftstate', ignoremissing=True)
     if show_stats:
         _showstats(repo, stats, quietempty)
-    return stats[3] > 0
+    return stats.unresolvedcount > 0
 
 # naming conflict in updatetotally()
 _clean = clean
@@ -882,12 +882,12 @@
                                 labels=labels)
 
     _showstats(repo, stats)
-    if stats[3]:
+    if stats.unresolvedcount:
         repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
                          "or 'hg merge --abort' to abandon\n"))
     elif remind and not abort:
         repo.ui.status(_("(branch merge, don't forget to commit)\n"))
-    return stats[3] > 0
+    return stats.unresolvedcount > 0
 
 def _incoming(displaychlist, subreporecurse, ui, repo, source,
         opts, buffered=False):
--- a/mercurial/merge.py	Sun Mar 25 11:58:05 2018 +0900
+++ b/mercurial/merge.py	Mon Mar 05 00:30:00 2018 -0500
@@ -1483,9 +1483,15 @@
     removedcount = attr.ib()
     unresolvedcount = attr.ib()
 
+    def isempty(self):
+        return (not self.updatedcount and not self.mergedcount
+                and not self.removedcount and not self.unresolvedcount)
+
     # TODO remove container emulation once consumers switch to new API.
 
     def __getitem__(self, x):
+        util.nouideprecwarn('access merge.update() results by name instead of '
+                            'index', '4.6', 2)
         if x == 0:
             return self.updatedcount
         elif x == 1:
@@ -1498,6 +1504,8 @@
             raise IndexError('can only access items 0-3')
 
     def __len__(self):
+        util.nouideprecwarn('access merge.update() results by name instead of '
+                            'index', '4.6', 2)
         return 4
 
 def applyupdates(repo, actions, wctx, mctx, overwrite, labels=None):
@@ -2164,7 +2172,8 @@
         sparse.prunetemporaryincludes(repo)
 
     if not partial:
-        repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
+        repo.hook('update', parent1=xp1, parent2=xp2,
+                  error=stats.unresolvedcount)
     return stats
 
 def graft(repo, ctx, pctx, labels, keepparent=False):