X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=tg-export.sh;h=8e98f4695c825752428fdf2bd2b947488c6c99c4;hb=657ae9e6541ea432ef969fdb96f5c9c4597530c7;hp=335f698b5ce8d3907f31c08df24fd37bdbd365e7;hpb=7a0af6f34b119a80357190bb0008e6ba5559f005;p=topgit.git diff --git a/tg-export.sh b/tg-export.sh index 335f698..8e98f46 100644 --- a/tg-export.sh +++ b/tg-export.sh @@ -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" @@ -157,6 +173,7 @@ fi driver() { + case $_dep in refs/remotes/*) return;; esac branch_needs_update >/dev/null [ "$_ret" -eq 0 ] || die "cancelling export of $_dep (-> $_name): branch not up-to-date" @@ -166,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")" ""