Git archive and trailing "/" in prefix
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>maint
parent
1cd749cc07
commit
ebfbdb340a
|
@ -115,6 +115,7 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
|
||||||
|
|
||||||
strbuf_reset(&path);
|
strbuf_reset(&path);
|
||||||
strbuf_grow(&path, PATH_MAX);
|
strbuf_grow(&path, PATH_MAX);
|
||||||
|
strbuf_add(&path, args->base, args->baselen);
|
||||||
strbuf_add(&path, base, baselen);
|
strbuf_add(&path, base, baselen);
|
||||||
strbuf_addstr(&path, filename);
|
strbuf_addstr(&path, filename);
|
||||||
path_without_prefix = path.buf + args->baselen;
|
path_without_prefix = path.buf + args->baselen;
|
||||||
|
@ -187,8 +188,8 @@ int write_archive_entries(struct archiver_args *args,
|
||||||
git_attr_set_direction(GIT_ATTR_INDEX, &the_index);
|
git_attr_set_direction(GIT_ATTR_INDEX, &the_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = read_tree_recursive(args->tree, args->base, args->baselen, 0,
|
err = read_tree_recursive(args->tree, "", 0, 0, args->pathspec,
|
||||||
args->pathspec, write_archive_entry, &context);
|
write_archive_entry, &context);
|
||||||
if (err == READ_TREE_RECURSIVE)
|
if (err == READ_TREE_RECURSIVE)
|
||||||
err = 0;
|
err = 0;
|
||||||
return err;
|
return err;
|
||||||
|
@ -211,7 +212,7 @@ static const struct archiver *lookup_archiver(const char *name)
|
||||||
static void parse_pathspec_arg(const char **pathspec,
|
static void parse_pathspec_arg(const char **pathspec,
|
||||||
struct archiver_args *ar_args)
|
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,
|
static void parse_treeish_arg(const char **argv,
|
||||||
|
|
|
@ -230,4 +230,16 @@ test_expect_success \
|
||||||
'git archive --list outside of a git repo' \
|
'git archive --list outside of a git repo' \
|
||||||
'GIT_DIR=some/non-existing/directory git archive --list'
|
'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
|
test_done
|
||||||
|
|
Loading…
Reference in New Issue