Skip to content

Commit

Permalink
core.excludesfile clean-up
Browse files Browse the repository at this point in the history
There are inconsistencies in the way commands currently handle
the core.excludesfile configuration variable.  The problem is
the variable is too new to be noticed by anything other than
git-add and git-status.

 * git-ls-files does not notice any of the "ignore" files by
   default, as it predates the standardized set of ignore files.
   The calling scripts established the convention to use
   .git/info/exclude, .gitignore, and later core.excludesfile.

 * git-add and git-status know about it because they call
   add_excludes_from_file() directly with their own notion of
   which standard set of ignore files to use.  This is just a
   stupid duplication of code that need to be updated every time
   the definition of the standard set of ignore files is
   changed.

 * git-read-tree takes --exclude-per-directory=<gitignore>,
   not because the flexibility was needed.  Again, this was
   because the option predates the standardization of the ignore
   files.

 * git-merge-recursive uses hardcoded per-directory .gitignore
   and nothing else.  git-clean (scripted version) does not
   honor core.* because its call to underlying ls-files does not
   know about it.  git-clean in C (parked in 'pu') doesn't either.

We probably could change git-ls-files to use the standard set
when no excludes are specified on the command line and ignore
processing was asked, or something like that, but that will be a
change in semantics and might break people's scripts in a subtle
way.  I am somewhat reluctant to make such a change.

On the other hand, I think it makes perfect sense to fix
git-read-tree, git-merge-recursive and git-clean to follow the
same rule as other commands.  I do not think of a valid use case
to give an exclude-per-directory that is nonstandard to
read-tree command, outside a "negative" test in the t1004 test
script.

This patch is the first step to untangle this mess.

The next step would be to teach read-tree, merge-recursive and
clean (in C) to use setup_standard_excludes().

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Nov 14, 2007
1 parent f5f6cb8 commit 039bc64
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 34 deletions.
22 changes: 2 additions & 20 deletions builtin-add.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ static const char * const builtin_add_usage[] = {
};

static int take_worktree_changes;
static const char *excludes_file;

static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
{
Expand Down Expand Up @@ -61,12 +60,7 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec,
memset(dir, 0, sizeof(*dir));
if (!ignored_too) {
dir->collect_ignored = 1;
dir->exclude_per_dir = ".gitignore";
path = git_path("info/exclude");
if (!access(path, R_OK))
add_excludes_from_file(dir, path);
if (excludes_file != NULL && !access(excludes_file, R_OK))
add_excludes_from_file(dir, excludes_file);
setup_standard_excludes(dir);
}

/*
Expand Down Expand Up @@ -141,18 +135,6 @@ static void refresh(int verbose, const char **pathspec)
free(seen);
}

static int git_add_config(const char *var, const char *value)
{
if (!strcmp(var, "core.excludesfile")) {
if (!value)
die("core.excludesfile without value");
excludes_file = xstrdup(value);
return 0;
}

return git_default_config(var, value);
}

int interactive_add(void)
{
const char *argv[2] = { "add--interactive", NULL };
Expand Down Expand Up @@ -193,7 +175,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
exit(interactive_add());
}

git_config(git_add_config);
git_config(git_default_config);

newfd = hold_locked_index(&lock_file, 1);

Expand Down
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,7 @@ extern int pager_in_use;
extern int pager_use_color;

extern char *editor_program;
extern char *excludes_file;

/* base85 */
int decode_85(char *dst, const char *line, int linelen);
Expand Down
7 changes: 7 additions & 0 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,13 @@ int git_default_config(const char *var, const char *value)
return 0;
}

if (!strcmp(var, "core.excludesfile")) {
if (!value)
die("core.excludesfile without value");
excludes_file = xstrdup(value);
return 0;
}

/* Add other config variables here and to Documentation/config.txt. */
return 0;
}
Expand Down
12 changes: 12 additions & 0 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -778,3 +778,15 @@ int remove_dir_recursively(struct strbuf *path, int only_empty)
ret = rmdir(path->buf);
return ret;
}

void setup_standard_excludes(struct dir_struct *dir)
{
const char *path;

dir->exclude_per_dir = ".gitignore";
path = git_path("info/exclude");
if (!access(path, R_OK))
add_excludes_from_file(dir, path);
if (excludes_file && !access(excludes_file, R_OK))
add_excludes_from_file(dir, excludes_file);
}
1 change: 1 addition & 0 deletions dir.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ extern struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathna
extern char *get_relative_cwd(char *buffer, int size, const char *dir);
extern int is_inside_dir(const char *dir);

extern void setup_standard_excludes(struct dir_struct *dir);
extern int remove_dir_recursively(struct strbuf *path, int only_empty);

#endif
1 change: 1 addition & 0 deletions environment.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ char *pager_program;
int pager_in_use;
int pager_use_color = 1;
char *editor_program;
char *excludes_file;
int auto_crlf = 0; /* 1: both ways, -1: only when adding git objects */

/* This is set by setup_git_dir_gently() and/or git_default_config() */
Expand Down
15 changes: 1 addition & 14 deletions wt-status.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ static const char use_add_rm_msg[] =
"use \"git add/rm <file>...\" to update what will be committed";
static const char use_add_to_include_msg[] =
"use \"git add <file>...\" to include in what will be committed";
static const char *excludes_file;

static int parse_status_slot(const char *var, int offset)
{
Expand Down Expand Up @@ -251,22 +250,16 @@ static void wt_status_print_changed(struct wt_status *s)
static void wt_status_print_untracked(struct wt_status *s)
{
struct dir_struct dir;
const char *x;
int i;
int shown_header = 0;

memset(&dir, 0, sizeof(dir));

dir.exclude_per_dir = ".gitignore";
if (!s->untracked) {
dir.show_other_directories = 1;
dir.hide_empty_directories = 1;
}
x = git_path("info/exclude");
if (file_exists(x))
add_excludes_from_file(&dir, x);
if (excludes_file && file_exists(excludes_file))
add_excludes_from_file(&dir, excludes_file);
setup_standard_excludes(&dir);

read_directory(&dir, ".", "", 0, NULL);
for(i = 0; i < dir.nr; i++) {
Expand Down Expand Up @@ -364,11 +357,5 @@ int git_status_config(const char *k, const char *v)
int slot = parse_status_slot(k, 13);
color_parse(v, k, wt_status_colors[slot]);
}
if (!strcmp(k, "core.excludesfile")) {
if (!v)
die("core.excludesfile without value");
excludes_file = xstrdup(v);
return 0;
}
return git_default_config(k, v);
}

0 comments on commit 039bc64

Please sign in to comment.