Mercurial > hg
annotate hgmerge @ 1254:e6560042b7b8
Switch cat command to use walk code.
The old syntax of "hg cat FILE REV" is now obsolete.
Use "hg cat -r REV FILE" instead, as for all other commands.
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Wed, 14 Sep 2005 21:57:41 -0700 |
parents | 9c918287d10b |
children | 696851b1bba9 |
rev | line source |
---|---|
544
3d4d5f2aba9a
Remove bashisms and use /bin/sh instead of /bin/bash.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
306
diff
changeset
|
1 #!/bin/sh |
240 | 2 # |
3 # hgmerge - default merge helper for Mercurial | |
4 # | |
5 # This tries to find a way to do three-way merge on the current system. | |
6 # The result ought to end up in $1. | |
7 | |
8 set -e # bail out quickly on failure | |
9 | |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
10 LOCAL="$1" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
11 BASE="$2" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
12 OTHER="$3" |
240 | 13 |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
14 if [ -z "$EDITOR" ]; then |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
15 EDITOR="vi" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
16 fi |
304
38fb7d23b78d
Use vi if $EDITOR is unset.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
303
diff
changeset
|
17 |
240 | 18 # Back up our file |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
19 cp "$LOCAL" "$LOCAL.orig" |
240 | 20 |
21 # Attempt to do a non-interactive merge | |
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
22 if type merge > /dev/null 2>&1; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
23 merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && exit 0 |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
24 cp "$LOCAL.orig" "$LOCAL" |
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
25 elif type diff3 > /dev/null 2>&1; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
26 diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" && exit 0 |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
27 cp "$LOCAL.orig" "$LOCAL" |
240 | 28 fi |
29 | |
303
15a9e55e7ea5
Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
30 if [ -n "$DISPLAY" ]; then |
15a9e55e7ea5
Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
31 # try using kdiff3, which is fairly nice |
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
32 if type kdiff3 > /dev/null 2>&1; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
33 kdiff3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || exit 1 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
34 exit 0 |
240 | 35 fi |
36 | |
303
15a9e55e7ea5
Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
37 # try using tkdiff, which is a bit less sophisticated |
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
38 if type tkdiff > /dev/null 2>&1; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
39 tkdiff "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || exit 1 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
40 exit 0 |
240 | 41 fi |
42 fi | |
43 | |
44 # Attempt to do a merge with $EDITOR | |
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
45 if type merge > /dev/null 2>&1; then |
240 | 46 echo "conflicts detected in $LOCAL" |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
47 merge "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL" |
242 | 48 exit 0 |
49 fi | |
50 | |
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
51 if type diff3 > /dev/null 2>&1; then |
242 | 52 echo "conflicts detected in $LOCAL" |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
53 diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" || $EDITOR "$LOCAL" |
242 | 54 exit 0 |
240 | 55 fi |
56 | |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
57 HGTMP="" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
58 cleanup_exit() { |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
59 rm -rf "$HGTMP" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
60 } |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
61 |
240 | 62 # attempt to manually merge with diff and patch |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
63 if type diff > /dev/null 2>&1 && type patch > /dev/null 2>&1; then |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
64 # Remove temporary files even if we get interrupted |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
65 trap "cleanup_exit" 0 # normal exit |
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
66 trap "exit 1" 1 2 3 6 15 # HUP INT QUIT ABRT TERM |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
67 |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
68 HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$" |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
69 (umask 077 && mkdir "$HGTMP") || { |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
70 echo "Could not create temporary directory! Exiting." 1>&2 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
71 exit 1 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
72 } |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
73 |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
74 diff -u "$BASE" "$OTHER" > "$HGTMP/diff" |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
75 if patch "$LOCAL" < "$HGTMP/diff"; then |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
76 exit 0 |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
77 else |
830
ca080d28d0af
If rejects are empty after using the editor, merge with diff+patch was ok.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
829
diff
changeset
|
78 # If rejects are empty after using the editor, merge was ok |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
79 $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || exit 0 |
240 | 80 fi |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
81 exit 1 |
240 | 82 fi |
83 | |
84 echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" | |
85 exit 1 |