subtree: refactor split of a commit into standalone method
In a particularly complex repo, subtree split was not creating compatible splits for pushing back to a separate repo. Addressing one of the issues requires recursive handling of parent commits that were not initially considered by the algorithm. This commit makes no functional changes, but relocates the code to be called recursively into a new method to simply comparisons of later commits. Signed-off-by: Strain, Roger L <roger.strain@swri.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
f84b9b09d4
commit
565e4b7981
@ -598,6 +598,47 @@ ensure_valid_ref_format () {
|
||||
die "'$1' does not look like a ref"
|
||||
}
|
||||
|
||||
process_split_commit () {
|
||||
local rev="$1"
|
||||
local parents="$2"
|
||||
revcount=$(($revcount + 1))
|
||||
progress "$revcount/$revmax ($createcount)"
|
||||
debug "Processing commit: $rev"
|
||||
exists=$(cache_get "$rev")
|
||||
if test -n "$exists"
|
||||
then
|
||||
debug " prior: $exists"
|
||||
return
|
||||
fi
|
||||
createcount=$(($createcount + 1))
|
||||
debug " parents: $parents"
|
||||
newparents=$(cache_get $parents)
|
||||
debug " newparents: $newparents"
|
||||
|
||||
tree=$(subtree_for_commit "$rev" "$dir")
|
||||
debug " tree is: $tree"
|
||||
|
||||
check_parents $parents
|
||||
|
||||
# ugly. is there no better way to tell if this is a subtree
|
||||
# vs. a mainline commit? Does it matter?
|
||||
if test -z "$tree"
|
||||
then
|
||||
set_notree "$rev"
|
||||
if test -n "$newparents"
|
||||
then
|
||||
cache_set "$rev" "$rev"
|
||||
fi
|
||||
return
|
||||
fi
|
||||
|
||||
newrev=$(copy_or_skip "$rev" "$tree" "$newparents") || exit $?
|
||||
debug " newrev is: $newrev"
|
||||
cache_set "$rev" "$newrev"
|
||||
cache_set latest_new "$newrev"
|
||||
cache_set latest_old "$rev"
|
||||
}
|
||||
|
||||
cmd_add () {
|
||||
if test -e "$dir"
|
||||
then
|
||||
@ -706,42 +747,7 @@ cmd_split () {
|
||||
eval "$grl" |
|
||||
while read rev parents
|
||||
do
|
||||
revcount=$(($revcount + 1))
|
||||
progress "$revcount/$revmax ($createcount)"
|
||||
debug "Processing commit: $rev"
|
||||
exists=$(cache_get "$rev")
|
||||
if test -n "$exists"
|
||||
then
|
||||
debug " prior: $exists"
|
||||
continue
|
||||
fi
|
||||
createcount=$(($createcount + 1))
|
||||
debug " parents: $parents"
|
||||
newparents=$(cache_get $parents)
|
||||
debug " newparents: $newparents"
|
||||
|
||||
tree=$(subtree_for_commit "$rev" "$dir")
|
||||
debug " tree is: $tree"
|
||||
|
||||
check_parents $parents
|
||||
|
||||
# ugly. is there no better way to tell if this is a subtree
|
||||
# vs. a mainline commit? Does it matter?
|
||||
if test -z "$tree"
|
||||
then
|
||||
set_notree "$rev"
|
||||
if test -n "$newparents"
|
||||
then
|
||||
cache_set "$rev" "$rev"
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
|
||||
newrev=$(copy_or_skip "$rev" "$tree" "$newparents") || exit $?
|
||||
debug " newrev is: $newrev"
|
||||
cache_set "$rev" "$newrev"
|
||||
cache_set latest_new "$newrev"
|
||||
cache_set latest_old "$rev"
|
||||
process_split_commit "$rev" "$parents"
|
||||
done || exit $?
|
||||
|
||||
latest_new=$(cache_get latest_new)
|
||||
|
Loading…
Reference in New Issue
Block a user