tests/test-graft.t
changeset 30192 509d29255c04
parent 30188 8a864844d5a0
child 30197 0accd5a5ad04
equal deleted inserted replaced
30188:8a864844d5a0 30192:509d29255c04
   840   |/
   840   |/
   841   | o  1
   841   | o  1
   842   |/
   842   |/
   843   o  0
   843   o  0
   844   
   844   
       
   845 Graft from behind a move or rename
       
   846 ==================================
       
   847 
       
   848 NOTE: This is affected by issue5343, and will need updating when it's fixed
       
   849 
       
   850 Possible cases during a regular graft (when ca is between cta and c2):
       
   851 
       
   852 name | c1<-cta | cta<->ca | ca->c2
       
   853 A.0  |         |          |
       
   854 A.1  |    X    |          |
       
   855 A.2  |         |     X    |
       
   856 A.3  |         |          |   X
       
   857 A.4  |    X    |     X    |
       
   858 A.5  |    X    |          |   X
       
   859 A.6  |         |     X    |   X
       
   860 A.7  |    X    |     X    |   X
       
   861 
       
   862 A.0 is trivial, and doesn't need copy tracking.
       
   863 For A.1, a forward rename is recorded in the c1 pass, to be followed later.
       
   864 In A.2, the rename is recorded in the c2 pass and followed backwards.
       
   865 A.3 is recorded in the c2 pass as a forward rename to be duplicated on target.
       
   866 In A.4, both passes of checkcopies record incomplete renames, which are
       
   867 then joined in mergecopies to record a rename to be followed.
       
   868 In A.5 and A.7, the c1 pass records an incomplete rename, while the c2 pass
       
   869 records an incomplete divergence. The incomplete rename is then joined to the
       
   870 appropriate side of the incomplete divergence, and the result is recorded as a
       
   871 divergence. The code doesn't distinguish at all between these two cases, since
       
   872 the end result of them is the same: an incomplete divergence joined with an
       
   873 incomplete rename into a divergence.
       
   874 Finally, A.6 records a divergence entirely in the c2 pass.
       
   875 
       
   876 A.4 has a degenerate case a<-b<-a->a, where checkcopies isn't needed at all.
       
   877 A.5 has a special case a<-b<-b->a, which is treated like a<-b->a in a merge.
       
   878 A.6 has a special case a<-a<-b->a. Here, checkcopies will find a spurious
       
   879 incomplete divergence, which is in fact complete. This is handled later in
       
   880 mergecopies.
       
   881 A.7 has 4 special cases: a<-b<-a->b (the "ping-pong" case), a<-b<-c->b,
       
   882 a<-b<-a->c and a<-b<-c->a. Of these, only the "ping-pong" case is interesting,
       
   883 the others are fairly trivial (a<-b<-c->b and a<-b<-a->c proceed like the base
       
   884 case, a<-b<-c->a is treated the same as a<-b<-b->a).
       
   885 
       
   886 f5a therefore tests the "ping-pong" rename case, where a file is renamed to the
       
   887 same name on both branches, then the rename is backed out on one branch, and
       
   888 the backout is grafted to the other branch. This creates a challenging rename
       
   889 sequence of a<-b<-a->b in the graft target, topological CA, graft CA and graft
       
   890 source, respectively. Since rename detection will run on the c1 side for such a
       
   891 sequence (as for technical reasons, we split the c1 and c2 sides not at the
       
   892 graft CA, but rather at the topological CA), it will pick up a false rename,
       
   893 and cause a spurious merge conflict. This false rename is always exactly the
       
   894 reverse of the true rename that would be detected on the c2 side, so we can
       
   895 correct for it by detecting this condition and reversing as necessary.
       
   896 
       
   897 First, set up the repository with commits to be grafted
       
   898 
       
   899   $ hg init ../graftmove
       
   900   $ cd ../graftmove
       
   901   $ echo c1a > f1a
       
   902   $ echo c2a > f2a
       
   903   $ echo c3a > f3a
       
   904   $ echo c4a > f4a
       
   905   $ echo c5a > f5a
       
   906   $ hg ci -qAm A0
       
   907   $ hg mv f1a f1b
       
   908   $ hg mv f3a f3b
       
   909   $ hg mv f5a f5b
       
   910   $ hg ci -qAm B0
       
   911   $ echo c1c > f1b
       
   912   $ hg mv f2a f2c
       
   913   $ hg mv f5b f5a
       
   914   $ echo c5c > f5a
       
   915   $ hg ci -qAm C0
       
   916   $ hg mv f3b f3d
       
   917   $ echo c4d > f4a
       
   918   $ hg ci -qAm D0
       
   919   $ hg log -G
       
   920   @  changeset:   3:b69f5839d2d9
       
   921   |  tag:         tip
       
   922   |  user:        test
       
   923   |  date:        Thu Jan 01 00:00:00 1970 +0000
       
   924   |  summary:     D0
       
   925   |
       
   926   o  changeset:   2:f58c7e2b28fa
       
   927   |  user:        test
       
   928   |  date:        Thu Jan 01 00:00:00 1970 +0000
       
   929   |  summary:     C0
       
   930   |
       
   931   o  changeset:   1:3d7bba921b5d
       
   932   |  user:        test
       
   933   |  date:        Thu Jan 01 00:00:00 1970 +0000
       
   934   |  summary:     B0
       
   935   |
       
   936   o  changeset:   0:11f7a1b56675
       
   937      user:        test
       
   938      date:        Thu Jan 01 00:00:00 1970 +0000
       
   939      summary:     A0
       
   940   
       
   941 
       
   942 Test the cases A.2 (f1x), A.3 (f2x) and a special case of A.6 (f5x) where the
       
   943 two renames actually converge to the same name (thus no actual divergence).
       
   944 
       
   945   $ hg up -q 'desc("A0")'
       
   946   $ HGEDITOR="echo C1 >" hg graft -r 'desc("C0")' --edit
       
   947   grafting 2:f58c7e2b28fa "C0"
       
   948   merging f5a
       
   949   warning: conflicts while merging f5a! (edit, then use 'hg resolve --mark')
       
   950   abort: unresolved conflicts, can't continue
       
   951   (use 'hg resolve' and 'hg graft --continue')
       
   952   [255]
       
   953   $ hg resolve f5a -t ':other' # XXX work around failure
       
   954   (no more unresolved files)
       
   955   continue: hg graft --continue
       
   956   $ hg graft --continue # XXX work around failure
       
   957   grafting 2:f58c7e2b28fa "C0"
       
   958   warning: can't find ancestor for 'f5a' copied from 'f5b'!
       
   959   $ hg status --change .
       
   960   M f5a
       
   961   A f1b
       
   962   A f2c
       
   963   R f2a
       
   964   $ hg cat f1a
       
   965   c1a
       
   966   $ hg cat f1b
       
   967   c1c
       
   968 
       
   969 Test the cases A.0 (f4x) and A.6 (f3x)
       
   970 
       
   971   $ HGEDITOR="echo D1 >" hg graft -r 'desc("D0")' --edit
       
   972   grafting 3:b69f5839d2d9 "D0"
       
   973   warning: can't find ancestor for 'f3d' copied from 'f3b'!
       
   974 
       
   975 Set up the repository for some further tests
       
   976 
       
   977   $ hg up -q "min(desc("A0"))"
       
   978   $ hg mv f1a f1e
       
   979   $ echo c2e > f2a
       
   980   $ hg mv f3a f3e
       
   981   $ hg mv f4a f4e
       
   982   $ hg mv f5a f5b
       
   983   $ hg ci -qAm "E0"
       
   984   $ hg log -G
       
   985   @  changeset:   6:ebba59d1fb02
       
   986   |  tag:         tip
       
   987   |  parent:      0:11f7a1b56675
       
   988   |  user:        test
       
   989   |  date:        Thu Jan 01 00:00:00 1970 +0000
       
   990   |  summary:     E0
       
   991   |
       
   992   | o  changeset:   5:573bb6b4b56d
       
   993   | |  user:        test
       
   994   | |  date:        Thu Jan 01 00:00:00 1970 +0000
       
   995   | |  summary:     D1
       
   996   | |
       
   997   | o  changeset:   4:af23416e619b
       
   998   |/   parent:      0:11f7a1b56675
       
   999   |    user:        test
       
  1000   |    date:        Thu Jan 01 00:00:00 1970 +0000
       
  1001   |    summary:     C0
       
  1002   |
       
  1003   | o  changeset:   3:b69f5839d2d9
       
  1004   | |  user:        test
       
  1005   | |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1006   | |  summary:     D0
       
  1007   | |
       
  1008   | o  changeset:   2:f58c7e2b28fa
       
  1009   | |  user:        test
       
  1010   | |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1011   | |  summary:     C0
       
  1012   | |
       
  1013   | o  changeset:   1:3d7bba921b5d
       
  1014   |/   user:        test
       
  1015   |    date:        Thu Jan 01 00:00:00 1970 +0000
       
  1016   |    summary:     B0
       
  1017   |
       
  1018   o  changeset:   0:11f7a1b56675
       
  1019      user:        test
       
  1020      date:        Thu Jan 01 00:00:00 1970 +0000
       
  1021      summary:     A0
       
  1022   
       
  1023 
       
  1024 Test the cases A.4 (f1x), the "ping-pong" special case of A.7 (f5x),
       
  1025 and A.3 with a local content change to be preserved (f2x).
       
  1026 
       
  1027   $ HGEDITOR="echo C2 >" hg graft -r 'desc("C0")' --edit
       
  1028   grafting 2:f58c7e2b28fa "C0"
       
  1029   other [graft] changed f1b which local [local] deleted
       
  1030   use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
       
  1031   merging f2a and f2c to f2c
       
  1032   abort: unresolved conflicts, can't continue
       
  1033   (use 'hg resolve' and 'hg graft --continue')
       
  1034   [255]
       
  1035   $ hg resolve f1b -t ':other' # XXX work around failure
       
  1036   (no more unresolved files)
       
  1037   continue: hg graft --continue
       
  1038   $ hg graft --continue # XXX work around failure
       
  1039   grafting 2:f58c7e2b28fa "C0"
       
  1040   grafting 4:af23416e619b "C0"
       
  1041   merging f2c
       
  1042   warning: can't find ancestor for 'f2c' copied from 'f2a'!
       
  1043 
       
  1044 Test the cases A.1 (f4x) and A.7 (f3x).
       
  1045 
       
  1046   $ HGEDITOR="echo D2 >" hg graft -r 'desc("D0")' --edit
       
  1047   grafting 3:b69f5839d2d9 "D0"
       
  1048   merging f4e and f4a to f4e
       
  1049   warning: can't find ancestor for 'f3d' copied from 'f3b'!
       
  1050 
       
  1051 Check the results of the grafts tested
       
  1052 
       
  1053   $ hg log -CGv --patch --git
       
  1054   @  changeset:   9:6d76b84e6e84
       
  1055   |  tag:         tip
       
  1056   |  user:        test
       
  1057   |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1058   |  files:       f3d f4e
       
  1059   |  description:
       
  1060   |  D2
       
  1061   |
       
  1062   |
       
  1063   |  diff --git a/f3d b/f3d
       
  1064   |  new file mode 100644
       
  1065   |  --- /dev/null
       
  1066   |  +++ b/f3d
       
  1067   |  @@ -0,0 +1,1 @@
       
  1068   |  +c3a
       
  1069   |  diff --git a/f4e b/f4e
       
  1070   |  --- a/f4e
       
  1071   |  +++ b/f4e
       
  1072   |  @@ -1,1 +1,1 @@
       
  1073   |  -c4a
       
  1074   |  +c4d
       
  1075   |
       
  1076   o  changeset:   8:3079ba7d03f0
       
  1077   |  user:        test
       
  1078   |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1079   |  description:
       
  1080   |  C0
       
  1081   |
       
  1082   |
       
  1083   |
       
  1084   o  changeset:   7:dc778749ee9a
       
  1085   |  user:        test
       
  1086   |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1087   |  files:       f1b f2a f2c f5a f5b
       
  1088   |  copies:      f2c (f2a) f5a (f5b)
       
  1089   |  description:
       
  1090   |  C0
       
  1091   |
       
  1092   |
       
  1093   |  diff --git a/f1b b/f1b
       
  1094   |  new file mode 100644
       
  1095   |  --- /dev/null
       
  1096   |  +++ b/f1b
       
  1097   |  @@ -0,0 +1,1 @@
       
  1098   |  +c1c
       
  1099   |  diff --git a/f2a b/f2c
       
  1100   |  rename from f2a
       
  1101   |  rename to f2c
       
  1102   |  diff --git a/f5b b/f5a
       
  1103   |  rename from f5b
       
  1104   |  rename to f5a
       
  1105   |  --- a/f5b
       
  1106   |  +++ b/f5a
       
  1107   |  @@ -1,1 +1,1 @@
       
  1108   |  -c5a
       
  1109   |  +c5c
       
  1110   |
       
  1111   o  changeset:   6:ebba59d1fb02
       
  1112   |  parent:      0:11f7a1b56675
       
  1113   |  user:        test
       
  1114   |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1115   |  files:       f1a f1e f2a f3a f3e f4a f4e f5a f5a.orig f5b
       
  1116   |  copies:      f1e (f1a) f3e (f3a) f4e (f4a) f5b (f5a)
       
  1117   |  description:
       
  1118   |  E0
       
  1119   |
       
  1120   |
       
  1121   |  diff --git a/f1a b/f1e
       
  1122   |  rename from f1a
       
  1123   |  rename to f1e
       
  1124   |  diff --git a/f2a b/f2a
       
  1125   |  --- a/f2a
       
  1126   |  +++ b/f2a
       
  1127   |  @@ -1,1 +1,1 @@
       
  1128   |  -c2a
       
  1129   |  +c2e
       
  1130   |  diff --git a/f3a b/f3e
       
  1131   |  rename from f3a
       
  1132   |  rename to f3e
       
  1133   |  diff --git a/f4a b/f4e
       
  1134   |  rename from f4a
       
  1135   |  rename to f4e
       
  1136   |  diff --git a/f5a.orig b/f5a.orig
       
  1137   |  new file mode 100644
       
  1138   |  --- /dev/null
       
  1139   |  +++ b/f5a.orig
       
  1140   |  @@ -0,0 +1,5 @@
       
  1141   |  +<<<<<<< local: 11f7a1b56675  - test: A0
       
  1142   |  +c5a
       
  1143   |  +=======
       
  1144   |  +c5c
       
  1145   |  +>>>>>>> graft: f58c7e2b28fa  - test: C0
       
  1146   |  diff --git a/f5a b/f5b
       
  1147   |  rename from f5a
       
  1148   |  rename to f5b
       
  1149   |
       
  1150   | o  changeset:   5:573bb6b4b56d
       
  1151   | |  user:        test
       
  1152   | |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1153   | |  files:       f3d f4a
       
  1154   | |  description:
       
  1155   | |  D1
       
  1156   | |
       
  1157   | |
       
  1158   | |  diff --git a/f3d b/f3d
       
  1159   | |  new file mode 100644
       
  1160   | |  --- /dev/null
       
  1161   | |  +++ b/f3d
       
  1162   | |  @@ -0,0 +1,1 @@
       
  1163   | |  +c3a
       
  1164   | |  diff --git a/f4a b/f4a
       
  1165   | |  --- a/f4a
       
  1166   | |  +++ b/f4a
       
  1167   | |  @@ -1,1 +1,1 @@
       
  1168   | |  -c4a
       
  1169   | |  +c4d
       
  1170   | |
       
  1171   | o  changeset:   4:af23416e619b
       
  1172   |/   parent:      0:11f7a1b56675
       
  1173   |    user:        test
       
  1174   |    date:        Thu Jan 01 00:00:00 1970 +0000
       
  1175   |    files:       f1b f2a f2c f5a
       
  1176   |    copies:      f2c (f2a)
       
  1177   |    description:
       
  1178   |    C0
       
  1179   |
       
  1180   |
       
  1181   |    diff --git a/f1b b/f1b
       
  1182   |    new file mode 100644
       
  1183   |    --- /dev/null
       
  1184   |    +++ b/f1b
       
  1185   |    @@ -0,0 +1,1 @@
       
  1186   |    +c1c
       
  1187   |    diff --git a/f2a b/f2c
       
  1188   |    rename from f2a
       
  1189   |    rename to f2c
       
  1190   |    diff --git a/f5a b/f5a
       
  1191   |    --- a/f5a
       
  1192   |    +++ b/f5a
       
  1193   |    @@ -1,1 +1,1 @@
       
  1194   |    -c5a
       
  1195   |    +c5c
       
  1196   |
       
  1197   | o  changeset:   3:b69f5839d2d9
       
  1198   | |  user:        test
       
  1199   | |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1200   | |  files:       f3b f3d f4a
       
  1201   | |  copies:      f3d (f3b)
       
  1202   | |  description:
       
  1203   | |  D0
       
  1204   | |
       
  1205   | |
       
  1206   | |  diff --git a/f3b b/f3d
       
  1207   | |  rename from f3b
       
  1208   | |  rename to f3d
       
  1209   | |  diff --git a/f4a b/f4a
       
  1210   | |  --- a/f4a
       
  1211   | |  +++ b/f4a
       
  1212   | |  @@ -1,1 +1,1 @@
       
  1213   | |  -c4a
       
  1214   | |  +c4d
       
  1215   | |
       
  1216   | o  changeset:   2:f58c7e2b28fa
       
  1217   | |  user:        test
       
  1218   | |  date:        Thu Jan 01 00:00:00 1970 +0000
       
  1219   | |  files:       f1b f2a f2c f5a f5b
       
  1220   | |  copies:      f2c (f2a) f5a (f5b)
       
  1221   | |  description:
       
  1222   | |  C0
       
  1223   | |
       
  1224   | |
       
  1225   | |  diff --git a/f1b b/f1b
       
  1226   | |  --- a/f1b
       
  1227   | |  +++ b/f1b
       
  1228   | |  @@ -1,1 +1,1 @@
       
  1229   | |  -c1a
       
  1230   | |  +c1c
       
  1231   | |  diff --git a/f2a b/f2c
       
  1232   | |  rename from f2a
       
  1233   | |  rename to f2c
       
  1234   | |  diff --git a/f5b b/f5a
       
  1235   | |  rename from f5b
       
  1236   | |  rename to f5a
       
  1237   | |  --- a/f5b
       
  1238   | |  +++ b/f5a
       
  1239   | |  @@ -1,1 +1,1 @@
       
  1240   | |  -c5a
       
  1241   | |  +c5c
       
  1242   | |
       
  1243   | o  changeset:   1:3d7bba921b5d
       
  1244   |/   user:        test
       
  1245   |    date:        Thu Jan 01 00:00:00 1970 +0000
       
  1246   |    files:       f1a f1b f3a f3b f5a f5b
       
  1247   |    copies:      f1b (f1a) f3b (f3a) f5b (f5a)
       
  1248   |    description:
       
  1249   |    B0
       
  1250   |
       
  1251   |
       
  1252   |    diff --git a/f1a b/f1b
       
  1253   |    rename from f1a
       
  1254   |    rename to f1b
       
  1255   |    diff --git a/f3a b/f3b
       
  1256   |    rename from f3a
       
  1257   |    rename to f3b
       
  1258   |    diff --git a/f5a b/f5b
       
  1259   |    rename from f5a
       
  1260   |    rename to f5b
       
  1261   |
       
  1262   o  changeset:   0:11f7a1b56675
       
  1263      user:        test
       
  1264      date:        Thu Jan 01 00:00:00 1970 +0000
       
  1265      files:       f1a f2a f3a f4a f5a
       
  1266      description:
       
  1267      A0
       
  1268   
       
  1269   
       
  1270      diff --git a/f1a b/f1a
       
  1271      new file mode 100644
       
  1272      --- /dev/null
       
  1273      +++ b/f1a
       
  1274      @@ -0,0 +1,1 @@
       
  1275      +c1a
       
  1276      diff --git a/f2a b/f2a
       
  1277      new file mode 100644
       
  1278      --- /dev/null
       
  1279      +++ b/f2a
       
  1280      @@ -0,0 +1,1 @@
       
  1281      +c2a
       
  1282      diff --git a/f3a b/f3a
       
  1283      new file mode 100644
       
  1284      --- /dev/null
       
  1285      +++ b/f3a
       
  1286      @@ -0,0 +1,1 @@
       
  1287      +c3a
       
  1288      diff --git a/f4a b/f4a
       
  1289      new file mode 100644
       
  1290      --- /dev/null
       
  1291      +++ b/f4a
       
  1292      @@ -0,0 +1,1 @@
       
  1293      +c4a
       
  1294      diff --git a/f5a b/f5a
       
  1295      new file mode 100644
       
  1296      --- /dev/null
       
  1297      +++ b/f5a
       
  1298      @@ -0,0 +1,1 @@
       
  1299      +c5a
       
  1300   
       
  1301   $ hg cat f2c
       
  1302   c2e