tests/test-merge-partial-tool.t
branchstable
changeset 49366 288de6f5d724
parent 49167 7af798e497f5
child 49837 59466b13a3ae
equal deleted inserted replaced
49364:e8ea403b1c46 49366:288de6f5d724
       
     1 Test support for partial-resolution tools
       
     2 
       
     3 Create a tool that resolves conflicts after line 5 by simply dropping those
       
     4 lines (even if there are no conflicts there)
       
     5   $ cat >> "$TESTTMP/head.sh" <<'EOF'
       
     6   > #!/bin/sh
       
     7   > for f in "$@"; do
       
     8   >   head -5 $f > tmp
       
     9   >   mv -f tmp $f
       
    10   > done
       
    11   > EOF
       
    12   $ chmod +x "$TESTTMP/head.sh"
       
    13 ...and another tool that keeps only the last 5 lines instead of the first 5.
       
    14   $ cat >> "$TESTTMP/tail.sh" <<'EOF'
       
    15   > #!/bin/sh
       
    16   > for f in "$@"; do
       
    17   >   tail -5 $f > tmp
       
    18   >   mv -f tmp $f
       
    19   > done
       
    20   > EOF
       
    21   $ chmod +x "$TESTTMP/tail.sh"
       
    22 
       
    23 Set up both tools to run on all patterns (the default), and let the `tail` tool
       
    24 run after the `head` tool, which means it will have no effect (we'll override it
       
    25 to test order later)
       
    26   $ cat >> "$HGRCPATH" <<EOF
       
    27   > [partial-merge-tools]
       
    28   > head.executable=$TESTTMP/head.sh
       
    29   > tail.executable=$TESTTMP/tail.sh
       
    30   > tail.order=1
       
    31   > EOF
       
    32 
       
    33   $ make_commit() {
       
    34   >   echo "$@" | xargs -n1 > file
       
    35   >   hg add file 2> /dev/null
       
    36   >   hg ci -m "$*"
       
    37   > }
       
    38 
       
    39 
       
    40 Let a partial-resolution tool resolve some conflicts and leave other conflicts
       
    41 for the regular merge tool (:merge3 here)
       
    42 
       
    43   $ hg init repo
       
    44   $ cd repo
       
    45   $ make_commit a b c d e f
       
    46   $ make_commit a b2 c d e f2
       
    47   $ hg up 0
       
    48   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
    49   $ make_commit a b3 c d e f3
       
    50   created new head
       
    51   $ hg merge 1 -t :merge3
       
    52   merging file
       
    53   warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
       
    54   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
       
    55   use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
       
    56   [1]
       
    57   $ cat file
       
    58   a
       
    59   <<<<<<< working copy:    e11a49d4b620 - test: a b3 c d e f3
       
    60   b3
       
    61   ||||||| common ancestor: 8ae8bb9cc43a - test: a b c d e f
       
    62   b
       
    63   =======
       
    64   b2
       
    65   >>>>>>> merge rev:       fbc096a40cc5 - test: a b2 c d e f2
       
    66   c
       
    67   d
       
    68   e
       
    69 
       
    70 
       
    71 With premerge=keep, the partial-resolution tools runs before and doesn't see
       
    72 the conflict markers
       
    73 
       
    74   $ hg up -C 2
       
    75   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
    76   $ cat >> .hg/hgrc <<EOF
       
    77   > [merge-tools]
       
    78   > my-local.executable = cat
       
    79   > my-local.args = $local
       
    80   > my-local.premerge = keep-merge3
       
    81   > EOF
       
    82   $ hg merge 1 -t my-local
       
    83   merging file
       
    84   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
       
    85   (branch merge, don't forget to commit)
       
    86   $ cat file
       
    87   a
       
    88   <<<<<<< working copy:    e11a49d4b620 - test: a b3 c d e f3
       
    89   b3
       
    90   ||||||| common ancestor: 8ae8bb9cc43a - test: a b c d e f
       
    91   b
       
    92   =======
       
    93   b2
       
    94   >>>>>>> merge rev:       fbc096a40cc5 - test: a b2 c d e f2
       
    95   c
       
    96   d
       
    97   e
       
    98 
       
    99 
       
   100 When a partial-resolution tool resolves all conflicts, the resolution should
       
   101 be recorded and the regular merge tool should not be invoked for the file.
       
   102 
       
   103   $ hg up -C 0
       
   104   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   105   $ make_commit a b c d e f2
       
   106   created new head
       
   107   $ hg up 0
       
   108   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   109   $ make_commit a b c d e f3
       
   110   created new head
       
   111   $ hg merge 3 -t false
       
   112   merging file
       
   113   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
       
   114   (branch merge, don't forget to commit)
       
   115   $ cat file
       
   116   a
       
   117   b
       
   118   c
       
   119   d
       
   120   e
       
   121 
       
   122 
       
   123 Can disable all partial merge tools (the `head` tool would have resolved this
       
   124 conflict it had been enabled)
       
   125 
       
   126   $ hg up -C 4
       
   127   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   128   $ hg merge 3 -t :merge3 --config merge.disable-partial-tools=yes
       
   129   merging file
       
   130   warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
       
   131   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
       
   132   use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
       
   133   [1]
       
   134   $ cat file
       
   135   a
       
   136   b
       
   137   c
       
   138   d
       
   139   e
       
   140   <<<<<<< working copy:    d57edaa6e21a - test: a b c d e f3
       
   141   f3
       
   142   ||||||| common ancestor: 8ae8bb9cc43a - test: a b c d e f
       
   143   f
       
   144   =======
       
   145   f2
       
   146   >>>>>>> merge rev:       8c217da987be - test: a b c d e f2
       
   147 
       
   148 
       
   149 Can disable one partial merge tool (the `head` tool would have resolved this
       
   150 conflict it had been enabled)
       
   151 
       
   152   $ hg up -C 4
       
   153   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   154   $ hg merge 3 -t :merge3 --config partial-merge-tools.head.disable=yes
       
   155   merging file
       
   156   warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
       
   157   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
       
   158   use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
       
   159   [1]
       
   160   $ cat file
       
   161   b
       
   162   c
       
   163   d
       
   164   e
       
   165   <<<<<<< working copy:    d57edaa6e21a - test: a b c d e f3
       
   166   f3
       
   167   ||||||| common ancestor: 8ae8bb9cc43a - test: a b c d e f
       
   168   f
       
   169   =======
       
   170   f2
       
   171   >>>>>>> merge rev:       8c217da987be - test: a b c d e f2
       
   172 
       
   173 
       
   174 Only tools whose patterns match are run. We make `head` not match here, so
       
   175 only `tail` should run
       
   176 
       
   177   $ hg up -C 4
       
   178   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   179   $ hg merge 3 -t :merge3 --config partial-merge-tools.head.patterns=other
       
   180   merging file
       
   181   warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
       
   182   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
       
   183   use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
       
   184   [1]
       
   185   $ cat file
       
   186   b
       
   187   c
       
   188   d
       
   189   e
       
   190   <<<<<<< working copy:    d57edaa6e21a - test: a b c d e f3
       
   191   f3
       
   192   ||||||| common ancestor: 8ae8bb9cc43a - test: a b c d e f
       
   193   f
       
   194   =======
       
   195   f2
       
   196   >>>>>>> merge rev:       8c217da987be - test: a b c d e f2
       
   197 
       
   198 
       
   199 If there are several matching tools, they are run in requested order. We move
       
   200 `head` after `tail` in order here so it has no effect (the conflict in "f" thus
       
   201 remains).
       
   202 
       
   203   $ hg up -C 4
       
   204   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   205   $ hg merge 3 -t :merge3 --config partial-merge-tools.head.order=2
       
   206   merging file
       
   207   warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
       
   208   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
       
   209   use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
       
   210   [1]
       
   211   $ cat file
       
   212   b
       
   213   c
       
   214   d
       
   215   e
       
   216   <<<<<<< working copy:    d57edaa6e21a - test: a b c d e f3
       
   217   f3
       
   218   ||||||| common ancestor: 8ae8bb9cc43a - test: a b c d e f
       
   219   f
       
   220   =======
       
   221   f2
       
   222   >>>>>>> merge rev:       8c217da987be - test: a b c d e f2
       
   223 
       
   224 
       
   225 When using "nomerge" tools (e.g. `:other`), the partial-resolution tools
       
   226 should not be run.
       
   227 
       
   228   $ hg up -C 4
       
   229   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   230   $ hg merge 3 -t :other
       
   231   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
       
   232   (branch merge, don't forget to commit)
       
   233   $ cat file
       
   234   a
       
   235   b
       
   236   c
       
   237   d
       
   238   e
       
   239   f2
       
   240 
       
   241 
       
   242 If a partial-resolution tool resolved some conflict and simplemerge can
       
   243 merge the rest, then the regular merge tool should not be used. Here we merge
       
   244 "a b c d e3 f3" with "a b2 c d e f2". The `head` tool resolves the conflict in
       
   245 "f" and the internal simplemerge merges the remaining changes in "b" and "e".
       
   246 
       
   247   $ hg up -C 0
       
   248   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   249   $ make_commit a b c d e3 f3
       
   250   created new head
       
   251   $ hg merge 1 -t false
       
   252   merging file
       
   253   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
       
   254   (branch merge, don't forget to commit)
       
   255   $ cat file
       
   256   a
       
   257   b2
       
   258   c
       
   259   d
       
   260   e3
       
   261 
       
   262 Test that arguments get passed as expected.
       
   263 
       
   264   $ cat >> "$TESTTMP/log-args.sh" <<'EOF'
       
   265   > #!/bin/sh
       
   266   > echo "$@" > args.log
       
   267   > EOF
       
   268   $ chmod +x "$TESTTMP/log-args.sh"
       
   269   $ cat >> "$HGRCPATH" <<EOF
       
   270   > [partial-merge-tools]
       
   271   > log-args.executable=$TESTTMP/log-args.sh
       
   272   > EOF
       
   273   $ hg up -C 2
       
   274   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   275   $ hg merge 1
       
   276   merging file
       
   277   warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
       
   278   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
       
   279   use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
       
   280   [1]
       
   281   $ cat args.log
       
   282   */hgmerge-*/file~local */hgmerge-*/file~base */hgmerge-*/file~other (glob)
       
   283   $ hg up -C 2
       
   284   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   285   $ hg merge 1 --config partial-merge-tools.log-args.args='--other $other $base --foo --local $local --also-other $other'
       
   286   merging file
       
   287   warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
       
   288   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
       
   289   use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
       
   290   [1]
       
   291   $ cat args.log
       
   292   --other */hgmerge-*/file~other */hgmerge-*/file~base --foo --local */hgmerge-*/file~local --also-other */hgmerge-*/file~other (glob)