From d713e2d87a5003da02d95a4ac5be28a1e9fdc3ce Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Sat, 30 May 2009 04:11:43 -0400 Subject: [PATCH] Make --squash work with the 'add' command too. --- git-subtree.sh | 57 ++++++++++++++++++++++++++++++++++---------------- todo | 7 +++++-- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/git-subtree.sh b/git-subtree.sh index 1fff10e85..962d5ff50 100755 --- a/git-subtree.sh +++ b/git-subtree.sh @@ -23,7 +23,7 @@ b,branch= create a new branch from the split subtree ignore-joins ignore prior --rejoin commits onto= try connecting new tree to an existing one rejoin merge the new branch back into HEAD - options for 'merge' and 'pull' + options for 'add', 'merge', and 'pull' squash merge subtree changes as a single commit " eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?) @@ -169,11 +169,16 @@ try_remove_previous() find_latest_squash() { - debug "Looking for latest squash..." + debug "Looking for latest squash ($dir)..." dir="$1" + sq= + main= + sub= git log --grep="^git-subtree-dir: $dir\$" \ --pretty=format:'START %H%n%s%n%n%b%nEND%n' HEAD | while read a b junk; do + debug "$a $b $junk" + debug "{{$sq/$main/$sub}}" case "$a" in START) sq="$b" ;; git-subtree-mainline:) main="$b" ;; @@ -202,6 +207,8 @@ find_existing_splits() debug "Looking for prior splits..." dir="$1" revs="$2" + main= + sub= git log --grep="^git-subtree-dir: $dir\$" \ --pretty=format:'START %H%n%s%n%n%b%nEND%n' $revs | while read a b junk; do @@ -284,21 +291,21 @@ squash_msg() dir="$1" oldsub="$2" newsub="$3" - oldsub_short=$(git rev-parse --short "$oldsub") newsub_short=$(git rev-parse --short "$newsub") - cat <<-EOF - Squashed '$dir/' changes from $oldsub_short..$newsub_short - - EOF - git log --pretty=tformat:'%h %s' "$oldsub..$newsub" - git log --pretty=tformat:'REVERT: %h %s' "$newsub..$oldsub" + if [ -n "$oldsub" ]; then + oldsub_short=$(git rev-parse --short "$oldsub") + echo "Squashed '$dir/' changes from $oldsub_short..$newsub_short" + echo + git log --pretty=tformat:'%h %s' "$oldsub..$newsub" + git log --pretty=tformat:'REVERT: %h %s' "$newsub..$oldsub" + else + echo "Squashed '$dir/' content from commit $newsub_short" + fi - cat <<-EOF - - git-subtree-dir: $dir - git-subtree-split: $newsub - EOF + echo + echo "git-subtree-dir: $dir" + echo "git-subtree-split: $newsub" } toptree_for_commit() @@ -341,8 +348,13 @@ new_squash_commit() oldsub="$2" newsub="$3" tree=$(toptree_for_commit $newsub) || exit $? - squash_msg "$dir" "$oldsub" "$newsub" | - git commit-tree "$tree" -p "$old" || exit $? + if [ -n "$old" ]; then + squash_msg "$dir" "$oldsub" "$newsub" | + git commit-tree "$tree" -p "$old" || exit $? + else + squash_msg "$dir" "" "$newsub" | + git commit-tree "$tree" || exit $? + fi } copy_or_skip() @@ -422,9 +434,18 @@ cmd_add() else headp= fi - commit=$(add_msg "$dir" "$headrev" "$rev" | - git commit-tree $tree $headp -p "$rev") || exit $? + + if [ -n "$squash" ]; then + rev=$(new_squash_commit "" "" "$rev") || exit $? + commit=$(echo "Merge commit '$rev' as '$dir'" | + git commit-tree $tree $headp -p "$rev") || exit $? + else + commit=$(add_msg "$dir" "$headrev" "$rev" | + git commit-tree $tree $headp -p "$rev") || exit $? + fi git reset "$commit" || exit $? + + say "Added dir '$dir'" } cmd_split() diff --git a/todo b/todo index f23a6d4ff..a15a378da 100644 --- a/todo +++ b/todo @@ -10,11 +10,14 @@ "-s subtree" should be given an explicit subtree option? There doesn't seem to be a way to do this. We'd have to patch git-merge-subtree. Ugh. + (but we could avoid this problem by generating squashes with + exactly the right subtree structure, rather than using + subtree merge...) add a 'push' subcommand to parallel 'pull' add a 'log' subcommand to see what's new in a subtree? - add a --squash option so we don't merge histories but can still split - add to-submodule and from-submodule commands + + automated tests for --squash stuff -- 2.30.2