##// END OF EJS Templates
strip: remove usage of extranodes...
Benoit Boissinot -
r13702:ffd370aa default
parent child Browse files
Show More
@@ -11,9 +11,9 b' from node import nullrev, short'
11 11 from i18n import _
12 12 import os
13 13
14 def _bundle(repo, bases, heads, node, suffix, extranodes=None, compress=True):
14 def _bundle(repo, bases, heads, node, suffix, compress=True):
15 15 """create a bundle with the specified revisions as a backup"""
16 cg = repo.changegroupsubset(bases, heads, 'strip', extranodes)
16 cg = repo.changegroupsubset(bases, heads, 'strip')
17 17 backupdir = repo.join("strip-backup")
18 18 if not os.path.isdir(backupdir):
19 19 os.mkdir(backupdir)
@@ -33,40 +33,30 b' def _collectfiles(repo, striprev):'
33 33
34 34 return sorted(files)
35 35
36 def _collectextranodes(repo, files, link):
37 """return the nodes that have to be saved before the strip"""
38 def collectone(cl, revlog):
39 extra = []
36 def _collectbrokencsets(repo, files, striprev):
37 """return the changesets which will be broken by the truncation"""
38 def collectone(revlog):
40 39 startrev = count = len(revlog)
41 40 # find the truncation point of the revlog
42 41 for i in xrange(count):
43 42 lrev = revlog.linkrev(i)
44 if lrev >= link:
43 if lrev >= striprev:
45 44 startrev = i + 1
46 45 break
47 46
48 # see if any revision after that point has a linkrev less than link
49 # (we have to manually save these guys)
47 # see if any revision after that point has a linkrev less than striprev
48 # (those will be broken by strip)
50 49 for i in xrange(startrev, count):
51 node = revlog.node(i)
52 50 lrev = revlog.linkrev(i)
53 if lrev < link:
54 extra.append((node, cl.node(lrev)))
51 if lrev < striprev:
52 yield lrev
55 53
56 return extra
57
58 extranodes = {}
59 cl = repo.changelog
60 extra = collectone(cl, repo.manifest)
61 if extra:
62 extranodes[1] = extra
54 for rev in collectone(repo.manifest):
55 yield rev
63 56 for fname in files:
64 57 f = repo.file(fname)
65 extra = collectone(cl, f)
66 if extra:
67 extranodes[fname] = extra
68
69 return extranodes
58 for rev in collectone(f):
59 yield rev
70 60
71 61 def strip(ui, repo, node, backup="all"):
72 62 cl = repo.changelog
@@ -82,28 +72,26 b' def strip(ui, repo, node, backup="all"):'
82 72 # the list of heads and bases of the set of interesting revisions.
83 73 # (head = revision in the set that has no descendant in the set;
84 74 # base = revision in the set that has no ancestor in the set)
85 tostrip = set((striprev,))
86 saveheads = set()
87 savebases = []
75 tostrip = set(cl.descendants(striprev))
76 tostrip.add(striprev)
77
78 files = _collectfiles(repo, striprev)
79 saverevs = set(_collectbrokencsets(repo, files, striprev))
80
81 # compute heads
82 saveheads = set(saverevs)
88 83 for r in xrange(striprev + 1, len(cl)):
89 parents = cl.parentrevs(r)
90 if parents[0] in tostrip or parents[1] in tostrip:
91 # r is a descendant of striprev
92 tostrip.add(r)
93 # if this is a merge and one of the parents does not descend
94 # from striprev, mark that parent as a savehead.
95 if parents[1] != nullrev:
96 for p in parents:
97 if p not in tostrip and p > striprev:
98 saveheads.add(p)
99 else:
100 # if no parents of this revision will be stripped, mark it as
101 # a savebase
102 if parents[0] < striprev and parents[1] < striprev:
103 savebases.append(cl.node(r))
84 if r not in tostrip:
85 saverevs.add(r)
86 saveheads.difference_update(cl.parentrevs(r))
87 saveheads.add(r)
88 saveheads = [cl.node(r) for r in saveheads]
104 89
105 saveheads.difference_update(parents)
106 saveheads.add(r)
90 # compute base nodes
91 if saverevs:
92 descendants = set(cl.descendants(*saverevs))
93 saverevs.difference_update(descendants)
94 savebases = [cl.node(r) for r in saverevs]
107 95
108 96 bm = repo._bookmarks
109 97 updatebm = []
@@ -112,20 +100,15 b' def strip(ui, repo, node, backup="all"):'
112 100 if rev in tostrip:
113 101 updatebm.append(m)
114 102
115 saveheads = [cl.node(r) for r in saveheads]
116 files = _collectfiles(repo, striprev)
117
118 extranodes = _collectextranodes(repo, files, striprev)
119
120 103 # create a changegroup for all the branches we need to keep
121 104 backupfile = None
122 105 if backup == "all":
123 106 backupfile = _bundle(repo, [node], cl.heads(), node, 'backup')
124 107 repo.ui.status(_("saved backup bundle to %s\n") % backupfile)
125 if saveheads or extranodes:
108 if saveheads or savebases:
126 109 # do not compress partial bundle if we remove it from disk later
127 110 chgrpfile = _bundle(repo, savebases, saveheads, node, 'temp',
128 extranodes=extranodes, compress=keeppartialbundle)
111 compress=keeppartialbundle)
129 112
130 113 mfst = repo.manifest
131 114
@@ -149,7 +132,7 b' def strip(ui, repo, node, backup="all"):'
149 132 tr.abort()
150 133 raise
151 134
152 if saveheads or extranodes:
135 if saveheads or savebases:
153 136 ui.note(_("adding branch\n"))
154 137 f = open(chgrpfile, "rb")
155 138 gen = changegroup.readbundle(f, chgrpfile)
General Comments 0
You need to be logged in to leave comments. Login now