From: "John Cai via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>, John Cai <johncai86@gmail.com>,
John Cai <johncai86@gmail.com>
Subject: [PATCH v2] merge-ort: initialize repo in index state
Date: Sun, 08 Oct 2023 16:19:58 +0000 [thread overview]
Message-ID: <pull.1583.v2.git.git.1696781998420.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1583.git.git.1696519349407.gitgitgadget@gmail.com>
From: John Cai <johncai86@gmail.com>
initialize_attr_index() does not initialize the repo member of
attr_index. Starting in 44451a2e5e (attr: teach "--attr-source=<tree>"
global option to "git", 2023-05-06), this became a problem because
istate->repo gets passed down the call chain starting in
git_check_attr(). This gets passed all the way down to
replace_refs_enabled(), which segfaults when accessing r->gitdir.
Fix this by initializing the repository in the index state.
Signed-off-by: John Cai <johncai86@gmail.com>
Helped-by: Christian Couder <christian.couder@gmail.com>
---
merge-ort: initialize repo in index state
initialize_attr_index() does not initialize the repo member of
attr_index. Starting in 44451a2e5e (attr: teach "--attr-source=" global
option to "git", 2023-05-06), this became a problem because istate->repo
gets passed down the call chain starting in git_check_attr(). This gets
passed all the way down to replace_refs_enabled(), which segfaults when
accessing r->gitdir.
Fix this by initializing the repository in the index state.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1583%2Fjohn-cai%2Fjc%2Fpopulate-repo-when-init-attr-index-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1583/john-cai/jc/populate-repo-when-init-attr-index-v2
Pull-Request: https://github.com/git/git/pull/1583
Range-diff vs v1:
1: 80a18252b30 ! 1: e178236064a merge-ort: initialize repo in index state
@@ merge-ort.c: static void initialize_attr_index(struct merge_options *opt)
struct index_state *attr_index = &opt->priv->attr_index;
struct cache_entry *ce;
-+ attr_index->repo = the_repository;
++ attr_index->repo = opt->repo;
attr_index->initialized = 1;
if (!opt->renormalize)
@@ t/t4300-merge-tree.sh: EXPECTED
+ test_commit initial file1 foo &&
+ base=$(git rev-parse HEAD) &&
+ git checkout -b brancha &&
-+ echo bar>>file1 &&
++ echo bar >>file1 &&
+ git commit -am "adding bar" &&
+ source=$(git rev-parse HEAD) &&
-+ echo baz>>file1 &&
++ git checkout @{-1} &&
++ git checkout -b branchb &&
++ echo baz >>file1 &&
+ git commit -am "adding baz" &&
+ merge=$(git rev-parse HEAD) &&
-+ test_must_fail git --attr-source=HEAD merge-tree -z --write-tree \
-+ --merge-base "$base" --end-of-options "$source" "$merge" >out &&
-+ grep "Merge conflict in file1" out
++ git checkout -b gitattributes &&
++ test_commit "gitattributes" .gitattributes "file1 merge=union" &&
++ git checkout @{-1} &&
++ tree=$(git --attr-source=gitattributes merge-tree --write-tree \
++ --merge-base "$base" --end-of-options "$source" "$merge") &&
++ echo "foo\nbar\nbaz" >expect &&
++ git cat-file -p "$tree:file1" >actual &&
++ test_cmp expect actual
+ )
+'
+
merge-ort.c | 1 +
t/t4300-merge-tree.sh | 27 +++++++++++++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/merge-ort.c b/merge-ort.c
index 7857ce9fbd1..36537256613 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -1902,6 +1902,7 @@ static void initialize_attr_index(struct merge_options *opt)
struct index_state *attr_index = &opt->priv->attr_index;
struct cache_entry *ce;
+ attr_index->repo = opt->repo;
attr_index->initialized = 1;
if (!opt->renormalize)
diff --git a/t/t4300-merge-tree.sh b/t/t4300-merge-tree.sh
index 57c4f26e461..2929ce3bf16 100755
--- a/t/t4300-merge-tree.sh
+++ b/t/t4300-merge-tree.sh
@@ -86,6 +86,33 @@ EXPECTED
test_cmp expected actual
'
+test_expect_success '3-way merge with --attr-source' '
+ test_when_finished rm -rf 3-way &&
+ git init 3-way &&
+ (
+ cd 3-way &&
+ test_commit initial file1 foo &&
+ base=$(git rev-parse HEAD) &&
+ git checkout -b brancha &&
+ echo bar >>file1 &&
+ git commit -am "adding bar" &&
+ source=$(git rev-parse HEAD) &&
+ git checkout @{-1} &&
+ git checkout -b branchb &&
+ echo baz >>file1 &&
+ git commit -am "adding baz" &&
+ merge=$(git rev-parse HEAD) &&
+ git checkout -b gitattributes &&
+ test_commit "gitattributes" .gitattributes "file1 merge=union" &&
+ git checkout @{-1} &&
+ tree=$(git --attr-source=gitattributes merge-tree --write-tree \
+ --merge-base "$base" --end-of-options "$source" "$merge") &&
+ echo "foo\nbar\nbaz" >expect &&
+ git cat-file -p "$tree:file1" >actual &&
+ test_cmp expect actual
+ )
+'
+
test_expect_success 'file change A, B (same)' '
git reset --hard initial &&
test_commit "change-a-b-same-A" "initial-file" "AAA" &&
base-commit: 493f4622739e9b64f24b465b21aa85870dd9dc09
--
gitgitgadget
next prev parent reply other threads:[~2023-10-08 16:20 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-05 15:22 [PATCH] merge-ort: initialize repo in index state John Cai via GitGitGadget
2023-10-05 20:56 ` Junio C Hamano
2023-10-06 5:14 ` Elijah Newren
2023-10-08 16:12 ` John Cai
2023-10-08 16:19 ` John Cai via GitGitGadget [this message]
2023-10-09 13:21 ` [PATCH v3] " John Cai via GitGitGadget
2023-10-09 21:41 ` Junio C Hamano
2023-10-10 15:06 ` John Cai
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=pull.1583.v2.git.git.1696781998420.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=johncai86@gmail.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.