[Python-checkins] pymigr: Fix findlarge.py, suggest patch and more actions

antoine.pitrou python-checkins at python.org
Thu Feb 24 04:34:26 CET 2011


antoine.pitrou pushed 54a76c200148 to pymigr:

http://hg.python.org/pymigr/rev/54a76c200148
changeset:   95:54a76c200148
tag:         tip
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Thu Feb 24 04:34:20 2011 +0100
summary:
  Fix findlarge.py, suggest patch and more actions

files:
  findlarge.py

diff --git a/findlarge.py b/findlarge.py
--- a/findlarge.py
+++ b/findlarge.py
@@ -9,11 +9,78 @@
 Full recipe for shrinking a repo:
     $ hg shrink
     $ ../findlarge.py | xargs -0 -n 1 hg shrink --revlog
+      # the following optional
     $ hg verify
     $ find .hg -name "*.old" -print0 | xargs -0 rm
 
+You can also try an other reordering algorithm:
+    $ ../findlarge.py | xargs -0 -n 1 hg shrink --sort postorderreverse --revlog
+
+
+NOTE: Many operations become *much* slower after the shrink of a full converted
+repo (probably because of the large number of heads - more than 400 - combined
+with the new non-natural revlog order).
+So it's better to first build a bundle of py3k before shrinking:
+
+    $ hg bundle --base null -r 3.x -r 3.2.x -r 3.1.x -r 3.0.x py3k.bundle
+
+(replace "3.x" with "default" if the newer branchmap is used)
+
 """
 
+# !--- It is advised to apply the following patch to your hg tree ---!
+
+'''
+diff -r 5fc7c84ed9b0 contrib/shrink-revlog.py
+--- a/contrib/shrink-revlog.py  Tue Feb 01 17:30:13 2011 -0600
++++ b/contrib/shrink-revlog.py  Thu Feb 24 04:11:42 2011 +0100
+@@ -145,6 +145,7 @@ def report(ui, r1, r2):
+     shrink_factor = oldsize / newsize
+     ui.write(_('shrinkage: %.1f%% (%.1fx)\n')
+              % (shrink_percent, shrink_factor))
++    return shrink_factor
+
+ def shrink(ui, repo, **opts):
+     """shrink a revlog by reordering revisions
+@@ -235,7 +236,7 @@ def shrink(ui, repo, **opts):
+             ui.note(_('%d suboptimal nodes\n') % suboptimal)
+
+             writerevs(ui, r1, r2, order, tr)
+-            report(ui, r1, r2)
++            shrink_factor = report(ui, r1, r2)
+             tr.close()
+         except:
+             # Abort transaction first, so we truncate the files before
+@@ -244,7 +245,7 @@ def shrink(ui, repo, **opts):
+             for fn in (tmpindexfn, tmpdatafn):
+                 ignoremissing(os.unlink)(fn)
+             raise
+-        if not opts.get('dry_run'):
++        if not opts.get('dry_run') and shrink_factor > 1.0:
+             # racy, both files cannot be renamed atomically
+             # copy files
+             util.os_link(indexfn, oldindexfn)
+@@ -253,7 +254,7 @@ def shrink(ui, repo, **opts):
+             # rename
+             util.rename(tmpindexfn, indexfn)
+             try:
+-                os.chmod(tmpdatafn, os.stat(datafn).st_mode)
++                os.chmod(tmpdatafn, os.stat(indexfn).st_mode)
+                 util.rename(tmpdatafn, datafn)
+             except OSError, inst:
+                 if inst.errno != errno.ENOENT:
+@@ -265,7 +266,7 @@ def shrink(ui, repo, **opts):
+     finally:
+         lock.release()
+
+-    if not opts.get('dry_run'):
++    if not opts.get('dry_run') and shrink_factor > 1.0:
+         ui.write(_('note: old revlog saved in:\n'
+                    '  %s\n'
+                    '  %s\n'
+'''
+
+
 import os
 import sys
 import collections
@@ -32,9 +99,11 @@
                 continue
             fn = os.path.join(dir, fn)
             fni = os.path.join(dir, fni)
-            # Strange issue with this file, skip it
-            if fni.endswith('_misc/python-mode.el.i'):
-                continue
+            # Strange issues with these files, skip
+            #if (fni.endswith('_misc/python-mode.el.i') or
+                #'objects/listobject.c' in fni or
+                #'objects/dictobject.c' in fni):
+                #continue
             files[fni] += os.path.getsize(fn)
     return files
 
@@ -43,11 +112,12 @@
     [(v, k) for (k, v) in file_sizes('.hg/store/dh').items()]
     )
 
-nlargest = sorted(files, reverse=True)[0:1000]
+nlargest = sorted(files, reverse=True)[0:2000]
 if '-v' in sys.argv:
     for s, fn in nlargest:
         print s, fn
     print "(total %d)" % sum(s for s, fn in nlargest)
 else:
-    print '\0'.join(fn for s, fn in nlargest)
+    # no final \n
+    sys.stdout.write('\0'.join(fn for s, fn in nlargest))
 

--
Repository URL: http://hg.python.org/pymigr


More information about the Python-checkins mailing list