chiark / gitweb /
needs_update(): Fix $missing_deps passing
[topgit.git] / tg.sh
diff --git a/tg.sh b/tg.sh
index e987561d3a2693159d2b88672839ec9cdb42bad3..e7c42cd6b8f27cfad9975461ad884150d75cde98 100644 (file)
--- a/tg.sh
+++ b/tg.sh
@@ -90,41 +90,43 @@ branch_contains()
 # them to space-separated $missing_deps list and skip them.
 needs_update()
 {
-       git cat-file blob "$1:.topdeps" 2>/dev/null | {
-               _ret=0
-               while read _dep; do
-                       if !git rev-parse --verify "$_dep" >/dev/null 2>&1; then
-                               # All hope is lost
-                               missing_deps="$missing_deps $_dep"
-                               continue
-                       fi
-
-                       _dep_is_tgish=1
-                       git rev-parse --verify "refs/top-bases/$_dep" >/dev/null 2>&1 ||
-                               _dep_is_tgish=
-
-                       # Shoo shoo, keep our environment alone!
-                       [ -z "$_dep_is_tgish" ] ||
-                               (needs_update "$_dep" "$@") ||
-                               _ret=$?
-
-                       _dep_base_uptodate=1
-                       if [ -n "$_dep_is_tgish" ]; then
-                               branch_contains "$_dep" "refs/top-bases/$_dep" || _dep_base_uptodate=
-                       fi
-
-                       if [ -z "$_dep_base_uptodate" ]; then
-                               # _dep needs to be synced with its base
-                               echo ": $_dep $*"
-                               _ret=1
-                       elif ! branch_contains "refs/top-bases/$1" "$_dep"; then
-                               # Some new commits in _dep
-                               echo "$_dep $*"
-                               _ret=1
-                       fi
-               done
-               exit $_ret
-       }
+       depsfile="$(mktemp)"
+       git cat-file blob "$1:.topdeps" >"$depsfile"
+       _ret=0
+       while read _dep; do
+               if ! git rev-parse --verify "$_dep" >/dev/null 2>&1; then
+                       # All hope is lost
+                       missing_deps="$missing_deps $_dep"
+                       continue
+               fi
+
+               _dep_is_tgish=1
+               git rev-parse --verify "refs/top-bases/$_dep" >/dev/null 2>&1 ||
+                       _dep_is_tgish=
+
+               # Shoo shoo, keep our environment alone!
+               [ -z "$_dep_is_tgish" ] ||
+                       (needs_update "$_dep" "$@") ||
+                       _ret=$?
+
+               _dep_base_uptodate=1
+               if [ -n "$_dep_is_tgish" ]; then
+                       branch_contains "$_dep" "refs/top-bases/$_dep" || _dep_base_uptodate=
+               fi
+
+               if [ -z "$_dep_base_uptodate" ]; then
+                       # _dep needs to be synced with its base
+                       echo ": $_dep $*"
+                       _ret=1
+               elif ! branch_contains "refs/top-bases/$1" "$_dep"; then
+                       # Some new commits in _dep
+                       echo "$_dep $*"
+                       _ret=1
+               fi
+       done <"$depsfile"
+       missing_deps="${missing_deps# }"
+       rm "$depsfile"
+       return $_ret
 }
 
 # branch_empty NAME