Mercurial > hg
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 |