mergetool: style fixes
This script is one of the sizeable ones that tempted people to copy its "neibouring style" in their new code, but was littered with styles incompatible with our style guide. - use one tab, not four spaces, per indent level; - long lines can be wrapped after '|', '&&', or '||' for readability. - structures like "if .. then .. else .. fi", "while .. do .. done" are split into lines in such a way that does not require unnecessary semicolon. - case, esac and case-arms align at the same column. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano committed
Aug 22, 2012 at 22:33 UTC
f8750a0ea951a328481b67b5d0558c0402f0cdfd
1 file changed
+308
-273
git-mergetool.sh
+308
-273
@@ -18,270 +18,301 @@ require_work_tree
18
19
# Returns true if the mode reflects a symlink
20
is_symlink () {
21
- test "$1" = 120000
21
+ test "$1" = 120000
22
}
23
24
is_submodule () {
25
- test "$1" = 160000
25
+ test "$1" = 160000
26
}
27
28
local_present () {
29
- test -n "$local_mode"
29
+ test -n "$local_mode"
30
}
31
32
remote_present () {
33
- test -n "$remote_mode"
33
+ test -n "$remote_mode"
34
}
35
36
base_present () {
37
- test -n "$base_mode"
37
+ test -n "$base_mode"
38
}
39
40
cleanup_temp_files () {
41
- if test "$1" = --save-backup ; then
42
- rm -rf -- "$MERGED.orig"
43
- test -e "$BACKUP" && mv -- "$BACKUP" "$MERGED.orig"
44
- rm -f -- "$LOCAL" "$REMOTE" "$BASE"
45
- else
46
- rm -f -- "$LOCAL" "$REMOTE" "$BASE" "$BACKUP"
47
- fi
41
+ if test "$1" = --save-backup
42
+ then
43
+ rm -rf -- "$MERGED.orig"
44
+ test -e "$BACKUP" && mv -- "$BACKUP" "$MERGED.orig"
45
+ rm -f -- "$LOCAL" "$REMOTE" "$BASE"
46
+ else
47
+ rm -f -- "$LOCAL" "$REMOTE" "$BASE" "$BACKUP"
48
+ fi
49
}
50
51
describe_file () {
51
- mode="$1"
52
- branch="$2"
53
- file="$3"
54
-
55
- printf " {%s}: " "$branch"
56
- if test -z "$mode"; then
57
- echo "deleted"
58
- elif is_symlink "$mode" ; then
59
- echo "a symbolic link -> '$(cat "$file")'"
60
- elif is_submodule "$mode" ; then
61
- echo "submodule commit $file"
62
- else
63
- if base_present; then
64
- echo "modified file"
52
+ mode="$1"
53
+ branch="$2"
54
+ file="$3"
55
+
56
+ printf " {%s}: " "$branch"
57
+ if test -z "$mode"
58
+ then
59
+ echo "deleted"
60
+ elif is_symlink "$mode"
61
+ then
62
+ echo "a symbolic link -> '$(cat "$file")'"
63
+ elif is_submodule "$mode"
64
+ then
65
+ echo "submodule commit $file"
66
+ elif base_present
67
+ then
68
+ echo "modified file"
69
else
66
- echo "created file"
70
+ echo "created file"
71
fi
68
- fi
72
}
73
71
-
74
resolve_symlink_merge () {
73
- while true; do
74
- printf "Use (l)ocal or (r)emote, or (a)bort? "
75
- read ans || return 1
76
- case "$ans" in
77
- [lL]*)
78
- git checkout-index -f --stage=2 -- "$MERGED"
79
- git add -- "$MERGED"
80
- cleanup_temp_files --save-backup
81
- return 0
82
- ;;
83
- [rR]*)
84
- git checkout-index -f --stage=3 -- "$MERGED"
85
- git add -- "$MERGED"
86
- cleanup_temp_files --save-backup
87
- return 0
88
- ;;
89
- [aA]*)
90
- return 1
91
- ;;
92
- esac
75
+ while true
76
+ do
77
+ printf "Use (l)ocal or (r)emote, or (a)bort? "
78
+ read ans || return 1
79
+ case "$ans" in
80
+ [lL]*)
81
+ git checkout-index -f --stage=2 -- "$MERGED"
82
+ git add -- "$MERGED"
83
+ cleanup_temp_files --save-backup
84
+ return 0
85
+ ;;
86
+ [rR]*)
87
+ git checkout-index -f --stage=3 -- "$MERGED"
88
+ git add -- "$MERGED"
89
+ cleanup_temp_files --save-backup
90
+ return 0
91
+ ;;
92
+ [aA]*)
93
+ return 1
94
+ ;;
95
+ esac
96
done
97
}
98
99
resolve_deleted_merge () {
97
- while true; do
98
- if base_present; then
99
- printf "Use (m)odified or (d)eleted file, or (a)bort? "
100
- else
101
- printf "Use (c)reated or (d)eleted file, or (a)bort? "
102
- fi
103
- read ans || return 1
104
- case "$ans" in
105
- [mMcC]*)
106
- git add -- "$MERGED"
107
- cleanup_temp_files --save-backup
108
- return 0
109
- ;;
110
- [dD]*)
111
- git rm -- "$MERGED" > /dev/null
112
- cleanup_temp_files
113
- return 0
114
- ;;
115
- [aA]*)
116
- return 1
117
- ;;
118
- esac
100
+ while true
101
+ do
102
+ if base_present
103
+ then
104
+ printf "Use (m)odified or (d)eleted file, or (a)bort? "
105
+ else
106
+ printf "Use (c)reated or (d)eleted file, or (a)bort? "
107
+ fi
108
+ read ans || return 1
109
+ case "$ans" in
110
+ [mMcC]*)
111
+ git add -- "$MERGED"
112
+ cleanup_temp_files --save-backup
113
+ return 0
114
+ ;;
115
+ [dD]*)
116
+ git rm -- "$MERGED" > /dev/null
117
+ cleanup_temp_files
118
+ return 0
119
+ ;;
120
+ [aA]*)
121
+ return 1
122
+ ;;
123
+ esac
124
done
125
}
126
127
resolve_submodule_merge () {
123
- while true; do
124
- printf "Use (l)ocal or (r)emote, or (a)bort? "
125
- read ans || return 1
126
- case "$ans" in
127
- [lL]*)
128
- if ! local_present; then
129
- if test -n "$(git ls-tree HEAD -- "$MERGED")"; then
130
- # Local isn't present, but it's a subdirectory
131
- git ls-tree --full-name -r HEAD -- "$MERGED" | git update-index --index-info || exit $?
132
- else
133
- test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
134
- git update-index --force-remove "$MERGED"
128
+ while true
129
+ do
130
+ printf "Use (l)ocal or (r)emote, or (a)bort? "
131
+ read ans || return 1
132
+ case "$ans" in
133
+ [lL]*)
134
+ if ! local_present
135
+ then
136
+ if test -n "$(git ls-tree HEAD -- "$MERGED")"
137
+ then
138
+ # Local isn't present, but it's a subdirectory
139
+ git ls-tree --full-name -r HEAD -- "$MERGED" |
140
+ git update-index --index-info || exit $?
141
+ else
142
+ test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
143
+ git update-index --force-remove "$MERGED"
144
+ cleanup_temp_files --save-backup
145
+ fi
146
+ elif is_submodule "$local_mode"
147
+ then
148
+ stage_submodule "$MERGED" "$local_sha1"
149
+ else
150
+ git checkout-index -f --stage=2 -- "$MERGED"
151
+ git add -- "$MERGED"
152
+ fi
153
+ return 0
154
+ ;;
155
+ [rR]*)
156
+ if ! remote_present
157
+ then
158
+ if test -n "$(git ls-tree MERGE_HEAD -- "$MERGED")"
159
+ then
160
+ # Remote isn't present, but it's a subdirectory
161
+ git ls-tree --full-name -r MERGE_HEAD -- "$MERGED" |
162
+ git update-index --index-info || exit $?
163
+ else
164
+ test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
165
+ git update-index --force-remove "$MERGED"
166
+ fi
167
+ elif is_submodule "$remote_mode"
168
+ then
169
+ ! is_submodule "$local_mode" &&
170
+ test -e "$MERGED" &&
171
+ mv -- "$MERGED" "$BACKUP"
172
+ stage_submodule "$MERGED" "$remote_sha1"
173
+ else
174
+ test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
175
+ git checkout-index -f --stage=3 -- "$MERGED"
176
+ git add -- "$MERGED"
177
+ fi
178
cleanup_temp_files --save-backup
136
- fi
137
- elif is_submodule "$local_mode"; then
138
- stage_submodule "$MERGED" "$local_sha1"
139
- else
140
- git checkout-index -f --stage=2 -- "$MERGED"
141
- git add -- "$MERGED"
142
- fi
143
- return 0
144
- ;;
145
- [rR]*)
146
- if ! remote_present; then
147
- if test -n "$(git ls-tree MERGE_HEAD -- "$MERGED")"; then
148
- # Remote isn't present, but it's a subdirectory
149
- git ls-tree --full-name -r MERGE_HEAD -- "$MERGED" | git update-index --index-info || exit $?
150
- else
151
- test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
152
- git update-index --force-remove "$MERGED"
153
- fi
154
- elif is_submodule "$remote_mode"; then
155
- ! is_submodule "$local_mode" && test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
156
- stage_submodule "$MERGED" "$remote_sha1"
157
- else
158
- test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
159
- git checkout-index -f --stage=3 -- "$MERGED"
160
- git add -- "$MERGED"
161
- fi
162
- cleanup_temp_files --save-backup
163
- return 0
164
- ;;
165
- [aA]*)
166
- return 1
167
- ;;
168
- esac
179
+ return 0
180
+ ;;
181
+ [aA]*)
182
+ return 1
183
+ ;;
184
+ esac
185
done
186
}
187
188
stage_submodule () {
173
- path="$1"
174
- submodule_sha1="$2"
175
- mkdir -p "$path" || die "fatal: unable to create directory for module at $path"
176
- # Find $path relative to work tree
177
- work_tree_root=$(cd_to_toplevel && pwd)
178
- work_rel_path=$(cd "$path" && GIT_WORK_TREE="${work_tree_root}" git rev-parse --show-prefix)
179
- test -n "$work_rel_path" || die "fatal: unable to get path of module $path relative to work tree"
180
- git update-index --add --replace --cacheinfo 160000 "$submodule_sha1" "${work_rel_path%/}" || die
189
+ path="$1"
190
+ submodule_sha1="$2"
191
+ mkdir -p "$path" ||
192
+ die "fatal: unable to create directory for module at $path"
193
+ # Find $path relative to work tree
194
+ work_tree_root=$(cd_to_toplevel && pwd)
195
+ work_rel_path=$(cd "$path" &&
196
+ GIT_WORK_TREE="${work_tree_root}" git rev-parse --show-prefix
197
+ )
198
+ test -n "$work_rel_path" ||
199
+ die "fatal: unable to get path of module $path relative to work tree"
200
+ git update-index --add --replace --cacheinfo 160000 "$submodule_sha1" "${work_rel_path%/}" || die
201
}
202
203
checkout_staged_file () {
184
- tmpfile=$(expr \
185
- "$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \
186
- : '\([^ ]*\) ')
187
-
188
- if test $? -eq 0 -a -n "$tmpfile" ; then
189
- mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3"
190
- else
191
- >"$3"
192
- fi
204
+ tmpfile=$(expr \
205
+ "$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \
206
+ : '\([^ ]*\) ')
207
+
208
+ if test $? -eq 0 -a -n "$tmpfile"
209
+ then
210
+ mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3"
211
+ else
212
+ >"$3"
213
+ fi
214
}
215
216
merge_file () {
196
- MERGED="$1"
217
+ MERGED="$1"
218
198
- f=$(git ls-files -u -- "$MERGED")
199
- if test -z "$f" ; then
200
- if test ! -f "$MERGED" ; then
201
- echo "$MERGED: file not found"
202
- else
203
- echo "$MERGED: file does not need merging"
219
+ f=$(git ls-files -u -- "$MERGED")
220
+ if test -z "$f"
221
+ then
222
+ if test ! -f "$MERGED"
223
+ then
224
+ echo "$MERGED: file not found"
225
+ else
226
+ echo "$MERGED: file does not need merging"
227
+ fi
228
+ return 1
229
fi
205
- return 1
206
- fi
207
-
208
- ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')"
209
- BACKUP="./$MERGED.BACKUP.$ext"
210
- LOCAL="./$MERGED.LOCAL.$ext"
211
- REMOTE="./$MERGED.REMOTE.$ext"
212
- BASE="./$MERGED.BASE.$ext"
213
-
214
- base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}')
215
- local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}')
216
- remote_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}')
217
-
218
- if is_submodule "$local_mode" || is_submodule "$remote_mode"; then
219
- echo "Submodule merge conflict for '$MERGED':"
220
- local_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $2;}')
221
- remote_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $2;}')
222
- describe_file "$local_mode" "local" "$local_sha1"
223
- describe_file "$remote_mode" "remote" "$remote_sha1"
224
- resolve_submodule_merge
225
- return
226
- fi
227
-
228
- mv -- "$MERGED" "$BACKUP"
229
- cp -- "$BACKUP" "$MERGED"
230
-
231
- checkout_staged_file 1 "$MERGED" "$BASE"
232
- checkout_staged_file 2 "$MERGED" "$LOCAL"
233
- checkout_staged_file 3 "$MERGED" "$REMOTE"
234
-
235
- if test -z "$local_mode" -o -z "$remote_mode"; then
236
- echo "Deleted merge conflict for '$MERGED':"
237
- describe_file "$local_mode" "local" "$LOCAL"
238
- describe_file "$remote_mode" "remote" "$REMOTE"
239
- resolve_deleted_merge
240
- return
241
- fi
230
243
- if is_symlink "$local_mode" || is_symlink "$remote_mode"; then
244
- echo "Symbolic link merge conflict for '$MERGED':"
231
+ ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')"
232
+ BACKUP="./$MERGED.BACKUP.$ext"
233
+ LOCAL="./$MERGED.LOCAL.$ext"
234
+ REMOTE="./$MERGED.REMOTE.$ext"
235
+ BASE="./$MERGED.BASE.$ext"
236
+
237
+ base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}')
238
+ local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}')
239
+ remote_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}')
240
+
241
+ if is_submodule "$local_mode" || is_submodule "$remote_mode"
242
+ then
243
+ echo "Submodule merge conflict for '$MERGED':"
244
+ local_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $2;}')
245
+ remote_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $2;}')
246
+ describe_file "$local_mode" "local" "$local_sha1"
247
+ describe_file "$remote_mode" "remote" "$remote_sha1"
248
+ resolve_submodule_merge
249
+ return
250
+ fi
251
+
252
+ mv -- "$MERGED" "$BACKUP"
253
+ cp -- "$BACKUP" "$MERGED"
254
+
255
+ checkout_staged_file 1 "$MERGED" "$BASE"
256
+ checkout_staged_file 2 "$MERGED" "$LOCAL"
257
+ checkout_staged_file 3 "$MERGED" "$REMOTE"
258
+
259
+ if test -z "$local_mode" -o -z "$remote_mode"
260
+ then
261
+ echo "Deleted merge conflict for '$MERGED':"
262
+ describe_file "$local_mode" "local" "$LOCAL"
263
+ describe_file "$remote_mode" "remote" "$REMOTE"
264
+ resolve_deleted_merge
265
+ return
266
+ fi
267
+
268
+ if is_symlink "$local_mode" || is_symlink "$remote_mode"
269
+ then
270
+ echo "Symbolic link merge conflict for '$MERGED':"
271
+ describe_file "$local_mode" "local" "$LOCAL"
272
+ describe_file "$remote_mode" "remote" "$REMOTE"
273
+ resolve_symlink_merge
274
+ return
275
+ fi
276
+
277
+ echo "Normal merge conflict for '$MERGED':"
278
describe_file "$local_mode" "local" "$LOCAL"
279
describe_file "$remote_mode" "remote" "$REMOTE"
247
- resolve_symlink_merge
248
- return
249
- fi
250
-
251
- echo "Normal merge conflict for '$MERGED':"
252
- describe_file "$local_mode" "local" "$LOCAL"
253
- describe_file "$remote_mode" "remote" "$REMOTE"
254
- if "$prompt" = true; then
255
- printf "Hit return to start merge resolution tool (%s): " "$merge_tool"
256
- read ans || return 1
257
- fi
258
-
259
- if base_present; then
260
- present=true
261
- else
262
- present=false
263
- fi
264
-
265
- if ! run_merge_tool "$merge_tool" "$present"; then
266
- echo "merge of $MERGED failed" 1>&2
267
- mv -- "$BACKUP" "$MERGED"
268
-
269
- if test "$merge_keep_temporaries" = "false"; then
270
- cleanup_temp_files
280
+ if "$prompt" = true
281
+ then
282
+ printf "Hit return to start merge resolution tool (%s): " "$merge_tool"
283
+ read ans || return 1
284
fi
285
273
- return 1
274
- fi
286
+ if base_present
287
+ then
288
+ present=true
289
+ else
290
+ present=false
291
+ fi
292
+
293
+ if ! run_merge_tool "$merge_tool" "$present"
294
+ then
295
+ echo "merge of $MERGED failed" 1>&2
296
+ mv -- "$BACKUP" "$MERGED"
297
+
298
+ if test "$merge_keep_temporaries" = "false"
299
+ then
300
+ cleanup_temp_files
301
+ fi
302
276
- if test "$merge_keep_backup" = "true"; then
277
- mv -- "$BACKUP" "$MERGED.orig"
278
- else
279
- rm -- "$BACKUP"
280
- fi
303
+ return 1
304
+ fi
305
282
- git add -- "$MERGED"
283
- cleanup_temp_files
284
- return 0
306
+ if test "$merge_keep_backup" = "true"
307
+ then
308
+ mv -- "$BACKUP" "$MERGED.orig"
309
+ else
310
+ rm -- "$BACKUP"
311
+ fi
312
+
313
+ git add -- "$MERGED"
314
+ cleanup_temp_files
315
+ return 0
316
}
317
318
show_tool_help () {
@@ -325,61 +356,61 @@ prompt=$(git config --bool mergetool.prompt || echo true)
356
357
while test $# != 0
358
do
328
- case "$1" in
359
+ case "$1" in
360
--tool-help)
361
show_tool_help
362
;;
363
-t|--tool*)
333
- case "$#,$1" in
364
+ case "$#,$1" in
365
*,*=*)
335
- merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
336
- ;;
366
+ merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
367
+ ;;
368
1,*)
338
- usage ;;
369
+ usage ;;
370
*)
340
- merge_tool="$2"
341
- shift ;;
342
- esac
343
- ;;
371
+ merge_tool="$2"
372
+ shift ;;
373
+ esac
374
+ ;;
375
-y|--no-prompt)
345
- prompt=false
346
- ;;
376
+ prompt=false
377
+ ;;
378
--prompt)
348
- prompt=true
349
- ;;
379
+ prompt=true
380
+ ;;
381
--)
351
- shift
352
- break
353
- ;;
382
+ shift
383
+ break
384
+ ;;
385
-*)
355
- usage
356
- ;;
357
- *)
358
- break
359
- ;;
360
- esac
361
- shift
362
-done
363
-
364
-prompt_after_failed_merge() {
365
- while true; do
366
- printf "Continue merging other unresolved paths (y/n) ? "
367
- read ans || return 1
368
- case "$ans" in
369
-
370
- [yY]*)
371
- return 0
386
+ usage
387
;;
373
-
374
- [nN]*)
375
- return 1
388
+ *)
389
+ break
390
;;
391
esac
378
- done
392
+ shift
393
+done
394
+
395
+prompt_after_failed_merge () {
396
+ while true
397
+ do
398
+ printf "Continue merging other unresolved paths (y/n) ? "
399
+ read ans || return 1
400
+ case "$ans" in
401
+ [yY]*)
402
+ return 0
403
+ ;;
404
+ [nN]*)
405
+ return 1
406
+ ;;
407
+ esac
408
+ done
409
}
410
381
-if test -z "$merge_tool"; then
382
- merge_tool=$(get_merge_tool "$merge_tool") || exit
411
+if test -z "$merge_tool"
412
+then
413
+ merge_tool=$(get_merge_tool "$merge_tool") || exit
414
fi
415
merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
416
merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
@@ -388,22 +419,24 @@ last_status=0
419
rollup_status=0
420
files=
421
391
-if test $# -eq 0 ; then
392
- cd_to_toplevel
422
+if test $# -eq 0
423
+then
424
+ cd_to_toplevel
425
394
- if test -e "$GIT_DIR/MERGE_RR"
395
- then
396
- files=$(git rerere remaining)
397
- else
398
- files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u)
399
- fi
426
+ if test -e "$GIT_DIR/MERGE_RR"
427
+ then
428
+ files=$(git rerere remaining)
429
+ else
430
+ files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u)
431
+ fi
432
else
401
- files=$(git ls-files -u -- "$@" | sed -e 's/^[^ ]* //' | sort -u)
433
+ files=$(git ls-files -u -- "$@" | sed -e 's/^[^ ]* //' | sort -u)
434
fi
435
404
-if test -z "$files" ; then
405
- echo "No files need merging"
406
- exit 0
436
+if test -z "$files"
437
+then
438
+ echo "No files need merging"
439
+ exit 0
440
fi
441
442
printf "Merging:\n"
@@ -413,15 +446,17 @@ IFS='
446
'
447
for i in $files
448
do
416
- if test $last_status -ne 0; then
417
- prompt_after_failed_merge || exit 1
418
- fi
419
- printf "\n"
420
- merge_file "$i"
421
- last_status=$?
422
- if test $last_status -ne 0; then
423
- rollup_status=1
424
- fi
449
+ if test $last_status -ne 0
450
+ then
451
+ prompt_after_failed_merge || exit 1
452
+ fi
453
+ printf "\n"
454
+ merge_file "$i"
455
+ last_status=$?
456
+ if test $last_status -ne 0
457
+ then
458
+ rollup_status=1
459
+ fi
460
done
461
462
exit $rollup_status