@@ -19,6 +19,8 @@ gf_debug=0
1919gf_no_term=
2020gf_use_color=
2121
22+ g_rm_list=" $( mktemp) "
23+
2224# }}}
2325
2426# helpers {{{1
@@ -37,6 +39,19 @@ abspath () (
3739 fi
3840)
3941
42+ cleanup () (
43+ sed ' 1!G;h;$!d' " $g_rm_list " | while read -r path; do
44+ if [ -d " $path " ]; then
45+ for f in " $path " /* ; do
46+ [ -e " $f " ] && [ ! -s " $f " ] && rm " $f "
47+ done
48+ rmdir " $path "
49+ else
50+ rm " $path "
51+ fi
52+ done
53+ )
54+
4055debug () (
4156 [ " $3 " != " --" ] && [ " $gf_debug " -eq 0 ] && return
4257 >&2 printf " [debug] %s @ %s:%d # " " $( basename " $0 " ) " " $1 " " $2 "
@@ -49,14 +64,15 @@ pat_list_to_case () (
4964 sed ' s/\s\+/|/g'
5065)
5166
52- rm_ () (
67+ rm_list__push () (
5368 [ " $gf_debug " -eq 2 ] && return
54- if [ " $1 " = " -d" ]; then
55- shift
56- rmdir " $@ "
57- else
58- rm " $@ "
69+ if [ -z " $g_rm_list " ]; then
70+ g_rm_list=" $( mktemp) "
71+ rm_list__push " $g_rm_list "
5972 fi
73+ for f in " $@ " ; do
74+ echo " $f " >> " $g_rm_list "
75+ done
6076)
6177
6278sed_esc () (
@@ -67,12 +83,6 @@ sed_esc () (
6783 fi
6884)
6985
70- setup_env () {
71- TMPDIR=" ${TMPDIR:-/ tmp} " /git-" $gc_prog_name "
72- mkdir -p " $TMPDIR "
73- trap ' rm_ -d "$TMPDIR" 2> /dev/null' EXIT
74- }
75-
7686warn () (
7787 >&2 printf " %s: " " $( basename " $0 " ) "
7888 # printf "\033[30m\033[103m"
@@ -277,7 +287,7 @@ git_changes_formatted () (
277287 diff_fmt=" $tempdir " /diff_fmt
278288 temp=" $tempdir " /temp
279289
280- trap ' rm_ "$temp"' EXIT
290+ rm_list__push " $temp "
281291
282292 if git diff -s " $cur_fmt " " $old_fmt " ; then
283293 merge --our " $cur " " $old " " $cur_fmt " > " $temp "
@@ -287,6 +297,7 @@ git_changes_formatted () (
287297 fi
288298
289299 merge --their " $old " " $old_fmt " " $cur_fmt " > " $diff_fmt "
300+ rm_list__push " $diff_fmt "
290301
291302 merge --our " $diff_fmt " " $old " " $cur " > " $temp "
292303 if ! git diff -s " $diff_fmt " " $temp " ; then
@@ -297,8 +308,6 @@ git_changes_formatted () (
297308 merge --our " $old " " $old_fmt " " $cur " > " $temp "
298309 if ! git diff -s " $diff_fmt " " $temp " ; then
299310 echo " $diff_fmt "
300- else
301- rm_ " $diff_fmt "
302311 fi
303312)
304313
@@ -336,13 +345,12 @@ process_file () (
336345 obj1=" $1 "
337346 obj2=" $2 "
338347 line=" $3 "
339- outfile=" $4 "
340348
341349 old_name=" $( echo " $line " | cut -f1) "
342350 cur_name=" $( echo " $line " | cut -f2) "
343351 [ -z " $cur_name " ] && cur_name=" $old_name "
344352
345- debug " cur_name = $cur_name "
353+ debug " --- PROCESSING: $cur_name --- "
346354
347355 case " $( git_conf_get " $cur_name " ignore) " in
348356 true|1) return ;;
@@ -361,6 +369,9 @@ process_file () (
361369 fi
362370
363371 tempdir=" $( mktemp -d) "
372+ rm_list__push " $tempdir "
373+
374+ debug " $cur_name => $tempdir "
364375
365376 cur=" $tempdir " /cur
366377 old=" $tempdir " /old
@@ -369,14 +380,18 @@ process_file () (
369380
370381 git_retrieve_file_from_obj " $obj1 " " $old_name " > " $old "
371382 git_retrieve_file_from_obj " $obj2 " " $cur_name " > " $cur "
383+ rm_list__push " $old " " $cur "
384+
372385 if [ ! -s " $cur " ]; then
373386 warn " couldn't retrieve ${obj2: +$obj2 : } $cur_name "
374387 fi
375388
376389 sh -c " $formatter " < " $cur " > " $cur_fmt " 2> /dev/null
390+ rm_list__push " $cur_fmt "
377391
378392 if ! git diff -s " $cur " " $cur_fmt " ; then
379393 sh -c " $formatter " < " $old " > " $old_fmt " 2> /dev/null
394+ rm_list__push " $old_fmt "
380395
381396 diff_fmt=" $( git_changes_formatted \
382397 " $tempdir " \
@@ -385,15 +400,8 @@ process_file () (
385400
386401 if [ -n " $diff_fmt " ]; then
387402 git_diff " $cur " " $diff_fmt " " $cur_name "
388- rm_ " $diff_fmt "
389403 fi
390-
391- rm_ " $old_fmt "
392404 fi
393-
394- debug " $cur_name => $tempdir "
395- rm_ " $old " " $cur " " $cur_fmt "
396- rm_ -d " $tempdir "
397405)
398406
399407# running {{{1
@@ -418,6 +426,14 @@ list_files () (
418426 git diff $g_cached_opt --diff-filter=ARMC --name-status $obj1 $obj2 | cut -f2-
419427)
420428
429+ setup_env () {
430+ TMPDIR=" ${TMPDIR:-/ tmp} " /git-" $gc_prog_name "
431+ mkdir -p " $TMPDIR "
432+ rm_list__push " $TMPDIR "
433+
434+ trap ' cleanup' EXIT
435+ }
436+
421437usage () (
422438 cat << EOU
423439EOU
@@ -500,23 +516,33 @@ main () (
500516 obj1=" ${1:- HEAD} "
501517 obj2=" $2 "
502518
503- outfile=" $( mktemp) "
504- debug " OUTFILE: $outfile "
519+ outdir=" $( mktemp -d) "
520+ rm_list__push " $outdir "
521+ debug " OUTDIR: $outdir "
505522
506- files=" $( list_files " $obj1 " " $obj2 " ) "
523+ files=" $( list_files " $obj1 " " $obj2 " ) " # must be before 'cd $repo_root'
507524
508525 repo_root=" $( git rev-parse --show-toplevel 2> /dev/null) "
509526 [ -n " $repo_root " ] && { cd " $repo_root " || exit 1; }
510527
511- echo " $files " | while read -r line; do
528+ i=0
529+ i_len=" $( echo " $files " | wc -l | tr -d ' \n' | wc -m) "
530+ while read -r line; do
512531 debug " $line "
532+
513533 [ -e " $obj1 " ] && obj1=" HEAD"
514- process_file " $obj1 " " $obj2 " " $line " >> " $outfile "
515- done
534+ outfile=" $( printf ' %s/%.*d' " $outdir " " $i_len " " $i " ) "
535+
536+ process_file " $obj1 " " $obj2 " " $line " > " $outfile " &
537+ rm_list__push " $outfile "
516538
517- sh -c " $( git_conf_get pager) " < " $outfile "
539+ i=$(( i+ 1 ))
540+ done << EOL
541+ $files
542+ EOL
518543
519- rm_ " $outfile "
544+ wait
545+ cat " $outdir " /* | sh -c " $( git_conf_get pager) "
520546)
521547
522548# }}}1
0 commit comments