git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
	"Adam Spiers" <git@adamspiers.org>,
	"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 08/12] dir.c: keep track of where patterns came from
Date: Mon, 15 Oct 2012 13:28:02 +0700	[thread overview]
Message-ID: <1350282486-4646-8-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1350282486-4646-1-git-send-email-pclouds@gmail.com>

From: Adam Spiers <git@adamspiers.org>

For exclude patterns read in from files, the filename is stored together
with the corresponding line number (counting starting at 1).

For exclude patterns provided on the command line, the sequence number
is negative, with counting starting at -1, so for example the 2nd
pattern provided via --exclude would be numbered -2.  This allows any
future consumers of that data to easily distinguish between exclude
patterns from files vs. from the CLI.

Signed-off-by: Adam Spiers <git@adamspiers.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin/clean.c    |  2 +-
 builtin/ls-files.c |  3 ++-
 dir.c              | 26 ++++++++++++++++++++------
 dir.h              |  5 ++++-
 4 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/builtin/clean.c b/builtin/clean.c
index 0c7b3d0..f618231 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -99,7 +99,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
 
 	for (i = 0; i < exclude_list.nr; i++)
 		add_exclude(exclude_list.items[i].string, "", 0,
-			    &dir.exclude_list[EXC_CMDL]);
+			    &dir.exclude_list[EXC_CMDL], "--exclude option", -(i+1));
 
 	pathspec = get_pathspec(prefix, argv);
 
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index ef7f99a..db3c081 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -35,6 +35,7 @@ static int error_unmatch;
 static char *ps_matched;
 static const char *with_tree;
 static int exc_given;
+static int exclude_args;
 
 static const char *tag_cached = "";
 static const char *tag_unmerged = "";
@@ -423,7 +424,7 @@ static int option_parse_exclude(const struct option *opt,
 	struct exclude_list *list = opt->value;
 
 	exc_given = 1;
-	add_exclude(arg, "", 0, list);
+	add_exclude(arg, "", 0, list, "--exclude option", --exclude_args);
 
 	return 0;
 }
diff --git a/dir.c b/dir.c
index 84ab826..81a5dd5 100644
--- a/dir.c
+++ b/dir.c
@@ -347,7 +347,8 @@ void parse_exclude_pattern(const char **pattern,
 }
 
 void add_exclude(const char *string, const char *base,
-		 int baselen, struct exclude_list *el)
+		 int baselen, struct exclude_list *el,
+		 const char *src, int srcpos)
 {
 	struct exclude *x;
 	int patternlen;
@@ -371,6 +372,8 @@ void add_exclude(const char *string, const char *base,
 	x->base = base;
 	x->baselen = baselen;
 	x->flags = flags;
+	x->src = src;
+	x->srcpos = srcpos;
 	ALLOC_GROW(el->excludes, el->nr + 1, el->alloc);
 	el->excludes[el->nr++] = x;
 }
@@ -418,7 +421,7 @@ int add_excludes_from_file_to_list(const char *fname,
 				   int check_index)
 {
 	struct stat st;
-	int fd, i;
+	int fd, i, lineno = 1;
 	size_t size = 0;
 	char *buf, *entry;
 
@@ -461,8 +464,10 @@ int add_excludes_from_file_to_list(const char *fname,
 		if (buf[i] == '\n') {
 			if (entry != buf + i && entry[0] != '#') {
 				buf[i - (i && buf[i-1] == '\r')] = 0;
-				add_exclude(entry, base, baselen, el);
+				add_exclude(entry, base, baselen, el,
+					    fname, lineno);
 			}
+			lineno++;
 			entry = buf + i + 1;
 		}
 	}
@@ -493,8 +498,10 @@ static void prep_exclude(struct dir_struct *dir, const char *base, int baselen)
 		    !strncmp(dir->basebuf, base, stk->baselen))
 			break;
 		dir->exclude_stack = stk->prev;
-		while (stk->exclude_ix < el->nr)
-			free(el->excludes[--el->nr]);
+		while (stk->exclude_ix < el->nr) {
+			struct exclude *exclude = el->excludes[--el->nr];
+			free(exclude);
+		}
 		free(stk->filebuf);
 		free(stk);
 	}
@@ -521,7 +528,14 @@ static void prep_exclude(struct dir_struct *dir, const char *base, int baselen)
 		memcpy(dir->basebuf + current, base + current,
 		       stk->baselen - current);
 		strcpy(dir->basebuf + stk->baselen, dir->exclude_per_dir);
-		add_excludes_from_file_to_list(dir->basebuf,
+
+		/*
+		 * dir->basebuf gets reused by the traversal, but we
+		 * need fname to remain unchanged to ensure the src
+		 * member of each struct exclude correctly back-references
+		 * its source file.
+		 */
+		add_excludes_from_file_to_list(strdup(dir->basebuf),
 					       dir->basebuf, stk->baselen,
 					       &stk->filebuf, el, 1);
 		dir->exclude_stack = stk;
diff --git a/dir.h b/dir.h
index 02ac0bf..3921aa9 100644
--- a/dir.h
+++ b/dir.h
@@ -23,6 +23,9 @@ struct exclude_list {
 		const char *base;
 		int baselen;
 		int flags;
+		const char *src;
+		int srcpos; /* counting starts from 1 for line numbers in ignore files,
+			       and from -1 decrementing for patterns from CLI (--exclude) */
 	} **excludes;
 };
 
@@ -112,7 +115,7 @@ extern int add_excludes_from_file_to_list(const char *fname, const char *base, i
 extern void add_excludes_from_file(struct dir_struct *, const char *fname);
 extern void parse_exclude_pattern(const char **string, int *patternlen, int *flags, int *nowildcardlen);
 extern void add_exclude(const char *string, const char *base,
-			int baselen, struct exclude_list *el);
+			int baselen, struct exclude_list *el, const char *src, int srcpos);
 extern void free_excludes(struct exclude_list *el);
 extern int file_exists(const char *);
 
-- 
1.8.0.rc0.29.g1fdd78f

  parent reply	other threads:[~2012-10-15  6:29 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-15  6:23 nd/attr-match-more-optim, nd/wildmatch and as/check-ignore Nguyễn Thái Ngọc Duy
2012-10-15  6:24 ` [PATCH 1/6] exclude: stricten a length check in EXC_FLAG_ENDSWITH case Nguyễn Thái Ngọc Duy
2012-10-15  6:24   ` [PATCH 2/6] exclude: split basename matching code into a separate function Nguyễn Thái Ngọc Duy
2012-10-15  6:24   ` [PATCH 3/6] exclude: fix a bug in prefix compare optimization Nguyễn Thái Ngọc Duy
2012-10-15  6:24   ` [PATCH 4/6] exclude: split pathname matching code into a separate function Nguyễn Thái Ngọc Duy
2012-10-15  6:24   ` [PATCH 5/6] gitignore: make pattern parsing code " Nguyễn Thái Ngọc Duy
2012-10-15  6:24   ` [PATCH 6/6] attr: more matching optimizations from .gitignore Nguyễn Thái Ngọc Duy
2012-10-15  6:25 ` [PATCH 01/13] ctype: make sane_ctype[] const array Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 02/13] ctype: support iscntrl, ispunct, isxdigit and isprint Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 03/13] Import wildmatch from rsync Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 04/13] wildmatch: remove unnecessary functions Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 05/13] wildmatch: follow Git's coding convention Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 06/13] Integrate wildmatch to git Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 07/13] t3070: disable unreliable fnmatch tests Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 08/13] wildmatch: make wildmatch's return value compatible with fnmatch Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 09/13] wildmatch: remove static variable force_lower_case Nguyễn Thái Ngọc Duy
2012-10-15  6:25   ` [PATCH 10/13] wildmatch: fix case-insensitive matching Nguyễn Thái Ngọc Duy
2012-10-15  6:26   ` [PATCH 11/13] wildmatch: adjust "**" behavior Nguyễn Thái Ngọc Duy
2012-10-15  6:26   ` [PATCH 12/13] wildmatch: make /**/ match zero or more directories Nguyễn Thái Ngọc Duy
2012-10-15  6:26   ` [PATCH 13/13] Support "**" wildcard in .gitignore and .gitattributes Nguyễn Thái Ngọc Duy
2012-11-04 21:00     ` [PATCH 14/13] wildmatch: fix tests that fail on Windows due to path mangling Johannes Sixt
2012-11-06 12:47       ` Nguyen Thai Ngoc Duy
2012-11-07 19:32         ` Johannes Sixt
2012-11-11 10:13       ` [PATCH 14/13] test-wildmatch: " Nguyễn Thái Ngọc Duy
2012-11-11 10:13         ` [PATCH 15/13] compat/fnmatch: fix off-by-one character class's length check Nguyễn Thái Ngọc Duy
2012-11-13 18:07           ` Johannes Sixt
2012-11-20  7:06           ` Johannes Sixt
2012-11-11 10:47         ` [PATCH 14/13] test-wildmatch: fix tests that fail on Windows due to path mangling Junio C Hamano
2012-11-13 10:06           ` [PATCH 14/13] test-wildmatch: avoid Windows " Nguyễn Thái Ngọc Duy
2012-11-13 18:06             ` Johannes Sixt
2012-11-20  7:02           ` Johannes Sixt
2012-11-20 20:11             ` Junio C Hamano
2012-11-21  6:41               ` Johannes Sixt
2012-10-15  6:27 ` [PATCH 01/12] dir.c: rename cryptic 'which' variable to more consistent name Nguyễn Thái Ngọc Duy
2012-10-15  6:27   ` [PATCH 02/12] dir.c: rename path_excluded() to is_path_excluded() Nguyễn Thái Ngọc Duy
2012-10-15  6:27   ` [PATCH 03/12] dir.c: rename excluded_from_list() to is_excluded_from_list() Nguyễn Thái Ngọc Duy
2012-10-15  6:27   ` [PATCH 04/12] dir.c: rename excluded() to is_excluded() Nguyễn Thái Ngọc Duy
2012-10-15  6:27   ` [PATCH 05/12] dir.c: refactor is_excluded_from_list() Nguyễn Thái Ngọc Duy
2012-10-15  6:28   ` [PATCH 06/12] dir.c: refactor is_excluded() Nguyễn Thái Ngọc Duy
2012-10-15  6:28   ` [PATCH 07/12] dir.c: refactor is_path_excluded() Nguyễn Thái Ngọc Duy
2012-10-15  6:28   ` Nguyễn Thái Ngọc Duy [this message]
2012-10-15  6:28   ` [PATCH 09/12] dir.c: refactor treat_gitlinks() Nguyễn Thái Ngọc Duy
2012-10-15  6:28   ` [PATCH 10/12] pathspec.c: move reusable code from builtin/add.c Nguyễn Thái Ngọc Duy
2012-10-15  6:28   ` [PATCH 11/12] dir.c: provide free_directory() for reclaiming dir_struct memory Nguyễn Thái Ngọc Duy
2012-10-15  6:28   ` [PATCH 12/12] Add git-check-ignore sub-command Nguyễn Thái Ngọc Duy
2012-10-15 22:31     ` Junio C Hamano
2012-10-16 11:08       ` Nguyen Thai Ngoc Duy
2012-10-16 14:09         ` Adam Spiers
2012-10-16 15:07           ` Nguyen Thai Ngoc Duy
2012-10-16 14:13       ` Adam Spiers
2012-10-16 16:12         ` Junio C Hamano
2012-12-17  0:10           ` Adam Spiers
2012-11-04 21:07     ` [PATCH as/check-ignore] t0007: fix tests on Windows Johannes Sixt
2012-11-08 18:04       ` Jeff King
2012-10-15 22:13 ` nd/attr-match-more-optim, nd/wildmatch and as/check-ignore Junio C Hamano

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=1350282486-4646-8-git-send-email-pclouds@gmail.com \
    --to=pclouds@gmail.com \
    --cc=git@adamspiers.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    /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).