Mercurial > hg
annotate contrib/shrink-revlog.py @ 13955:86b5cc1e8be8 stable
help config: explain that config files do not exist by default
Inspired by critique given on StackOverflow where a user writes:
I can have a good guess at what "%USERPROFILE%" might signify but
none of the files listed in the "hg help config" output exist after
running the installer. Previous experience would suggest that
missing files mean something somewhere has gone seriously wrong.
http://stackoverflow.com/questions/2329023/2351139#2351139
author | Martin Geisler <mg@lazybytes.net> |
---|---|
date | Mon, 18 Apr 2011 13:57:22 +0200 |
parents | 4c50552fc9bc |
children | 9131724c3f4b |
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)" |