Browse Source

Make --squash work with the 'add' command too.

maint
Avery Pennarun 16 years ago
parent
commit
d713e2d87a
  1. 57
      git-subtree.sh
  2. 7
      todo

57
git-subtree.sh

@ -23,7 +23,7 @@ b,branch= create a new branch from the split subtree @@ -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() @@ -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() @@ -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() @@ -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() @@ -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() @@ -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()

7
todo

@ -10,11 +10,14 @@ @@ -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

Loading…
Cancel
Save