git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* How to "git add ." when some files are not accessible (permission denied)?
@ 2008-03-01 13:46 Dirk Süsserott
  2008-03-02  1:19 ` Jeff King
  2008-03-02 15:41 ` Alex Riesen
  0 siblings, 2 replies; 32+ messages in thread
From: Dirk Süsserott @ 2008-03-01 13:46 UTC (permalink / raw)
  To: Git Mailing List

Hello --

First of all: I'm using Git with Windows. Most of the time it works 
*very* good, but now I've a problem that might appear to Unix users as 
well. I had the idea to use Git to track changes in my C:\WINDOWS 
directory. I thought the following would work:

$ cd /c/WINDOWS             (1)
$ git init                  (2)
$ git add .                 (3)
$ git commit -m "Initial"   (4)

And then issue "git status" or so to see the differences after 
installing or running some software.

However, when issueing (3) "git add ." it adds hundreds and thousands of
files and then stops with

     error: open("foo"): Permission denied: foo
     fatal: unable to index file foo

The file "foo" is not accessible for me, even though I'm administrator.
This might occur to Windows and Linux persons as well, I guess. The 
adding stops overall.

The question is: is there a way to tell "git add ." to add all files but
ignore those that cannot be added due to lack of authorization?

Or, more generally spoken: can I tell "git add" to add only those files 
it can handle and ignore the rest? The "-f" switch doesn't work and some
exclude lists on a per file basis are not applicable for my purpose as I
don't know the files in advance.

I'm aware that I could do it with some fancy shell commands, but very 
often I was surprised how many really cool commands Git offers to "do 
what I mean". Wished other software would be so usable :-).


Cheers,
  -- Dirk

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: How to "git add ." when some files are not accessible (permission denied)?
  2008-03-01 13:46 How to "git add ." when some files are not accessible (permission denied)? Dirk Süsserott
@ 2008-03-02  1:19 ` Jeff King
  2008-03-03 19:17   ` Dirk Süsserott
  2008-03-02 15:41 ` Alex Riesen
  1 sibling, 1 reply; 32+ messages in thread
From: Jeff King @ 2008-03-02  1:19 UTC (permalink / raw)
  To: Dirk Süsserott; +Cc: Git Mailing List

On Sat, Mar 01, 2008 at 02:46:28PM +0100, Dirk Süsserott wrote:

> The question is: is there a way to tell "git add ." to add all files but
> ignore those that cannot be added due to lack of authorization?

No, there isn't. Under Linux, I would come up with a list of files I was
interested in and then pipe it to "xargs git-add", which is probably
unhelpful for Windows.

But I think more fundamentally, you probably _do_ want to come up with a
list of files that you can't access and add them to your .gitignore (or
your .git/info/exclude file if they are purely a local matter). That is
the official way to tell all git commands "I really don't care about
these files".  Otherwise they will keep getting brought up when you do,
e.g., a git-status.

> Or, more generally spoken: can I tell "git add" to add only those files  
> it can handle and ignore the rest? The "-f" switch doesn't work and some
> exclude lists on a per file basis are not applicable for my purpose as I
> don't know the files in advance.

The only reason I can think of to not want to generate such an ignore
list is if you are frequently and automagically doing a "git add ." to
pick up new files. For that reason, a "try to continue even if we can't
look at some files" option to git add might make some sense.

-Peff

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: How to "git add ." when some files are not accessible (permission denied)?
  2008-03-01 13:46 How to "git add ." when some files are not accessible (permission denied)? Dirk Süsserott
  2008-03-02  1:19 ` Jeff King
@ 2008-03-02 15:41 ` Alex Riesen
  2008-03-02 15:42   ` [PATCH] Make the exit code of add_file_to_index actually useful Alex Riesen
  1 sibling, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-03-02 15:41 UTC (permalink / raw)
  To: Dirk Süsserott; +Cc: Git Mailing List

Dirk Süsserott, Sat, Mar 01, 2008 14:46:28 +0100:
> Or, more generally spoken: can I tell "git add" to add only those files it 
> can handle and ignore the rest? The "-f" switch doesn't work and some
> exclude lists on a per file basis are not applicable for my purpose as I
> don't know the files in advance.

Well, "-f" means something else (include the ignored files). It is
unfortunate, because (I think) your case fits better its traditional
meaning...

You can try the following patches, which add "--ignore-errors" to
git-add. Maybe it will be enough... It is generally considered
not safe to ignore errors.


^ permalink raw reply	[flat|nested] 32+ messages in thread

* [PATCH] Make the exit code of add_file_to_index actually useful
  2008-03-02 15:41 ` Alex Riesen
@ 2008-03-02 15:42   ` Alex Riesen
  2008-03-02 15:43     ` [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors Alex Riesen
  2008-03-02 15:57     ` [PATCH] Make the exit code of add_file_to_index actually useful Johannes Schindelin
  0 siblings, 2 replies; 32+ messages in thread
From: Alex Riesen @ 2008-03-02 15:42 UTC (permalink / raw)
  To: Dirk Süsserott; +Cc: Git Mailing List, Junio C Hamano

Update the programs which used the function (as add_file_to_cache).

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 builtin-add.c    |    6 ++++--
 builtin-commit.c |    7 ++++---
 builtin-mv.c     |    3 ++-
 read-cache.c     |    8 ++++----
 4 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 820110e..abfe473 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -94,7 +94,8 @@ static void update_callback(struct diff_queue_struct *q,
 		case DIFF_STATUS_UNMERGED:
 		case DIFF_STATUS_MODIFIED:
 		case DIFF_STATUS_TYPE_CHANGED:
-			add_file_to_cache(path, verbose);
+			if (add_file_to_cache(path, verbose))
+				exit(1);
 			break;
 		case DIFF_STATUS_DELETED:
 			remove_file_from_cache(path);
@@ -266,7 +267,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	}
 
 	for (i = 0; i < dir.nr; i++)
-		add_file_to_cache(dir.entries[i]->name, verbose);
+		if (add_file_to_cache(dir.entries[i]->name, verbose))
+			exit(1);
 
  finish:
 	if (active_cache_changed) {
diff --git a/builtin-commit.c b/builtin-commit.c
index f49c22e..fb1e588 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -176,9 +176,10 @@ static void add_remove_files(struct path_list *list)
 	int i;
 	for (i = 0; i < list->nr; i++) {
 		struct path_list_item *p = &(list->items[i]);
-		if (file_exists(p->path))
-			add_file_to_cache(p->path, 0);
-		else
+		if (file_exists(p->path)) {
+			if (add_file_to_cache(p->path, 0))
+				exit(1);
+		} else
 			remove_file_from_cache(p->path);
 	}
 }
diff --git a/builtin-mv.c b/builtin-mv.c
index 68aa2a6..ec6e09d 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c
@@ -260,7 +260,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
 		for (i = 0; i < added.nr; i++) {
 			const char *path = added.items[i].path;
-			add_file_to_cache(path, verbose);
+			if (add_file_to_cache(path, verbose))
+				exit(1);
 		}
 
 		for (i = 0; i < deleted.nr; i++)
diff --git a/read-cache.c b/read-cache.c
index 657f0c5..4a4f511 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -461,10 +461,10 @@ int add_file_to_index(struct index_state *istate, const char *path, int verbose)
 	unsigned ce_option = CE_MATCH_IGNORE_VALID|CE_MATCH_RACY_IS_DIRTY;
 
 	if (lstat(path, &st))
-		die("%s: unable to stat (%s)", path, strerror(errno));
+		return error("%s: unable to stat (%s)", path, strerror(errno));
 
 	if (!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode) && !S_ISDIR(st.st_mode))
-		die("%s: can only add regular files, symbolic links or git-directories", path);
+		return error("%s: can only add regular files, symbolic links or git-directories", path);
 
 	namelen = strlen(path);
 	if (S_ISDIR(st.st_mode)) {
@@ -501,9 +501,9 @@ int add_file_to_index(struct index_state *istate, const char *path, int verbose)
 	}
 
 	if (index_path(ce->sha1, path, &st, 1))
-		die("unable to index file %s", path);
+		return error("unable to index file %s", path);
 	if (add_index_entry(istate, ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE))
-		die("unable to add %s to index",path);
+		return error("unable to add %s to index",path);
 	if (verbose)
 		printf("add '%s'\n", path);
 	return 0;
-- 
1.5.4.3.391.gf5a0c


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors
  2008-03-02 15:42   ` [PATCH] Make the exit code of add_file_to_index actually useful Alex Riesen
@ 2008-03-02 15:43     ` Alex Riesen
  2008-03-02 15:44       ` [PATCH] Add --ignore-errors to git-add to allow it to skip files with read errors Alex Riesen
  2008-03-02 15:57     ` [PATCH] Make the exit code of add_file_to_index actually useful Johannes Schindelin
  1 sibling, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-03-02 15:43 UTC (permalink / raw)
  To: Dirk Süsserott; +Cc: Git Mailing List, Junio C Hamano

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 abfe473..bc55a0e 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))
-				exit(1);
+			if (add_file_to_cache(path, data->flags & ADD_FILES_VERBOSE)) {
+				if (!(data->flags & ADD_FILES_IGNORE_ERRORS))
+					exit(1);
+				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;
 	}
 
@@ -277,5 +296,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 b0cd788..2def093 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -273,7 +273,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 fb1e588..d5e8c4c 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -242,7 +242,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 f16d341..c6c1659 100644
--- a/cache.h
+++ b/cache.h
@@ -748,7 +748,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.4.3.391.gf5a0c


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH] Add --ignore-errors to git-add to allow it to skip files with read errors
  2008-03-02 15:43     ` [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors Alex Riesen
@ 2008-03-02 15:44       ` Alex Riesen
  2008-03-02 15:44         ` [PATCH] Add a test for git-add --ignore-errors Alex Riesen
  0 siblings, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-03-02 15:44 UTC (permalink / raw)
  To: Dirk Süsserott; +Cc: Git Mailing List, Junio C Hamano

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 Documentation/git-add.txt |    7 ++++++-
 builtin-add.c             |   11 +++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index 4779909..9360a4f 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -9,7 +9,7 @@ SYNOPSIS
 --------
 [verse]
 'git-add' [-n] [-v] [-f] [--interactive | -i] [--patch | -p] [-u] [--refresh]
-          [--] <filepattern>...
+	  [--ignore-errors] [--] <filepattern>...
 
 DESCRIPTION
 -----------
@@ -81,6 +81,11 @@ OPTIONS
 	Don't add the file(s), but only refresh their stat()
 	information in the index.
 
+\--ignore-errors::
+	If some files could not be added because of errors indexing
+	them, do not abort the operation, but continue adding the
+	others. The command shall still exit with non-zero status.
+
 \--::
 	This option can be used to separate command-line options from
 	the list of files, (useful when filenames might be mistaken
diff --git a/builtin-add.c b/builtin-add.c
index bc55a0e..b67ad3f 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -191,6 +191,7 @@ static const char ignore_error[] =
 "The following paths are ignored by one of your .gitignore files:\n";
 
 static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0;
+static int ignore_add_errors;
 
 static struct option builtin_add_options[] = {
 	OPT__DRY_RUN(&show_only),
@@ -201,6 +202,7 @@ static struct option builtin_add_options[] = {
 	OPT_BOOLEAN('f', NULL, &ignored_too, "allow adding otherwise ignored files"),
 	OPT_BOOLEAN('u', NULL, &take_worktree_changes, "update tracked files"),
 	OPT_BOOLEAN( 0 , "refresh", &refresh_only, "don't add, only refresh the index"),
+	OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, "just skip files which cannot be added because of errors"),
 	OPT_END(),
 };
 
@@ -231,6 +233,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
 		if (verbose)
 			flags |= ADD_FILES_VERBOSE;
+		if (ignore_add_errors)
+			flags |= ADD_FILES_IGNORE_ERRORS;
 
 		exit_status = add_files_to_cache(prefix, pathspec, flags);
 		goto finish;
@@ -286,8 +290,11 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	}
 
 	for (i = 0; i < dir.nr; i++)
-		if (add_file_to_cache(dir.entries[i]->name, verbose))
-			exit(1);
+		if (add_file_to_cache(dir.entries[i]->name, verbose)) {
+			if (!ignore_add_errors)
+				exit(1);
+			exit_status = 1;
+		}
 
  finish:
 	if (active_cache_changed) {
-- 
1.5.4.3.391.gf5a0c


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH] Add a test for git-add --ignore-errors
  2008-03-02 15:44       ` [PATCH] Add --ignore-errors to git-add to allow it to skip files with read errors Alex Riesen
@ 2008-03-02 15:44         ` Alex Riesen
  0 siblings, 0 replies; 32+ messages in thread
From: Alex Riesen @ 2008-03-02 15:44 UTC (permalink / raw)
  To: Dirk Süsserott; +Cc: Git Mailing List, Junio C Hamano

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 t/t3700-add.sh |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 287e058..ca3e33d 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -179,4 +179,13 @@ test_expect_success 'git add --refresh' '
 	test -z "`git diff-index HEAD -- foo`"
 '
 
+test_expect_success 'git add --ignore-errors' '
+	git reset --hard &&
+	date >foo1 &&
+	date >foo2 &&
+	chmod 0 foo2 &&
+	git add --verbose --ignore-errors .
+	git ls-files |grep foo1
+'
+
 test_done
-- 
1.5.4.3.391.gf5a0c


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-03-02 15:42   ` [PATCH] Make the exit code of add_file_to_index actually useful Alex Riesen
  2008-03-02 15:43     ` [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors Alex Riesen
@ 2008-03-02 15:57     ` Johannes Schindelin
  2008-03-02 16:59       ` Junio C Hamano
  2008-03-03 18:01       ` Daniel Barkalow
  1 sibling, 2 replies; 32+ messages in thread
From: Johannes Schindelin @ 2008-03-02 15:57 UTC (permalink / raw)
  To: Alex Riesen; +Cc: Dirk Süsserott, Git Mailing List, Junio C Hamano

Hi,

On Sun, 2 Mar 2008, Alex Riesen wrote:

> -			add_file_to_cache(path, verbose);
> +			if (add_file_to_cache(path, verbose))
> +				exit(1);

Does it really, really _have_ to be exit(1)?  I mean, now you block even 
the faintest chance that we can libify libgit.a by overriding die_routine.

A "return -1" might make _much_ more sense, too.

Ciao,
Dscho


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-03-02 15:57     ` [PATCH] Make the exit code of add_file_to_index actually useful Johannes Schindelin
@ 2008-03-02 16:59       ` Junio C Hamano
  2008-03-02 21:42         ` Alex Riesen
  2008-05-12 17:56         ` Alex Riesen
  2008-03-03 18:01       ` Daniel Barkalow
  1 sibling, 2 replies; 32+ messages in thread
From: Junio C Hamano @ 2008-03-02 16:59 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: Alex Riesen, Dirk Süsserott, Git Mailing List

Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:

> On Sun, 2 Mar 2008, Alex Riesen wrote:
>
>> -			add_file_to_cache(path, verbose);
>> +			if (add_file_to_cache(path, verbose))
>> +				exit(1);
>
> Does it really, really _have_ to be exit(1)?  I mean, now you block even 
> the faintest chance that we can libify libgit.a by overriding die_routine.

I think Alex did so not to break the existing scripts that rely on these
dying, but it should have been exit(128) to really stay compatible.

Why is this even needed to begin with?  I am aware of Dirk's original
issue discussed elsewhere, but we try fairly hard to be A-O-N when we can
afford to, and this option deliberately breaks it.  What is the real
reason why such an unreadable (either for privilege or for I/O error)
file should not live in .gitignore?


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-03-02 16:59       ` Junio C Hamano
@ 2008-03-02 21:42         ` Alex Riesen
  2008-03-02 22:04           ` Joachim B Haga
  2008-05-12 17:56         ` Alex Riesen
  1 sibling, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-03-02 21:42 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Schindelin, Dirk Süsserott, Git Mailing List

Junio C Hamano, Sun, Mar 02, 2008 17:59:13 +0100:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
> > On Sun, 2 Mar 2008, Alex Riesen wrote:
> >
> >> -			add_file_to_cache(path, verbose);
> >> +			if (add_file_to_cache(path, verbose))
> >> +				exit(1);
> >
> > Does it really, really _have_ to be exit(1)?  I mean, now you block even 
> > the faintest chance that we can libify libgit.a by overriding die_routine.
> 
> I think Alex did so not to break the existing scripts that rely on these
> dying, but it should have been exit(128) to really stay compatible.

Sorry, this time it was actually mostly accident. I just selected the
first non-zero.

> Why is this even needed to begin with?  I am aware of Dirk's original
> issue discussed elsewhere, but we try fairly hard to be A-O-N when we can
> afford to, and this option deliberately breaks it.  What is the real
> reason why such an unreadable (either for privilege or for I/O error)
> file should not live in .gitignore?

Another program keeps the file open. There is an exclusive mode for
opening files, which locks the files for everyone. I believe it is
even default mode, unless selected otherwise.


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-03-02 21:42         ` Alex Riesen
@ 2008-03-02 22:04           ` Joachim B Haga
  2008-03-03  6:57             ` Alex Riesen
  0 siblings, 1 reply; 32+ messages in thread
From: Joachim B Haga @ 2008-03-02 22:04 UTC (permalink / raw)
  To: git
  Cc: Johannes Schindelin, Dirk Süsserott, Junio C Hamano,
	Git Mailing List

Alex Riesen <raa.lkml@gmail.com> writes:

> Junio C Hamano, Sun, Mar 02, 2008 17:59:13 +0100:
>> Why is this even needed to begin with?  I am aware of Dirk's original
>> issue discussed elsewhere, but we try fairly hard to be A-O-N when we can
>> afford to, and this option deliberately breaks it.  What is the real
>> reason why such an unreadable (either for privilege or for I/O error)
>> file should not live in .gitignore?
>
> Another program keeps the file open. There is an exclusive mode for
> opening files, which locks the files for everyone. I believe it is
> even default mode, unless selected otherwise.

Another minor annoyance in this area, is when a wildcard add fails
because of ignored files:

  potassium ~/svn/Deformation|master 0$ ls EpetraMatrix.*
  EpetraMatrix.cpp  EpetraMatrix.cpp~  EpetraMatrix.h  EpetraMatrix.o
  potassium ~/svn/Deformation|master 0$ git add EpetraMatrix.*
  The following paths are ignored by one of your .gitignore files:
  EpetraMatrix.cpp~
  EpetraMatrix.o
  Use -f if you really want to add them.
  potassium ~/svn/New-Deformation|master 0$ git status
  # On branch master
  # Changed but not updated:
  #   (use "git add <file>..." to update what will be committed)
  #
  [...]

I don't want to add them, I just want to ignore them completely (i.e., 
add the un-ignored ones).

Would this case also be covered by the new switch?

-j.


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-03-02 22:04           ` Joachim B Haga
@ 2008-03-03  6:57             ` Alex Riesen
  0 siblings, 0 replies; 32+ messages in thread
From: Alex Riesen @ 2008-03-03  6:57 UTC (permalink / raw)
  To: Joachim B Haga
  Cc: git, Johannes Schindelin, Dirk Süsserott, Junio C Hamano

Joachim B Haga, Sun, Mar 02, 2008 23:04:43 +0100:
> Alex Riesen <raa.lkml@gmail.com> writes:
> > Junio C Hamano, Sun, Mar 02, 2008 17:59:13 +0100:
> >> Why is this even needed to begin with?  I am aware of Dirk's original
> >> issue discussed elsewhere, but we try fairly hard to be A-O-N when we can
> >> afford to, and this option deliberately breaks it.  What is the real
> >> reason why such an unreadable (either for privilege or for I/O error)
> >> file should not live in .gitignore?
> >
> > Another program keeps the file open. There is an exclusive mode for
> > opening files, which locks the files for everyone. I believe it is
> > even default mode, unless selected otherwise.
> 
> Another minor annoyance in this area, is when a wildcard add fails
> because of ignored files:
> 
>   potassium ~/svn/Deformation|master 0$ ls EpetraMatrix.*
>   EpetraMatrix.cpp  EpetraMatrix.cpp~  EpetraMatrix.h  EpetraMatrix.o
>   potassium ~/svn/Deformation|master 0$ git add EpetraMatrix.*
>   The following paths are ignored by one of your .gitignore files:
>   EpetraMatrix.cpp~
>   EpetraMatrix.o
>   Use -f if you really want to add them.
>   potassium ~/svn/New-Deformation|master 0$ git status
>   # On branch master
>   # Changed but not updated:
>   #   (use "git add <file>..." to update what will be committed)
>   #
>   [...]
> 
> I don't want to add them, I just want to ignore them completely (i.e., 
> add the un-ignored ones).
> 
> Would this case also be covered by the new switch?

No. This is entirely different usability issue


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-03-02 15:57     ` [PATCH] Make the exit code of add_file_to_index actually useful Johannes Schindelin
  2008-03-02 16:59       ` Junio C Hamano
@ 2008-03-03 18:01       ` Daniel Barkalow
  1 sibling, 0 replies; 32+ messages in thread
From: Daniel Barkalow @ 2008-03-03 18:01 UTC (permalink / raw)
  To: Johannes Schindelin
  Cc: Alex Riesen, Dirk Süsserott, Git Mailing List,
	Junio C Hamano

On Sun, 2 Mar 2008, Johannes Schindelin wrote:

> Hi,
> 
> On Sun, 2 Mar 2008, Alex Riesen wrote:
> 
> > -			add_file_to_cache(path, verbose);
> > +			if (add_file_to_cache(path, verbose))
> > +				exit(1);
> 
> Does it really, really _have_ to be exit(1)?  I mean, now you block even 
> the faintest chance that we can libify libgit.a by overriding die_routine.

It would be handy to have a die_no_message(), for cases like this where a 
function wants to print an error message but it's up to the caller whether 
to abort (in the contextually reasonable way).

	-Daniel
*This .sig left intentionally blank*

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: How to "git add ." when some files are not accessible (permission denied)?
  2008-03-02  1:19 ` Jeff King
@ 2008-03-03 19:17   ` Dirk Süsserott
  2008-03-03 20:06     ` Junio C Hamano
  0 siblings, 1 reply; 32+ messages in thread
From: Dirk Süsserott @ 2008-03-03 19:17 UTC (permalink / raw)
  To: Git Mailing List

Jeff King schrieb:
> On Sat, Mar 01, 2008 at 02:46:28PM +0100, Dirk Süsserott wrote:
>
>   
>> The question is: is there a way to tell "git add ." to add all files but
>> ignore those that cannot be added due to lack of authorization?
>>     
>
> No, there isn't. Under Linux, I would come up with a list of files I was
> interested in and then pipe it to "xargs git-add", which is probably
> unhelpful for Windows.
>
>   
Not quite. I'm using the msysGit package from 
http://code.google.com/p/msysgit/downloads/list and that comes with some 
fundamental unix tools like a sound shell, find, xargs, and many more. 
Very good!
This way prepared, I used "git ls-files -o | xargs git add -v" until 
most of my files were added.
For the rest I did "xargs -l" (ell) so that the files got added one by one.
The files that still refused to be added are finally ignored by "git 
ls-files -o >> .gitignore".

Caveat: filenames containing blanks are not handled properly as they are 
not surrounded by quotes. "git add" thinks of them as two or more files 
and fails.
I figure xargs has some cool switches to sourround the parameters with 
quotes, but I didn't find them. An option was to write a script or shell 
function that does it and pipe the filenames through that function or -- 
as filenames with blanks aren't so numerous -- to add them manually with 
"git gui".

Eventually, I solved the problem. Thanks for and to your pointers. :-)

  -- Dirk


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: How to "git add ." when some files are not accessible (permission denied)?
  2008-03-03 19:17   ` Dirk Süsserott
@ 2008-03-03 20:06     ` Junio C Hamano
  2008-03-03 20:32       ` Dirk Süsserott
  0 siblings, 1 reply; 32+ messages in thread
From: Junio C Hamano @ 2008-03-03 20:06 UTC (permalink / raw)
  To: Dirk Süsserott; +Cc: Git Mailing List

Dirk Süsserott <newsletter@dirk.my1.cc> writes:

> This way prepared, I used "git ls-files -o | xargs git add -v" until
> most of my files were added.
> ...
> Caveat: filenames containing blanks are not handled properly as they
> are not surrounded by quotes. "git add" thinks of them as two or more
> files and fails.

Perhaps "git ls-files -z -o | git update-index --add --stdin"

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: How to "git add ." when some files are not accessible (permission denied)?
  2008-03-03 20:06     ` Junio C Hamano
@ 2008-03-03 20:32       ` Dirk Süsserott
  0 siblings, 0 replies; 32+ messages in thread
From: Dirk Süsserott @ 2008-03-03 20:32 UTC (permalink / raw)
  To: Git Mailing List

Junio C Hamano schrieb:
> Dirk Süsserott <newsletter@dirk.my1.cc> writes:
>
>   
>> This way prepared, I used "git ls-files -o | xargs git add -v" until
>> most of my files were added.
>> ...
>> Caveat: filenames containing blanks are not handled properly as they
>> are not surrounded by quotes. "git add" thinks of them as two or more
>> files and fails.
>>     
>
> Perhaps "git ls-files -z -o | git update-index --add --stdin"
>
>   
That's exactly what I meant when I wrote "Git almost always has a 
solution for 'do what I mean'".
It is, however, sometimes hard to find, but the solution is always there.
Its such a great piece of software. Congratulations to you all.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-03-02 16:59       ` Junio C Hamano
  2008-03-02 21:42         ` Alex Riesen
@ 2008-05-12 17:56         ` Alex Riesen
  2008-05-12 17:57           ` Alex Riesen
  2008-05-12 18:42           ` [PATCH] Make the exit code of add_file_to_index actually useful Junio C Hamano
  1 sibling, 2 replies; 32+ messages in thread
From: Alex Riesen @ 2008-05-12 17:56 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Schindelin, Dirk Süsserott, Git Mailing List

Junio C Hamano, Sun, Mar 02, 2008 17:59:13 +0100:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> > On Sun, 2 Mar 2008, Alex Riesen wrote:
> >
> >> -			add_file_to_cache(path, verbose);
> >> +			if (add_file_to_cache(path, verbose))
> >> +				exit(1);
> >
> > Does it really, really _have_ to be exit(1)?  I mean, now you block even 
> > the faintest chance that we can libify libgit.a by overriding die_routine.
> 
> I think Alex did so not to break the existing scripts that rely on these
> dying, but it should have been exit(128) to really stay compatible.

I corrected the series to use die() again and rebased it off current
master (65ea3b8c). So it is more compatible with libification (does
not hinder it more than previos code) and keep the exit code.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [PATCH] Make the exit code of add_file_to_index actually useful
  2008-05-12 17:56         ` Alex Riesen
@ 2008-05-12 17:57           ` Alex Riesen
  2008-05-12 17:58             ` [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors Alex Riesen
  2008-05-12 18:42           ` [PATCH] Make the exit code of add_file_to_index actually useful Junio C Hamano
  1 sibling, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-05-12 17:57 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Johannes Schindelin, Dirk Süsserott, Junio C Hamano

Update the programs which used the function (as add_file_to_cache).

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 builtin-add.c    |    6 ++++--
 builtin-commit.c |    7 ++++---
 builtin-mv.c     |    3 ++-
 read-cache.c     |    6 +++---
 4 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 4a91e3e..4d72ab6 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -94,7 +94,8 @@ static void update_callback(struct diff_queue_struct *q,
 		case DIFF_STATUS_UNMERGED:
 		case DIFF_STATUS_MODIFIED:
 		case DIFF_STATUS_TYPE_CHANGED:
-			add_file_to_cache(path, verbose);
+			if (add_file_to_cache(path, verbose))
+				die("updating files failed");
 			break;
 		case DIFF_STATUS_DELETED:
 			remove_file_from_cache(path);
@@ -254,7 +255,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	}
 
 	for (i = 0; i < dir.nr; i++)
-		add_file_to_cache(dir.entries[i]->name, verbose);
+		if (add_file_to_cache(dir.entries[i]->name, verbose))
+			die("adding files failed");
 
  finish:
 	if (active_cache_changed) {
diff --git a/builtin-commit.c b/builtin-commit.c
index a65c2b8..ae29d35 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -178,9 +178,10 @@ static void add_remove_files(struct path_list *list)
 		struct stat st;
 		struct path_list_item *p = &(list->items[i]);
 
-		if (!lstat(p->path, &st))
-			add_to_cache(p->path, &st, 0);
-		else
+		if (!lstat(p->path, &st)) {
+			if (add_to_cache(p->path, &st, 0))
+				die("updating files failed");
+		} else
 			remove_file_from_cache(p->path);
 	}
 }
diff --git a/builtin-mv.c b/builtin-mv.c
index 94f6dd2..fb8ffb4 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c
@@ -256,7 +256,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
 		for (i = 0; i < added.nr; i++) {
 			const char *path = added.items[i].path;
-			add_file_to_cache(path, verbose);
+			if (add_file_to_cache(path, verbose))
+				die("updating index entries failed");
 		}
 
 		for (i = 0; i < deleted.nr; i++)
diff --git a/read-cache.c b/read-cache.c
index 0382804..8b467f8 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -470,7 +470,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
 	unsigned ce_option = CE_MATCH_IGNORE_VALID|CE_MATCH_RACY_IS_DIRTY;
 
 	if (!S_ISREG(st_mode) && !S_ISLNK(st_mode) && !S_ISDIR(st_mode))
-		die("%s: can only add regular files, symbolic links or git-directories", path);
+		return error("%s: can only add regular files, symbolic links or git-directories", path);
 
 	namelen = strlen(path);
 	if (S_ISDIR(st_mode)) {
@@ -505,12 +505,12 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
 		return 0;
 	}
 	if (index_path(ce->sha1, path, st, 1))
-		die("unable to index file %s", path);
+		return error("unable to index file %s", path);
 	if (ignore_case && alias && different_name(ce, alias))
 		ce = create_alias_ce(ce, alias);
 	ce->ce_flags |= CE_ADDED;
 	if (add_index_entry(istate, ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE))
-		die("unable to add %s to index",path);
+		return error("unable to add %s to index",path);
 	if (verbose)
 		printf("add '%s'\n", path);
 	return 0;
-- 
1.5.5.1.184.g5bee

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors
  2008-05-12 17:57           ` Alex Riesen
@ 2008-05-12 17:58             ` Alex Riesen
  2008-05-12 17:58               ` [PATCH] Add --ignore-errors to git-add to allow it to skip files with read errors Alex Riesen
  0 siblings, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-05-12 17:58 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Johannes Schindelin, Dirk Süsserott, Junio C Hamano

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

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH] Add --ignore-errors to git-add to allow it to skip files with read errors
  2008-05-12 17:58             ` [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors Alex Riesen
@ 2008-05-12 17:58               ` Alex Riesen
  2008-05-12 17:58                 ` [PATCH] Add a test for git-add --ignore-errors Alex Riesen
  0 siblings, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-05-12 17:58 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Johannes Schindelin, Dirk Süsserott, Junio C Hamano

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 Documentation/git-add.txt |    7 ++++++-
 builtin-add.c             |   11 +++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index e0e730b..bb4abe2 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -9,7 +9,7 @@ SYNOPSIS
 --------
 [verse]
 'git-add' [-n] [-v] [-f] [--interactive | -i] [--patch | -p] [-u] [--refresh]
-          [--] <filepattern>...
+	  [--ignore-errors] [--] <filepattern>...
 
 DESCRIPTION
 -----------
@@ -83,6 +83,11 @@ OPTIONS
 	Don't add the file(s), but only refresh their stat()
 	information in the index.
 
+\--ignore-errors::
+	If some files could not be added because of errors indexing
+	them, do not abort the operation, but continue adding the
+	others. The command shall still exit with non-zero status.
+
 \--::
 	This option can be used to separate command-line options from
 	the list of files, (useful when filenames might be mistaken
diff --git a/builtin-add.c b/builtin-add.c
index 7862808..522519e 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -191,6 +191,7 @@ static const char ignore_error[] =
 "The following paths are ignored by one of your .gitignore files:\n";
 
 static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0;
+static int ignore_add_errors;
 
 static struct option builtin_add_options[] = {
 	OPT__DRY_RUN(&show_only),
@@ -201,6 +202,7 @@ static struct option builtin_add_options[] = {
 	OPT_BOOLEAN('f', NULL, &ignored_too, "allow adding otherwise ignored files"),
 	OPT_BOOLEAN('u', NULL, &take_worktree_changes, "update tracked files"),
 	OPT_BOOLEAN( 0 , "refresh", &refresh_only, "don't add, only refresh the index"),
+	OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, "just skip files which cannot be added because of errors"),
 	OPT_END(),
 };
 
@@ -231,6 +233,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
 		if (verbose)
 			flags |= ADD_FILES_VERBOSE;
+		if (ignore_add_errors)
+			flags |= ADD_FILES_IGNORE_ERRORS;
 
 		exit_status = add_files_to_cache(prefix, pathspec, flags);
 		goto finish;
@@ -274,8 +278,11 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	}
 
 	for (i = 0; i < dir.nr; i++)
-		if (add_file_to_cache(dir.entries[i]->name, verbose))
-			die("adding files failed");
+		if (add_file_to_cache(dir.entries[i]->name, verbose)) {
+			if (!ignore_add_errors)
+				die("adding files failed");
+			exit_status = 1;
+		}
 
  finish:
 	if (active_cache_changed) {
-- 
1.5.5.1.184.g5bee

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH] Add a test for git-add --ignore-errors
  2008-05-12 17:58               ` [PATCH] Add --ignore-errors to git-add to allow it to skip files with read errors Alex Riesen
@ 2008-05-12 17:58                 ` Alex Riesen
  2008-05-12 17:59                   ` [PATCH] Add a config option to ignore errors for git-add Alex Riesen
  2008-05-13  3:48                   ` [PATCH] Add a test for git-add --ignore-errors Junio C Hamano
  0 siblings, 2 replies; 32+ messages in thread
From: Alex Riesen @ 2008-05-12 17:58 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Johannes Schindelin, Dirk Süsserott, Junio C Hamano

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 t/t3700-add.sh |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 287e058..ca3e33d 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -179,4 +179,13 @@ test_expect_success 'git add --refresh' '
 	test -z "`git diff-index HEAD -- foo`"
 '
 
+test_expect_success 'git add --ignore-errors' '
+	git reset --hard &&
+	date >foo1 &&
+	date >foo2 &&
+	chmod 0 foo2 &&
+	git add --verbose --ignore-errors .
+	git ls-files |grep foo1
+'
+
 test_done
-- 
1.5.5.1.184.g5bee

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH] Add a config option to ignore errors for git-add
  2008-05-12 17:58                 ` [PATCH] Add a test for git-add --ignore-errors Alex Riesen
@ 2008-05-12 17:59                   ` Alex Riesen
  2008-05-13  3:48                   ` [PATCH] Add a test for git-add --ignore-errors Junio C Hamano
  1 sibling, 0 replies; 32+ messages in thread
From: Alex Riesen @ 2008-05-12 17:59 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Johannes Schindelin, Dirk Süsserott, Junio C Hamano

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
 builtin-add.c  |   11 ++++++++++-
 t/t3700-add.sh |   12 ++++++++++++
 2 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 522519e..73235ed 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -206,6 +206,15 @@ static struct option builtin_add_options[] = {
 	OPT_END(),
 };
 
+static int add_config(const char *var, const char *value)
+{
+	if (!strcasecmp(var, "add.ignore-errors")) {
+		ignore_add_errors = git_config_bool(var, value);
+		return 0;
+	}
+	return git_default_config(var, value);
+}
+
 int cmd_add(int argc, const char **argv, const char *prefix)
 {
 	int exit_status = 0;
@@ -220,7 +229,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	if (add_interactive)
 		exit(interactive_add(argc, argv, prefix));
 
-	git_config(git_default_config);
+	git_config(add_config);
 
 	newfd = hold_locked_index(&lock_file, 1);
 
diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index ca3e33d..08f1641 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -188,4 +188,16 @@ test_expect_success 'git add --ignore-errors' '
 	git ls-files |grep foo1
 '
 
+rm -f foo2
+
+test_expect_success 'git add (add.ignore-errors)' '
+	git config add.ignore-errors 1 &&
+	git reset --hard &&
+	date >foo1 &&
+	date >foo2 &&
+	chmod 0 foo2 &&
+	git add --verbose .
+	git ls-files |grep foo1
+'
+
 test_done
-- 
1.5.5.1.184.g5bee

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-05-12 17:56         ` Alex Riesen
  2008-05-12 17:57           ` Alex Riesen
@ 2008-05-12 18:42           ` Junio C Hamano
  2008-05-12 20:54             ` Alex Riesen
  1 sibling, 1 reply; 32+ messages in thread
From: Junio C Hamano @ 2008-05-12 18:42 UTC (permalink / raw)
  To: Alex Riesen; +Cc: Johannes Schindelin, Dirk Süsserott, Git Mailing List

Alex Riesen <raa.lkml@gmail.com> writes:

> Junio C Hamano, Sun, Mar 02, 2008 17:59:13 +0100:
>> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
>> > On Sun, 2 Mar 2008, Alex Riesen wrote:
>> >
>> >> -			add_file_to_cache(path, verbose);
>> >> +			if (add_file_to_cache(path, verbose))
>> >> +				exit(1);
>> >
>> > Does it really, really _have_ to be exit(1)?  I mean, now you block even 
>> > the faintest chance that we can libify libgit.a by overriding die_routine.
>> 
>> I think Alex did so not to break the existing scripts that rely on these
>> dying, but it should have been exit(128) to really stay compatible.
>
> I corrected the series to use die() again and rebased it off current
> master (65ea3b8c). So it is more compatible with libification (does
> not hinder it more than previos code) and keep the exit code.

But you did not answer my question in the part you did not quote, did you?

Now when somebody either forgets to check the return value from this
function, or deliberately ignores it, the resulting index will not match
what the code is told to update it with.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-05-12 18:42           ` [PATCH] Make the exit code of add_file_to_index actually useful Junio C Hamano
@ 2008-05-12 20:54             ` Alex Riesen
  2008-05-12 22:19               ` Junio C Hamano
  0 siblings, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-05-12 20:54 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Schindelin, Dirk Süsserott, Git Mailing List

Junio C Hamano, Mon, May 12, 2008 20:42:58 +0200:
> >
> > I corrected the series to use die() again and rebased it off current
> > master (65ea3b8c). So it is more compatible with libification (does
> > not hinder it more than previos code) and keep the exit code.
> 
> But you did not answer my question in the part you did not quote, did you?

I believe I did:

Date:	Sun, 2 Mar 2008 22:42:41 +0100
Subject: Re: [PATCH] Make the exit code of add_file_to_index actually useful
Message-ID: <20080302214241.GB13954@steel.home>

Junio C Hamano, Sun, Mar 02, 2008 17:59:13 +0100:
> Why is this even needed to begin with?  I am aware of Dirk's original
> issue discussed elsewhere, but we try fairly hard to be A-O-N when we can
> afford to, and this option deliberately breaks it.  What is the real
> reason why such an unreadable (either for privilege or for I/O error)
> file should not live in .gitignore?

Another program keeps the file open. There is an exclusive mode for
opening files, which locks the files for everyone. I believe it is
even default mode, unless selected otherwise.

> Now when somebody either forgets to check the return value from this
> function, or deliberately ignores it, the resulting index will not match
> what the code is told to update it with.

I think I got them all in the current code:

    $git grep -E 'add_(file_)?to_(index|cache)'
    Documentation/technical/api-in-core-index.txt:* add_file_to_index()
    builtin-add.c:                  if (add_file_to_cache(path, data->flags
    builtin-add.c:          if (add_file_to_cache(dir.entries[i]->name, ver
    builtin-commit.c:                       if (add_to_cache(p->path, &st,
    builtin-mv.c:                   if (add_file_to_cache(path, verbose))
    cache.h:#define add_to_cache(path, st, verbose) add_to_index(&the_index
    cache.h:#define add_file_to_cache(path, verbose) add_file_to_index(&the
    cache.h:extern int add_to_index(struct index_state *, const char *path,
    cache.h:extern int add_file_to_index(struct index_state *, const char *
    read-cache.c:int add_to_index(struct index_state *istate, const char *p
    read-cache.c:int add_file_to_index(struct index_state *istate, const ch
    read-cache.c:   return add_to_index(istate, path, &st, verbose);

Regarding the return value: isn't it very often a bug to ignore them?
Or do you mean to say I should have renamed the function so that old
interface cannot be used accidentally by someone how just knows it
never returns in case of an error?

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-05-12 20:54             ` Alex Riesen
@ 2008-05-12 22:19               ` Junio C Hamano
  2008-05-12 22:48                 ` Alex Riesen
  0 siblings, 1 reply; 32+ messages in thread
From: Junio C Hamano @ 2008-05-12 22:19 UTC (permalink / raw)
  To: Alex Riesen; +Cc: Johannes Schindelin, Dirk Süsserott, Git Mailing List

Alex Riesen <raa.lkml@gmail.com> writes:

>> Why is this even needed to begin with?  I am aware of Dirk's original
>> issue discussed elsewhere, but we try fairly hard to be A-O-N when we can
>> afford to, and this option deliberately breaks it.  What is the real
>> reason why such an unreadable (either for privilege or for I/O error)
>> file should not live in .gitignore?
>
> Another program keeps the file open. There is an exclusive mode for
> opening files, which locks the files for everyone. I believe it is
> even default mode, unless selected otherwise.

I would understand there can be some files that cannot be read.  But when
there is such a file, why is it Ok to ignore an error to update the
contents from that file if/when the user asks to index the current
contents, provided if the contents of that file is to be tracked?  Isn't
it the true cause of the problem that the file is being tracked but it
shouldn't?

>> Now when somebody either forgets to check the return value from this
>> function, or deliberately ignores it, the resulting index will not match
>> what the code is told to update it with.
>
> I think I got them all in the current code...

Not checking the return code from this function that now diagnoses and
returns error code is a bug as you said, and the codebase after your patch
may not have that bug.

But mistakes happen.

That is why I am asking why it is Ok to sometimes ignore the error to
begin with.  If we do not need to ignore this condition, then new callers
have one less thing to worry about, and we would have one less cause of an
unnecessary bug.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-05-12 22:19               ` Junio C Hamano
@ 2008-05-12 22:48                 ` Alex Riesen
  2008-05-12 23:32                   ` Junio C Hamano
  0 siblings, 1 reply; 32+ messages in thread
From: Alex Riesen @ 2008-05-12 22:48 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Schindelin, Dirk Süsserott, Git Mailing List

Junio C Hamano, Tue, May 13, 2008 00:19:42 +0200:
> Alex Riesen <raa.lkml@gmail.com> writes:
> 
> >> Why is this even needed to begin with?  I am aware of Dirk's original
> >> issue discussed elsewhere, but we try fairly hard to be A-O-N when we can
> >> afford to, and this option deliberately breaks it.  What is the real
> >> reason why such an unreadable (either for privilege or for I/O error)
> >> file should not live in .gitignore?
> >
> > Another program keeps the file open. There is an exclusive mode for
> > opening files, which locks the files for everyone. I believe it is
> > even default mode, unless selected otherwise.
> 
> I would understand there can be some files that cannot be read.  But when
> there is such a file, why is it Ok to ignore an error to update the
> contents from that file if/when the user asks to index the current
> contents, provided if the contents of that file is to be tracked?  Isn't
> it the true cause of the problem that the file is being tracked but it
> shouldn't?

No, I don't think so. Consider "git add dir/". It is _not_ 1 (one)
operation. It is many operations (add every file in the "dir/"). Why
should all of them be considered failed just because the third file
from the bottom could not be read (and the user may have not even seen
it, because it wasn't there before, like a temporary file from Excel).
And for a user (for me, at least) "git add" is an intermediate
operation anyway: there'll be a review in form "git status" or "git
commit" afterwards. And there was a clear (sadly invisible with
--verbose) warning regarding some file having problems.

> >> Now when somebody either forgets to check the return value from this
> >> function, or deliberately ignores it, the resulting index will not match
> >> what the code is told to update it with.
> >
> > I think I got them all in the current code...
> 
> Not checking the return code from this function that now diagnoses and
> returns error code is a bug as you said, and the codebase after your patch
> may not have that bug.
> 
> But mistakes happen.
> 
> That is why I am asking why it is Ok to sometimes ignore the error to
> begin with.  If we do not need to ignore this condition, then new callers
> have one less thing to worry about, and we would have one less cause of an
> unnecessary bug.

For the reasons outlined? Where the user is in a situation when he has
to override the safety checks. Just because it is more convenient to
type --ignore-errors than edit .gitignore and add there a whimsical
patterns like "~*.xls", which one day have to be overridden because
that project got an excel file which begins with "~"?

I am not suggesting making it default. And actually, the last patch,
with a config for add.ignore-errors option, better be ignored - it was
just too simple to code up. I never used the option. I had cases for
--ignore-errors, sadly.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-05-12 22:48                 ` Alex Riesen
@ 2008-05-12 23:32                   ` Junio C Hamano
  2008-05-13  6:00                     ` Alex Riesen
  0 siblings, 1 reply; 32+ messages in thread
From: Junio C Hamano @ 2008-05-12 23:32 UTC (permalink / raw)
  To: Alex Riesen; +Cc: Johannes Schindelin, Dirk Süsserott, Git Mailing List

Alex Riesen <raa.lkml@gmail.com> writes:

> Junio C Hamano, Tue, May 13, 2008 00:19:42 +0200:
> ...
>> I would understand there can be some files that cannot be read.  But when
>> there is such a file, why is it Ok to ignore an error to update the
>> contents from that file if/when the user asks to index the current
>> contents, provided if the contents of that file is to be tracked?  Isn't
>> it the true cause of the problem that the file is being tracked but it
>> shouldn't?
>
> No, I don't think so. Consider "git add dir/". It is _not_ 1 (one)
> operation. It is many operations (add every file in the "dir/"). Why
> should all of them be considered failed just because the third file
> from the bottom could not be read (and the user may have not even seen
> it, because it wasn't there before, like a temporary file from Excel).
> And for a user (for me, at least) "git add" is an intermediate
> operation anyway...

Ah, Ok, I was overly cautious, and the worry is unfounded, as long as you
do not trigger this "ignore" thing upon "git commit -a".

Thanks.  Will queue.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Add a test for git-add --ignore-errors
  2008-05-12 17:58                 ` [PATCH] Add a test for git-add --ignore-errors Alex Riesen
  2008-05-12 17:59                   ` [PATCH] Add a config option to ignore errors for git-add Alex Riesen
@ 2008-05-13  3:48                   ` Junio C Hamano
  2008-05-13  6:04                     ` Alex Riesen
  2008-05-13  6:05                     ` Junio C Hamano
  1 sibling, 2 replies; 32+ messages in thread
From: Junio C Hamano @ 2008-05-13  3:48 UTC (permalink / raw)
  To: Alex Riesen; +Cc: Git Mailing List, Johannes Schindelin, Dirk Süsserott

Alex Riesen <raa.lkml@gmail.com> writes:

> Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
> ---
>  t/t3700-add.sh |    9 +++++++++
>  1 files changed, 9 insertions(+), 0 deletions(-)
>
> diff --git a/t/t3700-add.sh b/t/t3700-add.sh
> index 287e058..ca3e33d 100755
> --- a/t/t3700-add.sh
> +++ b/t/t3700-add.sh
> @@ -179,4 +179,13 @@ test_expect_success 'git add --refresh' '
>  	test -z "`git diff-index HEAD -- foo`"
>  '
>  
> +test_expect_success 'git add --ignore-errors' '
> +	git reset --hard &&
> +	date >foo1 &&
> +	date >foo2 &&
> +	chmod 0 foo2 &&
> +	git add --verbose --ignore-errors .
> +	git ls-files |grep foo1
> +'
> +
>  test_done

I like the fact that you added --ignore-errors and made it still error out
when it cannot read some files.  Shouldn't we be testing it here with
"must-fail"?

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Make the exit code of add_file_to_index actually useful
  2008-05-12 23:32                   ` Junio C Hamano
@ 2008-05-13  6:00                     ` Alex Riesen
  0 siblings, 0 replies; 32+ messages in thread
From: Alex Riesen @ 2008-05-13  6:00 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Schindelin, Dirk S??sserott, Git Mailing List

Junio C Hamano, Tue, May 13, 2008 01:32:19 +0200:
> Alex Riesen <raa.lkml@gmail.com> writes:
> 
> > Junio C Hamano, Tue, May 13, 2008 00:19:42 +0200:
> > ...
> >> I would understand there can be some files that cannot be read.  But when
> >> there is such a file, why is it Ok to ignore an error to update the
> >> contents from that file if/when the user asks to index the current
> >> contents, provided if the contents of that file is to be tracked?  Isn't
> >> it the true cause of the problem that the file is being tracked but it
> >> shouldn't?
> >
> > No, I don't think so. Consider "git add dir/". It is _not_ 1 (one)
> > operation. It is many operations (add every file in the "dir/"). Why
> > should all of them be considered failed just because the third file
> > from the bottom could not be read (and the user may have not even seen
> > it, because it wasn't there before, like a temporary file from Excel).
> > And for a user (for me, at least) "git add" is an intermediate
> > operation anyway...
> 
> Ah, Ok, I was overly cautious, and the worry is unfounded, as long as you
> do not trigger this "ignore" thing upon "git commit -a".

Yes, builtin-commit.c explicitely keeps its behaviour: the 0 in flags
argument makes sure die() is called. "Ignore errors" must be requested
with ADD_FILES_IGNORE_ERRORS.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH] Add a test for git-add --ignore-errors
  2008-05-13  3:48                   ` [PATCH] Add a test for git-add --ignore-errors Junio C Hamano
@ 2008-05-13  6:04                     ` Alex Riesen
  2008-05-13  6:05                     ` Junio C Hamano
  1 sibling, 0 replies; 32+ messages in thread
From: Alex Riesen @ 2008-05-13  6:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Git Mailing List, Johannes Schindelin, Dirk S??sserott


Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
Junio C Hamano, Tue, May 13, 2008 05:48:22 +0200:
> Alex Riesen <raa.lkml@gmail.com> writes:
> > +test_expect_success 'git add --ignore-errors' '
> > +	git reset --hard &&
> > +	date >foo1 &&
> > +	date >foo2 &&
> > +	chmod 0 foo2 &&
> > +	git add --verbose --ignore-errors .
> > +	git ls-files |grep foo1
> > +'
> > +
> >  test_done
> 
> I like the fact that you added --ignore-errors and made it still error out
> when it cannot read some files.  Shouldn't we be testing it here with
> "must-fail"?

Yes. Would you mind replacing that patch with this one?

 t/t3700-add.sh |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 287e058..17ab05a 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -179,4 +179,13 @@ test_expect_success 'git add --refresh' '
 	test -z "`git diff-index HEAD -- foo`"
 '
 
+test_expect_success 'git add --ignore-errors' '
+	git reset --hard &&
+	date >foo1 &&
+	date >foo2 &&
+	chmod 0 foo2 &&
+	test_must_fail git add --verbose --ignore-errors . &&
+	git ls-files |grep foo1
+'
+
 test_done
-- 
1.5.5.1.206.g7103c

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [PATCH] Add a test for git-add --ignore-errors
  2008-05-13  3:48                   ` [PATCH] Add a test for git-add --ignore-errors Junio C Hamano
  2008-05-13  6:04                     ` Alex Riesen
@ 2008-05-13  6:05                     ` Junio C Hamano
  2008-05-13 22:28                       ` Alex Riesen
  1 sibling, 1 reply; 32+ messages in thread
From: Junio C Hamano @ 2008-05-13  6:05 UTC (permalink / raw)
  To: Alex Riesen; +Cc: Git Mailing List, Johannes Schindelin, Dirk Süsserott

Junio C Hamano <junio@pobox.com> writes:

> Alex Riesen <raa.lkml@gmail.com> writes:
>
>> Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
>> ---
>>  t/t3700-add.sh |    9 +++++++++
>>  1 files changed, 9 insertions(+), 0 deletions(-)
>>
>> diff --git a/t/t3700-add.sh b/t/t3700-add.sh
>> index 287e058..ca3e33d 100755
>> --- a/t/t3700-add.sh
>> +++ b/t/t3700-add.sh
>> @@ -179,4 +179,13 @@ test_expect_success 'git add --refresh' '
>>  	test -z "`git diff-index HEAD -- foo`"
>>  '
>>  
>> +test_expect_success 'git add --ignore-errors' '
>> +	git reset --hard &&
>> +	date >foo1 &&
>> +	date >foo2 &&
>> +	chmod 0 foo2 &&
>> +	git add --verbose --ignore-errors .
>> +	git ls-files |grep foo1
>> +'
>> +
>>  test_done
>
> I like the fact that you added --ignore-errors and made it still error out
> when it cannot read some files.  Shouldn't we be testing it here with
> "must-fail"?

It is human nature to get too enthusiastic demonstrating his own shiny new
toy and forget to check that it does not kick in when not asked.  There is
no test for a case to make sure "git add" fails when foo2 is not readable
and does not add "foo1".

Here is a replacement I've queued.  I have a similar addition to the test
in the patch after this one that demonstrates the configuration variable.
I added tests to check the case when the variable is set to false.

-- >8 --
Add a test for git-add --ignore-errors

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/t3700-add.sh |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 287e058..01e4d62 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -179,4 +179,26 @@ test_expect_success 'git add --refresh' '
 	test -z "`git diff-index HEAD -- foo`"
 '
 
+test_expect_success 'git add should fail atomically upon an unreadable file' '
+	git reset --hard &&
+	date >foo1 &&
+	date >foo2 &&
+	chmod 0 foo2 &&
+	test_must_fail git add --verbose . &&
+	! ( git ls-files foo1 | grep foo1 )
+'
+
+rm -f foo2
+
+test_expect_success 'git add --ignore-errors' '
+	git reset --hard &&
+	date >foo1 &&
+	date >foo2 &&
+	chmod 0 foo2 &&
+	test_must_fail git add --verbose --ignore-errors . &&
+	git ls-files foo1 | grep foo1
+'
+
+rm -f foo2
+
 test_done
-- 
1.5.5.1.340.g39dc6

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [PATCH] Add a test for git-add --ignore-errors
  2008-05-13  6:05                     ` Junio C Hamano
@ 2008-05-13 22:28                       ` Alex Riesen
  0 siblings, 0 replies; 32+ messages in thread
From: Alex Riesen @ 2008-05-13 22:28 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Git Mailing List, Johannes Schindelin, Dirk Süsserott

Junio C Hamano, Tue, May 13, 2008 08:05:01 +0200:
> Junio C Hamano <junio@pobox.com> writes:
> 
> > Alex Riesen <raa.lkml@gmail.com> writes:
> >
> >> Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
> >> ---
> >>  t/t3700-add.sh |    9 +++++++++
> >>  1 files changed, 9 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/t/t3700-add.sh b/t/t3700-add.sh
> >> index 287e058..ca3e33d 100755
> >> --- a/t/t3700-add.sh
> >> +++ b/t/t3700-add.sh
> >> @@ -179,4 +179,13 @@ test_expect_success 'git add --refresh' '
> >>  	test -z "`git diff-index HEAD -- foo`"
> >>  '
> >>  
> >> +test_expect_success 'git add --ignore-errors' '
> >> +	git reset --hard &&
> >> +	date >foo1 &&
> >> +	date >foo2 &&
> >> +	chmod 0 foo2 &&
> >> +	git add --verbose --ignore-errors .
> >> +	git ls-files |grep foo1
> >> +'
> >> +
> >>  test_done
> >
> > I like the fact that you added --ignore-errors and made it still error out
> > when it cannot read some files.  Shouldn't we be testing it here with
> > "must-fail"?
> 
> It is human nature to get too enthusiastic demonstrating his own shiny new
> toy and forget to check that it does not kick in when not asked.  There is
> no test for a case to make sure "git add" fails when foo2 is not readable
> and does not add "foo1".

Yes, I missed that. Exactly for the reason :)

> Here is a replacement I've queued.  I have a similar addition to the test
> in the patch after this one that demonstrates the configuration variable.
> I added tests to check the case when the variable is set to false.

Thanks.

> -- >8 --
> Add a test for git-add --ignore-errors
> 
> Signed-off-by: Alex Riesen <raa.lkml@gmail.com>

Acked-by: Alex Riesen <raa.lkml@gmail.com>

^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2008-05-13 22:28 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-01 13:46 How to "git add ." when some files are not accessible (permission denied)? Dirk Süsserott
2008-03-02  1:19 ` Jeff King
2008-03-03 19:17   ` Dirk Süsserott
2008-03-03 20:06     ` Junio C Hamano
2008-03-03 20:32       ` Dirk Süsserott
2008-03-02 15:41 ` Alex Riesen
2008-03-02 15:42   ` [PATCH] Make the exit code of add_file_to_index actually useful Alex Riesen
2008-03-02 15:43     ` [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors Alex Riesen
2008-03-02 15:44       ` [PATCH] Add --ignore-errors to git-add to allow it to skip files with read errors Alex Riesen
2008-03-02 15:44         ` [PATCH] Add a test for git-add --ignore-errors Alex Riesen
2008-03-02 15:57     ` [PATCH] Make the exit code of add_file_to_index actually useful Johannes Schindelin
2008-03-02 16:59       ` Junio C Hamano
2008-03-02 21:42         ` Alex Riesen
2008-03-02 22:04           ` Joachim B Haga
2008-03-03  6:57             ` Alex Riesen
2008-05-12 17:56         ` Alex Riesen
2008-05-12 17:57           ` Alex Riesen
2008-05-12 17:58             ` [PATCH] Extend interface of add_files_to_cache to allow ignore indexing errors Alex Riesen
2008-05-12 17:58               ` [PATCH] Add --ignore-errors to git-add to allow it to skip files with read errors Alex Riesen
2008-05-12 17:58                 ` [PATCH] Add a test for git-add --ignore-errors Alex Riesen
2008-05-12 17:59                   ` [PATCH] Add a config option to ignore errors for git-add Alex Riesen
2008-05-13  3:48                   ` [PATCH] Add a test for git-add --ignore-errors Junio C Hamano
2008-05-13  6:04                     ` Alex Riesen
2008-05-13  6:05                     ` Junio C Hamano
2008-05-13 22:28                       ` Alex Riesen
2008-05-12 18:42           ` [PATCH] Make the exit code of add_file_to_index actually useful Junio C Hamano
2008-05-12 20:54             ` Alex Riesen
2008-05-12 22:19               ` Junio C Hamano
2008-05-12 22:48                 ` Alex Riesen
2008-05-12 23:32                   ` Junio C Hamano
2008-05-13  6:00                     ` Alex Riesen
2008-03-03 18:01       ` Daniel Barkalow

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).