X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topgit.git;a=blobdiff_plain;f=tg-export.sh;h=6d82d55751bd41159f04f20f55b753baaec94c44;hp=dea24d9d6fa024ba3da1103a584991e7d9f4c7ec;hb=49df1c8892aa8fc601bd34ef9c325043d655bc3a;hpb=98350275babd803daa635a2e8529feaa5e3e3c9e diff --git a/tg-export.sh b/tg-export.sh index dea24d9..6d82d55 100644 --- a/tg-export.sh +++ b/tg-export.sh @@ -27,8 +27,10 @@ while [ -n "$1" ]; do driver=quilt;; --collapse) driver=collapse;; + --linearize) + driver=linearize;; -*) - echo "Usage: tg [...] export ([--collapse] NEWBRANCH | [-b BRANCH1,BRANCH2...] --quilt DIRECTORY)" >&2 + echo "Usage: tg [...] export ([--collapse] NEWBRANCH | [-b BRANCH1,BRANCH2...] --quilt DIRECTORY | --linearize NEWBRANCH)" >&2 exit 1;; *) [ -z "$output" ] || die "output already specified ($output)" @@ -65,10 +67,9 @@ trap 'rm -rf "$playground"' EXIT # Output tree ID of a cleaned-up tree without tg's artifacts. pretty_tree() { - (export GIT_INDEX_FILE="$playground/^index" - git read-tree "$1" - git update-index --force-remove ".topmsg" ".topdeps" - git write-tree) + git ls-tree --full-tree "$1" \ + | awk -F ' ' '$2 !~ /^.top/' \ + | git mktree } create_tg_commit() @@ -183,8 +184,8 @@ quilt() echo "Skip empty patch $_dep"; else if "$numbered"; then - number="$(printf "%04u" $(($(cat "$playground/^number" 2>/dev/null) + 1)))"; - bn="$number-$bn"; + number="$(echo $(($(cat "$playground/^number" 2>/dev/null) + 1)))"; + bn="$(printf "%04u-$bn" $number)"; echo "$number" >"$playground/^number"; fi; @@ -195,10 +196,63 @@ quilt() fi } +linearize() +{ + if test ! -f "$playground/^BASE"; then + head="$(git rev-parse --verify "$_dep")" + echo "$head" > "$playground/^BASE" + git checkout -q "$head" + return; + fi; + + head=$(git rev-parse --verify HEAD) + + if [ -z "$_dep_is_tgish" ]; then + # merge in $_dep unless already included + rev="$(git rev-parse --verify "$_dep")"; + common="$(git merge-base --all HEAD "$_dep")"; + if test "$rev" = "$common"; then + # already included, just skip + :; + else + retmerge=0; + + git merge -s recursive "$_dep" || retmerge="$?"; + if test "x$retmerge" != "x0"; then + echo fix up the merge, commit and then exit; + #todo error handling + sh -i