[PATCH 06 of 10] repair: print what upgrade will do

Gregory Szorc gregory.szorc at gmail.com
Sun Nov 6 00:40:22 EDT 2016


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1478393040 25200
#      Sat Nov 05 17:44:00 2016 -0700
# Node ID 82799afa72be5bb540b2b07cd878f307622c4354
# Parent  b768004ef2db9c2e6dd267997e9e0c011f1b732a
repair: print what upgrade will do

The final part of pre-upgrade checks is validating what the upgrade
will do and printing a summary of this to the user. This patch
implements that.

Again, multiple functions are used to facilitate monkeypatching by
extensions.

diff --git a/mercurial/repair.py b/mercurial/repair.py
--- a/mercurial/repair.py
+++ b/mercurial/repair.py
@@ -480,6 +480,61 @@ def upgradereporequirements(repo):
 
     return createreqs
 
+def upgradevalidateactions(repo, sourcereqs, destreqs, actions):
+    """Validate (and modify accordingly) the list of actions to perform.
+
+    Returns a set of actions that will be performed. The set is advisory
+    only and is intended to drive presentation of what actions will be
+    taken.
+
+    Extensions can monkeypatch this to mutate the set of actions that
+    will be performed.
+    """
+    newactions = set(actions)
+
+    for req in ('dotencode', 'fncache', 'generaldelta'):
+        if req in actions and req not in destreqs:
+            newactions.remove(req)
+
+    return newactions
+
+def upgradesummarizeactions(repo, actions):
+    """Summarize actions that will be taken as part of upgrade.
+
+    Receives a set of action names. Returns a list of strings that will be
+    presented to user describing these actions and a set of actions processed
+    by this function.
+    """
+    l = []
+    handled = set()
+
+    if 'dotencode' in actions:
+        l.append(_('dotencode repository layout will be used; the repository '
+                   'will be able be more resilient to storing paths beginning '
+                   'with periods or spaces'))
+        handled.add('dotencode')
+
+    if 'fncache' in actions:
+        l.append(_('fncache repository layout will be used; the repository '
+                   'will be more resilient storing long paths and special '
+                   'filenames'))
+        handled.add('fncache')
+
+    if 'generaldelta' in actions:
+        l.append(_('repository data will be re-encoded as "generaldelta"; '
+                   'files inside the repository should be smaller, read times '
+                   'should decrease, and interacting with other generaldelta '
+                   'repositories should be faster'))
+        handled.add('generaldelta')
+
+    if 'removecldeltachain' in actions:
+        l.append(_('delta chains will be removed from the changelog; reading '
+                   'changelogs should be faster, changelogs may decrease '
+                   'in size\n'))
+        handled.add('removecldeltachain')
+
+    return l, handled
+
 def upgraderepo(ui, repo, dryrun=False):
     """Upgrade a repository in place."""
     repo = repo.unfiltered()
@@ -507,3 +562,24 @@ def upgraderepo(ui, repo, dryrun=False):
         ui.write(_('adding repository requirements: %s\n') %
                  ', '.join(sorted(newreqs - repo.requirements)))
 
+    actions = upgradevalidateactions(repo, repo.requirements, newreqs, actions)
+
+    changes, handledactions = upgradesummarizeactions(repo, actions)
+
+    unhandled = actions - handledactions
+    if unhandled:
+        raise error.Abort(_('unable to upgrade repository; proposed upgrade '
+                            'action not handled: %s') %
+                          ', '.join(sorted(unhandled)))
+
+    if actions:
+        ui.write(_('upgrading the repository will make the following '
+                   'significant changes:\n\n'))
+        for change in changes:
+            ui.write('* %s\n' % change)
+    else:
+        ui.write(_('no notable upgrade changes identified\n'))
+
+    if dryrun:
+        ui.warn(_('dry run requested; not continuing with upgrade\n'))
+        return 1
diff --git a/tests/test-upgrade-repo.t b/tests/test-upgrade-repo.t
--- a/tests/test-upgrade-repo.t
+++ b/tests/test-upgrade-repo.t
@@ -5,6 +5,18 @@
   
   checking repository requirements...
   preserving repository requirements: dotencode, fncache, generaldelta, revlogv1, store
+  no notable upgrade changes identified
+
+dry run works
+
+  $ hg debugupgraderepo --dry-run
+  no obvious deficiencies found in existing repository
+  
+  checking repository requirements...
+  preserving repository requirements: dotencode, fncache, generaldelta, revlogv1, store
+  no notable upgrade changes identified
+  dry run requested; not continuing with upgrade
+  [1]
 
 Various sub-optimal detections work
 
@@ -23,6 +35,11 @@ Various sub-optimal detections work
   checking repository requirements...
   preserving repository requirements: revlogv1, store
   adding repository requirements: dotencode, fncache, generaldelta
+  upgrading the repository will make the following significant changes:
+  
+  * dotencode repository layout will be used; the repository will be able be more resilient to storing paths beginning with periods or spaces
+  * fncache repository layout will be used; the repository will be more resilient storing long paths and special filenames
+  * repository data will be re-encoded as "generaldelta"; files inside the repository should be smaller, read times should decrease, and interacting with other generaldelta repositories should be faster
 
   $ cd ..
 


More information about the Mercurial-devel mailing list