Skip to content

Commit

Permalink
archive: complain about path specs that don't match anything
Browse files Browse the repository at this point in the history
Verify that all path specs match at least one path in the specified
tree and reject those that don't.

This would have made the bug fixed by 782a000 easier to find.

This implementation is simple to the point of being stupid.  It walks
the full tree for each path spec until it matches something.  It's short
and seems to be fast enough, though.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed Dec 30, 2009
1 parent 902f235 commit d5f53d6
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,10 +211,33 @@ static const struct archiver *lookup_archiver(const char *name)
return NULL;
}

static int reject_entry(const unsigned char *sha1, const char *base,
int baselen, const char *filename, unsigned mode,
int stage, void *context)
{
return -1;
}

static int path_exists(struct tree *tree, const char *path)
{
const char *pathspec[] = { path, NULL };

if (read_tree_recursive(tree, "", 0, 0, pathspec, reject_entry, NULL))
return 1;
return 0;
}

static void parse_pathspec_arg(const char **pathspec,
struct archiver_args *ar_args)
{
ar_args->pathspec = get_pathspec("", pathspec);
ar_args->pathspec = pathspec = get_pathspec("", pathspec);
if (pathspec) {
while (*pathspec) {
if (!path_exists(ar_args->tree, *pathspec))
die("path not found: %s", *pathspec);
pathspec++;
}
}
}

static void parse_treeish_arg(const char **argv,
Expand Down

0 comments on commit d5f53d6

Please sign in to comment.