##// END OF EJS Templates
test-revert: add case where file exists neither in "base" nor in "parent"
Pierre-Yves David -
r22137:2cfe5ec4 default
parent child Browse files
Show More
@@ -1,705 +1,714 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
447 > 'missing': [None, None],
446 > }
448 > }
447 >
449 >
448 > # content of file in working copy
450 > # content of file in working copy
449 > wccontent = {
451 > wccontent = {
450 > # clean: wc content is the same as parent
452 > # clean: wc content is the same as parent
451 > 'clean': lambda cc: cc[1],
453 > 'clean': lambda cc: cc[1],
452 > }
454 > }
453 >
455 >
454 > # build the combination of possible states
456 > # build the combination of possible states
455 > combination = []
457 > combination = []
456 > for ctxkey in ctxcontent:
458 > for ctxkey in ctxcontent:
457 > for wckey in wccontent:
459 > for wckey in wccontent:
458 > filename = "%s_%s" % (ctxkey, wckey)
460 > filename = "%s_%s" % (ctxkey, wckey)
459 > combination.append((filename, ctxkey, wckey))
461 > combination.append((filename, ctxkey, wckey))
460 >
462 >
461 > # make sure we have stable output
463 > # make sure we have stable output
462 > combination.sort()
464 > combination.sort()
463 >
465 >
464 > # retrieve the state we must generate
466 > # retrieve the state we must generate
465 > target = sys.argv[1]
467 > target = sys.argv[1]
466 >
468 >
467 > # compute file content
469 > # compute file content
468 > content = []
470 > content = []
469 > for filename, ctxkey, wckey in combination:
471 > for filename, ctxkey, wckey in combination:
470 > cc = ctxcontent[ctxkey]
472 > cc = ctxcontent[ctxkey]
471 > if target == 'filelist':
473 > if target == 'filelist':
472 > print filename
474 > print filename
473 > elif target == 'base':
475 > elif target == 'base':
474 > content.append((filename, cc[0]))
476 > content.append((filename, cc[0]))
475 > elif target == 'parent':
477 > elif target == 'parent':
476 > content.append((filename, cc[1]))
478 > content.append((filename, cc[1]))
477 > elif target == 'wc':
479 > elif target == 'wc':
478 > content.append((filename, wccontent[wckey](cc)))
480 > content.append((filename, wccontent[wckey](cc)))
479 > else:
481 > else:
480 > print >> sys.stderr, "unknown target:", target
482 > print >> sys.stderr, "unknown target:", target
481 > sys.exit(1)
483 > sys.exit(1)
482 >
484 >
483 > # write actual content
485 > # write actual content
484 > for filename, data in content:
486 > for filename, data in content:
485 > if data is not None:
487 > if data is not None:
486 > f = open(filename, 'w')
488 > f = open(filename, 'w')
487 > f.write(data + '\n')
489 > f.write(data + '\n')
488 > f.close()
490 > f.close()
489 > elif os.path.exists(filename):
491 > elif os.path.exists(filename):
490 > os.remove(filename)
492 > os.remove(filename)
491 > EOF
493 > EOF
492
494
493 check list of planned files
495 check list of planned files
494
496
495 $ python gen-revert-cases.py filelist
497 $ python gen-revert-cases.py filelist
496 added_clean
498 added_clean
497 clean_clean
499 clean_clean
500 missing_clean
498 modified_clean
501 modified_clean
499 removed_clean
502 removed_clean
500
503
501 Script to make a simple text version of the content
504 Script to make a simple text version of the content
502 ---------------------------------------------------
505 ---------------------------------------------------
503
506
504 $ cat << EOF >> dircontent.py
507 $ cat << EOF >> dircontent.py
505 > # generate a simple text view of the directory for easy comparison
508 > # generate a simple text view of the directory for easy comparison
506 > import os
509 > import os
507 > files = os.listdir('.')
510 > files = os.listdir('.')
508 > files.sort()
511 > files.sort()
509 > for filename in files:
512 > for filename in files:
510 > if os.path.isdir(filename):
513 > if os.path.isdir(filename):
511 > continue
514 > continue
512 > content = open(filename).read()
515 > content = open(filename).read()
513 > print '%-6s %s' % (content.strip(), filename)
516 > print '%-6s %s' % (content.strip(), filename)
514 > EOF
517 > EOF
515
518
516 Generate appropriate repo state
519 Generate appropriate repo state
517 -------------------------------
520 -------------------------------
518
521
519 $ hg init revert-ref
522 $ hg init revert-ref
520 $ cd revert-ref
523 $ cd revert-ref
521
524
522 Generate base changeset
525 Generate base changeset
523
526
524 $ python ../gen-revert-cases.py base
527 $ python ../gen-revert-cases.py base
525 $ hg addremove --similarity 0
528 $ hg addremove --similarity 0
526 adding clean_clean
529 adding clean_clean
527 adding modified_clean
530 adding modified_clean
528 adding removed_clean
531 adding removed_clean
529 $ hg status
532 $ hg status
530 A clean_clean
533 A clean_clean
531 A modified_clean
534 A modified_clean
532 A removed_clean
535 A removed_clean
533 $ hg commit -m 'base'
536 $ hg commit -m 'base'
534
537
535 (create a simple text version of the content)
538 (create a simple text version of the content)
536
539
537 $ python ../dircontent.py > ../content-base.txt
540 $ python ../dircontent.py > ../content-base.txt
538 $ cat ../content-base.txt
541 $ cat ../content-base.txt
539 base clean_clean
542 base clean_clean
540 base modified_clean
543 base modified_clean
541 base removed_clean
544 base removed_clean
542
545
543 Create parent changeset
546 Create parent changeset
544
547
545 $ python ../gen-revert-cases.py parent
548 $ python ../gen-revert-cases.py parent
546 $ hg addremove --similarity 0
549 $ hg addremove --similarity 0
547 adding added_clean
550 adding added_clean
548 removing removed_clean
551 removing removed_clean
549 $ hg status
552 $ hg status
550 M modified_clean
553 M modified_clean
551 A added_clean
554 A added_clean
552 R removed_clean
555 R removed_clean
553 $ hg commit -m 'parent'
556 $ hg commit -m 'parent'
554
557
555 (create a simple text version of the content)
558 (create a simple text version of the content)
556
559
557 $ python ../dircontent.py > ../content-parent.txt
560 $ python ../dircontent.py > ../content-parent.txt
558 $ cat ../content-parent.txt
561 $ cat ../content-parent.txt
559 parent added_clean
562 parent added_clean
560 base clean_clean
563 base clean_clean
561 parent modified_clean
564 parent modified_clean
562
565
563 Setup working directory
566 Setup working directory
564
567
565 $ python ../gen-revert-cases.py wc | cat
568 $ python ../gen-revert-cases.py wc | cat
566 $ hg addremove --similarity 0
569 $ hg addremove --similarity 0
567 $ hg status
570 $ hg status
568
571
569 $ hg status --rev 'desc("base")'
572 $ hg status --rev 'desc("base")'
570 M modified_clean
573 M modified_clean
571 A added_clean
574 A added_clean
572 R removed_clean
575 R removed_clean
573
576
574 (create a simple text version of the content)
577 (create a simple text version of the content)
575
578
576 $ python ../dircontent.py > ../content-wc.txt
579 $ python ../dircontent.py > ../content-wc.txt
577 $ cat ../content-wc.txt
580 $ cat ../content-wc.txt
578 parent added_clean
581 parent added_clean
579 base clean_clean
582 base clean_clean
580 parent modified_clean
583 parent modified_clean
581
584
582 $ cd ..
585 $ cd ..
583
586
584 Test revert --all to parent content
587 Test revert --all to parent content
585 -----------------------------------
588 -----------------------------------
586
589
587 (setup from reference repo)
590 (setup from reference repo)
588
591
589 $ cp -r revert-ref revert-parent-all
592 $ cp -r revert-ref revert-parent-all
590 $ cd revert-parent-all
593 $ cd revert-parent-all
591
594
592 check revert output
595 check revert output
593
596
594 $ hg revert --all
597 $ hg revert --all
595
598
596 Compare resulting directory with revert target.
599 Compare resulting directory with revert target.
597
600
598 The diff is filtered to include change only. The only difference should be
601 The diff is filtered to include change only. The only difference should be
599 additional `.orig` backup file when applicable.
602 additional `.orig` backup file when applicable.
600
603
601 $ python ../dircontent.py > ../content-parent-all.txt
604 $ python ../dircontent.py > ../content-parent-all.txt
602 $ cd ..
605 $ cd ..
603 $ diff -U 0 -- content-parent.txt content-parent-all.txt | grep _
606 $ diff -U 0 -- content-parent.txt content-parent-all.txt | grep _
604 [1]
607 [1]
605
608
606 Test revert --all to "base" content
609 Test revert --all to "base" content
607 -----------------------------------
610 -----------------------------------
608
611
609 (setup from reference repo)
612 (setup from reference repo)
610
613
611 $ cp -r revert-ref revert-base-all
614 $ cp -r revert-ref revert-base-all
612 $ cd revert-base-all
615 $ cd revert-base-all
613
616
614 check revert output
617 check revert output
615
618
616 $ hg revert --all --rev 'desc(base)'
619 $ hg revert --all --rev 'desc(base)'
617 removing added_clean
620 removing added_clean
618 reverting modified_clean
621 reverting modified_clean
619 adding removed_clean
622 adding removed_clean
620
623
621 Compare resulting directory with revert target.
624 Compare resulting directory with revert target.
622
625
623 The diff is filtered to include change only. The only difference should be
626 The diff is filtered to include change only. The only difference should be
624 additional `.orig` backup file when applicable.
627 additional `.orig` backup file when applicable.
625
628
626 $ python ../dircontent.py > ../content-base-all.txt
629 $ python ../dircontent.py > ../content-base-all.txt
627 $ cd ..
630 $ cd ..
628 $ diff -U 0 -- content-base.txt content-base-all.txt | grep _
631 $ diff -U 0 -- content-base.txt content-base-all.txt | grep _
629 [1]
632 [1]
630
633
631 Test revert to parent content with explicit file name
634 Test revert to parent content with explicit file name
632 -----------------------------------------------------
635 -----------------------------------------------------
633
636
634 (setup from reference repo)
637 (setup from reference repo)
635
638
636 $ cp -r revert-ref revert-parent-explicit
639 $ cp -r revert-ref revert-parent-explicit
637 $ cd revert-parent-explicit
640 $ cd revert-parent-explicit
638
641
639 revert all files individually and check the output
642 revert all files individually and check the output
640 (output is expected to be different than in the --all case)
643 (output is expected to be different than in the --all case)
641
644
642 $ for file in `python ../gen-revert-cases.py filelist`; do
645 $ for file in `python ../gen-revert-cases.py filelist`; do
643 > echo '### revert for:' $file;
646 > echo '### revert for:' $file;
644 > hg revert $file;
647 > hg revert $file;
645 > echo
648 > echo
646 > done
649 > done
647 ### revert for: added_clean
650 ### revert for: added_clean
648 no changes needed to added_clean
651 no changes needed to added_clean
649
652
650 ### revert for: clean_clean
653 ### revert for: clean_clean
651 no changes needed to clean_clean
654 no changes needed to clean_clean
652
655
656 ### revert for: missing_clean
657 missing_clean: no such file in rev * (glob)
658
653 ### revert for: modified_clean
659 ### revert for: modified_clean
654 no changes needed to modified_clean
660 no changes needed to modified_clean
655
661
656 ### revert for: removed_clean
662 ### revert for: removed_clean
657 removed_clean: no such file in rev * (glob)
663 removed_clean: no such file in rev * (glob)
658
664
659
665
660 check resulting directory againt the --all run
666 check resulting directory againt the --all run
661 (There should be no difference)
667 (There should be no difference)
662
668
663 $ python ../dircontent.py > ../content-parent-explicit.txt
669 $ python ../dircontent.py > ../content-parent-explicit.txt
664 $ cd ..
670 $ cd ..
665 $ diff -U 0 -- content-parent-all.txt content-parent-explicit.txt | grep _
671 $ diff -U 0 -- content-parent-all.txt content-parent-explicit.txt | grep _
666 [1]
672 [1]
667
673
668 Test revert to "base" content with explicit file name
674 Test revert to "base" content with explicit file name
669 -----------------------------------------------------
675 -----------------------------------------------------
670
676
671 (setup from reference repo)
677 (setup from reference repo)
672
678
673 $ cp -r revert-ref revert-base-explicit
679 $ cp -r revert-ref revert-base-explicit
674 $ cd revert-base-explicit
680 $ cd revert-base-explicit
675
681
676 revert all files individually and check the output
682 revert all files individually and check the output
677 (output is expected to be different than in the --all case)
683 (output is expected to be different than in the --all case)
678
684
679 Misbehavior:
685 Misbehavior:
680
686
681 - fails to report no change to revert for
687 - fails to report no change to revert for
682 |
688 |
683 | - clean_clean
689 | - clean_clean
684
690
685 $ for file in `python ../gen-revert-cases.py filelist`; do
691 $ for file in `python ../gen-revert-cases.py filelist`; do
686 > echo '### revert for:' $file;
692 > echo '### revert for:' $file;
687 > hg revert $file --rev 'desc(base)';
693 > hg revert $file --rev 'desc(base)';
688 > echo
694 > echo
689 > done
695 > done
690 ### revert for: added_clean
696 ### revert for: added_clean
691
697
692 ### revert for: clean_clean
698 ### revert for: clean_clean
693
699
700 ### revert for: missing_clean
701 missing_clean: no such file in rev * (glob)
702
694 ### revert for: modified_clean
703 ### revert for: modified_clean
695
704
696 ### revert for: removed_clean
705 ### revert for: removed_clean
697
706
698
707
699 check resulting directory againt the --all run
708 check resulting directory againt the --all run
700 (There should be no difference)
709 (There should be no difference)
701
710
702 $ python ../dircontent.py > ../content-base-explicit.txt
711 $ python ../dircontent.py > ../content-base-explicit.txt
703 $ cd ..
712 $ cd ..
704 $ diff -U 0 -- content-base-all.txt content-base-explicit.txt | grep _
713 $ diff -U 0 -- content-base-all.txt content-base-explicit.txt | grep _
705 [1]
714 [1]
General Comments 0
You need to be logged in to leave comments. Login now