commit e4219f505dab086e32b0383d6356534c5db73297 equwal <13551856+equwal@users.noreply.github.com> 2026-10-04 23:02:58 -0700 git-update-repos: run workers with xargs -P 8 instead of tsp, fix quoting and result parsing
git-update-repos | 39 +++++++++++++++------------------------ git-update-worker.sh | 14 +++++++------- 2 files changed, 22 insertions(+), 31 deletions(-)
diff --git a/git-update-repos b/git-update-repos index 1784322..41f3148 100755 --- a/git-update-repos +++ b/git-update-repos @@ -2,31 +2,22 @@ # Update all git repos in directory tree dir=${1:-"."} results=$(mktemp) -log=$(mktemp) -trap "tsp -K; rm -f "$results" "$log"" EXIT -echo "Updating repos in: "$dir"" -tsp -S 8 -find ""$dir"" -name ".git" -type d 2>/dev/null | while read git_dir; do - tsp -n git-update-worker.sh "$(dirname ""$git_dir"")" ""$results"" ""$log"" -done -tail -f ""$log"" & -tail_pid=$! -tsp -w -kill "$tail_pid" 2>/dev/null -conflicts=$(grep -c "^REBASE_CONFLICT:" ""$results"" 2>/dev/null || echo 0) +trap 'rm -f "$results"' EXIT +echo "Updating repos in: $dir" +find "$dir" -name .git -type d -prune -print0 2>/dev/null | + xargs -0 -P 8 -I{} "$(dirname "$0")/git-update-worker.sh" {} "$results" +conflicts=$(grep -c "^REBASE_CONFLICT:" "$results") echo "CHANGES:" -grep "^UPDATED:" ""$results"" | while IFS='|' read prefix repo changelog; do - repo_name=$(echo ""$repo"" | sed "s|^"$dir"/||" | sed 's|^./||') - echo "\033[32m"$repo_name":\033[0m" - echo ""$changelog"" | tr ';' '\n' | sed 's/^/ /' | sed 's/^ $//' +sed -n 's/^UPDATED://p' "$results" | while IFS='|' read -r repo changelog; do + repo_name=${repo#"$dir"/} + printf '\033[32m%s:\033[0m\n' "$repo_name" + printf '%s\n' "$changelog" | tr ';' '\n' | sed 's/^/ /' | sed 's/^ $//' done -if grep -q "^REBASE_CONFLICT:" ""$results""; then - echo "\033[31mREBASE CONFLICTS:\033[0m" - grep "^REBASE_CONFLICT:" ""$results"" | while IFS='|' read prefix repo _; do - repo_name=$(echo ""$repo"" | sed "s|^"$dir"/||" | sed 's|^./||') - echo "\033[31m"$repo_name": requires manual resolution\033[0m" +if [ "$conflicts" -gt 0 ]; then + printf '\033[31mREBASE CONFLICTS:\033[0m\n' + sed -n 's/^REBASE_CONFLICT://p' "$results" | while IFS='|' read -r repo _; do + repo_name=${repo#"$dir"/} + printf '\033[31m%s: requires manual resolution\033[0m\n' "$repo_name" done -fi -if [ ""$conflicts"" ] && [ ""$conflicts"" -gt 0 ] 2>/dev/null; then - notify-send "Git Rebase Conflicts" ""$conflicts" repos need manual resolution" -u critical -t 10000 + notify-send "Git Rebase Conflicts" "$conflicts repos need manual resolution" -u critical -t 10000 fi diff --git a/git-update-worker.sh b/git-update-worker.sh index 9926866..8a26320 100755 --- a/git-update-worker.sh +++ b/git-update-worker.sh @@ -1,12 +1,12 @@ #!/bin/sh -repo="$1" +# Worker for git-update-repos: git-update-worker.sh REPO/.git RESULTS +repo=${1%/.git} results="$2" -log="$3" name=$(basename "$repo") old=$(cd "$repo" && git rev-parse HEAD 2>/dev/null) if [ -f "$repo/.git/FETCH_HEAD" ]; then if [ "$(find "$repo/.git/FETCH_HEAD" -mmin -5 2>/dev/null)" ]; then - echo "[$name] skipped" >> "$log" + echo "[$name] skipped" exit fi fi @@ -15,14 +15,14 @@ if (cd "$repo" && git pull --rebase >/dev/null 2>&1); then : elif (cd "$repo" && git rebase --abort >/dev/null 2>&1); then echo "REBASE_CONFLICT:$repo|" >> "$results" - echo "[$name] REBASE CONFLICT" >> "$log" + echo "[$name] REBASE CONFLICT" exit else - echo "[$name] FAILED" >> "$log" + echo "[$name] FAILED" exit fi new=$(cd "$repo" && git rev-parse HEAD 2>/dev/null) -[ "$old" = "$new" ] && { echo "[$name] up to date" >> "$log"; exit; } -echo "[$name] UPDATED" >> "$log" +[ "$old" = "$new" ] && { echo "[$name] up to date"; exit; } +echo "[$name] UPDATED" changelog=$(cd "$repo" && git log --oneline --no-merges -3 "$old..$new" 2>/dev/null | tr '\n' ';') echo "UPDATED:$repo|$changelog" >> "$results" \ No newline at end of file