Code

'git subtree split' now basically works.
authorAvery Pennarun <apenwarr@gmail.com>
Fri, 24 Apr 2009 18:24:38 +0000 (14:24 -0400)
committerAvery Pennarun <apenwarr@gmail.com>
Fri, 24 Apr 2009 18:24:38 +0000 (14:24 -0400)
git-subtree.sh

index 5e5b27f8ad065341287d5183aba656b05cc9c9f1..c59759baa63c241170fd112de907b32da65d6ccb 100755 (executable)
@@ -28,6 +28,16 @@ debug()
        fi
 }
 
+assert()
+{
+       if "$@"; then
+               :
+       else
+               die "assertion failed: " "$@"
+       fi
+}
+
+
 #echo "Options: $*"
 
 while [ $# -gt 0 ]; do
@@ -63,7 +73,7 @@ debug "dir: {$dir}"
 
 cache_setup()
 {
-       cachedir="$GIT_DIR/subtree-cache/$dir"
+       cachedir="$GIT_DIR/subtree-cache/$$"
        rm -rf "$cachedir" || die "Can't delete old cachedir: $cachedir"
        mkdir -p "$cachedir" || die "Can't create new cachedir: $cachedir"
        debug "Using cachedir: $cachedir" >&2
@@ -98,19 +108,23 @@ cmd_split()
        git rev-list --reverse --parents $revs -- "$dir" |
        while read rev parents; do
                newparents=$(cache_get $parents)
-               echo "rev: $rev / $newparents"
+               debug
+               debug "Processing commit: $rev / $newparents"
                
                git ls-tree $rev -- "$dir" |
                while read mode type tree name; do
+                       assert [ "$name" = "$dir" ]
+                       debug "  tree is: $tree"
                        p=""
                        for parent in $newparents; do
                                p="$p -p $parent"
                        done
                        newrev=$(echo synthetic | git commit-tree $tree $p) \
                                || die "Can't create new commit for $rev / $tree"
+                       echo "  newrev is: $newrev"
                        cache_set $rev $newrev
-               done
-       done
+               done || exit $?
+       done || exit $?
        
        exit 0
 }