Mercurial > hg
comparison tests/test-merge-tools.t @ 35907:9037c29e9f53
filemerge: support passing labels to external merge tools
This adds $labellocal, $labelother, and $labelbase to the replacement set for
merge-tools.<tool>.args config variables, and to the environment as HG_MY_LABEL,
HG_OTHER_LABEL, and HG_BASE_LABEL, respectively.
We also add merge-tools.<tool>.mergemarkers and
merge-tools.<tool>.mergemarkertemplate config variables as counterparts of
the variables available in [ui]. We are intentionally *not* respecting
ui.mergemarkers when calling out to external merge programs; too often the
default template will be too wide to display comfortably in most GUIs.
Differential Revision: https://phab.mercurial-scm.org/D2011
author | Kyle Lippincott <spectral@google.com> |
---|---|
date | Wed, 17 Jan 2018 17:35:05 -0800 |
parents | 41ef02ba329b |
children | 07cd54eae696 |
comparison
equal
deleted
inserted
replaced
35906:cd2342302928 | 35907:9037c29e9f53 |
---|---|
1057 # hg stat | 1057 # hg stat |
1058 M f | 1058 M f |
1059 # hg resolve --list | 1059 # hg resolve --list |
1060 R f | 1060 R f |
1061 | 1061 |
1062 premerge=keep respects ui.mergemarkers=basic: | |
1063 | |
1064 $ beforemerge | |
1065 [merge-tools] | |
1066 false.whatever= | |
1067 true.priority=1 | |
1068 true.executable=cat | |
1069 # hg update -C 1 | |
1070 $ hg merge -r 4 --config merge-tools.true.premerge=keep --config ui.mergemarkers=basic | |
1071 merging f | |
1072 <<<<<<< working copy | |
1073 revision 1 | |
1074 space | |
1075 ======= | |
1076 revision 4 | |
1077 >>>>>>> merge rev | |
1078 revision 0 | |
1079 space | |
1080 revision 4 | |
1081 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
1082 (branch merge, don't forget to commit) | |
1083 $ aftermerge | |
1084 # cat f | |
1085 <<<<<<< working copy | |
1086 revision 1 | |
1087 space | |
1088 ======= | |
1089 revision 4 | |
1090 >>>>>>> merge rev | |
1091 # hg stat | |
1092 M f | |
1093 # hg resolve --list | |
1094 R f | |
1095 | |
1096 premerge=keep ignores ui.mergemarkers=basic if true.mergemarkers=detailed: | |
1097 | |
1098 $ beforemerge | |
1099 [merge-tools] | |
1100 false.whatever= | |
1101 true.priority=1 | |
1102 true.executable=cat | |
1103 # hg update -C 1 | |
1104 $ hg merge -r 4 --config merge-tools.true.premerge=keep \ | |
1105 > --config ui.mergemarkers=basic \ | |
1106 > --config merge-tools.true.mergemarkers=detailed | |
1107 merging f | |
1108 <<<<<<< working copy: ef83787e2614 - test: revision 1 | |
1109 revision 1 | |
1110 space | |
1111 ======= | |
1112 revision 4 | |
1113 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4 | |
1114 revision 0 | |
1115 space | |
1116 revision 4 | |
1117 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
1118 (branch merge, don't forget to commit) | |
1119 $ aftermerge | |
1120 # cat f | |
1121 <<<<<<< working copy: ef83787e2614 - test: revision 1 | |
1122 revision 1 | |
1123 space | |
1124 ======= | |
1125 revision 4 | |
1126 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4 | |
1127 # hg stat | |
1128 M f | |
1129 # hg resolve --list | |
1130 R f | |
1131 | |
1132 premerge=keep respects ui.mergemarkertemplate instead of | |
1133 true.mergemarkertemplate if true.mergemarkers=basic: | |
1134 | |
1135 $ beforemerge | |
1136 [merge-tools] | |
1137 false.whatever= | |
1138 true.priority=1 | |
1139 true.executable=cat | |
1140 # hg update -C 1 | |
1141 $ hg merge -r 4 --config merge-tools.true.premerge=keep \ | |
1142 > --config ui.mergemarkertemplate='uitmpl {rev}' \ | |
1143 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' | |
1144 merging f | |
1145 <<<<<<< working copy: uitmpl 1 | |
1146 revision 1 | |
1147 space | |
1148 ======= | |
1149 revision 4 | |
1150 >>>>>>> merge rev: uitmpl 4 | |
1151 revision 0 | |
1152 space | |
1153 revision 4 | |
1154 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
1155 (branch merge, don't forget to commit) | |
1156 $ aftermerge | |
1157 # cat f | |
1158 <<<<<<< working copy: uitmpl 1 | |
1159 revision 1 | |
1160 space | |
1161 ======= | |
1162 revision 4 | |
1163 >>>>>>> merge rev: uitmpl 4 | |
1164 # hg stat | |
1165 M f | |
1166 # hg resolve --list | |
1167 R f | |
1168 | |
1169 premerge=keep respects true.mergemarkertemplate instead of | |
1170 true.mergemarkertemplate if true.mergemarkers=detailed: | |
1171 | |
1172 $ beforemerge | |
1173 [merge-tools] | |
1174 false.whatever= | |
1175 true.priority=1 | |
1176 true.executable=cat | |
1177 # hg update -C 1 | |
1178 $ hg merge -r 4 --config merge-tools.true.premerge=keep \ | |
1179 > --config ui.mergemarkertemplate='uitmpl {rev}' \ | |
1180 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | |
1181 > --config merge-tools.true.mergemarkers=detailed | |
1182 merging f | |
1183 <<<<<<< working copy: tooltmpl ef83787e2614 | |
1184 revision 1 | |
1185 space | |
1186 ======= | |
1187 revision 4 | |
1188 >>>>>>> merge rev: tooltmpl 81448d39c9a0 | |
1189 revision 0 | |
1190 space | |
1191 revision 4 | |
1192 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
1193 (branch merge, don't forget to commit) | |
1194 $ aftermerge | |
1195 # cat f | |
1196 <<<<<<< working copy: tooltmpl ef83787e2614 | |
1197 revision 1 | |
1198 space | |
1199 ======= | |
1200 revision 4 | |
1201 >>>>>>> merge rev: tooltmpl 81448d39c9a0 | |
1202 # hg stat | |
1203 M f | |
1204 # hg resolve --list | |
1205 R f | |
1062 | 1206 |
1063 Tool execution | 1207 Tool execution |
1064 | 1208 |
1065 set tools.args explicit to include $base $local $other $output: | 1209 set tools.args explicit to include $base $local $other $output: |
1066 | 1210 |
1187 space | 1331 space |
1188 # hg stat | 1332 # hg stat |
1189 M f | 1333 M f |
1190 # hg resolve --list | 1334 # hg resolve --list |
1191 R f | 1335 R f |
1336 | |
1337 Merge using a tool that supports labellocal, labelother, and labelbase, checking | |
1338 that they're quoted properly as well. This is using the default 'basic' | |
1339 mergemarkers even though ui.mergemarkers is 'detailed', so it's ignoring both | |
1340 mergemarkertemplate settings: | |
1341 | |
1342 $ beforemerge | |
1343 [merge-tools] | |
1344 false.whatever= | |
1345 true.priority=1 | |
1346 true.executable=cat | |
1347 # hg update -C 1 | |
1348 $ cat <<EOF > printargs_merge_tool | |
1349 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done | |
1350 > EOF | |
1351 $ hg --config merge-tools.true.executable='sh' \ | |
1352 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \ | |
1353 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | |
1354 > --config ui.mergemarkertemplate='uitmpl {rev}' \ | |
1355 > --config ui.mergemarkers=detailed \ | |
1356 > merge -r 2 | |
1357 merging f | |
1358 arg: "ll:working copy" | |
1359 arg: "lo:" | |
1360 arg: "merge rev" | |
1361 arg: "lb:base: /tmp/f~base.*" (glob) | |
1362 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
1363 (branch merge, don't forget to commit) | |
1364 $ rm -f 'printargs_merge_tool' | |
1365 | |
1366 Merge using a tool that supports labellocal, labelother, and labelbase, checking | |
1367 that they're quoted properly as well. This is using 'detailed' mergemarkers, | |
1368 even though ui.mergemarkers is 'basic', and using the tool's | |
1369 mergemarkertemplate: | |
1370 | |
1371 $ beforemerge | |
1372 [merge-tools] | |
1373 false.whatever= | |
1374 true.priority=1 | |
1375 true.executable=cat | |
1376 # hg update -C 1 | |
1377 $ cat <<EOF > printargs_merge_tool | |
1378 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done | |
1379 > EOF | |
1380 $ hg --config merge-tools.true.executable='sh' \ | |
1381 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \ | |
1382 > --config merge-tools.true.mergemarkers=detailed \ | |
1383 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | |
1384 > --config ui.mergemarkertemplate='uitmpl {rev}' \ | |
1385 > --config ui.mergemarkers=basic \ | |
1386 > merge -r 2 | |
1387 merging f | |
1388 arg: "ll:working copy: tooltmpl ef83787e2614" | |
1389 arg: "lo:" | |
1390 arg: "merge rev: tooltmpl 0185f4e0cf02" | |
1391 arg: "lb:base: /tmp/f~base.*" (glob) | |
1392 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
1393 (branch merge, don't forget to commit) | |
1394 $ rm -f 'printargs_merge_tool' | |
1395 | |
1396 The merge tool still gets labellocal and labelother as 'basic' even when | |
1397 premerge=keep is used and has 'detailed' markers: | |
1398 | |
1399 $ beforemerge | |
1400 [merge-tools] | |
1401 false.whatever= | |
1402 true.priority=1 | |
1403 true.executable=cat | |
1404 # hg update -C 1 | |
1405 $ cat <<EOF > mytool | |
1406 > echo labellocal: \"\$1\" | |
1407 > echo labelother: \"\$2\" | |
1408 > echo "output (arg)": \"\$3\" | |
1409 > echo "output (contents)": | |
1410 > cat "\$3" | |
1411 > EOF | |
1412 $ hg --config merge-tools.true.executable='sh' \ | |
1413 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \ | |
1414 > --config merge-tools.true.premerge=keep \ | |
1415 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | |
1416 > --config ui.mergemarkertemplate='uitmpl {rev}' \ | |
1417 > --config ui.mergemarkers=detailed \ | |
1418 > merge -r 2 | |
1419 merging f | |
1420 labellocal: "working copy" | |
1421 labelother: "merge rev" | |
1422 output (arg): "$TESTTMP/f" | |
1423 output (contents): | |
1424 <<<<<<< working copy: uitmpl 1 | |
1425 revision 1 | |
1426 ======= | |
1427 revision 2 | |
1428 >>>>>>> merge rev: uitmpl 2 | |
1429 space | |
1430 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
1431 (branch merge, don't forget to commit) | |
1432 $ rm -f 'mytool' | |
1433 | |
1434 premerge=keep uses the *tool's* mergemarkertemplate if tool's | |
1435 mergemarkers=detailed; labellocal and labelother also use the tool's template | |
1436 | |
1437 $ beforemerge | |
1438 [merge-tools] | |
1439 false.whatever= | |
1440 true.priority=1 | |
1441 true.executable=cat | |
1442 # hg update -C 1 | |
1443 $ cat <<EOF > mytool | |
1444 > echo labellocal: \"\$1\" | |
1445 > echo labelother: \"\$2\" | |
1446 > echo "output (arg)": \"\$3\" | |
1447 > echo "output (contents)": | |
1448 > cat "\$3" | |
1449 > EOF | |
1450 $ hg --config merge-tools.true.executable='sh' \ | |
1451 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \ | |
1452 > --config merge-tools.true.premerge=keep \ | |
1453 > --config merge-tools.true.mergemarkers=detailed \ | |
1454 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | |
1455 > --config ui.mergemarkertemplate='uitmpl {rev}' \ | |
1456 > --config ui.mergemarkers=detailed \ | |
1457 > merge -r 2 | |
1458 merging f | |
1459 labellocal: "working copy: tooltmpl ef83787e2614" | |
1460 labelother: "merge rev: tooltmpl 0185f4e0cf02" | |
1461 output (arg): "$TESTTMP/f" | |
1462 output (contents): | |
1463 <<<<<<< working copy: tooltmpl ef83787e2614 | |
1464 revision 1 | |
1465 ======= | |
1466 revision 2 | |
1467 >>>>>>> merge rev: tooltmpl 0185f4e0cf02 | |
1468 space | |
1469 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
1470 (branch merge, don't forget to commit) | |
1471 $ rm -f 'mytool' | |
1192 | 1472 |
1193 Issue3581: Merging a filename that needs to be quoted | 1473 Issue3581: Merging a filename that needs to be quoted |
1194 (This test doesn't work on Windows filesystems even on Linux, so check | 1474 (This test doesn't work on Windows filesystems even on Linux, so check |
1195 for Unix-like permission) | 1475 for Unix-like permission) |
1196 | 1476 |