From: Adam Spiers <git@adamspiers.org>
To: git list <git@vger.kernel.org>
Cc: "Junio C Hamano" <gitster@pobox.com>, "Jeff King" <peff@peff.net>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 9/9] Add git-check-ignores
Date: Sun, 2 Sep 2012 01:12:11 +0100 [thread overview]
Message-ID: <1346544731-938-10-git-send-email-git@adamspiers.org> (raw)
In-Reply-To: <1346544731-938-1-git-send-email-git@adamspiers.org>
This works in a similar manner to git-check-attr. Some code
was reused from add.c by refactoring out into pathspec.c.
Thanks to Jeff King and Junio C Hamano for the idea:
http://thread.gmane.org/gmane.comp.version-control.git/108671/focus=108815
Signed-off-by: Adam Spiers <git@adamspiers.org>
---
.gitignore | 1 +
Documentation/git-check-ignore.txt | 58 +++++++
Documentation/gitignore.txt | 6 +-
Makefile | 1 +
builtin.h | 1 +
builtin/add.c | 2 +-
builtin/check-ignore.c | 150 ++++++++++++++++
command-list.txt | 1 +
contrib/completion/git-completion.bash | 1 +
git.c | 1 +
t/t0007-ignores.sh | 301 +++++++++++++++++++++++++++++++++
11 files changed, 520 insertions(+), 3 deletions(-)
create mode 100644 Documentation/git-check-ignore.txt
create mode 100644 builtin/check-ignore.c
create mode 100755 t/t0007-ignores.sh
diff --git a/.gitignore b/.gitignore
index bb5c91e..0cbe94c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,7 @@
/git-bundle
/git-cat-file
/git-check-attr
+/git-check-ignore
/git-check-ref-format
/git-checkout
/git-checkout-index
diff --git a/Documentation/git-check-ignore.txt b/Documentation/git-check-ignore.txt
new file mode 100644
index 0000000..3a85dbb
--- /dev/null
+++ b/Documentation/git-check-ignore.txt
@@ -0,0 +1,58 @@
+git-check-ignore(1)
+=================
+
+NAME
+----
+git-check-ignore - Debug gitignore / exclude files
+
+
+SYNOPSIS
+--------
+[verse]
+'git check-ignore' pathname...
+'git check-ignore' --stdin [-z] < <list-of-paths>
+
+DESCRIPTION
+-----------
+
+For each pathname given via the command-line or from a file via
+`--stdin`, this command will list the first exclude pattern found (if
+any) which explicitly excludes or includes that pathname. Note that
+within any given exclude file, later patterns take precedence over
+earlier ones, so any matching pattern which this command outputs may
+not be the one you would immediately expect.
+
+OPTIONS
+-------
+--stdin::
+ Read file names from stdin instead of from the command-line.
+
+-z::
+ Only meaningful with `--stdin`; paths are separated with a
+ NUL character instead of a linefeed character.
+
+OUTPUT
+------
+
+The output is a series of lines of the form:
+
+<path> COLON SP <type> SP <pattern> SP <source> SP <position> LF
+
+<path> is the path of a file being queried, <type> is either
+'excluded' or 'included' (for patterns prefixed with '!'), <pattern>
+is the matching pattern, <source> is the pattern's source file (either
+as an absolute path or relative to the repository root), and
+<position> is the position of the pattern within that source.
+
+If no pattern matches a given path, nothing will be output for that
+path.
+
+SEE ALSO
+--------
+linkgit:gitignore[5]
+linkgit:gitconfig[5]
+linkgit:git-ls-files[5]
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
index c1f692a..7ba16fe 100644
--- a/Documentation/gitignore.txt
+++ b/Documentation/gitignore.txt
@@ -155,8 +155,10 @@ The second .gitignore prevents git from ignoring
SEE ALSO
--------
-linkgit:git-rm[1], linkgit:git-update-index[1],
-linkgit:gitrepository-layout[5]
+linkgit:git-rm[1],
+linkgit:git-update-index[1],
+linkgit:gitrepository-layout[5],
+linkgit:git-check-ignore[1]
GIT
---
diff --git a/Makefile b/Makefile
index 272ab69..ce5e42f 100644
--- a/Makefile
+++ b/Makefile
@@ -825,6 +825,7 @@ BUILTIN_OBJS += builtin/branch.o
BUILTIN_OBJS += builtin/bundle.o
BUILTIN_OBJS += builtin/cat-file.o
BUILTIN_OBJS += builtin/check-attr.o
+BUILTIN_OBJS += builtin/check-ignore.o
BUILTIN_OBJS += builtin/check-ref-format.o
BUILTIN_OBJS += builtin/checkout-index.o
BUILTIN_OBJS += builtin/checkout.o
diff --git a/builtin.h b/builtin.h
index 8e37752..f812c97 100644
--- a/builtin.h
+++ b/builtin.h
@@ -57,6 +57,7 @@ extern int cmd_cat_file(int argc, const char **argv, const char *prefix);
extern int cmd_checkout(int argc, const char **argv, const char *prefix);
extern int cmd_checkout_index(int argc, const char **argv, const char *prefix);
extern int cmd_check_attr(int argc, const char **argv, const char *prefix);
+extern int cmd_check_ignore(int argc, const char **argv, const char *prefix);
extern int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
extern int cmd_cherry(int argc, const char **argv, const char *prefix);
extern int cmd_cherry_pick(int argc, const char **argv, const char *prefix);
diff --git a/builtin/add.c b/builtin/add.c
index a7ed2ad..af68c32 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -273,7 +273,7 @@ static int add_files(struct dir_struct *dir, int flags)
fprintf(stderr, _(ignore_error));
for (i = 0; i < dir->ignored_nr; i++)
fprintf(stderr, "%s\n", dir->ignored[i]->name);
- fprintf(stderr, _("Use -f if you really want to add them.\n"));
+ fprintf(stderr, _("Use -f if you really want to add them, or git check-ignore to see\nwhy they're ignored.\n"));
die(_("no files added"));
}
diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c
new file mode 100644
index 0000000..146c00b
--- /dev/null
+++ b/builtin/check-ignore.c
@@ -0,0 +1,150 @@
+#include "builtin.h"
+#include "cache.h"
+#include "dir.h"
+#include "quote.h"
+#include "pathspec.h"
+#include "parse-options.h"
+
+static int stdin_paths;
+static const char * const check_ignore_usage[] = {
+"git check-ignore pathname...",
+"git check-ignore --stdin [-z] < <list-of-paths>",
+NULL
+};
+
+static int null_term_line;
+
+static const struct option check_ignore_options[] = {
+ OPT_BOOLEAN(0 , "stdin", &stdin_paths, "read file names from stdin"),
+ OPT_BOOLEAN('z', NULL, &null_term_line,
+ "input paths are terminated by a null character"),
+ OPT_END()
+};
+
+static void output_exclude(const char *path, struct exclude *exclude)
+{
+ char *type = exclude->to_exclude ? "excluded" : "included";
+ char *bang = exclude->to_exclude ? "" : "!";
+ char *dir = (exclude->flags & EXC_FLAG_MUSTBEDIR) ? "/" : "";
+ printf(_("%s: %s %s%s%s "), path, type, bang, exclude->pattern, dir);
+ if (exclude->srcpos > 0) {
+ printf("%s %d", exclude->src, exclude->srcpos);
+ }
+ else {
+ /* Exclude was from CLI parameter. This code path is
+ * currently impossible to hit, but later on we might
+ * want to add ignore tracing to other commands such
+ * as git clean, which does accept --exclude.
+ */
+ /* printf("%s %d", exclude->src, -exclude->srcpos); */
+ }
+ printf("\n");
+}
+
+static void check_ignore(const char *prefix, const char **pathspec)
+{
+ struct dir_struct dir;
+ const char *path;
+ char *seen = NULL;
+
+ /* read_cache() is only necessary so we can watch out for submodules. */
+ if (read_cache() < 0)
+ die(_("index file corrupt"));
+
+ memset(&dir, 0, sizeof(dir));
+ dir.flags |= DIR_COLLECT_IGNORED;
+ setup_standard_excludes(&dir);
+
+ if (pathspec) {
+ int i;
+ struct path_exclude_check check;
+ struct exclude *exclude;
+
+ path_exclude_check_init(&check, &dir);
+ if (!seen)
+ seen = find_used_pathspec(pathspec);
+ for (i = 0; pathspec[i]; i++) {
+ path = pathspec[i];
+ char *full_path =
+ prefix_path(prefix, prefix ? strlen(prefix) : 0, path);
+ treat_gitlink(full_path);
+ validate_path(prefix, full_path);
+ if (!seen[i] && path[0]) {
+ int dtype = DT_UNKNOWN;
+ exclude = path_excluded_1(&check, full_path, -1, &dtype);
+ if (exclude) {
+ output_exclude(path, exclude);
+ }
+ }
+ }
+ free(seen);
+ free_directory(&dir);
+ path_exclude_check_clear(&check);
+ }
+ else {
+ printf("no pathspec\n");
+ }
+}
+
+static void check_ignore_stdin_paths(const char *prefix)
+{
+ struct strbuf buf, nbuf;
+ char **pathspec = NULL;
+ size_t nr = 0, alloc = 0;
+ int line_termination = null_term_line ? 0 : '\n';
+
+ strbuf_init(&buf, 0);
+ strbuf_init(&nbuf, 0);
+ while (strbuf_getline(&buf, stdin, line_termination) != EOF) {
+ if (line_termination && buf.buf[0] == '"') {
+ strbuf_reset(&nbuf);
+ if (unquote_c_style(&nbuf, buf.buf, NULL))
+ die("line is badly quoted");
+ strbuf_swap(&buf, &nbuf);
+ }
+ ALLOC_GROW(pathspec, nr + 1, alloc);
+ pathspec[nr] = xcalloc(strlen(buf.buf) + 1, sizeof(*buf.buf));
+ strcpy(pathspec[nr++], buf.buf);
+ }
+ ALLOC_GROW(pathspec, nr + 1, alloc);
+ pathspec[nr] = NULL;
+ check_ignore(prefix, (const char **)pathspec);
+ maybe_flush_or_die(stdout, "attribute to stdout");
+ strbuf_release(&buf);
+ strbuf_release(&nbuf);
+ free(pathspec);
+}
+
+static NORETURN void error_with_usage(const char *msg)
+{
+ error("%s", msg);
+ usage_with_options(check_ignore_usage, check_ignore_options);
+}
+
+int cmd_check_ignore(int argc, const char **argv, const char *prefix)
+{
+ git_config(git_default_config, NULL);
+
+ argc = parse_options(argc, argv, prefix, check_ignore_options,
+ check_ignore_usage, 0);
+
+ if (stdin_paths) {
+ if (0 < argc)
+ error_with_usage("Can't specify files with --stdin");
+ } else {
+ if (null_term_line)
+ error_with_usage("-z only makes sense with --stdin");
+
+ if (argc == 0)
+ error_with_usage("No path specified");
+ }
+
+ if (stdin_paths)
+ check_ignore_stdin_paths(prefix);
+ else {
+ check_ignore(prefix, argv);
+ maybe_flush_or_die(stdout, "ignore to stdout");
+ }
+
+ return 0;
+}
diff --git a/command-list.txt b/command-list.txt
index 7e8cfec..bf83303 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -12,6 +12,7 @@ git-branch mainporcelain common
git-bundle mainporcelain
git-cat-file plumbinginterrogators
git-check-attr purehelpers
+git-check-ignore purehelpers
git-checkout mainporcelain common
git-checkout-index plumbingmanipulators
git-check-ref-format purehelpers
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 222b804..26d798f 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -594,6 +594,7 @@ __git_list_porcelain_commands ()
archimport) : import;;
cat-file) : plumbing;;
check-attr) : plumbing;;
+ check-ignore) : plumbing;;
check-ref-format) : plumbing;;
checkout-index) : plumbing;;
commit-tree) : plumbing;;
diff --git a/git.c b/git.c
index 8788b32..6caf78a 100644
--- a/git.c
+++ b/git.c
@@ -338,6 +338,7 @@ static void handle_internal_command(int argc, const char **argv)
{ "bundle", cmd_bundle, RUN_SETUP_GENTLY },
{ "cat-file", cmd_cat_file, RUN_SETUP },
{ "check-attr", cmd_check_attr, RUN_SETUP },
+ { "check-ignore", cmd_check_ignore, RUN_SETUP | NEED_WORK_TREE },
{ "check-ref-format", cmd_check_ref_format },
{ "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE },
{ "checkout-index", cmd_checkout_index,
diff --git a/t/t0007-ignores.sh b/t/t0007-ignores.sh
new file mode 100755
index 0000000..4407634
--- /dev/null
+++ b/t/t0007-ignores.sh
@@ -0,0 +1,301 @@
+#!/bin/sh
+
+test_description=gitignores
+
+. ./test-lib.sh
+
+init_vars () {
+ global_excludes="$HOME/global-excludes"
+}
+
+enable_global_excludes () {
+ init_vars
+ git config core.excludesfile "$global_excludes"
+}
+
+ignore_check () {
+ paths="$1" expected="$2" global_args="$3"
+
+ if test -z "$expected"; then
+ >"$HOME/expected" # avoid newline
+ else
+ echo "$expected" >"$HOME/expected"
+ fi &&
+ run_check_ignore "$paths" "$global_args"
+}
+
+expect () {
+ echo "$*" >"$HOME/expected"
+}
+
+run_check_ignore () {
+ args="$1" global_args="$2"
+
+ init_vars &&
+ rm -f "$HOME/stdout" "$HOME/stderr" "$HOME/cmd" &&
+ echo `which git` $global_args check-ignore $args >"$HOME/cmd" &&
+ pwd >"$HOME/pwd" &&
+ git $global_args check-ignore $args >"$HOME/stdout" 2>"$HOME/stderr" &&
+ test_cmp "$HOME/expected" "$HOME/stdout" &&
+ test_line_count = 0 "$HOME/stderr"
+}
+
+test_expect_success 'setup' '
+ init_vars
+ mkdir -p a/b/ignored-dir a/submodule b &&
+ ln -s b a/symlink &&
+ (
+ cd a/submodule &&
+ git init &&
+ echo a > a &&
+ git add a &&
+ git commit -m"commit in submodule"
+ ) &&
+ git add a/submodule &&
+ cat <<-EOF >.gitignore &&
+ one
+ EOF
+ cat <<-EOF >a/.gitignore &&
+ two*
+ *three
+ EOF
+ cat <<-EOF >a/b/.gitignore &&
+ four
+ five
+ # this comment should affect the line numbers
+ six
+ ignored-dir/
+ # and so should this blank line:
+
+ !on*
+ !two
+ EOF
+ echo "seven" >a/b/ignored-dir/.gitignore &&
+ test -n "$HOME" &&
+ cat <<-EOF >"$global_excludes"
+ globalone
+ !globaltwo
+ globalthree
+ EOF
+'
+
+test_expect_success 'empty command line' '
+ test_must_fail git check-ignore 2>"$HOME/stderr" &&
+ grep -q "error: No path specified" "$HOME/stderr"
+'
+
+test_expect_success 'erroneous use of --' '
+ test_must_fail git check-ignore -- 2>"$HOME/stderr" &&
+ grep -q "error: No path specified" "$HOME/stderr"
+'
+
+test_expect_success '--stdin with superfluous arg' '
+ test_must_fail git check-ignore --stdin foo 2>"$HOME/stderr" &&
+ grep -q "Can'\''t specify files with --stdin" "$HOME/stderr"
+'
+
+test_expect_success '--stdin -z with superfluous arg' '
+ test_must_fail git check-ignore --stdin -z foo 2>"$HOME/stderr" &&
+ grep -q "Can'\''t specify files with --stdin" "$HOME/stderr"
+'
+
+test_expect_success '-z without --stdin' '
+ test_must_fail git check-ignore -z 2>"$HOME/stderr" &&
+ grep -q "error: -z only makes sense with --stdin" "$HOME/stderr"
+'
+
+test_expect_success '-z without --stdin and superfluous arg' '
+ test_must_fail git check-ignore -z foo 2>"$HOME/stderr" &&
+ grep -q "error: -z only makes sense with --stdin" "$HOME/stderr"
+'
+
+test_expect_success 'needs work tree' '
+ (
+ cd .git &&
+ test_must_fail git check-ignore foo 2>"$HOME/stderr"
+ ) &&
+ grep -q "fatal: This operation must be run in a work tree" "$HOME/stderr"
+
+'
+test_expect_success 'top-level not ignored' '
+ ignore_check foo ""
+'
+
+test_expect_success 'top-level ignored' '
+ ignore_check one "one: excluded one .gitignore 1"
+'
+
+test_expect_success 'sub-directory ignore from top' '
+ expect "a/one: excluded one .gitignore 1" &&
+ run_check_ignore a/one
+'
+
+test_expect_success 'sub-directory local ignore' '
+ expect "a/3-three: excluded *three a/.gitignore 2" &&
+ run_check_ignore "a/3-three a/three-not-this-one"
+'
+
+test_expect_success 'sub-directory local ignore inside a' '
+ expect "3-three: excluded *three a/.gitignore 2" &&
+ (
+ cd a &&
+ run_check_ignore "3-three three-not-this-one"
+ )
+'
+
+test_expect_success 'nested include' '
+ expect "a/b/one: included !on* a/b/.gitignore 8" &&
+ run_check_ignore "a/b/one"
+'
+
+test_expect_success 'ignored sub-directory' '
+ expect "a/b/ignored-dir: excluded ignored-dir/ a/b/.gitignore 5" &&
+ run_check_ignore "a/b/ignored-dir"
+'
+
+test_expect_success 'multiple files inside ignored sub-directory' '
+ cat <<-EOF >"$HOME/expected" &&
+ a/b/ignored-dir/foo: excluded ignored-dir/ a/b/.gitignore 5
+ a/b/ignored-dir/twoooo: excluded ignored-dir/ a/b/.gitignore 5
+ a/b/ignored-dir/seven: excluded ignored-dir/ a/b/.gitignore 5
+ EOF
+ run_check_ignore "a/b/ignored-dir/foo a/b/ignored-dir/twoooo a/b/ignored-dir/seven"
+'
+
+test_expect_success 'cd to ignored sub-directory' '
+ cat <<-EOF >"$HOME/expected" &&
+ foo: excluded ignored-dir/ a/b/.gitignore 5
+ twoooo: excluded ignored-dir/ a/b/.gitignore 5
+ ../one: included !on* a/b/.gitignore 8
+ seven: excluded ignored-dir/ a/b/.gitignore 5
+ ../../one: excluded one .gitignore 1
+ EOF
+ (
+ cd a/b/ignored-dir &&
+ run_check_ignore "foo twoooo ../one seven ../../one"
+ )
+'
+
+test_expect_success 'symlink' '
+ ignore_check "a/symlink" ""
+'
+
+test_expect_success 'beyond a symlink' '
+ test_must_fail git check-ignore "a/symlink/foo"
+'
+
+test_expect_success 'beyond a symlink from subdirectory' '
+ (
+ cd a &&
+ test_must_fail git check-ignore "symlink/foo"
+ )
+'
+
+test_expect_success 'submodule' '
+ test_must_fail git check-ignore "a/submodule/one" 2>"$HOME/stderr" &&
+ expect "fatal: Path '\''a/submodule/one'\'' is in submodule '\''a/submodule'\''" &&
+ test_cmp "$HOME/expected" "$HOME/stderr"
+'
+
+test_expect_success 'submodule from subdirectory' '
+ (
+ cd a &&
+ test_must_fail git check-ignore "submodule/one" 2>"$HOME/stderr"
+ ) &&
+ expect "fatal: Path '\''a/submodule/one'\'' is in submodule '\''a/submodule'\''" &&
+ test_cmp "$HOME/expected" "$HOME/stderr"
+'
+
+test_expect_success 'global ignore not yet enabled' '
+ expect "a/globalthree: excluded *three a/.gitignore 2" &&
+ run_check_ignore "globalone a/globalthree a/globaltwo"
+'
+
+test_expect_success 'global ignore' '
+ enable_global_excludes &&
+ cat <<-EOF >"$HOME/expected" &&
+ globalone: excluded globalone $global_excludes 1
+ globalthree: excluded globalthree $global_excludes 3
+ a/globalthree: excluded *three a/.gitignore 2
+ globaltwo: included !globaltwo $global_excludes 2
+ EOF
+ run_check_ignore "globalone globalthree a/globalthree globaltwo"
+'
+
+test_expect_success '--stdin' '
+ cat <<-EOF >in.txt &&
+ one
+ a/one
+ a/b/on
+ a/b/one
+ a/b/two
+ a/b/twooo
+ globaltwo
+ a/globaltwo
+ a/b/globaltwo
+ b/globaltwo
+ EOF
+ cat <<-EOF >"$HOME/expected" &&
+ one: excluded one .gitignore 1
+ a/one: excluded one .gitignore 1
+ a/b/on: included !on* a/b/.gitignore 8
+ a/b/one: included !on* a/b/.gitignore 8
+ a/b/two: included !two a/b/.gitignore 9
+ a/b/twooo: excluded two* a/.gitignore 1
+ globaltwo: included !globaltwo $global_excludes 2
+ a/globaltwo: included !globaltwo $global_excludes 2
+ a/b/globaltwo: included !globaltwo $global_excludes 2
+ b/globaltwo: included !globaltwo $global_excludes 2
+ EOF
+ run_check_ignore --stdin < in.txt
+'
+
+test_expect_success '--stdin -z' '
+ tr "\n" "\0" < in.txt | run_check_ignore "--stdin -z"
+'
+
+test_expect_success '-z --stdin' '
+ tr "\n" "\0" < in.txt | run_check_ignore "-z --stdin"
+'
+
+test_expect_success '--stdin from subdirectory' '
+ cat <<-EOF >in.txt &&
+ ../one
+ one
+ b/on
+ b/one
+ b/two
+ b/twooo
+ ../globaltwo
+ globaltwo
+ b/globaltwo
+ ../b/globaltwo
+ EOF
+ cat <<-EOF >"$HOME/expected" &&
+ ../one: excluded one .gitignore 1
+ one: excluded one .gitignore 1
+ b/on: included !on* a/b/.gitignore 8
+ b/one: included !on* a/b/.gitignore 8
+ b/two: included !two a/b/.gitignore 9
+ b/twooo: excluded two* a/.gitignore 1
+ ../globaltwo: included !globaltwo $global_excludes 2
+ globaltwo: included !globaltwo $global_excludes 2
+ b/globaltwo: included !globaltwo $global_excludes 2
+ ../b/globaltwo: included !globaltwo $global_excludes 2
+ EOF
+ (
+ cd a &&
+ run_check_ignore --stdin < ../in.txt
+ )
+'
+
+test_expect_success '--stdin -z from subdirectory' '
+ tr "\n" "\0" < in.txt | ( cd a && run_check_ignore "--stdin -z" )
+'
+
+test_expect_success '-z --stdin from subdirectory' '
+ tr "\n" "\0" < in.txt | ( cd a && run_check_ignore "-z --stdin" )
+'
+
+
+test_done
--
1.7.12.155.ge5750d5.dirty
next prev parent reply other threads:[~2012-09-02 0:20 UTC|newest]
Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-02 0:12 [PATCH 0/9] new git check-ignore sub-command Adam Spiers
2012-09-02 0:12 ` [PATCH 1/9] Update directory listing API doc to match code Adam Spiers
2012-09-02 0:12 ` [PATCH 2/9] Improve documentation and comments regarding directory traversal API Adam Spiers
2012-09-02 0:12 ` [PATCH 3/9] Rename cryptic 'which' variable to more consistent name Adam Spiers
2012-09-02 19:56 ` Junio C Hamano
2012-09-02 0:12 ` [PATCH 4/9] Refactor excluded_from_list Adam Spiers
2012-09-04 12:32 ` Nguyen Thai Ngoc Duy
2012-09-02 0:12 ` [PATCH 5/9] Refactor excluded and path_excluded Adam Spiers
2012-09-04 12:40 ` Nguyen Thai Ngoc Duy
2012-09-04 17:23 ` Junio C Hamano
2012-09-05 10:28 ` Nguyen Thai Ngoc Duy
2012-09-06 3:21 ` Junio C Hamano
2012-09-06 12:13 ` Nguyen Thai Ngoc Duy
2012-09-06 14:59 ` Thiago Farina
2012-09-06 15:05 ` Nguyen Thai Ngoc Duy
2012-09-06 17:42 ` Adam Spiers
2012-09-06 21:07 ` Junio C Hamano
2012-09-02 0:12 ` [PATCH 6/9] For each exclude pattern, store information about where it came from Adam Spiers
2012-09-02 17:00 ` Philip Oakley
2012-09-02 19:02 ` Junio C Hamano
2012-09-02 22:36 ` Philip Oakley
2012-09-06 17:56 ` Adam Spiers
2012-09-02 0:12 ` [PATCH 7/9] Extract some useful pathspec handling code from builtin/add.c into a library Adam Spiers
2012-09-02 0:12 ` [PATCH 8/9] Provide free_directory() for reclaiming dir_struct memory Adam Spiers
2012-09-02 0:12 ` Adam Spiers [this message]
2012-09-02 10:41 ` [PATCH 9/9] Add git-check-ignores Nguyen Thai Ngoc Duy
2012-09-02 14:50 ` Adam Spiers
2012-09-02 20:38 ` Junio C Hamano
2012-09-03 4:14 ` Nguyen Thai Ngoc Duy
2012-09-02 20:41 ` Junio C Hamano
2012-09-03 1:47 ` Junio C Hamano
2012-09-20 19:46 ` [PATCH v2 00/14] new git check-ignore sub-command Adam Spiers
2012-09-20 19:46 ` [PATCH v2 01/14] Update directory listing API doc to match code Adam Spiers
2012-09-20 19:46 ` [PATCH v2 02/14] Improve documentation and comments regarding directory traversal API Adam Spiers
2012-09-20 19:46 ` [PATCH v2 03/14] Rename cryptic 'which' variable to more consistent name Adam Spiers
2012-09-20 19:46 ` [PATCH v2 04/14] Rename path_excluded() to is_path_excluded() Adam Spiers
2012-09-20 19:46 ` [PATCH v2 05/14] Rename excluded_from_list() to is_excluded_from_list() Adam Spiers
2012-09-20 19:46 ` [PATCH v2 06/14] Rename excluded() to is_excluded() Adam Spiers
2012-09-20 19:46 ` [PATCH v2 07/14] Refactor is_excluded_from_list() Adam Spiers
2012-09-20 19:46 ` [PATCH v2 08/14] Refactor is_excluded() Adam Spiers
2012-09-20 19:46 ` [PATCH v2 09/14] Refactor is_path_excluded() Adam Spiers
2012-09-20 19:46 ` [PATCH v2 10/14] For each exclude pattern, store information about where it came from Adam Spiers
2012-09-20 21:31 ` Junio C Hamano
2012-12-26 15:46 ` Adam Spiers
2012-09-20 19:46 ` [PATCH v2 11/14] Refactor treat_gitlinks() Adam Spiers
2012-09-20 19:46 ` [PATCH v2 12/14] Extract some useful pathspec handling code from builtin/add.c into a library Adam Spiers
2012-09-21 7:54 ` Michael Haggerty
2012-09-20 19:46 ` [PATCH v2 13/14] Provide free_directory() for reclaiming dir_struct memory Adam Spiers
2012-09-21 8:03 ` Michael Haggerty
2012-09-21 16:11 ` Junio C Hamano
2012-09-20 19:46 ` [PATCH v2 14/14] Add git-check-ignore sub-command Adam Spiers
2012-09-21 5:44 ` Johannes Sixt
2012-09-25 23:25 ` Junio C Hamano
2012-09-26 5:49 ` Johannes Sixt
2012-09-26 14:03 ` Junio C Hamano
2012-09-21 7:23 ` Michael Haggerty
2012-09-21 16:27 ` Junio C Hamano
2012-09-21 19:42 ` Junio C Hamano
2012-09-20 21:26 ` [PATCH v2 00/14] new git check-ignore sub-command Junio C Hamano
2012-09-20 21:43 ` Junio C Hamano
2012-09-20 23:45 ` Adam Spiers
2012-09-21 4:34 ` Junio C Hamano
2012-12-16 19:35 ` [PATCH 0/3] Help newbie git developers avoid obvious pitfalls Adam Spiers
2012-12-16 19:35 ` [PATCH 1/3] SubmittingPatches: add convention of prefixing commit messages Adam Spiers
2012-12-16 23:15 ` Junio C Hamano
2012-12-16 19:36 ` [PATCH 2/3] Documentation: move support for old compilers to CodingGuidelines Adam Spiers
2012-12-16 19:36 ` [PATCH 3/3] Makefile: use -Wdeclaration-after-statement if supported Adam Spiers
2012-12-17 1:52 ` Junio C Hamano
2012-12-17 2:15 ` Adam Spiers
2012-12-17 4:18 ` Junio C Hamano
2012-12-22 12:25 ` Adam Spiers
2012-12-22 18:39 ` Junio C Hamano
2012-12-26 15:44 ` [PATCH v2 00/14] new git check-ignore sub-command Adam Spiers
2012-09-21 19:00 ` Junio C Hamano
2012-12-16 23:04 ` compiler checks Adam Spiers
2012-09-24 22:31 ` [PATCH v2 00/14] new git check-ignore sub-command Junio C Hamano
2012-09-04 13:06 ` [PATCH 9/9] Add git-check-ignores Nguyen Thai Ngoc Duy
2012-09-04 17:26 ` Junio C Hamano
2012-09-05 10:25 ` Nguyen Thai Ngoc Duy
2012-09-10 11:15 ` Adam Spiers
2012-09-10 11:09 ` Adam Spiers
2012-09-10 12:25 ` Nguyen Thai Ngoc Duy
2012-09-10 16:30 ` Junio C Hamano
2012-09-02 20:35 ` [PATCH 0/9] new git check-ignore sub-command Junio C Hamano
2012-09-06 17:44 ` Adam Spiers
2012-09-07 10:03 ` Adam Spiers
2012-09-07 16:45 ` Junio C Hamano
2012-09-19 19:00 ` [PATCH] Document conventions on static initialization and else cuddling Adam Spiers
2012-09-19 20:43 ` Junio C Hamano
2012-09-19 21:14 ` Adam Spiers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1346544731-938-10-git-send-email-git@adamspiers.org \
--to=git@adamspiers.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).