Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -3481,11 +3481,11 @@ static GIT_PATH_FUNC(git_path_info_exclude, "info/exclude")

void setup_standard_excludes(struct dir_struct *dir)
{
const char *excludes_file = repo_excludes_file(the_repository);

dir->exclude_per_dir = ".gitignore";

/* core.excludesfile defaulting to $XDG_CONFIG_HOME/git/ignore */
if (!excludes_file)
excludes_file = xdg_config_home("ignore");
if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
add_patterns_from_file_1(dir, excludes_file,
dir->untracked ? &dir->internal.ss_excludes_file : NULL);
Expand Down
33 changes: 30 additions & 3 deletions environment.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ enum fsync_method fsync_method = FSYNC_METHOD_DEFAULT;
enum fsync_component fsync_components = FSYNC_COMPONENTS_DEFAULT;
char *editor_program;
char *askpass_program;
char *excludes_file;
enum auto_crlf auto_crlf = AUTO_CRLF_FALSE;
enum eol core_eol = EOL_UNSET;
int global_conv_flags_eol = CONV_EOL_RNDTRP_WARN;
Expand Down Expand Up @@ -134,6 +133,14 @@ int is_bare_repository(void)
return is_bare_repository_cfg && !repo_get_work_tree(the_repository);
}

const char *repo_excludes_file(struct repository *repo)
{
if (!repo_config_values(repo)->excludes_file)
repo_config_values(repo)->excludes_file = xdg_config_home("ignore");

return repo_config_values(repo)->excludes_file;
}

int have_git_dir(void)
{
return startup_info->have_repository
Expand Down Expand Up @@ -461,8 +468,8 @@ int git_default_core_config(const char *var, const char *value,
}

if (!strcmp(var, "core.excludesfile")) {
FREE_AND_NULL(excludes_file);
return git_config_pathname(&excludes_file, var, value);
FREE_AND_NULL(cfg->excludes_file);
return git_config_pathname(&cfg->excludes_file, var, value);
}

if (!strcmp(var, "core.whitespace")) {
Expand Down Expand Up @@ -715,6 +722,7 @@ int git_default_config(const char *var, const char *value,
void repo_config_values_init(struct repo_config_values *cfg)
{
cfg->attributes_file = NULL;
cfg->excludes_file = NULL;
cfg->apply_sparse_checkout = 0;
cfg->branch_track = BRANCH_TRACK_REMOTE;
cfg->trust_ctime = 1;
Expand All @@ -726,3 +734,22 @@ void repo_config_values_init(struct repo_config_values *cfg)
cfg->sparse_expect_files_outside_of_patterns = 0;
cfg->warn_on_object_refname_ambiguity = 1;
}

void repo_config_values_clear(struct repository *repo)
{
struct repo_config_values *cfg;

/*
* NEEDSWORK: Submodules are currently not supported by
* repo_config_values(). Since repo_clear() cleans up all
* repository instances (including submodules), we must bypass
* them here to prevent hitting the BUG() in repository.c:59.
*/
if (repo != the_repository)
return;

cfg = repo_config_values(repo);

FREE_AND_NULL(cfg->attributes_file);
FREE_AND_NULL(cfg->excludes_file);
}
13 changes: 12 additions & 1 deletion environment.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ struct repository;
struct repo_config_values {
/* section "core" config values */
char *attributes_file;
char *excludes_file;
int apply_sparse_checkout;
int trust_ctime;
int check_stat;
Expand Down Expand Up @@ -133,8 +134,19 @@ int git_default_config(const char *, const char *,
int git_default_core_config(const char *var, const char *value,
const struct config_context *ctx, void *cb);

const char *repo_excludes_file(struct repository *repo);

void repo_config_values_init(struct repo_config_values *cfg);

/*
* Frees memory allocated for dynamically loaded configuration values
* inside `repo_config_values`.
*
* As dynamically allocated variables are migrated into this struct,
* their FREE_AND_NULL() calls should be appended here.
*/
void repo_config_values_clear(struct repository *repo);

/*
* TODO: All the below state either explicitly or implicitly relies on
* `the_repository`. We should eventually get rid of these and make the
Expand Down Expand Up @@ -208,7 +220,6 @@ extern char *git_log_output_encoding;

extern char *editor_program;
extern char *askpass_program;
extern char *excludes_file;

/*
* The character that begins a commented line in user-editable file
Expand Down
1 change: 1 addition & 0 deletions repository.c
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,7 @@ void repo_clear(struct repository *repo)
FREE_AND_NULL(repo->parsed_objects);

repo_settings_clear(repo);
repo_config_values_clear(repo);

if (repo->config) {
git_configset_clear(repo->config);
Expand Down
Loading