Skip to content

Commit

Permalink
report_path_error(): move to dir.c
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Mar 24, 2015
1 parent 282616c commit 777c55a
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 44 deletions.
43 changes: 0 additions & 43 deletions builtin/ls-files.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,49 +354,6 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix)
}
}

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;
}

static const char * const ls_files_usage[] = {
N_("git ls-files [options] [<file>...]"),
NULL
Expand Down
1 change: 0 additions & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -1411,7 +1411,6 @@ extern int ws_blank_line(const char *line, int len, unsigned ws_rule);
#define ws_tab_width(rule) ((rule) & WS_TAB_WIDTH_MASK)

/* ls-files */
int report_path_error(const char *ps_matched, const struct pathspec *pathspec, const char *prefix);
void overlay_tree_on_cache(const char *tree_name, const char *prefix);

char *alias_lookup(const char *alias);
Expand Down
43 changes: 43 additions & 0 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down
1 change: 1 addition & 0 deletions dir.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ extern char *common_prefix(const struct pathspec *pathspec);
extern int match_pathspec(const struct pathspec *pathspec,
const char *name, int namelen,
int prefix, char *seen, int is_dir);
extern int report_path_error(const char *ps_matched, const struct pathspec *pathspec, const char *prefix);
extern int within_depth(const char *name, int namelen, int depth, int max_depth);

extern int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec);
Expand Down

0 comments on commit 777c55a

Please sign in to comment.