chiark / gitweb /
refactor
[topgit.git] / tg-export.sh
index 6098c1a8b4580914aee5143cafaf8b035237e376..8e98f4695c825752428fdf2bd2b947488c6c99c4 100644 (file)
@@ -4,6 +4,7 @@
 # GPLv2
 
 name=
+branches=
 output=
 driver=collapse
 
@@ -13,12 +14,14 @@ driver=collapse
 while [ -n "$1" ]; do
        arg="$1"; shift
        case "$arg" in
+       -b)
+               branches="$1"; shift;;
        --quilt)
                driver=quilt;;
        --collapse)
                driver=collapse;;
        -*)
-               echo "Usage: tg [...] export ([--collapse] NEWBRANCH | --quilt DIRECTORY)" >&2
+               echo "Usage: tg [...] export ([--collapse] NEWBRANCH | [-b BRANCH1,BRANCH2...] --quilt DIRECTORY)" >&2
                exit 1;;
        *)
                [ -z "$output" ] || die "output already specified ($output)"
@@ -27,9 +30,22 @@ while [ -n "$1" ]; do
 done
 
 
-name="$(git symbolic-ref HEAD | sed 's#^refs/heads/##')"
-base_rev="$(git rev-parse --short --verify "refs/top-bases/$name" 2>/dev/null)" ||
-       die "not on a TopGit-controlled branch"
+
+[ -z "$branches" -o "$driver" = "quilt" ] ||
+       die "-b works only with the quilt driver"
+
+if [ -z "$branches" ]; then
+       # this check is only needed when no branches have been passed
+       name="$(git symbolic-ref HEAD | sed 's#^refs/heads/##')"
+       base_rev="$(git rev-parse --short --verify "refs/top-bases/$name" 2>/dev/null)" ||
+               die "not on a TopGit-controlled branch"
+       branches="$name"
+else
+       name="${branches##*,}" # the last of the comma-separated items
+fi
+# $name holds the current branch
+# $branches holds the comma-separated list of branches
+# $name is equal to the last of the list of branches
 
 
 playground="$(mktemp -d -t tg-export.XXXXXX)"
@@ -52,7 +68,7 @@ pretty_tree()
 # Produce a collapsed commit of branch NAME.
 collapsed_commit()
 {
-       name="$1"
+       local name; name="$1"
 
        rm -f "$playground/^pre" "$playground/^post"
        >"$playground/^body"
@@ -167,9 +183,10 @@ driver()
 
 # Call driver on all the branches - this will happen
 # in topological order.
-recurse_deps driver "$name"
-(_ret=0; _dep="$name"; _name=""; _dep_is_tgish=1; driver)
-
+echo "$branches" | tr , '\n' | while read name; do
+       recurse_deps driver "$name"
+       (_ret=0; _dep="$name"; _name=""; _dep_is_tgish=1; driver)
+done
 
 if [ "$driver" = "collapse" ]; then
        git update-ref "refs/heads/$output" "$(cat "$playground/$name")" ""