git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* For review: git add --ignore-unmatch
@ 2009-08-12 22:26 Luke-Jr
  2009-08-12 22:57 ` Thomas Rast
  2009-08-13  3:20 ` [PATCH 1/5] port --ignore-unmatch to "git add" Luke Dashjr
  0 siblings, 2 replies; 21+ messages in thread
From: Luke-Jr @ 2009-08-12 22:26 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: Text/Plain, Size: 1 bytes --]



[-- Attachment #2: 0001-port-ignore-unmatch-from-git-rm-to-git-add.patch --]
[-- Type: text/x-patch, Size: 2009 bytes --]

From 54768360aa7b1882dd2b76211661abb6014cbf23 Mon Sep 17 00:00:00 2001
From: Luke Dashjr <luke-jr+git@utopios.org>
Date: Wed, 12 Aug 2009 16:26:31 -0500
Subject: [PATCH 1/3] port --ignore-unmatch from "git rm" to "git add"

---
 builtin-add.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 581a2a1..0597fb9 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -19,6 +19,7 @@ static const char * const builtin_add_usage[] = {
 };
 static int patch_interactive, add_interactive, edit_interactive;
 static int take_worktree_changes;
+static int ignore_unmatch = 0;
 
 static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
 {
@@ -63,7 +64,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
 	fill_pathspec_matches(pathspec, seen, specs);
 
 	for (i = 0; i < specs; i++) {
-		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]))
+		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]) && !ignore_unmatch)
 			die("pathspec '%s' did not match any files",
 					pathspec[i]);
 	}
@@ -108,7 +109,7 @@ static void refresh(int verbose, const char **pathspec)
 	refresh_index(&the_index, verbose ? REFRESH_SAY_CHANGED : REFRESH_QUIET,
 		      pathspec, seen);
 	for (i = 0; i < specs; i++) {
-		if (!seen[i])
+		if (!seen[i] && !ignore_unmatch)
 			die("pathspec '%s' did not match any files", pathspec[i]);
 	}
         free(seen);
@@ -226,6 +227,8 @@ static struct option builtin_add_options[] = {
 	OPT_BOOLEAN('A', "all", &addremove, "add all, noticing removal of 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_BOOLEAN( 0 , "ignore-unmatch", &ignore_unmatch,
+				"exit with a zero status even if nothing matched"),
 	OPT_END(),
 };
 
-- 
1.6.3.3


[-- Attachment #3: 0002-fix-git-add-ignore-errors-to-ignore-pathspec-errors.patch --]
[-- Type: text/x-patch, Size: 761 bytes --]

From c6cd06db8ab3b198eafffd5b0e94d2f338f10072 Mon Sep 17 00:00:00 2001
From: Luke Dashjr <luke-jr+git@utopios.org>
Date: Wed, 12 Aug 2009 16:31:37 -0500
Subject: [PATCH 2/3] fix "git add --ignore-errors" to ignore pathspec errors

---
 builtin-add.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 0597fb9..e3132c8 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -280,6 +280,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 		add_interactive = 1;
 	if (add_interactive)
 		exit(interactive_add(argc - 1, argv + 1, prefix));
+	if (ignore_add_errors)
+		ignore_unmatch = 1;
 
 	if (edit_interactive)
 		return(edit_patch(argc, argv, prefix));
-- 
1.6.3.3


[-- Attachment #4: 0003-Document-ignore-unmatch-in-git-add.txt.patch --]
[-- Type: text/x-patch, Size: 1217 bytes --]

From 410a93cb61669304a0b1d10b8013d1635432e8a0 Mon Sep 17 00:00:00 2001
From: Luke Dashjr <luke-jr+git@utopios.org>
Date: Wed, 12 Aug 2009 17:23:44 -0500
Subject: [PATCH 3/3] Document --ignore-unmatch in git-add.txt

---
 Documentation/git-add.txt |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index ab1943c..6b93b4e 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -10,7 +10,8 @@ SYNOPSIS
 [verse]
 'git add' [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]
 	  [--edit | -e] [--all | [--update | -u]] [--intent-to-add | -N]
-	  [--refresh] [--ignore-errors] [--] <filepattern>...
+	  [--refresh] [--ignore-errors] [--ignore-unmatch] [--]
+	  <filepattern>...
 
 DESCRIPTION
 -----------
@@ -119,6 +120,9 @@ apply.
 	them, do not abort the operation, but continue adding the
 	others. The command shall still exit with non-zero status.
 
+--ignore-unmatch::
+	Exit with a zero status even if no files matched.
+
 \--::
 	This option can be used to separate command-line options from
 	the list of files, (useful when filenames might be mistaken
-- 
1.6.3.3


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

* Re: For review: git add --ignore-unmatch
  2009-08-12 22:26 For review: git add --ignore-unmatch Luke-Jr
@ 2009-08-12 22:57 ` Thomas Rast
  2009-08-13  3:20 ` [PATCH 1/5] port --ignore-unmatch to "git add" Luke Dashjr
  1 sibling, 0 replies; 21+ messages in thread
From: Thomas Rast @ 2009-08-12 22:57 UTC (permalink / raw)
  To: Luke-Jr; +Cc: git

Luke-Jr wrote:
> 
> [0001-port-ignore-unmatch-from-git-rm-to-git-add.patch]
> [0002-fix-git-add-ignore-errors-to-ignore-pathspec-errors.patch]
> [0003-Document-ignore-unmatch-in-git-add.txt.patch]

I've already told you on IRC how to go about this, so please:

* send one patch per mail, inline
* write real commit messages
* sign off
* write tests

[Yeah, I'm tired and grumpy, but I'm also trying to save others the
work of saying this again more politely...]

-- 
Thomas Rast
trast@{inf,student}.ethz.ch

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

* [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-12 22:26 For review: git add --ignore-unmatch Luke-Jr
  2009-08-12 22:57 ` Thomas Rast
@ 2009-08-13  3:20 ` Luke Dashjr
  2009-08-13  3:20   ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Luke Dashjr
  2009-08-13 19:36   ` [PATCH 1/5] port --ignore-unmatch to "git add" Junio C Hamano
  1 sibling, 2 replies; 21+ messages in thread
From: Luke Dashjr @ 2009-08-13  3:20 UTC (permalink / raw)
  To: git; +Cc: Luke Dashjr

"git rm" has a --ignore-unmatch option that is also applicable to "git add"
and may be useful for persons wanting to ignore unmatched arguments, but not
all errors.

Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
---
 builtin-add.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 581a2a1..0597fb9 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -19,6 +19,7 @@ static const char * const builtin_add_usage[] = {
 };
 static int patch_interactive, add_interactive, edit_interactive;
 static int take_worktree_changes;
+static int ignore_unmatch = 0;
 
 static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
 {
@@ -63,7 +64,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
 	fill_pathspec_matches(pathspec, seen, specs);
 
 	for (i = 0; i < specs; i++) {
-		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]))
+		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]) && !ignore_unmatch)
 			die("pathspec '%s' did not match any files",
 					pathspec[i]);
 	}
@@ -108,7 +109,7 @@ static void refresh(int verbose, const char **pathspec)
 	refresh_index(&the_index, verbose ? REFRESH_SAY_CHANGED : REFRESH_QUIET,
 		      pathspec, seen);
 	for (i = 0; i < specs; i++) {
-		if (!seen[i])
+		if (!seen[i] && !ignore_unmatch)
 			die("pathspec '%s' did not match any files", pathspec[i]);
 	}
         free(seen);
@@ -226,6 +227,8 @@ static struct option builtin_add_options[] = {
 	OPT_BOOLEAN('A', "all", &addremove, "add all, noticing removal of 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_BOOLEAN( 0 , "ignore-unmatch", &ignore_unmatch,
+				"exit with a zero status even if nothing matched"),
 	OPT_END(),
 };
 
-- 
1.6.3.3

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

* [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors
  2009-08-13  3:20 ` [PATCH 1/5] port --ignore-unmatch to "git add" Luke Dashjr
@ 2009-08-13  3:20   ` Luke Dashjr
  2009-08-13  3:20     ` [PATCH 3/5] Document --ignore-unmatch in git-add.txt Luke Dashjr
  2009-08-13 19:38     ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Junio C Hamano
  2009-08-13 19:36   ` [PATCH 1/5] port --ignore-unmatch to "git add" Junio C Hamano
  1 sibling, 2 replies; 21+ messages in thread
From: Luke Dashjr @ 2009-08-13  3:20 UTC (permalink / raw)
  To: git; +Cc: Luke Dashjr

Unmatched files are errors, and should be ignored with the rest of them.

Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
---
 builtin-add.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 0597fb9..e3132c8 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -280,6 +280,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 		add_interactive = 1;
 	if (add_interactive)
 		exit(interactive_add(argc - 1, argv + 1, prefix));
+	if (ignore_add_errors)
+		ignore_unmatch = 1;
 
 	if (edit_interactive)
 		return(edit_patch(argc, argv, prefix));
-- 
1.6.3.3

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

* [PATCH 3/5] Document --ignore-unmatch in git-add.txt
  2009-08-13  3:20   ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Luke Dashjr
@ 2009-08-13  3:20     ` Luke Dashjr
  2009-08-13  3:20       ` [PATCH 4/5] implement error_errno and warning_errno Luke Dashjr
  2009-08-13 19:38     ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Junio C Hamano
  1 sibling, 1 reply; 21+ messages in thread
From: Luke Dashjr @ 2009-08-13  3:20 UTC (permalink / raw)
  To: git; +Cc: Luke Dashjr

Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
---
 Documentation/git-add.txt |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index ab1943c..6b93b4e 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -10,7 +10,8 @@ SYNOPSIS
 [verse]
 'git add' [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]
 	  [--edit | -e] [--all | [--update | -u]] [--intent-to-add | -N]
-	  [--refresh] [--ignore-errors] [--] <filepattern>...
+	  [--refresh] [--ignore-errors] [--ignore-unmatch] [--]
+	  <filepattern>...
 
 DESCRIPTION
 -----------
@@ -119,6 +120,9 @@ apply.
 	them, do not abort the operation, but continue adding the
 	others. The command shall still exit with non-zero status.
 
+--ignore-unmatch::
+	Exit with a zero status even if no files matched.
+
 \--::
 	This option can be used to separate command-line options from
 	the list of files, (useful when filenames might be mistaken
-- 
1.6.3.3

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

* [PATCH 4/5] implement error_errno and warning_errno
  2009-08-13  3:20     ` [PATCH 3/5] Document --ignore-unmatch in git-add.txt Luke Dashjr
@ 2009-08-13  3:20       ` Luke Dashjr
  2009-08-13  3:20         ` [PATCH 5/5] Convert add_file_to_index's lstat failure from a die to an error Luke Dashjr
  0 siblings, 1 reply; 21+ messages in thread
From: Luke Dashjr @ 2009-08-13  3:20 UTC (permalink / raw)
  To: git; +Cc: Luke Dashjr

This allows for easier conversion of code that currently does a (fatal)
die_errno to a safer error (which can be ignored), or perhaps even warning
status.

Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
---
 git-compat-util.h |    2 +
 usage.c           |   66 ++++++++++++++++++++++++-----------------------------
 2 files changed, 32 insertions(+), 36 deletions(-)

diff --git a/git-compat-util.h b/git-compat-util.h
index 9f941e4..25d4c1e 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -181,7 +181,9 @@ extern void usage(const char *err) NORETURN;
 extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
 extern void die_errno(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
 extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
+extern int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
+extern void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 
 extern void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN);
 
diff --git a/usage.c b/usage.c
index b6aea45..dce90dc 100644
--- a/usage.c
+++ b/usage.c
@@ -39,7 +39,7 @@ static void warn_builtin(const char *warn, va_list params)
 static void (*usage_routine)(const char *err) NORETURN = usage_builtin;
 static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
 static void (*error_routine)(const char *err, va_list params) = error_builtin;
-static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
+static void (*warning_routine)(const char *err, va_list params) = warn_builtin;
 
 void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
 {
@@ -51,19 +51,8 @@ void usage(const char *err)
 	usage_routine(err);
 }
 
-void die(const char *err, ...)
+static void _e_errno(const char *fmt, char *fmt_with_err, size_t sizeof_fmt_with_err)
 {
-	va_list params;
-
-	va_start(params, err);
-	die_routine(err, params);
-	va_end(params);
-}
-
-void die_errno(const char *fmt, ...)
-{
-	va_list params;
-	char fmt_with_err[1024];
 	char str_error[256], *err;
 	int i, j;
 
@@ -81,28 +70,33 @@ void die_errno(const char *fmt, ...)
 		}
 	}
 	str_error[j] = 0;
-	snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, str_error);
-
-	va_start(params, fmt);
-	die_routine(fmt_with_err, params);
-	va_end(params);
-}
-
-int error(const char *err, ...)
-{
-	va_list params;
-
-	va_start(params, err);
-	error_routine(err, params);
-	va_end(params);
-	return -1;
+	snprintf(fmt_with_err, sizeof_fmt_with_err, "%s: %s", fmt, str_error);
 }
 
-void warning(const char *warn, ...)
-{
-	va_list params;
-
-	va_start(params, warn);
-	warn_routine(warn, params);
-	va_end(params);
-}
+#define BUILD_E(RTYPE, NAME, CODE)  \
+RTYPE NAME(const char *err, ...)  \
+{  \
+	va_list params;  \
+  \
+	va_start(params, err);  \
+	NAME ## _routine(err, params);  \
+	va_end(params);  \
+	CODE  \
+}  \
+  \
+RTYPE NAME ## _errno(const char *fmt, ...)  \
+{  \
+	va_list params;  \
+	static char fmt_with_err[1024];  \
+  \
+	va_start(params, fmt);  \
+	_e_errno(fmt, fmt_with_err, sizeof(fmt_with_err));  \
+	NAME ## _routine(fmt_with_err, params);  \
+	va_end(params);  \
+	CODE  \
+}  \
+// END OF BUILD_E MACRO
+
+BUILD_E(void, die, )
+BUILD_E(int, error, return -1;)
+BUILD_E(void, warning, )
-- 
1.6.3.3

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

* [PATCH 5/5] Convert add_file_to_index's lstat failure from a die to an error
  2009-08-13  3:20       ` [PATCH 4/5] implement error_errno and warning_errno Luke Dashjr
@ 2009-08-13  3:20         ` Luke Dashjr
  0 siblings, 0 replies; 21+ messages in thread
From: Luke Dashjr @ 2009-08-13  3:20 UTC (permalink / raw)
  To: git; +Cc: Luke Dashjr

In order to make --ignore-errors able to ignore a lstat failure in
add_file_to_index, it needs to raise an error, NOT a fatal die.

Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
---
 read-cache.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/read-cache.c b/read-cache.c
index 4e3e272..074e6b8 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -638,7 +638,7 @@ int add_file_to_index(struct index_state *istate, const char *path, int flags)
 {
 	struct stat st;
 	if (lstat(path, &st))
-		die_errno("unable to stat '%s'", path);
+		return error_errno("unable to stat '%s'", path);
 	return add_to_index(istate, path, &st, flags);
 }
 
-- 
1.6.3.3

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-13  3:20 ` [PATCH 1/5] port --ignore-unmatch to "git add" Luke Dashjr
  2009-08-13  3:20   ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Luke Dashjr
@ 2009-08-13 19:36   ` Junio C Hamano
  2009-08-13 20:40     ` Luke-Jr
  2009-08-13 21:06     ` Thomas Rast
  1 sibling, 2 replies; 21+ messages in thread
From: Junio C Hamano @ 2009-08-13 19:36 UTC (permalink / raw)
  To: Luke Dashjr; +Cc: git

Luke Dashjr <luke-jr+git@utopios.org> writes:

> "git rm" has a --ignore-unmatch option that is also applicable to "git add"
> and may be useful for persons wanting to ignore unmatched arguments, but not
> all errors.
>
> Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>

Chould you refresh my memory a bit?

In what circumstance is "rm --ignore-unmatch" useful to begin with?
A similar question for "add --ignore-unmatch".

Now the obligatory design level question is behind us, let's take a brief
look at the codde.

> +static int ignore_unmatch = 0;

Drop " = 0" and let the language initialize this to zero.

>  static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
>  {
> @@ -63,7 +64,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
>  	fill_pathspec_matches(pathspec, seen, specs);
>  
>  	for (i = 0; i < specs; i++) {
> -		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]))
> +		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]) && !ignore_unmatch)
>  			die("pathspec '%s' did not match any files",
>  					pathspec[i]);
>  	}
> @@ -108,7 +109,7 @@ static void refresh(int verbose, const char **pathspec)
>  	refresh_index(&the_index, verbose ? REFRESH_SAY_CHANGED : REFRESH_QUIET,
>  		      pathspec, seen);
>  	for (i = 0; i < specs; i++) {
> -		if (!seen[i])
> +		if (!seen[i] && !ignore_unmatch)
>  			die("pathspec '%s' did not match any files", pathspec[i]);
>  	}
>          free(seen);

What's the point of these two loops if under ignore_unmatch everything
becomes no-op?

That is, wouldn't it be much more clear if you wrote like this?

 builtin-add.c |   25 ++++++++++++++++++-------
 1 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 581a2a1..49576b4 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -41,16 +41,25 @@ static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
 	}
 }
 
+static char *alloc_seen(const char **pathspec, int *specs_)
+{
+	int specs;
+
+	if (ignore_unmatch)
+		return NULL;
+	for (specs = 0; pathspec[specs];  specs++)
+		; /* nothing */
+	*specs_ = specs;
+	return xcalloc(specs, 1);
+}
+
 static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
 {
 	char *seen;
 	int i, specs;
 	struct dir_entry **src, **dst;
 
-	for (specs = 0; pathspec[specs];  specs++)
-		/* nothing */;
-	seen = xcalloc(specs, 1);
-
+	seen = alloc_seen(pathspec, &specs);
 	src = dst = dir->entries;
 	i = dir->nr;
 	while (--i >= 0) {
@@ -60,6 +69,8 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
 			*dst++ = entry;
 	}
 	dir->nr = dst - dir->entries;
+	if (!seen)
+		return;
 	fill_pathspec_matches(pathspec, seen, specs);
 
 	for (i = 0; i < specs; i++) {
@@ -102,11 +113,11 @@ static void refresh(int verbose, const char **pathspec)
 	char *seen;
 	int i, specs;
 
-	for (specs = 0; pathspec[specs];  specs++)
-		/* nothing */;
-	seen = xcalloc(specs, 1);
+	seen = alloc_seen(pathspec, &specs);
 	refresh_index(&the_index, verbose ? REFRESH_SAY_CHANGED : REFRESH_QUIET,
 		      pathspec, seen);
+	if (!seen)
+		return;
 	for (i = 0; i < specs; i++) {
 		if (!seen[i])
 			die("pathspec '%s' did not match any files", pathspec[i]);

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

* Re: [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors
  2009-08-13  3:20   ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Luke Dashjr
  2009-08-13  3:20     ` [PATCH 3/5] Document --ignore-unmatch in git-add.txt Luke Dashjr
@ 2009-08-13 19:38     ` Junio C Hamano
  2009-08-13 20:42       ` Luke-Jr
                         ` (2 more replies)
  1 sibling, 3 replies; 21+ messages in thread
From: Junio C Hamano @ 2009-08-13 19:38 UTC (permalink / raw)
  To: Luke Dashjr; +Cc: git

Luke Dashjr <luke-jr+git@utopios.org> writes:

> Unmatched files are errors, and should be ignored with the rest of them.

Why is this a "fix"?

I would understand if it were "Make --ignore-errors imply --ignore-unmatch
unconditionally".  But then I do not think I would necessarily agree it is
a good change.

The user may know that some files in the work tree are unreadable and
cannot be indexed (hence he gives --ignore-errors) but he still may want
to catch a typo on the command line.

I do not think it is wise to make --ignore-errors imply --ignore-unmatch
unconditionally like this patch does without any escape hatch.

> Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
> ---
>  builtin-add.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/builtin-add.c b/builtin-add.c
> index 0597fb9..e3132c8 100644
> --- a/builtin-add.c
> +++ b/builtin-add.c
> @@ -280,6 +280,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
>  		add_interactive = 1;
>  	if (add_interactive)
>  		exit(interactive_add(argc - 1, argv + 1, prefix));
> +	if (ignore_add_errors)
> +		ignore_unmatch = 1;
>  
>  	if (edit_interactive)
>  		return(edit_patch(argc, argv, prefix));
> -- 
> 1.6.3.3

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-13 19:36   ` [PATCH 1/5] port --ignore-unmatch to "git add" Junio C Hamano
@ 2009-08-13 20:40     ` Luke-Jr
  2009-08-13 21:51       ` Alex Riesen
  2009-08-13 21:06     ` Thomas Rast
  1 sibling, 1 reply; 21+ messages in thread
From: Luke-Jr @ 2009-08-13 20:40 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Luke Dashjr, git

On Thursday 13 August 2009 02:36:13 pm Junio C Hamano wrote:
> Luke Dashjr <luke-jr+git@utopios.org> writes:
> > "git rm" has a --ignore-unmatch option that is also applicable to "git
> > add" and may be useful for persons wanting to ignore unmatched arguments,
> > but not all errors.
>
> Chould you refresh my memory a bit?
>
> In what circumstance is "rm --ignore-unmatch" useful to begin with?
> A similar question for "add --ignore-unmatch".

Not sure on its purpose for "rm", but for "add"...
Avoiding a race condition in automation. In particular, if the file is deleted 
between the time the argument list is built until git scans for matches.

> Now the obligatory design level question is behind us, let's take a brief
> look at the codde.
>
> > +static int ignore_unmatch = 0;
>
> Drop " = 0" and let the language initialize this to zero.

Does C define a default initialisation of zero? My understanding was that 
uninitialised variables are always undefined until explicitly assigned a 
value.

> >  static void fill_pathspec_matches(const char **pathspec, char *seen, int
> > specs) {
> > @@ -63,7 +64,7 @@ static void prune_directory(struct dir_struct *dir,
> > const char **pathspec, int p fill_pathspec_matches(pathspec, seen,
> > specs);
> >
> >  	for (i = 0; i < specs; i++) {
> > -		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]))
> > +		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]) &&
> > !ignore_unmatch) die("pathspec '%s' did not match any files",
> >  					pathspec[i]);
> >  	}
> > @@ -108,7 +109,7 @@ static void refresh(int verbose, const char
> > **pathspec) refresh_index(&the_index, verbose ? REFRESH_SAY_CHANGED :
> > REFRESH_QUIET, pathspec, seen);
> >  	for (i = 0; i < specs; i++) {
> > -		if (!seen[i])
> > +		if (!seen[i] && !ignore_unmatch)
> >  			die("pathspec '%s' did not match any files", pathspec[i]);
> >  	}
> >          free(seen);
>
> What's the point of these two loops if under ignore_unmatch everything
> becomes no-op?
>
> That is, wouldn't it be much more clear if you wrote like this?

I'm not overly familiar with the git codebase, but wouldn't a null 'seen' 
variable break the refresh_index call? The loops themselves can be avoided, I 
suppose. I'll submit a new patch to optimise the changes (and rebase)...

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

* Re: [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors
  2009-08-13 19:38     ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Junio C Hamano
@ 2009-08-13 20:42       ` Luke-Jr
  2009-08-13 21:02       ` [PATCH] port --ignore-unmatch to "git add" Luke Dashjr
  2009-08-13 21:03       ` [PATCH] Document --ignore-unmatch in git-add.txt Luke Dashjr
  2 siblings, 0 replies; 21+ messages in thread
From: Luke-Jr @ 2009-08-13 20:42 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Luke Dashjr, git

On Thursday 13 August 2009 02:38:57 pm Junio C Hamano wrote:
> Luke Dashjr <luke-jr+git@utopios.org> writes:
> > Unmatched files are errors, and should be ignored with the rest of them.
>
> Why is this a "fix"?
>
> I would understand if it were "Make --ignore-errors imply --ignore-unmatch
> unconditionally".  But then I do not think I would necessarily agree it is
> a good change.
>
> The user may know that some files in the work tree are unreadable and
> cannot be indexed (hence he gives --ignore-errors) but he still may want
> to catch a typo on the command line.
>
> I do not think it is wise to make --ignore-errors imply --ignore-unmatch
> unconditionally like this patch does without any escape hatch.

Are unmatched files not errors? Perhaps the old flag should be renamed to
--ignore-read-errors and a new --ignore-errors that implies both added. Or 
maybe just a documentation change to preserve compatibility with anything that 
might assume that...

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

* [PATCH] port --ignore-unmatch to "git add"
  2009-08-13 19:38     ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Junio C Hamano
  2009-08-13 20:42       ` Luke-Jr
@ 2009-08-13 21:02       ` Luke Dashjr
  2009-08-13 21:03       ` [PATCH] Document --ignore-unmatch in git-add.txt Luke Dashjr
  2 siblings, 0 replies; 21+ messages in thread
From: Luke Dashjr @ 2009-08-13 21:02 UTC (permalink / raw)
  To: git; +Cc: Luke Dashjr

"git rm" has a --ignore-unmatch option that is also applicable to "git add"
and may be useful for persons wanting to ignore unmatched arguments, but not
all errors.

Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
---
 builtin-add.c |   27 +++++++++++++++++++--------
 1 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 581a2a1..3882482 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -19,6 +19,7 @@ static const char * const builtin_add_usage[] = {
 };
 static int patch_interactive, add_interactive, edit_interactive;
 static int take_worktree_changes;
+static int ignore_unmatch = 0;
 
 static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
 {
@@ -60,13 +61,18 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
 			*dst++ = entry;
 	}
 	dir->nr = dst - dir->entries;
-	fill_pathspec_matches(pathspec, seen, specs);
 
-	for (i = 0; i < specs; i++) {
-		if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]))
-			die("pathspec '%s' did not match any files",
-					pathspec[i]);
+	if (!ignore_unmatch)
+	{
+		fill_pathspec_matches(pathspec, seen, specs);
+
+		for (i = 0; i < specs; i++) {
+			if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]))
+				die("pathspec '%s' did not match any files",
+						pathspec[i]);
+		}
 	}
+
         free(seen);
 }
 
@@ -107,9 +113,12 @@ static void refresh(int verbose, const char **pathspec)
 	seen = xcalloc(specs, 1);
 	refresh_index(&the_index, verbose ? REFRESH_SAY_CHANGED : REFRESH_QUIET,
 		      pathspec, seen);
-	for (i = 0; i < specs; i++) {
-		if (!seen[i])
-			die("pathspec '%s' did not match any files", pathspec[i]);
+	if (!ignore_unmatch)
+	{
+		for (i = 0; i < specs; i++) {
+			if (!seen[i])
+				die("pathspec '%s' did not match any files", pathspec[i]);
+		}
 	}
         free(seen);
 }
@@ -226,6 +235,8 @@ static struct option builtin_add_options[] = {
 	OPT_BOOLEAN('A', "all", &addremove, "add all, noticing removal of 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_BOOLEAN( 0 , "ignore-unmatch", &ignore_unmatch,
+				"exit with a zero status even if nothing matched"),
 	OPT_END(),
 };
 
-- 
1.6.3.3

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

* [PATCH] Document --ignore-unmatch in git-add.txt
  2009-08-13 19:38     ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Junio C Hamano
  2009-08-13 20:42       ` Luke-Jr
  2009-08-13 21:02       ` [PATCH] port --ignore-unmatch to "git add" Luke Dashjr
@ 2009-08-13 21:03       ` Luke Dashjr
  2 siblings, 0 replies; 21+ messages in thread
From: Luke Dashjr @ 2009-08-13 21:03 UTC (permalink / raw)
  To: git; +Cc: Luke Dashjr

Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
---
 Documentation/git-add.txt |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index e67b7e8..6e30ee9 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -10,7 +10,8 @@ SYNOPSIS
 [verse]
 'git add' [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]
 	  [--edit | -e] [--all | [--update | -u]] [--intent-to-add | -N]
-	  [--refresh] [--ignore-errors] [--] [<filepattern>...]
+	  [--refresh] [--ignore-errors] [--ignore-unmatch] [--]
+	  [<filepattern>...]
 
 DESCRIPTION
 -----------
@@ -119,6 +120,9 @@ apply.
 	them, do not abort the operation, but continue adding the
 	others. The command shall still exit with non-zero status.
 
+--ignore-unmatch::
+	Exit with a zero status even if no files matched.
+
 \--::
 	This option can be used to separate command-line options from
 	the list of files, (useful when filenames might be mistaken
-- 
1.6.3.3

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-13 19:36   ` [PATCH 1/5] port --ignore-unmatch to "git add" Junio C Hamano
  2009-08-13 20:40     ` Luke-Jr
@ 2009-08-13 21:06     ` Thomas Rast
  2009-08-14 19:52       ` Junio C Hamano
  1 sibling, 1 reply; 21+ messages in thread
From: Thomas Rast @ 2009-08-13 21:06 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Luke Dashjr, git

Junio C Hamano wrote:
> 
> Chould you refresh my memory a bit?
> 
> In what circumstance is "rm --ignore-unmatch" useful to begin with?

Not sure about add --ignore-unmatch myself, but there's even an
example of rm --ignore-unmatch in man git-filter-branch, along the
lines of

  git filter-branch --index-filter '
    rm --ignore-unmach some_file_that_shouldnt_be_in_history
  ' -- --all

-- 
Thomas Rast
trast@{inf,student}.ethz.ch

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-13 20:40     ` Luke-Jr
@ 2009-08-13 21:51       ` Alex Riesen
  0 siblings, 0 replies; 21+ messages in thread
From: Alex Riesen @ 2009-08-13 21:51 UTC (permalink / raw)
  To: Luke-Jr; +Cc: Junio C Hamano, Luke Dashjr, git

On Thu, Aug 13, 2009 at 22:40, Luke-Jr<luke@dashjr.org> wrote:
> On Thursday 13 August 2009 02:36:13 pm Junio C Hamano wrote:
>> Now the obligatory design level question is behind us, let's take a brief
>> look at the codde.
>>
>> > +static int ignore_unmatch = 0;
>>
>> Drop " = 0" and let the language initialize this to zero.
>
> Does C define a default initialisation of zero? My understanding was that
> uninitialised variables are always undefined until explicitly assigned a
> value.

Yes. For statics.

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-13 21:06     ` Thomas Rast
@ 2009-08-14 19:52       ` Junio C Hamano
  2009-08-14 20:39         ` Luke-Jr
  0 siblings, 1 reply; 21+ messages in thread
From: Junio C Hamano @ 2009-08-14 19:52 UTC (permalink / raw)
  To: Thomas Rast; +Cc: Luke Dashjr, git

Thomas Rast <trast@student.ethz.ch> writes:

> Junio C Hamano wrote:
>> 
>> Chould you refresh my memory a bit?
>> 
>> In what circumstance is "rm --ignore-unmatch" useful to begin with?
>
> Not sure about add --ignore-unmatch myself, but there's even an
> example of rm --ignore-unmatch in man git-filter-branch, along the
> lines of
>
>   git filter-branch --index-filter '
>     rm --ignore-unmach some_file_that_shouldnt_be_in_history
>   ' -- --all

Ah, that makes sense.  I am not sure about "add --ignore-unmatch" myself
either, and an example similar to the above filter-branch would not apply
very easily (i.e. "add a file that should have been in history" would not
need --ignore-unmatch).

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-14 19:52       ` Junio C Hamano
@ 2009-08-14 20:39         ` Luke-Jr
  2009-08-14 20:47           ` Luke-Jr
  2009-08-14 21:39           ` Nanako Shiraishi
  0 siblings, 2 replies; 21+ messages in thread
From: Luke-Jr @ 2009-08-14 20:39 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Thomas Rast, Luke Dashjr, git

On Friday 14 August 2009 02:52:33 pm Junio C Hamano wrote:
> Thomas Rast <trast@student.ethz.ch> writes:
> > Junio C Hamano wrote:
> >> Chould you refresh my memory a bit?
> >>
> >> In what circumstance is "rm --ignore-unmatch" useful to begin with?
> >
> > Not sure about add --ignore-unmatch myself, but there's even an
> > example of rm --ignore-unmatch in man git-filter-branch, along the
> > lines of
> >
> >   git filter-branch --index-filter '
> >     rm --ignore-unmach some_file_that_shouldnt_be_in_history
> >   ' -- --all
>
> Ah, that makes sense.  I am not sure about "add --ignore-unmatch" myself
> either, and an example similar to the above filter-branch would not apply
> very easily (i.e. "add a file that should have been in history" would not
> need --ignore-unmatch).

The purpose of "add --ignore-unmatch" is to ignore race conditions where one 
of the files to be added has been deleted after git is executed, but before 
git scans it.

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-14 20:39         ` Luke-Jr
@ 2009-08-14 20:47           ` Luke-Jr
  2009-08-14 21:39           ` Nanako Shiraishi
  1 sibling, 0 replies; 21+ messages in thread
From: Luke-Jr @ 2009-08-14 20:47 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Thomas Rast, Luke Dashjr, git

Specific use-case of "git add --ignore-unmatched":
	http://gitorious.org/gitbackup

Without this functionality, daily race conditions will break the 
synchronisation.

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-14 20:39         ` Luke-Jr
  2009-08-14 20:47           ` Luke-Jr
@ 2009-08-14 21:39           ` Nanako Shiraishi
  2009-08-14 22:54             ` Luke-Jr
  1 sibling, 1 reply; 21+ messages in thread
From: Nanako Shiraishi @ 2009-08-14 21:39 UTC (permalink / raw)
  To: Luke-Jr; +Cc: Junio C Hamano, Thomas Rast, Luke Dashjr, git

Quoting "Luke-Jr" <luke@dashjr.org>

> On Friday 14 August 2009 02:52:33 pm Junio C Hamano wrote:
>> Thomas Rast <trast@student.ethz.ch> writes:
>> > Junio C Hamano wrote:
>> >> Chould you refresh my memory a bit?
>> >>
>> >> In what circumstance is "rm --ignore-unmatch" useful to begin with?
>> >
>> > Not sure about add --ignore-unmatch myself, but there's even an
>> > example of rm --ignore-unmatch in man git-filter-branch, along the
>> > lines of
>> >
>> >   git filter-branch --index-filter '
>> >     rm --ignore-unmach some_file_that_shouldnt_be_in_history
>> >   ' -- --all
>>
>> Ah, that makes sense.  I am not sure about "add --ignore-unmatch" myself
>> either, and an example similar to the above filter-branch would not apply
>> very easily (i.e. "add a file that should have been in history" would not
>> need --ignore-unmatch).
>
> The purpose of "add --ignore-unmatch" is to ignore race conditions where one 
> of the files to be added has been deleted after git is executed, but before 
> git scans it.

First of all, it should have been mentioned as part of your proposed commit log message.

Second of all, if a race condition makes an "add" fail, isn't it a good thing? If your "add" ignored such a failure, you'd be recording an inconsistent or incomplete state.

IMHO, fixing your racy script is a much cleaner solution to your problem than forcing "git add" to ignore errors.

-- 
Nanako Shiraishi
http://ivory.ap.teacup.com/nanako3/

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-14 21:39           ` Nanako Shiraishi
@ 2009-08-14 22:54             ` Luke-Jr
  2009-10-10 17:23               ` Luke-Jr
  0 siblings, 1 reply; 21+ messages in thread
From: Luke-Jr @ 2009-08-14 22:54 UTC (permalink / raw)
  To: Nanako Shiraishi; +Cc: Junio C Hamano, Thomas Rast, Luke Dashjr, git

On Friday 14 August 2009 04:39:58 pm Nanako Shiraishi wrote:
> Second of all, if a race condition makes an "add" fail, isn't it a good
> thing? If your "add" ignored such a failure, you'd be recording an
> inconsistent or incomplete state.

If the file doesn't exist, it is no longer in the current state.

> IMHO, fixing your racy script is a much cleaner solution to your problem
> than forcing "git add" to ignore errors.

In this situation, the race condition is not a bug, it is normal operation.

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

* Re: [PATCH 1/5] port --ignore-unmatch to "git add"
  2009-08-14 22:54             ` Luke-Jr
@ 2009-10-10 17:23               ` Luke-Jr
  0 siblings, 0 replies; 21+ messages in thread
From: Luke-Jr @ 2009-10-10 17:23 UTC (permalink / raw)
  To: Nanako Shiraishi; +Cc: Junio C Hamano, Thomas Rast, Luke Dashjr, git

Just for reference, since these fixes+functions have not yet been merged to 
mainline Git, I have pushed a fork with them rebased on up-to-date tags:
	http://repo.or.cz/w/git/ljr.git

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

end of thread, other threads:[~2009-10-10 17:38 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-12 22:26 For review: git add --ignore-unmatch Luke-Jr
2009-08-12 22:57 ` Thomas Rast
2009-08-13  3:20 ` [PATCH 1/5] port --ignore-unmatch to "git add" Luke Dashjr
2009-08-13  3:20   ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Luke Dashjr
2009-08-13  3:20     ` [PATCH 3/5] Document --ignore-unmatch in git-add.txt Luke Dashjr
2009-08-13  3:20       ` [PATCH 4/5] implement error_errno and warning_errno Luke Dashjr
2009-08-13  3:20         ` [PATCH 5/5] Convert add_file_to_index's lstat failure from a die to an error Luke Dashjr
2009-08-13 19:38     ` [PATCH 2/5] fix "git add --ignore-errors" to ignore pathspec errors Junio C Hamano
2009-08-13 20:42       ` Luke-Jr
2009-08-13 21:02       ` [PATCH] port --ignore-unmatch to "git add" Luke Dashjr
2009-08-13 21:03       ` [PATCH] Document --ignore-unmatch in git-add.txt Luke Dashjr
2009-08-13 19:36   ` [PATCH 1/5] port --ignore-unmatch to "git add" Junio C Hamano
2009-08-13 20:40     ` Luke-Jr
2009-08-13 21:51       ` Alex Riesen
2009-08-13 21:06     ` Thomas Rast
2009-08-14 19:52       ` Junio C Hamano
2009-08-14 20:39         ` Luke-Jr
2009-08-14 20:47           ` Luke-Jr
2009-08-14 21:39           ` Nanako Shiraishi
2009-08-14 22:54             ` Luke-Jr
2009-10-10 17:23               ` Luke-Jr

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).