From 0a562948ae1fe7130f4e9a29ce4107311ab93b91 Mon Sep 17 00:00:00 2001 From: Jakub Suder Date: Sat, 9 Jan 2010 19:56:05 +0100 Subject: [PATCH] allow using --branch with existing branches if it makes sense --- git-subtree.sh | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/git-subtree.sh b/git-subtree.sh index 96118735b..09992e39d 100755 --- a/git-subtree.sh +++ b/git-subtree.sh @@ -161,6 +161,20 @@ rev_exists() fi } +rev_is_descendant_of_branch() +{ + newrev="$1" + branch="$2" + branch_hash=$(git rev-parse $branch) + match=$(git rev-list $newrev | grep $branch_hash) + + if [ -n "$match" ]; then + return 0 + else + return 1 + fi +} + # if a commit doesn't have a parent, this might not work. But we only want # to remove the parent from the rev-list, and since it doesn't exist, it won't # be there anyway, so do nothing in that case. @@ -476,10 +490,6 @@ cmd_add() cmd_split() { - if [ -n "$branch" ] && rev_exists "refs/heads/$branch"; then - die "Branch '$branch' already exists." - fi - debug "Splitting $dir..." cache_setup || exit $? @@ -510,7 +520,8 @@ cmd_split() eval "$grl" | while read rev parents; do revcount=$(($revcount + 1)) - say -n "$revcount/$revmax ($createcount) " + say -n "$revcount/$revmax ($createcount) +" debug "Processing commit: $rev" exists=$(cache_get $rev) if [ -n "$exists" ]; then @@ -548,9 +559,16 @@ cmd_split() $latest_new >&2 || exit $? fi if [ -n "$branch" ]; then - git update-ref -m 'subtree split' "refs/heads/$branch" \ - $latest_new "" || exit $? - say "Created branch '$branch'" + if rev_exists "refs/heads/$branch"; then + if ! rev_is_descendant_of_branch $latest_new $branch; then + die "Branch '$branch' is not an ancestor of commit '$latest_new'." + fi + action='Updated' + else + action='Created' + fi + git update-ref -m 'subtree split' "refs/heads/$branch" $latest_new || exit $? + say "$action branch '$branch'" fi echo $latest_new exit 0 -- 2.26.2