git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 00/16] pathspec cleanup

From
BWBrandon Williams <bmwill@google.com>
Date
Dec 8, 2016, 18:58 UTC
Message-ID
<1481223550-65277-1-git-send-email-bmwill@google.com>
In-Reply-To
<1481061106-117775-1-git-send-email-bmwill@google.com>

v2 of this series addresses the comments brought up in v1, most of which were small cosmetic changes (since this is mostly a cosmetic series to begin with).

Brandon Williams (16):
  mv: remove use of deprecated 'get_pathspec()'
  dir: convert create_simplify to use the pathspec struct interface
  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                                 |  37 +--
 pathspec.c                            | 468 +++++++++++++++++++---------------
 pathspec.h                            |   5 +-
 7 files changed, 317 insertions(+), 262 deletions(-)
--- interdiff from v1
diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c
index e0f4307..d7ebeb4 100644
--- a/builtin/ls-tree.c
+++ b/builtin/ls-tree.c
@@ -173,8 +173,8 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
 	 * cannot be lifted until it is converted to use
 	 * match_pathspec() or tree_entry_interesting()
 	 */
-	parse_pathspec(&pathspec, PATHSPEC_GLOB | PATHSPEC_ICASE |
-				  PATHSPEC_EXCLUDE,
+	parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC &
+				  ~(PATHSPEC_FROMTOP | PATHSPEC_LITERAL),
 		       PATHSPEC_PREFER_CWD,
 		       prefix, argv + 1);
 	for (i = 0; i < pathspec.nr; i++)
diff --git a/builtin/mv.c b/builtin/mv.c
index b7cceb6..4e86dc5 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -20,13 +20,13 @@ static const char * const builtin_mv_usage[] = {
 #define DUP_BASENAME 1
 #define KEEP_TRAILING_SLASH 2
 
-static const char **internal_copy_pathspec(const char *prefix,
-					   const char **pathspec,
-					   int count, unsigned flags)
+static const char **internal_prefix_pathspec(const char *prefix,
+					     const char **pathspec,
+					     int count, unsigned flags)
 {
 	int i;
 	const char **result;
-	struct pathspec ps;
+	int prefixlen = prefix ? strlen(prefix) : 0;
 	ALLOC_ARRAY(result, count + 1);
 
 	/* Create an intermediate copy of the pathspec based on the flags */
@@ -42,25 +42,19 @@ static const char **internal_copy_pathspec(const char *prefix,
 		if (flags & DUP_BASENAME) {
 			result[i] = xstrdup(basename(it));
 			free(it);
-		} else
+		} else {
 			result[i] = it;
+		}
 	}
 	result[count] = NULL;
 
-	parse_pathspec(&ps,
-		       PATHSPEC_ALL_MAGIC &
-		       ~(PATHSPEC_FROMTOP | PATHSPEC_LITERAL),
-		       PATHSPEC_KEEP_ORDER | PATHSPEC_PREFER_CWD,
-		       prefix, result);
-	assert(count == ps.nr);
-
-	/* Copy the pathspec and free the old intermediate strings */
+	/* Prefix the pathspec and free the old intermediate strings */
 	for (i = 0; i < count; i++) {
+		const char *match = prefix_path(prefix, prefixlen, result[i]);
 		free((char *) result[i]);
-		result[i] = xstrdup(ps.items[i].match);
+		result[i] = match;
 	}
 
-	clear_pathspec(&ps);
 	return result;
 }
 
@@ -148,7 +142,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	if (read_cache() < 0)
 		die(_("index file corrupt"));
 
-	source = internal_copy_pathspec(prefix, argv, argc, 0);
+	source = internal_prefix_pathspec(prefix, argv, argc, 0);
 	modes = xcalloc(argc, sizeof(enum update_mode));
 	/*
 	 * Keep trailing slash, needed to let
@@ -158,16 +152,16 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	flags = KEEP_TRAILING_SLASH;
 	if (argc == 1 && is_directory(argv[0]) && !is_directory(argv[1]))
 		flags = 0;
-	dest_path = internal_copy_pathspec(prefix, argv + argc, 1, flags);
+	dest_path = internal_prefix_pathspec(prefix, argv + argc, 1, flags);
 	submodule_gitfile = xcalloc(argc, sizeof(char *));
 
 	if (dest_path[0][0] == '\0')
 		/* special case: "." was normalized to "" */
-		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
+		destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	else if (!lstat(dest_path[0], &st) &&
 			S_ISDIR(st.st_mode)) {
 		dest_path[0] = add_slash(dest_path[0]);
-		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
+		destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	} else {
 		if (argc != 1)
 			die(_("destination '%s' is not a directory"), dest_path[0]);
diff --git a/dir.c b/dir.c
index 8730a4f..a50b6f0 100644
--- a/dir.c
+++ b/dir.c
@@ -179,18 +179,21 @@ char *common_prefix(const struct pathspec *pathspec)
 
 int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec)
 {
-	size_t len;
+	char *prefix;
+	size_t prefix_len;
 
 	/*
 	 * Calculate common prefix for the pathspec, and
 	 * use that to optimize the directory walk
 	 */
-	len = common_prefix_len(pathspec);
+	prefix = common_prefix(pathspec);
+	prefix_len = prefix ? strlen(prefix) : 0;
 
 	/* Read the directory and prune it */
-	read_directory(dir, pathspec->nr ? pathspec->items[0].match : "",
-		       len, pathspec);
-	return len;
+	read_directory(dir, prefix, prefix_len, pathspec);
+
+	free(prefix);
+	return prefix_len;
 }
 
 int within_depth(const char *name, int namelen,
diff --git a/pathspec.c b/pathspec.c
index 66db257..08abdd3 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -89,41 +89,42 @@ static void prefix_magic(struct strbuf *sb, int prefixlen, unsigned magic)
 
 static inline int get_literal_global(void)
 {
-	static int literal_global = -1;
+	static int literal = -1;
 
-	if (literal_global < 0)
-		literal_global = git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT,
-					      0);
-	return literal_global;
+	if (literal < 0)
+		literal = git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT, 0);
+
+	return literal;
 }
 
 static inline int get_glob_global(void)
 {
-	static int glob_global = -1;
+	static int glob = -1;
+
+	if (glob < 0)
+		glob = git_env_bool(GIT_GLOB_PATHSPECS_ENVIRONMENT, 0);
 
-	if (glob_global < 0)
-		glob_global = git_env_bool(GIT_GLOB_PATHSPECS_ENVIRONMENT, 0);
-	return glob_global;
+	return glob;
 }
 
 static inline int get_noglob_global(void)
 {
-	static int noglob_global = -1;
+	static int noglob = -1;
+
+	if (noglob < 0)
+		noglob = git_env_bool(GIT_NOGLOB_PATHSPECS_ENVIRONMENT, 0);
 
-	if (noglob_global < 0)
-		noglob_global = git_env_bool(GIT_NOGLOB_PATHSPECS_ENVIRONMENT,
-					     0);
-	return noglob_global;
+	return noglob;
 }
 
 static inline int get_icase_global(void)
 {
-	static int icase_global = -1;
+	static int icase = -1;
 
-	if (icase_global < 0)
-		icase_global = git_env_bool(GIT_ICASE_PATHSPECS_ENVIRONMENT, 0);
+	if (icase < 0)
+		icase = git_env_bool(GIT_ICASE_PATHSPECS_ENVIRONMENT, 0);
 
-	return icase_global;
+	return icase;
 }
 
 static int get_global_magic(int element_magic)
@@ -296,13 +297,11 @@ static void strip_submodule_slash_expensive(struct pathspec_item *item)
 }
 
 /*
- * Take an element of a pathspec and check for magic signatures.
- * Append the result to the prefix. Return the magic bitmap.
+ * Perform the initialization of a pathspec_item based on a pathspec element.
  */
-static unsigned prefix_pathspec(struct pathspec_item *item,
-				unsigned flags,
-				const char *prefix, int prefixlen,
-				const char *elt)
+static void init_pathspec_item(struct pathspec_item *item, unsigned flags,
+			       const char *prefix, int prefixlen,
+			       const char *elt)
 {
 	unsigned magic = 0, element_magic = 0;
 	const char *copyfrom = elt;
@@ -310,7 +309,9 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
 	int pathspec_prefix = -1;
 
 	/* PATHSPEC_LITERAL_PATH ignores magic */
-	if (!(flags & PATHSPEC_LITERAL_PATH)) {
+	if (flags & PATHSPEC_LITERAL_PATH) {
+		magic = PATHSPEC_LITERAL;
+	} else {
 		copyfrom = parse_element_magic(&element_magic,
 					       &pathspec_prefix,
 					       elt);
@@ -318,6 +319,8 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
 		magic |= get_global_magic(element_magic);
 	}
 
+	item->magic = magic;
+
 	if (pathspec_prefix >= 0 &&
 	    (prefixlen || (prefix && *prefix)))
 		die("BUG: 'prefix' magic is supposed to be used at worktree's root");
@@ -390,7 +393,6 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
 	/* sanity checks, pathspec matchers assume these are sane */
 	assert(item->nowildcard_len <= item->len &&
 	       item->prefix         <= item->len);
-	return magic;
 }
 
 static int pathspec_item_cmp(const void *a_, const void *b_)
@@ -489,17 +491,12 @@ void parse_pathspec(struct pathspec *pathspec,
 	for (i = 0; i < n; i++) {
 		entry = argv[i];
 
-		item[i].magic = prefix_pathspec(item + i,
-						flags,
-						prefix, prefixlen, entry);
-		if ((flags & PATHSPEC_LITERAL_PATH) &&
-		    !(magic_mask & PATHSPEC_LITERAL))
-			item[i].magic |= PATHSPEC_LITERAL;
+		init_pathspec_item(item + i, flags, prefix, prefixlen, entry);
+
 		if (item[i].magic & PATHSPEC_EXCLUDE)
 			nr_exclude++;
 		if (item[i].magic & magic_mask)
-			unsupported_magic(entry,
-					  item[i].magic & magic_mask);
+			unsupported_magic(entry, item[i].magic & magic_mask);
 
 		if ((flags & PATHSPEC_SYMLINK_LEADING_PATH) &&
 		    has_symlink_leading_path(item[i].match, item[i].len)) {
-- 
2.8.0.rc3.226.g39d4020
Previous: Junio C HamanoNext: Brandon Williams
Message 51 of 142 in “pathspec cleanup”
  1. 00/17 pathspec cleanupBrandon Williams, Dec 6, 2016
  2. 01/17 mv: convert to using pathspec struct interfaceBrandon Williams, Dec 6, 2016
  3. Duy NguyenDec 7, 2016
  4. Brandon WilliamsDec 8, 2016
  5. Duy NguyenDec 8, 2016
  6. Brandon WilliamsDec 8, 2016
  7. 02/17 dir: convert create_simplify to use the pathspec struct interfaceBrandon Williams, Dec 6, 2016
  8. Duy NguyenDec 7, 2016
  9. Brandon WilliamsDec 8, 2016
  10. Duy NguyenDec 8, 2016
  11. Brandon WilliamsDec 8, 2016
  12. Duy NguyenDec 9, 2016
  13. Brandon WilliamsDec 9, 2016
  14. Brandon WilliamsDec 13, 2016
  15. 03/17 dir: convert fill_directory to use the pathspec struct interfaceBrandon Williams, Dec 6, 2016
  16. Duy NguyenDec 7, 2016
  17. Brandon WilliamsDec 7, 2016
  18. 10/17 pathspec: simpler logic to prefix original pathspec elementsBrandon Williams, Dec 6, 2016
  19. Stefan BellerDec 6, 2016
  20. Brandon WilliamsDec 6, 2016
  21. 08/17 pathspec: remove unused variable from unsupported_magicBrandon Williams, Dec 6, 2016
  22. 09/17 pathspec: always show mnemonic and name in unsupported_magicBrandon Williams, Dec 6, 2016
  23. Duy NguyenDec 7, 2016
  24. Brandon WilliamsDec 7, 2016
  25. Duy NguyenDec 7, 2016
  26. Brandon WilliamsDec 7, 2016
  27. 16/17 pathspec: small readability changesBrandon Williams, Dec 6, 2016
  28. Stefan BellerDec 6, 2016
  29. Duy NguyenDec 7, 2016
  30. Brandon WilliamsDec 7, 2016
  31. Duy NguyenDec 8, 2016
  32. Duy NguyenDec 7, 2016
  33. Junio C HamanoDec 7, 2016
  34. Brandon WilliamsDec 7, 2016
  35. 13/17 pathspec: create parse_long_magic functionBrandon Williams, Dec 6, 2016
  36. 14/17 pathspec: create parse_element_magic helperBrandon Williams, Dec 6, 2016
  37. 11/17 pathspec: factor global magic into its own functionBrandon Williams, Dec 6, 2016
  38. Duy NguyenDec 7, 2016
  39. Brandon WilliamsDec 7, 2016
  40. Duy NguyenDec 8, 2016
  41. 12/17 pathspec: create parse_short_magic functionBrandon Williams, Dec 6, 2016
  42. 07/17 mv: small code cleanupBrandon Williams, Dec 6, 2016
  43. 06/17 pathspec: copy and free owned memoryBrandon Williams, Dec 6, 2016
  44. 04/17 ls-tree: convert show_recursive to use the pathspec struct interfaceBrandon Williams, Dec 6, 2016
  45. Duy NguyenDec 7, 2016
  46. Brandon WilliamsDec 7, 2016
  47. 05/17 pathspec: remove the deprecated get_pathspec functionBrandon Williams, Dec 6, 2016
  48. 17/17 pathspec: remove outdated commentBrandon Williams, Dec 6, 2016
  49. 15/17 pathspec: create strip submodule slash helpersBrandon Williams, Dec 6, 2016
  50. Junio C HamanoDec 7, 2016
  51. 00/16 pathspec cleanupBrandon Williams, Dec 8, 2016
  52. 01/16 mv: remove use of deprecated 'get_pathspec()'Brandon Williams, Dec 8, 2016
  53. 02/16 dir: convert create_simplify to use the pathspec struct interfaceBrandon Williams, Dec 8, 2016
  54. 03/16 dir: convert fill_directory to use the pathspec struct interfaceBrandon Williams, Dec 8, 2016
  55. 06/16 pathspec: copy and free owned memoryBrandon Williams, Dec 8, 2016
  56. 11/16 pathspec: create parse_short_magic functionBrandon Williams, Dec 8, 2016
  57. 10/16 pathspec: factor global magic into its own functionBrandon Williams, Dec 8, 2016
  58. 09/16 pathspec: simpler logic to prefix original pathspec elementsBrandon Williams, Dec 8, 2016
  59. 12/16 pathspec: create parse_long_magic functionBrandon Williams, Dec 8, 2016
  60. Junio C HamanoDec 9, 2016
  61. Stefan BellerDec 9, 2016
  62. Brandon WilliamsDec 10, 2016
  63. Junio C HamanoDec 10, 2016
  64. Stefan BellerDec 12, 2016
  65. Junio C HamanoDec 12, 2016
  66. 16/16 pathspec: rename prefix_pathspec to init_pathspec_itemBrandon Williams, Dec 8, 2016
  67. 13/16 pathspec: create parse_element_magic helperBrandon Williams, Dec 8, 2016
  68. 15/16 pathspec: small readability changesBrandon Williams, Dec 8, 2016
  69. 14/16 pathspec: create strip submodule slash helpersBrandon Williams, Dec 8, 2016
  70. Junio C HamanoDec 9, 2016
  71. Duy NguyenDec 9, 2016
  72. 14/16 pathspec: create strip submodule slash helpersBrandon Williams, Dec 9, 2016
  73. Stefan BellerDec 9, 2016
  74. Brandon WilliamsDec 9, 2016
  75. 08/16 pathspec: always show mnemonic and name in unsupported_magicBrandon Williams, Dec 8, 2016
  76. 04/16 ls-tree: convert show_recursive to use the pathspec struct interfaceBrandon Williams, Dec 8, 2016
  77. 05/16 pathspec: remove the deprecated get_pathspec functionBrandon Williams, Dec 8, 2016
  78. 07/16 pathspec: remove unused variable from unsupported_magicBrandon Williams, Dec 8, 2016
  79. Junio C HamanoDec 9, 2016
  80. Brandon WilliamsDec 9, 2016
  81. 00/16 pathspec cleanupBrandon Williams, Dec 13, 2016
  82. 02/16 dir: remove struct path_simplifyBrandon Williams, Dec 13, 2016
  83. Stefan BellerDec 19, 2016
  84. Duy NguyenJan 3, 2017
  85. 04/16 ls-tree: convert show_recursive to use the pathspec struct interfaceBrandon Williams, Dec 13, 2016
  86. 03/16 dir: convert fill_directory to use the pathspec struct interfaceBrandon Williams, Dec 13, 2016
  87. 07/16 pathspec: remove unused variable from unsupported_magicBrandon Williams, Dec 13, 2016
  88. 08/16 pathspec: always show mnemonic and name in unsupported_magicBrandon Williams, Dec 13, 2016
  89. Duy NguyenJan 3, 2017
  90. Brandon WilliamsJan 3, 2017
  91. 06/16 pathspec: copy and free owned memoryBrandon Williams, Dec 13, 2016
  92. Duy NguyenJan 3, 2017
  93. 01/16 mv: remove use of deprecated 'get_pathspec()'Brandon Williams, Dec 13, 2016
  94. 09/16 pathspec: simpler logic to prefix original pathspec elementsBrandon Williams, Dec 13, 2016
  95. 05/16 pathspec: remove the deprecated get_pathspec functionBrandon Williams, Dec 13, 2016
  96. 13/16 pathspec: create parse_element_magic helperBrandon Williams, Dec 13, 2016
  97. 15/16 pathspec: small readability changesBrandon Williams, Dec 13, 2016
  98. 14/16 pathspec: create strip submodule slash helpersBrandon Williams, Dec 13, 2016
  99. 12/16 pathspec: create parse_long_magic functionBrandon Williams, Dec 13, 2016
  100. 16/16 pathspec: rename prefix_pathspec to init_pathspec_itemBrandon Williams, Dec 13, 2016
  101. 11/16 pathspec: create parse_short_magic functionBrandon Williams, Dec 13, 2016
  102. 10/16 pathspec: factor global magic into its own functionBrandon Williams, Dec 13, 2016
  103. 00/16 pathspec cleanupBrandon Williams, Jan 3, 2017
  104. 03/16 dir: convert fill_directory to use the pathspec struct interfaceBrandon Williams, Jan 3, 2017
  105. 10/16 pathspec: factor global magic into its own functionBrandon Williams, Jan 3, 2017
  106. 04/16 ls-tree: convert show_recursive to use the pathspec struct interfaceBrandon Williams, Jan 3, 2017
  107. 01/16 mv: remove use of deprecated 'get_pathspec()'Brandon Williams, Jan 3, 2017
  108. 09/16 pathspec: simpler logic to prefix original pathspec elementsBrandon Williams, Jan 3, 2017
  109. 14/16 pathspec: create strip submodule slash helpersBrandon Williams, Jan 3, 2017
  110. 08/16 pathspec: always show mnemonic and name in unsupported_magicBrandon Williams, Jan 3, 2017
  111. 07/16 pathspec: remove unused variable from unsupported_magicBrandon Williams, Jan 3, 2017
  112. 05/16 pathspec: remove the deprecated get_pathspec functionBrandon Williams, Jan 3, 2017
  113. 13/16 pathspec: create parse_element_magic helperBrandon Williams, Jan 3, 2017
  114. 11/16 pathspec: create parse_short_magic functionBrandon Williams, Jan 3, 2017
  115. 06/16 pathspec: copy and free owned memoryBrandon Williams, Jan 3, 2017
  116. 15/16 pathspec: small readability changesBrandon Williams, Jan 3, 2017
  117. 02/16 dir: remove struct path_simplifyBrandon Williams, Jan 3, 2017
  118. 12/16 pathspec: create parse_long_magic functionBrandon Williams, Jan 3, 2017
  119. 16/16 pathspec: rename prefix_pathspec to init_pathspec_itemBrandon Williams, Jan 3, 2017
  120. Duy NguyenJan 4, 2017
  121. Brandon WilliamsJan 4, 2017
  122. Brandon WilliamsJan 4, 2017
  123. 00/16 pathspec cleanupBrandon Williams, Jan 4, 2017
  124. 15/16 pathspec: small readability changesBrandon Williams, Jan 4, 2017
  125. 13/16 pathspec: create parse_element_magic helperBrandon Williams, Jan 4, 2017
  126. 12/16 pathspec: create parse_long_magic functionBrandon Williams, Jan 4, 2017
  127. 10/16 pathspec: factor global magic into its own functionBrandon Williams, Jan 4, 2017
  128. 08/16 pathspec: always show mnemonic and name in unsupported_magicBrandon Williams, Jan 4, 2017
  129. 09/16 pathspec: simpler logic to prefix original pathspec elementsBrandon Williams, Jan 4, 2017
  130. 16/16 pathspec: rename prefix_pathspec to init_pathspec_itemBrandon Williams, Jan 4, 2017
  131. 14/16 pathspec: create strip submodule slash helpersBrandon Williams, Jan 4, 2017
  132. 07/16 pathspec: remove unused variable from unsupported_magicBrandon Williams, Jan 4, 2017
  133. 11/16 pathspec: create parse_short_magic functionBrandon Williams, Jan 4, 2017
  134. 04/16 ls-tree: convert show_recursive to use the pathspec struct interfaceBrandon Williams, Jan 4, 2017
  135. 02/16 dir: remove struct path_simplifyBrandon Williams, Jan 4, 2017
  136. 03/16 dir: convert fill_directory to use the pathspec struct interfaceBrandon Williams, Jan 4, 2017
  137. 01/16 mv: remove use of deprecated 'get_pathspec()'Brandon Williams, Jan 4, 2017
  138. 05/16 pathspec: remove the deprecated get_pathspec functionBrandon Williams, Jan 4, 2017
  139. 06/16 pathspec: copy and free owned memoryBrandon Williams, Jan 4, 2017
  140. Duy NguyenJan 7, 2017
  141. Junio C HamanoJan 9, 2017
  142. Brandon WilliamsJan 9, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.