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 |
397 Systematic behavior validation of most possible cases |
|
398 ===================================================== |
|
399 |
|
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 |
|
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. |
|
404 |
|
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 |
|
407 the other side, changes between a revert target (--rev) and working directory |
|
408 parent. The three states generated are: |
|
409 |
|
410 - a "base" revision |
|
411 - a "parent" revision |
|
412 - the working directory (based on "parent") |
|
413 |
|
414 The file generated have names of the form: |
|
415 |
|
416 <changeset-state>_<working-copy-state> |
|
417 |
|
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. |
|
420 |
|
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. |
|
423 |
|
424 There are also multiple cases where the current revert implementation is known to |
|
425 slightly misbehave. |
|
426 |
|
427 Write the python script to disk |
|
428 ------------------------------- |
|
429 |
|
430 $ cat << EOF > gen-revert-cases.py |
|
431 > # generate proper file state to test revert behavior |
|
432 > import sys |
|
433 > |
|
434 > # content of the file in "base" and "parent" |
|
435 > ctxcontent = { |
|
436 > # modified: file content change from base to parent |
|
437 > 'modified': ['base', 'parent'], |
|
438 > } |
|
439 > |
|
440 > # content of file in working copy |
|
441 > wccontent = { |
|
442 > # clean: wc content is the same as parent |
|
443 > 'clean': lambda cc: cc[1], |
|
444 > } |
|
445 > |
|
446 > # build the combination of possible states |
|
447 > combination = [] |
|
448 > for ctxkey in ctxcontent: |
|
449 > for wckey in wccontent: |
|
450 > filename = "%s_%s" % (ctxkey, wckey) |
|
451 > combination.append((filename, ctxkey, wckey)) |
|
452 > |
|
453 > # make sure we have stable output |
|
454 > combination.sort() |
|
455 > |
|
456 > # retrieve the state we must generate |
|
457 > target = sys.argv[1] |
|
458 > |
|
459 > # compute file content |
|
460 > content = [] |
|
461 > for filename, ctxkey, wckey in combination: |
|
462 > cc = ctxcontent[ctxkey] |
|
463 > if target == 'base': |
|
464 > content.append((filename, cc[0])) |
|
465 > elif target == 'parent': |
|
466 > content.append((filename, cc[1])) |
|
467 > elif target == 'wc': |
|
468 > content.append((filename, wccontent[wckey](cc))) |
|
469 > else: |
|
470 > print >> sys.stderr, "unknown target:", target |
|
471 > sys.exit(1) |
|
472 > |
|
473 > # write actual content |
|
474 > for filename, data in content: |
|
475 > f = open(filename, 'w') |
|
476 > f.write(data + '\n') |
|
477 > f.close() |
|
478 > EOF |
|
479 |
|
480 |
|
481 Generate appropriate repo state |
|
482 ------------------------------- |
|
483 |
|
484 $ hg init revert-ref |
|
485 $ cd revert-ref |
|
486 |
|
487 Generate base changeset |
|
488 |
|
489 $ python ../gen-revert-cases.py base |
|
490 $ hg addremove --similarity 0 |
|
491 adding modified_clean |
|
492 $ hg status |
|
493 A modified_clean |
|
494 $ hg commit -m 'base' |
|
495 |
|
496 Create parent changeset |
|
497 |
|
498 $ python ../gen-revert-cases.py parent |
|
499 $ hg addremove --similarity 0 |
|
500 $ hg status |
|
501 M modified_clean |
|
502 $ hg commit -m 'parent' |
|
503 |
|
504 Setup working directory |
|
505 |
|
506 $ python ../gen-revert-cases.py wc | cat |
|
507 $ hg addremove --similarity 0 |
|
508 $ hg status |
|
509 |
|
510 $ hg status --rev 'desc("base")' |
|
511 M modified_clean |
|
512 |
|
513 $ cd .. |
|
514 |