@@ -14,19 +14,19 @@ SUBDIRECTORY_OK=Yes
1414require_work_tree
1515
1616# Returns true if the mode reflects a symlink
17- function is_symlink () {
17+ is_symlink () {
1818 test " $1 " = 120000
1919}
2020
21- function local_present () {
21+ local_present () {
2222 test -n " $local_mode "
2323}
2424
25- function remote_present () {
25+ remote_present () {
2626 test -n " $remote_mode "
2727}
2828
29- function base_present () {
29+ base_present () {
3030 test -n " $base_mode "
3131}
3232
@@ -39,32 +39,29 @@ cleanup_temp_files () {
3939 fi
4040}
4141
42- function describe_file () {
42+ describe_file () {
4343 mode=" $1 "
4444 branch=" $2 "
4545 file=" $3 "
4646
47- echo -n " "
47+ printf " {%s}: " " $branch "
4848 if test -z " $mode " ; then
49- echo -n " ' $path ' was deleted"
49+ echo " deleted"
5050 elif is_symlink " $mode " ; then
51- echo -n " '$path ' is a symlink containing '"
52- cat " $file "
53- echo -n " '"
51+ echo " a symbolic link -> '$( cat " $file " ) '"
5452 else
5553 if base_present; then
56- echo -n " ' $path ' was created "
54+ echo " modified "
5755 else
58- echo -n " ' $path ' was modified "
56+ echo " created "
5957 fi
6058 fi
61- echo " in the $branch branch"
6259}
6360
6461
6562resolve_symlink_merge () {
66- while /bin/ true; do
67- echo -n " Use (r)emote or (l)ocal , or (a)bort? "
63+ while true ; do
64+ printf " Use (l)ocal or (r)emote , or (a)bort? "
6865 read ans
6966 case " $ans " in
7067 [lL]* )
@@ -73,52 +70,83 @@ resolve_symlink_merge () {
7370 cleanup_temp_files --save-backup
7471 return
7572 ;;
76- [rR]* )
73+ [rR]* )
7774 git-checkout-index -f --stage=3 -- " $path "
7875 git-add -- " $path "
7976 cleanup_temp_files --save-backup
8077 return
8178 ;;
82- [qQ ]* )
79+ [aA ]* )
8380 exit 1
8481 ;;
8582 esac
8683 done
8784}
8885
8986resolve_deleted_merge () {
90- while /bin/true; do
91- echo -n " Use (m)odified or (d)eleted file, or (a)bort? "
87+ while true ; do
88+ if base_present; then
89+ printf " Use (m)odified or (d)eleted file, or (a)bort? "
90+ else
91+ printf " Use (c)reated or (d)eleted file, or (a)bort? "
92+ fi
9293 read ans
9394 case " $ans " in
94- [mM ]* )
95+ [mMcC ]* )
9596 git-add -- " $path "
9697 cleanup_temp_files --save-backup
9798 return
9899 ;;
99- [dD]* )
100- git-rm -- " $path "
100+ [dD]* )
101+ git-rm -- " $path " > /dev/null
101102 cleanup_temp_files
102103 return
103104 ;;
104- [qQ ]* )
105+ [aA ]* )
105106 exit 1
106107 ;;
107108 esac
108109 done
109110}
110111
111- merge_file () {
112- path=" $1 "
112+ check_unchanged () {
113+ if test " $path " -nt " $BACKUP " ; then
114+ status=0;
115+ else
116+ while true ; do
117+ echo " $path seems unchanged."
118+ printf " Was the merge successful? [y/n] "
119+ read answer < /dev/tty
120+ case " $answer " in
121+ y* |Y* ) status=0; break ;;
122+ n* |N* ) status=1; break ;;
123+ esac
124+ done
125+ fi
126+ }
113127
114- if test ! -f " $path " ; then
115- echo " $path : file not found"
116- exit 1
128+ save_backup () {
129+ if test " $status " -eq 0; then
130+ mv -- " $BACKUP " " $path .orig"
131+ fi
132+ }
133+
134+ remove_backup () {
135+ if test " $status " -eq 0; then
136+ rm " $BACKUP "
117137 fi
138+ }
139+
140+ merge_file () {
141+ path=" $1 "
118142
119143 f=` git-ls-files -u -- " $path " `
120144 if test -z " $f " ; then
121- echo " $path : file does not need merging"
145+ if test ! -f " $path " ; then
146+ echo " $path : file not found"
147+ else
148+ echo " $path : file does not need merging"
149+ fi
122150 exit 1
123151 fi
124152
@@ -139,25 +167,25 @@ merge_file () {
139167 remote_present && git cat-file blob " :3:$path " > " $REMOTE " 2> /dev/null
140168
141169 if test -z " $local_mode " -o -z " $remote_mode " ; then
142- echo " Deleted merge conflict for $path :"
170+ echo " Deleted merge conflict for ' $path ' :"
143171 describe_file " $local_mode " " local" " $LOCAL "
144172 describe_file " $remote_mode " " remote" " $REMOTE "
145173 resolve_deleted_merge
146174 return
147175 fi
148176
149177 if is_symlink " $local_mode " || is_symlink " $remote_mode " ; then
150- echo " Symlink merge conflict for $path :"
178+ echo " Symbolic link merge conflict for ' $path ' :"
151179 describe_file " $local_mode " " local" " $LOCAL "
152180 describe_file " $remote_mode " " remote" " $REMOTE "
153181 resolve_symlink_merge
154182 return
155183 fi
156184
157- echo " Normal merge conflict for $path :"
185+ echo " Normal merge conflict for ' $path ' :"
158186 describe_file " $local_mode " " local" " $LOCAL "
159187 describe_file " $remote_mode " " remote" " $REMOTE "
160- echo -n " Hit return to start merge resolution tool ($merge_tool ): "
188+ printf " Hit return to start merge resolution tool (%s ): " " $merge_tool "
161189 read ans
162190
163191 case " $merge_tool " in
@@ -170,9 +198,7 @@ merge_file () {
170198 -o " $path " -- " $LOCAL " " $REMOTE " > /dev/null 2>&1 )
171199 fi
172200 status=$?
173- if test " $status " -eq 0; then
174- rm " $BACKUP "
175- fi
201+ remove_backup
176202 ;;
177203 tkdiff)
178204 if base_present ; then
@@ -181,29 +207,13 @@ merge_file () {
181207 tkdiff -o " $path " -- " $LOCAL " " $REMOTE "
182208 fi
183209 status=$?
184- if test " $status " -eq 0; then
185- mv -- " $BACKUP " " $path .orig"
186- fi
210+ save_backup
187211 ;;
188212 meld|vimdiff)
189213 touch " $BACKUP "
190214 $merge_tool -- " $LOCAL " " $path " " $REMOTE "
191- if test " $path " -nt " $BACKUP " ; then
192- status=0;
193- else
194- while true ; do
195- echo " $path seems unchanged."
196- echo -n " Was the merge successful? [y/n] "
197- read answer < /dev/tty
198- case " $answer " in
199- y* |Y* ) status=0; break ;;
200- n* |N* ) status=1; break ;;
201- esac
202- done
203- fi
204- if test " $status " -eq 0; then
205- mv -- " $BACKUP " " $path .orig"
206- fi
215+ check_unchanged
216+ save_backup
207217 ;;
208218 xxdiff)
209219 touch " $BACKUP "
@@ -220,22 +230,18 @@ merge_file () {
220230 -R ' Accel.SearchForward: "Ctrl-G"' \
221231 --merged-file " $path " -- " $LOCAL " " $REMOTE "
222232 fi
223- if test " $path " -nt " $BACKUP " ; then
224- status=0;
233+ check_unchanged
234+ save_backup
235+ ;;
236+ opendiff)
237+ touch " $BACKUP "
238+ if base_present; then
239+ opendiff " $LOCAL " " $REMOTE " -ancestor " $BASE " -merge " $path " | cat
225240 else
226- while true ; do
227- echo " $path seems unchanged."
228- echo -n " Was the merge successful? [y/n] "
229- read answer < /dev/tty
230- case " $answer " in
231- y* |Y* ) status=0; break ;;
232- n* |N* ) status=1; break ;;
233- esac
234- done
235- fi
236- if test " $status " -eq 0; then
237- mv -- " $BACKUP " " $path .orig"
241+ opendiff " $LOCAL " " $REMOTE " -merge " $path " | cat
238242 fi
243+ check_unchanged
244+ save_backup
239245 ;;
240246 emerge)
241247 if base_present ; then
@@ -244,9 +250,7 @@ merge_file () {
244250 emacs -f emerge-files-command " $LOCAL " " $REMOTE " " $path "
245251 fi
246252 status=$?
247- if test " $status " -eq 0; then
248- mv -- " $BACKUP " " $path .orig"
249- fi
253+ save_backup
250254 ;;
251255 esac
252256 if test " $status " -ne 0; then
289293if test -z " $merge_tool " ; then
290294 merge_tool=` git-config merge.tool`
291295 case " $merge_tool " in
292- kdiff3 | tkdiff | xxdiff | meld | emerge | vimdiff)
296+ kdiff3 | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | " " )
293297 ;; # happy
294298 * )
295299 echo >&2 " git config option merge.tool set to unknown tool: $merge_tool "
@@ -308,6 +312,8 @@ if test -z "$merge_tool" ; then
308312 merge_tool=xxdiff
309313 elif type meld > /dev/null 2>&1 && test -n " $DISPLAY " ; then
310314 merge_tool=meld
315+ elif type opendiff > /dev/null 2>&1 ; then
316+ merge_tool=opendiff
311317 elif type emacs > /dev/null 2>&1 ; then
312318 merge_tool=emerge
313319 elif type vimdiff > /dev/null 2>&1 ; then
@@ -319,7 +325,7 @@ if test -z "$merge_tool" ; then
319325fi
320326
321327case " $merge_tool " in
322- kdiff3|tkdiff|meld|xxdiff|vimdiff)
328+ kdiff3|tkdiff|meld|xxdiff|vimdiff|opendiff )
323329 if ! type " $merge_tool " > /dev/null 2>&1 ; then
324330 echo " The merge tool $merge_tool is not available"
325331 exit 1
@@ -346,12 +352,12 @@ if test $# -eq 0 ; then
346352 echo Merging the files: $files
347353 git ls-files -u | sed -e ' s/^[^ ]* //' | sort -u | while read i
348354 do
349- echo " "
355+ printf " \n "
350356 merge_file " $i " < /dev/tty > /dev/tty
351357 done
352358else
353359 while test $# -gt 0; do
354- echo " "
360+ printf " \n "
355361 merge_file " $1 "
356362 shift
357363 done
0 commit comments