chiark / gitweb /
put die() messages to stderr
[topgit.git] / tg-depend.sh
index eeb76cd1202dc82fc34c2448821a11d6364cab68..474ccda4e098a2046a2e60a52d5addad4b007f81 100644 (file)
@@ -6,13 +6,18 @@
 name=
 
 
+usage()
+{
+    echo "Usage: tg [...] depend add NAME" >&2
+    exit 1
+}
+
 ## Parse options
 
 subcmd="$1"; shift || :
 case "$subcmd" in
        -h|"")
-               echo "Usage: tg [...] depend add NAME" >&2
-               exit 1;;
+               usage;;
        add)
                ;;
        *)
@@ -23,8 +28,7 @@ while [ -n "$1" ]; do
        arg="$1"; shift
        case "$arg" in
        -*)
-               echo "Usage: tg [...] depend add NAME" >&2
-               exit 1;;
+               usage;;
        *)
                [ -z "$name" ] || die "name already specified ($name)"
                name="$arg";;
@@ -37,13 +41,31 @@ done
 [ -n "$name" ] || die "no branch name specified"
 branchrev="$(git rev-parse --verify "$name" 2>/dev/null)" ||
        die "invalid branch name: $name"
-baserev="$(git rev-parse --verify "refs/top-bases/$name" 2>/dev/null)" ||
-       die "not a TopGit topic branch: $name"
 
+# Check that we are on a TopGit branch.
+current_name="$(git symbolic-ref HEAD | sed 's#^refs/\(heads\|top-bases\)/##')"
+current_base_rev="$(git rev-parse --short --verify "refs/top-bases/$current_name" 2>/dev/null)" ||
+       die "not a TopGit-controlled branch"
 
 ## Record new dependency
+depend_add()
+{
+       [ "$name" = "$current_name" ] &&
+               die "$name cannot depend on itself."
+
+       { $tg summary --deps; echo "$current_name" "$name"; } |
+               tsort >/dev/null ||
+               die "tg: that dependency would introduce a dependency loop"
+
+       grep -F -x -e "$name" "$root_dir/.topdeps" >/dev/null &&
+               die "tg: $current_name already depends on $name"
+
+       echo "$name" >>"$root_dir/.topdeps"
+       git add -f "$root_dir/.topdeps"
+       git commit -m"New TopGit dependency: $name"
+       $tg update
+}
+
+depend_$subcmd
 
-echo "$name" >>.topdeps
-git add .topdeps
-git commit -m"New TopGit dependency: $name"
-$tg update
+# vim:noet