@@ -244,7 +244,7 @@ check_parents () {
do
if ! test -r "$cachedir/notree/$miss"
then
- debug " incorrect order: $miss"
+ debug " unprocessed parent commit: $miss ($indent)"
process_split_commit "$miss" "" "$indent"
fi
done
@@ -392,6 +392,26 @@ find_existing_splits () {
done
}
+find_mainline_ref () {
+ debug "Looking for first split..."
+ dir="$1"
+ revs="$2"
+ main=
+ sub=
+ local grep_format="^git-subtree-dir: $dir/*\$"
+ git log --reverse --grep="$grep_format" \
+ --no-show-signature --pretty=format:'START %H%n%s%n%n%b%nEND%n' $revs |
+ while read a b junk
+ do
+ case "$a" in
+ git-subtree-mainline:)
+ echo "$b"
+ return
+ ;;
+ esac
+ done
+}
+
copy_commit () {
# We're going to set some environment vars here, so
# do it in a subshell to get rid of them safely later
@@ -646,9 +666,9 @@ process_split_commit () {
progress "$revcount/$revmax ($createcount) [$extracount]"
- debug "Processing commit: $rev"
+ debug "Processing commit: $rev ($indent)"
exists=$(cache_get "$rev")
- if test -n "$exists"
+ if test -z "$(cache_miss "$rev")"
then
debug " prior: $exists"
return
@@ -773,6 +793,17 @@ cmd_split () {
unrevs="$(find_existing_splits "$dir" "$revs")"
+ mainline="$(find_mainline_ref "$dir" "$revs")"
+ if test -n "$mainline"
+ then
+ debug "Mainline $mainline predates subtree add"
+ git rev-list --topo-order --skip=1 $mainline |
+ while read rev
+ do
+ cache_set "$rev" ""
+ done || exit $?
+ fi
+
# We can't restrict rev-list to only $dir here, because some of our
# parents have the $dir contents the root, and those won't match.
# (and rev-list --follow doesn't seem to solve this)