tests/test-revert.t
changeset 22124 e51784473fc0
parent 22123 7740db54bf73
child 22126 651b2149f1e7
equal deleted inserted replaced
22123:7740db54bf73 22124:e51784473fc0
   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