##// END OF EJS Templates
undo edit that was accident.
Vadim Gelfer -
r1881:4392ccef default
parent child Browse files
Show More
@@ -1,179 +1,177
1 #!/bin/sh
1 #!/bin/sh
2 #
2 #
3 # hgmerge - default merge helper for Mercurial
3 # hgmerge - default merge helper for Mercurial
4 #
4 #
5 # This tries to find a way to do three-way merge on the current system.
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.
6 # The result ought to end up in $1.
7
7
8 set -e # bail out quickly on failure
8 set -e # bail out quickly on failure
9
9
10 echo $1 $2 $3
11
12 LOCAL="$1"
10 LOCAL="$1"
13 BASE="$2"
11 BASE="$2"
14 OTHER="$3"
12 OTHER="$3"
15
13
16 if [ -z "$EDITOR" ]; then
14 if [ -z "$EDITOR" ]; then
17 EDITOR="vi"
15 EDITOR="vi"
18 fi
16 fi
19
17
20 # find decent versions of our utilities, insisting on the GNU versions where we
18 # find decent versions of our utilities, insisting on the GNU versions where we
21 # need to
19 # need to
22 MERGE="merge"
20 MERGE="merge"
23 DIFF3="gdiff3"
21 DIFF3="gdiff3"
24 DIFF="gdiff"
22 DIFF="gdiff"
25 PATCH="gpatch"
23 PATCH="gpatch"
26
24
27 type "$MERGE" >/dev/null 2>&1 || MERGE=
25 type "$MERGE" >/dev/null 2>&1 || MERGE=
28 type "$DIFF3" >/dev/null 2>&1 || DIFF3="diff3"
26 type "$DIFF3" >/dev/null 2>&1 || DIFF3="diff3"
29 $DIFF3 --version >/dev/null 2>&1 || DIFF3=
27 $DIFF3 --version >/dev/null 2>&1 || DIFF3=
30 type "$DIFF" >/dev/null 2>&1 || DIFF="diff"
28 type "$DIFF" >/dev/null 2>&1 || DIFF="diff"
31 type "$DIFF" >/dev/null 2>&1 || DIFF=
29 type "$DIFF" >/dev/null 2>&1 || DIFF=
32 type "$PATCH" >/dev/null 2>&1 || PATCH="patch"
30 type "$PATCH" >/dev/null 2>&1 || PATCH="patch"
33 type "$PATCH" >/dev/null 2>&1 || PATCH=
31 type "$PATCH" >/dev/null 2>&1 || PATCH=
34
32
35 # find optional visual utilities
33 # find optional visual utilities
36 FILEMERGE="/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge"
34 FILEMERGE="/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge"
37 KDIFF3="kdiff3"
35 KDIFF3="kdiff3"
38 TKDIFF="tkdiff"
36 TKDIFF="tkdiff"
39 MELD="meld"
37 MELD="meld"
40
38
41 type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE=
39 type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE=
42 type "$KDIFF3" >/dev/null 2>&1 || KDIFF3=
40 type "$KDIFF3" >/dev/null 2>&1 || KDIFF3=
43 type "$TKDIFF" >/dev/null 2>&1 || TKDIFF=
41 type "$TKDIFF" >/dev/null 2>&1 || TKDIFF=
44 type "$MELD" >/dev/null 2>&1 || MELD=
42 type "$MELD" >/dev/null 2>&1 || MELD=
45
43
46 # random part of names
44 # random part of names
47 RAND="$RANDOM$RANDOM"
45 RAND="$RANDOM$RANDOM"
48
46
49 # temporary directory for diff+patch merge
47 # temporary directory for diff+patch merge
50 HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND"
48 HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND"
51
49
52 # backup file
50 # backup file
53 BACKUP="$LOCAL.orig.$RAND"
51 BACKUP="$LOCAL.orig.$RAND"
54
52
55 # file used to test for file change
53 # file used to test for file change
56 CHGTEST="$LOCAL.chg.$RAND"
54 CHGTEST="$LOCAL.chg.$RAND"
57
55
58 # put all your required cleanup here
56 # put all your required cleanup here
59 cleanup() {
57 cleanup() {
60 rm -f "$BACKUP" "$CHGTEST"
58 rm -f "$BACKUP" "$CHGTEST"
61 rm -rf "$HGTMP"
59 rm -rf "$HGTMP"
62 }
60 }
63
61
64 # functions concerning program exit
62 # functions concerning program exit
65 success() {
63 success() {
66 cleanup
64 cleanup
67 exit 0
65 exit 0
68 }
66 }
69
67
70 failure() {
68 failure() {
71 echo "merge failed" 1>&2
69 echo "merge failed" 1>&2
72 mv "$BACKUP" "$LOCAL"
70 mv "$BACKUP" "$LOCAL"
73 cleanup
71 cleanup
74 exit 1
72 exit 1
75 }
73 }
76
74
77 # Ask if the merge was successful
75 # Ask if the merge was successful
78 ask_if_merged() {
76 ask_if_merged() {
79 while true; do
77 while true; do
80 echo "$LOCAL seems unchanged."
78 echo "$LOCAL seems unchanged."
81 echo "Was the merge successful? [y/n]"
79 echo "Was the merge successful? [y/n]"
82 read answer
80 read answer
83 case "$answer" in
81 case "$answer" in
84 y*|Y*) success;;
82 y*|Y*) success;;
85 n*|N*) failure;;
83 n*|N*) failure;;
86 esac
84 esac
87 done
85 done
88 }
86 }
89
87
90 # Clean up when interrupted
88 # Clean up when interrupted
91 trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
89 trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
92
90
93 # Back up our file (and try hard to keep the mtime unchanged)
91 # Back up our file (and try hard to keep the mtime unchanged)
94 mv "$LOCAL" "$BACKUP"
92 mv "$LOCAL" "$BACKUP"
95 cp "$BACKUP" "$LOCAL"
93 cp "$BACKUP" "$LOCAL"
96
94
97 # Attempt to do a non-interactive merge
95 # Attempt to do a non-interactive merge
98 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
96 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
99 if [ -n "$MERGE" ]; then
97 if [ -n "$MERGE" ]; then
100 $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success
98 $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success
101 elif [ -n "$DIFF3" ]; then
99 elif [ -n "$DIFF3" ]; then
102 $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success
100 $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success
103 fi
101 fi
104 if [ $? -gt 1 ]; then
102 if [ $? -gt 1 ]; then
105 echo "automatic merge failed! Exiting." 1>&2
103 echo "automatic merge failed! Exiting." 1>&2
106 failure
104 failure
107 fi
105 fi
108 fi
106 fi
109
107
110 # on MacOS X try FileMerge.app, shipped with Apple's developer tools
108 # on MacOS X try FileMerge.app, shipped with Apple's developer tools
111 if [ -n "$FILEMERGE" ]; then
109 if [ -n "$FILEMERGE" ]; then
112 cp "$BACKUP" "$LOCAL"
110 cp "$BACKUP" "$LOCAL"
113 cp "$BACKUP" "$CHGTEST"
111 cp "$BACKUP" "$CHGTEST"
114 # filemerge prefers the right by default
112 # filemerge prefers the right by default
115 $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL"
113 $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL"
116 [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure
114 [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure
117 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
115 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
118 fi
116 fi
119
117
120 if [ -n "$DISPLAY" ]; then
118 if [ -n "$DISPLAY" ]; then
121 # try using kdiff3, which is fairly nice
119 # try using kdiff3, which is fairly nice
122 if [ -n "$KDIFF3" ]; then
120 if [ -n "$KDIFF3" ]; then
123 $KDIFF3 --auto "$BASE" "$BACKUP" "$OTHER" -o "$LOCAL" || failure
121 $KDIFF3 --auto "$BASE" "$BACKUP" "$OTHER" -o "$LOCAL" || failure
124 success
122 success
125 fi
123 fi
126
124
127 # try using tkdiff, which is a bit less sophisticated
125 # try using tkdiff, which is a bit less sophisticated
128 if [ -n "$TKDIFF" ]; then
126 if [ -n "$TKDIFF" ]; then
129 $TKDIFF "$BACKUP" "$OTHER" -a "$BASE" -o "$LOCAL" || failure
127 $TKDIFF "$BACKUP" "$OTHER" -a "$BASE" -o "$LOCAL" || failure
130 success
128 success
131 fi
129 fi
132
130
133 if [ -n "$MELD" ]; then
131 if [ -n "$MELD" ]; then
134 cp "$BACKUP" "$CHGTEST"
132 cp "$BACKUP" "$CHGTEST"
135 # protect our feet - meld allows us to save to the left file
133 # protect our feet - meld allows us to save to the left file
136 cp "$BACKUP" "$LOCAL.tmp.$RAND"
134 cp "$BACKUP" "$LOCAL.tmp.$RAND"
137 # Meld doesn't have automatic merging, so to reduce intervention
135 # Meld doesn't have automatic merging, so to reduce intervention
138 # use the file with conflicts
136 # use the file with conflicts
139 $MELD "$LOCAL.tmp.$RAND" "$LOCAL" "$OTHER" || failure
137 $MELD "$LOCAL.tmp.$RAND" "$LOCAL" "$OTHER" || failure
140 # Also it doesn't return good error code
138 # Also it doesn't return good error code
141 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
139 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
142 fi
140 fi
143 fi
141 fi
144
142
145 # Attempt to do a merge with $EDITOR
143 # Attempt to do a merge with $EDITOR
146 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
144 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
147 echo "conflicts detected in $LOCAL"
145 echo "conflicts detected in $LOCAL"
148 cp "$BACKUP" "$CHGTEST"
146 cp "$BACKUP" "$CHGTEST"
149 $EDITOR "$LOCAL" || failure
147 $EDITOR "$LOCAL" || failure
150 # Some editors do not return meaningful error codes
148 # Some editors do not return meaningful error codes
151 # Do not take any chances
149 # Do not take any chances
152 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
150 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
153 fi
151 fi
154
152
155 # attempt to manually merge with diff and patch
153 # attempt to manually merge with diff and patch
156 if [ -n "$DIFF" -a -n "$PATCH" ]; then
154 if [ -n "$DIFF" -a -n "$PATCH" ]; then
157
155
158 (umask 077 && mkdir "$HGTMP") || {
156 (umask 077 && mkdir "$HGTMP") || {
159 echo "Could not create temporary directory $HGTMP" 1>&2
157 echo "Could not create temporary directory $HGTMP" 1>&2
160 failure
158 failure
161 }
159 }
162
160
163 $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || :
161 $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || :
164 if $PATCH "$LOCAL" < "$HGTMP/diff"; then
162 if $PATCH "$LOCAL" < "$HGTMP/diff"; then
165 success
163 success
166 else
164 else
167 # If rejects are empty after using the editor, merge was ok
165 # If rejects are empty after using the editor, merge was ok
168 $EDITOR "$LOCAL" "$LOCAL.rej" || failure
166 $EDITOR "$LOCAL" "$LOCAL.rej" || failure
169 test -s "$LOCAL.rej" || success
167 test -s "$LOCAL.rej" || success
170 fi
168 fi
171 failure
169 failure
172 fi
170 fi
173
171
174 echo
172 echo
175 echo "hgmerge: unable to find any merge utility!"
173 echo "hgmerge: unable to find any merge utility!"
176 echo "supported programs:"
174 echo "supported programs:"
177 echo "merge, FileMerge, tkdiff, kdiff3, meld, diff+patch"
175 echo "merge, FileMerge, tkdiff, kdiff3, meld, diff+patch"
178 echo
176 echo
179 failure
177 failure
General Comments 0
You need to be logged in to leave comments. Login now