status/commit: show staged submodules regardless of ignore config
[gitweb.git] / archive.c
index 466640479ecb332d8d06f6f26254023eb6e22c85..346f3b2f1ab0d522638475b729274d992d5b82d5 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -120,6 +120,8 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
        strbuf_add(&path, args->base, args->baselen);
        strbuf_add(&path, base, baselen);
        strbuf_addstr(&path, filename);
+       if (S_ISDIR(mode) || S_ISGITLINK(mode))
+               strbuf_addch(&path, '/');
        path_without_prefix = path.buf + args->baselen;
 
        setup_archive_check(check);
@@ -130,7 +132,6 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
        }
 
        if (S_ISDIR(mode) || S_ISGITLINK(mode)) {
-               strbuf_addch(&path, '/');
                if (args->verbose)
                        fprintf(stderr, "%.*s\n", (int)path.len, path.buf);
                err = write_entry(args, sha1, path.buf, path.len, mode);
@@ -150,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] == '/') {
@@ -185,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;
@@ -221,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;
@@ -230,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 (!path_exists(ar_args->tree, *pathspec))
-                               die("path not found: %s", *pathspec);
+                       if (**pathspec && !path_exists(ar_args->tree, *pathspec))
+                               die(_("pathspec '%s' did not match any files"), *pathspec);
                        pathspec++;
                }
        }
@@ -435,7 +440,7 @@ static int match_extension(const char *filename, const char *ext)
         * prefix is non-empty (k.e., we don't match .tar.gz with no actual
         * filename).
         */
-       if (prefixlen < 2 || filename[prefixlen-1] != '.')
+       if (prefixlen < 2 || filename[prefixlen - 1] != '.')
                return 0;
        return !strcmp(filename + prefixlen, ext);
 }