Show More
@@ -1,354 +1,363 b'' | |||||
1 | # drawdag.py - convert ASCII revision DAG to actual changesets |
|
1 | # drawdag.py - convert ASCII revision DAG to actual changesets | |
2 | # |
|
2 | # | |
3 | # Copyright 2016 Facebook, Inc. |
|
3 | # Copyright 2016 Facebook, Inc. | |
4 | # |
|
4 | # | |
5 | # This software may be used and distributed according to the terms of the |
|
5 | # This software may be used and distributed according to the terms of the | |
6 | # GNU General Public License version 2 or any later version. |
|
6 | # GNU General Public License version 2 or any later version. | |
7 | """ |
|
7 | """ | |
8 | create changesets from an ASCII graph for testing purpose. |
|
8 | create changesets from an ASCII graph for testing purpose. | |
9 |
|
9 | |||
10 | For example, given the following input:: |
|
10 | For example, given the following input:: | |
11 |
|
11 | |||
12 | c d |
|
12 | c d | |
13 | |/ |
|
13 | |/ | |
14 | b |
|
14 | b | |
15 | | |
|
15 | | | |
16 | a |
|
16 | a | |
17 |
|
17 | |||
18 | 4 changesets and 4 local tags will be created. |
|
18 | 4 changesets and 4 local tags will be created. | |
19 | `hg log -G -T "{rev} {desc} (tag: {tags})"` will output:: |
|
19 | `hg log -G -T "{rev} {desc} (tag: {tags})"` will output:: | |
20 |
|
20 | |||
21 | o 3 d (tag: d tip) |
|
21 | o 3 d (tag: d tip) | |
22 | | |
|
22 | | | |
23 | | o 2 c (tag: c) |
|
23 | | o 2 c (tag: c) | |
24 | |/ |
|
24 | |/ | |
25 | o 1 b (tag: b) |
|
25 | o 1 b (tag: b) | |
26 | | |
|
26 | | | |
27 | o 0 a (tag: a) |
|
27 | o 0 a (tag: a) | |
28 |
|
28 | |||
29 | For root nodes (nodes without parents) in the graph, they can be revsets |
|
29 | For root nodes (nodes without parents) in the graph, they can be revsets | |
30 | pointing to existing nodes. The ASCII graph could also have disconnected |
|
30 | pointing to existing nodes. The ASCII graph could also have disconnected | |
31 | components with same names referring to the same changeset. |
|
31 | components with same names referring to the same changeset. | |
32 |
|
32 | |||
33 | Therefore, given the repo having the 4 changesets (and tags) above, with the |
|
33 | Therefore, given the repo having the 4 changesets (and tags) above, with the | |
34 | following ASCII graph as input:: |
|
34 | following ASCII graph as input:: | |
35 |
|
35 | |||
36 | foo bar bar foo |
|
36 | foo bar bar foo | |
37 | | / | | |
|
37 | | / | | | |
38 | ancestor(c,d) a baz |
|
38 | ancestor(c,d) a baz | |
39 |
|
39 | |||
40 | The result (`hg log -G -T "{desc}"`) will look like:: |
|
40 | The result (`hg log -G -T "{desc}"`) will look like:: | |
41 |
|
41 | |||
42 | o foo |
|
42 | o foo | |
43 | |\ |
|
43 | |\ | |
44 | +---o bar |
|
44 | +---o bar | |
45 | | | | |
|
45 | | | | | |
46 | | o | baz |
|
46 | | o | baz | |
47 | | / |
|
47 | | / | |
48 | +---o d |
|
48 | +---o d | |
49 | | | |
|
49 | | | | |
50 | +---o c |
|
50 | +---o c | |
51 | | | |
|
51 | | | | |
52 | o | b |
|
52 | o | b | |
53 | |/ |
|
53 | |/ | |
54 | o a |
|
54 | o a | |
55 |
|
55 | |||
56 | Note that if you take the above `hg log` output directly as input. It will work |
|
56 | Note that if you take the above `hg log` output directly as input. It will work | |
57 | as expected - the result would be an isomorphic graph:: |
|
57 | as expected - the result would be an isomorphic graph:: | |
58 |
|
58 | |||
59 | o foo |
|
59 | o foo | |
60 | |\ |
|
60 | |\ | |
61 | | | o d |
|
61 | | | o d | |
62 | | |/ |
|
62 | | |/ | |
63 | | | o c |
|
63 | | | o c | |
64 | | |/ |
|
64 | | |/ | |
65 | | | o bar |
|
65 | | | o bar | |
66 | | |/| |
|
66 | | |/| | |
67 | | o | b |
|
67 | | o | b | |
68 | | |/ |
|
68 | | |/ | |
69 | o / baz |
|
69 | o / baz | |
70 | / |
|
70 | / | |
71 | o a |
|
71 | o a | |
72 |
|
72 | |||
73 | This is because 'o' is specially handled in the input: instead of using 'o' as |
|
73 | This is because 'o' is specially handled in the input: instead of using 'o' as | |
74 | the node name, the word to the right will be used. |
|
74 | the node name, the word to the right will be used. | |
75 |
|
75 | |||
76 | Some special comments could have side effects: |
|
76 | Some special comments could have side effects: | |
77 |
|
77 | |||
78 | - Create obsmarkers |
|
78 | - Create obsmarkers | |
79 | # replace: A -> B -> C -> D # chained 1 to 1 replacements |
|
79 | # replace: A -> B -> C -> D # chained 1 to 1 replacements | |
80 | # split: A -> B, C # 1 to many |
|
80 | # split: A -> B, C # 1 to many | |
81 | # prune: A, B, C # many to nothing |
|
81 | # prune: A, B, C # many to nothing | |
82 | """ |
|
82 | """ | |
83 | from __future__ import absolute_import, print_function |
|
83 | from __future__ import absolute_import, print_function | |
84 |
|
84 | |||
85 | import collections |
|
85 | import collections | |
86 | import itertools |
|
86 | import itertools | |
87 |
|
87 | |||
88 | from mercurial.i18n import _ |
|
88 | from mercurial.i18n import _ | |
89 | from mercurial import ( |
|
89 | from mercurial import ( | |
90 | context, |
|
90 | context, | |
91 | error, |
|
91 | error, | |
92 | node, |
|
92 | node, | |
93 | obsolete, |
|
93 | obsolete, | |
94 | registrar, |
|
94 | registrar, | |
95 | scmutil, |
|
95 | scmutil, | |
96 | tags as tagsmod, |
|
96 | tags as tagsmod, | |
97 | ) |
|
97 | ) | |
98 |
|
98 | |||
99 | cmdtable = {} |
|
99 | cmdtable = {} | |
100 | command = registrar.command(cmdtable) |
|
100 | command = registrar.command(cmdtable) | |
101 |
|
101 | |||
102 | _pipechars = '\\/+-|' |
|
102 | _pipechars = '\\/+-|' | |
103 | _nonpipechars = ''.join(chr(i) for i in xrange(33, 127) |
|
103 | _nonpipechars = ''.join(chr(i) for i in xrange(33, 127) | |
104 | if chr(i) not in _pipechars) |
|
104 | if chr(i) not in _pipechars) | |
105 |
|
105 | |||
106 | def _isname(ch): |
|
106 | def _isname(ch): | |
107 | """char -> bool. return True if ch looks like part of a name, False |
|
107 | """char -> bool. return True if ch looks like part of a name, False | |
108 | otherwise""" |
|
108 | otherwise""" | |
109 | return ch in _nonpipechars |
|
109 | return ch in _nonpipechars | |
110 |
|
110 | |||
111 | def _parseasciigraph(text): |
|
111 | def _parseasciigraph(text): | |
112 | """str -> {str : [str]}. convert the ASCII graph to edges""" |
|
112 | """str -> {str : [str]}. convert the ASCII graph to edges""" | |
113 | lines = text.splitlines() |
|
113 | lines = text.splitlines() | |
114 | edges = collections.defaultdict(list) # {node: []} |
|
114 | edges = collections.defaultdict(list) # {node: []} | |
115 |
|
115 | |||
116 | def get(y, x): |
|
116 | def get(y, x): | |
117 | """(int, int) -> char. give a coordinate, return the char. return a |
|
117 | """(int, int) -> char. give a coordinate, return the char. return a | |
118 | space for anything out of range""" |
|
118 | space for anything out of range""" | |
119 | if x < 0 or y < 0: |
|
119 | if x < 0 or y < 0: | |
120 | return ' ' |
|
120 | return ' ' | |
121 | try: |
|
121 | try: | |
122 | return lines[y][x] |
|
122 | return lines[y][x] | |
123 | except IndexError: |
|
123 | except IndexError: | |
124 | return ' ' |
|
124 | return ' ' | |
125 |
|
125 | |||
126 | def getname(y, x): |
|
126 | def getname(y, x): | |
127 | """(int, int) -> str. like get(y, x) but concatenate left and right |
|
127 | """(int, int) -> str. like get(y, x) but concatenate left and right | |
128 | parts. if name is an 'o', try to replace it to the right""" |
|
128 | parts. if name is an 'o', try to replace it to the right""" | |
129 | result = '' |
|
129 | result = '' | |
130 | for i in itertools.count(0): |
|
130 | for i in itertools.count(0): | |
131 | ch = get(y, x - i) |
|
131 | ch = get(y, x - i) | |
132 | if not _isname(ch): |
|
132 | if not _isname(ch): | |
133 | break |
|
133 | break | |
134 | result = ch + result |
|
134 | result = ch + result | |
135 | for i in itertools.count(1): |
|
135 | for i in itertools.count(1): | |
136 | ch = get(y, x + i) |
|
136 | ch = get(y, x + i) | |
137 | if not _isname(ch): |
|
137 | if not _isname(ch): | |
138 | break |
|
138 | break | |
139 | result += ch |
|
139 | result += ch | |
140 | if result == 'o': |
|
140 | if result == 'o': | |
141 | # special handling, find the name to the right |
|
141 | # special handling, find the name to the right | |
142 | result = '' |
|
142 | result = '' | |
143 | for i in itertools.count(2): |
|
143 | for i in itertools.count(2): | |
144 | ch = get(y, x + i) |
|
144 | ch = get(y, x + i) | |
145 | if ch == ' ' or ch in _pipechars: |
|
145 | if ch == ' ' or ch in _pipechars: | |
146 | if result or x + i >= len(lines[y]): |
|
146 | if result or x + i >= len(lines[y]): | |
147 | break |
|
147 | break | |
148 | else: |
|
148 | else: | |
149 | result += ch |
|
149 | result += ch | |
150 | return result or 'o' |
|
150 | return result or 'o' | |
151 | return result |
|
151 | return result | |
152 |
|
152 | |||
153 | def parents(y, x): |
|
153 | def parents(y, x): | |
154 | """(int, int) -> [str]. follow the ASCII edges at given position, |
|
154 | """(int, int) -> [str]. follow the ASCII edges at given position, | |
155 | return a list of parents""" |
|
155 | return a list of parents""" | |
156 | visited = {(y, x)} |
|
156 | visited = {(y, x)} | |
157 | visit = [] |
|
157 | visit = [] | |
158 | result = [] |
|
158 | result = [] | |
159 |
|
159 | |||
160 | def follow(y, x, expected): |
|
160 | def follow(y, x, expected): | |
161 | """conditionally append (y, x) to visit array, if it's a char |
|
161 | """conditionally append (y, x) to visit array, if it's a char | |
162 | in excepted. 'o' in expected means an '_isname' test. |
|
162 | in excepted. 'o' in expected means an '_isname' test. | |
163 | if '-' (or '+') is not in excepted, and get(y, x) is '-' (or '+'), |
|
163 | if '-' (or '+') is not in excepted, and get(y, x) is '-' (or '+'), | |
164 | the next line (y + 1, x) will be checked instead.""" |
|
164 | the next line (y + 1, x) will be checked instead.""" | |
165 | ch = get(y, x) |
|
165 | ch = get(y, x) | |
166 | if any(ch == c and c not in expected for c in '-+'): |
|
166 | if any(ch == c and c not in expected for c in '-+'): | |
167 | y += 1 |
|
167 | y += 1 | |
168 | return follow(y + 1, x, expected) |
|
168 | return follow(y + 1, x, expected) | |
169 | if ch in expected or ('o' in expected and _isname(ch)): |
|
169 | if ch in expected or ('o' in expected and _isname(ch)): | |
170 | visit.append((y, x)) |
|
170 | visit.append((y, x)) | |
171 |
|
171 | |||
172 | # -o- # starting point: |
|
172 | # -o- # starting point: | |
173 | # /|\ # follow '-' (horizontally), and '/|\' (to the bottom) |
|
173 | # /|\ # follow '-' (horizontally), and '/|\' (to the bottom) | |
174 | follow(y + 1, x, '|') |
|
174 | follow(y + 1, x, '|') | |
175 | follow(y + 1, x - 1, '/') |
|
175 | follow(y + 1, x - 1, '/') | |
176 | follow(y + 1, x + 1, '\\') |
|
176 | follow(y + 1, x + 1, '\\') | |
177 | follow(y, x - 1, '-') |
|
177 | follow(y, x - 1, '-') | |
178 | follow(y, x + 1, '-') |
|
178 | follow(y, x + 1, '-') | |
179 |
|
179 | |||
180 | while visit: |
|
180 | while visit: | |
181 | y, x = visit.pop() |
|
181 | y, x = visit.pop() | |
182 | if (y, x) in visited: |
|
182 | if (y, x) in visited: | |
183 | continue |
|
183 | continue | |
184 | visited.add((y, x)) |
|
184 | visited.add((y, x)) | |
185 | ch = get(y, x) |
|
185 | ch = get(y, x) | |
186 | if _isname(ch): |
|
186 | if _isname(ch): | |
187 | result.append(getname(y, x)) |
|
187 | result.append(getname(y, x)) | |
188 | continue |
|
188 | continue | |
189 | elif ch == '|': |
|
189 | elif ch == '|': | |
190 | follow(y + 1, x, '/|o') |
|
190 | follow(y + 1, x, '/|o') | |
191 | follow(y + 1, x - 1, '/') |
|
191 | follow(y + 1, x - 1, '/') | |
192 | follow(y + 1, x + 1, '\\') |
|
192 | follow(y + 1, x + 1, '\\') | |
193 | elif ch == '+': |
|
193 | elif ch == '+': | |
194 | follow(y, x - 1, '-') |
|
194 | follow(y, x - 1, '-') | |
195 | follow(y, x + 1, '-') |
|
195 | follow(y, x + 1, '-') | |
196 | follow(y + 1, x - 1, '/') |
|
196 | follow(y + 1, x - 1, '/') | |
197 | follow(y + 1, x + 1, '\\') |
|
197 | follow(y + 1, x + 1, '\\') | |
198 | follow(y + 1, x, '|') |
|
198 | follow(y + 1, x, '|') | |
199 | elif ch == '\\': |
|
199 | elif ch == '\\': | |
200 | follow(y + 1, x + 1, '\\|o') |
|
200 | follow(y + 1, x + 1, '\\|o') | |
201 | elif ch == '/': |
|
201 | elif ch == '/': | |
202 | follow(y + 1, x - 1, '/|o') |
|
202 | follow(y + 1, x - 1, '/|o') | |
203 | elif ch == '-': |
|
203 | elif ch == '-': | |
204 | follow(y, x - 1, '-+o') |
|
204 | follow(y, x - 1, '-+o') | |
205 | follow(y, x + 1, '-+o') |
|
205 | follow(y, x + 1, '-+o') | |
206 | return result |
|
206 | return result | |
207 |
|
207 | |||
208 | for y, line in enumerate(lines): |
|
208 | for y, line in enumerate(lines): | |
209 | for x, ch in enumerate(line): |
|
209 | for x, ch in enumerate(line): | |
210 | if ch == '#': # comment |
|
210 | if ch == '#': # comment | |
211 | break |
|
211 | break | |
212 | if _isname(ch): |
|
212 | if _isname(ch): | |
213 | edges[getname(y, x)] += parents(y, x) |
|
213 | edges[getname(y, x)] += parents(y, x) | |
214 |
|
214 | |||
215 | return dict(edges) |
|
215 | return dict(edges) | |
216 |
|
216 | |||
217 | class simplefilectx(object): |
|
217 | class simplefilectx(object): | |
218 | def __init__(self, path, data): |
|
218 | def __init__(self, path, data): | |
219 | self._data = data |
|
219 | self._data = data | |
220 | self._path = path |
|
220 | self._path = path | |
221 |
|
221 | |||
222 | def data(self): |
|
222 | def data(self): | |
223 | return self._data |
|
223 | return self._data | |
224 |
|
224 | |||
225 | def filenode(self): |
|
225 | def filenode(self): | |
226 | return None |
|
226 | return None | |
227 |
|
227 | |||
228 | def path(self): |
|
228 | def path(self): | |
229 | return self._path |
|
229 | return self._path | |
230 |
|
230 | |||
231 | def renamed(self): |
|
231 | def renamed(self): | |
232 | return None |
|
232 | return None | |
233 |
|
233 | |||
234 | def flags(self): |
|
234 | def flags(self): | |
235 | return '' |
|
235 | return '' | |
236 |
|
236 | |||
237 | class simplecommitctx(context.committablectx): |
|
237 | class simplecommitctx(context.committablectx): | |
238 |
def __init__(self, repo, name, parentctxs, added |
|
238 | def __init__(self, repo, name, parentctxs, added): | |
239 | opts = { |
|
239 | opts = { | |
240 |
'changes': scmutil.status([], added |
|
240 | 'changes': scmutil.status([], list(added), [], [], [], [], []), | |
241 | 'date': '0 0', |
|
241 | 'date': '0 0', | |
242 | 'extra': {'branch': 'default'}, |
|
242 | 'extra': {'branch': 'default'}, | |
243 | } |
|
243 | } | |
244 | super(simplecommitctx, self).__init__(self, name, **opts) |
|
244 | super(simplecommitctx, self).__init__(self, name, **opts) | |
245 | self._repo = repo |
|
245 | self._repo = repo | |
246 |
self._ |
|
246 | self._added = added | |
247 | self._parents = parentctxs |
|
247 | self._parents = parentctxs | |
248 | self._parents.sort(key=lambda c: c.node()) |
|
|||
249 | while len(self._parents) < 2: |
|
248 | while len(self._parents) < 2: | |
250 | self._parents.append(repo[node.nullid]) |
|
249 | self._parents.append(repo[node.nullid]) | |
251 |
|
250 | |||
252 | def filectx(self, key): |
|
251 | def filectx(self, key): | |
253 |
return simplefilectx(key, self._ |
|
252 | return simplefilectx(key, self._added[key]) | |
254 |
|
253 | |||
255 | def commit(self): |
|
254 | def commit(self): | |
256 | return self._repo.commitctx(self) |
|
255 | return self._repo.commitctx(self) | |
257 |
|
256 | |||
258 | def _walkgraph(edges): |
|
257 | def _walkgraph(edges): | |
259 | """yield node, parents in topologically order""" |
|
258 | """yield node, parents in topologically order""" | |
260 | visible = set(edges.keys()) |
|
259 | visible = set(edges.keys()) | |
261 | remaining = {} # {str: [str]} |
|
260 | remaining = {} # {str: [str]} | |
262 | for k, vs in edges.iteritems(): |
|
261 | for k, vs in edges.iteritems(): | |
263 | for v in vs: |
|
262 | for v in vs: | |
264 | if v not in remaining: |
|
263 | if v not in remaining: | |
265 | remaining[v] = [] |
|
264 | remaining[v] = [] | |
266 | remaining[k] = vs[:] |
|
265 | remaining[k] = vs[:] | |
267 | while remaining: |
|
266 | while remaining: | |
268 | leafs = [k for k, v in remaining.items() if not v] |
|
267 | leafs = [k for k, v in remaining.items() if not v] | |
269 | if not leafs: |
|
268 | if not leafs: | |
270 | raise error.Abort(_('the graph has cycles')) |
|
269 | raise error.Abort(_('the graph has cycles')) | |
271 | for leaf in sorted(leafs): |
|
270 | for leaf in sorted(leafs): | |
272 | if leaf in visible: |
|
271 | if leaf in visible: | |
273 | yield leaf, edges[leaf] |
|
272 | yield leaf, edges[leaf] | |
274 | del remaining[leaf] |
|
273 | del remaining[leaf] | |
275 | for k, v in remaining.iteritems(): |
|
274 | for k, v in remaining.iteritems(): | |
276 | if leaf in v: |
|
275 | if leaf in v: | |
277 | v.remove(leaf) |
|
276 | v.remove(leaf) | |
278 |
|
277 | |||
279 | @command('debugdrawdag', []) |
|
278 | @command('debugdrawdag', []) | |
280 | def debugdrawdag(ui, repo, **opts): |
|
279 | def debugdrawdag(ui, repo, **opts): | |
281 | """read an ASCII graph from stdin and create changesets |
|
280 | """read an ASCII graph from stdin and create changesets | |
282 |
|
281 | |||
283 | The ASCII graph is like what :hg:`log -G` outputs, with each `o` replaced |
|
282 | The ASCII graph is like what :hg:`log -G` outputs, with each `o` replaced | |
284 | to the name of the node. The command will create dummy changesets and local |
|
283 | to the name of the node. The command will create dummy changesets and local | |
285 | tags with those names to make the dummy changesets easier to be referred |
|
284 | tags with those names to make the dummy changesets easier to be referred | |
286 | to. |
|
285 | to. | |
287 |
|
286 | |||
288 | If the name of a node is a single character 'o', It will be replaced by the |
|
287 | If the name of a node is a single character 'o', It will be replaced by the | |
289 | word to the right. This makes it easier to reuse |
|
288 | word to the right. This makes it easier to reuse | |
290 | :hg:`log -G -T '{desc}'` outputs. |
|
289 | :hg:`log -G -T '{desc}'` outputs. | |
291 |
|
290 | |||
292 | For root (no parents) nodes, revset can be used to query existing repo. |
|
291 | For root (no parents) nodes, revset can be used to query existing repo. | |
293 | Note that the revset cannot have confusing characters which can be seen as |
|
292 | Note that the revset cannot have confusing characters which can be seen as | |
294 | the part of the graph edges, like `|/+-\`. |
|
293 | the part of the graph edges, like `|/+-\`. | |
295 | """ |
|
294 | """ | |
296 | text = ui.fin.read() |
|
295 | text = ui.fin.read() | |
297 |
|
296 | |||
298 | # parse the graph and make sure len(parents) <= 2 for each node |
|
297 | # parse the graph and make sure len(parents) <= 2 for each node | |
299 | edges = _parseasciigraph(text) |
|
298 | edges = _parseasciigraph(text) | |
300 | for k, v in edges.iteritems(): |
|
299 | for k, v in edges.iteritems(): | |
301 | if len(v) > 2: |
|
300 | if len(v) > 2: | |
302 | raise error.Abort(_('%s: too many parents: %s') |
|
301 | raise error.Abort(_('%s: too many parents: %s') | |
303 | % (k, ' '.join(v))) |
|
302 | % (k, ' '.join(v))) | |
304 |
|
303 | |||
305 | committed = {None: node.nullid} # {name: node} |
|
304 | committed = {None: node.nullid} # {name: node} | |
306 |
|
305 | |||
307 | # for leaf nodes, try to find existing nodes in repo |
|
306 | # for leaf nodes, try to find existing nodes in repo | |
308 | for name, parents in edges.iteritems(): |
|
307 | for name, parents in edges.iteritems(): | |
309 | if len(parents) == 0: |
|
308 | if len(parents) == 0: | |
310 | try: |
|
309 | try: | |
311 | committed[name] = scmutil.revsingle(repo, name) |
|
310 | committed[name] = scmutil.revsingle(repo, name) | |
312 | except error.RepoLookupError: |
|
311 | except error.RepoLookupError: | |
313 | pass |
|
312 | pass | |
314 |
|
313 | |||
315 | # commit in topological order |
|
314 | # commit in topological order | |
316 | for name, parents in _walkgraph(edges): |
|
315 | for name, parents in _walkgraph(edges): | |
317 | if name in committed: |
|
316 | if name in committed: | |
318 | continue |
|
317 | continue | |
319 | pctxs = [repo[committed[n]] for n in parents] |
|
318 | pctxs = [repo[committed[n]] for n in parents] | |
320 | ctx = simplecommitctx(repo, name, pctxs, [name]) |
|
319 | pctxs.sort(key=lambda c: c.node()) | |
|
320 | added = {} | |||
|
321 | if len(parents) > 1: | |||
|
322 | # If it's a merge, take the files and contents from the parents | |||
|
323 | for f in pctxs[1].manifest(): | |||
|
324 | if f not in pctxs[0].manifest(): | |||
|
325 | added[f] = pctxs[1][f].data() | |||
|
326 | else: | |||
|
327 | # If it's not a merge, add a single file | |||
|
328 | added[name] = name | |||
|
329 | ctx = simplecommitctx(repo, name, pctxs, added) | |||
321 | n = ctx.commit() |
|
330 | n = ctx.commit() | |
322 | committed[name] = n |
|
331 | committed[name] = n | |
323 | tagsmod.tag(repo, name, n, message=None, user=None, date=None, |
|
332 | tagsmod.tag(repo, name, n, message=None, user=None, date=None, | |
324 | local=True) |
|
333 | local=True) | |
325 |
|
334 | |||
326 | # handle special comments |
|
335 | # handle special comments | |
327 | with repo.wlock(), repo.lock(), repo.transaction('drawdag'): |
|
336 | with repo.wlock(), repo.lock(), repo.transaction('drawdag'): | |
328 | getctx = lambda x: repo.unfiltered()[committed[x.strip()]] |
|
337 | getctx = lambda x: repo.unfiltered()[committed[x.strip()]] | |
329 | for line in text.splitlines(): |
|
338 | for line in text.splitlines(): | |
330 | if ' # ' not in line: |
|
339 | if ' # ' not in line: | |
331 | continue |
|
340 | continue | |
332 |
|
341 | |||
333 | rels = [] # obsolete relationships |
|
342 | rels = [] # obsolete relationships | |
334 | comment = line.split(' # ', 1)[1].split(' # ')[0].strip() |
|
343 | comment = line.split(' # ', 1)[1].split(' # ')[0].strip() | |
335 | args = comment.split(':', 1) |
|
344 | args = comment.split(':', 1) | |
336 | if len(args) <= 1: |
|
345 | if len(args) <= 1: | |
337 | continue |
|
346 | continue | |
338 |
|
347 | |||
339 | cmd = args[0].strip() |
|
348 | cmd = args[0].strip() | |
340 | arg = args[1].strip() |
|
349 | arg = args[1].strip() | |
341 |
|
350 | |||
342 | if cmd in ('replace', 'rebase', 'amend'): |
|
351 | if cmd in ('replace', 'rebase', 'amend'): | |
343 | nodes = [getctx(m) for m in arg.split('->')] |
|
352 | nodes = [getctx(m) for m in arg.split('->')] | |
344 | for i in range(len(nodes) - 1): |
|
353 | for i in range(len(nodes) - 1): | |
345 | rels.append((nodes[i], (nodes[i + 1],))) |
|
354 | rels.append((nodes[i], (nodes[i + 1],))) | |
346 | elif cmd in ('split',): |
|
355 | elif cmd in ('split',): | |
347 | pre, succs = arg.split('->') |
|
356 | pre, succs = arg.split('->') | |
348 | succs = succs.split(',') |
|
357 | succs = succs.split(',') | |
349 | rels.append((getctx(pre), (getctx(s) for s in succs))) |
|
358 | rels.append((getctx(pre), (getctx(s) for s in succs))) | |
350 | elif cmd in ('prune',): |
|
359 | elif cmd in ('prune',): | |
351 | for n in arg.split(','): |
|
360 | for n in arg.split(','): | |
352 | rels.append((getctx(n), ())) |
|
361 | rels.append((getctx(n), ())) | |
353 | if rels: |
|
362 | if rels: | |
354 | obsolete.createmarkers(repo, rels, date=(0, 0), operation=cmd) |
|
363 | obsolete.createmarkers(repo, rels, date=(0, 0), operation=cmd) |
@@ -1,285 +1,285 b'' | |||||
1 | $ cat >> $HGRCPATH <<EOF |
|
1 | $ cat >> $HGRCPATH <<EOF | |
2 | > [experimental] |
|
2 | > [experimental] | |
3 | > bundle-phases=yes |
|
3 | > bundle-phases=yes | |
4 | > [extensions] |
|
4 | > [extensions] | |
5 | > strip= |
|
5 | > strip= | |
6 | > drawdag=$TESTDIR/drawdag.py |
|
6 | > drawdag=$TESTDIR/drawdag.py | |
7 | > EOF |
|
7 | > EOF | |
8 |
|
8 | |||
9 | Set up repo with linear history |
|
9 | Set up repo with linear history | |
10 | $ hg init linear |
|
10 | $ hg init linear | |
11 | $ cd linear |
|
11 | $ cd linear | |
12 | $ hg debugdrawdag <<'EOF' |
|
12 | $ hg debugdrawdag <<'EOF' | |
13 | > E |
|
13 | > E | |
14 | > | |
|
14 | > | | |
15 | > D |
|
15 | > D | |
16 | > | |
|
16 | > | | |
17 | > C |
|
17 | > C | |
18 | > | |
|
18 | > | | |
19 | > B |
|
19 | > B | |
20 | > | |
|
20 | > | | |
21 | > A |
|
21 | > A | |
22 | > EOF |
|
22 | > EOF | |
23 | $ hg phase --public A |
|
23 | $ hg phase --public A | |
24 | $ hg phase --force --secret D |
|
24 | $ hg phase --force --secret D | |
25 | $ hg log -G -T '{desc} {phase}\n' |
|
25 | $ hg log -G -T '{desc} {phase}\n' | |
26 | o E secret |
|
26 | o E secret | |
27 | | |
|
27 | | | |
28 | o D secret |
|
28 | o D secret | |
29 | | |
|
29 | | | |
30 | o C draft |
|
30 | o C draft | |
31 | | |
|
31 | | | |
32 | o B draft |
|
32 | o B draft | |
33 | | |
|
33 | | | |
34 | o A public |
|
34 | o A public | |
35 |
|
35 | |||
36 | Phases are restored when unbundling |
|
36 | Phases are restored when unbundling | |
37 | $ hg bundle --base B -r E bundle |
|
37 | $ hg bundle --base B -r E bundle | |
38 | 3 changesets found |
|
38 | 3 changesets found | |
39 | $ hg debugbundle bundle |
|
39 | $ hg debugbundle bundle | |
40 | Stream params: sortdict([('Compression', 'BZ')]) |
|
40 | Stream params: sortdict([('Compression', 'BZ')]) | |
41 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '3'), ('targetphase', '2')])" |
|
41 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '3'), ('targetphase', '2')])" | |
42 | 26805aba1e600a82e93661149f2313866a221a7b |
|
42 | 26805aba1e600a82e93661149f2313866a221a7b | |
43 | f585351a92f85104bff7c284233c338b10eb1df7 |
|
43 | f585351a92f85104bff7c284233c338b10eb1df7 | |
44 | 9bc730a19041f9ec7cb33c626e811aa233efb18c |
|
44 | 9bc730a19041f9ec7cb33c626e811aa233efb18c | |
45 | phase-heads -- 'sortdict()' |
|
45 | phase-heads -- 'sortdict()' | |
46 | 26805aba1e600a82e93661149f2313866a221a7b draft |
|
46 | 26805aba1e600a82e93661149f2313866a221a7b draft | |
47 | $ hg strip --no-backup C |
|
47 | $ hg strip --no-backup C | |
48 | $ hg unbundle -q bundle |
|
48 | $ hg unbundle -q bundle | |
49 | $ rm bundle |
|
49 | $ rm bundle | |
50 | $ hg log -G -T '{desc} {phase}\n' |
|
50 | $ hg log -G -T '{desc} {phase}\n' | |
51 | o E secret |
|
51 | o E secret | |
52 | | |
|
52 | | | |
53 | o D secret |
|
53 | o D secret | |
54 | | |
|
54 | | | |
55 | o C draft |
|
55 | o C draft | |
56 | | |
|
56 | | | |
57 | o B draft |
|
57 | o B draft | |
58 | | |
|
58 | | | |
59 | o A public |
|
59 | o A public | |
60 |
|
60 | |||
61 | Root revision's phase is preserved |
|
61 | Root revision's phase is preserved | |
62 | $ hg bundle -a bundle |
|
62 | $ hg bundle -a bundle | |
63 | 5 changesets found |
|
63 | 5 changesets found | |
64 | $ hg strip --no-backup A |
|
64 | $ hg strip --no-backup A | |
65 | $ hg unbundle -q bundle |
|
65 | $ hg unbundle -q bundle | |
66 | $ rm bundle |
|
66 | $ rm bundle | |
67 | $ hg log -G -T '{desc} {phase}\n' |
|
67 | $ hg log -G -T '{desc} {phase}\n' | |
68 | o E secret |
|
68 | o E secret | |
69 | | |
|
69 | | | |
70 | o D secret |
|
70 | o D secret | |
71 | | |
|
71 | | | |
72 | o C draft |
|
72 | o C draft | |
73 | | |
|
73 | | | |
74 | o B draft |
|
74 | o B draft | |
75 | | |
|
75 | | | |
76 | o A public |
|
76 | o A public | |
77 |
|
77 | |||
78 | Completely public history can be restored |
|
78 | Completely public history can be restored | |
79 | $ hg phase --public E |
|
79 | $ hg phase --public E | |
80 | $ hg bundle -a bundle |
|
80 | $ hg bundle -a bundle | |
81 | 5 changesets found |
|
81 | 5 changesets found | |
82 | $ hg strip --no-backup A |
|
82 | $ hg strip --no-backup A | |
83 | $ hg unbundle -q bundle |
|
83 | $ hg unbundle -q bundle | |
84 | $ rm bundle |
|
84 | $ rm bundle | |
85 | $ hg log -G -T '{desc} {phase}\n' |
|
85 | $ hg log -G -T '{desc} {phase}\n' | |
86 | o E public |
|
86 | o E public | |
87 | | |
|
87 | | | |
88 | o D public |
|
88 | o D public | |
89 | | |
|
89 | | | |
90 | o C public |
|
90 | o C public | |
91 | | |
|
91 | | | |
92 | o B public |
|
92 | o B public | |
93 | | |
|
93 | | | |
94 | o A public |
|
94 | o A public | |
95 |
|
95 | |||
96 | Direct transition from public to secret can be restored |
|
96 | Direct transition from public to secret can be restored | |
97 | $ hg phase --secret --force D |
|
97 | $ hg phase --secret --force D | |
98 | $ hg bundle -a bundle |
|
98 | $ hg bundle -a bundle | |
99 | 5 changesets found |
|
99 | 5 changesets found | |
100 | $ hg strip --no-backup A |
|
100 | $ hg strip --no-backup A | |
101 | $ hg unbundle -q bundle |
|
101 | $ hg unbundle -q bundle | |
102 | $ rm bundle |
|
102 | $ rm bundle | |
103 | $ hg log -G -T '{desc} {phase}\n' |
|
103 | $ hg log -G -T '{desc} {phase}\n' | |
104 | o E secret |
|
104 | o E secret | |
105 | | |
|
105 | | | |
106 | o D secret |
|
106 | o D secret | |
107 | | |
|
107 | | | |
108 | o C public |
|
108 | o C public | |
109 | | |
|
109 | | | |
110 | o B public |
|
110 | o B public | |
111 | | |
|
111 | | | |
112 | o A public |
|
112 | o A public | |
113 |
|
113 | |||
114 | Revisions within bundle preserve their phase even if parent changes its phase |
|
114 | Revisions within bundle preserve their phase even if parent changes its phase | |
115 | $ hg phase --draft --force B |
|
115 | $ hg phase --draft --force B | |
116 | $ hg bundle --base B -r E bundle |
|
116 | $ hg bundle --base B -r E bundle | |
117 | 3 changesets found |
|
117 | 3 changesets found | |
118 | $ hg strip --no-backup C |
|
118 | $ hg strip --no-backup C | |
119 | $ hg phase --public B |
|
119 | $ hg phase --public B | |
120 | $ hg unbundle -q bundle |
|
120 | $ hg unbundle -q bundle | |
121 | $ rm bundle |
|
121 | $ rm bundle | |
122 | $ hg log -G -T '{desc} {phase}\n' |
|
122 | $ hg log -G -T '{desc} {phase}\n' | |
123 | o E secret |
|
123 | o E secret | |
124 | | |
|
124 | | | |
125 | o D secret |
|
125 | o D secret | |
126 | | |
|
126 | | | |
127 | o C draft |
|
127 | o C draft | |
128 | | |
|
128 | | | |
129 | o B public |
|
129 | o B public | |
130 | | |
|
130 | | | |
131 | o A public |
|
131 | o A public | |
132 |
|
132 | |||
133 | Phase of ancestors of stripped node get advanced to accommodate child |
|
133 | Phase of ancestors of stripped node get advanced to accommodate child | |
134 | $ hg bundle --base B -r E bundle |
|
134 | $ hg bundle --base B -r E bundle | |
135 | 3 changesets found |
|
135 | 3 changesets found | |
136 | $ hg strip --no-backup C |
|
136 | $ hg strip --no-backup C | |
137 | $ hg phase --force --secret B |
|
137 | $ hg phase --force --secret B | |
138 | $ hg unbundle -q bundle |
|
138 | $ hg unbundle -q bundle | |
139 | $ rm bundle |
|
139 | $ rm bundle | |
140 | $ hg log -G -T '{desc} {phase}\n' |
|
140 | $ hg log -G -T '{desc} {phase}\n' | |
141 | o E secret |
|
141 | o E secret | |
142 | | |
|
142 | | | |
143 | o D secret |
|
143 | o D secret | |
144 | | |
|
144 | | | |
145 | o C draft |
|
145 | o C draft | |
146 | | |
|
146 | | | |
147 | o B draft |
|
147 | o B draft | |
148 | | |
|
148 | | | |
149 | o A public |
|
149 | o A public | |
150 |
|
150 | |||
151 | Unbundling advances phases of changesets even if they were already in the repo. |
|
151 | Unbundling advances phases of changesets even if they were already in the repo. | |
152 | To test that, create a bundle of everything in draft phase and then unbundle |
|
152 | To test that, create a bundle of everything in draft phase and then unbundle | |
153 | to see that secret becomes draft, but public remains public. |
|
153 | to see that secret becomes draft, but public remains public. | |
154 | $ hg phase --draft --force A |
|
154 | $ hg phase --draft --force A | |
155 | $ hg phase --draft E |
|
155 | $ hg phase --draft E | |
156 | $ hg bundle -a bundle |
|
156 | $ hg bundle -a bundle | |
157 | 5 changesets found |
|
157 | 5 changesets found | |
158 | $ hg phase --public A |
|
158 | $ hg phase --public A | |
159 | $ hg phase --secret --force E |
|
159 | $ hg phase --secret --force E | |
160 | $ hg unbundle -q bundle |
|
160 | $ hg unbundle -q bundle | |
161 | $ rm bundle |
|
161 | $ rm bundle | |
162 | $ hg log -G -T '{desc} {phase}\n' |
|
162 | $ hg log -G -T '{desc} {phase}\n' | |
163 | o E draft |
|
163 | o E draft | |
164 | | |
|
164 | | | |
165 | o D draft |
|
165 | o D draft | |
166 | | |
|
166 | | | |
167 | o C draft |
|
167 | o C draft | |
168 | | |
|
168 | | | |
169 | o B draft |
|
169 | o B draft | |
170 | | |
|
170 | | | |
171 | o A public |
|
171 | o A public | |
172 |
|
172 | |||
173 | Unbundling change in the middle of a stack does not affect later changes |
|
173 | Unbundling change in the middle of a stack does not affect later changes | |
174 | $ hg strip --no-backup E |
|
174 | $ hg strip --no-backup E | |
175 | $ hg phase --secret --force D |
|
175 | $ hg phase --secret --force D | |
176 | $ hg log -G -T '{desc} {phase}\n' |
|
176 | $ hg log -G -T '{desc} {phase}\n' | |
177 | o D secret |
|
177 | o D secret | |
178 | | |
|
178 | | | |
179 | o C draft |
|
179 | o C draft | |
180 | | |
|
180 | | | |
181 | o B draft |
|
181 | o B draft | |
182 | | |
|
182 | | | |
183 | o A public |
|
183 | o A public | |
184 |
|
184 | |||
185 | $ hg bundle --base A -r B bundle |
|
185 | $ hg bundle --base A -r B bundle | |
186 | 1 changesets found |
|
186 | 1 changesets found | |
187 | $ hg unbundle -q bundle |
|
187 | $ hg unbundle -q bundle | |
188 | $ rm bundle |
|
188 | $ rm bundle | |
189 | $ hg log -G -T '{desc} {phase}\n' |
|
189 | $ hg log -G -T '{desc} {phase}\n' | |
190 | o D secret |
|
190 | o D secret | |
191 | | |
|
191 | | | |
192 | o C draft |
|
192 | o C draft | |
193 | | |
|
193 | | | |
194 | o B draft |
|
194 | o B draft | |
195 | | |
|
195 | | | |
196 | o A public |
|
196 | o A public | |
197 |
|
197 | |||
198 |
|
198 | |||
199 | $ cd .. |
|
199 | $ cd .. | |
200 |
|
200 | |||
201 | Set up repo with non-linear history |
|
201 | Set up repo with non-linear history | |
202 | $ hg init non-linear |
|
202 | $ hg init non-linear | |
203 | $ cd non-linear |
|
203 | $ cd non-linear | |
204 | $ hg debugdrawdag <<'EOF' |
|
204 | $ hg debugdrawdag <<'EOF' | |
205 | > D E |
|
205 | > D E | |
206 | > |\| |
|
206 | > |\| | |
207 | > B C |
|
207 | > B C | |
208 | > |/ |
|
208 | > |/ | |
209 | > A |
|
209 | > A | |
210 | > EOF |
|
210 | > EOF | |
211 | $ hg phase --public C |
|
211 | $ hg phase --public C | |
212 | $ hg phase --force --secret B |
|
212 | $ hg phase --force --secret B | |
213 | $ hg log -G -T '{node|short} {desc} {phase}\n' |
|
213 | $ hg log -G -T '{node|short} {desc} {phase}\n' | |
214 | o 03ca77807e91 E draft |
|
214 | o 03ca77807e91 E draft | |
215 | | |
|
215 | | | |
216 |
| o |
|
216 | | o 4e4f9194f9f1 D secret | |
217 | |/| |
|
217 | |/| | |
218 | o | dc0947a82db8 C public |
|
218 | o | dc0947a82db8 C public | |
219 | | | |
|
219 | | | | |
220 | | o 112478962961 B secret |
|
220 | | o 112478962961 B secret | |
221 | |/ |
|
221 | |/ | |
222 | o 426bada5c675 A public |
|
222 | o 426bada5c675 A public | |
223 |
|
223 | |||
224 |
|
224 | |||
225 | Restore bundle of entire repo |
|
225 | Restore bundle of entire repo | |
226 | $ hg bundle -a bundle |
|
226 | $ hg bundle -a bundle | |
227 | 5 changesets found |
|
227 | 5 changesets found | |
228 | $ hg debugbundle bundle |
|
228 | $ hg debugbundle bundle | |
229 | Stream params: sortdict([('Compression', 'BZ')]) |
|
229 | Stream params: sortdict([('Compression', 'BZ')]) | |
230 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '5'), ('targetphase', '2')])" |
|
230 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '5'), ('targetphase', '2')])" | |
231 | 426bada5c67598ca65036d57d9e4b64b0c1ce7a0 |
|
231 | 426bada5c67598ca65036d57d9e4b64b0c1ce7a0 | |
232 | 112478962961147124edd43549aedd1a335e44bf |
|
232 | 112478962961147124edd43549aedd1a335e44bf | |
233 | dc0947a82db884575bb76ea10ac97b08536bfa03 |
|
233 | dc0947a82db884575bb76ea10ac97b08536bfa03 | |
234 | 215e7b0814e1cac8e2614e7284f2a5dc266b4323 |
|
234 | 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 | |
235 | 03ca77807e919db8807c3749086dc36fb478cac0 |
|
235 | 03ca77807e919db8807c3749086dc36fb478cac0 | |
236 | phase-heads -- 'sortdict()' |
|
236 | phase-heads -- 'sortdict()' | |
237 | dc0947a82db884575bb76ea10ac97b08536bfa03 public |
|
237 | dc0947a82db884575bb76ea10ac97b08536bfa03 public | |
238 | 03ca77807e919db8807c3749086dc36fb478cac0 draft |
|
238 | 03ca77807e919db8807c3749086dc36fb478cac0 draft | |
239 | $ hg strip --no-backup A |
|
239 | $ hg strip --no-backup A | |
240 | $ hg unbundle -q bundle |
|
240 | $ hg unbundle -q bundle | |
241 | $ rm bundle |
|
241 | $ rm bundle | |
242 | $ hg log -G -T '{node|short} {desc} {phase}\n' |
|
242 | $ hg log -G -T '{node|short} {desc} {phase}\n' | |
243 | o 03ca77807e91 E draft |
|
243 | o 03ca77807e91 E draft | |
244 | | |
|
244 | | | |
245 |
| o |
|
245 | | o 4e4f9194f9f1 D secret | |
246 | |/| |
|
246 | |/| | |
247 | o | dc0947a82db8 C public |
|
247 | o | dc0947a82db8 C public | |
248 | | | |
|
248 | | | | |
249 | | o 112478962961 B secret |
|
249 | | o 112478962961 B secret | |
250 | |/ |
|
250 | |/ | |
251 | o 426bada5c675 A public |
|
251 | o 426bada5c675 A public | |
252 |
|
252 | |||
253 |
|
253 | |||
254 | $ hg bundle --base 'A + C' -r D bundle |
|
254 | $ hg bundle --base 'A + C' -r D bundle | |
255 | 2 changesets found |
|
255 | 2 changesets found | |
256 | $ hg debugbundle bundle |
|
256 | $ hg debugbundle bundle | |
257 | Stream params: sortdict([('Compression', 'BZ')]) |
|
257 | Stream params: sortdict([('Compression', 'BZ')]) | |
258 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '2'), ('targetphase', '2')])" |
|
258 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '2'), ('targetphase', '2')])" | |
259 | 112478962961147124edd43549aedd1a335e44bf |
|
259 | 112478962961147124edd43549aedd1a335e44bf | |
260 | 215e7b0814e1cac8e2614e7284f2a5dc266b4323 |
|
260 | 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 | |
261 | phase-heads -- 'sortdict()' |
|
261 | phase-heads -- 'sortdict()' | |
262 | $ rm bundle |
|
262 | $ rm bundle | |
263 |
|
263 | |||
264 | $ hg bundle --base A -r D bundle |
|
264 | $ hg bundle --base A -r D bundle | |
265 | 3 changesets found |
|
265 | 3 changesets found | |
266 | $ hg debugbundle bundle |
|
266 | $ hg debugbundle bundle | |
267 | Stream params: sortdict([('Compression', 'BZ')]) |
|
267 | Stream params: sortdict([('Compression', 'BZ')]) | |
268 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '3'), ('targetphase', '2')])" |
|
268 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '3'), ('targetphase', '2')])" | |
269 | 112478962961147124edd43549aedd1a335e44bf |
|
269 | 112478962961147124edd43549aedd1a335e44bf | |
270 | dc0947a82db884575bb76ea10ac97b08536bfa03 |
|
270 | dc0947a82db884575bb76ea10ac97b08536bfa03 | |
271 | 215e7b0814e1cac8e2614e7284f2a5dc266b4323 |
|
271 | 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 | |
272 | phase-heads -- 'sortdict()' |
|
272 | phase-heads -- 'sortdict()' | |
273 | dc0947a82db884575bb76ea10ac97b08536bfa03 public |
|
273 | dc0947a82db884575bb76ea10ac97b08536bfa03 public | |
274 | $ rm bundle |
|
274 | $ rm bundle | |
275 |
|
275 | |||
276 | $ hg bundle --base 'B + C' -r 'D + E' bundle |
|
276 | $ hg bundle --base 'B + C' -r 'D + E' bundle | |
277 | 2 changesets found |
|
277 | 2 changesets found | |
278 | $ hg debugbundle bundle |
|
278 | $ hg debugbundle bundle | |
279 | Stream params: sortdict([('Compression', 'BZ')]) |
|
279 | Stream params: sortdict([('Compression', 'BZ')]) | |
280 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '2'), ('targetphase', '2')])" |
|
280 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '2'), ('targetphase', '2')])" | |
281 | 215e7b0814e1cac8e2614e7284f2a5dc266b4323 |
|
281 | 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 | |
282 | 03ca77807e919db8807c3749086dc36fb478cac0 |
|
282 | 03ca77807e919db8807c3749086dc36fb478cac0 | |
283 | phase-heads -- 'sortdict()' |
|
283 | phase-heads -- 'sortdict()' | |
284 | 03ca77807e919db8807c3749086dc36fb478cac0 draft |
|
284 | 03ca77807e919db8807c3749086dc36fb478cac0 draft | |
285 | $ rm bundle |
|
285 | $ rm bundle |
@@ -1,222 +1,234 b'' | |||||
1 | $ cat >> $HGRCPATH<<EOF |
|
1 | $ cat >> $HGRCPATH<<EOF | |
2 | > [extensions] |
|
2 | > [extensions] | |
3 | > drawdag=$TESTDIR/drawdag.py |
|
3 | > drawdag=$TESTDIR/drawdag.py | |
4 | > [experimental] |
|
4 | > [experimental] | |
5 | > evolution=all |
|
5 | > evolution=all | |
6 | > EOF |
|
6 | > EOF | |
7 |
|
7 | |||
8 | $ reinit () { |
|
8 | $ reinit () { | |
9 | > rm -rf .hg && hg init |
|
9 | > rm -rf .hg && hg init | |
10 | > } |
|
10 | > } | |
11 |
|
11 | |||
12 | $ hg init |
|
12 | $ hg init | |
13 |
|
13 | |||
14 | Test what said in drawdag.py docstring |
|
14 | Test what said in drawdag.py docstring | |
15 |
|
15 | |||
16 | $ hg debugdrawdag <<'EOS' |
|
16 | $ hg debugdrawdag <<'EOS' | |
17 | > c d |
|
17 | > c d | |
18 | > |/ |
|
18 | > |/ | |
19 | > b |
|
19 | > b | |
20 | > | |
|
20 | > | | |
21 | > a |
|
21 | > a | |
22 | > EOS |
|
22 | > EOS | |
23 |
|
23 | |||
24 | $ hg log -G -T '{rev} {desc} ({tags})' |
|
24 | $ hg log -G -T '{rev} {desc} ({tags})' | |
25 | o 3 d (d tip) |
|
25 | o 3 d (d tip) | |
26 | | |
|
26 | | | |
27 | | o 2 c (c) |
|
27 | | o 2 c (c) | |
28 | |/ |
|
28 | |/ | |
29 | o 1 b (b) |
|
29 | o 1 b (b) | |
30 | | |
|
30 | | | |
31 | o 0 a (a) |
|
31 | o 0 a (a) | |
32 |
|
32 | |||
33 | $ hg debugdrawdag <<'EOS' |
|
33 | $ hg debugdrawdag <<'EOS' | |
34 | > foo bar bar foo |
|
34 | > foo bar bar foo | |
35 | > | / | | |
|
35 | > | / | | | |
36 | > ancestor(c,d) a baz |
|
36 | > ancestor(c,d) a baz | |
37 | > EOS |
|
37 | > EOS | |
38 |
|
38 | |||
39 | $ hg log -G -T '{desc}' |
|
39 | $ hg log -G -T '{desc}' | |
40 | o foo |
|
40 | o foo | |
41 | |\ |
|
41 | |\ | |
42 | +---o bar |
|
42 | +---o bar | |
43 | | | | |
|
43 | | | | | |
44 | | o | baz |
|
44 | | o | baz | |
45 | | / |
|
45 | | / | |
46 | +---o d |
|
46 | +---o d | |
47 | | | |
|
47 | | | | |
48 | +---o c |
|
48 | +---o c | |
49 | | | |
|
49 | | | | |
50 | o | b |
|
50 | o | b | |
51 | |/ |
|
51 | |/ | |
52 | o a |
|
52 | o a | |
53 |
|
53 | |||
54 | $ reinit |
|
54 | $ reinit | |
55 |
|
55 | |||
56 | $ hg debugdrawdag <<'EOS' |
|
56 | $ hg debugdrawdag <<'EOS' | |
57 | > o foo |
|
57 | > o foo | |
58 | > |\ |
|
58 | > |\ | |
59 | > +---o bar |
|
59 | > +---o bar | |
60 | > | | | |
|
60 | > | | | | |
61 | > | o | baz |
|
61 | > | o | baz | |
62 | > | / |
|
62 | > | / | |
63 | > +---o d |
|
63 | > +---o d | |
64 | > | | |
|
64 | > | | | |
65 | > +---o c |
|
65 | > +---o c | |
66 | > | | |
|
66 | > | | | |
67 | > o | b |
|
67 | > o | b | |
68 | > |/ |
|
68 | > |/ | |
69 | > o a |
|
69 | > o a | |
70 | > EOS |
|
70 | > EOS | |
71 |
|
71 | |||
72 | $ hg log -G -T '{desc}' |
|
72 | $ hg log -G -T '{desc}' | |
73 | o foo |
|
73 | o foo | |
74 | |\ |
|
74 | |\ | |
75 | | | o d |
|
75 | | | o d | |
76 | | |/ |
|
76 | | |/ | |
77 | | | o c |
|
77 | | | o c | |
78 | | |/ |
|
78 | | |/ | |
79 | | | o bar |
|
79 | | | o bar | |
80 | | |/| |
|
80 | | |/| | |
81 | | o | b |
|
81 | | o | b | |
82 | | |/ |
|
82 | | |/ | |
83 | o / baz |
|
83 | o / baz | |
84 | / |
|
84 | / | |
85 | o a |
|
85 | o a | |
86 |
|
86 | |||
87 | $ reinit |
|
87 | $ reinit | |
88 |
|
88 | |||
89 | $ hg debugdrawdag <<'EOS' |
|
89 | $ hg debugdrawdag <<'EOS' | |
90 | > o foo |
|
90 | > o foo | |
91 | > |\ |
|
91 | > |\ | |
92 | > | | o d |
|
92 | > | | o d | |
93 | > | |/ |
|
93 | > | |/ | |
94 | > | | o c |
|
94 | > | | o c | |
95 | > | |/ |
|
95 | > | |/ | |
96 | > | | o bar |
|
96 | > | | o bar | |
97 | > | |/| |
|
97 | > | |/| | |
98 | > | o | b |
|
98 | > | o | b | |
99 | > | |/ |
|
99 | > | |/ | |
100 | > o / baz |
|
100 | > o / baz | |
101 | > / |
|
101 | > / | |
102 | > o a |
|
102 | > o a | |
103 | > EOS |
|
103 | > EOS | |
104 |
|
104 | |||
105 | $ hg log -G -T '{desc}' |
|
105 | $ hg log -G -T '{desc}' | |
106 | o foo |
|
106 | o foo | |
107 | |\ |
|
107 | |\ | |
108 | | | o d |
|
108 | | | o d | |
109 | | |/ |
|
109 | | |/ | |
110 | | | o c |
|
110 | | | o c | |
111 | | |/ |
|
111 | | |/ | |
112 | | | o bar |
|
112 | | | o bar | |
113 | | |/| |
|
113 | | |/| | |
114 | | o | b |
|
114 | | o | b | |
115 | | |/ |
|
115 | | |/ | |
116 | o / baz |
|
116 | o / baz | |
117 | / |
|
117 | / | |
118 | o a |
|
118 | o a | |
119 |
|
119 | |||
|
120 | $ hg manifest -r a | |||
|
121 | a | |||
|
122 | $ hg manifest -r b | |||
|
123 | a | |||
|
124 | b | |||
|
125 | $ hg manifest -r bar | |||
|
126 | a | |||
|
127 | b | |||
|
128 | $ hg manifest -r foo | |||
|
129 | a | |||
|
130 | b | |||
|
131 | baz | |||
120 |
|
132 | |||
121 | Edges existed in repo are no-ops |
|
133 | Edges existed in repo are no-ops | |
122 |
|
134 | |||
123 | $ reinit |
|
135 | $ reinit | |
124 | $ hg debugdrawdag <<'EOS' |
|
136 | $ hg debugdrawdag <<'EOS' | |
125 | > B C C |
|
137 | > B C C | |
126 | > | | | |
|
138 | > | | | | |
127 | > A A B |
|
139 | > A A B | |
128 | > EOS |
|
140 | > EOS | |
129 |
|
141 | |||
130 | $ hg log -G -T '{desc}' |
|
142 | $ hg log -G -T '{desc}' | |
131 | o C |
|
143 | o C | |
132 | |\ |
|
144 | |\ | |
133 | | o B |
|
145 | | o B | |
134 | |/ |
|
146 | |/ | |
135 | o A |
|
147 | o A | |
136 |
|
148 | |||
137 |
|
149 | |||
138 | $ hg debugdrawdag <<'EOS' |
|
150 | $ hg debugdrawdag <<'EOS' | |
139 | > C D C |
|
151 | > C D C | |
140 | > | | | |
|
152 | > | | | | |
141 | > B B A |
|
153 | > B B A | |
142 | > EOS |
|
154 | > EOS | |
143 |
|
155 | |||
144 | $ hg log -G -T '{desc}' |
|
156 | $ hg log -G -T '{desc}' | |
145 | o D |
|
157 | o D | |
146 | | |
|
158 | | | |
147 | | o C |
|
159 | | o C | |
148 | |/| |
|
160 | |/| | |
149 | o | B |
|
161 | o | B | |
150 | |/ |
|
162 | |/ | |
151 | o A |
|
163 | o A | |
152 |
|
164 | |||
153 |
|
165 | |||
154 | Node with more than 2 parents are disallowed |
|
166 | Node with more than 2 parents are disallowed | |
155 |
|
167 | |||
156 | $ hg debugdrawdag <<'EOS' |
|
168 | $ hg debugdrawdag <<'EOS' | |
157 | > A |
|
169 | > A | |
158 | > /|\ |
|
170 | > /|\ | |
159 | > D B C |
|
171 | > D B C | |
160 | > EOS |
|
172 | > EOS | |
161 | abort: A: too many parents: C D B |
|
173 | abort: A: too many parents: C D B | |
162 | [255] |
|
174 | [255] | |
163 |
|
175 | |||
164 | Cycles are disallowed |
|
176 | Cycles are disallowed | |
165 |
|
177 | |||
166 | $ hg debugdrawdag <<'EOS' |
|
178 | $ hg debugdrawdag <<'EOS' | |
167 | > A |
|
179 | > A | |
168 | > | |
|
180 | > | | |
169 | > A |
|
181 | > A | |
170 | > EOS |
|
182 | > EOS | |
171 | abort: the graph has cycles |
|
183 | abort: the graph has cycles | |
172 | [255] |
|
184 | [255] | |
173 |
|
185 | |||
174 | $ hg debugdrawdag <<'EOS' |
|
186 | $ hg debugdrawdag <<'EOS' | |
175 | > A |
|
187 | > A | |
176 | > | |
|
188 | > | | |
177 | > B |
|
189 | > B | |
178 | > | |
|
190 | > | | |
179 | > A |
|
191 | > A | |
180 | > EOS |
|
192 | > EOS | |
181 | abort: the graph has cycles |
|
193 | abort: the graph has cycles | |
182 | [255] |
|
194 | [255] | |
183 |
|
195 | |||
184 | Create obsmarkers via comments |
|
196 | Create obsmarkers via comments | |
185 |
|
197 | |||
186 | $ reinit |
|
198 | $ reinit | |
187 |
|
199 | |||
188 | $ hg debugdrawdag <<'EOS' |
|
200 | $ hg debugdrawdag <<'EOS' | |
189 | > G |
|
201 | > G | |
190 | > | |
|
202 | > | | |
191 | > I D C F # split: B -> E, F, G |
|
203 | > I D C F # split: B -> E, F, G | |
192 | > \ \| | # replace: C -> D -> H |
|
204 | > \ \| | # replace: C -> D -> H | |
193 | > H B E # prune: F, I |
|
205 | > H B E # prune: F, I | |
194 | > \|/ |
|
206 | > \|/ | |
195 | > A |
|
207 | > A | |
196 | > EOS |
|
208 | > EOS | |
197 |
|
209 | |||
198 | $ hg log -r 'sort(all(), topo)' -G --hidden -T '{desc} {node}' |
|
210 | $ hg log -r 'sort(all(), topo)' -G --hidden -T '{desc} {node}' | |
199 | o G 711f53bbef0bebd12eb6f0511d5e2e998b984846 |
|
211 | o G 711f53bbef0bebd12eb6f0511d5e2e998b984846 | |
200 | | |
|
212 | | | |
201 | x F 64a8289d249234b9886244d379f15e6b650b28e3 |
|
213 | x F 64a8289d249234b9886244d379f15e6b650b28e3 | |
202 | | |
|
214 | | | |
203 | o E 7fb047a69f220c21711122dfd94305a9efb60cba |
|
215 | o E 7fb047a69f220c21711122dfd94305a9efb60cba | |
204 | | |
|
216 | | | |
205 | | x D be0ef73c17ade3fc89dc41701eb9fc3a91b58282 |
|
217 | | x D be0ef73c17ade3fc89dc41701eb9fc3a91b58282 | |
206 | | | |
|
218 | | | | |
207 | | | x C 26805aba1e600a82e93661149f2313866a221a7b |
|
219 | | | x C 26805aba1e600a82e93661149f2313866a221a7b | |
208 | | |/ |
|
220 | | |/ | |
209 | | x B 112478962961147124edd43549aedd1a335e44bf |
|
221 | | x B 112478962961147124edd43549aedd1a335e44bf | |
210 | |/ |
|
222 | |/ | |
211 | | x I 58e6b987bf7045fcd9c54f496396ca1d1fc81047 |
|
223 | | x I 58e6b987bf7045fcd9c54f496396ca1d1fc81047 | |
212 | | | |
|
224 | | | | |
213 | | o H 575c4b5ec114d64b681d33f8792853568bfb2b2c |
|
225 | | o H 575c4b5ec114d64b681d33f8792853568bfb2b2c | |
214 | |/ |
|
226 | |/ | |
215 | o A 426bada5c67598ca65036d57d9e4b64b0c1ce7a0 |
|
227 | o A 426bada5c67598ca65036d57d9e4b64b0c1ce7a0 | |
216 |
|
228 | |||
217 | $ hg debugobsolete |
|
229 | $ hg debugobsolete | |
218 | 112478962961147124edd43549aedd1a335e44bf 7fb047a69f220c21711122dfd94305a9efb60cba 64a8289d249234b9886244d379f15e6b650b28e3 711f53bbef0bebd12eb6f0511d5e2e998b984846 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} |
|
230 | 112478962961147124edd43549aedd1a335e44bf 7fb047a69f220c21711122dfd94305a9efb60cba 64a8289d249234b9886244d379f15e6b650b28e3 711f53bbef0bebd12eb6f0511d5e2e998b984846 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} | |
219 | 26805aba1e600a82e93661149f2313866a221a7b be0ef73c17ade3fc89dc41701eb9fc3a91b58282 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} |
|
231 | 26805aba1e600a82e93661149f2313866a221a7b be0ef73c17ade3fc89dc41701eb9fc3a91b58282 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} | |
220 | be0ef73c17ade3fc89dc41701eb9fc3a91b58282 575c4b5ec114d64b681d33f8792853568bfb2b2c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} |
|
232 | be0ef73c17ade3fc89dc41701eb9fc3a91b58282 575c4b5ec114d64b681d33f8792853568bfb2b2c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} | |
221 | 64a8289d249234b9886244d379f15e6b650b28e3 0 {7fb047a69f220c21711122dfd94305a9efb60cba} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} |
|
233 | 64a8289d249234b9886244d379f15e6b650b28e3 0 {7fb047a69f220c21711122dfd94305a9efb60cba} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} | |
222 | 58e6b987bf7045fcd9c54f496396ca1d1fc81047 0 {575c4b5ec114d64b681d33f8792853568bfb2b2c} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} |
|
234 | 58e6b987bf7045fcd9c54f496396ca1d1fc81047 0 {575c4b5ec114d64b681d33f8792853568bfb2b2c} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} |
@@ -1,381 +1,381 b'' | |||||
1 | $ cat >> $HGRCPATH <<EOF |
|
1 | $ cat >> $HGRCPATH <<EOF | |
2 | > [extensions] |
|
2 | > [extensions] | |
3 | > rebase= |
|
3 | > rebase= | |
4 | > drawdag=$TESTDIR/drawdag.py |
|
4 | > drawdag=$TESTDIR/drawdag.py | |
5 | > |
|
5 | > | |
6 | > [phases] |
|
6 | > [phases] | |
7 | > publish=False |
|
7 | > publish=False | |
8 | > |
|
8 | > | |
9 | > [alias] |
|
9 | > [alias] | |
10 | > tglog = log -G --template "{rev}: {desc}" |
|
10 | > tglog = log -G --template "{rev}: {desc}" | |
11 | > EOF |
|
11 | > EOF | |
12 |
|
12 | |||
13 | $ rebasewithdag() { |
|
13 | $ rebasewithdag() { | |
14 | > N=`$PYTHON -c "print($N+1)"` |
|
14 | > N=`$PYTHON -c "print($N+1)"` | |
15 | > hg init repo$N && cd repo$N |
|
15 | > hg init repo$N && cd repo$N | |
16 | > hg debugdrawdag |
|
16 | > hg debugdrawdag | |
17 | > hg rebase "$@" > _rebasetmp |
|
17 | > hg rebase "$@" > _rebasetmp | |
18 | > r=$? |
|
18 | > r=$? | |
19 | > grep -v 'saved backup bundle' _rebasetmp |
|
19 | > grep -v 'saved backup bundle' _rebasetmp | |
20 | > [ $r -eq 0 ] && hg tglog |
|
20 | > [ $r -eq 0 ] && hg tglog | |
21 | > cd .. |
|
21 | > cd .. | |
22 | > return $r |
|
22 | > return $r | |
23 | > } |
|
23 | > } | |
24 |
|
24 | |||
25 | Single branching point, without merge: |
|
25 | Single branching point, without merge: | |
26 |
|
26 | |||
27 | $ rebasewithdag -b D -d Z <<'EOS' |
|
27 | $ rebasewithdag -b D -d Z <<'EOS' | |
28 | > D E |
|
28 | > D E | |
29 | > |/ |
|
29 | > |/ | |
30 | > Z B C # C: branching point, E should be picked |
|
30 | > Z B C # C: branching point, E should be picked | |
31 | > \|/ # B should not be picked |
|
31 | > \|/ # B should not be picked | |
32 | > A |
|
32 | > A | |
33 | > | |
|
33 | > | | |
34 | > R |
|
34 | > R | |
35 | > EOS |
|
35 | > EOS | |
36 | rebasing 3:d6003a550c2c "C" (C) |
|
36 | rebasing 3:d6003a550c2c "C" (C) | |
37 | rebasing 5:4526cf523425 "D" (D) |
|
37 | rebasing 5:4526cf523425 "D" (D) | |
38 | rebasing 6:b296604d9846 "E" (E tip) |
|
38 | rebasing 6:b296604d9846 "E" (E tip) | |
39 | o 6: E |
|
39 | o 6: E | |
40 | | |
|
40 | | | |
41 | | o 5: D |
|
41 | | o 5: D | |
42 | |/ |
|
42 | |/ | |
43 | o 4: C |
|
43 | o 4: C | |
44 | | |
|
44 | | | |
45 | o 3: Z |
|
45 | o 3: Z | |
46 | | |
|
46 | | | |
47 | | o 2: B |
|
47 | | o 2: B | |
48 | |/ |
|
48 | |/ | |
49 | o 1: A |
|
49 | o 1: A | |
50 | | |
|
50 | | | |
51 | o 0: R |
|
51 | o 0: R | |
52 |
|
52 | |||
53 | Multiple branching points caused by selecting a single merge changeset: |
|
53 | Multiple branching points caused by selecting a single merge changeset: | |
54 |
|
54 | |||
55 | $ rebasewithdag -b E -d Z <<'EOS' |
|
55 | $ rebasewithdag -b E -d Z <<'EOS' | |
56 | > E |
|
56 | > E | |
57 | > /| |
|
57 | > /| | |
58 | > B C D # B, C: multiple branching points |
|
58 | > B C D # B, C: multiple branching points | |
59 | > | |/ # D should not be picked |
|
59 | > | |/ # D should not be picked | |
60 | > Z | / |
|
60 | > Z | / | |
61 | > \|/ |
|
61 | > \|/ | |
62 | > A |
|
62 | > A | |
63 | > | |
|
63 | > | | |
64 | > R |
|
64 | > R | |
65 | > EOS |
|
65 | > EOS | |
66 | rebasing 2:c1e6b162678d "B" (B) |
|
66 | rebasing 2:c1e6b162678d "B" (B) | |
67 | rebasing 3:d6003a550c2c "C" (C) |
|
67 | rebasing 3:d6003a550c2c "C" (C) | |
68 |
rebasing 6:5 |
|
68 | rebasing 6:54c8f00cb91c "E" (E tip) | |
69 | o 6: E |
|
69 | o 6: E | |
70 | |\ |
|
70 | |\ | |
71 | | o 5: C |
|
71 | | o 5: C | |
72 | | | |
|
72 | | | | |
73 | o | 4: B |
|
73 | o | 4: B | |
74 | |/ |
|
74 | |/ | |
75 | o 3: Z |
|
75 | o 3: Z | |
76 | | |
|
76 | | | |
77 | | o 2: D |
|
77 | | o 2: D | |
78 | |/ |
|
78 | |/ | |
79 | o 1: A |
|
79 | o 1: A | |
80 | | |
|
80 | | | |
81 | o 0: R |
|
81 | o 0: R | |
82 |
|
82 | |||
83 | Rebase should not extend the "--base" revset using "descendants": |
|
83 | Rebase should not extend the "--base" revset using "descendants": | |
84 |
|
84 | |||
85 | $ rebasewithdag -b B -d Z <<'EOS' |
|
85 | $ rebasewithdag -b B -d Z <<'EOS' | |
86 | > E |
|
86 | > E | |
87 | > /| |
|
87 | > /| | |
88 | > Z B C # descendants(B) = B+E. With E, C will be included incorrectly |
|
88 | > Z B C # descendants(B) = B+E. With E, C will be included incorrectly | |
89 | > \|/ |
|
89 | > \|/ | |
90 | > A |
|
90 | > A | |
91 | > | |
|
91 | > | | |
92 | > R |
|
92 | > R | |
93 | > EOS |
|
93 | > EOS | |
94 | rebasing 2:c1e6b162678d "B" (B) |
|
94 | rebasing 2:c1e6b162678d "B" (B) | |
95 |
rebasing 5:5 |
|
95 | rebasing 5:54c8f00cb91c "E" (E tip) | |
96 | o 5: E |
|
96 | o 5: E | |
97 | |\ |
|
97 | |\ | |
98 | | o 4: B |
|
98 | | o 4: B | |
99 | | | |
|
99 | | | | |
100 | | o 3: Z |
|
100 | | o 3: Z | |
101 | | | |
|
101 | | | | |
102 | o | 2: C |
|
102 | o | 2: C | |
103 | |/ |
|
103 | |/ | |
104 | o 1: A |
|
104 | o 1: A | |
105 | | |
|
105 | | | |
106 | o 0: R |
|
106 | o 0: R | |
107 |
|
107 | |||
108 | Rebase should not simplify the "--base" revset using "roots": |
|
108 | Rebase should not simplify the "--base" revset using "roots": | |
109 |
|
109 | |||
110 | $ rebasewithdag -b B+E -d Z <<'EOS' |
|
110 | $ rebasewithdag -b B+E -d Z <<'EOS' | |
111 | > E |
|
111 | > E | |
112 | > /| |
|
112 | > /| | |
113 | > Z B C # roots(B+E) = B. Without E, C will be missed incorrectly |
|
113 | > Z B C # roots(B+E) = B. Without E, C will be missed incorrectly | |
114 | > \|/ |
|
114 | > \|/ | |
115 | > A |
|
115 | > A | |
116 | > | |
|
116 | > | | |
117 | > R |
|
117 | > R | |
118 | > EOS |
|
118 | > EOS | |
119 | rebasing 2:c1e6b162678d "B" (B) |
|
119 | rebasing 2:c1e6b162678d "B" (B) | |
120 | rebasing 3:d6003a550c2c "C" (C) |
|
120 | rebasing 3:d6003a550c2c "C" (C) | |
121 |
rebasing 5:5 |
|
121 | rebasing 5:54c8f00cb91c "E" (E tip) | |
122 | o 5: E |
|
122 | o 5: E | |
123 | |\ |
|
123 | |\ | |
124 | | o 4: C |
|
124 | | o 4: C | |
125 | | | |
|
125 | | | | |
126 | o | 3: B |
|
126 | o | 3: B | |
127 | |/ |
|
127 | |/ | |
128 | o 2: Z |
|
128 | o 2: Z | |
129 | | |
|
129 | | | |
130 | o 1: A |
|
130 | o 1: A | |
131 | | |
|
131 | | | |
132 | o 0: R |
|
132 | o 0: R | |
133 |
|
133 | |||
134 | The destination is one of the two branching points of a merge: |
|
134 | The destination is one of the two branching points of a merge: | |
135 |
|
135 | |||
136 | $ rebasewithdag -b F -d Z <<'EOS' |
|
136 | $ rebasewithdag -b F -d Z <<'EOS' | |
137 | > F |
|
137 | > F | |
138 | > / \ |
|
138 | > / \ | |
139 | > E D |
|
139 | > E D | |
140 | > / / |
|
140 | > / / | |
141 | > Z C |
|
141 | > Z C | |
142 | > \ / |
|
142 | > \ / | |
143 | > B |
|
143 | > B | |
144 | > | |
|
144 | > | | |
145 | > A |
|
145 | > A | |
146 | > EOS |
|
146 | > EOS | |
147 | nothing to rebase |
|
147 | nothing to rebase | |
148 | [1] |
|
148 | [1] | |
149 |
|
149 | |||
150 | Multiple branching points caused by multiple bases (issue5420): |
|
150 | Multiple branching points caused by multiple bases (issue5420): | |
151 |
|
151 | |||
152 | $ rebasewithdag -b E1+E2+C2+B1 -d Z <<'EOS' |
|
152 | $ rebasewithdag -b E1+E2+C2+B1 -d Z <<'EOS' | |
153 | > Z E2 |
|
153 | > Z E2 | |
154 | > | / |
|
154 | > | / | |
155 | > F E1 C2 |
|
155 | > F E1 C2 | |
156 | > |/ / |
|
156 | > |/ / | |
157 | > E C1 B2 |
|
157 | > E C1 B2 | |
158 | > |/ / |
|
158 | > |/ / | |
159 | > C B1 |
|
159 | > C B1 | |
160 | > |/ |
|
160 | > |/ | |
161 | > B |
|
161 | > B | |
162 | > | |
|
162 | > | | |
163 | > A |
|
163 | > A | |
164 | > | |
|
164 | > | | |
165 | > R |
|
165 | > R | |
166 | > EOS |
|
166 | > EOS | |
167 | rebasing 3:a113dbaa660a "B1" (B1) |
|
167 | rebasing 3:a113dbaa660a "B1" (B1) | |
168 | rebasing 5:06ce7b1cc8c2 "B2" (B2) |
|
168 | rebasing 5:06ce7b1cc8c2 "B2" (B2) | |
169 | rebasing 6:0ac98cce32d3 "C1" (C1) |
|
169 | rebasing 6:0ac98cce32d3 "C1" (C1) | |
170 | rebasing 8:781512f5e33d "C2" (C2) |
|
170 | rebasing 8:781512f5e33d "C2" (C2) | |
171 | rebasing 9:428d8c18f641 "E1" (E1) |
|
171 | rebasing 9:428d8c18f641 "E1" (E1) | |
172 | rebasing 11:e1bf82f6b6df "E2" (E2) |
|
172 | rebasing 11:e1bf82f6b6df "E2" (E2) | |
173 | o 12: E2 |
|
173 | o 12: E2 | |
174 | | |
|
174 | | | |
175 | o 11: E1 |
|
175 | o 11: E1 | |
176 | | |
|
176 | | | |
177 | | o 10: C2 |
|
177 | | o 10: C2 | |
178 | | | |
|
178 | | | | |
179 | | o 9: C1 |
|
179 | | o 9: C1 | |
180 | |/ |
|
180 | |/ | |
181 | | o 8: B2 |
|
181 | | o 8: B2 | |
182 | | | |
|
182 | | | | |
183 | | o 7: B1 |
|
183 | | o 7: B1 | |
184 | |/ |
|
184 | |/ | |
185 | o 6: Z |
|
185 | o 6: Z | |
186 | | |
|
186 | | | |
187 | o 5: F |
|
187 | o 5: F | |
188 | | |
|
188 | | | |
189 | o 4: E |
|
189 | o 4: E | |
190 | | |
|
190 | | | |
191 | o 3: C |
|
191 | o 3: C | |
192 | | |
|
192 | | | |
193 | o 2: B |
|
193 | o 2: B | |
194 | | |
|
194 | | | |
195 | o 1: A |
|
195 | o 1: A | |
196 | | |
|
196 | | | |
197 | o 0: R |
|
197 | o 0: R | |
198 |
|
198 | |||
199 | Multiple branching points with multiple merges: |
|
199 | Multiple branching points with multiple merges: | |
200 |
|
200 | |||
201 | $ rebasewithdag -b G+P -d Z <<'EOS' |
|
201 | $ rebasewithdag -b G+P -d Z <<'EOS' | |
202 | > G H P |
|
202 | > G H P | |
203 | > |\ /| |\ |
|
203 | > |\ /| |\ | |
204 | > F E D M N |
|
204 | > F E D M N | |
205 | > \|/| /| |\ |
|
205 | > \|/| /| |\ | |
206 | > Z C B I J K L |
|
206 | > Z C B I J K L | |
207 | > \|/ |/ |/ |
|
207 | > \|/ |/ |/ | |
208 | > A A A |
|
208 | > A A A | |
209 | > EOS |
|
209 | > EOS | |
210 | rebasing 2:dc0947a82db8 "C" (C) |
|
210 | rebasing 2:dc0947a82db8 "C" (C) | |
211 |
rebasing 8: |
|
211 | rebasing 8:4e4f9194f9f1 "D" (D) | |
212 | rebasing 9:03ca77807e91 "E" (E) |
|
212 | rebasing 9:03ca77807e91 "E" (E) | |
213 | rebasing 10:afc707c82df0 "F" (F) |
|
213 | rebasing 10:afc707c82df0 "F" (F) | |
214 |
rebasing 13:0 |
|
214 | rebasing 13:690dfff91e9e "G" (G) | |
215 |
rebasing 14: |
|
215 | rebasing 14:2893b886bb10 "H" (H) | |
216 | rebasing 3:08ebfeb61bac "I" (I) |
|
216 | rebasing 3:08ebfeb61bac "I" (I) | |
217 | rebasing 4:a0a5005cec67 "J" (J) |
|
217 | rebasing 4:a0a5005cec67 "J" (J) | |
218 | rebasing 5:83780307a7e8 "K" (K) |
|
218 | rebasing 5:83780307a7e8 "K" (K) | |
219 | rebasing 6:e131637a1cb6 "L" (L) |
|
219 | rebasing 6:e131637a1cb6 "L" (L) | |
220 |
rebasing 11:d |
|
220 | rebasing 11:d1f6d0c3c7e4 "M" (M) | |
221 |
rebasing 12: |
|
221 | rebasing 12:7aaec6f81888 "N" (N) | |
222 |
rebasing 15: |
|
222 | rebasing 15:325bc8f1760d "P" (P tip) | |
223 | o 15: P |
|
223 | o 15: P | |
224 | |\ |
|
224 | |\ | |
225 | | o 14: N |
|
225 | | o 14: N | |
226 | | |\ |
|
226 | | |\ | |
227 | o \ \ 13: M |
|
227 | o \ \ 13: M | |
228 | |\ \ \ |
|
228 | |\ \ \ | |
229 | | | | o 12: L |
|
229 | | | | o 12: L | |
230 | | | | | |
|
230 | | | | | | |
231 | | | o | 11: K |
|
231 | | | o | 11: K | |
232 | | | |/ |
|
232 | | | |/ | |
233 | | o / 10: J |
|
233 | | o / 10: J | |
234 | | |/ |
|
234 | | |/ | |
235 | o / 9: I |
|
235 | o / 9: I | |
236 | |/ |
|
236 | |/ | |
237 | | o 8: H |
|
237 | | o 8: H | |
238 | | |\ |
|
238 | | |\ | |
239 | | | | o 7: G |
|
239 | | | | o 7: G | |
240 | | | |/| |
|
240 | | | |/| | |
241 | | | | o 6: F |
|
241 | | | | o 6: F | |
242 | | | | | |
|
242 | | | | | | |
243 | | | o | 5: E |
|
243 | | | o | 5: E | |
244 | | | |/ |
|
244 | | | |/ | |
245 | | o | 4: D |
|
245 | | o | 4: D | |
246 | | |\| |
|
246 | | |\| | |
247 | +---o 3: C |
|
247 | +---o 3: C | |
248 | | | |
|
248 | | | | |
249 | o | 2: Z |
|
249 | o | 2: Z | |
250 | | | |
|
250 | | | | |
251 | | o 1: B |
|
251 | | o 1: B | |
252 | |/ |
|
252 | |/ | |
253 | o 0: A |
|
253 | o 0: A | |
254 |
|
254 | |||
255 | Slightly more complex merge case (mentioned in https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-November/091074.html): |
|
255 | Slightly more complex merge case (mentioned in https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-November/091074.html): | |
256 |
|
256 | |||
257 | $ rebasewithdag -b A3+B3 -d Z <<'EOF' |
|
257 | $ rebasewithdag -b A3+B3 -d Z <<'EOF' | |
258 | > Z C1 A3 B3 |
|
258 | > Z C1 A3 B3 | |
259 | > | / / \ / \ |
|
259 | > | / / \ / \ | |
260 | > M3 C0 A1 A2 B1 B2 |
|
260 | > M3 C0 A1 A2 B1 B2 | |
261 | > | / | | | | |
|
261 | > | / | | | | | |
262 | > M2 M1 C1 C1 M3 |
|
262 | > M2 M1 C1 C1 M3 | |
263 | > | |
|
263 | > | | |
264 | > M1 |
|
264 | > M1 | |
265 | > | |
|
265 | > | | |
266 | > M0 |
|
266 | > M0 | |
267 | > EOF |
|
267 | > EOF | |
268 | rebasing 4:8817fae53c94 "C0" (C0) |
|
268 | rebasing 4:8817fae53c94 "C0" (C0) | |
269 | rebasing 6:06ca5dfe3b5b "B2" (B2) |
|
269 | rebasing 6:06ca5dfe3b5b "B2" (B2) | |
270 | rebasing 7:73508237b032 "C1" (C1) |
|
270 | rebasing 7:73508237b032 "C1" (C1) | |
271 | rebasing 9:fdb955e2faed "A2" (A2) |
|
271 | rebasing 9:fdb955e2faed "A2" (A2) | |
272 |
rebasing 11: |
|
272 | rebasing 11:4e449bd1a643 "A3" (A3) | |
273 | rebasing 10:0a33b0519128 "B1" (B1) |
|
273 | rebasing 10:0a33b0519128 "B1" (B1) | |
274 |
rebasing 12: |
|
274 | rebasing 12:209327807c3a "B3" (B3 tip) | |
275 | o 12: B3 |
|
275 | o 12: B3 | |
276 | |\ |
|
276 | |\ | |
277 | | o 11: B1 |
|
277 | | o 11: B1 | |
278 | | | |
|
278 | | | | |
279 | | | o 10: A3 |
|
279 | | | o 10: A3 | |
280 | | | |\ |
|
280 | | | |\ | |
281 | | +---o 9: A2 |
|
281 | | +---o 9: A2 | |
282 | | | | |
|
282 | | | | | |
283 | | o | 8: C1 |
|
283 | | o | 8: C1 | |
284 | | | | |
|
284 | | | | | |
285 | o | | 7: B2 |
|
285 | o | | 7: B2 | |
286 | | | | |
|
286 | | | | | |
287 | | o | 6: C0 |
|
287 | | o | 6: C0 | |
288 | |/ / |
|
288 | |/ / | |
289 | o | 5: Z |
|
289 | o | 5: Z | |
290 | | | |
|
290 | | | | |
291 | o | 4: M3 |
|
291 | o | 4: M3 | |
292 | | | |
|
292 | | | | |
293 | o | 3: M2 |
|
293 | o | 3: M2 | |
294 | | | |
|
294 | | | | |
295 | | o 2: A1 |
|
295 | | o 2: A1 | |
296 | |/ |
|
296 | |/ | |
297 | o 1: M1 |
|
297 | o 1: M1 | |
298 | | |
|
298 | | | |
299 | o 0: M0 |
|
299 | o 0: M0 | |
300 |
|
300 | |||
301 | Disconnected graph: |
|
301 | Disconnected graph: | |
302 |
|
302 | |||
303 | $ rebasewithdag -b B -d Z <<'EOS' |
|
303 | $ rebasewithdag -b B -d Z <<'EOS' | |
304 | > B |
|
304 | > B | |
305 | > | |
|
305 | > | | |
306 | > Z A |
|
306 | > Z A | |
307 | > EOS |
|
307 | > EOS | |
308 | nothing to rebase from 112478962961 to 48b9aae0607f |
|
308 | nothing to rebase from 112478962961 to 48b9aae0607f | |
309 | [1] |
|
309 | [1] | |
310 |
|
310 | |||
311 | Multiple roots. Roots are ancestors of dest: |
|
311 | Multiple roots. Roots are ancestors of dest: | |
312 |
|
312 | |||
313 | $ rebasewithdag -b B+D -d Z <<'EOF' |
|
313 | $ rebasewithdag -b B+D -d Z <<'EOF' | |
314 | > D Z B |
|
314 | > D Z B | |
315 | > \|\| |
|
315 | > \|\| | |
316 | > C A |
|
316 | > C A | |
317 | > EOF |
|
317 | > EOF | |
318 | rebasing 2:112478962961 "B" (B) |
|
318 | rebasing 2:112478962961 "B" (B) | |
319 | rebasing 3:b70f76719894 "D" (D) |
|
319 | rebasing 3:b70f76719894 "D" (D) | |
320 | o 4: D |
|
320 | o 4: D | |
321 | | |
|
321 | | | |
322 | | o 3: B |
|
322 | | o 3: B | |
323 | |/ |
|
323 | |/ | |
324 | o 2: Z |
|
324 | o 2: Z | |
325 | |\ |
|
325 | |\ | |
326 | | o 1: C |
|
326 | | o 1: C | |
327 | | |
|
327 | | | |
328 | o 0: A |
|
328 | o 0: A | |
329 |
|
329 | |||
330 | Multiple roots. One root is not an ancestor of dest: |
|
330 | Multiple roots. One root is not an ancestor of dest: | |
331 |
|
331 | |||
332 | $ rebasewithdag -b B+D -d Z <<'EOF' |
|
332 | $ rebasewithdag -b B+D -d Z <<'EOF' | |
333 | > Z B D |
|
333 | > Z B D | |
334 | > \|\| |
|
334 | > \|\| | |
335 | > A C |
|
335 | > A C | |
336 | > EOF |
|
336 | > EOF | |
337 |
nothing to rebase from |
|
337 | nothing to rebase from f675d5a1c6a4+b70f76719894 to 262e37e34f63 | |
338 | [1] |
|
338 | [1] | |
339 |
|
339 | |||
340 | Multiple roots. One root is not an ancestor of dest. Select using a merge: |
|
340 | Multiple roots. One root is not an ancestor of dest. Select using a merge: | |
341 |
|
341 | |||
342 | $ rebasewithdag -b E -d Z <<'EOF' |
|
342 | $ rebasewithdag -b E -d Z <<'EOF' | |
343 | > E |
|
343 | > E | |
344 | > |\ |
|
344 | > |\ | |
345 | > Z B D |
|
345 | > Z B D | |
346 | > \|\| |
|
346 | > \|\| | |
347 | > A C |
|
347 | > A C | |
348 | > EOF |
|
348 | > EOF | |
349 |
rebasing 2: |
|
349 | rebasing 2:f675d5a1c6a4 "B" (B) | |
350 |
rebasing 5: |
|
350 | rebasing 5:f68696fe6af8 "E" (E tip) | |
351 | o 5: E |
|
351 | o 5: E | |
352 | |\ |
|
352 | |\ | |
353 | | o 4: B |
|
353 | | o 4: B | |
354 | | |\ |
|
354 | | |\ | |
355 | | | o 3: Z |
|
355 | | | o 3: Z | |
356 | | | | |
|
356 | | | | | |
357 | o | | 2: D |
|
357 | o | | 2: D | |
358 | |/ / |
|
358 | |/ / | |
359 | o / 1: C |
|
359 | o / 1: C | |
360 | / |
|
360 | / | |
361 | o 0: A |
|
361 | o 0: A | |
362 |
|
362 | |||
363 | Multiple roots. Two children share two parents while dest has only one parent: |
|
363 | Multiple roots. Two children share two parents while dest has only one parent: | |
364 |
|
364 | |||
365 | $ rebasewithdag -b B+D -d Z <<'EOF' |
|
365 | $ rebasewithdag -b B+D -d Z <<'EOF' | |
366 | > Z B D |
|
366 | > Z B D | |
367 | > \|\|\ |
|
367 | > \|\|\ | |
368 | > A C A |
|
368 | > A C A | |
369 | > EOF |
|
369 | > EOF | |
370 |
rebasing 2: |
|
370 | rebasing 2:f675d5a1c6a4 "B" (B) | |
371 |
rebasing 3: |
|
371 | rebasing 3:c2a779e13b56 "D" (D) | |
372 | o 4: D |
|
372 | o 4: D | |
373 | |\ |
|
373 | |\ | |
374 | +---o 3: B |
|
374 | +---o 3: B | |
375 | | |/ |
|
375 | | |/ | |
376 | | o 2: Z |
|
376 | | o 2: Z | |
377 | | | |
|
377 | | | | |
378 | o | 1: C |
|
378 | o | 1: C | |
379 | / |
|
379 | / | |
380 | o 0: A |
|
380 | o 0: A | |
381 |
|
381 |
@@ -1,1099 +1,1099 b'' | |||||
1 | $ echo "[format]" >> $HGRCPATH |
|
1 | $ echo "[format]" >> $HGRCPATH | |
2 | $ echo "usegeneraldelta=yes" >> $HGRCPATH |
|
2 | $ echo "usegeneraldelta=yes" >> $HGRCPATH | |
3 | $ echo "[extensions]" >> $HGRCPATH |
|
3 | $ echo "[extensions]" >> $HGRCPATH | |
4 | $ echo "strip=" >> $HGRCPATH |
|
4 | $ echo "strip=" >> $HGRCPATH | |
5 | $ echo "drawdag=$TESTDIR/drawdag.py" >> $HGRCPATH |
|
5 | $ echo "drawdag=$TESTDIR/drawdag.py" >> $HGRCPATH | |
6 |
|
6 | |||
7 | $ restore() { |
|
7 | $ restore() { | |
8 | > hg unbundle -q .hg/strip-backup/* |
|
8 | > hg unbundle -q .hg/strip-backup/* | |
9 | > rm .hg/strip-backup/* |
|
9 | > rm .hg/strip-backup/* | |
10 | > } |
|
10 | > } | |
11 | $ teststrip() { |
|
11 | $ teststrip() { | |
12 | > hg up -C $1 |
|
12 | > hg up -C $1 | |
13 | > echo % before update $1, strip $2 |
|
13 | > echo % before update $1, strip $2 | |
14 | > hg parents |
|
14 | > hg parents | |
15 | > hg --traceback strip $2 |
|
15 | > hg --traceback strip $2 | |
16 | > echo % after update $1, strip $2 |
|
16 | > echo % after update $1, strip $2 | |
17 | > hg parents |
|
17 | > hg parents | |
18 | > restore |
|
18 | > restore | |
19 | > } |
|
19 | > } | |
20 |
|
20 | |||
21 | $ hg init test |
|
21 | $ hg init test | |
22 | $ cd test |
|
22 | $ cd test | |
23 |
|
23 | |||
24 | $ echo foo > bar |
|
24 | $ echo foo > bar | |
25 | $ hg ci -Ama |
|
25 | $ hg ci -Ama | |
26 | adding bar |
|
26 | adding bar | |
27 |
|
27 | |||
28 | $ echo more >> bar |
|
28 | $ echo more >> bar | |
29 | $ hg ci -Amb |
|
29 | $ hg ci -Amb | |
30 |
|
30 | |||
31 | $ echo blah >> bar |
|
31 | $ echo blah >> bar | |
32 | $ hg ci -Amc |
|
32 | $ hg ci -Amc | |
33 |
|
33 | |||
34 | $ hg up 1 |
|
34 | $ hg up 1 | |
35 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
35 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
36 | $ echo blah >> bar |
|
36 | $ echo blah >> bar | |
37 | $ hg ci -Amd |
|
37 | $ hg ci -Amd | |
38 | created new head |
|
38 | created new head | |
39 |
|
39 | |||
40 | $ echo final >> bar |
|
40 | $ echo final >> bar | |
41 | $ hg ci -Ame |
|
41 | $ hg ci -Ame | |
42 |
|
42 | |||
43 | $ hg log |
|
43 | $ hg log | |
44 | changeset: 4:443431ffac4f |
|
44 | changeset: 4:443431ffac4f | |
45 | tag: tip |
|
45 | tag: tip | |
46 | user: test |
|
46 | user: test | |
47 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
47 | date: Thu Jan 01 00:00:00 1970 +0000 | |
48 | summary: e |
|
48 | summary: e | |
49 |
|
49 | |||
50 | changeset: 3:65bd5f99a4a3 |
|
50 | changeset: 3:65bd5f99a4a3 | |
51 | parent: 1:ef3a871183d7 |
|
51 | parent: 1:ef3a871183d7 | |
52 | user: test |
|
52 | user: test | |
53 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
53 | date: Thu Jan 01 00:00:00 1970 +0000 | |
54 | summary: d |
|
54 | summary: d | |
55 |
|
55 | |||
56 | changeset: 2:264128213d29 |
|
56 | changeset: 2:264128213d29 | |
57 | user: test |
|
57 | user: test | |
58 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
58 | date: Thu Jan 01 00:00:00 1970 +0000 | |
59 | summary: c |
|
59 | summary: c | |
60 |
|
60 | |||
61 | changeset: 1:ef3a871183d7 |
|
61 | changeset: 1:ef3a871183d7 | |
62 | user: test |
|
62 | user: test | |
63 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
63 | date: Thu Jan 01 00:00:00 1970 +0000 | |
64 | summary: b |
|
64 | summary: b | |
65 |
|
65 | |||
66 | changeset: 0:9ab35a2d17cb |
|
66 | changeset: 0:9ab35a2d17cb | |
67 | user: test |
|
67 | user: test | |
68 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
68 | date: Thu Jan 01 00:00:00 1970 +0000 | |
69 | summary: a |
|
69 | summary: a | |
70 |
|
70 | |||
71 |
|
71 | |||
72 | $ teststrip 4 4 |
|
72 | $ teststrip 4 4 | |
73 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
73 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
74 | % before update 4, strip 4 |
|
74 | % before update 4, strip 4 | |
75 | changeset: 4:443431ffac4f |
|
75 | changeset: 4:443431ffac4f | |
76 | tag: tip |
|
76 | tag: tip | |
77 | user: test |
|
77 | user: test | |
78 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
78 | date: Thu Jan 01 00:00:00 1970 +0000 | |
79 | summary: e |
|
79 | summary: e | |
80 |
|
80 | |||
81 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
81 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
82 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
82 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
83 | % after update 4, strip 4 |
|
83 | % after update 4, strip 4 | |
84 | changeset: 3:65bd5f99a4a3 |
|
84 | changeset: 3:65bd5f99a4a3 | |
85 | tag: tip |
|
85 | tag: tip | |
86 | parent: 1:ef3a871183d7 |
|
86 | parent: 1:ef3a871183d7 | |
87 | user: test |
|
87 | user: test | |
88 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
88 | date: Thu Jan 01 00:00:00 1970 +0000 | |
89 | summary: d |
|
89 | summary: d | |
90 |
|
90 | |||
91 | $ teststrip 4 3 |
|
91 | $ teststrip 4 3 | |
92 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
92 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
93 | % before update 4, strip 3 |
|
93 | % before update 4, strip 3 | |
94 | changeset: 4:443431ffac4f |
|
94 | changeset: 4:443431ffac4f | |
95 | tag: tip |
|
95 | tag: tip | |
96 | user: test |
|
96 | user: test | |
97 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
97 | date: Thu Jan 01 00:00:00 1970 +0000 | |
98 | summary: e |
|
98 | summary: e | |
99 |
|
99 | |||
100 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
100 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
101 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
101 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
102 | % after update 4, strip 3 |
|
102 | % after update 4, strip 3 | |
103 | changeset: 1:ef3a871183d7 |
|
103 | changeset: 1:ef3a871183d7 | |
104 | user: test |
|
104 | user: test | |
105 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
105 | date: Thu Jan 01 00:00:00 1970 +0000 | |
106 | summary: b |
|
106 | summary: b | |
107 |
|
107 | |||
108 | $ teststrip 1 4 |
|
108 | $ teststrip 1 4 | |
109 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
109 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
110 | % before update 1, strip 4 |
|
110 | % before update 1, strip 4 | |
111 | changeset: 1:ef3a871183d7 |
|
111 | changeset: 1:ef3a871183d7 | |
112 | user: test |
|
112 | user: test | |
113 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
113 | date: Thu Jan 01 00:00:00 1970 +0000 | |
114 | summary: b |
|
114 | summary: b | |
115 |
|
115 | |||
116 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
116 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
117 | % after update 1, strip 4 |
|
117 | % after update 1, strip 4 | |
118 | changeset: 1:ef3a871183d7 |
|
118 | changeset: 1:ef3a871183d7 | |
119 | user: test |
|
119 | user: test | |
120 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
120 | date: Thu Jan 01 00:00:00 1970 +0000 | |
121 | summary: b |
|
121 | summary: b | |
122 |
|
122 | |||
123 | $ teststrip 4 2 |
|
123 | $ teststrip 4 2 | |
124 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
124 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
125 | % before update 4, strip 2 |
|
125 | % before update 4, strip 2 | |
126 | changeset: 4:443431ffac4f |
|
126 | changeset: 4:443431ffac4f | |
127 | tag: tip |
|
127 | tag: tip | |
128 | user: test |
|
128 | user: test | |
129 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
129 | date: Thu Jan 01 00:00:00 1970 +0000 | |
130 | summary: e |
|
130 | summary: e | |
131 |
|
131 | |||
132 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
132 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
133 | % after update 4, strip 2 |
|
133 | % after update 4, strip 2 | |
134 | changeset: 3:443431ffac4f |
|
134 | changeset: 3:443431ffac4f | |
135 | tag: tip |
|
135 | tag: tip | |
136 | user: test |
|
136 | user: test | |
137 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
137 | date: Thu Jan 01 00:00:00 1970 +0000 | |
138 | summary: e |
|
138 | summary: e | |
139 |
|
139 | |||
140 | $ teststrip 4 1 |
|
140 | $ teststrip 4 1 | |
141 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
141 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
142 | % before update 4, strip 1 |
|
142 | % before update 4, strip 1 | |
143 | changeset: 4:264128213d29 |
|
143 | changeset: 4:264128213d29 | |
144 | tag: tip |
|
144 | tag: tip | |
145 | parent: 1:ef3a871183d7 |
|
145 | parent: 1:ef3a871183d7 | |
146 | user: test |
|
146 | user: test | |
147 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
147 | date: Thu Jan 01 00:00:00 1970 +0000 | |
148 | summary: c |
|
148 | summary: c | |
149 |
|
149 | |||
150 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
150 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
151 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
151 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
152 | % after update 4, strip 1 |
|
152 | % after update 4, strip 1 | |
153 | changeset: 0:9ab35a2d17cb |
|
153 | changeset: 0:9ab35a2d17cb | |
154 | tag: tip |
|
154 | tag: tip | |
155 | user: test |
|
155 | user: test | |
156 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
156 | date: Thu Jan 01 00:00:00 1970 +0000 | |
157 | summary: a |
|
157 | summary: a | |
158 |
|
158 | |||
159 | $ teststrip null 4 |
|
159 | $ teststrip null 4 | |
160 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved |
|
160 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
161 | % before update null, strip 4 |
|
161 | % before update null, strip 4 | |
162 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
162 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
163 | % after update null, strip 4 |
|
163 | % after update null, strip 4 | |
164 |
|
164 | |||
165 | $ hg log |
|
165 | $ hg log | |
166 | changeset: 4:264128213d29 |
|
166 | changeset: 4:264128213d29 | |
167 | tag: tip |
|
167 | tag: tip | |
168 | parent: 1:ef3a871183d7 |
|
168 | parent: 1:ef3a871183d7 | |
169 | user: test |
|
169 | user: test | |
170 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
170 | date: Thu Jan 01 00:00:00 1970 +0000 | |
171 | summary: c |
|
171 | summary: c | |
172 |
|
172 | |||
173 | changeset: 3:443431ffac4f |
|
173 | changeset: 3:443431ffac4f | |
174 | user: test |
|
174 | user: test | |
175 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
175 | date: Thu Jan 01 00:00:00 1970 +0000 | |
176 | summary: e |
|
176 | summary: e | |
177 |
|
177 | |||
178 | changeset: 2:65bd5f99a4a3 |
|
178 | changeset: 2:65bd5f99a4a3 | |
179 | user: test |
|
179 | user: test | |
180 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
180 | date: Thu Jan 01 00:00:00 1970 +0000 | |
181 | summary: d |
|
181 | summary: d | |
182 |
|
182 | |||
183 | changeset: 1:ef3a871183d7 |
|
183 | changeset: 1:ef3a871183d7 | |
184 | user: test |
|
184 | user: test | |
185 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
185 | date: Thu Jan 01 00:00:00 1970 +0000 | |
186 | summary: b |
|
186 | summary: b | |
187 |
|
187 | |||
188 | changeset: 0:9ab35a2d17cb |
|
188 | changeset: 0:9ab35a2d17cb | |
189 | user: test |
|
189 | user: test | |
190 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
190 | date: Thu Jan 01 00:00:00 1970 +0000 | |
191 | summary: a |
|
191 | summary: a | |
192 |
|
192 | |||
193 | $ hg up -C 4 |
|
193 | $ hg up -C 4 | |
194 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
194 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
195 | $ hg parents |
|
195 | $ hg parents | |
196 | changeset: 4:264128213d29 |
|
196 | changeset: 4:264128213d29 | |
197 | tag: tip |
|
197 | tag: tip | |
198 | parent: 1:ef3a871183d7 |
|
198 | parent: 1:ef3a871183d7 | |
199 | user: test |
|
199 | user: test | |
200 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
200 | date: Thu Jan 01 00:00:00 1970 +0000 | |
201 | summary: c |
|
201 | summary: c | |
202 |
|
202 | |||
203 |
|
203 | |||
204 | $ hg --traceback strip 4 |
|
204 | $ hg --traceback strip 4 | |
205 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
205 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
206 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/264128213d29-0b39d6bf-backup.hg (glob) |
|
206 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/264128213d29-0b39d6bf-backup.hg (glob) | |
207 | $ hg parents |
|
207 | $ hg parents | |
208 | changeset: 1:ef3a871183d7 |
|
208 | changeset: 1:ef3a871183d7 | |
209 | user: test |
|
209 | user: test | |
210 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
210 | date: Thu Jan 01 00:00:00 1970 +0000 | |
211 | summary: b |
|
211 | summary: b | |
212 |
|
212 | |||
213 | $ hg debugbundle .hg/strip-backup/* |
|
213 | $ hg debugbundle .hg/strip-backup/* | |
214 | Stream params: sortdict([('Compression', 'BZ')]) |
|
214 | Stream params: sortdict([('Compression', 'BZ')]) | |
215 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '1')])" |
|
215 | changegroup -- "sortdict([('version', '02'), ('nbchanges', '1')])" | |
216 | 264128213d290d868c54642d13aeaa3675551a78 |
|
216 | 264128213d290d868c54642d13aeaa3675551a78 | |
217 | phase-heads -- 'sortdict()' |
|
217 | phase-heads -- 'sortdict()' | |
218 | 264128213d290d868c54642d13aeaa3675551a78 draft |
|
218 | 264128213d290d868c54642d13aeaa3675551a78 draft | |
219 | $ hg pull .hg/strip-backup/* |
|
219 | $ hg pull .hg/strip-backup/* | |
220 | pulling from .hg/strip-backup/264128213d29-0b39d6bf-backup.hg |
|
220 | pulling from .hg/strip-backup/264128213d29-0b39d6bf-backup.hg | |
221 | searching for changes |
|
221 | searching for changes | |
222 | adding changesets |
|
222 | adding changesets | |
223 | adding manifests |
|
223 | adding manifests | |
224 | adding file changes |
|
224 | adding file changes | |
225 | added 1 changesets with 0 changes to 0 files (+1 heads) |
|
225 | added 1 changesets with 0 changes to 0 files (+1 heads) | |
226 | (run 'hg heads' to see heads, 'hg merge' to merge) |
|
226 | (run 'hg heads' to see heads, 'hg merge' to merge) | |
227 | $ rm .hg/strip-backup/* |
|
227 | $ rm .hg/strip-backup/* | |
228 | $ hg log --graph |
|
228 | $ hg log --graph | |
229 | o changeset: 4:264128213d29 |
|
229 | o changeset: 4:264128213d29 | |
230 | | tag: tip |
|
230 | | tag: tip | |
231 | | parent: 1:ef3a871183d7 |
|
231 | | parent: 1:ef3a871183d7 | |
232 | | user: test |
|
232 | | user: test | |
233 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
233 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
234 | | summary: c |
|
234 | | summary: c | |
235 | | |
|
235 | | | |
236 | | o changeset: 3:443431ffac4f |
|
236 | | o changeset: 3:443431ffac4f | |
237 | | | user: test |
|
237 | | | user: test | |
238 | | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
238 | | | date: Thu Jan 01 00:00:00 1970 +0000 | |
239 | | | summary: e |
|
239 | | | summary: e | |
240 | | | |
|
240 | | | | |
241 | | o changeset: 2:65bd5f99a4a3 |
|
241 | | o changeset: 2:65bd5f99a4a3 | |
242 | |/ user: test |
|
242 | |/ user: test | |
243 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
243 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
244 | | summary: d |
|
244 | | summary: d | |
245 | | |
|
245 | | | |
246 | @ changeset: 1:ef3a871183d7 |
|
246 | @ changeset: 1:ef3a871183d7 | |
247 | | user: test |
|
247 | | user: test | |
248 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
248 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
249 | | summary: b |
|
249 | | summary: b | |
250 | | |
|
250 | | | |
251 | o changeset: 0:9ab35a2d17cb |
|
251 | o changeset: 0:9ab35a2d17cb | |
252 | user: test |
|
252 | user: test | |
253 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
253 | date: Thu Jan 01 00:00:00 1970 +0000 | |
254 | summary: a |
|
254 | summary: a | |
255 |
|
255 | |||
256 | $ hg up -C 2 |
|
256 | $ hg up -C 2 | |
257 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
257 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
258 | $ hg merge 4 |
|
258 | $ hg merge 4 | |
259 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
259 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
260 | (branch merge, don't forget to commit) |
|
260 | (branch merge, don't forget to commit) | |
261 |
|
261 | |||
262 | before strip of merge parent |
|
262 | before strip of merge parent | |
263 |
|
263 | |||
264 | $ hg parents |
|
264 | $ hg parents | |
265 | changeset: 2:65bd5f99a4a3 |
|
265 | changeset: 2:65bd5f99a4a3 | |
266 | user: test |
|
266 | user: test | |
267 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
267 | date: Thu Jan 01 00:00:00 1970 +0000 | |
268 | summary: d |
|
268 | summary: d | |
269 |
|
269 | |||
270 | changeset: 4:264128213d29 |
|
270 | changeset: 4:264128213d29 | |
271 | tag: tip |
|
271 | tag: tip | |
272 | parent: 1:ef3a871183d7 |
|
272 | parent: 1:ef3a871183d7 | |
273 | user: test |
|
273 | user: test | |
274 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
274 | date: Thu Jan 01 00:00:00 1970 +0000 | |
275 | summary: c |
|
275 | summary: c | |
276 |
|
276 | |||
277 | $ hg strip 4 |
|
277 | $ hg strip 4 | |
278 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
278 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
279 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
279 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
280 |
|
280 | |||
281 | after strip of merge parent |
|
281 | after strip of merge parent | |
282 |
|
282 | |||
283 | $ hg parents |
|
283 | $ hg parents | |
284 | changeset: 1:ef3a871183d7 |
|
284 | changeset: 1:ef3a871183d7 | |
285 | user: test |
|
285 | user: test | |
286 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
286 | date: Thu Jan 01 00:00:00 1970 +0000 | |
287 | summary: b |
|
287 | summary: b | |
288 |
|
288 | |||
289 | $ restore |
|
289 | $ restore | |
290 |
|
290 | |||
291 | $ hg up |
|
291 | $ hg up | |
292 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
292 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
293 | updated to "264128213d29: c" |
|
293 | updated to "264128213d29: c" | |
294 | 1 other heads for branch "default" |
|
294 | 1 other heads for branch "default" | |
295 | $ hg log -G |
|
295 | $ hg log -G | |
296 | @ changeset: 4:264128213d29 |
|
296 | @ changeset: 4:264128213d29 | |
297 | | tag: tip |
|
297 | | tag: tip | |
298 | | parent: 1:ef3a871183d7 |
|
298 | | parent: 1:ef3a871183d7 | |
299 | | user: test |
|
299 | | user: test | |
300 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
300 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
301 | | summary: c |
|
301 | | summary: c | |
302 | | |
|
302 | | | |
303 | | o changeset: 3:443431ffac4f |
|
303 | | o changeset: 3:443431ffac4f | |
304 | | | user: test |
|
304 | | | user: test | |
305 | | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
305 | | | date: Thu Jan 01 00:00:00 1970 +0000 | |
306 | | | summary: e |
|
306 | | | summary: e | |
307 | | | |
|
307 | | | | |
308 | | o changeset: 2:65bd5f99a4a3 |
|
308 | | o changeset: 2:65bd5f99a4a3 | |
309 | |/ user: test |
|
309 | |/ user: test | |
310 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
310 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
311 | | summary: d |
|
311 | | summary: d | |
312 | | |
|
312 | | | |
313 | o changeset: 1:ef3a871183d7 |
|
313 | o changeset: 1:ef3a871183d7 | |
314 | | user: test |
|
314 | | user: test | |
315 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
315 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
316 | | summary: b |
|
316 | | summary: b | |
317 | | |
|
317 | | | |
318 | o changeset: 0:9ab35a2d17cb |
|
318 | o changeset: 0:9ab35a2d17cb | |
319 | user: test |
|
319 | user: test | |
320 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
320 | date: Thu Jan 01 00:00:00 1970 +0000 | |
321 | summary: a |
|
321 | summary: a | |
322 |
|
322 | |||
323 |
|
323 | |||
324 | 2 is parent of 3, only one strip should happen |
|
324 | 2 is parent of 3, only one strip should happen | |
325 |
|
325 | |||
326 | $ hg strip "roots(2)" 3 |
|
326 | $ hg strip "roots(2)" 3 | |
327 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
327 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
328 | $ hg log -G |
|
328 | $ hg log -G | |
329 | @ changeset: 2:264128213d29 |
|
329 | @ changeset: 2:264128213d29 | |
330 | | tag: tip |
|
330 | | tag: tip | |
331 | | user: test |
|
331 | | user: test | |
332 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
332 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
333 | | summary: c |
|
333 | | summary: c | |
334 | | |
|
334 | | | |
335 | o changeset: 1:ef3a871183d7 |
|
335 | o changeset: 1:ef3a871183d7 | |
336 | | user: test |
|
336 | | user: test | |
337 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
337 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
338 | | summary: b |
|
338 | | summary: b | |
339 | | |
|
339 | | | |
340 | o changeset: 0:9ab35a2d17cb |
|
340 | o changeset: 0:9ab35a2d17cb | |
341 | user: test |
|
341 | user: test | |
342 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
342 | date: Thu Jan 01 00:00:00 1970 +0000 | |
343 | summary: a |
|
343 | summary: a | |
344 |
|
344 | |||
345 | $ restore |
|
345 | $ restore | |
346 | $ hg log -G |
|
346 | $ hg log -G | |
347 | o changeset: 4:443431ffac4f |
|
347 | o changeset: 4:443431ffac4f | |
348 | | tag: tip |
|
348 | | tag: tip | |
349 | | user: test |
|
349 | | user: test | |
350 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
350 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
351 | | summary: e |
|
351 | | summary: e | |
352 | | |
|
352 | | | |
353 | o changeset: 3:65bd5f99a4a3 |
|
353 | o changeset: 3:65bd5f99a4a3 | |
354 | | parent: 1:ef3a871183d7 |
|
354 | | parent: 1:ef3a871183d7 | |
355 | | user: test |
|
355 | | user: test | |
356 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
356 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
357 | | summary: d |
|
357 | | summary: d | |
358 | | |
|
358 | | | |
359 | | @ changeset: 2:264128213d29 |
|
359 | | @ changeset: 2:264128213d29 | |
360 | |/ user: test |
|
360 | |/ user: test | |
361 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
361 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
362 | | summary: c |
|
362 | | summary: c | |
363 | | |
|
363 | | | |
364 | o changeset: 1:ef3a871183d7 |
|
364 | o changeset: 1:ef3a871183d7 | |
365 | | user: test |
|
365 | | user: test | |
366 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
366 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
367 | | summary: b |
|
367 | | summary: b | |
368 | | |
|
368 | | | |
369 | o changeset: 0:9ab35a2d17cb |
|
369 | o changeset: 0:9ab35a2d17cb | |
370 | user: test |
|
370 | user: test | |
371 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
371 | date: Thu Jan 01 00:00:00 1970 +0000 | |
372 | summary: a |
|
372 | summary: a | |
373 |
|
373 | |||
374 | Failed hook while applying "saveheads" bundle. |
|
374 | Failed hook while applying "saveheads" bundle. | |
375 |
|
375 | |||
376 | $ hg strip 2 --config hooks.pretxnchangegroup.bad=false |
|
376 | $ hg strip 2 --config hooks.pretxnchangegroup.bad=false | |
377 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
377 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
378 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
378 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
379 | transaction abort! |
|
379 | transaction abort! | |
380 | rollback completed |
|
380 | rollback completed | |
381 | strip failed, backup bundle stored in '$TESTTMP/test/.hg/strip-backup/*-backup.hg' (glob) |
|
381 | strip failed, backup bundle stored in '$TESTTMP/test/.hg/strip-backup/*-backup.hg' (glob) | |
382 | strip failed, unrecovered changes stored in '$TESTTMP/test/.hg/strip-backup/*-temp.hg' (glob) |
|
382 | strip failed, unrecovered changes stored in '$TESTTMP/test/.hg/strip-backup/*-temp.hg' (glob) | |
383 | (fix the problem, then recover the changesets with "hg unbundle '$TESTTMP/test/.hg/strip-backup/*-temp.hg'") (glob) |
|
383 | (fix the problem, then recover the changesets with "hg unbundle '$TESTTMP/test/.hg/strip-backup/*-temp.hg'") (glob) | |
384 | abort: pretxnchangegroup.bad hook exited with status 1 |
|
384 | abort: pretxnchangegroup.bad hook exited with status 1 | |
385 | [255] |
|
385 | [255] | |
386 | $ restore |
|
386 | $ restore | |
387 | $ hg log -G |
|
387 | $ hg log -G | |
388 | o changeset: 4:443431ffac4f |
|
388 | o changeset: 4:443431ffac4f | |
389 | | tag: tip |
|
389 | | tag: tip | |
390 | | user: test |
|
390 | | user: test | |
391 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
391 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
392 | | summary: e |
|
392 | | summary: e | |
393 | | |
|
393 | | | |
394 | o changeset: 3:65bd5f99a4a3 |
|
394 | o changeset: 3:65bd5f99a4a3 | |
395 | | parent: 1:ef3a871183d7 |
|
395 | | parent: 1:ef3a871183d7 | |
396 | | user: test |
|
396 | | user: test | |
397 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
397 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
398 | | summary: d |
|
398 | | summary: d | |
399 | | |
|
399 | | | |
400 | | o changeset: 2:264128213d29 |
|
400 | | o changeset: 2:264128213d29 | |
401 | |/ user: test |
|
401 | |/ user: test | |
402 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
402 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
403 | | summary: c |
|
403 | | summary: c | |
404 | | |
|
404 | | | |
405 | @ changeset: 1:ef3a871183d7 |
|
405 | @ changeset: 1:ef3a871183d7 | |
406 | | user: test |
|
406 | | user: test | |
407 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
407 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
408 | | summary: b |
|
408 | | summary: b | |
409 | | |
|
409 | | | |
410 | o changeset: 0:9ab35a2d17cb |
|
410 | o changeset: 0:9ab35a2d17cb | |
411 | user: test |
|
411 | user: test | |
412 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
412 | date: Thu Jan 01 00:00:00 1970 +0000 | |
413 | summary: a |
|
413 | summary: a | |
414 |
|
414 | |||
415 |
|
415 | |||
416 | 2 different branches: 2 strips |
|
416 | 2 different branches: 2 strips | |
417 |
|
417 | |||
418 | $ hg strip 2 4 |
|
418 | $ hg strip 2 4 | |
419 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
419 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
420 | $ hg log -G |
|
420 | $ hg log -G | |
421 | o changeset: 2:65bd5f99a4a3 |
|
421 | o changeset: 2:65bd5f99a4a3 | |
422 | | tag: tip |
|
422 | | tag: tip | |
423 | | user: test |
|
423 | | user: test | |
424 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
424 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
425 | | summary: d |
|
425 | | summary: d | |
426 | | |
|
426 | | | |
427 | @ changeset: 1:ef3a871183d7 |
|
427 | @ changeset: 1:ef3a871183d7 | |
428 | | user: test |
|
428 | | user: test | |
429 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
429 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
430 | | summary: b |
|
430 | | summary: b | |
431 | | |
|
431 | | | |
432 | o changeset: 0:9ab35a2d17cb |
|
432 | o changeset: 0:9ab35a2d17cb | |
433 | user: test |
|
433 | user: test | |
434 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
434 | date: Thu Jan 01 00:00:00 1970 +0000 | |
435 | summary: a |
|
435 | summary: a | |
436 |
|
436 | |||
437 | $ restore |
|
437 | $ restore | |
438 |
|
438 | |||
439 | 2 different branches and a common ancestor: 1 strip |
|
439 | 2 different branches and a common ancestor: 1 strip | |
440 |
|
440 | |||
441 | $ hg strip 1 "2|4" |
|
441 | $ hg strip 1 "2|4" | |
442 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
442 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
443 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
443 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
444 | $ restore |
|
444 | $ restore | |
445 |
|
445 | |||
446 | verify fncache is kept up-to-date |
|
446 | verify fncache is kept up-to-date | |
447 |
|
447 | |||
448 | $ touch a |
|
448 | $ touch a | |
449 | $ hg ci -qAm a |
|
449 | $ hg ci -qAm a | |
450 | $ cat .hg/store/fncache | sort |
|
450 | $ cat .hg/store/fncache | sort | |
451 | data/a.i |
|
451 | data/a.i | |
452 | data/bar.i |
|
452 | data/bar.i | |
453 | $ hg strip tip |
|
453 | $ hg strip tip | |
454 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved |
|
454 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
455 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
455 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
456 | $ cat .hg/store/fncache |
|
456 | $ cat .hg/store/fncache | |
457 | data/bar.i |
|
457 | data/bar.i | |
458 |
|
458 | |||
459 | stripping an empty revset |
|
459 | stripping an empty revset | |
460 |
|
460 | |||
461 | $ hg strip "1 and not 1" |
|
461 | $ hg strip "1 and not 1" | |
462 | abort: empty revision set |
|
462 | abort: empty revision set | |
463 | [255] |
|
463 | [255] | |
464 |
|
464 | |||
465 | remove branchy history for qimport tests |
|
465 | remove branchy history for qimport tests | |
466 |
|
466 | |||
467 | $ hg strip 3 |
|
467 | $ hg strip 3 | |
468 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
468 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
469 |
|
469 | |||
470 |
|
470 | |||
471 | strip of applied mq should cleanup status file |
|
471 | strip of applied mq should cleanup status file | |
472 |
|
472 | |||
473 | $ echo "mq=" >> $HGRCPATH |
|
473 | $ echo "mq=" >> $HGRCPATH | |
474 | $ hg up -C 3 |
|
474 | $ hg up -C 3 | |
475 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
475 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
476 | $ echo fooagain >> bar |
|
476 | $ echo fooagain >> bar | |
477 | $ hg ci -mf |
|
477 | $ hg ci -mf | |
478 | $ hg qimport -r tip:2 |
|
478 | $ hg qimport -r tip:2 | |
479 |
|
479 | |||
480 | applied patches before strip |
|
480 | applied patches before strip | |
481 |
|
481 | |||
482 | $ hg qapplied |
|
482 | $ hg qapplied | |
483 | d |
|
483 | d | |
484 | e |
|
484 | e | |
485 | f |
|
485 | f | |
486 |
|
486 | |||
487 | stripping revision in queue |
|
487 | stripping revision in queue | |
488 |
|
488 | |||
489 | $ hg strip 3 |
|
489 | $ hg strip 3 | |
490 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
490 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
491 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
491 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
492 |
|
492 | |||
493 | applied patches after stripping rev in queue |
|
493 | applied patches after stripping rev in queue | |
494 |
|
494 | |||
495 | $ hg qapplied |
|
495 | $ hg qapplied | |
496 | d |
|
496 | d | |
497 |
|
497 | |||
498 | stripping ancestor of queue |
|
498 | stripping ancestor of queue | |
499 |
|
499 | |||
500 | $ hg strip 1 |
|
500 | $ hg strip 1 | |
501 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
501 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
502 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
502 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
503 |
|
503 | |||
504 | applied patches after stripping ancestor of queue |
|
504 | applied patches after stripping ancestor of queue | |
505 |
|
505 | |||
506 | $ hg qapplied |
|
506 | $ hg qapplied | |
507 |
|
507 | |||
508 | Verify strip protects against stripping wc parent when there are uncommitted mods |
|
508 | Verify strip protects against stripping wc parent when there are uncommitted mods | |
509 |
|
509 | |||
510 | $ echo b > b |
|
510 | $ echo b > b | |
511 | $ echo bb > bar |
|
511 | $ echo bb > bar | |
512 | $ hg add b |
|
512 | $ hg add b | |
513 | $ hg ci -m 'b' |
|
513 | $ hg ci -m 'b' | |
514 | $ hg log --graph |
|
514 | $ hg log --graph | |
515 | @ changeset: 1:76dcf9fab855 |
|
515 | @ changeset: 1:76dcf9fab855 | |
516 | | tag: tip |
|
516 | | tag: tip | |
517 | | user: test |
|
517 | | user: test | |
518 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
518 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
519 | | summary: b |
|
519 | | summary: b | |
520 | | |
|
520 | | | |
521 | o changeset: 0:9ab35a2d17cb |
|
521 | o changeset: 0:9ab35a2d17cb | |
522 | user: test |
|
522 | user: test | |
523 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
523 | date: Thu Jan 01 00:00:00 1970 +0000 | |
524 | summary: a |
|
524 | summary: a | |
525 |
|
525 | |||
526 | $ hg up 0 |
|
526 | $ hg up 0 | |
527 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved |
|
527 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
528 | $ echo c > bar |
|
528 | $ echo c > bar | |
529 | $ hg up -t false |
|
529 | $ hg up -t false | |
530 | merging bar |
|
530 | merging bar | |
531 | merging bar failed! |
|
531 | merging bar failed! | |
532 | 1 files updated, 0 files merged, 0 files removed, 1 files unresolved |
|
532 | 1 files updated, 0 files merged, 0 files removed, 1 files unresolved | |
533 | use 'hg resolve' to retry unresolved file merges |
|
533 | use 'hg resolve' to retry unresolved file merges | |
534 | [1] |
|
534 | [1] | |
535 | $ hg sum |
|
535 | $ hg sum | |
536 | parent: 1:76dcf9fab855 tip |
|
536 | parent: 1:76dcf9fab855 tip | |
537 | b |
|
537 | b | |
538 | branch: default |
|
538 | branch: default | |
539 | commit: 1 modified, 1 unknown, 1 unresolved |
|
539 | commit: 1 modified, 1 unknown, 1 unresolved | |
540 | update: (current) |
|
540 | update: (current) | |
541 | phases: 2 draft |
|
541 | phases: 2 draft | |
542 | mq: 3 unapplied |
|
542 | mq: 3 unapplied | |
543 |
|
543 | |||
544 | $ echo c > b |
|
544 | $ echo c > b | |
545 | $ hg strip tip |
|
545 | $ hg strip tip | |
546 | abort: local changes found |
|
546 | abort: local changes found | |
547 | [255] |
|
547 | [255] | |
548 | $ hg strip tip --keep |
|
548 | $ hg strip tip --keep | |
549 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
549 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
550 | $ hg log --graph |
|
550 | $ hg log --graph | |
551 | @ changeset: 0:9ab35a2d17cb |
|
551 | @ changeset: 0:9ab35a2d17cb | |
552 | tag: tip |
|
552 | tag: tip | |
553 | user: test |
|
553 | user: test | |
554 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
554 | date: Thu Jan 01 00:00:00 1970 +0000 | |
555 | summary: a |
|
555 | summary: a | |
556 |
|
556 | |||
557 | $ hg status |
|
557 | $ hg status | |
558 | M bar |
|
558 | M bar | |
559 | ? b |
|
559 | ? b | |
560 | ? bar.orig |
|
560 | ? bar.orig | |
561 |
|
561 | |||
562 | $ rm bar.orig |
|
562 | $ rm bar.orig | |
563 | $ hg sum |
|
563 | $ hg sum | |
564 | parent: 0:9ab35a2d17cb tip |
|
564 | parent: 0:9ab35a2d17cb tip | |
565 | a |
|
565 | a | |
566 | branch: default |
|
566 | branch: default | |
567 | commit: 1 modified, 1 unknown |
|
567 | commit: 1 modified, 1 unknown | |
568 | update: (current) |
|
568 | update: (current) | |
569 | phases: 1 draft |
|
569 | phases: 1 draft | |
570 | mq: 3 unapplied |
|
570 | mq: 3 unapplied | |
571 |
|
571 | |||
572 | Strip adds, removes, modifies with --keep |
|
572 | Strip adds, removes, modifies with --keep | |
573 |
|
573 | |||
574 | $ touch b |
|
574 | $ touch b | |
575 | $ hg add b |
|
575 | $ hg add b | |
576 | $ hg commit -mb |
|
576 | $ hg commit -mb | |
577 | $ touch c |
|
577 | $ touch c | |
578 |
|
578 | |||
579 | ... with a clean working dir |
|
579 | ... with a clean working dir | |
580 |
|
580 | |||
581 | $ hg add c |
|
581 | $ hg add c | |
582 | $ hg rm bar |
|
582 | $ hg rm bar | |
583 | $ hg commit -mc |
|
583 | $ hg commit -mc | |
584 | $ hg status |
|
584 | $ hg status | |
585 | $ hg strip --keep tip |
|
585 | $ hg strip --keep tip | |
586 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
586 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
587 | $ hg status |
|
587 | $ hg status | |
588 | ! bar |
|
588 | ! bar | |
589 | ? c |
|
589 | ? c | |
590 |
|
590 | |||
591 | ... with a dirty working dir |
|
591 | ... with a dirty working dir | |
592 |
|
592 | |||
593 | $ hg add c |
|
593 | $ hg add c | |
594 | $ hg rm bar |
|
594 | $ hg rm bar | |
595 | $ hg commit -mc |
|
595 | $ hg commit -mc | |
596 | $ hg status |
|
596 | $ hg status | |
597 | $ echo b > b |
|
597 | $ echo b > b | |
598 | $ echo d > d |
|
598 | $ echo d > d | |
599 | $ hg strip --keep tip |
|
599 | $ hg strip --keep tip | |
600 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) |
|
600 | saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) | |
601 | $ hg status |
|
601 | $ hg status | |
602 | M b |
|
602 | M b | |
603 | ! bar |
|
603 | ! bar | |
604 | ? c |
|
604 | ? c | |
605 | ? d |
|
605 | ? d | |
606 |
|
606 | |||
607 | ... after updating the dirstate |
|
607 | ... after updating the dirstate | |
608 | $ hg add c |
|
608 | $ hg add c | |
609 | $ hg commit -mc |
|
609 | $ hg commit -mc | |
610 | $ hg rm c |
|
610 | $ hg rm c | |
611 | $ hg commit -mc |
|
611 | $ hg commit -mc | |
612 | $ hg strip --keep '.^' -q |
|
612 | $ hg strip --keep '.^' -q | |
613 | $ cd .. |
|
613 | $ cd .. | |
614 |
|
614 | |||
615 | stripping many nodes on a complex graph (issue3299) |
|
615 | stripping many nodes on a complex graph (issue3299) | |
616 |
|
616 | |||
617 | $ hg init issue3299 |
|
617 | $ hg init issue3299 | |
618 | $ cd issue3299 |
|
618 | $ cd issue3299 | |
619 | $ hg debugbuilddag '@a.:a@b.:b.:x<a@a.:a<b@b.:b<a@a.:a' |
|
619 | $ hg debugbuilddag '@a.:a@b.:b.:x<a@a.:a<b@b.:b<a@a.:a' | |
620 | $ hg strip 'not ancestors(x)' |
|
620 | $ hg strip 'not ancestors(x)' | |
621 | saved backup bundle to $TESTTMP/issue3299/.hg/strip-backup/*-backup.hg (glob) |
|
621 | saved backup bundle to $TESTTMP/issue3299/.hg/strip-backup/*-backup.hg (glob) | |
622 |
|
622 | |||
623 | test hg strip -B bookmark |
|
623 | test hg strip -B bookmark | |
624 |
|
624 | |||
625 | $ cd .. |
|
625 | $ cd .. | |
626 | $ hg init bookmarks |
|
626 | $ hg init bookmarks | |
627 | $ cd bookmarks |
|
627 | $ cd bookmarks | |
628 | $ hg debugbuilddag '..<2.*1/2:m<2+3:c<m+3:a<2.:b<m+2:d<2.:e<m+1:f' |
|
628 | $ hg debugbuilddag '..<2.*1/2:m<2+3:c<m+3:a<2.:b<m+2:d<2.:e<m+1:f' | |
629 | $ hg bookmark -r 'a' 'todelete' |
|
629 | $ hg bookmark -r 'a' 'todelete' | |
630 | $ hg bookmark -r 'b' 'B' |
|
630 | $ hg bookmark -r 'b' 'B' | |
631 | $ hg bookmark -r 'b' 'nostrip' |
|
631 | $ hg bookmark -r 'b' 'nostrip' | |
632 | $ hg bookmark -r 'c' 'delete' |
|
632 | $ hg bookmark -r 'c' 'delete' | |
633 | $ hg bookmark -r 'd' 'multipledelete1' |
|
633 | $ hg bookmark -r 'd' 'multipledelete1' | |
634 | $ hg bookmark -r 'e' 'multipledelete2' |
|
634 | $ hg bookmark -r 'e' 'multipledelete2' | |
635 | $ hg bookmark -r 'f' 'singlenode1' |
|
635 | $ hg bookmark -r 'f' 'singlenode1' | |
636 | $ hg bookmark -r 'f' 'singlenode2' |
|
636 | $ hg bookmark -r 'f' 'singlenode2' | |
637 | $ hg up -C todelete |
|
637 | $ hg up -C todelete | |
638 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
638 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
639 | (activating bookmark todelete) |
|
639 | (activating bookmark todelete) | |
640 | $ hg strip -B nostrip |
|
640 | $ hg strip -B nostrip | |
641 | bookmark 'nostrip' deleted |
|
641 | bookmark 'nostrip' deleted | |
642 | abort: empty revision set |
|
642 | abort: empty revision set | |
643 | [255] |
|
643 | [255] | |
644 | $ hg strip -B todelete |
|
644 | $ hg strip -B todelete | |
645 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
645 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
646 | saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob) |
|
646 | saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob) | |
647 | bookmark 'todelete' deleted |
|
647 | bookmark 'todelete' deleted | |
648 | $ hg id -ir dcbb326fdec2 |
|
648 | $ hg id -ir dcbb326fdec2 | |
649 | abort: unknown revision 'dcbb326fdec2'! |
|
649 | abort: unknown revision 'dcbb326fdec2'! | |
650 | [255] |
|
650 | [255] | |
651 | $ hg id -ir d62d843c9a01 |
|
651 | $ hg id -ir d62d843c9a01 | |
652 | d62d843c9a01 |
|
652 | d62d843c9a01 | |
653 | $ hg bookmarks |
|
653 | $ hg bookmarks | |
654 | B 9:ff43616e5d0f |
|
654 | B 9:ff43616e5d0f | |
655 | delete 6:2702dd0c91e7 |
|
655 | delete 6:2702dd0c91e7 | |
656 | multipledelete1 11:e46a4836065c |
|
656 | multipledelete1 11:e46a4836065c | |
657 | multipledelete2 12:b4594d867745 |
|
657 | multipledelete2 12:b4594d867745 | |
658 | singlenode1 13:43227190fef8 |
|
658 | singlenode1 13:43227190fef8 | |
659 | singlenode2 13:43227190fef8 |
|
659 | singlenode2 13:43227190fef8 | |
660 | $ hg strip -B multipledelete1 -B multipledelete2 |
|
660 | $ hg strip -B multipledelete1 -B multipledelete2 | |
661 | saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/e46a4836065c-89ec65c2-backup.hg (glob) |
|
661 | saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/e46a4836065c-89ec65c2-backup.hg (glob) | |
662 | bookmark 'multipledelete1' deleted |
|
662 | bookmark 'multipledelete1' deleted | |
663 | bookmark 'multipledelete2' deleted |
|
663 | bookmark 'multipledelete2' deleted | |
664 | $ hg id -ir e46a4836065c |
|
664 | $ hg id -ir e46a4836065c | |
665 | abort: unknown revision 'e46a4836065c'! |
|
665 | abort: unknown revision 'e46a4836065c'! | |
666 | [255] |
|
666 | [255] | |
667 | $ hg id -ir b4594d867745 |
|
667 | $ hg id -ir b4594d867745 | |
668 | abort: unknown revision 'b4594d867745'! |
|
668 | abort: unknown revision 'b4594d867745'! | |
669 | [255] |
|
669 | [255] | |
670 | $ hg strip -B singlenode1 -B singlenode2 |
|
670 | $ hg strip -B singlenode1 -B singlenode2 | |
671 | saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/43227190fef8-8da858f2-backup.hg (glob) |
|
671 | saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/43227190fef8-8da858f2-backup.hg (glob) | |
672 | bookmark 'singlenode1' deleted |
|
672 | bookmark 'singlenode1' deleted | |
673 | bookmark 'singlenode2' deleted |
|
673 | bookmark 'singlenode2' deleted | |
674 | $ hg id -ir 43227190fef8 |
|
674 | $ hg id -ir 43227190fef8 | |
675 | abort: unknown revision '43227190fef8'! |
|
675 | abort: unknown revision '43227190fef8'! | |
676 | [255] |
|
676 | [255] | |
677 | $ hg strip -B unknownbookmark |
|
677 | $ hg strip -B unknownbookmark | |
678 | abort: bookmark 'unknownbookmark' not found |
|
678 | abort: bookmark 'unknownbookmark' not found | |
679 | [255] |
|
679 | [255] | |
680 | $ hg strip -B unknownbookmark1 -B unknownbookmark2 |
|
680 | $ hg strip -B unknownbookmark1 -B unknownbookmark2 | |
681 | abort: bookmark 'unknownbookmark1,unknownbookmark2' not found |
|
681 | abort: bookmark 'unknownbookmark1,unknownbookmark2' not found | |
682 | [255] |
|
682 | [255] | |
683 | $ hg strip -B delete -B unknownbookmark |
|
683 | $ hg strip -B delete -B unknownbookmark | |
684 | abort: bookmark 'unknownbookmark' not found |
|
684 | abort: bookmark 'unknownbookmark' not found | |
685 | [255] |
|
685 | [255] | |
686 | $ hg strip -B delete |
|
686 | $ hg strip -B delete | |
687 | saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob) |
|
687 | saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob) | |
688 | bookmark 'delete' deleted |
|
688 | bookmark 'delete' deleted | |
689 | $ hg id -ir 6:2702dd0c91e7 |
|
689 | $ hg id -ir 6:2702dd0c91e7 | |
690 | abort: unknown revision '2702dd0c91e7'! |
|
690 | abort: unknown revision '2702dd0c91e7'! | |
691 | [255] |
|
691 | [255] | |
692 | $ hg update B |
|
692 | $ hg update B | |
693 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
693 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
694 | (activating bookmark B) |
|
694 | (activating bookmark B) | |
695 | $ echo a > a |
|
695 | $ echo a > a | |
696 | $ hg add a |
|
696 | $ hg add a | |
697 | $ hg strip -B B |
|
697 | $ hg strip -B B | |
698 | abort: local changes found |
|
698 | abort: local changes found | |
699 | [255] |
|
699 | [255] | |
700 | $ hg bookmarks |
|
700 | $ hg bookmarks | |
701 | * B 6:ff43616e5d0f |
|
701 | * B 6:ff43616e5d0f | |
702 |
|
702 | |||
703 | Make sure no one adds back a -b option: |
|
703 | Make sure no one adds back a -b option: | |
704 |
|
704 | |||
705 | $ hg strip -b tip |
|
705 | $ hg strip -b tip | |
706 | hg strip: option -b not recognized |
|
706 | hg strip: option -b not recognized | |
707 | hg strip [-k] [-f] [-B bookmark] [-r] REV... |
|
707 | hg strip [-k] [-f] [-B bookmark] [-r] REV... | |
708 |
|
708 | |||
709 | strip changesets and all their descendants from the repository |
|
709 | strip changesets and all their descendants from the repository | |
710 |
|
710 | |||
711 | (use 'hg help -e strip' to show help for the strip extension) |
|
711 | (use 'hg help -e strip' to show help for the strip extension) | |
712 |
|
712 | |||
713 | options ([+] can be repeated): |
|
713 | options ([+] can be repeated): | |
714 |
|
714 | |||
715 | -r --rev REV [+] strip specified revision (optional, can specify |
|
715 | -r --rev REV [+] strip specified revision (optional, can specify | |
716 | revisions without this option) |
|
716 | revisions without this option) | |
717 | -f --force force removal of changesets, discard uncommitted |
|
717 | -f --force force removal of changesets, discard uncommitted | |
718 | changes (no backup) |
|
718 | changes (no backup) | |
719 | --no-backup no backups |
|
719 | --no-backup no backups | |
720 | -k --keep do not modify working directory during strip |
|
720 | -k --keep do not modify working directory during strip | |
721 | -B --bookmark VALUE [+] remove revs only reachable from given bookmark |
|
721 | -B --bookmark VALUE [+] remove revs only reachable from given bookmark | |
722 | --mq operate on patch repository |
|
722 | --mq operate on patch repository | |
723 |
|
723 | |||
724 | (use 'hg strip -h' to show more help) |
|
724 | (use 'hg strip -h' to show more help) | |
725 | [255] |
|
725 | [255] | |
726 |
|
726 | |||
727 | $ cd .. |
|
727 | $ cd .. | |
728 |
|
728 | |||
729 | Verify bundles don't get overwritten: |
|
729 | Verify bundles don't get overwritten: | |
730 |
|
730 | |||
731 | $ hg init doublebundle |
|
731 | $ hg init doublebundle | |
732 | $ cd doublebundle |
|
732 | $ cd doublebundle | |
733 | $ touch a |
|
733 | $ touch a | |
734 | $ hg commit -Aqm a |
|
734 | $ hg commit -Aqm a | |
735 | $ touch b |
|
735 | $ touch b | |
736 | $ hg commit -Aqm b |
|
736 | $ hg commit -Aqm b | |
737 | $ hg strip -r 0 |
|
737 | $ hg strip -r 0 | |
738 | 0 files updated, 0 files merged, 2 files removed, 0 files unresolved |
|
738 | 0 files updated, 0 files merged, 2 files removed, 0 files unresolved | |
739 | saved backup bundle to $TESTTMP/doublebundle/.hg/strip-backup/3903775176ed-e68910bd-backup.hg (glob) |
|
739 | saved backup bundle to $TESTTMP/doublebundle/.hg/strip-backup/3903775176ed-e68910bd-backup.hg (glob) | |
740 | $ ls .hg/strip-backup |
|
740 | $ ls .hg/strip-backup | |
741 | 3903775176ed-e68910bd-backup.hg |
|
741 | 3903775176ed-e68910bd-backup.hg | |
742 | $ hg pull -q -r 3903775176ed .hg/strip-backup/3903775176ed-e68910bd-backup.hg |
|
742 | $ hg pull -q -r 3903775176ed .hg/strip-backup/3903775176ed-e68910bd-backup.hg | |
743 | $ hg strip -r 0 |
|
743 | $ hg strip -r 0 | |
744 | saved backup bundle to $TESTTMP/doublebundle/.hg/strip-backup/3903775176ed-54390173-backup.hg (glob) |
|
744 | saved backup bundle to $TESTTMP/doublebundle/.hg/strip-backup/3903775176ed-54390173-backup.hg (glob) | |
745 | $ ls .hg/strip-backup |
|
745 | $ ls .hg/strip-backup | |
746 | 3903775176ed-54390173-backup.hg |
|
746 | 3903775176ed-54390173-backup.hg | |
747 | 3903775176ed-e68910bd-backup.hg |
|
747 | 3903775176ed-e68910bd-backup.hg | |
748 | $ cd .. |
|
748 | $ cd .. | |
749 |
|
749 | |||
750 | Test that we only bundle the stripped changesets (issue4736) |
|
750 | Test that we only bundle the stripped changesets (issue4736) | |
751 | ------------------------------------------------------------ |
|
751 | ------------------------------------------------------------ | |
752 |
|
752 | |||
753 | initialization (previous repo is empty anyway) |
|
753 | initialization (previous repo is empty anyway) | |
754 |
|
754 | |||
755 | $ hg init issue4736 |
|
755 | $ hg init issue4736 | |
756 | $ cd issue4736 |
|
756 | $ cd issue4736 | |
757 | $ echo a > a |
|
757 | $ echo a > a | |
758 | $ hg add a |
|
758 | $ hg add a | |
759 | $ hg commit -m commitA |
|
759 | $ hg commit -m commitA | |
760 | $ echo b > b |
|
760 | $ echo b > b | |
761 | $ hg add b |
|
761 | $ hg add b | |
762 | $ hg commit -m commitB |
|
762 | $ hg commit -m commitB | |
763 | $ echo c > c |
|
763 | $ echo c > c | |
764 | $ hg add c |
|
764 | $ hg add c | |
765 | $ hg commit -m commitC |
|
765 | $ hg commit -m commitC | |
766 | $ hg up 'desc(commitB)' |
|
766 | $ hg up 'desc(commitB)' | |
767 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved |
|
767 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
768 | $ echo d > d |
|
768 | $ echo d > d | |
769 | $ hg add d |
|
769 | $ hg add d | |
770 | $ hg commit -m commitD |
|
770 | $ hg commit -m commitD | |
771 | created new head |
|
771 | created new head | |
772 | $ hg up 'desc(commitC)' |
|
772 | $ hg up 'desc(commitC)' | |
773 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved |
|
773 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
774 | $ hg merge 'desc(commitD)' |
|
774 | $ hg merge 'desc(commitD)' | |
775 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
775 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
776 | (branch merge, don't forget to commit) |
|
776 | (branch merge, don't forget to commit) | |
777 | $ hg ci -m 'mergeCD' |
|
777 | $ hg ci -m 'mergeCD' | |
778 | $ hg log -G |
|
778 | $ hg log -G | |
779 | @ changeset: 4:d8db9d137221 |
|
779 | @ changeset: 4:d8db9d137221 | |
780 | |\ tag: tip |
|
780 | |\ tag: tip | |
781 | | | parent: 2:5c51d8d6557d |
|
781 | | | parent: 2:5c51d8d6557d | |
782 | | | parent: 3:6625a5168474 |
|
782 | | | parent: 3:6625a5168474 | |
783 | | | user: test |
|
783 | | | user: test | |
784 | | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
784 | | | date: Thu Jan 01 00:00:00 1970 +0000 | |
785 | | | summary: mergeCD |
|
785 | | | summary: mergeCD | |
786 | | | |
|
786 | | | | |
787 | | o changeset: 3:6625a5168474 |
|
787 | | o changeset: 3:6625a5168474 | |
788 | | | parent: 1:eca11cf91c71 |
|
788 | | | parent: 1:eca11cf91c71 | |
789 | | | user: test |
|
789 | | | user: test | |
790 | | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
790 | | | date: Thu Jan 01 00:00:00 1970 +0000 | |
791 | | | summary: commitD |
|
791 | | | summary: commitD | |
792 | | | |
|
792 | | | | |
793 | o | changeset: 2:5c51d8d6557d |
|
793 | o | changeset: 2:5c51d8d6557d | |
794 | |/ user: test |
|
794 | |/ user: test | |
795 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
795 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
796 | | summary: commitC |
|
796 | | summary: commitC | |
797 | | |
|
797 | | | |
798 | o changeset: 1:eca11cf91c71 |
|
798 | o changeset: 1:eca11cf91c71 | |
799 | | user: test |
|
799 | | user: test | |
800 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
800 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
801 | | summary: commitB |
|
801 | | summary: commitB | |
802 | | |
|
802 | | | |
803 | o changeset: 0:105141ef12d0 |
|
803 | o changeset: 0:105141ef12d0 | |
804 | user: test |
|
804 | user: test | |
805 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
805 | date: Thu Jan 01 00:00:00 1970 +0000 | |
806 | summary: commitA |
|
806 | summary: commitA | |
807 |
|
807 | |||
808 |
|
808 | |||
809 | Check bundle behavior: |
|
809 | Check bundle behavior: | |
810 |
|
810 | |||
811 | $ hg bundle -r 'desc(mergeCD)' --base 'desc(commitC)' ../issue4736.hg |
|
811 | $ hg bundle -r 'desc(mergeCD)' --base 'desc(commitC)' ../issue4736.hg | |
812 | 2 changesets found |
|
812 | 2 changesets found | |
813 | $ hg log -r 'bundle()' -R ../issue4736.hg |
|
813 | $ hg log -r 'bundle()' -R ../issue4736.hg | |
814 | changeset: 3:6625a5168474 |
|
814 | changeset: 3:6625a5168474 | |
815 | parent: 1:eca11cf91c71 |
|
815 | parent: 1:eca11cf91c71 | |
816 | user: test |
|
816 | user: test | |
817 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
817 | date: Thu Jan 01 00:00:00 1970 +0000 | |
818 | summary: commitD |
|
818 | summary: commitD | |
819 |
|
819 | |||
820 | changeset: 4:d8db9d137221 |
|
820 | changeset: 4:d8db9d137221 | |
821 | tag: tip |
|
821 | tag: tip | |
822 | parent: 2:5c51d8d6557d |
|
822 | parent: 2:5c51d8d6557d | |
823 | parent: 3:6625a5168474 |
|
823 | parent: 3:6625a5168474 | |
824 | user: test |
|
824 | user: test | |
825 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
825 | date: Thu Jan 01 00:00:00 1970 +0000 | |
826 | summary: mergeCD |
|
826 | summary: mergeCD | |
827 |
|
827 | |||
828 |
|
828 | |||
829 | check strip behavior |
|
829 | check strip behavior | |
830 |
|
830 | |||
831 | $ hg --config extensions.strip= strip 'desc(commitD)' --debug |
|
831 | $ hg --config extensions.strip= strip 'desc(commitD)' --debug | |
832 | resolving manifests |
|
832 | resolving manifests | |
833 | branchmerge: False, force: True, partial: False |
|
833 | branchmerge: False, force: True, partial: False | |
834 | ancestor: d8db9d137221+, local: d8db9d137221+, remote: eca11cf91c71 |
|
834 | ancestor: d8db9d137221+, local: d8db9d137221+, remote: eca11cf91c71 | |
835 | c: other deleted -> r |
|
835 | c: other deleted -> r | |
836 | removing c |
|
836 | removing c | |
837 | d: other deleted -> r |
|
837 | d: other deleted -> r | |
838 | removing d |
|
838 | removing d | |
839 | starting 4 threads for background file closing (?) |
|
839 | starting 4 threads for background file closing (?) | |
840 | 0 files updated, 0 files merged, 2 files removed, 0 files unresolved |
|
840 | 0 files updated, 0 files merged, 2 files removed, 0 files unresolved | |
841 | 2 changesets found |
|
841 | 2 changesets found | |
842 | list of changesets: |
|
842 | list of changesets: | |
843 | 6625a516847449b6f0fa3737b9ba56e9f0f3032c |
|
843 | 6625a516847449b6f0fa3737b9ba56e9f0f3032c | |
844 | d8db9d1372214336d2b5570f20ee468d2c72fa8b |
|
844 | d8db9d1372214336d2b5570f20ee468d2c72fa8b | |
845 | bundle2-output-bundle: "HG20", (1 params) 2 parts total |
|
845 | bundle2-output-bundle: "HG20", (1 params) 2 parts total | |
846 | bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload |
|
846 | bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload | |
847 | bundle2-output-part: "phase-heads" 24 bytes payload |
|
847 | bundle2-output-part: "phase-heads" 24 bytes payload | |
848 | saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/6625a5168474-345bb43d-backup.hg (glob) |
|
848 | saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/6625a5168474-345bb43d-backup.hg (glob) | |
849 | updating the branch cache |
|
849 | updating the branch cache | |
850 | invalid branchheads cache (served): tip differs |
|
850 | invalid branchheads cache (served): tip differs | |
851 | truncating cache/rbc-revs-v1 to 24 |
|
851 | truncating cache/rbc-revs-v1 to 24 | |
852 | $ hg log -G |
|
852 | $ hg log -G | |
853 | o changeset: 2:5c51d8d6557d |
|
853 | o changeset: 2:5c51d8d6557d | |
854 | | tag: tip |
|
854 | | tag: tip | |
855 | | user: test |
|
855 | | user: test | |
856 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
856 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
857 | | summary: commitC |
|
857 | | summary: commitC | |
858 | | |
|
858 | | | |
859 | @ changeset: 1:eca11cf91c71 |
|
859 | @ changeset: 1:eca11cf91c71 | |
860 | | user: test |
|
860 | | user: test | |
861 | | date: Thu Jan 01 00:00:00 1970 +0000 |
|
861 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
862 | | summary: commitB |
|
862 | | summary: commitB | |
863 | | |
|
863 | | | |
864 | o changeset: 0:105141ef12d0 |
|
864 | o changeset: 0:105141ef12d0 | |
865 | user: test |
|
865 | user: test | |
866 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
866 | date: Thu Jan 01 00:00:00 1970 +0000 | |
867 | summary: commitA |
|
867 | summary: commitA | |
868 |
|
868 | |||
869 |
|
869 | |||
870 | strip backup content |
|
870 | strip backup content | |
871 |
|
871 | |||
872 | $ hg log -r 'bundle()' -R .hg/strip-backup/6625a5168474-*-backup.hg |
|
872 | $ hg log -r 'bundle()' -R .hg/strip-backup/6625a5168474-*-backup.hg | |
873 | changeset: 3:6625a5168474 |
|
873 | changeset: 3:6625a5168474 | |
874 | parent: 1:eca11cf91c71 |
|
874 | parent: 1:eca11cf91c71 | |
875 | user: test |
|
875 | user: test | |
876 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
876 | date: Thu Jan 01 00:00:00 1970 +0000 | |
877 | summary: commitD |
|
877 | summary: commitD | |
878 |
|
878 | |||
879 | changeset: 4:d8db9d137221 |
|
879 | changeset: 4:d8db9d137221 | |
880 | tag: tip |
|
880 | tag: tip | |
881 | parent: 2:5c51d8d6557d |
|
881 | parent: 2:5c51d8d6557d | |
882 | parent: 3:6625a5168474 |
|
882 | parent: 3:6625a5168474 | |
883 | user: test |
|
883 | user: test | |
884 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
884 | date: Thu Jan 01 00:00:00 1970 +0000 | |
885 | summary: mergeCD |
|
885 | summary: mergeCD | |
886 |
|
886 | |||
887 | Check that the phase cache is properly invalidated after a strip with bookmark. |
|
887 | Check that the phase cache is properly invalidated after a strip with bookmark. | |
888 |
|
888 | |||
889 | $ cat > ../stripstalephasecache.py << EOF |
|
889 | $ cat > ../stripstalephasecache.py << EOF | |
890 | > from mercurial import extensions, localrepo |
|
890 | > from mercurial import extensions, localrepo | |
891 | > def transactioncallback(orig, repo, desc, *args, **kwargs): |
|
891 | > def transactioncallback(orig, repo, desc, *args, **kwargs): | |
892 | > def test(transaction): |
|
892 | > def test(transaction): | |
893 | > # observe cache inconsistency |
|
893 | > # observe cache inconsistency | |
894 | > try: |
|
894 | > try: | |
895 | > [repo.changelog.node(r) for r in repo.revs("not public()")] |
|
895 | > [repo.changelog.node(r) for r in repo.revs("not public()")] | |
896 | > except IndexError: |
|
896 | > except IndexError: | |
897 | > repo.ui.status("Index error!\n") |
|
897 | > repo.ui.status("Index error!\n") | |
898 | > transaction = orig(repo, desc, *args, **kwargs) |
|
898 | > transaction = orig(repo, desc, *args, **kwargs) | |
899 | > # warm up the phase cache |
|
899 | > # warm up the phase cache | |
900 | > list(repo.revs("not public()")) |
|
900 | > list(repo.revs("not public()")) | |
901 | > if desc != 'strip': |
|
901 | > if desc != 'strip': | |
902 | > transaction.addpostclose("phase invalidation test", test) |
|
902 | > transaction.addpostclose("phase invalidation test", test) | |
903 | > return transaction |
|
903 | > return transaction | |
904 | > def extsetup(ui): |
|
904 | > def extsetup(ui): | |
905 | > extensions.wrapfunction(localrepo.localrepository, "transaction", |
|
905 | > extensions.wrapfunction(localrepo.localrepository, "transaction", | |
906 | > transactioncallback) |
|
906 | > transactioncallback) | |
907 | > EOF |
|
907 | > EOF | |
908 | $ hg up -C 2 |
|
908 | $ hg up -C 2 | |
909 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
909 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
910 | $ echo k > k |
|
910 | $ echo k > k | |
911 | $ hg add k |
|
911 | $ hg add k | |
912 | $ hg commit -m commitK |
|
912 | $ hg commit -m commitK | |
913 | $ echo l > l |
|
913 | $ echo l > l | |
914 | $ hg add l |
|
914 | $ hg add l | |
915 | $ hg commit -m commitL |
|
915 | $ hg commit -m commitL | |
916 | $ hg book -r tip blah |
|
916 | $ hg book -r tip blah | |
917 | $ hg strip ".^" --config extensions.crash=$TESTTMP/stripstalephasecache.py |
|
917 | $ hg strip ".^" --config extensions.crash=$TESTTMP/stripstalephasecache.py | |
918 | 0 files updated, 0 files merged, 2 files removed, 0 files unresolved |
|
918 | 0 files updated, 0 files merged, 2 files removed, 0 files unresolved | |
919 | saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/8f0b4384875c-4fa10deb-backup.hg (glob) |
|
919 | saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/8f0b4384875c-4fa10deb-backup.hg (glob) | |
920 | $ hg up -C 1 |
|
920 | $ hg up -C 1 | |
921 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved |
|
921 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
922 |
|
922 | |||
923 | Error during post-close callback of the strip transaction |
|
923 | Error during post-close callback of the strip transaction | |
924 | (They should be gracefully handled and reported) |
|
924 | (They should be gracefully handled and reported) | |
925 |
|
925 | |||
926 | $ cat > ../crashstrip.py << EOF |
|
926 | $ cat > ../crashstrip.py << EOF | |
927 | > from mercurial import error |
|
927 | > from mercurial import error | |
928 | > def reposetup(ui, repo): |
|
928 | > def reposetup(ui, repo): | |
929 | > class crashstriprepo(repo.__class__): |
|
929 | > class crashstriprepo(repo.__class__): | |
930 | > def transaction(self, desc, *args, **kwargs): |
|
930 | > def transaction(self, desc, *args, **kwargs): | |
931 | > tr = super(crashstriprepo, self).transaction(desc, *args, **kwargs) |
|
931 | > tr = super(crashstriprepo, self).transaction(desc, *args, **kwargs) | |
932 | > if desc == 'strip': |
|
932 | > if desc == 'strip': | |
933 | > def crash(tra): raise error.Abort('boom') |
|
933 | > def crash(tra): raise error.Abort('boom') | |
934 | > tr.addpostclose('crash', crash) |
|
934 | > tr.addpostclose('crash', crash) | |
935 | > return tr |
|
935 | > return tr | |
936 | > repo.__class__ = crashstriprepo |
|
936 | > repo.__class__ = crashstriprepo | |
937 | > EOF |
|
937 | > EOF | |
938 | $ hg strip tip --config extensions.crash=$TESTTMP/crashstrip.py |
|
938 | $ hg strip tip --config extensions.crash=$TESTTMP/crashstrip.py | |
939 | saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg (glob) |
|
939 | saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg (glob) | |
940 | strip failed, backup bundle stored in '$TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg' (glob) |
|
940 | strip failed, backup bundle stored in '$TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg' (glob) | |
941 | abort: boom |
|
941 | abort: boom | |
942 | [255] |
|
942 | [255] | |
943 |
|
943 | |||
944 | Use delayedstrip to strip inside a transaction |
|
944 | Use delayedstrip to strip inside a transaction | |
945 |
|
945 | |||
946 | $ cd $TESTTMP |
|
946 | $ cd $TESTTMP | |
947 | $ hg init delayedstrip |
|
947 | $ hg init delayedstrip | |
948 | $ cd delayedstrip |
|
948 | $ cd delayedstrip | |
949 | $ hg debugdrawdag <<'EOS' |
|
949 | $ hg debugdrawdag <<'EOS' | |
950 | > D |
|
950 | > D | |
951 | > | |
|
951 | > | | |
952 | > C F H # Commit on top of "I", |
|
952 | > C F H # Commit on top of "I", | |
953 | > | |/| # Strip B+D+I+E+G+H+Z |
|
953 | > | |/| # Strip B+D+I+E+G+H+Z | |
954 | > I B E G |
|
954 | > I B E G | |
955 | > \|/ |
|
955 | > \|/ | |
956 | > A Z |
|
956 | > A Z | |
957 | > EOS |
|
957 | > EOS | |
958 | $ cp -R . ../scmutilcleanup |
|
958 | $ cp -R . ../scmutilcleanup | |
959 |
|
959 | |||
960 | $ hg up -C I |
|
960 | $ hg up -C I | |
961 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
961 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
962 | $ echo 3 >> I |
|
962 | $ echo 3 >> I | |
963 | $ cat > $TESTTMP/delayedstrip.py <<EOF |
|
963 | $ cat > $TESTTMP/delayedstrip.py <<EOF | |
964 | > from mercurial import repair, commands |
|
964 | > from mercurial import repair, commands | |
965 | > def reposetup(ui, repo): |
|
965 | > def reposetup(ui, repo): | |
966 | > def getnodes(expr): |
|
966 | > def getnodes(expr): | |
967 | > return [repo.changelog.node(r) for r in repo.revs(expr)] |
|
967 | > return [repo.changelog.node(r) for r in repo.revs(expr)] | |
968 | > with repo.wlock(): |
|
968 | > with repo.wlock(): | |
969 | > with repo.lock(): |
|
969 | > with repo.lock(): | |
970 | > with repo.transaction('delayedstrip'): |
|
970 | > with repo.transaction('delayedstrip'): | |
971 | > repair.delayedstrip(ui, repo, getnodes('B+I+Z+D+E'), 'J') |
|
971 | > repair.delayedstrip(ui, repo, getnodes('B+I+Z+D+E'), 'J') | |
972 | > repair.delayedstrip(ui, repo, getnodes('G+H+Z'), 'I') |
|
972 | > repair.delayedstrip(ui, repo, getnodes('G+H+Z'), 'I') | |
973 | > commands.commit(ui, repo, message='J', date='0 0') |
|
973 | > commands.commit(ui, repo, message='J', date='0 0') | |
974 | > EOF |
|
974 | > EOF | |
975 | $ hg log -r . -T '\n' --config extensions.t=$TESTTMP/delayedstrip.py |
|
975 | $ hg log -r . -T '\n' --config extensions.t=$TESTTMP/delayedstrip.py | |
976 | warning: orphaned descendants detected, not stripping 08ebfeb61bac, 112478962961, 7fb047a69f22 |
|
976 | warning: orphaned descendants detected, not stripping 08ebfeb61bac, 112478962961, 7fb047a69f22 | |
977 |
saved backup bundle to $TESTTMP/delayedstrip/.hg/strip-backup/f585351a92f8- |
|
977 | saved backup bundle to $TESTTMP/delayedstrip/.hg/strip-backup/f585351a92f8-17475721-I.hg (glob) | |
978 |
|
978 | |||
979 | $ hg log -G -T '{rev}:{node|short} {desc}' -r 'sort(all(), topo)' |
|
979 | $ hg log -G -T '{rev}:{node|short} {desc}' -r 'sort(all(), topo)' | |
980 | @ 6:2f2d51af6205 J |
|
980 | @ 6:2f2d51af6205 J | |
981 | | |
|
981 | | | |
982 | o 3:08ebfeb61bac I |
|
982 | o 3:08ebfeb61bac I | |
983 | | |
|
983 | | | |
984 | | o 5:64a8289d2492 F |
|
984 | | o 5:64a8289d2492 F | |
985 | | | |
|
985 | | | | |
986 | | o 2:7fb047a69f22 E |
|
986 | | o 2:7fb047a69f22 E | |
987 | |/ |
|
987 | |/ | |
988 | | o 4:26805aba1e60 C |
|
988 | | o 4:26805aba1e60 C | |
989 | | | |
|
989 | | | | |
990 | | o 1:112478962961 B |
|
990 | | o 1:112478962961 B | |
991 | |/ |
|
991 | |/ | |
992 | o 0:426bada5c675 A |
|
992 | o 0:426bada5c675 A | |
993 |
|
993 | |||
994 | Test high-level scmutil.cleanupnodes API |
|
994 | Test high-level scmutil.cleanupnodes API | |
995 |
|
995 | |||
996 | $ cd $TESTTMP/scmutilcleanup |
|
996 | $ cd $TESTTMP/scmutilcleanup | |
997 | $ hg debugdrawdag <<'EOS' |
|
997 | $ hg debugdrawdag <<'EOS' | |
998 | > D2 F2 G2 # D2, F2, G2 are replacements for D, F, G |
|
998 | > D2 F2 G2 # D2, F2, G2 are replacements for D, F, G | |
999 | > | | | |
|
999 | > | | | | |
1000 | > C H G |
|
1000 | > C H G | |
1001 | > EOS |
|
1001 | > EOS | |
1002 | $ for i in B C D F G I Z; do |
|
1002 | $ for i in B C D F G I Z; do | |
1003 | > hg bookmark -i -r $i b-$i |
|
1003 | > hg bookmark -i -r $i b-$i | |
1004 | > done |
|
1004 | > done | |
1005 | $ hg bookmark -i -r E 'b-F@divergent1' |
|
1005 | $ hg bookmark -i -r E 'b-F@divergent1' | |
1006 | $ hg bookmark -i -r H 'b-F@divergent2' |
|
1006 | $ hg bookmark -i -r H 'b-F@divergent2' | |
1007 | $ hg bookmark -i -r G 'b-F@divergent3' |
|
1007 | $ hg bookmark -i -r G 'b-F@divergent3' | |
1008 | $ cp -R . ../scmutilcleanup.obsstore |
|
1008 | $ cp -R . ../scmutilcleanup.obsstore | |
1009 |
|
1009 | |||
1010 | $ cat > $TESTTMP/scmutilcleanup.py <<EOF |
|
1010 | $ cat > $TESTTMP/scmutilcleanup.py <<EOF | |
1011 | > from mercurial import scmutil |
|
1011 | > from mercurial import scmutil | |
1012 | > def reposetup(ui, repo): |
|
1012 | > def reposetup(ui, repo): | |
1013 | > def nodes(expr): |
|
1013 | > def nodes(expr): | |
1014 | > return [repo.changelog.node(r) for r in repo.revs(expr)] |
|
1014 | > return [repo.changelog.node(r) for r in repo.revs(expr)] | |
1015 | > def node(expr): |
|
1015 | > def node(expr): | |
1016 | > return nodes(expr)[0] |
|
1016 | > return nodes(expr)[0] | |
1017 | > with repo.wlock(): |
|
1017 | > with repo.wlock(): | |
1018 | > with repo.lock(): |
|
1018 | > with repo.lock(): | |
1019 | > with repo.transaction('delayedstrip'): |
|
1019 | > with repo.transaction('delayedstrip'): | |
1020 | > mapping = {node('F'): [node('F2')], |
|
1020 | > mapping = {node('F'): [node('F2')], | |
1021 | > node('D'): [node('D2')], |
|
1021 | > node('D'): [node('D2')], | |
1022 | > node('G'): [node('G2')]} |
|
1022 | > node('G'): [node('G2')]} | |
1023 | > scmutil.cleanupnodes(repo, mapping, 'replace') |
|
1023 | > scmutil.cleanupnodes(repo, mapping, 'replace') | |
1024 | > scmutil.cleanupnodes(repo, nodes('((B::)+I+Z)-D2'), 'replace') |
|
1024 | > scmutil.cleanupnodes(repo, nodes('((B::)+I+Z)-D2'), 'replace') | |
1025 | > EOF |
|
1025 | > EOF | |
1026 | $ hg log -r . -T '\n' --config extensions.t=$TESTTMP/scmutilcleanup.py |
|
1026 | $ hg log -r . -T '\n' --config extensions.t=$TESTTMP/scmutilcleanup.py | |
1027 | warning: orphaned descendants detected, not stripping 112478962961, 1fc8102cda62, 26805aba1e60 |
|
1027 | warning: orphaned descendants detected, not stripping 112478962961, 1fc8102cda62, 26805aba1e60 | |
1028 | saved backup bundle to $TESTTMP/scmutilcleanup/.hg/strip-backup/f585351a92f8-73fb7c03-replace.hg (glob) |
|
1028 | saved backup bundle to $TESTTMP/scmutilcleanup/.hg/strip-backup/f585351a92f8-73fb7c03-replace.hg (glob) | |
1029 |
|
1029 | |||
1030 | $ hg log -G -T '{rev}:{node|short} {desc} {bookmarks}' -r 'sort(all(), topo)' |
|
1030 | $ hg log -G -T '{rev}:{node|short} {desc} {bookmarks}' -r 'sort(all(), topo)' | |
1031 | o 8:1473d4b996d1 G2 b-F@divergent3 b-G |
|
1031 | o 8:1473d4b996d1 G2 b-F@divergent3 b-G | |
1032 | | |
|
1032 | | | |
1033 |
| o 7:d |
|
1033 | | o 7:d11b3456a873 F2 b-F | |
1034 | | | |
|
1034 | | | | |
1035 |
| o 5: |
|
1035 | | o 5:5cb05ba470a7 H | |
1036 | |/| |
|
1036 | |/| | |
1037 | | o 3:7fb047a69f22 E b-F@divergent1 |
|
1037 | | o 3:7fb047a69f22 E b-F@divergent1 | |
1038 | | | |
|
1038 | | | | |
1039 | | | o 6:7c78f703e465 D2 b-D |
|
1039 | | | o 6:7c78f703e465 D2 b-D | |
1040 | | | | |
|
1040 | | | | | |
1041 | | | o 4:26805aba1e60 C |
|
1041 | | | o 4:26805aba1e60 C | |
1042 | | | | |
|
1042 | | | | | |
1043 | | | o 2:112478962961 B |
|
1043 | | | o 2:112478962961 B | |
1044 | | |/ |
|
1044 | | |/ | |
1045 | o | 1:1fc8102cda62 G |
|
1045 | o | 1:1fc8102cda62 G | |
1046 | / |
|
1046 | / | |
1047 | o 0:426bada5c675 A b-B b-C b-I |
|
1047 | o 0:426bada5c675 A b-B b-C b-I | |
1048 |
|
1048 | |||
1049 | $ hg bookmark |
|
1049 | $ hg bookmark | |
1050 | b-B 0:426bada5c675 |
|
1050 | b-B 0:426bada5c675 | |
1051 | b-C 0:426bada5c675 |
|
1051 | b-C 0:426bada5c675 | |
1052 | b-D 6:7c78f703e465 |
|
1052 | b-D 6:7c78f703e465 | |
1053 |
b-F 7:d |
|
1053 | b-F 7:d11b3456a873 | |
1054 | b-F@divergent1 3:7fb047a69f22 |
|
1054 | b-F@divergent1 3:7fb047a69f22 | |
1055 | b-F@divergent3 8:1473d4b996d1 |
|
1055 | b-F@divergent3 8:1473d4b996d1 | |
1056 | b-G 8:1473d4b996d1 |
|
1056 | b-G 8:1473d4b996d1 | |
1057 | b-I 0:426bada5c675 |
|
1057 | b-I 0:426bada5c675 | |
1058 | b-Z -1:000000000000 |
|
1058 | b-Z -1:000000000000 | |
1059 |
|
1059 | |||
1060 | Test the above using obsstore "by the way". Not directly related to strip, but |
|
1060 | Test the above using obsstore "by the way". Not directly related to strip, but | |
1061 | we have reusable code here |
|
1061 | we have reusable code here | |
1062 |
|
1062 | |||
1063 | $ cd $TESTTMP/scmutilcleanup.obsstore |
|
1063 | $ cd $TESTTMP/scmutilcleanup.obsstore | |
1064 | $ cat >> .hg/hgrc <<EOF |
|
1064 | $ cat >> .hg/hgrc <<EOF | |
1065 | > [experimental] |
|
1065 | > [experimental] | |
1066 | > evolution=all |
|
1066 | > evolution=all | |
1067 | > evolution.track-operation=1 |
|
1067 | > evolution.track-operation=1 | |
1068 | > EOF |
|
1068 | > EOF | |
1069 |
|
1069 | |||
1070 | $ hg log -r . -T '\n' --config extensions.t=$TESTTMP/scmutilcleanup.py |
|
1070 | $ hg log -r . -T '\n' --config extensions.t=$TESTTMP/scmutilcleanup.py | |
1071 |
|
1071 | |||
1072 | $ rm .hg/localtags |
|
1072 | $ rm .hg/localtags | |
1073 | $ hg log -G -T '{rev}:{node|short} {desc} {bookmarks}' -r 'sort(all(), topo)' |
|
1073 | $ hg log -G -T '{rev}:{node|short} {desc} {bookmarks}' -r 'sort(all(), topo)' | |
1074 | o 12:1473d4b996d1 G2 b-F@divergent3 b-G |
|
1074 | o 12:1473d4b996d1 G2 b-F@divergent3 b-G | |
1075 | | |
|
1075 | | | |
1076 |
| o 11:d |
|
1076 | | o 11:d11b3456a873 F2 b-F | |
1077 | | | |
|
1077 | | | | |
1078 |
| o 8: |
|
1078 | | o 8:5cb05ba470a7 H | |
1079 | |/| |
|
1079 | |/| | |
1080 | | o 4:7fb047a69f22 E b-F@divergent1 |
|
1080 | | o 4:7fb047a69f22 E b-F@divergent1 | |
1081 | | | |
|
1081 | | | | |
1082 | | | o 10:7c78f703e465 D2 b-D |
|
1082 | | | o 10:7c78f703e465 D2 b-D | |
1083 | | | | |
|
1083 | | | | | |
1084 | | | x 6:26805aba1e60 C |
|
1084 | | | x 6:26805aba1e60 C | |
1085 | | | | |
|
1085 | | | | | |
1086 | | | x 3:112478962961 B |
|
1086 | | | x 3:112478962961 B | |
1087 | | |/ |
|
1087 | | |/ | |
1088 | x | 1:1fc8102cda62 G |
|
1088 | x | 1:1fc8102cda62 G | |
1089 | / |
|
1089 | / | |
1090 | o 0:426bada5c675 A b-B b-C b-I |
|
1090 | o 0:426bada5c675 A b-B b-C b-I | |
1091 |
|
1091 | |||
1092 | $ hg debugobsolete |
|
1092 | $ hg debugobsolete | |
1093 | 1fc8102cda6204549f031015641606ccf5513ec3 1473d4b996d1d1b121de6b39fab6a04fbf9d873e 0 (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} |
|
1093 | 1fc8102cda6204549f031015641606ccf5513ec3 1473d4b996d1d1b121de6b39fab6a04fbf9d873e 0 (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} | |
1094 |
64a8289d249234b9886244d379f15e6b650b28e3 d |
|
1094 | 64a8289d249234b9886244d379f15e6b650b28e3 d11b3456a873daec7c7bc53e5622e8df6d741bd2 0 (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} | |
1095 | f585351a92f85104bff7c284233c338b10eb1df7 7c78f703e465d73102cc8780667ce269c5208a40 0 (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} |
|
1095 | f585351a92f85104bff7c284233c338b10eb1df7 7c78f703e465d73102cc8780667ce269c5208a40 0 (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} | |
1096 | 48b9aae0607f43ff110d84e6883c151942add5ab 0 {0000000000000000000000000000000000000000} (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} |
|
1096 | 48b9aae0607f43ff110d84e6883c151942add5ab 0 {0000000000000000000000000000000000000000} (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} | |
1097 | 112478962961147124edd43549aedd1a335e44bf 0 {426bada5c67598ca65036d57d9e4b64b0c1ce7a0} (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} |
|
1097 | 112478962961147124edd43549aedd1a335e44bf 0 {426bada5c67598ca65036d57d9e4b64b0c1ce7a0} (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} | |
1098 | 08ebfeb61bac6e3f12079de774d285a0d6689eba 0 {426bada5c67598ca65036d57d9e4b64b0c1ce7a0} (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} |
|
1098 | 08ebfeb61bac6e3f12079de774d285a0d6689eba 0 {426bada5c67598ca65036d57d9e4b64b0c1ce7a0} (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} | |
1099 | 26805aba1e600a82e93661149f2313866a221a7b 0 {112478962961147124edd43549aedd1a335e44bf} (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} |
|
1099 | 26805aba1e600a82e93661149f2313866a221a7b 0 {112478962961147124edd43549aedd1a335e44bf} (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'replace', 'user': 'test'} |
General Comments 0
You need to be logged in to leave comments.
Login now