From: Phillip Wood <phillip.wood123@gmail.com>
To: Caleb White <cdwhite3@pm.me>, git@vger.kernel.org
Cc: Taylor Blau <me@ttaylorr.com>, Junio C Hamano <gitster@pobox.com>,
Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH v4 8/8] worktree: refactor `repair_worktree_after_gitdir_move()`
Date: Fri, 22 Nov 2024 15:58:20 +0000 [thread overview]
Message-ID: <50187d7d-2a96-4df2-baaa-ea27c9bd5dcf@gmail.com> (raw)
In-Reply-To: <20241031-wt_relative_options-v4-8-07a3dc0f02a3@pm.me>
Hi Caleb
On 01/11/2024 04:39, Caleb White wrote:
> This refactors `repair_worktree_after_gitdir_move()` to use the new
> `write_worktree_linking_files` function. It also preserves the
> relativity of the linking files; e.g., if an existing worktree used
> absolute paths then the repaired paths will be absolute (and visa-versa).
It would be helpful to give a brief explanation of what this function is
used for as it seems to be called from setup.c rather than as part of
"git worktree repair"
> This also adds a test case for reinitializing a repository that has
> relative worktrees.
I'm not sure exactly what this is doing - are we breaking something and
then calling "git init" to repair it?
My understanding of what this function is trying to do is rather limited
but as far as I can see the conversion looks OK though the strbuf
changes are quite distracting.
> Signed-off-by: Caleb White <cdwhite3@pm.me>
> ---
> t/t0001-init.sh | 22 ++++++++++++++++++----
> worktree.c | 29 ++++++++---------------------
> 2 files changed, 26 insertions(+), 25 deletions(-)
>
> diff --git a/t/t0001-init.sh b/t/t0001-init.sh
> index 0178aa62a41f1606f2382a4a10ab593ccf11e0e8..264951592a711f6879555b785905e799db6c5dd4 100755
> --- a/t/t0001-init.sh
> +++ b/t/t0001-init.sh
> @@ -434,6 +434,12 @@ test_expect_success SYMLINKS 're-init to move gitdir symlink' '
> sep_git_dir_worktree () {
> test_when_finished "rm -rf mainwt linkwt seprepo" &&
> git init mainwt &&
> + if test "relative" = $2
> + then
> + git -C mainwt config worktree.useRelativePaths true
test_config is your friend here (it accepts -C <repo>)
Best Wishes
Phillip
> + else
> + git -C mainwt config worktree.useRelativePaths false
> + fi
> test_commit -C mainwt gumby &&
> git -C mainwt worktree add --detach ../linkwt &&
> git -C "$1" init --separate-git-dir ../seprepo &&
> @@ -442,12 +448,20 @@ sep_git_dir_worktree () {
> test_cmp expect actual
> }
>
> -test_expect_success 're-init to move gitdir with linked worktrees' '
> - sep_git_dir_worktree mainwt
> +test_expect_success 're-init to move gitdir with linked worktrees (absolute)' '
> + sep_git_dir_worktree mainwt absolute
> +'
> +
> +test_expect_success 're-init to move gitdir within linked worktree (absolute)' '
> + sep_git_dir_worktree linkwt absolute
> +'
> +
> +test_expect_success 're-init to move gitdir with linked worktrees (relative)' '
> + sep_git_dir_worktree mainwt relative
> '
>
> -test_expect_success 're-init to move gitdir within linked worktree' '
> - sep_git_dir_worktree linkwt
> +test_expect_success 're-init to move gitdir within linked worktree (relative)' '
> + sep_git_dir_worktree linkwt relative
> '
>
> test_expect_success MINGW '.git hidden' '
> diff --git a/worktree.c b/worktree.c
> index 2cb994ac462debf966ac51b5a4f33c30cfebd4ef..2c2e9fd8fdc22d4fe3705227d72b8dbd293038b2 100644
> --- a/worktree.c
> +++ b/worktree.c
> @@ -653,45 +653,32 @@ void repair_worktrees(worktree_repair_fn fn, void *cb_data, int use_relative_pat
>
> void repair_worktree_after_gitdir_move(struct worktree *wt, const char *old_path)
> {
> - struct strbuf path = STRBUF_INIT;
> - struct strbuf repo = STRBUF_INIT;
> struct strbuf gitdir = STRBUF_INIT;
> struct strbuf dotgit = STRBUF_INIT;
> - struct strbuf olddotgit = STRBUF_INIT;
> - struct strbuf tmp = STRBUF_INIT;
> + int is_relative_path;
>
> if (is_main_worktree(wt))
> goto done;
>
> - strbuf_realpath(&repo, git_common_path("worktrees/%s", wt->id), 1);
> - strbuf_addf(&gitdir, "%s/gitdir", repo.buf);
> + strbuf_realpath(&gitdir, git_common_path("worktrees/%s/gitdir", wt->id), 1);
>
> - if (strbuf_read_file(&olddotgit, gitdir.buf, 0) < 0)
> + if (strbuf_read_file(&dotgit, gitdir.buf, 0) < 0)
> goto done;
>
> - strbuf_rtrim(&olddotgit);
> - if (is_absolute_path(olddotgit.buf)) {
> - strbuf_addbuf(&dotgit, &olddotgit);
> - } else {
> - strbuf_addf(&dotgit, "%s/worktrees/%s/%s", old_path, wt->id, olddotgit.buf);
> + strbuf_rtrim(&dotgit);
> + is_relative_path = ! is_absolute_path(dotgit.buf);
> + if (is_relative_path) {
> + strbuf_insertf(&dotgit, 0, "%s/worktrees/%s/", old_path, wt->id);
> strbuf_realpath_forgiving(&dotgit, dotgit.buf, 0);
> }
>
> if (!file_exists(dotgit.buf))
> goto done;
>
> - strbuf_addbuf(&path, &dotgit);
> - strbuf_strip_suffix(&path, "/.git");
> -
> - write_file(dotgit.buf, "gitdir: %s", relative_path(repo.buf, path.buf, &tmp));
> - write_file(gitdir.buf, "%s", relative_path(dotgit.buf, repo.buf, &tmp));
> + write_worktree_linking_files(dotgit, gitdir, is_relative_path);
> done:
> - strbuf_release(&path);
> - strbuf_release(&repo);
> strbuf_release(&gitdir);
> strbuf_release(&dotgit);
> - strbuf_release(&olddotgit);
> - strbuf_release(&tmp);
> }
>
> void repair_worktrees_after_gitdir_move(const char *old_path)
>
next prev parent reply other threads:[~2024-11-22 15:58 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-01 4:38 [PATCH v4 0/8] Allow relative worktree linking to be configured by the user Caleb White
2024-11-01 4:38 ` [PATCH v4 1/8] setup: correctly reinitialize repository version Caleb White
2024-11-01 4:38 ` [PATCH v4 2/8] worktree: add `relativeWorktrees` extension Caleb White
2024-11-19 15:07 ` Phillip Wood
2024-11-20 5:13 ` Caleb White
2024-11-22 16:44 ` Phillip Wood
2024-11-22 19:27 ` Caleb White
2024-11-01 4:38 ` [PATCH v4 3/8] worktree: refactor infer_backlink return Caleb White
2024-11-19 15:08 ` Phillip Wood
2024-11-20 5:20 ` Caleb White
2024-11-22 16:44 ` Phillip Wood
2024-11-22 19:26 ` Caleb White
2024-11-01 4:38 ` [PATCH v4 4/8] worktree: add `write_worktree_linking_files()` function Caleb White
2024-11-01 4:38 ` [PATCH v4 5/8] worktree: add relative cli/config options to `add` command Caleb White
2024-11-19 15:07 ` Phillip Wood
2024-11-20 5:01 ` Caleb White
2024-11-22 16:44 ` phillip.wood123
2024-11-23 4:40 ` Caleb White
2024-11-01 4:38 ` [PATCH v4 6/8] worktree: add relative cli/config options to `move` command Caleb White
2024-11-22 15:55 ` Phillip Wood
2024-11-23 4:11 ` Caleb White
2024-11-01 4:38 ` [PATCH v4 7/8] worktree: add relative cli/config options to `repair` command Caleb White
2024-11-22 15:55 ` Phillip Wood
2024-11-23 5:41 ` Caleb White
2024-11-24 19:27 ` phillip.wood123
2024-11-26 0:00 ` Caleb White
2024-11-01 4:39 ` [PATCH v4 8/8] worktree: refactor `repair_worktree_after_gitdir_move()` Caleb White
2024-11-22 15:58 ` Phillip Wood [this message]
2024-11-23 4:36 ` Caleb White
2024-11-01 7:14 ` [PATCH v4 0/8] Allow relative worktree linking to be configured by the user Junio C Hamano
2024-11-01 13:18 ` Caleb White
2024-11-02 10:09 ` Junio C Hamano
2024-11-02 14:36 ` Kristoffer Haugsbakk
2024-11-22 15:57 ` Phillip Wood
2024-11-23 5:45 ` Caleb White
2024-11-26 1:51 ` [PATCH v5 " Caleb White
2024-11-26 1:51 ` [PATCH v5 1/8] setup: correctly reinitialize repository version Caleb White
2024-11-26 1:51 ` [PATCH v5 2/8] worktree: add `relativeWorktrees` extension Caleb White
2024-11-26 1:51 ` [PATCH v5 3/8] worktree: refactor infer_backlink return Caleb White
2024-11-26 1:51 ` [PATCH v5 4/8] worktree: add `write_worktree_linking_files()` function Caleb White
2024-11-26 1:52 ` [PATCH v5 5/8] worktree: add relative cli/config options to `add` command Caleb White
2024-11-26 1:52 ` [PATCH v5 6/8] worktree: add relative cli/config options to `move` command Caleb White
2024-11-26 1:52 ` [PATCH v5 7/8] worktree: add relative cli/config options to `repair` command Caleb White
2024-11-26 1:52 ` [PATCH v5 8/8] worktree: refactor `repair_worktree_after_gitdir_move()` Caleb White
2024-11-26 6:18 ` [PATCH v5 0/8] Allow relative worktree linking to be configured by the user Junio C Hamano
2024-11-26 17:02 ` Caleb White
2024-11-28 14:44 ` Phillip Wood
2024-11-28 17:58 ` Caleb White
2024-11-29 22:22 ` [PATCH v6 " Caleb White
2024-11-29 22:22 ` [PATCH v6 1/8] setup: correctly reinitialize repository version Caleb White
2024-11-29 22:22 ` [PATCH v6 2/8] worktree: add `relativeWorktrees` extension Caleb White
2024-11-29 22:22 ` [PATCH v6 3/8] worktree: refactor infer_backlink return Caleb White
2024-11-29 22:22 ` [PATCH v6 4/8] worktree: add `write_worktree_linking_files()` function Caleb White
2024-11-29 22:22 ` [PATCH v6 5/8] worktree: add relative cli/config options to `add` command Caleb White
2024-11-29 22:23 ` [PATCH v6 6/8] worktree: add relative cli/config options to `move` command Caleb White
2024-11-29 22:23 ` [PATCH v6 7/8] worktree: add relative cli/config options to `repair` command Caleb White
2024-11-29 22:23 ` [PATCH v6 8/8] worktree: refactor `repair_worktree_after_gitdir_move()` Caleb White
2024-12-02 14:57 ` [PATCH v6 0/8] Allow relative worktree linking to be configured by the user Phillip Wood
2024-12-03 4:54 ` Junio C Hamano
2024-12-03 5:21 ` Caleb White
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=50187d7d-2a96-4df2-baaa-ea27c9bd5dcf@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=cdwhite3@pm.me \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=me@ttaylorr.com \
--cc=phillip.wood@dunelm.org.uk \
--cc=sunshine@sunshineco.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.