diff options
author | Junio C Hamano <gitster@pobox.com> | 2015-03-24 22:12:10 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-03-24 22:12:10 +0100 |
commit | 777c55a61615837d4391facd75cf334b96635801 (patch) | |
tree | 5c5a3afc4249a24acbb6ea76cb72e53057ce6954 /dir.c | |
parent | Merge branch 'maint-1.9' into maint-2.0 (diff) | |
download | git-777c55a61615837d4391facd75cf334b96635801.tar.xz git-777c55a61615837d4391facd75cf334b96635801.zip |
report_path_error(): move to dir.c
The expected call sequence is for the caller to use match_pathspec()
repeatedly on a set of pathspecs, accumulating the "hits" in a
separate array, and then call this function to diagnose a pathspec
that never matched anything, as that can indicate a typo from the
command line, e.g. "git commit Maekfile".
Many builtin commands use this function from builtin/ls-files.c,
which is not a very healthy arrangement. ls-files might have been
the first command to feel the need for such a helper, but the need
is shared by everybody who uses the "match and then report" pattern.
Move it to dir.c where match_pathspec() is defined.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'dir.c')
-rw-r--r-- | dir.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -377,6 +377,49 @@ int match_pathspec(const struct pathspec *ps, return negative ? 0 : positive; } +int report_path_error(const char *ps_matched, + const struct pathspec *pathspec, + const char *prefix) +{ + /* + * Make sure all pathspec matched; otherwise it is an error. + */ + struct strbuf sb = STRBUF_INIT; + int num, errors = 0; + for (num = 0; num < pathspec->nr; num++) { + int other, found_dup; + + if (ps_matched[num]) + continue; + /* + * The caller might have fed identical pathspec + * twice. Do not barf on such a mistake. + * FIXME: parse_pathspec should have eliminated + * duplicate pathspec. + */ + for (found_dup = other = 0; + !found_dup && other < pathspec->nr; + other++) { + if (other == num || !ps_matched[other]) + continue; + if (!strcmp(pathspec->items[other].original, + pathspec->items[num].original)) + /* + * Ok, we have a match already. + */ + found_dup = 1; + } + if (found_dup) + continue; + + error("pathspec '%s' did not match any file(s) known to git.", + pathspec->items[num].original); + errors++; + } + strbuf_release(&sb); + return errors; +} + /* * Return the length of the "simple" part of a path match limiter. */ |