Skip to content

Commit

Permalink
Git archive and trailing "/" in prefix
Browse files Browse the repository at this point in the history
With --prefix=string that does not end with a slash, the top-level entries
are written out with the specified prefix as expected, but no paths in the
directories are added.

Fix this by adding the prefix in write_archive_entry() instead of letting
get_pathspec() and read_tree_recursive() pair; they are designed to only
handle prefixes that are path components.

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 Oct 9, 2009
1 parent 1cd749c commit ebfbdb3
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
7 changes: 4 additions & 3 deletions archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,

strbuf_reset(&path);
strbuf_grow(&path, PATH_MAX);
strbuf_add(&path, args->base, args->baselen);
strbuf_add(&path, base, baselen);
strbuf_addstr(&path, filename);
path_without_prefix = path.buf + args->baselen;
Expand Down Expand Up @@ -187,8 +188,8 @@ int write_archive_entries(struct archiver_args *args,
git_attr_set_direction(GIT_ATTR_INDEX, &the_index);
}

err = read_tree_recursive(args->tree, args->base, args->baselen, 0,
args->pathspec, write_archive_entry, &context);
err = read_tree_recursive(args->tree, "", 0, 0, args->pathspec,
write_archive_entry, &context);
if (err == READ_TREE_RECURSIVE)
err = 0;
return err;
Expand All @@ -211,7 +212,7 @@ static const struct archiver *lookup_archiver(const char *name)
static void parse_pathspec_arg(const char **pathspec,
struct archiver_args *ar_args)
{
ar_args->pathspec = get_pathspec(ar_args->base, pathspec);
ar_args->pathspec = get_pathspec("", pathspec);
}

static void parse_treeish_arg(const char **argv,
Expand Down
12 changes: 12 additions & 0 deletions t/t5000-tar-tree.sh
Original file line number Diff line number Diff line change
Expand Up @@ -230,4 +230,16 @@ test_expect_success \
'git archive --list outside of a git repo' \
'GIT_DIR=some/non-existing/directory git archive --list'

test_expect_success 'git-archive --prefix=olde-' '
git archive --prefix=olde- >h.tar HEAD &&
(
mkdir h &&
cd h &&
"$TAR" xf - <../h.tar
) &&
test -d h/olde-a &&
test -d h/olde-a/bin &&
test -f h/olde-a/bin/sh
'

test_done

0 comments on commit ebfbdb3

Please sign in to comment.