Merge branch 'ds/sparse-checkout-requires-per-worktree-config'

"git sparse-checkout" wants to work with per-worktree configuration,
but did not work well in a worktree attached to a bare repository.

* ds/sparse-checkout-requires-per-worktree-config:
  config: make git_configset_get_string_tmp() private
  worktree: copy sparse-checkout patterns and config on add
  sparse-checkout: set worktree-config correctly
  config: add repo_config_set_worktree_gently()
  worktree: create init_worktree_config()
  Documentation: add extensions.worktreeConfig details
This commit is contained in:
Junio C Hamano
2022-02-25 15:47:33 -08:00
13 changed files with 353 additions and 49 deletions

View File

@ -21,6 +21,7 @@
#include "dir.h"
#include "color.h"
#include "refs.h"
#include "worktree.h"
struct config_source {
struct config_source *prev;
@ -2294,8 +2295,8 @@ int git_configset_get_string(struct config_set *cs, const char *key, char **dest
return 1;
}
int git_configset_get_string_tmp(struct config_set *cs, const char *key,
const char **dest)
static int git_configset_get_string_tmp(struct config_set *cs, const char *key,
const char **dest)
{
const char *value;
if (!git_configset_get_value(cs, key, &value)) {
@ -3000,6 +3001,20 @@ int git_config_set_gently(const char *key, const char *value)
return git_config_set_multivar_gently(key, value, NULL, 0);
}
int repo_config_set_worktree_gently(struct repository *r,
const char *key, const char *value)
{
/* Only use worktree-specific config if it is is already enabled. */
if (repository_format_worktree_config) {
char *file = repo_git_path(r, "config.worktree");
int ret = git_config_set_multivar_in_file_gently(
file, key, value, NULL, 0);
free(file);
return ret;
}
return repo_config_set_multivar_gently(r, key, value, NULL, 0);
}
void git_config_set(const char *key, const char *value)
{
git_config_set_multivar(key, value, NULL, 0);
@ -3297,14 +3312,28 @@ void git_config_set_multivar_in_file(const char *config_filename,
int git_config_set_multivar_gently(const char *key, const char *value,
const char *value_pattern, unsigned flags)
{
return git_config_set_multivar_in_file_gently(NULL, key, value, value_pattern,
flags);
return repo_config_set_multivar_gently(the_repository, key, value,
value_pattern, flags);
}
int repo_config_set_multivar_gently(struct repository *r, const char *key,
const char *value,
const char *value_pattern, unsigned flags)
{
char *file = repo_git_path(r, "config");
int res = git_config_set_multivar_in_file_gently(file,
key, value,
value_pattern,
flags);
free(file);
return res;
}
void git_config_set_multivar(const char *key, const char *value,
const char *value_pattern, unsigned flags)
{
git_config_set_multivar_in_file(NULL, key, value, value_pattern,
git_config_set_multivar_in_file(git_path("config"),
key, value, value_pattern,
flags);
}