From: "SZEDER Gábor" <szeder.dev@gmail.com>
To: Elijah Newren <newren@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>,
ben.humphreys@atlassian.com,
Ben Humphreys <behumphreys@atlassian.com>
Subject: Re: [PATCH] merge-recursive: restore accidentally dropped setting of path
Date: Tue, 4 Jun 2019 15:14:00 +0200 [thread overview]
Message-ID: <20190604131400.GS951@szeder.dev> (raw)
In-Reply-To: <20190604072614.26885-1-newren@gmail.com>
On Tue, Jun 04, 2019 at 12:26:14AM -0700, Elijah Newren wrote:
> Of course, this wasn't the only bug; it also showed we had a glaring
> whole in our test coverage -- there's a dearth of tests for rename/add
> conflicts, and in particular none involving content merges for the
> rename side. So, I created a patch which adds some tests for that
> (which triggered the assertion error). I pulled SZEDER's fix into the
> same patch and added a commit message explaining the issue, using a
> Based-on-patch-by tag for the fix. SZEDER: if you'd like to see this
> in a different format (maybe I add tests which show the error and then
> in a separate patch authored by you we introduce your fix?), just let
> me know.
Nah, I'm fine with it.
> Since we're at -rc3 already, even if it is a trivial patch, I'm going to
> try to re-analyze it all tomorrow to make sure I didn't miss anything and
> see if I can find more tests to throw at it.
>
> Ben: Could you rerun all your special testcases to make sure things
> are good with this patch too? It'd be much appreciated.
>
> Thanks Ben for reporting and SZEDER for jumping on and analyzing and
> cc'ing me.
>
> Sorry for the headache folks,
Thanks for the tests!
> Subject: [PATCH] merge-recursive: restore accidentally dropped setting of path
>
> In commit 8daec1df03de ("merge-recursive: switch from (oid,mode) pairs
> to a diff_filespec", 2019-04-05), we actually switched from
> (oid,mode,path) triplets to a diff_filespec -- but most callsites in the
> patch only needed to worry about oid and mode so the commit message
> focused on that. The oversight in the commit message apparently spilled
> over to the code as will; one of the dozen or so callsites accidentally
s/will/well/
> dropped the setting of the path in the conversion. Restore the path
> setting in that location.
>
> Also, this pointed out that our testsuite was lacking a good rename/add
> test, at least one that involved the need for merge content with the
> rename. Add such a test, and since rename/add vs. add/rename could
> possibly be important, redo the merge the opposite direction to make
> sure we don't have issues with the direction of the merge. These
> testcases failed before restoring the setting of path, but with the
> paths appropriately set the testcases both pass.
>
> Reported-by: Ben Humphreys <behumphreys@atlassian.com>
> Based-on-patch-by: SZEDER Gábor <szeder.dev@gmail.com>
> Signed-off-by: Elijah Newren <newren@gmail.com>
> ---
> merge-recursive.c | 1 +
> t/t6042-merge-rename-corner-cases.sh | 118 +++++++++++++++++++++++++++
> 2 files changed, 119 insertions(+)
>
> diff --git a/merge-recursive.c b/merge-recursive.c
> index a7bcfcbeb4..d2e380b7ed 100644
> --- a/merge-recursive.c
> +++ b/merge-recursive.c
> @@ -1660,6 +1660,7 @@ static int handle_rename_add(struct merge_options *opt,
> c->path, add_branch);
>
> prev_path_desc = xstrfmt("version of %s from %s", path, a->path);
> + ci->ren1->src_entry->stages[other_stage].path = a->path;
> if (merge_mode_and_contents(opt, a, c,
> &ci->ren1->src_entry->stages[other_stage],
> prev_path_desc,
> diff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6042-merge-rename-corner-cases.sh
> index 09dfa8bd92..0793f64099 100755
> --- a/t/t6042-merge-rename-corner-cases.sh
> +++ b/t/t6042-merge-rename-corner-cases.sh
> @@ -411,6 +411,124 @@ test_expect_success 'disappearing dir in rename/directory conflict handled' '
> )
> '
>
> +# Test for basic rename/add-dest conflict, with rename needing content merge:
> +# Commit O: a
> +# Commit A: rename a->b, modifying b too
> +# Commit B: modify a, add different b
> +
> +test_expect_success 'setup rename-with-content-merge vs. add' '
> + test_create_repo rename-with-content-merge-and-add &&
> + (
> + cd rename-with-content-merge-and-add &&
> +
> + test_seq 1 5 >a &&
> + git add a &&
> + git commit -m O &&
> + git tag O &&
> +
> + git checkout -b A O &&
> + git mv a b &&
> + test_seq 0 5 >b &&
> + git add b &&
> + git commit -m A &&
> +
> + git checkout -b B O &&
> + echo 6 >>a &&
> + echo hello world >b &&
> + git add a b &&
> + git commit -m B
> + )
> +'
> +
> +test_expect_success 'handle rename-with-content-merge vs. add' '
> + (
> + cd rename-with-content-merge-and-add &&
> +
> + git checkout A^0 &&
> +
> + test_must_fail git merge -s recursive B^0 >out &&
> + test_i18ngrep "CONFLICT (rename/add)" out &&
> +
> + git ls-files -s >out &&
> + test_line_count = 2 out &&
> + git ls-files -u >out &&
> + test_line_count = 2 out &&
> + git ls-files -u b >out &&
Are these two 'git ls-files -u' executions as intended, i.e. first
without a file and then with 'b'?
Or is this a bit of a "Huh?!"-inducing way (for me; for you it might
be an idiom :) to check that 'b' has two unmerged entries and no other
file has unmerged entries?
> + test_line_count = 2 out &&
> + git ls-files -o >out &&
> + test_line_count = 1 out &&
> +
> + test_path_is_missing a &&
> + test_path_is_file b &&
> +
> + test_seq 0 6 >tmp &&
> + git hash-object tmp >expect &&
> + git rev-parse B:b >>expect &&
> + git rev-parse >actual \
> + :2:b :3:b &&
> + test_cmp expect actual &&
> +
> + # Test that the two-way merge in b is as expected
> + git cat-file -p :2:b >>ours &&
> + git cat-file -p :3:b >>theirs &&
> + >empty &&
> + test_must_fail git merge-file \
> + -L "HEAD" \
> + -L "" \
> + -L "B^0" \
> + ours empty theirs &&
> + git hash-object b >actual &&
> + git hash-object ours >expect &&
> + test_cmp expect actual
So these last three lines compute the object ids of two files and then
compare those two oids to make sure they match... But wouldn't a
'test_cmp ours b' do the trick just as well?
> + )
> +'
> +
> +test_expect_success 'handle rename-with-content-merge vs. add, merge other way' '
> + (
> + cd rename-with-content-merge-and-add &&
> +
> + git reset --hard &&
> + git clean -fdx &&
> +
> + git checkout B^0 &&
> +
> + test_must_fail git merge -s recursive A^0 >out &&
> + test_i18ngrep "CONFLICT (rename/add)" out &&
> +
> + git ls-files -s >out &&
> + test_line_count = 2 out &&
> + git ls-files -u >out &&
> + test_line_count = 2 out &&
> + git ls-files -u b >out &&
> + test_line_count = 2 out &&
> + git ls-files -o >out &&
> + test_line_count = 1 out &&
> +
> + test_path_is_missing a &&
> + test_path_is_file b &&
> +
> + test_seq 0 6 >tmp &&
> + git rev-parse B:b >expect &&
> + git hash-object tmp >>expect &&
> + git rev-parse >actual \
> + :2:b :3:b &&
> + test_cmp expect actual &&
> +
> + # Test that the two-way merge in b is as expected
> + git cat-file -p :2:b >>ours &&
> + git cat-file -p :3:b >>theirs &&
> + >empty &&
> + test_must_fail git merge-file \
> + -L "HEAD" \
> + -L "" \
> + -L "A^0" \
> + ours empty theirs &&
> + git hash-object b >actual &&
> + git hash-object ours >expect &&
> + test_cmp expect actual
> + )
> +'
> +
> # Test for all kinds of things that can go wrong with rename/rename (2to1):
> # Commit A: new files: a & b
> # Commit B: rename a->c, modify b
> --
> 2.22.0.rc3.1.g617c1f72bf
>
next prev parent reply other threads:[~2019-06-04 13:14 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-03 20:23 [ANNOUNCE] Git v2.22.0-rc3 Junio C Hamano
2019-06-04 1:32 ` Ben Humphreys
2019-06-04 2:30 ` SZEDER Gábor
2019-06-04 7:26 ` [PATCH] merge-recursive: restore accidentally dropped setting of path Elijah Newren
2019-06-04 8:33 ` Ben Humphreys
2019-06-04 13:14 ` SZEDER Gábor [this message]
2019-06-04 20:14 ` Elijah Newren
2019-06-04 20:22 ` Elijah Newren
2019-06-04 20:27 ` [PATCH v2] " Elijah Newren
2019-06-04 21:07 ` SZEDER Gábor
2019-06-04 21:33 ` Junio C Hamano
2019-06-04 22:48 ` Elijah Newren
2019-06-04 1:47 ` [ANNOUNCE] Git v2.22.0-rc3 Bhaskar Chowdhury
2019-06-04 14:45 ` Git for Windows v2.22.0-rc3, was " Johannes Schindelin
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=20190604131400.GS951@szeder.dev \
--to=szeder.dev@gmail.com \
--cc=behumphreys@atlassian.com \
--cc=ben.humphreys@atlassian.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=newren@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.