From: Phillip Wood Date: Tue, 19 Nov 2024 15:07:52 GMT Subject: Re: [PATCH v4 2/8] worktree: add `relativeWorktrees` extension Message-ID: <47f2b6bf-1e10-4b01-8365-467cc5ca7779@gmail.com> In-Reply-To: <20241031-wt_relative_options-v4-2-07a3dc0f02a3@pm.me> Hi Caleb On 01/11/2024 04:38, Caleb White wrote: > A new extension, `relativeWorktrees`, is added to indicate that at least > one worktree in the repository has been linked with relative paths. Out of interest what happens in the later patches if we add a worktree with a relative path which sets this extension and then convert it to an absolute path? Will we clear this extension or do we leave it set? I'm mainly curious, I don't think it's the end of the world if we leave the extension set. > This ensures older Git versions do not attempt to automatically prune > worktrees with relative paths, as they would not not recognize the > paths as being valid. Sounds sensible. I'm not familiar with the code that handles repository extensions but the patch below looks reasonable to a layman. Best Wishes Phillip > Suggested-by: Junio C Hamano > Signed-off-by: Caleb White > --- > Documentation/config/extensions.txt | 6 ++++++ > repository.c | 1 + > repository.h | 1 + > setup.c | 7 +++++++ > setup.h | 1 + > 5 files changed, 16 insertions(+) > > diff --git a/Documentation/config/extensions.txt b/Documentation/config/extensions.txt > index 5dc569d1c9c77c15e32441493289f9c9dd5e7f0b..5cb4721a0e0ae1ed64f90492c0dc18b96473cb33 100644 > --- a/Documentation/config/extensions.txt > +++ b/Documentation/config/extensions.txt > @@ -63,6 +63,12 @@ Note that this setting should only be set by linkgit:git-init[1] or > linkgit:git-clone[1]. Trying to change it after initialization will not > work and will produce hard-to-diagnose issues. > > +relativeWorktrees:: > + If enabled, indicates at least one worktree has been linked with > + relative paths. Automatically set if a worktree has been created or > + repaired with either the `--relative-paths` option or with the > + `worktree.useRelativePaths` config set to `true`. > + > worktreeConfig:: > If enabled, then worktrees will load config settings from the > `$GIT_DIR/config.worktree` file in addition to the > diff --git a/repository.c b/repository.c > index f988b8ae68a6a29792e7f2c980a02bd0e388a3b9..1a6a62bbd03a5dc4fdade3eb45ea2696968abc23 100644 > --- a/repository.c > +++ b/repository.c > @@ -283,6 +283,7 @@ int repo_init(struct repository *repo, > repo_set_compat_hash_algo(repo, format.compat_hash_algo); > repo_set_ref_storage_format(repo, format.ref_storage_format); > repo->repository_format_worktree_config = format.worktree_config; > + repo->repository_format_relative_worktrees = format.relative_worktrees; > > /* take ownership of format.partial_clone */ > repo->repository_format_partial_clone = format.partial_clone; > diff --git a/repository.h b/repository.h > index 24a66a496a6ff516ce06d47b7329b3d36eb701ca..c4c92b2ab9c9e3b425dc2974636e33d1f4089c69 100644 > --- a/repository.h > +++ b/repository.h > @@ -150,6 +150,7 @@ struct repository { > > /* Configurations */ > int repository_format_worktree_config; > + int repository_format_relative_worktrees; > > /* Indicate if a repository has a different 'commondir' from 'gitdir' */ > unsigned different_commondir:1; > diff --git a/setup.c b/setup.c > index 1e5c2eacb19eb6b230d7c9954f66fc7ae0b05631..39ff48d9dc5d67b16159c6cca66ff2663bbba6cf 100644 > --- a/setup.c > +++ b/setup.c > @@ -683,6 +683,9 @@ static enum extension_result handle_extension(const char *var, > "extensions.refstorage", value); > data->ref_storage_format = format; > return EXTENSION_OK; > + } else if (!strcmp(ext, "relativeworktrees")) { > + data->relative_worktrees = git_config_bool(var, value); > + return EXTENSION_OK; > } > return EXTENSION_UNKNOWN; > } > @@ -1854,6 +1857,8 @@ const char *setup_git_directory_gently(int *nongit_ok) > repo_fmt.ref_storage_format); > the_repository->repository_format_worktree_config = > repo_fmt.worktree_config; > + the_repository->repository_format_relative_worktrees = > + repo_fmt.relative_worktrees; > /* take ownership of repo_fmt.partial_clone */ > the_repository->repository_format_partial_clone = > repo_fmt.partial_clone; > @@ -1950,6 +1955,8 @@ void check_repository_format(struct repository_format *fmt) > fmt->ref_storage_format); > the_repository->repository_format_worktree_config = > fmt->worktree_config; > + the_repository->repository_format_relative_worktrees = > + fmt->relative_worktrees; > the_repository->repository_format_partial_clone = > xstrdup_or_null(fmt->partial_clone); > clear_repository_format(&repo_fmt); > diff --git a/setup.h b/setup.h > index e496ab3e4de580c2d9f95a7ea0eaf90e0d41b070..18dc3b73686ce28fac2fe04282ce95f8bf3e6b74 100644 > --- a/setup.h > +++ b/setup.h > @@ -129,6 +129,7 @@ struct repository_format { > int precious_objects; > char *partial_clone; /* value of extensions.partialclone */ > int worktree_config; > + int relative_worktrees; > int is_bare; > int hash_algo; > int compat_hash_algo; >