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

[PATCH 04/24] read-cache: move shared commit and ls-files code

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
May 7, 2023, 03:45 UTC
Message-ID
<d5a5b511f6ddb7bad9c723581c8c83ae0644f3b8.1683431151.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1525.git.1683431149.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

The function overlay_tree_on_index(), plus associated helper functions, were defined in builtin/ls-files.c, but also shared with builtin/commit.c. Move these shared functions to read-cache.c.

Diff best viewed with `--color-moved`.
Signed-off-by: Elijah Newren <newren@gmail.com>
---
 builtin/ls-files.c | 137 ---------------------------------------------
 read-cache.c       | 137 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 137 insertions(+), 137 deletions(-)
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 625f48f0d61..069b28bd484 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -516,143 +516,6 @@ static int get_common_prefix_len(const char *common_prefix)
 	return common_prefix_len;
 }
 
-static int read_one_entry_opt(struct index_state *istate,
-			      const struct object_id *oid,
-			      struct strbuf *base,
-			      const char *pathname,
-			      unsigned mode, int opt)
-{
-	int len;
-	struct cache_entry *ce;
-
-	if (S_ISDIR(mode))
-		return READ_TREE_RECURSIVE;
-
-	len = strlen(pathname);
-	ce = make_empty_cache_entry(istate, base->len + len);
-
-	ce->ce_mode = create_ce_mode(mode);
-	ce->ce_flags = create_ce_flags(1);
-	ce->ce_namelen = base->len + len;
-	memcpy(ce->name, base->buf, base->len);
-	memcpy(ce->name + base->len, pathname, len+1);
-	oidcpy(&ce->oid, oid);
-	return add_index_entry(istate, ce, opt);
-}
-
-static int read_one_entry(const struct object_id *oid, struct strbuf *base,
-			  const char *pathname, unsigned mode,
-			  void *context)
-{
-	struct index_state *istate = context;
-	return read_one_entry_opt(istate, oid, base, pathname,
-				  mode,
-				  ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK);
-}
-
-/*
- * This is used when the caller knows there is no existing entries at
- * the stage that will conflict with the entry being added.
- */
-static int read_one_entry_quick(const struct object_id *oid, struct strbuf *base,
-				const char *pathname, unsigned mode,
-				void *context)
-{
-	struct index_state *istate = context;
-	return read_one_entry_opt(istate, oid, base, pathname,
-				  mode, ADD_CACHE_JUST_APPEND);
-}
-
-/*
- * Read the tree specified with --with-tree option
- * (typically, HEAD) into stage #1 and then
- * squash them down to stage #0.  This is used for
- * --error-unmatch to list and check the path patterns
- * that were given from the command line.  We are not
- * going to write this index out.
- */
-void overlay_tree_on_index(struct index_state *istate,
-			   const char *tree_name, const char *prefix)
-{
-	struct tree *tree;
-	struct object_id oid;
-	struct pathspec pathspec;
-	struct cache_entry *last_stage0 = NULL;
-	int i;
-	read_tree_fn_t fn = NULL;
-	int err;
-
-	if (repo_get_oid(the_repository, tree_name, &oid))
-		die("tree-ish %s not found.", tree_name);
-	tree = parse_tree_indirect(&oid);
-	if (!tree)
-		die("bad tree-ish %s", tree_name);
-
-	/* Hoist the unmerged entries up to stage #3 to make room */
-	/* TODO: audit for interaction with sparse-index. */
-	ensure_full_index(istate);
-	for (i = 0; i < istate->cache_nr; i++) {
-		struct cache_entry *ce = istate->cache[i];
-		if (!ce_stage(ce))
-			continue;
-		ce->ce_flags |= CE_STAGEMASK;
-	}
-
-	if (prefix) {
-		static const char *(matchbuf[1]);
-		matchbuf[0] = NULL;
-		parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC,
-			       PATHSPEC_PREFER_CWD, prefix, matchbuf);
-	} else
-		memset(&pathspec, 0, sizeof(pathspec));
-
-	/*
-	 * See if we have cache entry at the stage.  If so,
-	 * do it the original slow way, otherwise, append and then
-	 * sort at the end.
-	 */
-	for (i = 0; !fn && i < istate->cache_nr; i++) {
-		const struct cache_entry *ce = istate->cache[i];
-		if (ce_stage(ce) == 1)
-			fn = read_one_entry;
-	}
-
-	if (!fn)
-		fn = read_one_entry_quick;
-	err = read_tree(the_repository, tree, &pathspec, fn, istate);
-	clear_pathspec(&pathspec);
-	if (err)
-		die("unable to read tree entries %s", tree_name);
-
-	/*
-	 * Sort the cache entry -- we need to nuke the cache tree, though.
-	 */
-	if (fn == read_one_entry_quick) {
-		cache_tree_free(&istate->cache_tree);
-		QSORT(istate->cache, istate->cache_nr, cmp_cache_name_compare);
-	}
-
-	for (i = 0; i < istate->cache_nr; i++) {
-		struct cache_entry *ce = istate->cache[i];
-		switch (ce_stage(ce)) {
-		case 0:
-			last_stage0 = ce;
-			/* fallthru */
-		default:
-			continue;
-		case 1:
-			/*
-			 * If there is stage #0 entry for this, we do not
-			 * need to show it.  We use CE_UPDATE bit to mark
-			 * such an entry.
-			 */
-			if (last_stage0 &&
-			    !strcmp(last_stage0->name, ce->name))
-				ce->ce_flags |= CE_UPDATE;
-		}
-	}
-}
-
 static const char * const ls_files_usage[] = {
 	N_("git ls-files [<options>] [<file>...]"),
 	NULL
diff --git a/read-cache.c b/read-cache.c
index f4c31a68c85..c0df4586c9b 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -3806,3 +3806,140 @@ void prefetch_cache_entries(const struct index_state *istate,
 				   to_fetch.oid, to_fetch.nr);
 	oid_array_clear(&to_fetch);
 }
+
+static int read_one_entry_opt(struct index_state *istate,
+			      const struct object_id *oid,
+			      struct strbuf *base,
+			      const char *pathname,
+			      unsigned mode, int opt)
+{
+	int len;
+	struct cache_entry *ce;
+
+	if (S_ISDIR(mode))
+		return READ_TREE_RECURSIVE;
+
+	len = strlen(pathname);
+	ce = make_empty_cache_entry(istate, base->len + len);
+
+	ce->ce_mode = create_ce_mode(mode);
+	ce->ce_flags = create_ce_flags(1);
+	ce->ce_namelen = base->len + len;
+	memcpy(ce->name, base->buf, base->len);
+	memcpy(ce->name + base->len, pathname, len+1);
+	oidcpy(&ce->oid, oid);
+	return add_index_entry(istate, ce, opt);
+}
+
+static int read_one_entry(const struct object_id *oid, struct strbuf *base,
+			  const char *pathname, unsigned mode,
+			  void *context)
+{
+	struct index_state *istate = context;
+	return read_one_entry_opt(istate, oid, base, pathname,
+				  mode,
+				  ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK);
+}
+
+/*
+ * This is used when the caller knows there is no existing entries at
+ * the stage that will conflict with the entry being added.
+ */
+static int read_one_entry_quick(const struct object_id *oid, struct strbuf *base,
+				const char *pathname, unsigned mode,
+				void *context)
+{
+	struct index_state *istate = context;
+	return read_one_entry_opt(istate, oid, base, pathname,
+				  mode, ADD_CACHE_JUST_APPEND);
+}
+
+/*
+ * Read the tree specified with --with-tree option
+ * (typically, HEAD) into stage #1 and then
+ * squash them down to stage #0.  This is used for
+ * --error-unmatch to list and check the path patterns
+ * that were given from the command line.  We are not
+ * going to write this index out.
+ */
+void overlay_tree_on_index(struct index_state *istate,
+			   const char *tree_name, const char *prefix)
+{
+	struct tree *tree;
+	struct object_id oid;
+	struct pathspec pathspec;
+	struct cache_entry *last_stage0 = NULL;
+	int i;
+	read_tree_fn_t fn = NULL;
+	int err;
+
+	if (repo_get_oid(the_repository, tree_name, &oid))
+		die("tree-ish %s not found.", tree_name);
+	tree = parse_tree_indirect(&oid);
+	if (!tree)
+		die("bad tree-ish %s", tree_name);
+
+	/* Hoist the unmerged entries up to stage #3 to make room */
+	/* TODO: audit for interaction with sparse-index. */
+	ensure_full_index(istate);
+	for (i = 0; i < istate->cache_nr; i++) {
+		struct cache_entry *ce = istate->cache[i];
+		if (!ce_stage(ce))
+			continue;
+		ce->ce_flags |= CE_STAGEMASK;
+	}
+
+	if (prefix) {
+		static const char *(matchbuf[1]);
+		matchbuf[0] = NULL;
+		parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC,
+			       PATHSPEC_PREFER_CWD, prefix, matchbuf);
+	} else
+		memset(&pathspec, 0, sizeof(pathspec));
+
+	/*
+	 * See if we have cache entry at the stage.  If so,
+	 * do it the original slow way, otherwise, append and then
+	 * sort at the end.
+	 */
+	for (i = 0; !fn && i < istate->cache_nr; i++) {
+		const struct cache_entry *ce = istate->cache[i];
+		if (ce_stage(ce) == 1)
+			fn = read_one_entry;
+	}
+
+	if (!fn)
+		fn = read_one_entry_quick;
+	err = read_tree(the_repository, tree, &pathspec, fn, istate);
+	clear_pathspec(&pathspec);
+	if (err)
+		die("unable to read tree entries %s", tree_name);
+
+	/*
+	 * Sort the cache entry -- we need to nuke the cache tree, though.
+	 */
+	if (fn == read_one_entry_quick) {
+		cache_tree_free(&istate->cache_tree);
+		QSORT(istate->cache, istate->cache_nr, cmp_cache_name_compare);
+	}
+
+	for (i = 0; i < istate->cache_nr; i++) {
+		struct cache_entry *ce = istate->cache[i];
+		switch (ce_stage(ce)) {
+		case 0:
+			last_stage0 = ce;
+			/* fallthru */
+		default:
+			continue;
+		case 1:
+			/*
+			 * If there is stage #0 entry for this, we do not
+			 * need to show it.  We use CE_UPDATE bit to mark
+			 * such an entry.
+			 */
+			if (last_stage0 &&
+			    !strcmp(last_stage0->name, ce->name))
+				ce->ce_flags |= CE_UPDATE;
+		}
+	}
+}
-- 
gitgitgadget
Previous: Elijah Newren via GitGitGadgetNext: Elijah Newren via GitGitGadget
Message 10 of 115 in “Header cleanups (final splitting of cache.h, and some splitting of other headers)”
  1. 00/24 Header cleanups (final splitting of cache.h, and some splitting of other headers)Elijah Newren via GitGitGadget, May 7, 2023
  2. 01/24 init-db: remove unnecessary global variable & document existing bugElijah Newren via GitGitGadget, May 7, 2023
  3. Calvin WanMay 11, 2023
  4. Elijah NewrenMay 12, 2023
  5. Glen ChooMay 11, 2023
  6. Elijah NewrenMay 12, 2023
  7. Glen ChooMay 12, 2023
  8. 02/24 init-db, clone: change unnecessary global into passed parameterElijah Newren via GitGitGadget, May 7, 2023
  9. 05/24 add: modify add_files_to_cache() to avoid globalsElijah Newren via GitGitGadget, May 7, 2023
  10. 04/24 read-cache: move shared commit and ls-files codeElijah Newren via GitGitGadget, May 7, 2023
  11. 08/24 run-command.h: move declarations for run-command.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  12. 06/24 read-cache: move shared add/checkout/commit codeElijah Newren via GitGitGadget, May 7, 2023
  13. 03/24 setup: adopt shared init-db & clone codeElijah Newren via GitGitGadget, May 7, 2023
  14. 07/24 statinfo: move stat_{data,validity} functions from cache/read-cacheElijah Newren via GitGitGadget, May 7, 2023
  15. 09/24 name-hash.h: move declarations for name-hash.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  16. 10/24 sparse-index.h: move declarations for sparse-index.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  17. 11/24 preload-index.h: move declarations for preload-index.c from elsewhereElijah Newren via GitGitGadget, May 7, 2023
  18. 12/24 diff.h: move declaration for global in diff.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  19. 13/24 merge.h: move declarations for merge.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  20. 14/24 repository.h: move declaration of the_index from cache.hElijah Newren via GitGitGadget, May 7, 2023
  21. 19/24 diff.h: remove unnecessary include of oidset.hElijah Newren via GitGitGadget, May 7, 2023
  22. 17/24 log-tree: replace include of revision.h with simple forward declarationElijah Newren via GitGitGadget, May 7, 2023
  23. 20/24 list-objects-filter-options.h: remove unneccessary includeElijah Newren via GitGitGadget, May 7, 2023
  24. 15/24 read-cache*.h: move declarations for read-cache.c functions from cache.hElijah Newren via GitGitGadget, May 7, 2023
  25. 18/24 repository: remove unnecessary include of path.hElijah Newren via GitGitGadget, May 7, 2023
  26. 21/24 builtin.h: remove unneccessary includesElijah Newren via GitGitGadget, May 7, 2023
  27. 16/24 cache.h: remove this no-longer-used headerElijah Newren via GitGitGadget, May 7, 2023
  28. 22/24 git-compat-util.h: remove unneccessary include of wildmatch.hElijah Newren via GitGitGadget, May 7, 2023
  29. 24/24 fsmonitor-ll.h: split this header out of fsmonitor.hElijah Newren via GitGitGadget, May 7, 2023
  30. 23/24 hash-ll, hashmap: move oidhash() to hash-llElijah Newren via GitGitGadget, May 7, 2023
  31. Calvin WanMay 11, 2023
  32. Jeff KingMay 11, 2023
  33. Felipe ContrerasMay 11, 2023
  34. Elijah NewrenMay 12, 2023
  35. Jeff KingMay 12, 2023
  36. Junio C HamanoMay 8, 2023
  37. Elijah NewrenMay 9, 2023
  38. Junio C HamanoMay 9, 2023
  39. Junio C HamanoMay 8, 2023
  40. Calvin WanMay 11, 2023
  41. Elijah NewrenMay 12, 2023
  42. 00/27 Header cleanups (final splitting of cache.h, and some splitting of other headers)Elijah Newren via GitGitGadget, May 12, 2023
  43. 03/27 init-db, clone: change unnecessary global into passed parameterElijah Newren via GitGitGadget, May 12, 2023
  44. Jonathan TanMay 12, 2023
  45. Elijah NewrenMay 16, 2023
  46. 02/27 init-db: remove unnecessary global variableElijah Newren via GitGitGadget, May 12, 2023
  47. Glen ChooMay 12, 2023
  48. 01/27 init-db: document existing bug with core.bare in template configElijah Newren via GitGitGadget, May 12, 2023
  49. Jonathan TanMay 12, 2023
  50. Elijah NewrenMay 16, 2023
  51. 06/27 add: modify add_files_to_cache() to avoid globalsElijah Newren via GitGitGadget, May 12, 2023
  52. Jonathan TanMay 15, 2023
  53. 05/27 read-cache: move shared commit and ls-files codeElijah Newren via GitGitGadget, May 12, 2023
  54. Jonathan TanMay 12, 2023
  55. 09/27 run-command.h: move declarations for run-command.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  56. 04/27 setup: adopt shared init-db & clone codeElijah Newren via GitGitGadget, May 12, 2023
  57. 07/27 read-cache: move shared add/checkout/commit codeElijah Newren via GitGitGadget, May 12, 2023
  58. 08/27 statinfo: move stat_{data,validity} functions from cache/read-cacheElijah Newren via GitGitGadget, May 12, 2023
  59. 11/27 sparse-index.h: move declarations for sparse-index.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  60. 10/27 name-hash.h: move declarations for name-hash.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  61. 13/27 diff.h: move declaration for global in diff.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  62. 12/27 preload-index.h: move declarations for preload-index.c from elsewhereElijah Newren via GitGitGadget, May 12, 2023
  63. 15/27 repository.h: move declaration of the_index from cache.hElijah Newren via GitGitGadget, May 12, 2023
  64. Jonathan TanMay 15, 2023
  65. 14/27 merge.h: move declarations for merge.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  66. 18/27 log-tree: replace include of revision.h with simple forward declarationElijah Newren via GitGitGadget, May 12, 2023
  67. 19/27 repository: remove unnecessary include of path.hElijah Newren via GitGitGadget, May 12, 2023
  68. 21/27 list-objects-filter-options.h: remove unneccessary includeElijah Newren via GitGitGadget, May 12, 2023
  69. 20/27 diff.h: remove unnecessary include of oidset.hElijah Newren via GitGitGadget, May 12, 2023
  70. 16/27 read-cache*.h: move declarations for read-cache.c functions from cache.hElijah Newren via GitGitGadget, May 12, 2023
  71. Jonathan TanMay 16, 2023
  72. 17/27 cache.h: remove this no-longer-used headerElijah Newren via GitGitGadget, May 12, 2023
  73. Jonathan TanMay 16, 2023
  74. Elijah NewrenMay 16, 2023
  75. 23/27 git-compat-util.h: remove unneccessary include of wildmatch.hElijah Newren via GitGitGadget, May 12, 2023
  76. 22/27 builtin.h: remove unneccessary includesElijah Newren via GitGitGadget, May 12, 2023
  77. 25/27 khash: name the structs that khash declaresElijah Newren via GitGitGadget, May 12, 2023
  78. 24/27 merge-ll: rename from ll-mergeElijah Newren via GitGitGadget, May 12, 2023
  79. 27/27 fsmonitor-ll.h: split this header out of fsmonitor.hElijah Newren via GitGitGadget, May 12, 2023
  80. Jonathan TanMay 16, 2023
  81. Elijah NewrenMay 16, 2023
  82. 26/27 hash-ll, hashmap: move oidhash() to hash-llElijah Newren via GitGitGadget, May 12, 2023
  83. Jonathan TanMay 16, 2023
  84. Elijah NewrenMay 16, 2023
  85. 00/28 Header cleanups (final splitting of cache.h, and some splitting of other headers)Elijah Newren via GitGitGadget, May 16, 2023
  86. 02/28 init-db: remove unnecessary global variableElijah Newren via GitGitGadget, May 16, 2023
  87. 01/28 init-db: document existing bug with core.bare in template configElijah Newren via GitGitGadget, May 16, 2023
  88. 03/28 init-db, clone: change unnecessary global into passed parameterElijah Newren via GitGitGadget, May 16, 2023
  89. 05/28 read-cache: move shared commit and ls-files codeElijah Newren via GitGitGadget, May 16, 2023
  90. 06/28 add: modify add_files_to_cache() to avoid globalsElijah Newren via GitGitGadget, May 16, 2023
  91. 07/28 read-cache: move shared add/checkout/commit codeElijah Newren via GitGitGadget, May 16, 2023
  92. 04/28 setup: adopt shared init-db & clone codeElijah Newren via GitGitGadget, May 16, 2023
  93. 09/28 run-command.h: move declarations for run-command.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  94. 10/28 name-hash.h: move declarations for name-hash.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  95. 08/28 statinfo: move stat_{data,validity} functions from cache/read-cacheElijah Newren via GitGitGadget, May 16, 2023
  96. 11/28 sparse-index.h: move declarations for sparse-index.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  97. 14/28 merge.h: move declarations for merge.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  98. 12/28 preload-index.h: move declarations for preload-index.c from elsewhereElijah Newren via GitGitGadget, May 16, 2023
  99. 15/28 repository.h: move declaration of the_index from cache.hElijah Newren via GitGitGadget, May 16, 2023
  100. 18/28 log-tree: replace include of revision.h with simple forward declarationElijah Newren via GitGitGadget, May 16, 2023
  101. 13/28 diff.h: move declaration for global in diff.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  102. 19/28 repository: remove unnecessary include of path.hElijah Newren via GitGitGadget, May 16, 2023
  103. 16/28 read-cache*.h: move declarations for read-cache.c functions from cache.hElijah Newren via GitGitGadget, May 16, 2023
  104. 17/28 cache.h: remove this no-longer-used headerElijah Newren via GitGitGadget, May 16, 2023
  105. 22/28 builtin.h: remove unneccessary includesElijah Newren via GitGitGadget, May 16, 2023
  106. 25/28 khash: name the structs that khash declaresElijah Newren via GitGitGadget, May 16, 2023
  107. 23/28 git-compat-util.h: remove unneccessary include of wildmatch.hElijah Newren via GitGitGadget, May 16, 2023
  108. 24/28 merge-ll: rename from ll-mergeElijah Newren via GitGitGadget, May 16, 2023
  109. 27/28 hash-ll, hashmap: move oidhash() to hash-llElijah Newren via GitGitGadget, May 16, 2023
  110. 28/28 fsmonitor-ll.h: split this header out of fsmonitor.hElijah Newren via GitGitGadget, May 16, 2023
  111. 26/28 object-store-ll.h: split this header out of object-store.hElijah Newren via GitGitGadget, May 16, 2023
  112. 21/28 list-objects-filter-options.h: remove unneccessary includeElijah Newren via GitGitGadget, May 16, 2023
  113. 20/28 diff.h: remove unnecessary include of oidset.hElijah Newren via GitGitGadget, May 16, 2023
  114. Calvin WanMay 23, 2023
  115. Elijah NewrenMay 24, 2023

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.