]> Pileus Git - ~andy/git/blobdiff - archive.c
archive: convert to use parse_pathspec
[~andy/git] / archive.c
index c699a2d5aa43bf90a1d90fc37acabb50a6e7d019..99fadc88d04ea077e5e5d6e6c065f7c54a4eddaf 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -5,7 +5,6 @@
 #include "archive.h"
 #include "parse-options.h"
 #include "unpack-trees.h"
-#include "pathspec.h"
 
 static char const * const archive_usage[] = {
        N_("git archive [options] <tree-ish> [<path>...]"),
@@ -152,7 +151,6 @@ int write_archive_entries(struct archiver_args *args,
        struct archiver_context context;
        struct unpack_trees_options opts;
        struct tree_desc t;
-       struct pathspec pathspec;
        int err;
 
        if (args->baselen > 0 && args->base[args->baselen - 1] == '/') {
@@ -187,10 +185,8 @@ int write_archive_entries(struct archiver_args *args,
                git_attr_set_direction(GIT_ATTR_INDEX, &the_index);
        }
 
-       init_pathspec(&pathspec, args->pathspec);
-       err = read_tree_recursive(args->tree, "", 0, 0, &pathspec,
+       err = read_tree_recursive(args->tree, "", 0, 0, &args->pathspec,
                                  write_archive_entry, &context);
-       free_pathspec(&pathspec);
        if (err == READ_TREE_RECURSIVE)
                err = 0;
        return err;
@@ -223,7 +219,7 @@ static int path_exists(struct tree *tree, const char *path)
        struct pathspec pathspec;
        int ret;
 
-       init_pathspec(&pathspec, paths);
+       parse_pathspec(&pathspec, 0, 0, "", paths);
        ret = read_tree_recursive(tree, "", 0, 0, &pathspec, reject_entry, NULL);
        free_pathspec(&pathspec);
        return ret != 0;
@@ -232,11 +228,18 @@ static int path_exists(struct tree *tree, const char *path)
 static void parse_pathspec_arg(const char **pathspec,
                struct archiver_args *ar_args)
 {
-       ar_args->pathspec = pathspec = get_pathspec("", pathspec);
+       /*
+        * must be consistent with parse_pathspec in path_exists()
+        * Also if pathspec patterns are dependent, we're in big
+        * trouble as we test each one separately
+        */
+       parse_pathspec(&ar_args->pathspec, 0,
+                      PATHSPEC_PREFER_FULL,
+                      "", pathspec);
        if (pathspec) {
                while (*pathspec) {
                        if (**pathspec && !path_exists(ar_args->tree, *pathspec))
-                               die("path not found: %s", *pathspec);
+                               die(_("pathspec '%s' did not match any files"), *pathspec);
                        pathspec++;
                }
        }