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