[PATCH] Remove duplicate pathspecs from ls-files command line
- From
Alex Riesen <raa.lkml@gmail.com>
- Date
- Aug 29, 2007, 19:44 UTC
- Message-ID
- <20070829194410.GA11824@steel.home>
- In-Reply-To
- <20070829081122.GA604@piper.oerlikon.madduck.net>
The first entry wins, all the subsequent entries will be discarded.
Signed-off-by: Alex Riesen <raa.lkml@gmail.com> ---
martin f krafft, Wed, Aug 29, 2007 10:11:22 +0200:
Show 12 quoted lines
> when using git-add from a script, the following fails: > > $ git commit -m. foo foo > error: pathspec 'foo' did not match any file(s) known to git. > Did you forget to 'git add'? > > I am bringing this up in the context of > http://bugs.debian.org/439992, where debcommit.pl would duplicate > a file argument under certain conditions. It's since been fixed, but > I wonder whether git-commit could be made more robust in the > presence of duplicate arguments? Or is this behaviour by choice? >
Don't think so. Looks like accident. The patch below fixes it, by introducing a costly argument duplication check. Shouldn't be a problem for a normal use (git-ls-files expects globs, not pathnames).
setup.c | 21 +++++++++++++++++---- 1 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/setup.c b/setup.c index 06004f1..b13b628 100644 --- a/setup.c +++ b/setup.c @@ -111,10 +111,19 @@ void verify_non_filename(const char *prefix, const char *arg) die("'%s': %s", arg, strerror(errno)); } +static const char **has_pathspec(const char **start, const char **end, const char *spec) +{ + const char **p; + for (p = start; p != end; ++p) + if (!strcmp(*p, spec)) + return p; + return NULL; +} + const char **get_pathspec(const char *prefix, const char **pathspec) { const char *entry = *pathspec; - const char **p; + const char **in, **out; int prefixlen; if (!prefix && !entry) @@ -128,11 +137,15 @@ const char **get_pathspec(const char *prefix, const char **pathspec) } /* Otherwise we have to re-write the entries.. */ - p = pathspec; + in = out = pathspec; prefixlen = prefix ? strlen(prefix) : 0; do { - *p = prefix_path(prefix, prefixlen, entry); - } while ((entry = *++p) != NULL); + const char *spec = prefix_path(prefix, prefixlen, entry); + if (!has_pathspec(pathspec, out, spec)) + *out++ = spec; + } while ((entry = *++in) != NULL); + if (in != out) + *out = NULL; return (const char **) pathspec; }
-- 1.5.3.rc7.24.g0e57