comparison hgmerge @ 1770:4eea6a747c27

hgmerge: fix diff+patch detection; cleanups Details: - actually show help message when no tools are found - whitespace cleanup (stupid emacs) - quote more variables - simplify merge/diff3 error handling
author Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
date Tue, 21 Feb 2006 15:48:09 -0600
parents 4ba8fe499df2
children e22bbca2e82b
comparison
equal deleted inserted replaced
1759:5afd459db177 1770:4eea6a747c27
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"
35 37
36 type $FILEMERGE >/dev/null 2>&1 || FILEMERGE= 38 type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE=
37 type $KDIFF3 >/dev/null 2>&1 || KDIFF3= 39 type "$KDIFF3" >/dev/null 2>&1 || KDIFF3=
38 type $TKDIFF >/dev/null 2>&1 || TKDIFF= 40 type "$TKDIFF" >/dev/null 2>&1 || TKDIFF=
39 41
40 # random part of names 42 # random part of names
41 RAND="$RANDOM.$RANDOM.$RANDOM.$$" 43 RAND="$RANDOM$RANDOM"
42 44
43 # temporary directory for diff+patch merge 45 # temporary directory for diff+patch merge
44 HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND" 46 HGTMP="${TMPDIR-'/tmp'}/hgmerge.$RAND"
45 47
46 # backup file 48 # backup file
47 BACKUP="$LOCAL.orig.$RAND" 49 BACKUP="$LOCAL.orig.$RAND"
48 50
49 # file used to test for file change 51 # file used to test for file change
74 # Back up our file (and try hard to keep the mtime unchanged) 76 # Back up our file (and try hard to keep the mtime unchanged)
75 mv "$LOCAL" "$BACKUP" 77 mv "$LOCAL" "$BACKUP"
76 cp "$BACKUP" "$LOCAL" 78 cp "$BACKUP" "$LOCAL"
77 79
78 # Attempt to do a non-interactive merge 80 # Attempt to do a non-interactive merge
79 if [ -n "$MERGE" ]; then 81 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
80 $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success 82 if [ -n "$MERGE" ]; then
81 cp "$BACKUP" "$LOCAL" 83 $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success
82 elif [ -n "$DIFF3" ]; then 84 elif [ -n "$DIFF3" ]; then
83 echo $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" 85 $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success
84 $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success 86 fi
85 if [ $? -eq 2 ]; then 87 if [ $? -gt 1 ]; then
86 echo "$DIFF3 failed! Exiting." 1>&2 88 echo "automatic merge failed! Exiting." 1>&2
87 cp "$BACKUP" "$LOCAL"
88 failure 89 failure
89 fi 90 fi
90 cp "$BACKUP" "$LOCAL"
91 fi 91 fi
92 cp "$BACKUP" "$LOCAL"
92 93
93 # on MacOS X try FileMerge.app, shipped with Apple's developer tools 94 # on MacOS X try FileMerge.app, shipped with Apple's developer tools
94 if [ -n "$FILEMERGE" ]; then 95 if [ -n "$FILEMERGE" ]; then
95 cp "$BACKUP" "$LOCAL" 96 cp "$BACKUP" "$LOCAL"
96 cp "$BACKUP" "$CHGTEST" 97 cp "$BACKUP" "$CHGTEST"
111 fi 112 fi
112 113
113 if [ -n "$DISPLAY" ]; then 114 if [ -n "$DISPLAY" ]; then
114 # try using kdiff3, which is fairly nice 115 # try using kdiff3, which is fairly nice
115 if [ -n "$KDIFF3" ]; then 116 if [ -n "$KDIFF3" ]; then
116 $KDIFF3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || failure 117 $KDIFF3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || failure
117 success 118 success
118 fi 119 fi
119 120
120 # try using tkdiff, which is a bit less sophisticated 121 # try using tkdiff, which is a bit less sophisticated
121 if [ -n "$TKDIFF" ]; then 122 if [ -n "$TKDIFF" ]; then
122 $TKDIFF "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || failure 123 $TKDIFF "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || failure
123 success 124 success
124 fi 125 fi
125 fi 126 fi
126 127
127 # Attempt to do a merge with $EDITOR 128 # Attempt to do a merge with $EDITOR
128 if [ -n "$MERGE" ]; then 129 if [ -n "$MERGE" ]; then
147 148
148 # attempt to manually merge with diff and patch 149 # attempt to manually merge with diff and patch
149 if [ -n "$DIFF" -a -n "$PATCH" ]; then 150 if [ -n "$DIFF" -a -n "$PATCH" ]; then
150 151
151 (umask 077 && mkdir "$HGTMP") || { 152 (umask 077 && mkdir "$HGTMP") || {
152 echo "Could not create temporary directory $HGTMP" 1>&2 153 echo "Could not create temporary directory $HGTMP" 1>&2
153 failure 154 failure
154 } 155 }
155 156
156 $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || : 157 $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || :
157 if $PATCH "$LOCAL" < "$HGTMP/diff"; then 158 if $PATCH "$LOCAL" < "$HGTMP/diff"; then
158 success 159 success
159 else 160 else
160 # If rejects are empty after using the editor, merge was ok 161 # If rejects are empty after using the editor, merge was ok
161 $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || success 162 $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || success
162 fi 163 fi
163 failure 164 failure
164 fi 165 fi
165 166
166 echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" 167 echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!"