From: "Philippe Blain via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Philippe Blain <levraiphilippeblain@gmail.com>
Subject: [PATCH v2 0/4] checkout/reset/read-tree: fix --recurse-submodules in linked worktree
Date: Tue, 21 Jan 2020 15:01:13 +0000 [thread overview]
Message-ID: <pull.523.v2.git.1579618877.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.523.git.1579263809.gitgitgadget@gmail.com>
Changes since v1:
* revert the addition of a dash in "file1 updated" by correctly using the
'tag' argument of test_commit
* improve the commit message for the 3rd patch, as suggested by Eric
* fix spacing when redirecting into 'expect' and 'actual'
* harden the tests by echoing expected values into expect, as suggested by
Stolee (I did that in both tests)
* remove test_might_fail and use test_expect_code
* add the 'git log' test suggested by Stolee
v1: This series fixes the behaviour of git checkout/reset/read-tree
--recurse-submodules when they are called in a linked worktree (created by
git worktree add).
Although submodules are cloned in $GIT_COMMON_DIR/worktrees/<name>/modules
upon issuing git submodule update in the linked worktree, any invocation of
git checkout/reset/read-tree --recurse-submodules that changes the state of
the submodule(s) will incorrectly operate on the repositories of the
submodules in the main worktree, i.e. the ones at $GIT_COMMON_DIR/modules/.
The fourth patch fixes this behaviour by using get_git_dir() instead of
git_common_dir() in submodule.c::submodule_move_head and
submodule.c::submodule_unset_core_worktree to construct the path to the
submodule repository.
The first 3 patches are clean-up patches on t7410-submodule-checkout-to.sh
(renamed to t2405-worktree-submodule.sh) to bring it up to date.
Cc:Max Kirillov max@max630.net [max@max630.net] Brandon Williams
bwilliams.eng@gmail.com [bwilliams.eng@gmail.com] Jonathan Tan
jonathantanmy@google.com [jonathantanmy@google.com] Stefan Beller
stefanbeller@gmail.com [stefanbeller@gmail.com] Nguyễn Thái Ngọc Duy
pclouds@gmail.com [pclouds@gmail.com] Eric Sunshine sunshine@sunshineco.com
[sunshine@sunshineco.com] Derrick Stolee stolee@gmail.com [stolee@gmail.com]
Philippe Blain (4):
t7410: rename to t2405-worktree-submodule.sh
t2405: use git -C and test_commit -C instead of subshells
t2405: clarify test descriptions and simplify test
submodule.c: use get_git_dir() instead of get_git_common_dir()
submodule.c | 6 +--
t/t2405-worktree-submodule.sh | 90 ++++++++++++++++++++++++++++++++
t/t7410-submodule-checkout-to.sh | 77 ---------------------------
3 files changed, 93 insertions(+), 80 deletions(-)
create mode 100755 t/t2405-worktree-submodule.sh
delete mode 100755 t/t7410-submodule-checkout-to.sh
base-commit: b4615e40a8125477e18490d868f7b65954372b43
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-523%2Fphil-blain%2Fcheckout-recurse-in-linked-worktree-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-523/phil-blain/checkout-recurse-in-linked-worktree-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/523
Range-diff vs v1:
1: ff33339690 = 1: 1a4eae1ef5 t7410: rename to t2405-worktree-submodule.sh
2: 5060ce3d64 ! 2: f06d2c4aa5 t2405: use git -C and test_commit -C instead of subshells
@@ -41,7 +41,7 @@
+ git init origin/main &&
+ git -C origin/main submodule add ../sub &&
+ git -C origin/main commit -m "add sub" &&
-+ test_commit -C origin/sub "file1-updated" file1 file1updated &&
++ test_commit -C origin/sub "file1 updated" file1 file1updated file1updated &&
git -C origin/main/sub pull &&
- (
- cd origin/main &&
@@ -53,30 +53,3 @@
'
test_expect_success 'setup: clone' '
-@@
-
- test_expect_failure 'can see submodule diffs just after checkout' '
- git -C default_checkout/main diff --submodule master"^!" >out &&
-- grep "file1 updated" out
-+ grep "file1-updated" out
- '
-
- test_expect_success 'checkout main and initialize independent clones' '
-@@
-
- test_expect_success 'can see submodule diffs after independent cloning' '
- git -C fully_cloned_submodule/main diff --submodule master"^!" >out &&
-- grep "file1 updated" out
-+ grep "file1-updated" out
- '
-
- test_expect_success 'checkout sub manually' '
-@@
-
- test_expect_success 'can see submodule diffs after manual checkout of linked submodule' '
- git -C linked_submodule/main diff --submodule master"^!" >out &&
-- grep "file1 updated" out
-+ grep "file1-updated" out
- '
-
- test_done
3: 6e0e664026 ! 3: 10727275a2 t2405: clarify test descriptions and simplify test
@@ -10,7 +10,13 @@
descriptions were not updated, keeping 'checkout' instead of using the new
terminology (linked worktrees).
- Clarify the tests by using the right terminology. While at it, remove some unnecessary
+ Also, in the test each worktree is created in
+ $TRASH_DIRECTORY/<leading-directory>/main, where the name of <leading-directory>
+ carries some information about what behavior each test verifies. This directory
+ structure is not mandatory for the tests; the worktrees can live next to one
+ another in the trash directory.
+
+ Clarify the tests by using the right terminology, and remove the unnecessary
leading directories such that all superproject worktrees are directly next to one
another in the trash directory.
@@ -44,7 +50,7 @@
- git -C default_checkout/main diff --submodule master"^!" >out &&
+test_expect_failure 'submodule is checked out just after worktree add' '
+ git -C worktree diff --submodule master"^!" >out &&
- grep "file1-updated" out
+ grep "file1 updated" out
'
-test_expect_success 'checkout main and initialize independent clones' '
@@ -60,7 +66,7 @@
- git -C fully_cloned_submodule/main diff --submodule master"^!" >out &&
+test_expect_success 'submodule is checked out just after submodule update in linked worktree' '
+ git -C worktree-submodule-update diff --submodule master"^!" >out &&
- grep "file1-updated" out
+ grep "file1 updated" out
'
-test_expect_success 'checkout sub manually' '
@@ -76,6 +82,6 @@
- git -C linked_submodule/main diff --submodule master"^!" >out &&
+test_expect_success 'submodule is checked out after manually adding submodule worktree' '
+ git -C linked_submodule diff --submodule master"^!" >out &&
- grep "file1-updated" out
+ grep "file1 updated" out
'
4: 72cdb2f95d ! 4: 614bccd31b submodule.c: use get_git_dir() instead of get_git_common_dir()
@@ -24,7 +24,7 @@
This leads to an incorrect (and confusing!) state in the submodule working tree
of the main superproject worktree.
- Additionnally, if switching to a commit where the submodule is not present,
+ Additionally, if switching to a commit where the submodule is not present,
submodule_unset_core_worktree will be called and will incorrectly remove
'core.wortree' from the config file of the submodule in the main superproject worktree,
$GIT_COMMON_DIR/modules/<name>/config.
@@ -75,30 +75,41 @@
+ test_commit -C origin/main first &&
git -C origin/main submodule add ../sub &&
git -C origin/main commit -m "add sub" &&
- test_commit -C origin/sub "file1-updated" file1 file1updated &&
+ test_commit -C origin/sub "file1 updated" file1 file1updated file1updated &&
@@
- grep "file1-updated" out
+ grep "file1 updated" out
'
+test_expect_success 'checkout --recurse-submodules uses $GIT_DIR for submodules in a linked worktree' '
+ git -C main worktree add "$base_path/checkout-recurse" --detach &&
+ git -C checkout-recurse submodule update --init &&
-+ cat checkout-recurse/sub/.git > expect-gitfile &&
-+ git -C main/sub rev-parse HEAD > expect-head-main &&
++ echo "gitdir: ../../main/.git/worktrees/checkout-recurse/modules/sub" >expect-gitfile &&
++ cat checkout-recurse/sub/.git >actual-gitfile &&
++ test_cmp expect-gitfile actual-gitfile &&
++ git -C main/sub rev-parse HEAD >expect-head-main &&
+ git -C checkout-recurse checkout --recurse-submodules HEAD~1 &&
-+ cat checkout-recurse/sub/.git > actual-gitfile &&
-+ git -C main/sub rev-parse HEAD > actual-head-main &&
++ cat checkout-recurse/sub/.git >actual-gitfile &&
++ git -C main/sub rev-parse HEAD >actual-head-main &&
+ test_cmp expect-gitfile actual-gitfile &&
+ test_cmp expect-head-main actual-head-main
+'
+
+test_expect_success 'core.worktree is removed in $GIT_DIR/modules/<name>/config, not in $GIT_COMMON_DIR/modules/<name>/config' '
-+ git -C main/sub config --get core.worktree > expect &&
++ echo "../../../sub" >expect-main &&
++ git -C main/sub config --get core.worktree >actual-main &&
++ test_cmp expect-main actual-main &&
++ echo "../../../../../../checkout-recurse/sub" >expect-linked &&
++ git -C checkout-recurse/sub config --get core.worktree >actual-linked &&
++ test_cmp expect-linked actual-linked &&
+ git -C checkout-recurse checkout --recurse-submodules first &&
-+ test_might_fail git -C main/.git/worktrees/checkout-recurse/modules/sub config --get core.worktree > linked-config &&
++ test_expect_code 1 git -C main/.git/worktrees/checkout-recurse/modules/sub config --get core.worktree >linked-config &&
+ test_must_be_empty linked-config &&
-+ test_might_fail git -C main/sub config --get core.worktree > actual &&
-+ test_cmp expect actual
++ git -C main/sub config --get core.worktree >actual-main &&
++ test_cmp expect-main actual-main
++'
++
++test_expect_success 'unsetting core.worktree does not prevent running commands directly against the submodule repository' '
++ git -C main/.git/worktrees/checkout-recurse/modules/sub log
+'
+
test_done
--
gitgitgadget
next prev parent reply other threads:[~2020-01-21 15:01 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-17 12:23 [PATCH 0/4] checkout/reset/read-tree: fix --recurse-submodules in linked worktree Philippe Blain via GitGitGadget
2020-01-17 12:23 ` [PATCH 1/4] t7410: rename to t2405-worktree-submodule.sh Philippe Blain via GitGitGadget
2020-01-17 12:23 ` [PATCH 2/4] t2405: use git -C and test_commit -C instead of subshells Philippe Blain via GitGitGadget
2020-01-17 13:45 ` Eric Sunshine
2020-01-17 20:32 ` Junio C Hamano
2020-01-18 19:50 ` Philippe Blain
2020-01-17 12:23 ` [PATCH 3/4] t2405: clarify test descriptions and simplify test Philippe Blain via GitGitGadget
2020-01-17 13:56 ` Eric Sunshine
2020-01-19 0:21 ` Philippe Blain
2020-01-19 1:41 ` Eric Sunshine
2020-01-17 12:23 ` [PATCH 4/4] submodule.c: use get_git_dir() instead of get_git_common_dir() Philippe Blain via GitGitGadget
2020-01-17 13:24 ` Derrick Stolee
2020-01-18 21:09 ` Philippe Blain
2020-01-17 13:24 ` [PATCH 0/4] checkout/reset/read-tree: fix --recurse-submodules in linked worktree Derrick Stolee
2020-01-21 15:01 ` Philippe Blain via GitGitGadget [this message]
2020-01-21 15:01 ` [PATCH v2 1/4] t7410: rename to t2405-worktree-submodule.sh Philippe Blain via GitGitGadget
2020-01-21 15:01 ` [PATCH v2 2/4] t2405: use git -C and test_commit -C instead of subshells Philippe Blain via GitGitGadget
2020-01-21 15:01 ` [PATCH v2 3/4] t2405: clarify test descriptions and simplify test Philippe Blain via GitGitGadget
2020-01-21 15:01 ` [PATCH v2 4/4] submodule.c: use get_git_dir() instead of get_git_common_dir() Philippe Blain via GitGitGadget
2020-01-22 12:55 ` [PATCH v2 0/4] checkout/reset/read-tree: fix --recurse-submodules in linked worktree Philippe Blain
2020-01-22 22:10 ` Junio C Hamano
2020-01-22 22:25 ` Philippe Blain
2020-01-24 23:00 ` Philippe Blain
2020-01-24 23:47 ` Junio C Hamano
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.523.v2.git.1579618877.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=levraiphilippeblain@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 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).