git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v4 2/8] worktree: add `relativeWorktrees` extension

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Nov 19, 2024, 15:07 UTC
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
Show 96 quoted lines
> Suggested-by: Junio C Hamano <gitster@pobox.com>
> Signed-off-by: Caleb White <cdwhite3@pm.me>
> ---
>   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;
> 
Previous: Caleb WhiteNext: Caleb White
Message 4 of 60 in “Allow relative worktree linking to be configured by the user”
  1. 0/8 Allow relative worktree linking to be configured by the userCaleb White, Nov 1, 2024
  2. 1/8 setup: correctly reinitialize repository versionCaleb White, Nov 1, 2024
  3. 2/8 worktree: add `relativeWorktrees` extensionCaleb White, Nov 1, 2024
  4. Phillip WoodNov 19, 2024
  5. Caleb WhiteNov 20, 2024
  6. Phillip WoodNov 22, 2024
  7. Caleb WhiteNov 22, 2024
  8. 3/8 worktree: refactor infer_backlink returnCaleb White, Nov 1, 2024
  9. Phillip WoodNov 19, 2024
  10. Caleb WhiteNov 20, 2024
  11. Phillip WoodNov 22, 2024
  12. Caleb WhiteNov 22, 2024
  13. 4/8 worktree: add `write_worktree_linking_files()` functionCaleb White, Nov 1, 2024
  14. 6/8 worktree: add relative cli/config options to `move` commandCaleb White, Nov 1, 2024
  15. Phillip WoodNov 22, 2024
  16. Caleb WhiteNov 23, 2024
  17. 5/8 worktree: add relative cli/config options to `add` commandCaleb White, Nov 1, 2024
  18. Phillip WoodNov 19, 2024
  19. Caleb WhiteNov 20, 2024
  20. phillip.wood123@gmail.comNov 22, 2024
  21. Caleb WhiteNov 23, 2024
  22. 7/8 worktree: add relative cli/config options to `repair` commandCaleb White, Nov 1, 2024
  23. Phillip WoodNov 22, 2024
  24. Caleb WhiteNov 23, 2024
  25. phillip.wood123@gmail.comNov 24, 2024
  26. Caleb WhiteNov 26, 2024
  27. 8/8 worktree: refactor `repair_worktree_after_gitdir_move()`Caleb White, Nov 1, 2024
  28. Phillip WoodNov 22, 2024
  29. Caleb WhiteNov 23, 2024
  30. Junio C HamanoNov 1, 2024
  31. Caleb WhiteNov 1, 2024
  32. Junio C HamanoNov 2, 2024
  33. Kristoffer HaugsbakkNov 2, 2024
  34. Phillip WoodNov 22, 2024
  35. Caleb WhiteNov 23, 2024
  36. 0/8 Allow relative worktree linking to be configured by the userCaleb White, Nov 26, 2024
  37. 1/8 setup: correctly reinitialize repository versionCaleb White, Nov 26, 2024
  38. 2/8 worktree: add `relativeWorktrees` extensionCaleb White, Nov 26, 2024
  39. 3/8 worktree: refactor infer_backlink returnCaleb White, Nov 26, 2024
  40. 4/8 worktree: add `write_worktree_linking_files()` functionCaleb White, Nov 26, 2024
  41. 5/8 worktree: add relative cli/config options to `add` commandCaleb White, Nov 26, 2024
  42. 6/8 worktree: add relative cli/config options to `move` commandCaleb White, Nov 26, 2024
  43. 7/8 worktree: add relative cli/config options to `repair` commandCaleb White, Nov 26, 2024
  44. 8/8 worktree: refactor `repair_worktree_after_gitdir_move()`Caleb White, Nov 26, 2024
  45. Junio C HamanoNov 26, 2024
  46. Caleb WhiteNov 26, 2024
  47. Phillip WoodNov 28, 2024
  48. Caleb WhiteNov 28, 2024
  49. 0/8 Allow relative worktree linking to be configured by the userCaleb White, Nov 29, 2024
  50. 1/8 setup: correctly reinitialize repository versionCaleb White, Nov 29, 2024
  51. 2/8 worktree: add `relativeWorktrees` extensionCaleb White, Nov 29, 2024
  52. 3/8 worktree: refactor infer_backlink returnCaleb White, Nov 29, 2024
  53. 4/8 worktree: add `write_worktree_linking_files()` functionCaleb White, Nov 29, 2024
  54. 5/8 worktree: add relative cli/config options to `add` commandCaleb White, Nov 29, 2024
  55. 6/8 worktree: add relative cli/config options to `move` commandCaleb White, Nov 29, 2024
  56. 7/8 worktree: add relative cli/config options to `repair` commandCaleb White, Nov 29, 2024
  57. 8/8 worktree: refactor `repair_worktree_after_gitdir_move()`Caleb White, Nov 29, 2024
  58. Phillip WoodDec 2, 2024
  59. Junio C HamanoDec 3, 2024
  60. Caleb WhiteDec 3, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.