Skip to content

Commit b05f974

Browse files
authored
Parallelize
1 parent c6bc260 commit b05f974

File tree

1 file changed

+58
-32
lines changed

1 file changed

+58
-32
lines changed

git-fmt-diff

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ gf_debug=0
1919
gf_no_term=
2020
gf_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+
4055
debug () (
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

6278
sed_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-
7686
warn () (
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+
421437
usage () (
422438
cat << EOU
423439
EOU
@@ -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

Comments
 (0)