From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
Michael J Gruber <git@drmicha.warpmail.net>
Cc: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 2/5] Replace has_wildcard with PATHSPEC_NOGLOB
Date: Sat, 9 Apr 2011 23:54:17 +0700 [thread overview]
Message-ID: <1302368060-23827-3-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1302368060-23827-1-git-send-email-pclouds@gmail.com>
---
cache.h | 22 ++++++++++++++++++++--
dir.c | 11 +++++++----
setup.c | 17 -----------------
tree-walk.c | 25 ++++++++++++-------------
4 files changed, 39 insertions(+), 36 deletions(-)
diff --git a/cache.h b/cache.h
index 27ac8a7..da1a46c 100644
--- a/cache.h
+++ b/cache.h
@@ -501,16 +501,34 @@ extern int index_name_is_other(const struct index_state *, const char *, int);
extern int ie_match_stat(const struct index_state *, struct cache_entry *, struct stat *, unsigned int);
extern int ie_modified(const struct index_state *, struct cache_entry *, struct stat *, unsigned int);
+/*
+ * Magic pathspec
+ *
+ * NEEDSWORK: These need to be moved to dir.h or even to a new
+ * pathspec.h when we restructure get_pathspec() users to use the
+ * "struct pathspec" interface.
+ *
+ * Possible future magic semantics include stuff like:
+ *
+ * { PATHSPEC_NOGLOB, '!', "noglob" },
+ * { PATHSPEC_RECURSIVE, '*', "recursive" },
+ * { PATHSPEC_REGEXP, '\0', "regexp" },
+ *
+ */
+#define PATHSPEC_FROMTOP (1<<0)
+#define PATHSPEC_ICASE (1<<1)
+#define PATHSPEC_NOGLOB (1<<2)
+
struct pathspec {
const char **raw; /* get_pathspec() result, not freed by free_pathspec() */
int nr;
- unsigned int has_wildcard:1;
+ unsigned int use_wildcard:1;
unsigned int recursive:1;
int max_depth;
struct pathspec_item {
const char *match;
int len;
- unsigned int has_wildcard:1;
+ unsigned magic;
} *items;
};
diff --git a/dir.c b/dir.c
index 6eb04ea..58cedd3 100644
--- a/dir.c
+++ b/dir.c
@@ -230,7 +230,8 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix,
return MATCHED_RECURSIVELY;
}
- if (item->has_wildcard && !fnmatch(match, name, 0))
+ if (!(item->magic & PATHSPEC_NOGLOB) &&
+ !fnmatch(match, name, 0))
return MATCHED_FNMATCH;
return 0;
@@ -1280,15 +1281,17 @@ int init_pathspec(struct pathspec *pathspec, const char **paths)
return 0;
pathspec->items = xmalloc(sizeof(struct pathspec_item)*pathspec->nr);
+ memset(pathspec->items, 0, sizeof(struct pathspec_item)*pathspec->nr);
for (i = 0; i < pathspec->nr; i++) {
struct pathspec_item *item = pathspec->items+i;
const char *path = paths[i];
item->match = path;
item->len = strlen(path);
- item->has_wildcard = !no_wildcard(path);
- if (item->has_wildcard)
- pathspec->has_wildcard = 1;
+ if (no_wildcard(path))
+ item->magic |= PATHSPEC_NOGLOB;
+ else
+ pathspec->use_wildcard = 1;
}
qsort(pathspec->items, pathspec->nr,
diff --git a/setup.c b/setup.c
index 4e5ac5e..1e7dfb1 100644
--- a/setup.c
+++ b/setup.c
@@ -126,23 +126,6 @@ void verify_non_filename(const char *prefix, const char *arg)
"Use '--' to separate filenames from revisions", arg);
}
-/*
- * Magic pathspec
- *
- * NEEDSWORK: These need to be moved to dir.h or even to a new
- * pathspec.h when we restructure get_pathspec() users to use the
- * "struct pathspec" interface.
- *
- * Possible future magic semantics include stuff like:
- *
- * { PATHSPEC_NOGLOB, '!', "noglob" },
- * { PATHSPEC_RECURSIVE, '*', "recursive" },
- * { PATHSPEC_REGEXP, '\0', "regexp" },
- *
- */
-#define PATHSPEC_FROMTOP (1<<0)
-#define PATHSPEC_ICASE (1<<1)
-
struct pathspec_magic {
unsigned bit;
char mnemonic; /* this cannot be ':'! */
diff --git a/tree-walk.c b/tree-walk.c
index 322becc..026d88e 100644
--- a/tree-walk.c
+++ b/tree-walk.c
@@ -559,7 +559,7 @@ int tree_entry_interesting(const struct name_entry *entry,
{
int i;
int pathlen, baselen = base->len - base_offset;
- int never_interesting = ps->has_wildcard ? 0 : -1;
+ int never_interesting = ps->use_wildcard ? 0 : -1;
if (!ps->nr) {
if (!ps->recursive || ps->max_depth == -1)
@@ -598,23 +598,22 @@ int tree_entry_interesting(const struct name_entry *entry,
&never_interesting))
return 1;
- if (ps->items[i].has_wildcard) {
- if (!fnmatch(match + baselen, entry->path, 0))
- return 1;
+ if (ps->items[i].magic & PATHSPEC_NOGLOB)
+ continue;
- /*
- * Match all directories. We'll try to
- * match files later on.
- */
- if (ps->recursive && S_ISDIR(entry->mode))
- return 1;
- }
+ if (!fnmatch(match + baselen, entry->path, 0))
+ return 1;
- continue;
+ /*
+ * Match all directories. We'll try to match
+ * files later on.
+ */
+ if (ps->recursive && S_ISDIR(entry->mode))
+ return 1;
}
match_wildcards:
- if (!ps->items[i].has_wildcard)
+ if (ps->items[i].magic & PATHSPEC_NOGLOB)
continue;
/*
--
1.7.4.74.g639db
next prev parent reply other threads:[~2011-04-09 16:54 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-09 16:54 [PATCH 0/5] New get_pathspec() Nguyễn Thái Ngọc Duy
2011-04-09 16:54 ` [PATCH 1/5] Rename functions in preparation for get_pathspec() restructure Nguyễn Thái Ngọc Duy
2011-04-09 16:54 ` Nguyễn Thái Ngọc Duy [this message]
2011-04-10 0:49 ` [PATCH 2/5] Replace has_wildcard with PATHSPEC_NOGLOB Junio C Hamano
2011-04-10 7:23 ` Nguyen Thai Ngoc Duy
2011-04-09 16:54 ` [PATCH 3/5] Convert prefix_pathspec() to produce struct pathspec_item Nguyễn Thái Ngọc Duy
2011-04-09 16:54 ` [PATCH 4/5] Implement new get_pathspec() Nguyễn Thái Ngọc Duy
2011-04-09 16:54 ` [PATCH 5/5] grep: convert to use the " Nguyễn Thái Ngọc Duy
2011-04-10 0:56 ` Junio C Hamano
2011-04-10 7:26 ` Nguyen Thai Ngoc Duy
2011-04-09 21:41 ` [PATCH 0/5] New get_pathspec() 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1302368060-23827-3-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@drmicha.warpmail.net \
--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.
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.