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

[PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors

From
Alex Riesen <raa.lkml@gmail.com>
Date
May 12, 2008, 17:58 UTC
Message-ID
<20080512175810.GD3128@steel.home>
In-Reply-To
<20080512175745.GC3128@steel.home>
Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 builtin-add.c      |   37 ++++++++++++++++++++++++++++---------
 builtin-checkout.c |    2 +-
 builtin-commit.c   |    2 +-
 cache.h            |    8 +++++++-
 4 files changed, 37 insertions(+), 12 deletions(-)
diff --git a/builtin-add.c b/builtin-add.c
index 4d72ab6..7862808 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -79,12 +79,18 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec,
 		prune_directory(dir, pathspec, baselen);
 }
 
+struct update_callback_data
+{
+	int flags;
+	int add_errors;
+};
+
 static void update_callback(struct diff_queue_struct *q,
 			    struct diff_options *opt, void *cbdata)
 {
-	int i, verbose;
+	int i;
+	struct update_callback_data *data = cbdata;
 
-	verbose = *((int *)cbdata);
 	for (i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		const char *path = p->one->path;
@@ -94,28 +100,35 @@ static void update_callback(struct diff_queue_struct *q,
 		case DIFF_STATUS_UNMERGED:
 		case DIFF_STATUS_MODIFIED:
 		case DIFF_STATUS_TYPE_CHANGED:
-			if (add_file_to_cache(path, verbose))
-				die("updating files failed");
+			if (add_file_to_cache(path, data->flags & ADD_FILES_VERBOSE)) {
+				if (!(data->flags & ADD_FILES_IGNORE_ERRORS))
+					die("updating files failed");
+				data->add_errors++;
+			}
 			break;
 		case DIFF_STATUS_DELETED:
 			remove_file_from_cache(path);
-			if (verbose)
+			if (data->flags & ADD_FILES_VERBOSE)
 				printf("remove '%s'\n", path);
 			break;
 		}
 	}
 }
 
-void add_files_to_cache(int verbose, const char *prefix, const char **pathspec)
+int add_files_to_cache(const char *prefix, const char **pathspec, int flags)
 {
+	struct update_callback_data data;
 	struct rev_info rev;
 	init_revisions(&rev, prefix);
 	setup_revisions(0, NULL, &rev, NULL);
 	rev.prune_data = pathspec;
 	rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
 	rev.diffopt.format_callback = update_callback;
-	rev.diffopt.format_callback_data = &verbose;
+	data.flags = flags;
+	data.add_errors = 0;
+	rev.diffopt.format_callback_data = &data;
 	run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
+	return !!data.add_errors;
 }
 
 static void refresh(int verbose, const char **pathspec)
@@ -193,6 +206,7 @@ static struct option builtin_add_options[] = {
 
 int cmd_add(int argc, const char **argv, const char *prefix)
 {
+	int exit_status = 0;
 	int i, newfd;
 	const char **pathspec;
 	struct dir_struct dir;
@@ -209,11 +223,16 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	newfd = hold_locked_index(&lock_file, 1);
 
 	if (take_worktree_changes) {
+		int flags = 0;
 		const char **pathspec;
 		if (read_cache() < 0)
 			die("index file corrupt");
 		pathspec = get_pathspec(prefix, argv);
-		add_files_to_cache(verbose, prefix, pathspec);
+
+		if (verbose)
+			flags |= ADD_FILES_VERBOSE;
+
+		exit_status = add_files_to_cache(prefix, pathspec, flags);
 		goto finish;
 	}
 
@@ -265,5 +284,5 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 			die("Unable to write new index file");
 	}
 
-	return 0;
+	return exit_status;
 }
diff --git a/builtin-checkout.c b/builtin-checkout.c
index 10ec137..05c0642 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -282,7 +282,7 @@ static int merge_working_tree(struct checkout_opts *opts,
 			 * entries in the index.
 			 */
 
-			add_files_to_cache(0, NULL, NULL);
+			add_files_to_cache(NULL, NULL, 0);
 			work = write_tree_from_memory();
 
 			ret = reset_to_new(new->commit->tree, opts->quiet);
diff --git a/builtin-commit.c b/builtin-commit.c
index ae29d35..6a2f5c3 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -246,7 +246,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
 	 */
 	if (all || (also && pathspec && *pathspec)) {
 		int fd = hold_locked_index(&index_lock, 1);
-		add_files_to_cache(0, also ? prefix : NULL, pathspec);
+		add_files_to_cache(also ? prefix : NULL, pathspec, 0);
 		refresh_cache(REFRESH_QUIET);
 		if (write_cache(fd, active_cache, active_nr) ||
 		    close_lock_file(&index_lock))
diff --git a/cache.h b/cache.h
index 9cee9a5..4fb6290 100644
--- a/cache.h
+++ b/cache.h
@@ -781,7 +781,13 @@ extern int convert_to_git(const char *path, const char *src, size_t len,
 extern int convert_to_working_tree(const char *path, const char *src, size_t len, struct strbuf *dst);
 
 /* add */
-void add_files_to_cache(int verbose, const char *prefix, const char **pathspec);
+#define ADD_FILES_VERBOSE	01
+#define ADD_FILES_IGNORE_ERRORS	02
+/*
+ * return 0 if success, 1 - if addition of a file failed and
+ * ADD_FILES_IGNORE_ERRORS was specified in flags
+ */
+int add_files_to_cache(const char *prefix, const char **pathspec, int flags);
 
 /* diff.c */
 extern int diff_auto_refresh_index;
-- 
1.5.5.1.184.g5bee
Previous: Alex RiesenNext: Alex Riesen
Message 18 of 32 in “How to "git add ." when some files are not accessible (permission denied)?”
  1. Dirk SüsserottMar 1, 2008
  2. Jeff KingMar 2, 2008
  3. Dirk SüsserottMar 3, 2008
  4. Junio C HamanoMar 3, 2008
  5. Dirk SüsserottMar 3, 2008
  6. Alex RiesenMar 2, 2008
  7. Make the exit code of add_file_to_index actually usefulAlex Riesen, Mar 2, 2008
  8. Extend interface of add_files_to_cache to allow ignore indexing errorsAlex Riesen, Mar 2, 2008
  9. Add --ignore-errors to git-add to allow it to skip files with read errorsAlex Riesen, Mar 2, 2008
  10. Add a test for git-add --ignore-errorsAlex Riesen, Mar 2, 2008
  11. Johannes SchindelinMar 2, 2008
  12. Junio C HamanoMar 2, 2008
  13. Alex RiesenMar 2, 2008
  14. Joachim B HagaMar 2, 2008
  15. Alex RiesenMar 3, 2008
  16. Alex RiesenMay 12, 2008
  17. Make the exit code of add_file_to_index actually usefulAlex Riesen, May 12, 2008
  18. Extend interface of add_files_to_cache to allow ignore indexing errorsAlex Riesen, May 12, 2008
  19. Add --ignore-errors to git-add to allow it to skip files with read errorsAlex Riesen, May 12, 2008
  20. Add a test for git-add --ignore-errorsAlex Riesen, May 12, 2008
  21. Add a config option to ignore errors for git-addAlex Riesen, May 12, 2008
  22. Junio C HamanoMay 13, 2008
  23. Alex RiesenMay 13, 2008
  24. Junio C HamanoMay 13, 2008
  25. Alex RiesenMay 13, 2008
  26. Junio C HamanoMay 12, 2008
  27. Alex RiesenMay 12, 2008
  28. Junio C HamanoMay 12, 2008
  29. Alex RiesenMay 12, 2008
  30. Junio C HamanoMay 12, 2008
  31. Alex RiesenMay 13, 2008
  32. Daniel BarkalowMar 3, 2008

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.