chiark / gitweb /
Merge commit 'refs/top-bases/fixes/ensure-worktree' into fixes/ensure-worktree
[topgit.git] / tg-export.sh
index 52af88dfd14e891627b145f63702b1212155a82c..9e6940fcff23fc1a6bbd5ded2b9a7bf037ece54c 100644 (file)
@@ -7,6 +7,8 @@ name=
 branches=
 output=
 driver=collapse
+flatten=false
+numbered=false
 
 
 ## Parse options
@@ -16,6 +18,11 @@ while [ -n "$1" ]; do
        case "$arg" in
        -b)
                branches="$1"; shift;;
+       --flatten)
+               flatten=true;;
+       --numbered)
+               flatten=true;
+               numbered=true;;
        --quilt)
                driver=quilt;;
        --collapse)
@@ -34,6 +41,12 @@ done
 [ -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/##')"
@@ -91,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"
 }
@@ -134,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
 }
 
 
@@ -199,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