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 5/9] Refactor excluded and path_excluded
Date: Sun, 2 Sep 2012 01:12:07 +0100 [thread overview]
Message-ID: <1346544731-938-6-git-send-email-git@adamspiers.org> (raw)
In-Reply-To: <1346544731-938-1-git-send-email-git@adamspiers.org>
In a similar way to the previous commit, this extracts new helper
functions excluded_1() and path_excluded_1() which return the last
exclude_list element which matched, or NULL if no match was found.
excluded() and path_excluded() become wrappers around these, and just
return 0 or 1 depending on whether any matching exclude_list element
was found.
This allows callers to find out _why_ a given path was excluded,
rather than just whether it was or not, paving the way for a new git
sub-command which allows users to test their exclude lists from the
command line.
Signed-off-by: Adam Spiers <git@adamspiers.org>
---
dir.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
dir.h | 3 +++
2 files changed, 67 insertions(+), 17 deletions(-)
diff --git a/dir.c b/dir.c
index 3a532d5..3d438c3 100644
--- a/dir.c
+++ b/dir.c
@@ -603,23 +603,42 @@ int excluded_from_list(const char *pathname,
return -1; /* undecided */
}
-static int excluded(struct dir_struct *dir, const char *pathname, int *dtype_p)
+/*
+ * Loads the exclude lists for the directory containing pathname, then
+ * scans all exclude lists to determine whether pathname is excluded.
+ * Returns the exclude_list element which matched, or NULL for
+ * undecided.
+ */
+static struct exclude *excluded_1(struct dir_struct *dir, const char *pathname, int *dtype_p)
{
int pathlen = strlen(pathname);
int st;
+ struct exclude *exclude;
const char *basename = strrchr(pathname, '/');
basename = (basename) ? basename+1 : pathname;
prep_exclude(dir, pathname, basename-pathname);
for (st = EXC_CMDL; st <= EXC_FILE; st++) {
- switch (excluded_from_list(pathname, pathlen, basename,
- dtype_p, &dir->exclude_list[st])) {
- case 0:
- return 0;
- case 1:
- return 1;
+ exclude = excluded_from_list_1(pathname, pathlen, basename,
+ dtype_p, &dir->exclude_list[st]);
+ if (exclude) {
+ return exclude;
}
}
+ return NULL;
+}
+
+/*
+ * Loads the exclude lists for the directory containing pathname, then
+ * scans all exclude lists to determine whether pathname is excluded.
+ * Returns 1 if true, otherwise 0.
+ */
+static int excluded(struct dir_struct *dir, const char *pathname, int *dtype_p)
+{
+ struct exclude *exclude = excluded_1(dir, pathname, dtype_p);
+ if (exclude) {
+ return exclude->to_exclude;
+ }
return 0;
}
@@ -627,6 +646,7 @@ void path_exclude_check_init(struct path_exclude_check *check,
struct dir_struct *dir)
{
check->dir = dir;
+ check->exclude = NULL;
strbuf_init(&check->path, 256);
}
@@ -636,18 +656,20 @@ void path_exclude_check_clear(struct path_exclude_check *check)
}
/*
- * Is this name excluded? This is for a caller like show_files() that
- * do not honor directory hierarchy and iterate through paths that are
- * possibly in an ignored directory.
+ * For each subdirectory in name, starting with the top-most, checks
+ * to see if that subdirectory is excluded, and if so, returns the
+ * corresponding exclude structure. Otherwise, checks whether name
+ * itself (which is presumably a file) is excluded.
*
* A path to a directory known to be excluded is left in check->path to
* optimize for repeated checks for files in the same excluded directory.
*/
-int path_excluded(struct path_exclude_check *check,
- const char *name, int namelen, int *dtype)
+struct exclude *path_excluded_1(struct path_exclude_check *check,
+ const char *name, int namelen, int *dtype)
{
int i;
struct strbuf *path = &check->path;
+ struct exclude *exclude;
/*
* we allow the caller to pass namelen as an optimization; it
@@ -657,11 +679,18 @@ int path_excluded(struct path_exclude_check *check,
if (namelen < 0)
namelen = strlen(name);
+ /*
+ * If path is non-empty, and name is equal to path or a
+ * subdirectory of path, name should be excluded, because
+ * it's inside a directory which is already known to be
+ * excluded and was previously left in check->path.
+ */
if (path->len &&
path->len <= namelen &&
!memcmp(name, path->buf, path->len) &&
- (!name[path->len] || name[path->len] == '/'))
- return 1;
+ (!name[path->len] || name[path->len] == '/')) {
+ return check->exclude;
+ }
strbuf_setlen(path, 0);
for (i = 0; name[i]; i++) {
@@ -669,8 +698,11 @@ int path_excluded(struct path_exclude_check *check,
if (ch == '/') {
int dt = DT_DIR;
- if (excluded(check->dir, path->buf, &dt))
- return 1;
+ exclude = excluded_1(check->dir, path->buf, &dt);
+ if (exclude) {
+ check->exclude = exclude;
+ return exclude;
+ }
}
strbuf_addch(path, ch);
}
@@ -678,7 +710,22 @@ int path_excluded(struct path_exclude_check *check,
/* An entry in the index; cannot be a directory with subentries */
strbuf_setlen(path, 0);
- return excluded(check->dir, name, dtype);
+ return excluded_1(check->dir, name, dtype);
+}
+
+/*
+ * Is this name excluded? This is for a caller like show_files() that
+ * do not honor directory hierarchy and iterate through paths that are
+ * possibly in an ignored directory.
+ */
+int path_excluded(struct path_exclude_check *check,
+ const char *name, int namelen, int *dtype)
+{
+ struct exclude *exclude = path_excluded_1(check, name, namelen, dtype);
+ if (exclude) {
+ return exclude->to_exclude;
+ }
+ return 0;
}
static struct dir_entry *dir_entry_new(const char *pathname, int len)
diff --git a/dir.h b/dir.h
index 549a187..1b4f9dc 100644
--- a/dir.h
+++ b/dir.h
@@ -109,10 +109,13 @@ struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname,
*/
struct path_exclude_check {
struct dir_struct *dir;
+ struct exclude *exclude;
struct strbuf path;
};
extern void path_exclude_check_init(struct path_exclude_check *, struct dir_struct *);
extern void path_exclude_check_clear(struct path_exclude_check *);
+extern struct exclude *path_excluded_1(struct path_exclude_check *, const char *,
+ int namelen, int *dtype);
extern int path_excluded(struct path_exclude_check *, const char *, int namelen, int *dtype);
--
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 ` Adam Spiers [this message]
2012-09-04 12:40 ` [PATCH 5/9] Refactor excluded and path_excluded 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 ` [PATCH 9/9] Add git-check-ignores Adam Spiers
2012-09-02 10:41 ` 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1346544731-938-6-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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.