##// END OF EJS Templates
test-revert: add case where file exists but is untracked in working directory...
Pierre-Yves David -
r22141:6b522c11 default
parent child Browse files
Show More
@@ -1,933 +1,999 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 silently keep d removed
146 should silently keep d removed
147
147
148 $ hg revert -r0 d
148 $ hg revert -r0 d
149 $ hg st d
149 $ hg st d
150 R d
150 R d
151
151
152 $ hg update -C
152 $ hg update -C
153 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
153 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
154
154
155 revert of exec bit
155 revert of exec bit
156 ------------------
156 ------------------
157
157
158 #if execbit
158 #if execbit
159 $ chmod +x c
159 $ chmod +x c
160 $ hg revert --all
160 $ hg revert --all
161 reverting c
161 reverting c
162
162
163 $ test -x c || echo non-executable
163 $ test -x c || echo non-executable
164 non-executable
164 non-executable
165
165
166 $ chmod +x c
166 $ chmod +x c
167 $ hg commit -m exe
167 $ hg commit -m exe
168
168
169 $ chmod -x c
169 $ chmod -x c
170 $ hg revert --all
170 $ hg revert --all
171 reverting c
171 reverting c
172
172
173 $ test -x c && echo executable
173 $ test -x c && echo executable
174 executable
174 executable
175 #endif
175 #endif
176
176
177 $ cd ..
177 $ cd ..
178
178
179
179
180 Issue241: update and revert produces inconsistent repositories
180 Issue241: update and revert produces inconsistent repositories
181 --------------------------------------------------------------
181 --------------------------------------------------------------
182
182
183 $ hg init a
183 $ hg init a
184 $ cd a
184 $ cd a
185 $ echo a >> a
185 $ echo a >> a
186 $ hg commit -A -d '1 0' -m a
186 $ hg commit -A -d '1 0' -m a
187 adding a
187 adding a
188 $ echo a >> a
188 $ echo a >> a
189 $ hg commit -d '2 0' -m a
189 $ hg commit -d '2 0' -m a
190 $ hg update 0
190 $ hg update 0
191 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
191 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
192 $ mkdir b
192 $ mkdir b
193 $ echo b > b/b
193 $ echo b > b/b
194
194
195 call `hg revert` with no file specified
195 call `hg revert` with no file specified
196 ---------------------------------------
196 ---------------------------------------
197
197
198 $ hg revert -rtip
198 $ hg revert -rtip
199 abort: no files or directories specified
199 abort: no files or directories specified
200 (use --all to revert all files, or 'hg update 1' to update)
200 (use --all to revert all files, or 'hg update 1' to update)
201 [255]
201 [255]
202
202
203 call `hg revert` with --all
203 call `hg revert` with --all
204 ---------------------------
204 ---------------------------
205
205
206 $ hg revert --all -rtip
206 $ hg revert --all -rtip
207 reverting a
207 reverting a
208
208
209
209
210 Issue332: confusing message when reverting directory
210 Issue332: confusing message when reverting directory
211 ----------------------------------------------------
211 ----------------------------------------------------
212
212
213 $ hg ci -A -m b
213 $ hg ci -A -m b
214 adding b/b
214 adding b/b
215 created new head
215 created new head
216 $ echo foobar > b/b
216 $ echo foobar > b/b
217 $ mkdir newdir
217 $ mkdir newdir
218 $ echo foo > newdir/newfile
218 $ echo foo > newdir/newfile
219 $ hg add newdir/newfile
219 $ hg add newdir/newfile
220 $ hg revert b newdir
220 $ hg revert b newdir
221 reverting b/b (glob)
221 reverting b/b (glob)
222 forgetting newdir/newfile (glob)
222 forgetting newdir/newfile (glob)
223 $ echo foobar > b/b
223 $ echo foobar > b/b
224 $ hg revert .
224 $ hg revert .
225 reverting b/b (glob)
225 reverting b/b (glob)
226
226
227
227
228 reverting a rename target should revert the source
228 reverting a rename target should revert the source
229 --------------------------------------------------
229 --------------------------------------------------
230
230
231 $ hg mv a newa
231 $ hg mv a newa
232 $ hg revert newa
232 $ hg revert newa
233 $ hg st a newa
233 $ hg st a newa
234 ? newa
234 ? newa
235
235
236 $ cd ..
236 $ cd ..
237
237
238 $ hg init ignored
238 $ hg init ignored
239 $ cd ignored
239 $ cd ignored
240 $ echo '^ignored$' > .hgignore
240 $ echo '^ignored$' > .hgignore
241 $ echo '^ignoreddir$' >> .hgignore
241 $ echo '^ignoreddir$' >> .hgignore
242 $ echo '^removed$' >> .hgignore
242 $ echo '^removed$' >> .hgignore
243
243
244 $ mkdir ignoreddir
244 $ mkdir ignoreddir
245 $ touch ignoreddir/file
245 $ touch ignoreddir/file
246 $ touch ignoreddir/removed
246 $ touch ignoreddir/removed
247 $ touch ignored
247 $ touch ignored
248 $ touch removed
248 $ touch removed
249
249
250 4 ignored files (we will add/commit everything)
250 4 ignored files (we will add/commit everything)
251
251
252 $ hg st -A -X .hgignore
252 $ hg st -A -X .hgignore
253 I ignored
253 I ignored
254 I ignoreddir/file
254 I ignoreddir/file
255 I ignoreddir/removed
255 I ignoreddir/removed
256 I removed
256 I removed
257 $ hg ci -qAm 'add files' ignored ignoreddir/file ignoreddir/removed removed
257 $ hg ci -qAm 'add files' ignored ignoreddir/file ignoreddir/removed removed
258
258
259 $ echo >> ignored
259 $ echo >> ignored
260 $ echo >> ignoreddir/file
260 $ echo >> ignoreddir/file
261 $ hg rm removed ignoreddir/removed
261 $ hg rm removed ignoreddir/removed
262
262
263 should revert ignored* and undelete *removed
263 should revert ignored* and undelete *removed
264 --------------------------------------------
264 --------------------------------------------
265
265
266 $ hg revert -a --no-backup
266 $ hg revert -a --no-backup
267 reverting ignored
267 reverting ignored
268 reverting ignoreddir/file (glob)
268 reverting ignoreddir/file (glob)
269 undeleting ignoreddir/removed (glob)
269 undeleting ignoreddir/removed (glob)
270 undeleting removed
270 undeleting removed
271 $ hg st -mardi
271 $ hg st -mardi
272
272
273 $ hg up -qC
273 $ hg up -qC
274 $ echo >> ignored
274 $ echo >> ignored
275 $ hg rm removed
275 $ hg rm removed
276
276
277 should silently revert the named files
277 should silently revert the named files
278 --------------------------------------
278 --------------------------------------
279
279
280 $ hg revert --no-backup ignored removed
280 $ hg revert --no-backup ignored removed
281 $ hg st -mardi
281 $ hg st -mardi
282
282
283 Reverting copy (issue3920)
283 Reverting copy (issue3920)
284 --------------------------
284 --------------------------
285
285
286 someone set up us the copies
286 someone set up us the copies
287
287
288 $ rm .hgignore
288 $ rm .hgignore
289 $ hg update -C
289 $ hg update -C
290 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
290 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
291 $ hg mv ignored allyour
291 $ hg mv ignored allyour
292 $ hg copy removed base
292 $ hg copy removed base
293 $ hg commit -m rename
293 $ hg commit -m rename
294
294
295 copies and renames, you have no chance to survive make your time (issue3920)
295 copies and renames, you have no chance to survive make your time (issue3920)
296
296
297 $ hg update '.^'
297 $ hg update '.^'
298 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
298 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
299 $ hg revert -rtip -a
299 $ hg revert -rtip -a
300 adding allyour
300 adding allyour
301 adding base
301 adding base
302 removing ignored
302 removing ignored
303 $ hg status -C
303 $ hg status -C
304 A allyour
304 A allyour
305 ignored
305 ignored
306 A base
306 A base
307 removed
307 removed
308 R ignored
308 R ignored
309
309
310 Test revert of a file added by one side of the merge
310 Test revert of a file added by one side of the merge
311 ====================================================
311 ====================================================
312
312
313 remove any pending change
313 remove any pending change
314
314
315 $ hg revert --all
315 $ hg revert --all
316 forgetting allyour
316 forgetting allyour
317 forgetting base
317 forgetting base
318 undeleting ignored
318 undeleting ignored
319 $ hg purge --all --config extensions.purge=
319 $ hg purge --all --config extensions.purge=
320
320
321 Adds a new commit
321 Adds a new commit
322
322
323 $ echo foo > newadd
323 $ echo foo > newadd
324 $ hg add newadd
324 $ hg add newadd
325 $ hg commit -m 'other adds'
325 $ hg commit -m 'other adds'
326 created new head
326 created new head
327
327
328
328
329 merge it with the other head
329 merge it with the other head
330
330
331 $ hg merge # merge 1 into 2
331 $ hg merge # merge 1 into 2
332 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
332 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
333 (branch merge, don't forget to commit)
333 (branch merge, don't forget to commit)
334 $ hg summary
334 $ hg summary
335 parent: 2:b8ec310b2d4e tip
335 parent: 2:b8ec310b2d4e tip
336 other adds
336 other adds
337 parent: 1:f6180deb8fbe
337 parent: 1:f6180deb8fbe
338 rename
338 rename
339 branch: default
339 branch: default
340 commit: 2 modified, 1 removed (merge)
340 commit: 2 modified, 1 removed (merge)
341 update: (current)
341 update: (current)
342
342
343 clarifies who added what
343 clarifies who added what
344
344
345 $ hg status
345 $ hg status
346 M allyour
346 M allyour
347 M base
347 M base
348 R ignored
348 R ignored
349 $ hg status --change 'p1()'
349 $ hg status --change 'p1()'
350 A newadd
350 A newadd
351 $ hg status --change 'p2()'
351 $ hg status --change 'p2()'
352 A allyour
352 A allyour
353 A base
353 A base
354 R ignored
354 R ignored
355
355
356 revert file added by p1() to p1() state
356 revert file added by p1() to p1() state
357 -----------------------------------------
357 -----------------------------------------
358
358
359 $ hg revert -r 'p1()' 'glob:newad?'
359 $ hg revert -r 'p1()' 'glob:newad?'
360 $ hg status
360 $ hg status
361 M allyour
361 M allyour
362 M base
362 M base
363 R ignored
363 R ignored
364
364
365 revert file added by p1() to p2() state
365 revert file added by p1() to p2() state
366 ------------------------------------------
366 ------------------------------------------
367
367
368 $ hg revert -r 'p2()' 'glob:newad?'
368 $ hg revert -r 'p2()' 'glob:newad?'
369 removing newadd
369 removing newadd
370 $ hg status
370 $ hg status
371 M allyour
371 M allyour
372 M base
372 M base
373 R ignored
373 R ignored
374 R newadd
374 R newadd
375
375
376 revert file added by p2() to p2() state
376 revert file added by p2() to p2() state
377 ------------------------------------------
377 ------------------------------------------
378
378
379 $ hg revert -r 'p2()' 'glob:allyou?'
379 $ hg revert -r 'p2()' 'glob:allyou?'
380 $ hg status
380 $ hg status
381 M allyour
381 M allyour
382 M base
382 M base
383 R ignored
383 R ignored
384 R newadd
384 R newadd
385
385
386 revert file added by p2() to p1() state
386 revert file added by p2() to p1() state
387 ------------------------------------------
387 ------------------------------------------
388
388
389 $ hg revert -r 'p1()' 'glob:allyou?'
389 $ hg revert -r 'p1()' 'glob:allyou?'
390 removing allyour
390 removing allyour
391 $ hg status
391 $ hg status
392 M base
392 M base
393 R allyour
393 R allyour
394 R ignored
394 R ignored
395 R newadd
395 R newadd
396
396
397 Systematic behavior validation of most possible cases
397 Systematic behavior validation of most possible cases
398 =====================================================
398 =====================================================
399
399
400 This section tests most of the possible combinations of working directory
400 This section tests most of the possible combinations of working directory
401 changes and inter-revision changes. The number of possible cases is significant
401 changes and inter-revision changes. The number of possible cases is significant
402 but they all have a slighly different handling. So this section commits to
402 but they all have a slighly different handling. So this section commits to
403 generating and testing all of them to allow safe refactoring of the revert code.
403 generating and testing all of them to allow safe refactoring of the revert code.
404
404
405 A python script is used to generate a file history for each combination of
405 A python script is used to generate a file history for each combination of
406 changes between, on one side the working directory and its parent and on
406 changes between, on one side the working directory and its parent and on
407 the other side, changes between a revert target (--rev) and working directory
407 the other side, changes between a revert target (--rev) and working directory
408 parent. The three states generated are:
408 parent. The three states generated are:
409
409
410 - a "base" revision
410 - a "base" revision
411 - a "parent" revision
411 - a "parent" revision
412 - the working directory (based on "parent")
412 - the working directory (based on "parent")
413
413
414 The file generated have names of the form:
414 The file generated have names of the form:
415
415
416 <changeset-state>_<working-copy-state>
416 <changeset-state>_<working-copy-state>
417
417
418 Here, "changeset-state" conveys the state in "base" and "parent" (or the change
418 Here, "changeset-state" conveys the state in "base" and "parent" (or the change
419 that happen between them), "working-copy-state" is self explanatory.
419 that happen between them), "working-copy-state" is self explanatory.
420
420
421 All known states are not tested yet. See inline documentation for details.
421 All known states are not tested yet. See inline documentation for details.
422 Special cases from merge and rename are not tested by this section.
422 Special cases from merge and rename are not tested by this section.
423
423
424 There are also multiple cases where the current revert implementation is known to
424 There are also multiple cases where the current revert implementation is known to
425 slightly misbehave.
425 slightly misbehave.
426
426
427 Write the python script to disk
427 Write the python script to disk
428 -------------------------------
428 -------------------------------
429
429
430 $ cat << EOF > gen-revert-cases.py
430 $ cat << EOF > gen-revert-cases.py
431 > # generate proper file state to test revert behavior
431 > # generate proper file state to test revert behavior
432 > import sys
432 > import sys
433 > import os
433 > import os
434 >
434 >
435 > # content of the file in "base" and "parent"
435 > # content of the file in "base" and "parent"
436 > # None means no file at all
436 > # None means no file at all
437 > ctxcontent = {
437 > ctxcontent = {
438 > # clean: no change from base to parent
438 > # clean: no change from base to parent
439 > 'clean': ['base', 'base'],
439 > 'clean': ['base', 'base'],
440 > # modified: file content change from base to parent
440 > # modified: file content change from base to parent
441 > 'modified': ['base', 'parent'],
441 > 'modified': ['base', 'parent'],
442 > # added: file is missing from base and added in parent
442 > # added: file is missing from base and added in parent
443 > 'added': [None, 'parent'],
443 > 'added': [None, 'parent'],
444 > # removed: file exist in base but is removed from parent
444 > # removed: file exist in base but is removed from parent
445 > 'removed': ['base', None],
445 > 'removed': ['base', None],
446 > # file exist neither in base not in parent
446 > # file exist neither in base not in parent
447 > 'missing': [None, None],
447 > 'missing': [None, None],
448 > }
448 > }
449 >
449 >
450 > # content of file in working copy
450 > # content of file in working copy
451 > wccontent = {
451 > wccontent = {
452 > # clean: wc content is the same as parent
452 > # clean: wc content is the same as parent
453 > 'clean': lambda cc: cc[1],
453 > 'clean': lambda cc: cc[1],
454 > # revert: wc content is the same as base
454 > # revert: wc content is the same as base
455 > 'revert': lambda cc: cc[0],
455 > 'revert': lambda cc: cc[0],
456 > # wc: file exist with a content different from base and parent
456 > # wc: file exist with a content different from base and parent
457 > 'wc': lambda cc: 'wc',
457 > 'wc': lambda cc: 'wc',
458 > # removed: file is missing and marked as untracked
458 > # removed: file is missing and marked as untracked
459 > 'removed': lambda cc: None,
459 > 'removed': lambda cc: None,
460 > }
460 > }
461 > # untracked-X is a version of X where the file is not tracked (? unknown)
462 > wccontent['untracked-clean'] = wccontent['clean']
461 >
463 >
462 > # build the combination of possible states
464 > # build the combination of possible states
463 > combination = []
465 > combination = []
464 > for ctxkey in ctxcontent:
466 > for ctxkey in ctxcontent:
465 > for wckey in wccontent:
467 > for wckey in wccontent:
466 > filename = "%s_%s" % (ctxkey, wckey)
468 > filename = "%s_%s" % (ctxkey, wckey)
467 > combination.append((filename, ctxkey, wckey))
469 > combination.append((filename, ctxkey, wckey))
468 >
470 >
469 > # make sure we have stable output
471 > # make sure we have stable output
470 > combination.sort()
472 > combination.sort()
471 >
473 >
472 > # retrieve the state we must generate
474 > # retrieve the state we must generate
473 > target = sys.argv[1]
475 > target = sys.argv[1]
474 >
476 >
475 > # compute file content
477 > # compute file content
476 > content = []
478 > content = []
477 > for filename, ctxkey, wckey in combination:
479 > for filename, ctxkey, wckey in combination:
478 > cc = ctxcontent[ctxkey]
480 > cc = ctxcontent[ctxkey]
479 > if target == 'filelist':
481 > if target == 'filelist':
480 > print filename
482 > print filename
481 > elif target == 'base':
483 > elif target == 'base':
482 > content.append((filename, cc[0]))
484 > content.append((filename, cc[0]))
483 > elif target == 'parent':
485 > elif target == 'parent':
484 > content.append((filename, cc[1]))
486 > content.append((filename, cc[1]))
485 > elif target == 'wc':
487 > elif target == 'wc':
486 > content.append((filename, wccontent[wckey](cc)))
488 > content.append((filename, wccontent[wckey](cc)))
487 > else:
489 > else:
488 > print >> sys.stderr, "unknown target:", target
490 > print >> sys.stderr, "unknown target:", target
489 > sys.exit(1)
491 > sys.exit(1)
490 >
492 >
491 > # write actual content
493 > # write actual content
492 > for filename, data in content:
494 > for filename, data in content:
493 > if data is not None:
495 > if data is not None:
494 > f = open(filename, 'w')
496 > f = open(filename, 'w')
495 > f.write(data + '\n')
497 > f.write(data + '\n')
496 > f.close()
498 > f.close()
497 > elif os.path.exists(filename):
499 > elif os.path.exists(filename):
498 > os.remove(filename)
500 > os.remove(filename)
499 > EOF
501 > EOF
500
502
501 check list of planned files
503 check list of planned files
502
504
503 $ python gen-revert-cases.py filelist
505 $ python gen-revert-cases.py filelist
504 added_clean
506 added_clean
505 added_removed
507 added_removed
506 added_revert
508 added_revert
509 added_untracked-clean
507 added_wc
510 added_wc
508 clean_clean
511 clean_clean
509 clean_removed
512 clean_removed
510 clean_revert
513 clean_revert
514 clean_untracked-clean
511 clean_wc
515 clean_wc
512 missing_clean
516 missing_clean
513 missing_removed
517 missing_removed
514 missing_revert
518 missing_revert
519 missing_untracked-clean
515 missing_wc
520 missing_wc
516 modified_clean
521 modified_clean
517 modified_removed
522 modified_removed
518 modified_revert
523 modified_revert
524 modified_untracked-clean
519 modified_wc
525 modified_wc
520 removed_clean
526 removed_clean
521 removed_removed
527 removed_removed
522 removed_revert
528 removed_revert
529 removed_untracked-clean
523 removed_wc
530 removed_wc
524
531
525 Script to make a simple text version of the content
532 Script to make a simple text version of the content
526 ---------------------------------------------------
533 ---------------------------------------------------
527
534
528 $ cat << EOF >> dircontent.py
535 $ cat << EOF >> dircontent.py
529 > # generate a simple text view of the directory for easy comparison
536 > # generate a simple text view of the directory for easy comparison
530 > import os
537 > import os
531 > files = os.listdir('.')
538 > files = os.listdir('.')
532 > files.sort()
539 > files.sort()
533 > for filename in files:
540 > for filename in files:
534 > if os.path.isdir(filename):
541 > if os.path.isdir(filename):
535 > continue
542 > continue
536 > content = open(filename).read()
543 > content = open(filename).read()
537 > print '%-6s %s' % (content.strip(), filename)
544 > print '%-6s %s' % (content.strip(), filename)
538 > EOF
545 > EOF
539
546
540 Generate appropriate repo state
547 Generate appropriate repo state
541 -------------------------------
548 -------------------------------
542
549
543 $ hg init revert-ref
550 $ hg init revert-ref
544 $ cd revert-ref
551 $ cd revert-ref
545
552
546 Generate base changeset
553 Generate base changeset
547
554
548 $ python ../gen-revert-cases.py base
555 $ python ../gen-revert-cases.py base
549 $ hg addremove --similarity 0
556 $ hg addremove --similarity 0
550 adding clean_clean
557 adding clean_clean
551 adding clean_removed
558 adding clean_removed
552 adding clean_revert
559 adding clean_revert
560 adding clean_untracked-clean
553 adding clean_wc
561 adding clean_wc
554 adding modified_clean
562 adding modified_clean
555 adding modified_removed
563 adding modified_removed
556 adding modified_revert
564 adding modified_revert
565 adding modified_untracked-clean
557 adding modified_wc
566 adding modified_wc
558 adding removed_clean
567 adding removed_clean
559 adding removed_removed
568 adding removed_removed
560 adding removed_revert
569 adding removed_revert
570 adding removed_untracked-clean
561 adding removed_wc
571 adding removed_wc
562 $ hg status
572 $ hg status
563 A clean_clean
573 A clean_clean
564 A clean_removed
574 A clean_removed
565 A clean_revert
575 A clean_revert
576 A clean_untracked-clean
566 A clean_wc
577 A clean_wc
567 A modified_clean
578 A modified_clean
568 A modified_removed
579 A modified_removed
569 A modified_revert
580 A modified_revert
581 A modified_untracked-clean
570 A modified_wc
582 A modified_wc
571 A removed_clean
583 A removed_clean
572 A removed_removed
584 A removed_removed
573 A removed_revert
585 A removed_revert
586 A removed_untracked-clean
574 A removed_wc
587 A removed_wc
575 $ hg commit -m 'base'
588 $ hg commit -m 'base'
576
589
577 (create a simple text version of the content)
590 (create a simple text version of the content)
578
591
579 $ python ../dircontent.py > ../content-base.txt
592 $ python ../dircontent.py > ../content-base.txt
580 $ cat ../content-base.txt
593 $ cat ../content-base.txt
581 base clean_clean
594 base clean_clean
582 base clean_removed
595 base clean_removed
583 base clean_revert
596 base clean_revert
597 base clean_untracked-clean
584 base clean_wc
598 base clean_wc
585 base modified_clean
599 base modified_clean
586 base modified_removed
600 base modified_removed
587 base modified_revert
601 base modified_revert
602 base modified_untracked-clean
588 base modified_wc
603 base modified_wc
589 base removed_clean
604 base removed_clean
590 base removed_removed
605 base removed_removed
591 base removed_revert
606 base removed_revert
607 base removed_untracked-clean
592 base removed_wc
608 base removed_wc
593
609
594 Create parent changeset
610 Create parent changeset
595
611
596 $ python ../gen-revert-cases.py parent
612 $ python ../gen-revert-cases.py parent
597 $ hg addremove --similarity 0
613 $ hg addremove --similarity 0
598 adding added_clean
614 adding added_clean
599 adding added_removed
615 adding added_removed
600 adding added_revert
616 adding added_revert
617 adding added_untracked-clean
601 adding added_wc
618 adding added_wc
602 removing removed_clean
619 removing removed_clean
603 removing removed_removed
620 removing removed_removed
604 removing removed_revert
621 removing removed_revert
622 removing removed_untracked-clean
605 removing removed_wc
623 removing removed_wc
606 $ hg status
624 $ hg status
607 M modified_clean
625 M modified_clean
608 M modified_removed
626 M modified_removed
609 M modified_revert
627 M modified_revert
628 M modified_untracked-clean
610 M modified_wc
629 M modified_wc
611 A added_clean
630 A added_clean
612 A added_removed
631 A added_removed
613 A added_revert
632 A added_revert
633 A added_untracked-clean
614 A added_wc
634 A added_wc
615 R removed_clean
635 R removed_clean
616 R removed_removed
636 R removed_removed
617 R removed_revert
637 R removed_revert
638 R removed_untracked-clean
618 R removed_wc
639 R removed_wc
619 $ hg commit -m 'parent'
640 $ hg commit -m 'parent'
620
641
621 (create a simple text version of the content)
642 (create a simple text version of the content)
622
643
623 $ python ../dircontent.py > ../content-parent.txt
644 $ python ../dircontent.py > ../content-parent.txt
624 $ cat ../content-parent.txt
645 $ cat ../content-parent.txt
625 parent added_clean
646 parent added_clean
626 parent added_removed
647 parent added_removed
627 parent added_revert
648 parent added_revert
649 parent added_untracked-clean
628 parent added_wc
650 parent added_wc
629 base clean_clean
651 base clean_clean
630 base clean_removed
652 base clean_removed
631 base clean_revert
653 base clean_revert
654 base clean_untracked-clean
632 base clean_wc
655 base clean_wc
633 parent modified_clean
656 parent modified_clean
634 parent modified_removed
657 parent modified_removed
635 parent modified_revert
658 parent modified_revert
659 parent modified_untracked-clean
636 parent modified_wc
660 parent modified_wc
637
661
638 Setup working directory
662 Setup working directory
639
663
640 $ python ../gen-revert-cases.py wc | cat
664 $ python ../gen-revert-cases.py wc | cat
641 $ hg addremove --similarity 0
665 $ hg addremove --similarity 0
642 removing added_removed
666 removing added_removed
643 removing added_revert
667 removing added_revert
644 removing clean_removed
668 removing clean_removed
645 adding missing_wc
669 adding missing_wc
646 removing modified_removed
670 removing modified_removed
647 adding removed_revert
671 adding removed_revert
648 adding removed_wc
672 adding removed_wc
673 $ hg forget *untracked*
649 $ hg status
674 $ hg status
650 M added_wc
675 M added_wc
651 M clean_wc
676 M clean_wc
652 M modified_revert
677 M modified_revert
653 M modified_wc
678 M modified_wc
654 A missing_wc
679 A missing_wc
655 A removed_revert
680 A removed_revert
656 A removed_wc
681 A removed_wc
657 R added_removed
682 R added_removed
658 R added_revert
683 R added_revert
684 R added_untracked-clean
659 R clean_removed
685 R clean_removed
686 R clean_untracked-clean
660 R modified_removed
687 R modified_removed
688 R modified_untracked-clean
661
689
662 $ hg status --rev 'desc("base")'
690 $ hg status --rev 'desc("base")'
663 M clean_wc
691 M clean_wc
664 M modified_clean
692 M modified_clean
665 M modified_wc
693 M modified_wc
666 M removed_wc
694 M removed_wc
667 A added_clean
695 A added_clean
668 A added_wc
696 A added_wc
669 A missing_wc
697 A missing_wc
670 R clean_removed
698 R clean_removed
699 R clean_untracked-clean
671 R modified_removed
700 R modified_removed
701 R modified_untracked-clean
672 R removed_clean
702 R removed_clean
673 R removed_removed
703 R removed_removed
704 R removed_untracked-clean
674
705
675 (create a simple text version of the content)
706 (create a simple text version of the content)
676
707
677 $ python ../dircontent.py > ../content-wc.txt
708 $ python ../dircontent.py > ../content-wc.txt
678 $ cat ../content-wc.txt
709 $ cat ../content-wc.txt
679 parent added_clean
710 parent added_clean
711 parent added_untracked-clean
680 wc added_wc
712 wc added_wc
681 base clean_clean
713 base clean_clean
682 base clean_revert
714 base clean_revert
715 base clean_untracked-clean
683 wc clean_wc
716 wc clean_wc
684 wc missing_wc
717 wc missing_wc
685 parent modified_clean
718 parent modified_clean
686 base modified_revert
719 base modified_revert
720 parent modified_untracked-clean
687 wc modified_wc
721 wc modified_wc
688 base removed_revert
722 base removed_revert
689 wc removed_wc
723 wc removed_wc
690
724
691 $ cd ..
725 $ cd ..
692
726
693 Test revert --all to parent content
727 Test revert --all to parent content
694 -----------------------------------
728 -----------------------------------
695
729
696 (setup from reference repo)
730 (setup from reference repo)
697
731
698 $ cp -r revert-ref revert-parent-all
732 $ cp -r revert-ref revert-parent-all
699 $ cd revert-parent-all
733 $ cd revert-parent-all
700
734
701 check revert output
735 check revert output
702
736
703 $ hg revert --all
737 $ hg revert --all
704 undeleting added_removed
738 undeleting added_removed
705 undeleting added_revert
739 undeleting added_revert
740 undeleting added_untracked-clean
706 reverting added_wc
741 reverting added_wc
707 undeleting clean_removed
742 undeleting clean_removed
743 undeleting clean_untracked-clean
708 reverting clean_wc
744 reverting clean_wc
709 forgetting missing_wc
745 forgetting missing_wc
710 undeleting modified_removed
746 undeleting modified_removed
711 reverting modified_revert
747 reverting modified_revert
748 undeleting modified_untracked-clean
712 reverting modified_wc
749 reverting modified_wc
713 forgetting removed_revert
750 forgetting removed_revert
714 forgetting removed_wc
751 forgetting removed_wc
715
752
716 Compare resulting directory with revert target.
753 Compare resulting directory with revert target.
717
754
718 The diff is filtered to include change only. The only difference should be
755 The diff is filtered to include change only. The only difference should be
719 additional `.orig` backup file when applicable.
756 additional `.orig` backup file when applicable.
720
757
721 $ python ../dircontent.py > ../content-parent-all.txt
758 $ python ../dircontent.py > ../content-parent-all.txt
722 $ cd ..
759 $ cd ..
723 $ diff -U 0 -- content-parent.txt content-parent-all.txt | grep _
760 $ diff -U 0 -- content-parent.txt content-parent-all.txt | grep _
724 +wc added_wc.orig
761 +wc added_wc.orig
725 +wc clean_wc.orig
762 +wc clean_wc.orig
726 +wc missing_wc
763 +wc missing_wc
727 +base modified_revert.orig
764 +base modified_revert.orig
728 +wc modified_wc.orig
765 +wc modified_wc.orig
729 +base removed_revert
766 +base removed_revert
730 +wc removed_wc
767 +wc removed_wc
731
768
732 Test revert --all to "base" content
769 Test revert --all to "base" content
733 -----------------------------------
770 -----------------------------------
734
771
735 (setup from reference repo)
772 (setup from reference repo)
736
773
737 $ cp -r revert-ref revert-base-all
774 $ cp -r revert-ref revert-base-all
738 $ cd revert-base-all
775 $ cd revert-base-all
739
776
740 check revert output
777 check revert output
741
778
742 Misbehavior:
779 Misbehavior:
743
780
744 - report "reverting" when file needs no changes
781 - report "reverting" when file needs no changes
745 |
782 |
746 | - reverting modified_revert
783 | - reverting modified_revert
747 | - reverting removed_revert
784 | - reverting removed_revert
748
785
749 $ hg revert --all --rev 'desc(base)'
786 $ hg revert --all --rev 'desc(base)'
750 removing added_clean
787 removing added_clean
751 removing added_wc
788 removing added_wc
752 undeleting clean_removed
789 undeleting clean_removed
790 undeleting clean_untracked-clean
753 reverting clean_wc
791 reverting clean_wc
754 forgetting missing_wc
792 forgetting missing_wc
755 reverting modified_clean
793 reverting modified_clean
756 undeleting modified_removed
794 undeleting modified_removed
757 reverting modified_revert
795 reverting modified_revert
796 undeleting modified_untracked-clean
758 reverting modified_wc
797 reverting modified_wc
759 adding removed_clean
798 adding removed_clean
760 adding removed_removed
799 adding removed_removed
761 reverting removed_revert
800 reverting removed_revert
801 adding removed_untracked-clean
762 reverting removed_wc
802 reverting removed_wc
763
803
764 Compare resulting directory with revert target.
804 Compare resulting directory with revert target.
765
805
766 The diff is filtered to include change only. The only difference should be
806 The diff is filtered to include change only. The only difference should be
767 additional `.orig` backup file when applicable.
807 additional `.orig` backup file when applicable.
768
808
769 Misbehavior:
809 Misbehavior:
770
810
771 - no backup for
811 - no backup for
772 | - added_wc (DATA LOSS)
812 | - added_wc (DATA LOSS)
773
813
774 $ python ../dircontent.py > ../content-base-all.txt
814 $ python ../dircontent.py > ../content-base-all.txt
775 $ cd ..
815 $ cd ..
776 $ diff -U 0 -- content-base.txt content-base-all.txt | grep _
816 $ diff -U 0 -- content-base.txt content-base-all.txt | grep _
817 +parent added_untracked-clean
777 +wc clean_wc.orig
818 +wc clean_wc.orig
778 +wc missing_wc
819 +wc missing_wc
820 +parent modified_untracked-clean.orig
779 +wc modified_wc.orig
821 +wc modified_wc.orig
780 +wc removed_wc.orig
822 +wc removed_wc.orig
781
823
782 Test revert to parent content with explicit file name
824 Test revert to parent content with explicit file name
783 -----------------------------------------------------
825 -----------------------------------------------------
784
826
785 (setup from reference repo)
827 (setup from reference repo)
786
828
787 $ cp -r revert-ref revert-parent-explicit
829 $ cp -r revert-ref revert-parent-explicit
788 $ cd revert-parent-explicit
830 $ cd revert-parent-explicit
789
831
790 revert all files individually and check the output
832 revert all files individually and check the output
791 (output is expected to be different than in the --all case)
833 (output is expected to be different than in the --all case)
792
834
793 $ for file in `python ../gen-revert-cases.py filelist`; do
835 $ for file in `python ../gen-revert-cases.py filelist`; do
794 > echo '### revert for:' $file;
836 > echo '### revert for:' $file;
795 > hg revert $file;
837 > hg revert $file;
796 > echo
838 > echo
797 > done
839 > done
798 ### revert for: added_clean
840 ### revert for: added_clean
799 no changes needed to added_clean
841 no changes needed to added_clean
800
842
801 ### revert for: added_removed
843 ### revert for: added_removed
802
844
803 ### revert for: added_revert
845 ### revert for: added_revert
804
846
847 ### revert for: added_untracked-clean
848
805 ### revert for: added_wc
849 ### revert for: added_wc
806
850
807 ### revert for: clean_clean
851 ### revert for: clean_clean
808 no changes needed to clean_clean
852 no changes needed to clean_clean
809
853
810 ### revert for: clean_removed
854 ### revert for: clean_removed
811
855
812 ### revert for: clean_revert
856 ### revert for: clean_revert
813 no changes needed to clean_revert
857 no changes needed to clean_revert
814
858
859 ### revert for: clean_untracked-clean
860
815 ### revert for: clean_wc
861 ### revert for: clean_wc
816
862
817 ### revert for: missing_clean
863 ### revert for: missing_clean
818 missing_clean: no such file in rev * (glob)
864 missing_clean: no such file in rev * (glob)
819
865
820 ### revert for: missing_removed
866 ### revert for: missing_removed
821 missing_removed: no such file in rev * (glob)
867 missing_removed: no such file in rev * (glob)
822
868
823 ### revert for: missing_revert
869 ### revert for: missing_revert
824 missing_revert: no such file in rev * (glob)
870 missing_revert: no such file in rev * (glob)
825
871
872 ### revert for: missing_untracked-clean
873 missing_untracked-clean: no such file in rev * (glob)
874
826 ### revert for: missing_wc
875 ### revert for: missing_wc
827
876
828 ### revert for: modified_clean
877 ### revert for: modified_clean
829 no changes needed to modified_clean
878 no changes needed to modified_clean
830
879
831 ### revert for: modified_removed
880 ### revert for: modified_removed
832
881
833 ### revert for: modified_revert
882 ### revert for: modified_revert
834
883
884 ### revert for: modified_untracked-clean
885
835 ### revert for: modified_wc
886 ### revert for: modified_wc
836
887
837 ### revert for: removed_clean
888 ### revert for: removed_clean
838 removed_clean: no such file in rev * (glob)
889 removed_clean: no such file in rev * (glob)
839
890
840 ### revert for: removed_removed
891 ### revert for: removed_removed
841 removed_removed: no such file in rev * (glob)
892 removed_removed: no such file in rev * (glob)
842
893
843 ### revert for: removed_revert
894 ### revert for: removed_revert
844
895
896 ### revert for: removed_untracked-clean
897 removed_untracked-clean: no such file in rev * (glob)
898
845 ### revert for: removed_wc
899 ### revert for: removed_wc
846
900
847
901
848 check resulting directory againt the --all run
902 check resulting directory againt the --all run
849 (There should be no difference)
903 (There should be no difference)
850
904
851 $ python ../dircontent.py > ../content-parent-explicit.txt
905 $ python ../dircontent.py > ../content-parent-explicit.txt
852 $ cd ..
906 $ cd ..
853 $ diff -U 0 -- content-parent-all.txt content-parent-explicit.txt | grep _
907 $ diff -U 0 -- content-parent-all.txt content-parent-explicit.txt | grep _
854 [1]
908 [1]
855
909
856 Test revert to "base" content with explicit file name
910 Test revert to "base" content with explicit file name
857 -----------------------------------------------------
911 -----------------------------------------------------
858
912
859 (setup from reference repo)
913 (setup from reference repo)
860
914
861 $ cp -r revert-ref revert-base-explicit
915 $ cp -r revert-ref revert-base-explicit
862 $ cd revert-base-explicit
916 $ cd revert-base-explicit
863
917
864 revert all files individually and check the output
918 revert all files individually and check the output
865 (output is expected to be different than in the --all case)
919 (output is expected to be different than in the --all case)
866
920
867 Misbehavior:
921 Misbehavior:
868
922
869 - fails to report no change to revert for
923 - fails to report no change to revert for
870 |
924 |
871 | - clean_clean
925 | - clean_clean
872 | - added_revert
926 | - added_revert
873 | - clean_revert
927 | - clean_revert
874 | - modified_revert
928 | - modified_revert
875 | - removed_revert
929 | - removed_revert
876 | - added_removed
930 | - added_removed
931 | - added_untracked-clean
877
932
878 $ for file in `python ../gen-revert-cases.py filelist`; do
933 $ for file in `python ../gen-revert-cases.py filelist`; do
879 > echo '### revert for:' $file;
934 > echo '### revert for:' $file;
880 > hg revert $file --rev 'desc(base)';
935 > hg revert $file --rev 'desc(base)';
881 > echo
936 > echo
882 > done
937 > done
883 ### revert for: added_clean
938 ### revert for: added_clean
884
939
885 ### revert for: added_removed
940 ### revert for: added_removed
886
941
887 ### revert for: added_revert
942 ### revert for: added_revert
888
943
944 ### revert for: added_untracked-clean
945
889 ### revert for: added_wc
946 ### revert for: added_wc
890
947
891 ### revert for: clean_clean
948 ### revert for: clean_clean
892
949
893 ### revert for: clean_removed
950 ### revert for: clean_removed
894
951
895 ### revert for: clean_revert
952 ### revert for: clean_revert
896
953
954 ### revert for: clean_untracked-clean
955
897 ### revert for: clean_wc
956 ### revert for: clean_wc
898
957
899 ### revert for: missing_clean
958 ### revert for: missing_clean
900 missing_clean: no such file in rev * (glob)
959 missing_clean: no such file in rev * (glob)
901
960
902 ### revert for: missing_removed
961 ### revert for: missing_removed
903 missing_removed: no such file in rev * (glob)
962 missing_removed: no such file in rev * (glob)
904
963
905 ### revert for: missing_revert
964 ### revert for: missing_revert
906 missing_revert: no such file in rev * (glob)
965 missing_revert: no such file in rev * (glob)
907
966
967 ### revert for: missing_untracked-clean
968 missing_untracked-clean: no such file in rev * (glob)
969
908 ### revert for: missing_wc
970 ### revert for: missing_wc
909
971
910 ### revert for: modified_clean
972 ### revert for: modified_clean
911
973
912 ### revert for: modified_removed
974 ### revert for: modified_removed
913
975
914 ### revert for: modified_revert
976 ### revert for: modified_revert
915
977
978 ### revert for: modified_untracked-clean
979
916 ### revert for: modified_wc
980 ### revert for: modified_wc
917
981
918 ### revert for: removed_clean
982 ### revert for: removed_clean
919
983
920 ### revert for: removed_removed
984 ### revert for: removed_removed
921
985
922 ### revert for: removed_revert
986 ### revert for: removed_revert
923
987
988 ### revert for: removed_untracked-clean
989
924 ### revert for: removed_wc
990 ### revert for: removed_wc
925
991
926
992
927 check resulting directory againt the --all run
993 check resulting directory againt the --all run
928 (There should be no difference)
994 (There should be no difference)
929
995
930 $ python ../dircontent.py > ../content-base-explicit.txt
996 $ python ../dircontent.py > ../content-base-explicit.txt
931 $ cd ..
997 $ cd ..
932 $ diff -U 0 -- content-base-all.txt content-base-explicit.txt | grep _
998 $ diff -U 0 -- content-base-all.txt content-base-explicit.txt | grep _
933 [1]
999 [1]
General Comments 0
You need to be logged in to leave comments. Login now