X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topgit.git;a=blobdiff_plain;f=tg-export.sh;h=9e6940fcff23fc1a6bbd5ded2b9a7bf037ece54c;hp=335f698b5ce8d3907f31c08df24fd37bdbd365e7;hb=6e92736dd815e29c3715362970380f5e9a759a11;hpb=7a0af6f34b119a80357190bb0008e6ba5559f005 diff --git a/tg-export.sh b/tg-export.sh index 335f698..9e6940f 100644 --- a/tg-export.sh +++ b/tg-export.sh @@ -4,8 +4,11 @@ # GPLv2 name= +branches= output= driver=collapse +flatten=false +numbered=false ## Parse options @@ -13,12 +16,19 @@ driver=collapse while [ -n "$1" ]; do arg="$1"; shift case "$arg" in + -b) + branches="$1"; shift;; + --flatten) + flatten=true;; + --numbered) + flatten=true; + numbered=true;; --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 +37,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" + +[ "$driver" = "quilt" ] || ! "$numbered" || + die "--numbered works only with the quilt driver"; + +[ "$driver" = "quilt" ] || ! "$flatten" || + die "--flatten 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" +fi playground="$(mktemp -d -t tg-export.XXXXXX)" @@ -81,9 +104,13 @@ collapsed_commit() $(for p in $parent; do echo -p $p; done))" fi - (printf '%s\n\n' "$SUBJECT"; cat "$playground/^msg") | - git stripspace | - git commit-tree "$(pretty_tree "$name")" -p "$parent" + if branch_empty "$name"; then + echo "$parent"; + else + (printf '%s\n\n' "$SUBJECT"; cat "$playground/^msg") | + git stripspace | + git commit-tree "$(pretty_tree "$name")" -p "$parent" + fi; echo "$name" >>"$playground/^ticker" } @@ -124,16 +151,39 @@ quilt() return fi - filename="$output/$_dep.diff" - if [ -e "$filename" ]; then + if "$flatten"; then + bn="$(echo "$_dep.diff" | sed -e 's#_#__#g' -e 's#/#_#g')"; + dn=""; + else + bn="$(basename "$_dep.diff")"; + dn="$(dirname "$_dep.diff")/"; + if [ "x$dn" = "x./" ]; then + dn=""; + fi; + fi; + + if [ -e "$playground/$_dep" ]; then # We've already seen this dep return fi - echo "Exporting $_dep" - mkdir -p "$(dirname "$filename")" - $tg patch "$_dep" >"$filename" - echo "$_dep.diff -p1" >>"$output/series" + mkdir -p "$playground/$(dirname "$_dep")"; + touch "$playground/$_dep"; + + if branch_empty "$_dep"; then + echo "Skip empty patch $_dep"; + else + if "$numbered"; then + number="$(printf "%04u" $(($(cat "$playground/^number" 2>/dev/null) + 1)))"; + bn="$number-$bn"; + echo "$number" >"$playground/^number"; + fi; + + echo "Exporting $_dep" + mkdir -p "$output/$dn"; + $tg patch "$_dep" >"$output/$dn$bn" + echo "$dn$bn -p1" >>"$output/series" + fi } @@ -157,6 +207,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,8 +217,16 @@ 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) +if [ -z "$branches" ]; then + recurse_deps driver "$name" + (_ret=0; _dep="$name"; _name=""; _dep_is_tgish=1; driver) +else + echo "$branches" | tr ',' '\n' | while read _dep; do + _dep_is_tgish=1 + $driver + done + name="$(echo "$branches" | sed 's/.*,//')" +fi if [ "$driver" = "collapse" ]; then @@ -180,3 +239,5 @@ elif [ "$driver" = "quilt" ]; then depcount="$(cat "$output/series" | wc -l)" echo "Exported topic branch $name (total $depcount topics) to directory $output" fi + +# vim:noet