Recently Written · git

sh

Small shell and Python scripts

git clone https://github.com/equwal/sh

Log | Files | Refs


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