Subject: [PATCH v4 00/16] pathspec cleanup

From: Brandon Williams <[email-masked]>
Date: Tue, 3 Jan 2017 10:42:25 -0800

v4 addresses a few comments from Duy.
* [2/16] push the guard pathspec macro into simplify_away() and
  exclude_matches_pathsepc().
* [6/16] when freeing a pathspec struct, set pathsepc->nr = 0.
* [8/16] tweak the die message when using unsupported magic to be more human
  readable.

Brandon Williams (16):
  mv: remove use of deprecated 'get_pathspec()'
  dir: remove struct path_simplify
  dir: convert fill_directory to use the pathspec struct interface
  ls-tree: convert show_recursive to use the pathspec struct interface
  pathspec: remove the deprecated get_pathspec function
  pathspec: copy and free owned memory
  pathspec: remove unused variable from unsupported_magic
  pathspec: always show mnemonic and name in unsupported_magic
  pathspec: simpler logic to prefix original pathspec elements
  pathspec: factor global magic into its own function
  pathspec: create parse_short_magic function
  pathspec: create parse_long_magic function
  pathspec: create parse_element_magic helper
  pathspec: create strip submodule slash helpers
  pathspec: small readability changes
  pathspec: rename prefix_pathspec to init_pathspec_item

 Documentation/technical/api-setup.txt |   2 -
 builtin/ls-tree.c                     |  16 +-
 builtin/mv.c                          |  50 ++--
 cache.h                               |   1 -
 dir.c                                 | 193 ++++++--------
 pathspec.c                            | 480 +++++++++++++++++++---------------
 pathspec.h                            |   5 +-
 7 files changed, 390 insertions(+), 357 deletions(-)

--- interdiff between v3 and v4

diff --git a/dir.c b/dir.c
index 15f7c9993..e8ddd7f8a 100644
--- a/dir.c
+++ b/dir.c
@@ -1353,6 +1353,15 @@ static int simplify_away(const char *path, int pathlen,
 {
 	int i;
 
+	if (pathspec)
+		guard_pathspec(pathspec,
+			       pathspec_fromtop |
+			       pathspec_maxdepth |
+			       pathspec_literal |
+			       pathspec_glob |
+			       pathspec_icase |
+			       pathspec_exclude);
+
 	if (!pathspec || !pathspec->nr)
 		return 0;
 
@@ -1385,6 +1394,15 @@ static int exclude_matches_pathspec(const char *path, int pathlen,
 {
 	int i;
 
+	if (pathspec)
+		guard_pathspec(pathspec,
+			       pathspec_fromtop |
+			       pathspec_maxdepth |
+			       pathspec_literal |
+			       pathspec_glob |
+			       pathspec_icase |
+			       pathspec_exclude);
+
 	if (!pathspec || !pathspec->nr)
 		return 0;
 
@@ -1996,15 +2014,6 @@ int read_directory(struct dir_struct *dir, const char *path,
 {
 	struct untracked_cache_dir *untracked;
 
-	if (pathspec)
-		guard_pathspec(pathspec,
-			       pathspec_fromtop |
-			       pathspec_maxdepth |
-			       pathspec_literal |
-			       pathspec_glob |
-			       pathspec_icase |
-			       pathspec_exclude);
-
 	if (has_symlink_leading_path(path, len))
 		return dir->nr;

diff --git a/pathspec.c b/pathspec.c
index d4efcf666..bcf3ba039 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -414,10 +414,11 @@ static void NORETURN unsupported_magic(const char *pattern,
 		if (!(magic & m->bit))
 			continue;
 		if (sb.len)
-			strbuf_addch(&sb, ' ');
+			strbuf_addstr(&sb, ", ");
 
 		if (m->mnemonic)
-			strbuf_addf(&sb, "'(%c)%s'", m->mnemonic, m->name);
+			strbuf_addf(&sb, "'%s' (mnemonic: '%c')",
+				    m->name, m->mnemonic);
 		else
 			strbuf_addf(&sb, "'%s'", m->name);
 	}
@@ -544,4 +545,5 @@ void clear_pathspec(struct pathspec *pathspec)
 	}
 	free(pathspec->items);
 	pathspec->items = NULL;
+	pathspec->nr = 0;
 }

-- 
2.11.0.390.gc69c2f50cf-goog