All of lore.kernel.org
 help / color / mirror / 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>,
	"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH v3 29/31] Remove match_pathspec() in favor of match_pathspec_depth()
Date: Sun, 13 Jan 2013 19:35:37 +0700	[thread overview]
Message-ID: <1358080539-17436-30-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1358080539-17436-1-git-send-email-pclouds@gmail.com>


Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin/add.c |  46 ++++++++++++---------------
 dir.c         | 100 ----------------------------------------------------------
 dir.h         |   1 -
 3 files changed, 20 insertions(+), 127 deletions(-)

diff --git a/builtin/add.c b/builtin/add.c
index 89ae67d..9edab95 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -99,7 +99,7 @@ int add_files_to_cache(const char *prefix,
 	return !!data.add_errors;
 }
 
-static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
+static void fill_pathspec_matches(struct pathspec *pathspec, char *seen)
 {
 	int num_unmatched = 0, i;
 
@@ -109,49 +109,43 @@ static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
 	 * mistakenly think that the user gave a pathspec that did not match
 	 * anything.
 	 */
-	for (i = 0; i < specs; i++)
+	for (i = 0; i < pathspec->nr; i++)
 		if (!seen[i])
 			num_unmatched++;
 	if (!num_unmatched)
 		return;
 	for (i = 0; i < active_nr; i++) {
 		struct cache_entry *ce = active_cache[i];
-		match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, seen);
+		match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, seen);
 	}
 }
 
-static char *find_used_pathspec(const char **pathspec)
+static char *find_used_pathspec(struct pathspec *pathspec)
 {
 	char *seen;
-	int i;
-
-	for (i = 0; pathspec[i];  i++)
-		; /* just counting */
-	seen = xcalloc(i, 1);
-	fill_pathspec_matches(pathspec, seen, i);
+	seen = xcalloc(pathspec->nr, 1);
+	fill_pathspec_matches(pathspec, seen);
 	return seen;
 }
 
-static char *prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
+static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, int prefix)
 {
 	char *seen;
-	int i, specs;
+	int i;
 	struct dir_entry **src, **dst;
 
-	for (specs = 0; pathspec[specs];  specs++)
-		/* nothing */;
-	seen = xcalloc(specs, 1);
+	seen = xcalloc(pathspec->nr, 1);
 
 	src = dst = dir->entries;
 	i = dir->nr;
 	while (--i >= 0) {
 		struct dir_entry *entry = *src++;
-		if (match_pathspec(pathspec, entry->name, entry->len,
-				   prefix, seen))
+		if (match_pathspec_depth(pathspec, entry->name, entry->len,
+					 prefix, seen))
 			*dst++ = entry;
 	}
 	dir->nr = dst - dir->entries;
-	fill_pathspec_matches(pathspec, seen, specs);
+	fill_pathspec_matches(pathspec, seen);
 	return seen;
 }
 
@@ -401,7 +395,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 		/* This picks up the paths that are not tracked */
 		baselen = fill_directory(&dir, &pathspec);
 		if (pathspec.nr)
-			seen = prune_directory(&dir, pathspec.raw, baselen);
+			seen = prune_directory(&dir, &pathspec, baselen);
 	}
 
 	if (refresh_only) {
@@ -415,23 +409,23 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
 		path_exclude_check_init(&check, &dir);
 		if (!seen)
-			seen = find_used_pathspec(pathspec.raw);
+			seen = find_used_pathspec(&pathspec);
 
 		/*
 		 * file_exists() assumes exact match
 		 */
 		GUARD_PATHSPEC(&pathspec, PATHSPEC_FROMTOP);
 
-		for (i = 0; pathspec.raw[i]; i++) {
-			if (!seen[i] && pathspec.raw[i][0]
-			    && !file_exists(pathspec.raw[i])) {
+		for (i = 0; i < pathspec.nr; i++) {
+			const char *path = pathspec.items[i].match;
+			if (!seen[i] && !file_exists(path)) {
 				if (ignore_missing) {
 					int dtype = DT_UNKNOWN;
-					if (is_path_excluded(&check, pathspec.raw[i], -1, &dtype))
-						dir_add_ignored(&dir, pathspec.raw[i], strlen(pathspec.raw[i]));
+					if (is_path_excluded(&check, path, -1, &dtype))
+						dir_add_ignored(&dir, path, pathspec.items[i].len);
 				} else
 					die(_("pathspec '%s' did not match any files"),
-					    pathspec.raw[i]);
+					    pathspec.items[i].original);
 			}
 		}
 		free(seen);
diff --git a/dir.c b/dir.c
index 76b267e..2a1bcb8 100644
--- a/dir.c
+++ b/dir.c
@@ -139,106 +139,6 @@ int within_depth(const char *name, int namelen,
  *
  * It returns 0 when there is no match.
  */
-static int match_one(const char *match, const char *name, int namelen)
-{
-	int matchlen;
-	int literal = limit_pathspec_to_literal();
-
-	/* If the match was just the prefix, we matched */
-	if (!*match)
-		return MATCHED_RECURSIVELY;
-
-	if (ignore_case) {
-		for (;;) {
-			unsigned char c1 = tolower(*match);
-			unsigned char c2 = tolower(*name);
-			if (c1 == '\0' || (!literal && is_glob_special(c1)))
-				break;
-			if (c1 != c2)
-				return 0;
-			match++;
-			name++;
-			namelen--;
-		}
-	} else {
-		for (;;) {
-			unsigned char c1 = *match;
-			unsigned char c2 = *name;
-			if (c1 == '\0' || (!literal && is_glob_special(c1)))
-				break;
-			if (c1 != c2)
-				return 0;
-			match++;
-			name++;
-			namelen--;
-		}
-	}
-
-	/*
-	 * If we don't match the matchstring exactly,
-	 * we need to match by fnmatch
-	 */
-	matchlen = strlen(match);
-	if (strncmp_icase(match, name, matchlen)) {
-		if (literal)
-			return 0;
-		return !fnmatch_icase(match, name, 0) ? MATCHED_FNMATCH : 0;
-	}
-
-	if (namelen == matchlen)
-		return MATCHED_EXACTLY;
-	if (match[matchlen-1] == '/' || name[matchlen] == '/')
-		return MATCHED_RECURSIVELY;
-	return 0;
-}
-
-/*
- * Given a name and a list of pathspecs, see if the name matches
- * any of the pathspecs.  The caller is also interested in seeing
- * all pathspec matches some names it calls this function with
- * (otherwise the user could have mistyped the unmatched pathspec),
- * and a mark is left in seen[] array for pathspec element that
- * actually matched anything.
- */
-int match_pathspec(const char **pathspec, const char *name, int namelen,
-		int prefix, char *seen)
-{
-	int i, retval = 0;
-
-	if (!pathspec)
-		return 1;
-
-	name += prefix;
-	namelen -= prefix;
-
-	for (i = 0; pathspec[i] != NULL; i++) {
-		int how;
-		const char *match = pathspec[i] + prefix;
-		if (seen && seen[i] == MATCHED_EXACTLY)
-			continue;
-		how = match_one(match, name, namelen);
-		if (how) {
-			if (retval < how)
-				retval = how;
-			if (seen && seen[i] < how)
-				seen[i] = how;
-		}
-	}
-	return retval;
-}
-
-/*
- * Does 'match' match the given name?
- * A match is found if
- *
- * (1) the 'match' string is leading directory of 'name', or
- * (2) the 'match' string is a wildcard and matches 'name', or
- * (3) the 'match' string is exactly the same as 'name'.
- *
- * and the return value tells which case it was.
- *
- * It returns 0 when there is no match.
- */
 static int match_pathspec_item(const struct pathspec_item *item, int prefix,
 			       const char *name, int namelen)
 {
diff --git a/dir.h b/dir.h
index ff5ada5..a03af80 100644
--- a/dir.h
+++ b/dir.h
@@ -91,7 +91,6 @@ struct dir_struct {
 extern int simple_length(const char *match);
 extern int no_wildcard(const char *string);
 extern char *common_prefix(const struct pathspec *pathspec);
-extern int match_pathspec(const char **pathspec, const char *name, int namelen, int prefix, char *seen);
 extern int match_pathspec_depth(const struct pathspec *pathspec,
 				const char *name, int namelen,
 				int prefix, char *seen);
-- 
1.8.0.rc2.23.g1fb49df

  parent reply	other threads:[~2013-01-13 12:39 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-13 12:35 [PATCH v3 00/31] nd/parse-pathspec Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 01/31] clean: remove unused variable "seen" Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 02/31] Add copy_pathspec Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 03/31] Add parse_pathspec() that converts cmdline args to struct pathspec Nguyễn Thái Ngọc Duy
2013-01-14  0:05   ` Martin von Zweigbergk
2013-01-14  1:11     ` Duy Nguyen
2013-01-13 12:35 ` [PATCH v3 04/31] parse_pathspec: save original pathspec for reporting Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 05/31] Export parse_pathspec() and convert some get_pathspec() calls Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 06/31] Guard against new pathspec magic in pathspec matching code Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 07/31] clean: convert to use parse_pathspec Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 08/31] parse_pathspec: add PATHSPEC_EMPTY_MATCH_ALL Nguyễn Thái Ngọc Duy
2013-01-21 23:12   ` Martin von Zweigbergk
2013-01-22  2:46     ` Duy Nguyen
2013-01-13 12:35 ` [PATCH v3 09/31] commit: convert to use parse_pathspec Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 10/31] status: " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 11/31] rerere: " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 12/31] checkout: " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 13/31] rm: " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 14/31] parse_pathspec: support stripping submodule trailing slashes Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 15/31] ls-files: convert to use parse_pathspec Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 16/31] archive: " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 17/31] parse_pathspec: support stripping/checking submodule paths Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 18/31] add: convert to use parse_pathspec Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 19/31] Convert read_cache_preload() to take struct pathspec Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 20/31] Convert unmerge_cache " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 21/31] checkout: convert read_tree_some " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 22/31] Convert report_path_error " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 23/31] Convert refresh_index " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 24/31] Convert {read,fill}_directory " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 25/31] Convert add_files_to_cache " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 26/31] Convert common_prefix() to use " Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 27/31] Remove diff_tree_{setup,release}_paths Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 28/31] Remove init_pathspec() in favor of parse_pathspec() Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` Nguyễn Thái Ngọc Duy [this message]
2013-01-13 12:35 ` [PATCH v3 30/31] tree-diff: remove the use of pathspec's raw[] in follow-rename codepath Nguyễn Thái Ngọc Duy
2013-01-13 12:35 ` [PATCH v3 31/31] Rename field "raw" to "_raw" in struct pathspec Nguyễn Thái Ngọc Duy
2013-01-13 23:21 ` [PATCH v3 00/31] nd/parse-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=1358080539-17436-30-git-send-email-pclouds@gmail.com \
    --to=pclouds@gmail.com \
    --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.