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