comparison hgmerge @ 1783:35a05f177267

merge with matt
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Wed, 22 Feb 2006 05:21:09 +0100
parents ac7b91bcbd8d
children 42f75cd04bf4
comparison
equal deleted inserted replaced
1782:b9671b41e360 1783:35a05f177267
15 EDITOR="vi" 15 EDITOR="vi"
16 fi 16 fi
17 17
18 # 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
19 # need to 19 # need to
20 MERGE=merge 20 MERGE="merge"
21 DIFF3=gdiff3 21 DIFF3="gdiff3"
22 DIFF=gdiff 22 DIFF="gdiff"
23 PATCH=gpatch 23 PATCH="gpatch"
24 24
25 type $MERGE >/dev/null 2>&1 || MERGE= 25 type "$MERGE" >/dev/null 2>&1 || MERGE=
26 type $DIFF3 >/dev/null 2>&1 || DIFF3=diff3 26 type "$DIFF3" >/dev/null 2>&1 || DIFF3="diff3"
27 type $DIFF >/dev/null 2>&1 || DIFF=diff
28 type $PATCH >/dev/null 2>&1 || PATCH=patch
29 $DIFF3 --version >/dev/null 2>&1 || DIFF3= 27 $DIFF3 --version >/dev/null 2>&1 || DIFF3=
28 type "$DIFF" >/dev/null 2>&1 || DIFF="diff"
29 type "$DIFF" >/dev/null 2>&1 || DIFF=
30 type "$PATCH" >/dev/null 2>&1 || PATCH="patch"
31 type "$PATCH" >/dev/null 2>&1 || PATCH=
30 32
31 # find optional visual utilities 33 # find optional visual utilities
32 FILEMERGE='/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge' 34 FILEMERGE="/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge"
33 KDIFF3=kdiff3 35 KDIFF3="kdiff3"
34 TKDIFF=tkdiff 36 TKDIFF="tkdiff"
37 MELD="meld"
35 38
36 type $FILEMERGE >/dev/null 2>&1 || FILEMERGE= 39 type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE=
37 type $KDIFF3 >/dev/null 2>&1 || KDIFF3= 40 type "$KDIFF3" >/dev/null 2>&1 || KDIFF3=
38 type $TKDIFF >/dev/null 2>&1 || TKDIFF= 41 type "$TKDIFF" >/dev/null 2>&1 || TKDIFF=
42 type "$MELD" >/dev/null 2>&1 || MELD=
39 43
40 # random part of names 44 # random part of names
41 RAND="$RANDOM.$RANDOM.$RANDOM.$$" 45 RAND="$RANDOM$RANDOM"
42 46
43 # temporary directory for diff+patch merge 47 # temporary directory for diff+patch merge
44 HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND" 48 HGTMP="${TMPDIR-'/tmp'}/hgmerge.$RAND"
45 49
46 # backup file 50 # backup file
47 BACKUP="$LOCAL.orig.$RAND" 51 BACKUP="$LOCAL.orig.$RAND"
48 52
49 # file used to test for file change 53 # file used to test for file change
66 mv "$BACKUP" "$LOCAL" 70 mv "$BACKUP" "$LOCAL"
67 cleanup 71 cleanup
68 exit 1 72 exit 1
69 } 73 }
70 74
75 # Ask if the merge was successful
76 ask_if_merged() {
77 while 1; do
78 echo "$LOCAL seems unchanged. Was the merge successful? [y/n]"
79 read answer
80 case answer in
81 y*|Y*) success;;
82 n*|N*) failure;;
83 esac
84 done
85 }
86
71 # Clean up when interrupted 87 # Clean up when interrupted
72 trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM 88 trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
73 89
74 # Back up our file (and try hard to keep the mtime unchanged) 90 # Back up our file (and try hard to keep the mtime unchanged)
75 mv "$LOCAL" "$BACKUP" 91 mv "$LOCAL" "$BACKUP"
76 cp "$BACKUP" "$LOCAL" 92 cp "$BACKUP" "$LOCAL"
77 93
78 # Attempt to do a non-interactive merge 94 # Attempt to do a non-interactive merge
79 if [ -n "$MERGE" ]; then 95 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
80 $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success 96 if [ -n "$MERGE" ]; then
81 cp "$BACKUP" "$LOCAL" 97 $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success
82 elif [ -n "$DIFF3" ]; then 98 elif [ -n "$DIFF3" ]; then
83 echo $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" 99 $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success
84 $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success 100 fi
85 if [ $? -eq 2 ]; then 101 if [ $? -gt 1 ]; then
86 echo "$DIFF3 failed! Exiting." 1>&2 102 echo "automatic merge failed! Exiting." 1>&2
87 cp "$BACKUP" "$LOCAL"
88 failure 103 failure
89 fi 104 fi
90 cp "$BACKUP" "$LOCAL"
91 fi 105 fi
92 106
93 # on MacOS X try FileMerge.app, shipped with Apple's developer tools 107 # on MacOS X try FileMerge.app, shipped with Apple's developer tools
94 if [ -n "$FILEMERGE" ]; then 108 if [ -n "$FILEMERGE" ]; then
95 cp "$BACKUP" "$LOCAL" 109 cp "$BACKUP" "$LOCAL"
96 cp "$BACKUP" "$CHGTEST" 110 cp "$BACKUP" "$CHGTEST"
97 # filemerge prefers the right by default 111 # filemerge prefers the right by default
98 $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL" 112 $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL"
99 [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure 113 [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure
100 if test "$LOCAL" -nt "$CHGTEST" 114 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
101 then
102 success
103 else
104 echo "$LOCAL seems unchanged. Was the merge successful?"
105 select answer in yes no
106 do
107 test "$answer" == "yes" && success || failure
108 done
109 fi
110 failure
111 fi 115 fi
112 116
113 if [ -n "$DISPLAY" ]; then 117 if [ -n "$DISPLAY" ]; then
114 # try using kdiff3, which is fairly nice 118 # try using kdiff3, which is fairly nice
115 if [ -n "$KDIFF3" ]; then 119 if [ -n "$KDIFF3" ]; then
116 $KDIFF3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || failure 120 $KDIFF3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || failure
117 success 121 success
118 fi 122 fi
119 123
120 # try using tkdiff, which is a bit less sophisticated 124 # try using tkdiff, which is a bit less sophisticated
121 if [ -n "$TKDIFF" ]; then 125 if [ -n "$TKDIFF" ]; then
122 $TKDIFF "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || failure 126 $TKDIFF "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || failure
123 success 127 success
128 fi
129
130 if [ -n "$MELD" ]; then
131 cp "$BACKUP" "$CHGTEST"
132 # protect our feet - meld allows us to save to the left file
133 cp "$BACKUP" "$LOCAL.tmp.$RAND"
134 # Meld doesn't have automatic merging, so to reduce intervention
135 # use the file with conflicts
136 $MELD "$LOCAL.tmp.$RAND" "$LOCAL" "$OTHER" || failure
137 # Also it doesn't return good error code
138 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
124 fi 139 fi
125 fi 140 fi
126 141
127 # Attempt to do a merge with $EDITOR 142 # Attempt to do a merge with $EDITOR
128 if [ -n "$MERGE" ]; then 143 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
129 echo "conflicts detected in $LOCAL" 144 echo "conflicts detected in $LOCAL"
130 $MERGE "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL" 145 cp "$BACKUP" "$CHGTEST"
131 success 146 $EDITOR "$LOCAL" || failure
132 fi 147 # Some editors do not return meaningful error codes
133 148 # Do not take any chances
134 if [ -n "$DIFF3" ]; then 149 test "$LOCAL" -nt "$CHGTEST" && success || ask_if_merged
135 echo "conflicts detected in $LOCAL"
136 $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" || {
137 case $? in
138 1)
139 $EDITOR "$LOCAL" ;;
140 2) echo "$DIFF3 failed! Exiting." 1>&2
141 cp "$BACKUP" "$LOCAL"
142 failure ;;
143 esac
144 success
145 }
146 fi 150 fi
147 151
148 # attempt to manually merge with diff and patch 152 # attempt to manually merge with diff and patch
149 if [ -n "$DIFF" -a -n "$PATCH" ]; then 153 if [ -n "$DIFF" -a -n "$PATCH" ]; then
150 154
151 (umask 077 && mkdir "$HGTMP") || { 155 (umask 077 && mkdir "$HGTMP") || {
152 echo "Could not create temporary directory $HGTMP" 1>&2 156 echo "Could not create temporary directory $HGTMP" 1>&2
153 failure 157 failure
154 } 158 }
155 159
156 $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || : 160 $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || :
157 if $PATCH "$LOCAL" < "$HGTMP/diff"; then 161 if $PATCH "$LOCAL" < "$HGTMP/diff"; then
158 success 162 success
159 else 163 else
160 # If rejects are empty after using the editor, merge was ok 164 # If rejects are empty after using the editor, merge was ok
161 $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || success 165 $EDITOR "$LOCAL" "$LOCAL.rej" || failure
166 test -s "$LOCAL.rej" || success
162 fi 167 fi
163 failure 168 failure
164 fi 169 fi
165 170
166 echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" 171 echo
172 echo "hgmerge: unable to find any merge utility!"
173 echo "supported programs:"
174 echo "merge, FileMerge, tkdiff, kdiff3, meld, diff+patch"
175 echo
167 failure 176 failure