##// END OF EJS Templates
test-revert: make sure all 'tracked' files are really tracked...
Martin von Zweigbergk -
r23161:6f31f46b default
parent child Browse files
Show More
@@ -1,1090 +1,1100 b''
1 $ hg init repo
1 $ hg init repo
2 $ cd repo
2 $ cd repo
3 $ echo 123 > a
3 $ echo 123 > a
4 $ echo 123 > c
4 $ echo 123 > c
5 $ echo 123 > e
5 $ echo 123 > e
6 $ hg add a c e
6 $ hg add a c e
7 $ hg commit -m "first" a c e
7 $ hg commit -m "first" a c e
8
8
9 nothing changed
9 nothing changed
10
10
11 $ hg revert
11 $ hg revert
12 abort: no files or directories specified
12 abort: no files or directories specified
13 (use --all to revert all files)
13 (use --all to revert all files)
14 [255]
14 [255]
15 $ hg revert --all
15 $ hg revert --all
16
16
17 Introduce some changes and revert them
17 Introduce some changes and revert them
18 --------------------------------------
18 --------------------------------------
19
19
20 $ echo 123 > b
20 $ echo 123 > b
21
21
22 $ hg status
22 $ hg status
23 ? b
23 ? b
24 $ echo 12 > c
24 $ echo 12 > c
25
25
26 $ hg status
26 $ hg status
27 M c
27 M c
28 ? b
28 ? b
29 $ hg add b
29 $ hg add b
30
30
31 $ hg status
31 $ hg status
32 M c
32 M c
33 A b
33 A b
34 $ hg rm a
34 $ hg rm a
35
35
36 $ hg status
36 $ hg status
37 M c
37 M c
38 A b
38 A b
39 R a
39 R a
40
40
41 revert removal of a file
41 revert removal of a file
42
42
43 $ hg revert a
43 $ hg revert a
44 $ hg status
44 $ hg status
45 M c
45 M c
46 A b
46 A b
47
47
48 revert addition of a file
48 revert addition of a file
49
49
50 $ hg revert b
50 $ hg revert b
51 $ hg status
51 $ hg status
52 M c
52 M c
53 ? b
53 ? b
54
54
55 revert modification of a file (--no-backup)
55 revert modification of a file (--no-backup)
56
56
57 $ hg revert --no-backup c
57 $ hg revert --no-backup c
58 $ hg status
58 $ hg status
59 ? b
59 ? b
60
60
61 revert deletion (! status) of a added file
61 revert deletion (! status) of a added file
62 ------------------------------------------
62 ------------------------------------------
63
63
64 $ hg add b
64 $ hg add b
65
65
66 $ hg status b
66 $ hg status b
67 A b
67 A b
68 $ rm b
68 $ rm b
69 $ hg status b
69 $ hg status b
70 ! b
70 ! b
71 $ hg revert -v b
71 $ hg revert -v b
72 forgetting b
72 forgetting b
73 $ hg status b
73 $ hg status b
74 b: * (glob)
74 b: * (glob)
75
75
76 $ ls
76 $ ls
77 a
77 a
78 c
78 c
79 e
79 e
80
80
81 Test creation of backup (.orig) files
81 Test creation of backup (.orig) files
82 -------------------------------------
82 -------------------------------------
83
83
84 $ echo z > e
84 $ echo z > e
85 $ hg revert --all -v
85 $ hg revert --all -v
86 saving current version of e as e.orig
86 saving current version of e as e.orig
87 reverting e
87 reverting e
88
88
89 revert on clean file (no change)
89 revert on clean file (no change)
90 --------------------------------
90 --------------------------------
91
91
92 $ hg revert a
92 $ hg revert a
93 no changes needed to a
93 no changes needed to a
94
94
95 revert on an untracked file
95 revert on an untracked file
96 ---------------------------
96 ---------------------------
97
97
98 $ echo q > q
98 $ echo q > q
99 $ hg revert q
99 $ hg revert q
100 file not managed: q
100 file not managed: q
101 $ rm q
101 $ rm q
102
102
103 revert on file that does not exists
103 revert on file that does not exists
104 -----------------------------------
104 -----------------------------------
105
105
106 $ hg revert notfound
106 $ hg revert notfound
107 notfound: no such file in rev 334a9e57682c
107 notfound: no such file in rev 334a9e57682c
108 $ touch d
108 $ touch d
109 $ hg add d
109 $ hg add d
110 $ hg rm a
110 $ hg rm a
111 $ hg commit -m "second"
111 $ hg commit -m "second"
112 $ echo z > z
112 $ echo z > z
113 $ hg add z
113 $ hg add z
114 $ hg st
114 $ hg st
115 A z
115 A z
116 ? e.orig
116 ? e.orig
117
117
118 revert to another revision (--rev)
118 revert to another revision (--rev)
119 ----------------------------------
119 ----------------------------------
120
120
121 $ hg revert --all -r0
121 $ hg revert --all -r0
122 adding a
122 adding a
123 removing d
123 removing d
124 forgetting z
124 forgetting z
125
125
126 revert explicitly to parent (--rev)
126 revert explicitly to parent (--rev)
127 -----------------------------------
127 -----------------------------------
128
128
129 $ hg revert --all -rtip
129 $ hg revert --all -rtip
130 forgetting a
130 forgetting a
131 undeleting d
131 undeleting d
132 $ rm a *.orig
132 $ rm a *.orig
133
133
134 revert to another revision (--rev) and exact match
134 revert to another revision (--rev) and exact match
135 --------------------------------------------------
135 --------------------------------------------------
136
136
137 exact match are more silent
137 exact match are more silent
138
138
139 $ hg revert -r0 a
139 $ hg revert -r0 a
140 $ hg st a
140 $ hg st a
141 A a
141 A a
142 $ hg rm d
142 $ hg rm d
143 $ hg st d
143 $ hg st d
144 R d
144 R d
145
145
146 should keep d removed
146 should keep d removed
147
147
148 $ hg revert -r0 d
148 $ hg revert -r0 d
149 no changes needed to d
149 no changes needed to d
150 $ hg st d
150 $ hg st d
151 R d
151 R d
152
152
153 $ hg update -C
153 $ hg update -C
154 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
154 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
155
155
156 revert of exec bit
156 revert of exec bit
157 ------------------
157 ------------------
158
158
159 #if execbit
159 #if execbit
160 $ chmod +x c
160 $ chmod +x c
161 $ hg revert --all
161 $ hg revert --all
162 reverting c
162 reverting c
163
163
164 $ test -x c || echo non-executable
164 $ test -x c || echo non-executable
165 non-executable
165 non-executable
166
166
167 $ chmod +x c
167 $ chmod +x c
168 $ hg commit -m exe
168 $ hg commit -m exe
169
169
170 $ chmod -x c
170 $ chmod -x c
171 $ hg revert --all
171 $ hg revert --all
172 reverting c
172 reverting c
173
173
174 $ test -x c && echo executable
174 $ test -x c && echo executable
175 executable
175 executable
176 #endif
176 #endif
177
177
178 $ cd ..
178 $ cd ..
179
179
180
180
181 Issue241: update and revert produces inconsistent repositories
181 Issue241: update and revert produces inconsistent repositories
182 --------------------------------------------------------------
182 --------------------------------------------------------------
183
183
184 $ hg init a
184 $ hg init a
185 $ cd a
185 $ cd a
186 $ echo a >> a
186 $ echo a >> a
187 $ hg commit -A -d '1 0' -m a
187 $ hg commit -A -d '1 0' -m a
188 adding a
188 adding a
189 $ echo a >> a
189 $ echo a >> a
190 $ hg commit -d '2 0' -m a
190 $ hg commit -d '2 0' -m a
191 $ hg update 0
191 $ hg update 0
192 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
192 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
193 $ mkdir b
193 $ mkdir b
194 $ echo b > b/b
194 $ echo b > b/b
195
195
196 call `hg revert` with no file specified
196 call `hg revert` with no file specified
197 ---------------------------------------
197 ---------------------------------------
198
198
199 $ hg revert -rtip
199 $ hg revert -rtip
200 abort: no files or directories specified
200 abort: no files or directories specified
201 (use --all to revert all files, or 'hg update 1' to update)
201 (use --all to revert all files, or 'hg update 1' to update)
202 [255]
202 [255]
203
203
204 call `hg revert` with --all
204 call `hg revert` with --all
205 ---------------------------
205 ---------------------------
206
206
207 $ hg revert --all -rtip
207 $ hg revert --all -rtip
208 reverting a
208 reverting a
209
209
210
210
211 Issue332: confusing message when reverting directory
211 Issue332: confusing message when reverting directory
212 ----------------------------------------------------
212 ----------------------------------------------------
213
213
214 $ hg ci -A -m b
214 $ hg ci -A -m b
215 adding b/b
215 adding b/b
216 created new head
216 created new head
217 $ echo foobar > b/b
217 $ echo foobar > b/b
218 $ mkdir newdir
218 $ mkdir newdir
219 $ echo foo > newdir/newfile
219 $ echo foo > newdir/newfile
220 $ hg add newdir/newfile
220 $ hg add newdir/newfile
221 $ hg revert b newdir
221 $ hg revert b newdir
222 reverting b/b (glob)
222 reverting b/b (glob)
223 forgetting newdir/newfile (glob)
223 forgetting newdir/newfile (glob)
224 $ echo foobar > b/b
224 $ echo foobar > b/b
225 $ hg revert .
225 $ hg revert .
226 reverting b/b (glob)
226 reverting b/b (glob)
227
227
228
228
229 reverting a rename target should revert the source
229 reverting a rename target should revert the source
230 --------------------------------------------------
230 --------------------------------------------------
231
231
232 $ hg mv a newa
232 $ hg mv a newa
233 $ hg revert newa
233 $ hg revert newa
234 $ hg st a newa
234 $ hg st a newa
235 ? newa
235 ? newa
236
236
237 $ cd ..
237 $ cd ..
238
238
239 $ hg init ignored
239 $ hg init ignored
240 $ cd ignored
240 $ cd ignored
241 $ echo '^ignored$' > .hgignore
241 $ echo '^ignored$' > .hgignore
242 $ echo '^ignoreddir$' >> .hgignore
242 $ echo '^ignoreddir$' >> .hgignore
243 $ echo '^removed$' >> .hgignore
243 $ echo '^removed$' >> .hgignore
244
244
245 $ mkdir ignoreddir
245 $ mkdir ignoreddir
246 $ touch ignoreddir/file
246 $ touch ignoreddir/file
247 $ touch ignoreddir/removed
247 $ touch ignoreddir/removed
248 $ touch ignored
248 $ touch ignored
249 $ touch removed
249 $ touch removed
250
250
251 4 ignored files (we will add/commit everything)
251 4 ignored files (we will add/commit everything)
252
252
253 $ hg st -A -X .hgignore
253 $ hg st -A -X .hgignore
254 I ignored
254 I ignored
255 I ignoreddir/file
255 I ignoreddir/file
256 I ignoreddir/removed
256 I ignoreddir/removed
257 I removed
257 I removed
258 $ hg ci -qAm 'add files' ignored ignoreddir/file ignoreddir/removed removed
258 $ hg ci -qAm 'add files' ignored ignoreddir/file ignoreddir/removed removed
259
259
260 $ echo >> ignored
260 $ echo >> ignored
261 $ echo >> ignoreddir/file
261 $ echo >> ignoreddir/file
262 $ hg rm removed ignoreddir/removed
262 $ hg rm removed ignoreddir/removed
263
263
264 should revert ignored* and undelete *removed
264 should revert ignored* and undelete *removed
265 --------------------------------------------
265 --------------------------------------------
266
266
267 $ hg revert -a --no-backup
267 $ hg revert -a --no-backup
268 reverting ignored
268 reverting ignored
269 reverting ignoreddir/file (glob)
269 reverting ignoreddir/file (glob)
270 undeleting ignoreddir/removed (glob)
270 undeleting ignoreddir/removed (glob)
271 undeleting removed
271 undeleting removed
272 $ hg st -mardi
272 $ hg st -mardi
273
273
274 $ hg up -qC
274 $ hg up -qC
275 $ echo >> ignored
275 $ echo >> ignored
276 $ hg rm removed
276 $ hg rm removed
277
277
278 should silently revert the named files
278 should silently revert the named files
279 --------------------------------------
279 --------------------------------------
280
280
281 $ hg revert --no-backup ignored removed
281 $ hg revert --no-backup ignored removed
282 $ hg st -mardi
282 $ hg st -mardi
283
283
284 Reverting copy (issue3920)
284 Reverting copy (issue3920)
285 --------------------------
285 --------------------------
286
286
287 someone set up us the copies
287 someone set up us the copies
288
288
289 $ rm .hgignore
289 $ rm .hgignore
290 $ hg update -C
290 $ hg update -C
291 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
291 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
292 $ hg mv ignored allyour
292 $ hg mv ignored allyour
293 $ hg copy removed base
293 $ hg copy removed base
294 $ hg commit -m rename
294 $ hg commit -m rename
295
295
296 copies and renames, you have no chance to survive make your time (issue3920)
296 copies and renames, you have no chance to survive make your time (issue3920)
297
297
298 $ hg update '.^'
298 $ hg update '.^'
299 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
299 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
300 $ hg revert -rtip -a
300 $ hg revert -rtip -a
301 adding allyour
301 adding allyour
302 adding base
302 adding base
303 removing ignored
303 removing ignored
304 $ hg status -C
304 $ hg status -C
305 A allyour
305 A allyour
306 ignored
306 ignored
307 A base
307 A base
308 removed
308 removed
309 R ignored
309 R ignored
310
310
311 Test revert of a file added by one side of the merge
311 Test revert of a file added by one side of the merge
312 ====================================================
312 ====================================================
313
313
314 remove any pending change
314 remove any pending change
315
315
316 $ hg revert --all
316 $ hg revert --all
317 forgetting allyour
317 forgetting allyour
318 forgetting base
318 forgetting base
319 undeleting ignored
319 undeleting ignored
320 $ hg purge --all --config extensions.purge=
320 $ hg purge --all --config extensions.purge=
321
321
322 Adds a new commit
322 Adds a new commit
323
323
324 $ echo foo > newadd
324 $ echo foo > newadd
325 $ hg add newadd
325 $ hg add newadd
326 $ hg commit -m 'other adds'
326 $ hg commit -m 'other adds'
327 created new head
327 created new head
328
328
329
329
330 merge it with the other head
330 merge it with the other head
331
331
332 $ hg merge # merge 1 into 2
332 $ hg merge # merge 1 into 2
333 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
333 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
334 (branch merge, don't forget to commit)
334 (branch merge, don't forget to commit)
335 $ hg summary
335 $ hg summary
336 parent: 2:b8ec310b2d4e tip
336 parent: 2:b8ec310b2d4e tip
337 other adds
337 other adds
338 parent: 1:f6180deb8fbe
338 parent: 1:f6180deb8fbe
339 rename
339 rename
340 branch: default
340 branch: default
341 commit: 2 modified, 1 removed (merge)
341 commit: 2 modified, 1 removed (merge)
342 update: (current)
342 update: (current)
343
343
344 clarifies who added what
344 clarifies who added what
345
345
346 $ hg status
346 $ hg status
347 M allyour
347 M allyour
348 M base
348 M base
349 R ignored
349 R ignored
350 $ hg status --change 'p1()'
350 $ hg status --change 'p1()'
351 A newadd
351 A newadd
352 $ hg status --change 'p2()'
352 $ hg status --change 'p2()'
353 A allyour
353 A allyour
354 A base
354 A base
355 R ignored
355 R ignored
356
356
357 revert file added by p1() to p1() state
357 revert file added by p1() to p1() state
358 -----------------------------------------
358 -----------------------------------------
359
359
360 $ hg revert -r 'p1()' 'glob:newad?'
360 $ hg revert -r 'p1()' 'glob:newad?'
361 $ hg status
361 $ hg status
362 M allyour
362 M allyour
363 M base
363 M base
364 R ignored
364 R ignored
365
365
366 revert file added by p1() to p2() state
366 revert file added by p1() to p2() state
367 ------------------------------------------
367 ------------------------------------------
368
368
369 $ hg revert -r 'p2()' 'glob:newad?'
369 $ hg revert -r 'p2()' 'glob:newad?'
370 removing newadd
370 removing newadd
371 $ hg status
371 $ hg status
372 M allyour
372 M allyour
373 M base
373 M base
374 R ignored
374 R ignored
375 R newadd
375 R newadd
376
376
377 revert file added by p2() to p2() state
377 revert file added by p2() to p2() state
378 ------------------------------------------
378 ------------------------------------------
379
379
380 $ hg revert -r 'p2()' 'glob:allyou?'
380 $ hg revert -r 'p2()' 'glob:allyou?'
381 $ hg status
381 $ hg status
382 M allyour
382 M allyour
383 M base
383 M base
384 R ignored
384 R ignored
385 R newadd
385 R newadd
386
386
387 revert file added by p2() to p1() state
387 revert file added by p2() to p1() state
388 ------------------------------------------
388 ------------------------------------------
389
389
390 $ hg revert -r 'p1()' 'glob:allyou?'
390 $ hg revert -r 'p1()' 'glob:allyou?'
391 removing allyour
391 removing allyour
392 $ hg status
392 $ hg status
393 M base
393 M base
394 R allyour
394 R allyour
395 R ignored
395 R ignored
396 R newadd
396 R newadd
397
397
398 Systematic behavior validation of most possible cases
398 Systematic behavior validation of most possible cases
399 =====================================================
399 =====================================================
400
400
401 This section tests most of the possible combinations of revision states and
401 This section tests most of the possible combinations of revision states and
402 working directory states. The number of possible cases is significant but they
402 working directory states. The number of possible cases is significant but they
403 but they all have a slightly different handling. So this section commits to
403 but they all have a slightly different handling. So this section commits to
404 and testing all of them to allow safe refactoring of the revert code.
404 and testing all of them to allow safe refactoring of the revert code.
405
405
406 A python script is used to generate a file history for each combination of
406 A python script is used to generate a file history for each combination of
407 states, on one side the content (or lack thereof) in two revisions, and
407 states, on one side the content (or lack thereof) in two revisions, and
408 on the other side, the content and "tracked-ness" of the working directory. The
408 on the other side, the content and "tracked-ness" of the working directory. The
409 three states generated are:
409 three states generated are:
410
410
411 - a "base" revision
411 - a "base" revision
412 - a "parent" revision
412 - a "parent" revision
413 - the working directory (based on "parent")
413 - the working directory (based on "parent")
414
414
415 The files generated have names of the form:
415 The files generated have names of the form:
416
416
417 <rev1-content>_<rev2-content>_<working-copy-content>-<tracked-ness>
417 <rev1-content>_<rev2-content>_<working-copy-content>-<tracked-ness>
418
418
419 All known states are not tested yet. See inline documentation for details.
419 All known states are not tested yet. See inline documentation for details.
420 Special cases from merge and rename are not tested by this section.
420 Special cases from merge and rename are not tested by this section.
421
421
422 Write the python script to disk
422 Write the python script to disk
423 -------------------------------
423 -------------------------------
424
424
425 $ cat << EOF > gen-revert-cases.py
425 $ cat << EOF > gen-revert-cases.py
426 > # generate proper file state to test revert behavior
426 > # generate proper file state to test revert behavior
427 > import sys
427 > import sys
428 > import os
428 > import os
429 >
429 >
430 > # content of the file in "base" and "parent"
430 > # content of the file in "base" and "parent"
431 > # None means no file at all
431 > # None means no file at all
432 > ctxcontent = {
432 > ctxcontent = {
433 > # clean: no change from base to parent
433 > # clean: no change from base to parent
434 > 'clean': ['content1', 'content1'],
434 > 'clean': ['content1', 'content1'],
435 > # modified: file content change from base to parent
435 > # modified: file content change from base to parent
436 > 'modified': ['content1', 'content2'],
436 > 'modified': ['content1', 'content2'],
437 > # added: file is missing from base and added in parent
437 > # added: file is missing from base and added in parent
438 > 'added': [None, 'content2'],
438 > 'added': [None, 'content2'],
439 > # removed: file exist in base but is removed from parent
439 > # removed: file exist in base but is removed from parent
440 > 'removed': ['content1', None],
440 > 'removed': ['content1', None],
441 > # file exist neither in base not in parent
441 > # file exist neither in base not in parent
442 > 'missing': [None, None],
442 > 'missing': [None, None],
443 > }
443 > }
444 >
444 >
445 > # content of file in working copy
445 > # content of file in working copy
446 > wccontent = {
446 > wccontent = {
447 > # clean: wc content is the same as parent
447 > # clean: wc content is the same as parent
448 > 'clean': (True, lambda cc: cc[1]),
448 > 'clean': (True, lambda cc: cc[1]),
449 > # revert: wc content is the same as base
449 > # revert: wc content is the same as base
450 > 'revert': (True, lambda cc: cc[0]),
450 > 'revert': (True, lambda cc: cc[0]),
451 > # wc: file exist with a content different from base and parent
451 > # wc: file exist with a content different from base and parent
452 > 'wc': (True, lambda cc: 'content3'),
452 > 'wc': (True, lambda cc: 'content3'),
453 > # deleted: file is recorded as tracked but missing
453 > # deleted: file is recorded as tracked but missing
454 > # rely on file deletion outside of this script
454 > # rely on file deletion outside of this script
455 > 'deleted': (True, lambda cc:'TOBEDELETED'),
455 > 'deleted': (True, lambda cc: None),
456 > }
456 > }
457 > # untracked-X is a version of X where the file is not tracked (? unknown)
457 > # untracked-X is a version of X where the file is not tracked (? unknown)
458 > wccontent['untracked-clean'] = (False, wccontent['clean'][1])
458 > wccontent['untracked-clean'] = (False, wccontent['clean'][1])
459 > wccontent['untracked-deleted'] = (False, wccontent['deleted'][1])
459 > wccontent['untracked-deleted'] = (False, wccontent['deleted'][1])
460 > wccontent['untracked-revert'] = (False, wccontent['revert'][1])
460 > wccontent['untracked-revert'] = (False, wccontent['revert'][1])
461 > wccontent['untracked-wc'] = (False, wccontent['wc'][1])
461 > wccontent['untracked-wc'] = (False, wccontent['wc'][1])
462 >
462 >
463 > # build the combination of possible states
463 > # build the combination of possible states
464 > combination = []
464 > combination = []
465 > for ctxkey, ctxvalue in ctxcontent.iteritems():
465 > for ctxkey, ctxvalue in ctxcontent.iteritems():
466 > for wckey, (tracked, wcfunc) in wccontent.iteritems():
466 > for wckey, (tracked, wcfunc) in wccontent.iteritems():
467 > base, parent = ctxvalue
467 > base, parent = ctxvalue
468 > if (base == parent and 'revert' in wckey):
468 > if (base == parent and 'revert' in wckey):
469 > continue
469 > continue
470 > if not base and 'revert' in wckey:
470 > if not base and 'revert' in wckey:
471 > continue
471 > continue
472 > if not parent and 'deleted' in wckey:
472 > if not parent and 'deleted' in wckey:
473 > continue
473 > continue
474 > def statestring(content):
474 > def statestring(content):
475 > return content in (None, 'TOBEDELETED') and 'missing' or content
475 > return content is None and 'missing' or content
476 > wcc = wcfunc(ctxvalue)
476 > wcc = wcfunc(ctxvalue)
477 > trackedstring = tracked and 'tracked' or 'untracked'
477 > trackedstring = tracked and 'tracked' or 'untracked'
478 > filename = "%s_%s_%s-%s" % (statestring(base),
478 > filename = "%s_%s_%s-%s" % (statestring(base),
479 > statestring(parent),
479 > statestring(parent),
480 > statestring(wcc),
480 > statestring(wcc),
481 > trackedstring)
481 > trackedstring)
482 > combination.append((filename, base, parent, wcc))
482 > combination.append((filename, base, parent, wcc))
483 >
483 >
484 > # make sure we have stable output
484 > # make sure we have stable output
485 > combination.sort()
485 > combination.sort()
486 >
486 >
487 > # retrieve the state we must generate
487 > # retrieve the state we must generate
488 > target = sys.argv[1]
488 > target = sys.argv[1]
489 >
489 >
490 > # compute file content
490 > # compute file content
491 > content = []
491 > content = []
492 > for filename, base, parent, wcc in combination:
492 > for filename, base, parent, wcc in combination:
493 > if target == 'filelist':
493 > if target == 'filelist':
494 > print filename
494 > print filename
495 > elif target == 'base':
495 > elif target == 'base':
496 > content.append((filename, base))
496 > content.append((filename, base))
497 > elif target == 'parent':
497 > elif target == 'parent':
498 > content.append((filename, parent))
498 > content.append((filename, parent))
499 > elif target == 'wc':
499 > elif target == 'wc':
500 > content.append((filename, wcc))
500 > # Make sure there is content so the file gets written and can be
501 > # tracked. It will be deleted outside of this script.
502 > content.append((filename, wcc or 'TOBEDELETED'))
501 > else:
503 > else:
502 > print >> sys.stderr, "unknown target:", target
504 > print >> sys.stderr, "unknown target:", target
503 > sys.exit(1)
505 > sys.exit(1)
504 >
506 >
505 > # write actual content
507 > # write actual content
506 > for filename, data in content:
508 > for filename, data in content:
507 > if data is not None:
509 > if data is not None:
508 > f = open(filename, 'w')
510 > f = open(filename, 'w')
509 > f.write(data + '\n')
511 > f.write(data + '\n')
510 > f.close()
512 > f.close()
511 > elif os.path.exists(filename):
513 > elif os.path.exists(filename):
512 > os.remove(filename)
514 > os.remove(filename)
513 > EOF
515 > EOF
514
516
515 check list of planned files
517 check list of planned files
516
518
517 $ python gen-revert-cases.py filelist
519 $ python gen-revert-cases.py filelist
518 content1_content1_content1-tracked
520 content1_content1_content1-tracked
519 content1_content1_content1-untracked
521 content1_content1_content1-untracked
520 content1_content1_content3-tracked
522 content1_content1_content3-tracked
521 content1_content1_content3-untracked
523 content1_content1_content3-untracked
522 content1_content1_missing-tracked
524 content1_content1_missing-tracked
523 content1_content1_missing-untracked
525 content1_content1_missing-untracked
524 content1_content2_content1-tracked
526 content1_content2_content1-tracked
525 content1_content2_content1-untracked
527 content1_content2_content1-untracked
526 content1_content2_content2-tracked
528 content1_content2_content2-tracked
527 content1_content2_content2-untracked
529 content1_content2_content2-untracked
528 content1_content2_content3-tracked
530 content1_content2_content3-tracked
529 content1_content2_content3-untracked
531 content1_content2_content3-untracked
530 content1_content2_missing-tracked
532 content1_content2_missing-tracked
531 content1_content2_missing-untracked
533 content1_content2_missing-untracked
532 content1_missing_content1-tracked
534 content1_missing_content1-tracked
533 content1_missing_content1-untracked
535 content1_missing_content1-untracked
534 content1_missing_content3-tracked
536 content1_missing_content3-tracked
535 content1_missing_content3-untracked
537 content1_missing_content3-untracked
536 content1_missing_missing-tracked
538 content1_missing_missing-tracked
537 content1_missing_missing-untracked
539 content1_missing_missing-untracked
538 missing_content2_content2-tracked
540 missing_content2_content2-tracked
539 missing_content2_content2-untracked
541 missing_content2_content2-untracked
540 missing_content2_content3-tracked
542 missing_content2_content3-tracked
541 missing_content2_content3-untracked
543 missing_content2_content3-untracked
542 missing_content2_missing-tracked
544 missing_content2_missing-tracked
543 missing_content2_missing-untracked
545 missing_content2_missing-untracked
544 missing_missing_content3-tracked
546 missing_missing_content3-tracked
545 missing_missing_content3-untracked
547 missing_missing_content3-untracked
546 missing_missing_missing-tracked
548 missing_missing_missing-tracked
547 missing_missing_missing-untracked
549 missing_missing_missing-untracked
548
550
549 Script to make a simple text version of the content
551 Script to make a simple text version of the content
550 ---------------------------------------------------
552 ---------------------------------------------------
551
553
552 $ cat << EOF >> dircontent.py
554 $ cat << EOF >> dircontent.py
553 > # generate a simple text view of the directory for easy comparison
555 > # generate a simple text view of the directory for easy comparison
554 > import os
556 > import os
555 > files = os.listdir('.')
557 > files = os.listdir('.')
556 > files.sort()
558 > files.sort()
557 > for filename in files:
559 > for filename in files:
558 > if os.path.isdir(filename):
560 > if os.path.isdir(filename):
559 > continue
561 > continue
560 > content = open(filename).read()
562 > content = open(filename).read()
561 > print '%-6s %s' % (content.strip(), filename)
563 > print '%-6s %s' % (content.strip(), filename)
562 > EOF
564 > EOF
563
565
564 Generate appropriate repo state
566 Generate appropriate repo state
565 -------------------------------
567 -------------------------------
566
568
567 $ hg init revert-ref
569 $ hg init revert-ref
568 $ cd revert-ref
570 $ cd revert-ref
569
571
570 Generate base changeset
572 Generate base changeset
571
573
572 $ python ../gen-revert-cases.py base
574 $ python ../gen-revert-cases.py base
573 $ hg addremove --similarity 0
575 $ hg addremove --similarity 0
574 adding content1_content1_content1-tracked
576 adding content1_content1_content1-tracked
575 adding content1_content1_content1-untracked
577 adding content1_content1_content1-untracked
576 adding content1_content1_content3-tracked
578 adding content1_content1_content3-tracked
577 adding content1_content1_content3-untracked
579 adding content1_content1_content3-untracked
578 adding content1_content1_missing-tracked
580 adding content1_content1_missing-tracked
579 adding content1_content1_missing-untracked
581 adding content1_content1_missing-untracked
580 adding content1_content2_content1-tracked
582 adding content1_content2_content1-tracked
581 adding content1_content2_content1-untracked
583 adding content1_content2_content1-untracked
582 adding content1_content2_content2-tracked
584 adding content1_content2_content2-tracked
583 adding content1_content2_content2-untracked
585 adding content1_content2_content2-untracked
584 adding content1_content2_content3-tracked
586 adding content1_content2_content3-tracked
585 adding content1_content2_content3-untracked
587 adding content1_content2_content3-untracked
586 adding content1_content2_missing-tracked
588 adding content1_content2_missing-tracked
587 adding content1_content2_missing-untracked
589 adding content1_content2_missing-untracked
588 adding content1_missing_content1-tracked
590 adding content1_missing_content1-tracked
589 adding content1_missing_content1-untracked
591 adding content1_missing_content1-untracked
590 adding content1_missing_content3-tracked
592 adding content1_missing_content3-tracked
591 adding content1_missing_content3-untracked
593 adding content1_missing_content3-untracked
592 adding content1_missing_missing-tracked
594 adding content1_missing_missing-tracked
593 adding content1_missing_missing-untracked
595 adding content1_missing_missing-untracked
594 $ hg status
596 $ hg status
595 A content1_content1_content1-tracked
597 A content1_content1_content1-tracked
596 A content1_content1_content1-untracked
598 A content1_content1_content1-untracked
597 A content1_content1_content3-tracked
599 A content1_content1_content3-tracked
598 A content1_content1_content3-untracked
600 A content1_content1_content3-untracked
599 A content1_content1_missing-tracked
601 A content1_content1_missing-tracked
600 A content1_content1_missing-untracked
602 A content1_content1_missing-untracked
601 A content1_content2_content1-tracked
603 A content1_content2_content1-tracked
602 A content1_content2_content1-untracked
604 A content1_content2_content1-untracked
603 A content1_content2_content2-tracked
605 A content1_content2_content2-tracked
604 A content1_content2_content2-untracked
606 A content1_content2_content2-untracked
605 A content1_content2_content3-tracked
607 A content1_content2_content3-tracked
606 A content1_content2_content3-untracked
608 A content1_content2_content3-untracked
607 A content1_content2_missing-tracked
609 A content1_content2_missing-tracked
608 A content1_content2_missing-untracked
610 A content1_content2_missing-untracked
609 A content1_missing_content1-tracked
611 A content1_missing_content1-tracked
610 A content1_missing_content1-untracked
612 A content1_missing_content1-untracked
611 A content1_missing_content3-tracked
613 A content1_missing_content3-tracked
612 A content1_missing_content3-untracked
614 A content1_missing_content3-untracked
613 A content1_missing_missing-tracked
615 A content1_missing_missing-tracked
614 A content1_missing_missing-untracked
616 A content1_missing_missing-untracked
615 $ hg commit -m 'base'
617 $ hg commit -m 'base'
616
618
617 (create a simple text version of the content)
619 (create a simple text version of the content)
618
620
619 $ python ../dircontent.py > ../content-base.txt
621 $ python ../dircontent.py > ../content-base.txt
620 $ cat ../content-base.txt
622 $ cat ../content-base.txt
621 content1 content1_content1_content1-tracked
623 content1 content1_content1_content1-tracked
622 content1 content1_content1_content1-untracked
624 content1 content1_content1_content1-untracked
623 content1 content1_content1_content3-tracked
625 content1 content1_content1_content3-tracked
624 content1 content1_content1_content3-untracked
626 content1 content1_content1_content3-untracked
625 content1 content1_content1_missing-tracked
627 content1 content1_content1_missing-tracked
626 content1 content1_content1_missing-untracked
628 content1 content1_content1_missing-untracked
627 content1 content1_content2_content1-tracked
629 content1 content1_content2_content1-tracked
628 content1 content1_content2_content1-untracked
630 content1 content1_content2_content1-untracked
629 content1 content1_content2_content2-tracked
631 content1 content1_content2_content2-tracked
630 content1 content1_content2_content2-untracked
632 content1 content1_content2_content2-untracked
631 content1 content1_content2_content3-tracked
633 content1 content1_content2_content3-tracked
632 content1 content1_content2_content3-untracked
634 content1 content1_content2_content3-untracked
633 content1 content1_content2_missing-tracked
635 content1 content1_content2_missing-tracked
634 content1 content1_content2_missing-untracked
636 content1 content1_content2_missing-untracked
635 content1 content1_missing_content1-tracked
637 content1 content1_missing_content1-tracked
636 content1 content1_missing_content1-untracked
638 content1 content1_missing_content1-untracked
637 content1 content1_missing_content3-tracked
639 content1 content1_missing_content3-tracked
638 content1 content1_missing_content3-untracked
640 content1 content1_missing_content3-untracked
639 content1 content1_missing_missing-tracked
641 content1 content1_missing_missing-tracked
640 content1 content1_missing_missing-untracked
642 content1 content1_missing_missing-untracked
641
643
642 Create parent changeset
644 Create parent changeset
643
645
644 $ python ../gen-revert-cases.py parent
646 $ python ../gen-revert-cases.py parent
645 $ hg addremove --similarity 0
647 $ hg addremove --similarity 0
646 removing content1_missing_content1-tracked
648 removing content1_missing_content1-tracked
647 removing content1_missing_content1-untracked
649 removing content1_missing_content1-untracked
648 removing content1_missing_content3-tracked
650 removing content1_missing_content3-tracked
649 removing content1_missing_content3-untracked
651 removing content1_missing_content3-untracked
650 removing content1_missing_missing-tracked
652 removing content1_missing_missing-tracked
651 removing content1_missing_missing-untracked
653 removing content1_missing_missing-untracked
652 adding missing_content2_content2-tracked
654 adding missing_content2_content2-tracked
653 adding missing_content2_content2-untracked
655 adding missing_content2_content2-untracked
654 adding missing_content2_content3-tracked
656 adding missing_content2_content3-tracked
655 adding missing_content2_content3-untracked
657 adding missing_content2_content3-untracked
656 adding missing_content2_missing-tracked
658 adding missing_content2_missing-tracked
657 adding missing_content2_missing-untracked
659 adding missing_content2_missing-untracked
658 $ hg status
660 $ hg status
659 M content1_content2_content1-tracked
661 M content1_content2_content1-tracked
660 M content1_content2_content1-untracked
662 M content1_content2_content1-untracked
661 M content1_content2_content2-tracked
663 M content1_content2_content2-tracked
662 M content1_content2_content2-untracked
664 M content1_content2_content2-untracked
663 M content1_content2_content3-tracked
665 M content1_content2_content3-tracked
664 M content1_content2_content3-untracked
666 M content1_content2_content3-untracked
665 M content1_content2_missing-tracked
667 M content1_content2_missing-tracked
666 M content1_content2_missing-untracked
668 M content1_content2_missing-untracked
667 A missing_content2_content2-tracked
669 A missing_content2_content2-tracked
668 A missing_content2_content2-untracked
670 A missing_content2_content2-untracked
669 A missing_content2_content3-tracked
671 A missing_content2_content3-tracked
670 A missing_content2_content3-untracked
672 A missing_content2_content3-untracked
671 A missing_content2_missing-tracked
673 A missing_content2_missing-tracked
672 A missing_content2_missing-untracked
674 A missing_content2_missing-untracked
673 R content1_missing_content1-tracked
675 R content1_missing_content1-tracked
674 R content1_missing_content1-untracked
676 R content1_missing_content1-untracked
675 R content1_missing_content3-tracked
677 R content1_missing_content3-tracked
676 R content1_missing_content3-untracked
678 R content1_missing_content3-untracked
677 R content1_missing_missing-tracked
679 R content1_missing_missing-tracked
678 R content1_missing_missing-untracked
680 R content1_missing_missing-untracked
679 $ hg commit -m 'parent'
681 $ hg commit -m 'parent'
680
682
681 (create a simple text version of the content)
683 (create a simple text version of the content)
682
684
683 $ python ../dircontent.py > ../content-parent.txt
685 $ python ../dircontent.py > ../content-parent.txt
684 $ cat ../content-parent.txt
686 $ cat ../content-parent.txt
685 content1 content1_content1_content1-tracked
687 content1 content1_content1_content1-tracked
686 content1 content1_content1_content1-untracked
688 content1 content1_content1_content1-untracked
687 content1 content1_content1_content3-tracked
689 content1 content1_content1_content3-tracked
688 content1 content1_content1_content3-untracked
690 content1 content1_content1_content3-untracked
689 content1 content1_content1_missing-tracked
691 content1 content1_content1_missing-tracked
690 content1 content1_content1_missing-untracked
692 content1 content1_content1_missing-untracked
691 content2 content1_content2_content1-tracked
693 content2 content1_content2_content1-tracked
692 content2 content1_content2_content1-untracked
694 content2 content1_content2_content1-untracked
693 content2 content1_content2_content2-tracked
695 content2 content1_content2_content2-tracked
694 content2 content1_content2_content2-untracked
696 content2 content1_content2_content2-untracked
695 content2 content1_content2_content3-tracked
697 content2 content1_content2_content3-tracked
696 content2 content1_content2_content3-untracked
698 content2 content1_content2_content3-untracked
697 content2 content1_content2_missing-tracked
699 content2 content1_content2_missing-tracked
698 content2 content1_content2_missing-untracked
700 content2 content1_content2_missing-untracked
699 content2 missing_content2_content2-tracked
701 content2 missing_content2_content2-tracked
700 content2 missing_content2_content2-untracked
702 content2 missing_content2_content2-untracked
701 content2 missing_content2_content3-tracked
703 content2 missing_content2_content3-tracked
702 content2 missing_content2_content3-untracked
704 content2 missing_content2_content3-untracked
703 content2 missing_content2_missing-tracked
705 content2 missing_content2_missing-tracked
704 content2 missing_content2_missing-untracked
706 content2 missing_content2_missing-untracked
705
707
706 Setup working directory
708 Setup working directory
707
709
708 $ python ../gen-revert-cases.py wc
710 $ python ../gen-revert-cases.py wc
709 $ hg addremove --similarity 0
711 $ hg addremove --similarity 0
710 adding content1_missing_content1-tracked
712 adding content1_missing_content1-tracked
711 adding content1_missing_content1-untracked
713 adding content1_missing_content1-untracked
712 adding content1_missing_content3-tracked
714 adding content1_missing_content3-tracked
713 adding content1_missing_content3-untracked
715 adding content1_missing_content3-untracked
716 adding content1_missing_missing-tracked
717 adding content1_missing_missing-untracked
714 adding missing_missing_content3-tracked
718 adding missing_missing_content3-tracked
715 adding missing_missing_content3-untracked
719 adding missing_missing_content3-untracked
720 adding missing_missing_missing-tracked
721 adding missing_missing_missing-untracked
716 $ hg forget *_*_*-untracked
722 $ hg forget *_*_*-untracked
717 $ rm *_*_missing-*
723 $ rm *_*_missing-*
718 $ hg status
724 $ hg status
719 M content1_content1_content3-tracked
725 M content1_content1_content3-tracked
720 M content1_content2_content1-tracked
726 M content1_content2_content1-tracked
721 M content1_content2_content3-tracked
727 M content1_content2_content3-tracked
722 M missing_content2_content3-tracked
728 M missing_content2_content3-tracked
723 A content1_missing_content1-tracked
729 A content1_missing_content1-tracked
724 A content1_missing_content3-tracked
730 A content1_missing_content3-tracked
725 A missing_missing_content3-tracked
731 A missing_missing_content3-tracked
726 R content1_content1_content1-untracked
732 R content1_content1_content1-untracked
727 R content1_content1_content3-untracked
733 R content1_content1_content3-untracked
728 R content1_content1_missing-untracked
734 R content1_content1_missing-untracked
729 R content1_content2_content1-untracked
735 R content1_content2_content1-untracked
730 R content1_content2_content2-untracked
736 R content1_content2_content2-untracked
731 R content1_content2_content3-untracked
737 R content1_content2_content3-untracked
732 R content1_content2_missing-untracked
738 R content1_content2_missing-untracked
733 R missing_content2_content2-untracked
739 R missing_content2_content2-untracked
734 R missing_content2_content3-untracked
740 R missing_content2_content3-untracked
735 R missing_content2_missing-untracked
741 R missing_content2_missing-untracked
736 ! content1_content1_missing-tracked
742 ! content1_content1_missing-tracked
737 ! content1_content2_missing-tracked
743 ! content1_content2_missing-tracked
744 ! content1_missing_missing-tracked
738 ! missing_content2_missing-tracked
745 ! missing_content2_missing-tracked
746 ! missing_missing_missing-tracked
739 ? content1_missing_content1-untracked
747 ? content1_missing_content1-untracked
740 ? content1_missing_content3-untracked
748 ? content1_missing_content3-untracked
741 ? missing_missing_content3-untracked
749 ? missing_missing_content3-untracked
742
750
743 $ hg status --rev 'desc("base")'
751 $ hg status --rev 'desc("base")'
744 M content1_content1_content3-tracked
752 M content1_content1_content3-tracked
745 M content1_content2_content2-tracked
753 M content1_content2_content2-tracked
746 M content1_content2_content3-tracked
754 M content1_content2_content3-tracked
747 M content1_missing_content3-tracked
755 M content1_missing_content3-tracked
748 A missing_content2_content2-tracked
756 A missing_content2_content2-tracked
749 A missing_content2_content3-tracked
757 A missing_content2_content3-tracked
750 A missing_missing_content3-tracked
758 A missing_missing_content3-tracked
751 R content1_content1_content1-untracked
759 R content1_content1_content1-untracked
752 R content1_content1_content3-untracked
760 R content1_content1_content3-untracked
753 R content1_content1_missing-untracked
761 R content1_content1_missing-untracked
754 R content1_content2_content1-untracked
762 R content1_content2_content1-untracked
755 R content1_content2_content2-untracked
763 R content1_content2_content2-untracked
756 R content1_content2_content3-untracked
764 R content1_content2_content3-untracked
757 R content1_content2_missing-untracked
765 R content1_content2_missing-untracked
758 R content1_missing_content1-untracked
766 R content1_missing_content1-untracked
759 R content1_missing_content3-untracked
767 R content1_missing_content3-untracked
760 R content1_missing_missing-tracked
768 R content1_missing_missing-tracked
761 R content1_missing_missing-untracked
769 R content1_missing_missing-untracked
762 ! content1_content1_missing-tracked
770 ! content1_content1_missing-tracked
763 ! content1_content2_missing-tracked
771 ! content1_content2_missing-tracked
772 ! content1_missing_missing-tracked
764 ! missing_content2_missing-tracked
773 ! missing_content2_missing-tracked
774 ! missing_missing_missing-tracked
765 ? missing_missing_content3-untracked
775 ? missing_missing_content3-untracked
766
776
767 (create a simple text version of the content)
777 (create a simple text version of the content)
768
778
769 $ python ../dircontent.py > ../content-wc.txt
779 $ python ../dircontent.py > ../content-wc.txt
770 $ cat ../content-wc.txt
780 $ cat ../content-wc.txt
771 content1 content1_content1_content1-tracked
781 content1 content1_content1_content1-tracked
772 content1 content1_content1_content1-untracked
782 content1 content1_content1_content1-untracked
773 content3 content1_content1_content3-tracked
783 content3 content1_content1_content3-tracked
774 content3 content1_content1_content3-untracked
784 content3 content1_content1_content3-untracked
775 content1 content1_content2_content1-tracked
785 content1 content1_content2_content1-tracked
776 content1 content1_content2_content1-untracked
786 content1 content1_content2_content1-untracked
777 content2 content1_content2_content2-tracked
787 content2 content1_content2_content2-tracked
778 content2 content1_content2_content2-untracked
788 content2 content1_content2_content2-untracked
779 content3 content1_content2_content3-tracked
789 content3 content1_content2_content3-tracked
780 content3 content1_content2_content3-untracked
790 content3 content1_content2_content3-untracked
781 content1 content1_missing_content1-tracked
791 content1 content1_missing_content1-tracked
782 content1 content1_missing_content1-untracked
792 content1 content1_missing_content1-untracked
783 content3 content1_missing_content3-tracked
793 content3 content1_missing_content3-tracked
784 content3 content1_missing_content3-untracked
794 content3 content1_missing_content3-untracked
785 content2 missing_content2_content2-tracked
795 content2 missing_content2_content2-tracked
786 content2 missing_content2_content2-untracked
796 content2 missing_content2_content2-untracked
787 content3 missing_content2_content3-tracked
797 content3 missing_content2_content3-tracked
788 content3 missing_content2_content3-untracked
798 content3 missing_content2_content3-untracked
789 content3 missing_missing_content3-tracked
799 content3 missing_missing_content3-tracked
790 content3 missing_missing_content3-untracked
800 content3 missing_missing_content3-untracked
791
801
792 $ cd ..
802 $ cd ..
793
803
794 Test revert --all to parent content
804 Test revert --all to parent content
795 -----------------------------------
805 -----------------------------------
796
806
797 (setup from reference repo)
807 (setup from reference repo)
798
808
799 $ cp -r revert-ref revert-parent-all
809 $ cp -r revert-ref revert-parent-all
800 $ cd revert-parent-all
810 $ cd revert-parent-all
801
811
802 check revert output
812 check revert output
803
813
804 $ hg revert --all
814 $ hg revert --all
805 undeleting content1_content1_content1-untracked
815 undeleting content1_content1_content1-untracked
806 reverting content1_content1_content3-tracked
816 reverting content1_content1_content3-tracked
807 undeleting content1_content1_content3-untracked
817 undeleting content1_content1_content3-untracked
808 reverting content1_content1_missing-tracked
818 reverting content1_content1_missing-tracked
809 undeleting content1_content1_missing-untracked
819 undeleting content1_content1_missing-untracked
810 reverting content1_content2_content1-tracked
820 reverting content1_content2_content1-tracked
811 undeleting content1_content2_content1-untracked
821 undeleting content1_content2_content1-untracked
812 undeleting content1_content2_content2-untracked
822 undeleting content1_content2_content2-untracked
813 reverting content1_content2_content3-tracked
823 reverting content1_content2_content3-tracked
814 undeleting content1_content2_content3-untracked
824 undeleting content1_content2_content3-untracked
815 reverting content1_content2_missing-tracked
825 reverting content1_content2_missing-tracked
816 undeleting content1_content2_missing-untracked
826 undeleting content1_content2_missing-untracked
817 forgetting content1_missing_content1-tracked
827 forgetting content1_missing_content1-tracked
818 forgetting content1_missing_content3-tracked
828 forgetting content1_missing_content3-tracked
829 forgetting content1_missing_missing-tracked
819 undeleting missing_content2_content2-untracked
830 undeleting missing_content2_content2-untracked
820 reverting missing_content2_content3-tracked
831 reverting missing_content2_content3-tracked
821 undeleting missing_content2_content3-untracked
832 undeleting missing_content2_content3-untracked
822 reverting missing_content2_missing-tracked
833 reverting missing_content2_missing-tracked
823 undeleting missing_content2_missing-untracked
834 undeleting missing_content2_missing-untracked
824 forgetting missing_missing_content3-tracked
835 forgetting missing_missing_content3-tracked
836 forgetting missing_missing_missing-tracked
825
837
826 Compare resulting directory with revert target.
838 Compare resulting directory with revert target.
827
839
828 The diff is filtered to include change only. The only difference should be
840 The diff is filtered to include change only. The only difference should be
829 additional `.orig` backup file when applicable.
841 additional `.orig` backup file when applicable.
830
842
831 $ python ../dircontent.py > ../content-parent-all.txt
843 $ python ../dircontent.py > ../content-parent-all.txt
832 $ cd ..
844 $ cd ..
833 $ diff -U 0 -- content-parent.txt content-parent-all.txt | grep _
845 $ diff -U 0 -- content-parent.txt content-parent-all.txt | grep _
834 +content3 content1_content1_content3-tracked.orig
846 +content3 content1_content1_content3-tracked.orig
835 +content3 content1_content1_content3-untracked.orig
847 +content3 content1_content1_content3-untracked.orig
836 +content1 content1_content2_content1-tracked.orig
848 +content1 content1_content2_content1-tracked.orig
837 +content1 content1_content2_content1-untracked.orig
849 +content1 content1_content2_content1-untracked.orig
838 +content3 content1_content2_content3-tracked.orig
850 +content3 content1_content2_content3-tracked.orig
839 +content3 content1_content2_content3-untracked.orig
851 +content3 content1_content2_content3-untracked.orig
840 +content1 content1_missing_content1-tracked
852 +content1 content1_missing_content1-tracked
841 +content1 content1_missing_content1-untracked
853 +content1 content1_missing_content1-untracked
842 +content3 content1_missing_content3-tracked
854 +content3 content1_missing_content3-tracked
843 +content3 content1_missing_content3-untracked
855 +content3 content1_missing_content3-untracked
844 +content3 missing_content2_content3-tracked.orig
856 +content3 missing_content2_content3-tracked.orig
845 +content3 missing_content2_content3-untracked.orig
857 +content3 missing_content2_content3-untracked.orig
846 +content3 missing_missing_content3-tracked
858 +content3 missing_missing_content3-tracked
847 +content3 missing_missing_content3-untracked
859 +content3 missing_missing_content3-untracked
848
860
849 Test revert --all to "base" content
861 Test revert --all to "base" content
850 -----------------------------------
862 -----------------------------------
851
863
852 (setup from reference repo)
864 (setup from reference repo)
853
865
854 $ cp -r revert-ref revert-base-all
866 $ cp -r revert-ref revert-base-all
855 $ cd revert-base-all
867 $ cd revert-base-all
856
868
857 check revert output
869 check revert output
858
870
859 $ hg revert --all --rev 'desc(base)'
871 $ hg revert --all --rev 'desc(base)'
860 undeleting content1_content1_content1-untracked
872 undeleting content1_content1_content1-untracked
861 reverting content1_content1_content3-tracked
873 reverting content1_content1_content3-tracked
862 undeleting content1_content1_content3-untracked
874 undeleting content1_content1_content3-untracked
863 reverting content1_content1_missing-tracked
875 reverting content1_content1_missing-tracked
864 undeleting content1_content1_missing-untracked
876 undeleting content1_content1_missing-untracked
865 undeleting content1_content2_content1-untracked
877 undeleting content1_content2_content1-untracked
866 reverting content1_content2_content2-tracked
878 reverting content1_content2_content2-tracked
867 undeleting content1_content2_content2-untracked
879 undeleting content1_content2_content2-untracked
868 reverting content1_content2_content3-tracked
880 reverting content1_content2_content3-tracked
869 undeleting content1_content2_content3-untracked
881 undeleting content1_content2_content3-untracked
870 reverting content1_content2_missing-tracked
882 reverting content1_content2_missing-tracked
871 undeleting content1_content2_missing-untracked
883 undeleting content1_content2_missing-untracked
872 adding content1_missing_content1-untracked
884 adding content1_missing_content1-untracked
873 reverting content1_missing_content3-tracked
885 reverting content1_missing_content3-tracked
874 adding content1_missing_content3-untracked
886 adding content1_missing_content3-untracked
875 adding content1_missing_missing-tracked
887 reverting content1_missing_missing-tracked
876 adding content1_missing_missing-untracked
888 adding content1_missing_missing-untracked
877 removing missing_content2_content2-tracked
889 removing missing_content2_content2-tracked
878 removing missing_content2_content3-tracked
890 removing missing_content2_content3-tracked
879 removing missing_content2_missing-tracked
891 removing missing_content2_missing-tracked
880 forgetting missing_missing_content3-tracked
892 forgetting missing_missing_content3-tracked
893 forgetting missing_missing_missing-tracked
881
894
882 Compare resulting directory with revert target.
895 Compare resulting directory with revert target.
883
896
884 The diff is filtered to include change only. The only difference should be
897 The diff is filtered to include change only. The only difference should be
885 additional `.orig` backup file when applicable.
898 additional `.orig` backup file when applicable.
886
899
887 $ python ../dircontent.py > ../content-base-all.txt
900 $ python ../dircontent.py > ../content-base-all.txt
888 $ cd ..
901 $ cd ..
889 $ diff -U 0 -- content-base.txt content-base-all.txt | grep _
902 $ diff -U 0 -- content-base.txt content-base-all.txt | grep _
890 +content3 content1_content1_content3-tracked.orig
903 +content3 content1_content1_content3-tracked.orig
891 +content3 content1_content1_content3-untracked.orig
904 +content3 content1_content1_content3-untracked.orig
892 +content2 content1_content2_content2-untracked.orig
905 +content2 content1_content2_content2-untracked.orig
893 +content3 content1_content2_content3-tracked.orig
906 +content3 content1_content2_content3-tracked.orig
894 +content3 content1_content2_content3-untracked.orig
907 +content3 content1_content2_content3-untracked.orig
895 +content3 content1_missing_content3-tracked.orig
908 +content3 content1_missing_content3-tracked.orig
896 +content3 content1_missing_content3-untracked.orig
909 +content3 content1_missing_content3-untracked.orig
897 +content2 missing_content2_content2-untracked
910 +content2 missing_content2_content2-untracked
898 +content3 missing_content2_content3-tracked.orig
911 +content3 missing_content2_content3-tracked.orig
899 +content3 missing_content2_content3-untracked
912 +content3 missing_content2_content3-untracked
900 +content3 missing_missing_content3-tracked
913 +content3 missing_missing_content3-tracked
901 +content3 missing_missing_content3-untracked
914 +content3 missing_missing_content3-untracked
902
915
903 Test revert to parent content with explicit file name
916 Test revert to parent content with explicit file name
904 -----------------------------------------------------
917 -----------------------------------------------------
905
918
906 (setup from reference repo)
919 (setup from reference repo)
907
920
908 $ cp -r revert-ref revert-parent-explicit
921 $ cp -r revert-ref revert-parent-explicit
909 $ cd revert-parent-explicit
922 $ cd revert-parent-explicit
910
923
911 revert all files individually and check the output
924 revert all files individually and check the output
912 (output is expected to be different than in the --all case)
925 (output is expected to be different than in the --all case)
913
926
914 $ for file in `python ../gen-revert-cases.py filelist`; do
927 $ for file in `python ../gen-revert-cases.py filelist`; do
915 > echo '### revert for:' $file;
928 > echo '### revert for:' $file;
916 > hg revert $file;
929 > hg revert $file;
917 > echo
930 > echo
918 > done
931 > done
919 ### revert for: content1_content1_content1-tracked
932 ### revert for: content1_content1_content1-tracked
920 no changes needed to content1_content1_content1-tracked
933 no changes needed to content1_content1_content1-tracked
921
934
922 ### revert for: content1_content1_content1-untracked
935 ### revert for: content1_content1_content1-untracked
923
936
924 ### revert for: content1_content1_content3-tracked
937 ### revert for: content1_content1_content3-tracked
925
938
926 ### revert for: content1_content1_content3-untracked
939 ### revert for: content1_content1_content3-untracked
927
940
928 ### revert for: content1_content1_missing-tracked
941 ### revert for: content1_content1_missing-tracked
929
942
930 ### revert for: content1_content1_missing-untracked
943 ### revert for: content1_content1_missing-untracked
931
944
932 ### revert for: content1_content2_content1-tracked
945 ### revert for: content1_content2_content1-tracked
933
946
934 ### revert for: content1_content2_content1-untracked
947 ### revert for: content1_content2_content1-untracked
935
948
936 ### revert for: content1_content2_content2-tracked
949 ### revert for: content1_content2_content2-tracked
937 no changes needed to content1_content2_content2-tracked
950 no changes needed to content1_content2_content2-tracked
938
951
939 ### revert for: content1_content2_content2-untracked
952 ### revert for: content1_content2_content2-untracked
940
953
941 ### revert for: content1_content2_content3-tracked
954 ### revert for: content1_content2_content3-tracked
942
955
943 ### revert for: content1_content2_content3-untracked
956 ### revert for: content1_content2_content3-untracked
944
957
945 ### revert for: content1_content2_missing-tracked
958 ### revert for: content1_content2_missing-tracked
946
959
947 ### revert for: content1_content2_missing-untracked
960 ### revert for: content1_content2_missing-untracked
948
961
949 ### revert for: content1_missing_content1-tracked
962 ### revert for: content1_missing_content1-tracked
950
963
951 ### revert for: content1_missing_content1-untracked
964 ### revert for: content1_missing_content1-untracked
952 file not managed: content1_missing_content1-untracked
965 file not managed: content1_missing_content1-untracked
953
966
954 ### revert for: content1_missing_content3-tracked
967 ### revert for: content1_missing_content3-tracked
955
968
956 ### revert for: content1_missing_content3-untracked
969 ### revert for: content1_missing_content3-untracked
957 file not managed: content1_missing_content3-untracked
970 file not managed: content1_missing_content3-untracked
958
971
959 ### revert for: content1_missing_missing-tracked
972 ### revert for: content1_missing_missing-tracked
960 content1_missing_missing-tracked: no such file in rev * (glob)
961
973
962 ### revert for: content1_missing_missing-untracked
974 ### revert for: content1_missing_missing-untracked
963 content1_missing_missing-untracked: no such file in rev * (glob)
975 content1_missing_missing-untracked: no such file in rev * (glob)
964
976
965 ### revert for: missing_content2_content2-tracked
977 ### revert for: missing_content2_content2-tracked
966 no changes needed to missing_content2_content2-tracked
978 no changes needed to missing_content2_content2-tracked
967
979
968 ### revert for: missing_content2_content2-untracked
980 ### revert for: missing_content2_content2-untracked
969
981
970 ### revert for: missing_content2_content3-tracked
982 ### revert for: missing_content2_content3-tracked
971
983
972 ### revert for: missing_content2_content3-untracked
984 ### revert for: missing_content2_content3-untracked
973
985
974 ### revert for: missing_content2_missing-tracked
986 ### revert for: missing_content2_missing-tracked
975
987
976 ### revert for: missing_content2_missing-untracked
988 ### revert for: missing_content2_missing-untracked
977
989
978 ### revert for: missing_missing_content3-tracked
990 ### revert for: missing_missing_content3-tracked
979
991
980 ### revert for: missing_missing_content3-untracked
992 ### revert for: missing_missing_content3-untracked
981 file not managed: missing_missing_content3-untracked
993 file not managed: missing_missing_content3-untracked
982
994
983 ### revert for: missing_missing_missing-tracked
995 ### revert for: missing_missing_missing-tracked
984 missing_missing_missing-tracked: no such file in rev * (glob)
985
996
986 ### revert for: missing_missing_missing-untracked
997 ### revert for: missing_missing_missing-untracked
987 missing_missing_missing-untracked: no such file in rev * (glob)
998 missing_missing_missing-untracked: no such file in rev * (glob)
988
999
989
1000
990 check resulting directory against the --all run
1001 check resulting directory against the --all run
991 (There should be no difference)
1002 (There should be no difference)
992
1003
993 $ python ../dircontent.py > ../content-parent-explicit.txt
1004 $ python ../dircontent.py > ../content-parent-explicit.txt
994 $ cd ..
1005 $ cd ..
995 $ diff -U 0 -- content-parent-all.txt content-parent-explicit.txt | grep _
1006 $ diff -U 0 -- content-parent-all.txt content-parent-explicit.txt | grep _
996 [1]
1007 [1]
997
1008
998 Test revert to "base" content with explicit file name
1009 Test revert to "base" content with explicit file name
999 -----------------------------------------------------
1010 -----------------------------------------------------
1000
1011
1001 (setup from reference repo)
1012 (setup from reference repo)
1002
1013
1003 $ cp -r revert-ref revert-base-explicit
1014 $ cp -r revert-ref revert-base-explicit
1004 $ cd revert-base-explicit
1015 $ cd revert-base-explicit
1005
1016
1006 revert all files individually and check the output
1017 revert all files individually and check the output
1007 (output is expected to be different than in the --all case)
1018 (output is expected to be different than in the --all case)
1008
1019
1009 $ for file in `python ../gen-revert-cases.py filelist`; do
1020 $ for file in `python ../gen-revert-cases.py filelist`; do
1010 > echo '### revert for:' $file;
1021 > echo '### revert for:' $file;
1011 > hg revert $file --rev 'desc(base)';
1022 > hg revert $file --rev 'desc(base)';
1012 > echo
1023 > echo
1013 > done
1024 > done
1014 ### revert for: content1_content1_content1-tracked
1025 ### revert for: content1_content1_content1-tracked
1015 no changes needed to content1_content1_content1-tracked
1026 no changes needed to content1_content1_content1-tracked
1016
1027
1017 ### revert for: content1_content1_content1-untracked
1028 ### revert for: content1_content1_content1-untracked
1018
1029
1019 ### revert for: content1_content1_content3-tracked
1030 ### revert for: content1_content1_content3-tracked
1020
1031
1021 ### revert for: content1_content1_content3-untracked
1032 ### revert for: content1_content1_content3-untracked
1022
1033
1023 ### revert for: content1_content1_missing-tracked
1034 ### revert for: content1_content1_missing-tracked
1024
1035
1025 ### revert for: content1_content1_missing-untracked
1036 ### revert for: content1_content1_missing-untracked
1026
1037
1027 ### revert for: content1_content2_content1-tracked
1038 ### revert for: content1_content2_content1-tracked
1028 no changes needed to content1_content2_content1-tracked
1039 no changes needed to content1_content2_content1-tracked
1029
1040
1030 ### revert for: content1_content2_content1-untracked
1041 ### revert for: content1_content2_content1-untracked
1031
1042
1032 ### revert for: content1_content2_content2-tracked
1043 ### revert for: content1_content2_content2-tracked
1033
1044
1034 ### revert for: content1_content2_content2-untracked
1045 ### revert for: content1_content2_content2-untracked
1035
1046
1036 ### revert for: content1_content2_content3-tracked
1047 ### revert for: content1_content2_content3-tracked
1037
1048
1038 ### revert for: content1_content2_content3-untracked
1049 ### revert for: content1_content2_content3-untracked
1039
1050
1040 ### revert for: content1_content2_missing-tracked
1051 ### revert for: content1_content2_missing-tracked
1041
1052
1042 ### revert for: content1_content2_missing-untracked
1053 ### revert for: content1_content2_missing-untracked
1043
1054
1044 ### revert for: content1_missing_content1-tracked
1055 ### revert for: content1_missing_content1-tracked
1045 no changes needed to content1_missing_content1-tracked
1056 no changes needed to content1_missing_content1-tracked
1046
1057
1047 ### revert for: content1_missing_content1-untracked
1058 ### revert for: content1_missing_content1-untracked
1048
1059
1049 ### revert for: content1_missing_content3-tracked
1060 ### revert for: content1_missing_content3-tracked
1050
1061
1051 ### revert for: content1_missing_content3-untracked
1062 ### revert for: content1_missing_content3-untracked
1052
1063
1053 ### revert for: content1_missing_missing-tracked
1064 ### revert for: content1_missing_missing-tracked
1054
1065
1055 ### revert for: content1_missing_missing-untracked
1066 ### revert for: content1_missing_missing-untracked
1056
1067
1057 ### revert for: missing_content2_content2-tracked
1068 ### revert for: missing_content2_content2-tracked
1058
1069
1059 ### revert for: missing_content2_content2-untracked
1070 ### revert for: missing_content2_content2-untracked
1060 no changes needed to missing_content2_content2-untracked
1071 no changes needed to missing_content2_content2-untracked
1061
1072
1062 ### revert for: missing_content2_content3-tracked
1073 ### revert for: missing_content2_content3-tracked
1063
1074
1064 ### revert for: missing_content2_content3-untracked
1075 ### revert for: missing_content2_content3-untracked
1065 no changes needed to missing_content2_content3-untracked
1076 no changes needed to missing_content2_content3-untracked
1066
1077
1067 ### revert for: missing_content2_missing-tracked
1078 ### revert for: missing_content2_missing-tracked
1068
1079
1069 ### revert for: missing_content2_missing-untracked
1080 ### revert for: missing_content2_missing-untracked
1070 no changes needed to missing_content2_missing-untracked
1081 no changes needed to missing_content2_missing-untracked
1071
1082
1072 ### revert for: missing_missing_content3-tracked
1083 ### revert for: missing_missing_content3-tracked
1073
1084
1074 ### revert for: missing_missing_content3-untracked
1085 ### revert for: missing_missing_content3-untracked
1075 file not managed: missing_missing_content3-untracked
1086 file not managed: missing_missing_content3-untracked
1076
1087
1077 ### revert for: missing_missing_missing-tracked
1088 ### revert for: missing_missing_missing-tracked
1078 missing_missing_missing-tracked: no such file in rev * (glob)
1079
1089
1080 ### revert for: missing_missing_missing-untracked
1090 ### revert for: missing_missing_missing-untracked
1081 missing_missing_missing-untracked: no such file in rev * (glob)
1091 missing_missing_missing-untracked: no such file in rev * (glob)
1082
1092
1083
1093
1084 check resulting directory against the --all run
1094 check resulting directory against the --all run
1085 (There should be no difference)
1095 (There should be no difference)
1086
1096
1087 $ python ../dircontent.py > ../content-base-explicit.txt
1097 $ python ../dircontent.py > ../content-base-explicit.txt
1088 $ cd ..
1098 $ cd ..
1089 $ diff -U 0 -- content-base-all.txt content-base-explicit.txt | grep _
1099 $ diff -U 0 -- content-base-all.txt content-base-explicit.txt | grep _
1090 [1]
1100 [1]
General Comments 0
You need to be logged in to leave comments. Login now