annotate contrib/shrink-revlog.py @ 12975:278e3c9b939e

eol: added filter aliases for backwards compatibility with win32text This makes it possible to switch most win32text configurations (i.e. those that use cleverencode and cleverdecode) to hgeol simply by disabling one and enabling the other. Any rules found in repo-specific .hgeol files will be appended to the configuration in .hgrc.
author Colin Caughie <c.caughie@indigovision.com>
date Wed, 10 Nov 2010 20:26:56 +0000
parents 4c50552fc9bc
children 9131724c3f4b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
1 """\
10236
49a8625b8cac shrink-revlog: help/doc tweaks
Greg Ward <greg-hg@gerg.ca>
parents: 10234
diff changeset
2 reorder a revlog (the manifest by default) to save space
49a8625b8cac shrink-revlog: help/doc tweaks
Greg Ward <greg-hg@gerg.ca>
parents: 10234
diff changeset
3
49a8625b8cac shrink-revlog: help/doc tweaks
Greg Ward <greg-hg@gerg.ca>
parents: 10234
diff changeset
4 Specifically, this topologically sorts the revisions in the revlog so that
49a8625b8cac shrink-revlog: help/doc tweaks
Greg Ward <greg-hg@gerg.ca>
parents: 10234
diff changeset
5 revisions on the same branch are adjacent as much as possible. This is a
49a8625b8cac shrink-revlog: help/doc tweaks
Greg Ward <greg-hg@gerg.ca>
parents: 10234
diff changeset
6 workaround for the fact that Mercurial computes deltas relative to the
10216
843f6ee6d14b contrib: small documentation fixes in shrink-revlog.py
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10215
diff changeset
7 previous revision rather than relative to a parent revision.
843f6ee6d14b contrib: small documentation fixes in shrink-revlog.py
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10215
diff changeset
8
843f6ee6d14b contrib: small documentation fixes in shrink-revlog.py
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10215
diff changeset
9 This is *not* safe to run on a changelog.
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
10 """
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
11
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
12 # Originally written by Benoit Boissinot <benoit.boissinot at ens-lyon.org>
10216
843f6ee6d14b contrib: small documentation fixes in shrink-revlog.py
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10215
diff changeset
13 # as a patch to rewrite-log. Cleaned up, refactored, documented, and
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
14 # renamed by Greg Ward <greg at gerg.ca>.
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
15
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
16 # XXX would be nice to have a way to verify the repository after shrinking,
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
17 # e.g. by comparing "before" and "after" states of random changesets
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
18 # (maybe: export before, shrink, export after, diff).
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
19
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
20 import os, tempfile, errno
10509
3e7e789d9494 shrink-revlog: remove unneeded imports and useless code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10508
diff changeset
21 from mercurial import revlog, transaction, node, util
10009
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
22 from mercurial import changegroup
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
23 from mercurial.i18n import _
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
24
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
25
10627
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
26 def postorder(start, edges):
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
27 result = []
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
28 visit = list(start)
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
29 finished = set()
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
30
10627
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
31 while visit:
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
32 cur = visit[-1]
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
33 for p in edges[cur]:
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
34 if p not in finished:
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
35 visit.append(p)
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
36 break
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
37 else:
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
38 result.append(cur)
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
39 finished.add(cur)
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
40 visit.pop()
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
41
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
42 return result
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
43
10623
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
44 def toposort_reversepostorder(ui, rl):
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
45 # postorder of the reverse directed graph
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
46
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
47 # map rev to list of parent revs (p2 first)
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
48 parents = {}
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
49 heads = set()
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
50 ui.status(_('reading revs\n'))
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
51 try:
10623
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
52 for rev in rl:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
53 ui.progress(_('reading'), rev, total=len(rl))
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
54 (p1, p2) = rl.parentrevs(rev)
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
55 if p1 == p2 == node.nullrev:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
56 parents[rev] = () # root node
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
57 elif p1 == p2 or p2 == node.nullrev:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
58 parents[rev] = (p1,) # normal node
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
59 else:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
60 parents[rev] = (p2, p1) # merge node
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
61 heads.add(rev)
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
62 for p in parents[rev]:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
63 heads.discard(p)
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
64 finally:
10724
cb0a7faa29ea progress: drop extra args for pos=None calls (issue2087)
Matt Mackall <mpm@selenic.com>
parents: 10655
diff changeset
65 ui.progress(_('reading'), None)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
66
10627
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
67 heads = list(heads)
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
68 heads.sort(reverse=True)
10623
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
69
10627
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
70 ui.status(_('sorting revs\n'))
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
71 return postorder(heads, parents)
10623
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
72
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
73 def toposort_postorderreverse(ui, rl):
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
74 # reverse-postorder of the reverse directed graph
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
75
10623
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
76 children = {}
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
77 roots = set()
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
78 ui.status(_('reading revs\n'))
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
79 try:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
80 for rev in rl:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
81 ui.progress(_('reading'), rev, total=len(rl))
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
82 (p1, p2) = rl.parentrevs(rev)
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
83 if p1 == p2 == node.nullrev:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
84 roots.add(rev)
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
85 children[rev] = []
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
86 if p1 != node.nullrev:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
87 children[p1].append(rev)
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
88 if p2 != node.nullrev:
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
89 children[p2].append(rev)
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
90 finally:
10724
cb0a7faa29ea progress: drop extra args for pos=None calls (issue2087)
Matt Mackall <mpm@selenic.com>
parents: 10655
diff changeset
91 ui.progress(_('reading'), None)
10623
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
92
11298
3e46d76eaabf shrink-repo: wrong variable name
Pradeepkumar Gayam <in3xes@gmail.com>
parents: 11294
diff changeset
93 roots = list(roots)
10627
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
94 roots.sort()
10624
432eb853a2c6 shrink-revlog: add accounting of suboptimal nodes to the new algorithms.
Greg Ward <greg-hg@gerg.ca>
parents: 10623
diff changeset
95
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
96 ui.status(_('sorting revs\n'))
10627
adcd5bcb37ab shrink-revlog: factor out postorder algorithm
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10626
diff changeset
97 result = postorder(roots, children)
10623
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
98 result.reverse()
64e286c22f29 shrink-revlog: add "reverse postorder" and "postorder reverse" toposorts.
Greg Ward <greg-hg@gerg.ca>
parents: 10622
diff changeset
99 return result
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
100
10213
9e6848f352b0 contrib: use ui to write in shrink-revlog.py
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10009
diff changeset
101 def writerevs(ui, r1, r2, order, tr):
10009
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
102
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
103 ui.status(_('writing revs\n'))
10440
b39b32c33269 shrink: use progress API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
104
10009
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
105 count = [0]
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
106 def progress(*args):
10496
45734b51c99b progress: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10440
diff changeset
107 ui.progress(_('writing'), count[0], total=len(order))
10009
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
108 count[0] += 1
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
109
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
110 order = [r1.node(r) for r in order]
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
111
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
112 # this is a bit ugly, but it works
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
113 lookup = lambda x: "%020d" % r1.linkrev(r1.rev(x))
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
114 unlookup = lambda x: int(x, 10)
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
115
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
116 try:
10009
69dca8574a6a shrink-revlog: improve performance: use changegroup instead of revisions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9712
diff changeset
117 group = util.chunkbuffer(r1.group(order, lookup, progress))
12348
7f97b4841ee7 bundle: fix shrink-revlog bundle usage
Matt Mackall <mpm@selenic.com>
parents: 12335
diff changeset
118 group = changegroup.unbundle10(group, "UN")
12335
e21fe9c5fb25 bundle: get rid of chunkiter
Matt Mackall <mpm@selenic.com>
parents: 12333
diff changeset
119 r2.addgroup(group, unlookup, tr)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
120 finally:
10724
cb0a7faa29ea progress: drop extra args for pos=None calls (issue2087)
Matt Mackall <mpm@selenic.com>
parents: 10655
diff changeset
121 ui.progress(_('writing'), None)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
122
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
123 def report(ui, r1, r2):
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
124 def getsize(r):
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
125 s = 0
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
126 for fn in (r.indexfile, r.datafile):
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
127 try:
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
128 s += os.stat(fn).st_size
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
129 except OSError, inst:
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
130 if inst.errno != errno.ENOENT:
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
131 raise
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
132 return s
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
133
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
134 oldsize = float(getsize(r1))
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
135 newsize = float(getsize(r2))
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
136
9712
18b134ef294c kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9515
diff changeset
137 # argh: have to pass an int to %d, because a float >= 2^32
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
138 # blows up under Python 2.5 or earlier
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
139 ui.write(_('old file size: %12d bytes (%6.1f MiB)\n')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10241
diff changeset
140 % (int(oldsize), oldsize / 1024 / 1024))
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
141 ui.write(_('new file size: %12d bytes (%6.1f MiB)\n')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10241
diff changeset
142 % (int(newsize), newsize / 1024 / 1024))
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
143
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
144 shrink_percent = (oldsize - newsize) / oldsize * 100
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
145 shrink_factor = oldsize / newsize
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
146 ui.write(_('shrinkage: %.1f%% (%.1fx)\n')
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
147 % (shrink_percent, shrink_factor))
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
148
10215
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
149 def shrink(ui, repo, **opts):
10622
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
150 """shrink a revlog by reordering revisions
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
151
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
152 Rewrites all the entries in some revlog of the current repository
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
153 (by default, the manifest log) to save space.
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
154
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
155 Different sort algorithms have different performance
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
156 characteristics. Use ``--sort`` to select a sort algorithm so you
10625
add562abc28a shrink-revlog: remove branchsort algorithm (it behaves poorly)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10624
diff changeset
157 can determine which works best for your data.
10215
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
158 """
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
159
10215
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
160 if not repo.local():
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
161 raise util.Abort(_('not a local repository: %s') % repo.root)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
162
10215
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
163 fn = opts.get('revlog')
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
164 if not fn:
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
165 indexfn = repo.sjoin('00manifest.i')
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
166 else:
10215
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
167 if not fn.endswith('.i'):
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
168 raise util.Abort(_('--revlog option must specify the revlog index '
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
169 'file (*.i), not %s') % opts.get('revlog'))
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
170
10215
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
171 indexfn = os.path.realpath(fn)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
172 store = repo.sjoin('')
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
173 if not indexfn.startswith(store):
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
174 raise util.Abort(_('--revlog option must specify a revlog in %s, '
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
175 'not %s') % (store, indexfn))
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
176
10622
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
177 sortname = opts['sort']
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
178 try:
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
179 toposort = globals()['toposort_' + sortname]
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
180 except KeyError:
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
181 raise util.Abort(_('no such toposort algorithm: %s') % sortname)
bc81f126139f shrink-revlog: add --sort option for user-selectable toposort algorithm.
Greg Ward <greg-hg@gerg.ca>
parents: 10621
diff changeset
182
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
183 if not os.path.exists(indexfn):
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
184 raise util.Abort(_('no such file: %s') % indexfn)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
185 if '00changelog' in indexfn:
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
186 raise util.Abort(_('shrinking the changelog '
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
187 'will corrupt your repository'))
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
188
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
189 ui.write(_('shrinking %s\n') % indexfn)
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
190 prefix = os.path.basename(indexfn)[:-1]
11294
7b5d05e0fb1e shrink-revlog: use util.mktempcopy() to preserve mode of index file.
Greg Ward <greg-hg@gerg.ca>
parents: 11268
diff changeset
191 tmpindexfn = util.mktempcopy(indexfn, emptyok=True)
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
192
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
193 r1 = revlog.revlog(util.opener(os.getcwd(), audit=False), indexfn)
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
194 r2 = revlog.revlog(util.opener(os.getcwd(), audit=False), tmpindexfn)
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
195
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
196 datafn, tmpdatafn = r1.datafile, r2.datafile
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
197
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
198 oldindexfn = indexfn + '.old'
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
199 olddatafn = datafn + '.old'
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
200 if os.path.exists(oldindexfn) or os.path.exists(olddatafn):
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
201 raise util.Abort(_('one or both of\n'
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
202 ' %s\n'
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
203 ' %s\n'
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
204 'exists from a previous run; please clean up '
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
205 'before running again') % (oldindexfn, olddatafn))
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
206
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
207 # Don't use repo.transaction(), because then things get hairy with
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
208 # paths: some need to be relative to .hg, and some need to be
10216
843f6ee6d14b contrib: small documentation fixes in shrink-revlog.py
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10215
diff changeset
209 # absolute. Doing it this way keeps things simple: everything is an
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
210 # absolute path.
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
211 lock = repo.lock(wait=False)
10234
c8d6f339bbd7 shrink-revlog: make it work on windows (issue1976)
Patrick Mezard <pmezard@gmail.com>
parents: 10230
diff changeset
212 tr = transaction.transaction(ui.warn,
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
213 open,
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
214 repo.sjoin('journal'))
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
215
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
216 def ignoremissing(func):
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
217 def f(*args, **kw):
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
218 try:
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
219 return func(*args, **kw)
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
220 except OSError, inst:
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
221 if inst.errno != errno.ENOENT:
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
222 raise
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
223 return f
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
224
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
225 try:
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
226 try:
10213
9e6848f352b0 contrib: use ui to write in shrink-revlog.py
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10009
diff changeset
227 order = toposort(ui, r1)
10626
3fc95c3bc3ba shrink-revlog: factor out suboptimal computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10625
diff changeset
228
3fc95c3bc3ba shrink-revlog: factor out suboptimal computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10625
diff changeset
229 suboptimal = 0
3fc95c3bc3ba shrink-revlog: factor out suboptimal computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10625
diff changeset
230 for i in xrange(1, len(order)):
3fc95c3bc3ba shrink-revlog: factor out suboptimal computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10625
diff changeset
231 parents = [p for p in r1.parentrevs(order[i])
3fc95c3bc3ba shrink-revlog: factor out suboptimal computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10625
diff changeset
232 if p != node.nullrev]
10655
f63fb5c0cf67 shrink-revlog: add missing whitespace in expression
Martin Geisler <mg@lazybytes.net>
parents: 10627
diff changeset
233 if parents and order[i - 1] not in parents:
10626
3fc95c3bc3ba shrink-revlog: factor out suboptimal computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10625
diff changeset
234 suboptimal += 1
3fc95c3bc3ba shrink-revlog: factor out suboptimal computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10625
diff changeset
235 ui.note(_('%d suboptimal nodes\n') % suboptimal)
3fc95c3bc3ba shrink-revlog: factor out suboptimal computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10625
diff changeset
236
10213
9e6848f352b0 contrib: use ui to write in shrink-revlog.py
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10009
diff changeset
237 writerevs(ui, r1, r2, order, tr)
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
238 report(ui, r1, r2)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
239 tr.close()
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
240 except:
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
241 # Abort transaction first, so we truncate the files before
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
242 # deleting them.
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
243 tr.abort()
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
244 for fn in (tmpindexfn, tmpdatafn):
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
245 ignoremissing(os.unlink)(fn)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
246 raise
10241
4b2a086bee31 shrink-revlog: add --dry-run option
Patrick Mezard <pmezard@gmail.com>
parents: 10236
diff changeset
247 if not opts.get('dry_run'):
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
248 # racy, both files cannot be renamed atomically
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
249 # copy files
10241
4b2a086bee31 shrink-revlog: add --dry-run option
Patrick Mezard <pmezard@gmail.com>
parents: 10236
diff changeset
250 util.os_link(indexfn, oldindexfn)
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
251 ignoremissing(util.os_link)(datafn, olddatafn)
11267
d3ebb1a0bc49 shrink-revlog: preserve mode of the shrunken index and data file.
Greg Ward <greg-hg@gerg.ca>
parents: 10542
diff changeset
252
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
253 # rename
10241
4b2a086bee31 shrink-revlog: add --dry-run option
Patrick Mezard <pmezard@gmail.com>
parents: 10236
diff changeset
254 util.rename(tmpindexfn, indexfn)
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
255 try:
11267
d3ebb1a0bc49 shrink-revlog: preserve mode of the shrunken index and data file.
Greg Ward <greg-hg@gerg.ca>
parents: 10542
diff changeset
256 os.chmod(tmpdatafn, os.stat(datafn).st_mode)
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
257 util.rename(tmpdatafn, datafn)
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
258 except OSError, inst:
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
259 if inst.errno != errno.ENOENT:
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
260 raise
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
261 ignoremissing(os.unlink)(datafn)
10241
4b2a086bee31 shrink-revlog: add --dry-run option
Patrick Mezard <pmezard@gmail.com>
parents: 10236
diff changeset
262 else:
10542
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
263 for fn in (tmpindexfn, tmpdatafn):
989b2a5eaaba shrink: handle all combinations of inline/non-inline revlogs
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10509
diff changeset
264 ignoremissing(os.unlink)(fn)
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
265 finally:
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
266 lock.release()
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
267
10241
4b2a086bee31 shrink-revlog: add --dry-run option
Patrick Mezard <pmezard@gmail.com>
parents: 10236
diff changeset
268 if not opts.get('dry_run'):
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
269 ui.write(_('note: old revlog saved in:\n'
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
270 ' %s\n'
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
271 ' %s\n'
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
272 '(You can delete those files when you are satisfied that your\n'
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
273 'repository is still sane. '
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
274 'Running \'hg verify\' is strongly recommended.)\n')
10241
4b2a086bee31 shrink-revlog: add --dry-run option
Patrick Mezard <pmezard@gmail.com>
parents: 10236
diff changeset
275 % (oldindexfn, olddatafn))
9515
f7d85980261c Add script to rewrite revlog to workaround lack of parent deltas.
Greg Ward <greg-hg@gerg.ca>
parents:
diff changeset
276
10215
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
277 cmdtable = {
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
278 'shrink': (shrink,
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
279 [('', 'revlog', '', _('index (.i) file of the revlog to shrink')),
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
280 ('n', 'dry-run', None, _('do not shrink, simulate only')),
10625
add562abc28a shrink-revlog: remove branchsort algorithm (it behaves poorly)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10624
diff changeset
281 ('', 'sort', 'reversepostorder', 'name of sort algorithm to use'),
10241
4b2a086bee31 shrink-revlog: add --dry-run option
Patrick Mezard <pmezard@gmail.com>
parents: 10236
diff changeset
282 ],
10508
cc35ad583e66 shrink-revlog: add strings for translation / import _ before using it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10496
diff changeset
283 _('hg shrink [--revlog PATH]'))
10215
9d79b8f58bea contrib: turn shrink-revlog.py into an extension
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10214
diff changeset
284 }
10236
49a8625b8cac shrink-revlog: help/doc tweaks
Greg Ward <greg-hg@gerg.ca>
parents: 10234
diff changeset
285
49a8625b8cac shrink-revlog: help/doc tweaks
Greg Ward <greg-hg@gerg.ca>
parents: 10234
diff changeset
286 if __name__ == "__main__":
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10241
diff changeset
287 print "shrink-revlog.py is now an extension (see hg help extensions)"