X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=tg-export.sh;h=335f698b5ce8d3907f31c08df24fd37bdbd365e7;hb=057218422892984e6d2eecff3a7605040b65fdf2;hp=73ad2efde93508939db4e16b34cb4c9e407a127d;hpb=e92c5885789545f273485399f4bcf5b083ba5f29;p=topgit.git diff --git a/tg-export.sh b/tg-export.sh index 73ad2ef..335f698 100644 --- a/tg-export.sh +++ b/tg-export.sh @@ -18,7 +18,7 @@ while [ -n "$1" ]; do --collapse) driver=collapse;; -*) - echo "Usage: tg export ([--collapse] NEWBRANCH | --quilt DIRECTORY)" >&2 + echo "Usage: tg [...] export ([--collapse] NEWBRANCH | --quilt DIRECTORY)" >&2 exit 1;; *) [ -z "$output" ] || die "output already specified ($output)" @@ -32,23 +32,12 @@ base_rev="$(git rev-parse --short --verify "refs/top-bases/$name" 2>/dev/null)" die "not on a TopGit-controlled branch" -playground="$(mktemp -d)" +playground="$(mktemp -d -t tg-export.XXXXXX)" trap 'rm -rf "$playground"' EXIT ## Collapse driver -# Trusty Cogito code: -load_author() -{ - if [ -z "$GIT_AUTHOR_NAME" ] && echo "$1" | grep -q '^[^< ]'; then - export GIT_AUTHOR_NAME="$(echo "$1" | sed 's/ *<.*//')" - fi - if [ -z "$GIT_AUTHOR_EMAIL" ] && echo "$1" | grep -q '<.*>'; then - export GIT_AUTHOR_EMAIL="$(echo "$1" | sed 's/.*<\(.*\)>.*/\1/')" - fi -} - # pretty_tree NAME # Output tree ID of a cleaned-up tree without tg's artifacts. pretty_tree() @@ -69,19 +58,16 @@ collapsed_commit() >"$playground/^body" # Get commit message and authorship information - git cat-file blob "$name:.topmsg" >"$playground/^msg" - while read line; do - if [ -z "$line" ]; then - # end of header - cat >"$playground/^body" - break - fi - case "$line" in - From:*) load_author "${line#From: }";; - Subject:*) echo "${line#Subject: }" >>"$playground/^pre";; - *) echo "$line" >>"$playground/^post";; - esac - done <"$playground/^msg" + git cat-file blob "$name:.topmsg" | git mailinfo "$playground/^msg" /dev/null > "$playground/^info" + + GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$playground/^info")" + GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$playground/^info")" + GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$playground/^info")" + SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$playground/^info")" + + test -n "$GIT_AUTHOR_NAME" && export GIT_AUTHOR_NAME + test -n "$GIT_AUTHOR_EMAIL" && export GIT_AUTHOR_EMAIL + test -n "$GIT_AUTHOR_DATE" && export GIT_AUTHOR_DATE # Determine parent parent="$(cut -f 1 "$playground/$name^parents")" @@ -95,14 +81,9 @@ collapsed_commit() $(for p in $parent; do echo -p $p; done))" fi - { - if [ -s "$playground/^pre" ]; then - cat "$playground/^pre" - echo - fi - cat "$playground/^body" - [ ! -s "$playground/^post" ] || cat "$playground/^post" - } | git commit-tree "$(pretty_tree "$name")" -p "$parent" + (printf '%s\n\n' "$SUBJECT"; cat "$playground/^msg") | + git stripspace | + git commit-tree "$(pretty_tree "$name")" -p "$parent" echo "$name" >>"$playground/^ticker" } @@ -151,7 +132,7 @@ quilt() echo "Exporting $_dep" mkdir -p "$(dirname "$filename")" - tg patch "$_dep" >"$filename" + $tg patch "$_dep" >"$filename" echo "$_dep.diff -p1" >>"$output/series" } @@ -161,7 +142,7 @@ quilt() if [ "$driver" = "collapse" ]; then [ -n "$output" ] || die "no target branch specified" - ! git rev-parse --verify "$output" >/dev/null 2>&1 || + ! ref_exists "$output" || die "target branch '$output' already exists; first run: git branch -D $output" elif [ "$driver" = "quilt" ]; then @@ -190,7 +171,7 @@ recurse_deps driver "$name" if [ "$driver" = "collapse" ]; then - git update-ref "refs/heads/$output" "$(cat "$playground/$name")" + git update-ref "refs/heads/$output" "$(cat "$playground/$name")" "" depcount="$(cat "$playground/^ticker" | wc -l)" echo "Exported topic branch $name (total $depcount topics) to branch $output"