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

[PATCH 06/24] read-cache: move shared add/checkout/commit code

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

The function add_files_to_cache(), plus associated helper functions, were defined in builtin/add.c, but also shared with builtin/checkout.c and 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/add.c | 100 -------------------------------------------------
 read-cache.c  | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 102 insertions(+), 100 deletions(-)
diff --git a/builtin/add.c b/builtin/add.c
index a526eff734e..36ddbb159bf 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -36,13 +36,6 @@ static int pathspec_file_nul;
 static int include_sparse;
 static const char *pathspec_from_file;
 
-struct update_callback_data {
-	struct index_state *index;
-	int include_sparse;
-	int flags;
-	int add_errors;
-};
-
 static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
 {
 	int i, ret = 0;
@@ -71,99 +64,6 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
 	return ret;
 }
 
-static int fix_unmerged_status(struct diff_filepair *p,
-			       struct update_callback_data *data)
-{
-	if (p->status != DIFF_STATUS_UNMERGED)
-		return p->status;
-	if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode)
-		/*
-		 * This is not an explicit add request, and the
-		 * path is missing from the working tree (deleted)
-		 */
-		return DIFF_STATUS_DELETED;
-	else
-		/*
-		 * Either an explicit add request, or path exists
-		 * in the working tree.  An attempt to explicitly
-		 * add a path that does not exist in the working tree
-		 * will be caught as an error by the caller immediately.
-		 */
-		return DIFF_STATUS_MODIFIED;
-}
-
-static void update_callback(struct diff_queue_struct *q,
-			    struct diff_options *opt UNUSED, void *cbdata)
-{
-	int i;
-	struct update_callback_data *data = cbdata;
-
-	for (i = 0; i < q->nr; i++) {
-		struct diff_filepair *p = q->queue[i];
-		const char *path = p->one->path;
-
-		if (!data->include_sparse &&
-		    !path_in_sparse_checkout(path, data->index))
-			continue;
-
-		switch (fix_unmerged_status(p, data)) {
-		default:
-			die(_("unexpected diff status %c"), p->status);
-		case DIFF_STATUS_MODIFIED:
-		case DIFF_STATUS_TYPE_CHANGED:
-			if (add_file_to_index(data->index, path, data->flags)) {
-				if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
-					die(_("updating files failed"));
-				data->add_errors++;
-			}
-			break;
-		case DIFF_STATUS_DELETED:
-			if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
-				break;
-			if (!(data->flags & ADD_CACHE_PRETEND))
-				remove_file_from_index(data->index, path);
-			if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
-				printf(_("remove '%s'\n"), path);
-			break;
-		}
-	}
-}
-
-int add_files_to_cache(struct repository *repo, const char *prefix,
-		       const struct pathspec *pathspec, int include_sparse,
-		       int flags)
-{
-	struct update_callback_data data;
-	struct rev_info rev;
-
-	memset(&data, 0, sizeof(data));
-	data.index = repo->index;
-	data.include_sparse = include_sparse;
-	data.flags = flags;
-
-	repo_init_revisions(repo, &rev, prefix);
-	setup_revisions(0, NULL, &rev, NULL);
-	if (pathspec)
-		copy_pathspec(&rev.prune_data, pathspec);
-	rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
-	rev.diffopt.format_callback = update_callback;
-	rev.diffopt.format_callback_data = &data;
-	rev.diffopt.flags.override_submodule_config = 1;
-	rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
-
-	/*
-	 * Use an ODB transaction to optimize adding multiple objects.
-	 * This function is invoked from commands other than 'add', which
-	 * may not have their own transaction active.
-	 */
-	begin_odb_transaction();
-	run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
-	end_odb_transaction();
-
-	release_revisions(&rev);
-	return !!data.add_errors;
-}
-
 static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
 {
 	int i, retval = 0;
diff --git a/read-cache.c b/read-cache.c
index c0df4586c9b..bfbd531ea60 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -5,6 +5,7 @@
  */
 #include "cache.h"
 #include "alloc.h"
+#include "bulk-checkin.h"
 #include "config.h"
 #include "date.h"
 #include "diff.h"
@@ -26,6 +27,7 @@
 #include "mem-pool.h"
 #include "object-name.h"
 #include "resolve-undo.h"
+#include "revision.h"
 #include "run-command.h"
 #include "strbuf.h"
 #include "trace2.h"
@@ -3943,3 +3945,103 @@ void overlay_tree_on_index(struct index_state *istate,
 		}
 	}
 }
+
+struct update_callback_data {
+	struct index_state *index;
+	int include_sparse;
+	int flags;
+	int add_errors;
+};
+
+static int fix_unmerged_status(struct diff_filepair *p,
+			       struct update_callback_data *data)
+{
+	if (p->status != DIFF_STATUS_UNMERGED)
+		return p->status;
+	if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode)
+		/*
+		 * This is not an explicit add request, and the
+		 * path is missing from the working tree (deleted)
+		 */
+		return DIFF_STATUS_DELETED;
+	else
+		/*
+		 * Either an explicit add request, or path exists
+		 * in the working tree.  An attempt to explicitly
+		 * add a path that does not exist in the working tree
+		 * will be caught as an error by the caller immediately.
+		 */
+		return DIFF_STATUS_MODIFIED;
+}
+
+static void update_callback(struct diff_queue_struct *q,
+			    struct diff_options *opt UNUSED, void *cbdata)
+{
+	int i;
+	struct update_callback_data *data = cbdata;
+
+	for (i = 0; i < q->nr; i++) {
+		struct diff_filepair *p = q->queue[i];
+		const char *path = p->one->path;
+
+		if (!data->include_sparse &&
+		    !path_in_sparse_checkout(path, data->index))
+			continue;
+
+		switch (fix_unmerged_status(p, data)) {
+		default:
+			die(_("unexpected diff status %c"), p->status);
+		case DIFF_STATUS_MODIFIED:
+		case DIFF_STATUS_TYPE_CHANGED:
+			if (add_file_to_index(data->index, path, data->flags)) {
+				if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
+					die(_("updating files failed"));
+				data->add_errors++;
+			}
+			break;
+		case DIFF_STATUS_DELETED:
+			if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
+				break;
+			if (!(data->flags & ADD_CACHE_PRETEND))
+				remove_file_from_index(data->index, path);
+			if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
+				printf(_("remove '%s'\n"), path);
+			break;
+		}
+	}
+}
+
+int add_files_to_cache(struct repository *repo, const char *prefix,
+		       const struct pathspec *pathspec, int include_sparse,
+		       int flags)
+{
+	struct update_callback_data data;
+	struct rev_info rev;
+
+	memset(&data, 0, sizeof(data));
+	data.index = repo->index;
+	data.include_sparse = include_sparse;
+	data.flags = flags;
+
+	repo_init_revisions(repo, &rev, prefix);
+	setup_revisions(0, NULL, &rev, NULL);
+	if (pathspec)
+		copy_pathspec(&rev.prune_data, pathspec);
+	rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
+	rev.diffopt.format_callback = update_callback;
+	rev.diffopt.format_callback_data = &data;
+	rev.diffopt.flags.override_submodule_config = 1;
+	rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
+
+	/*
+	 * Use an ODB transaction to optimize adding multiple objects.
+	 * This function is invoked from commands other than 'add', which
+	 * may not have their own transaction active.
+	 */
+	begin_odb_transaction();
+	run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
+	end_odb_transaction();
+
+	release_revisions(&rev);
+	return !!data.add_errors;
+}
-- 
gitgitgadget
Previous: Elijah Newren via GitGitGadgetNext: Elijah Newren via GitGitGadget
Message 12 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.