From: Dave Ware <davidw@realtimegenomics.com>
To: git@vger.kernel.org
Cc: Dave Ware <davidw@realtimegenomics.com>
Subject: [PATCH v6] contrib/subtree: fix "subtree split" skipped-merge bug
Date: Fri, 15 Jan 2016 10:26:35 +1300 [thread overview]
Message-ID: <1452806795-26621-1-git-send-email-davidw@realtimegenomics.com> (raw)
In-Reply-To: <87bn8o97mh.fsf@waller.obbligato.org>
'git subtree split' can incorrectly skip a merge even when both parents
act on the subtree, provided the merge results in a tree identical to
one of the parents. Fix by copying the merge if at least one parent is
non-identical, and the non-identical parent is not an ancestor of the
identical parent.
Also, add a test case which checks that a descendant remains a
descendent on the subtree in this case.
Signed-off-by: Dave Ware <davidw@realtimegenomics.com>
---
contrib/subtree/git-subtree.sh | 12 ++++++--
contrib/subtree/t/t7900-subtree.sh | 60 ++++++++++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index edf36f8..5c83727 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -479,8 +479,16 @@ copy_or_skip()
p="$p -p $parent"
fi
done
-
- if [ -n "$identical" ]; then
+
+ copycommit=
+ if [ -n "$identical" ] && [ -n "$nonidentical" ]; then
+ extras=$(git rev-list --count $identical..$nonidentical)
+ if [ "$extras" -ne 0 ]; then
+ # we need to preserve history along the other branch
+ copycommit=1
+ fi
+ fi
+ if [ -n "$identical" ] && [ -z "$copycommit" ]; then
echo $identical
else
copy_commit $rev $tree "$p" || exit $?
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 751aee3..c5089c3 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -1014,4 +1014,64 @@ test_expect_success 'push split to subproj' '
)
'
+#
+# This test covers 2 cases in subtree split copy_or_skip code
+# 1) Merges where one parent is a superset of the changes of the other
+# parent regarding changes to the subtree, in this case the merge
+# commit should be copied
+# 2) Merges where only one parent operate on the subtree, and the merge
+# commit should be skipped
+#
+# (1) is checked by ensuring subtree_tip is a descendent of subtree_branch
+# (2) should have a check added (not_a_subtree_change shouldn't be present
+# on the produced subtree)
+#
+# Other related cases which are not tested (or currently handled correctly)
+# - Case (1) where there are more than 2 parents, it will sometimes correctly copy
+# the merge, and sometimes not
+# - Merge commit where both parents have same tree as the merge, currently
+# will always be skipped, even if they reached that state via different
+# set of commits.
+#
+
+next_test
+test_expect_success 'subtree descendant check' '
+ subtree_test_create_repo "$subtree_test_count" &&
+ test_create_commit "$subtree_test_count" folder_subtree/a &&
+ (
+ cd "$subtree_test_count" &&
+ git branch branch
+ ) &&
+ test_create_commit "$subtree_test_count" folder_subtree/0 &&
+ test_create_commit "$subtree_test_count" folder_subtree/b &&
+ cherry=$(cd "$subtree_test_count"; git rev-parse HEAD) &&
+ (
+ cd "$subtree_test_count" &&
+ git checkout branch
+ ) &&
+ test_create_commit "$subtree_test_count" commit_on_branch &&
+ (
+ cd "$subtree_test_count" &&
+ git cherry-pick $cherry &&
+ git checkout master &&
+ git merge -m "merge should be kept on subtree" branch &&
+ git branch no_subtree_work_branch
+ ) &&
+ test_create_commit "$subtree_test_count" folder_subtree/d &&
+ (
+ cd "$subtree_test_count" &&
+ git checkout no_subtree_work_branch
+ ) &&
+ test_create_commit "$subtree_test_count" not_a_subtree_change &&
+ (
+ cd "$subtree_test_count" &&
+ git checkout master
+ git merge -m "merge should be skipped on subtree" no_subtree_work_branch
+
+ git subtree split --prefix folder_subtree/ --branch subtree_tip master &&
+ git subtree split --prefix folder_subtree/ --branch subtree_branch branch
+ check_equal $(git rev-list --count subtree_tip..subtree_branch) 0
+ )
+'
+
test_done
--
1.9.1
next prev parent reply other threads:[~2016-01-14 21:27 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-06 22:09 git subtree bug produces divergent descendants David Ware
2015-12-07 4:53 ` Eric Sunshine
2015-12-07 20:50 ` [PATCH] contrib/subtree: fix "subtree split" skipped-merge bug Dave Ware
2015-12-08 6:49 ` Eric Sunshine
2015-12-08 20:39 ` [PATCH v3] " Dave Ware
2015-12-08 21:23 ` Junio C Hamano
2015-12-09 0:16 ` David Ware
2015-12-09 0:19 ` [PATCH v4] " Dave Ware
2015-12-09 7:52 ` Eric Sunshine
2015-12-09 21:17 ` [PATCH v5] " Dave Ware
2016-01-13 3:27 ` David A. Greene
2016-01-13 19:33 ` David Ware
2016-01-14 3:12 ` David A. Greene
2016-01-14 20:45 ` David Ware
2016-01-17 22:40 ` David A. Greene
2016-01-14 21:26 ` Dave Ware [this message]
2016-01-15 0:41 ` [PATCH v7] " Dave Ware
2016-01-15 1:06 ` Eric Sunshine
2016-01-15 18:58 ` Junio C Hamano
2016-01-15 23:24 ` Eric Sunshine
2016-01-17 22:41 ` David A. Greene
2015-12-07 21:01 ` git subtree bug produces divergent descendants David Ware
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1452806795-26621-1-git-send-email-davidw@realtimegenomics.com \
--to=davidw@realtimegenomics.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).