Merge branch 'rs/archive-excluded-directory'
"git archive", especially when used with pathspec, stored an empty directory in its output, even though Git itself never does so. This has been fixed. * rs/archive-excluded-directory: archive: don't add empty directories to archives
This commit is contained in:
commit
62b1cb7b13
19
archive.c
19
archive.c
@ -121,11 +121,6 @@ static int check_attr_export_subst(const struct attr_check *check)
|
||||
return check && ATTR_TRUE(check->items[1].value);
|
||||
}
|
||||
|
||||
static int should_queue_directories(const struct archiver_args *args)
|
||||
{
|
||||
return args->pathspec.has_wildcard;
|
||||
}
|
||||
|
||||
static int write_archive_entry(const unsigned char *sha1, const char *base,
|
||||
int baselen, const char *filename, unsigned mode, int stage,
|
||||
void *context)
|
||||
@ -147,7 +142,7 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
|
||||
strbuf_addch(&path, '/');
|
||||
path_without_prefix = path.buf + args->baselen;
|
||||
|
||||
if (!S_ISDIR(mode) || !should_queue_directories(args)) {
|
||||
if (!S_ISDIR(mode)) {
|
||||
const struct attr_check *check;
|
||||
check = get_archive_attrs(path_without_prefix);
|
||||
if (check_attr_export_ignore(check))
|
||||
@ -169,14 +164,6 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
|
||||
return write_entry(args, sha1, path.buf, path.len, mode);
|
||||
}
|
||||
|
||||
static int write_archive_entry_buf(const unsigned char *sha1, struct strbuf *base,
|
||||
const char *filename, unsigned mode, int stage,
|
||||
void *context)
|
||||
{
|
||||
return write_archive_entry(sha1, base->buf, base->len,
|
||||
filename, mode, stage, context);
|
||||
}
|
||||
|
||||
static void queue_directory(const unsigned char *sha1,
|
||||
struct strbuf *base, const char *filename,
|
||||
unsigned mode, int stage, struct archiver_context *c)
|
||||
@ -290,9 +277,7 @@ int write_archive_entries(struct archiver_args *args,
|
||||
}
|
||||
|
||||
err = read_tree_recursive(args->tree, "", 0, 0, &args->pathspec,
|
||||
should_queue_directories(args) ?
|
||||
queue_or_write_archive_entry :
|
||||
write_archive_entry_buf,
|
||||
queue_or_write_archive_entry,
|
||||
&context);
|
||||
if (err == READ_TREE_RECURSIVE)
|
||||
err = 0;
|
||||
|
@ -73,7 +73,7 @@ test_expect_missing archive-pathspec/ignored-by-tree
|
||||
test_expect_missing archive-pathspec/ignored-by-tree.d
|
||||
test_expect_missing archive-pathspec/ignored-by-tree.d/file
|
||||
test_expect_exists archive-pathspec/ignored-by-worktree
|
||||
test_expect_missing archive-pathspec/excluded-by-pathspec.d failure
|
||||
test_expect_missing archive-pathspec/excluded-by-pathspec.d
|
||||
test_expect_missing archive-pathspec/excluded-by-pathspec.d/file
|
||||
|
||||
test_expect_success 'git archive with wildcard pathspec' '
|
||||
|
@ -76,7 +76,7 @@ test_expect_missing archive/deep/and/slashless/ &&
|
||||
test_expect_missing archive/deep/and/slashless/foo &&
|
||||
test_expect_missing archive/deep/with/wildcard/ &&
|
||||
test_expect_missing archive/deep/with/wildcard/foo &&
|
||||
test_expect_exists archive/one-level-lower/
|
||||
test_expect_missing archive/one-level-lower/
|
||||
test_expect_missing archive/one-level-lower/two-levels-lower/ignored-only-if-dir/
|
||||
test_expect_missing archive/one-level-lower/two-levels-lower/ignored-ony-if-dir/ignored-by-ignored-dir
|
||||
|
||||
|
@ -108,14 +108,14 @@ test_expect_success 'archive empty subtree with no pathspec' '
|
||||
git archive --format=tar $root_tree >subtree-all.tar &&
|
||||
make_dir extract &&
|
||||
"$TAR" xf subtree-all.tar -C extract &&
|
||||
check_dir extract sub
|
||||
check_dir extract
|
||||
'
|
||||
|
||||
test_expect_success 'archive empty subtree by direct pathspec' '
|
||||
git archive --format=tar $root_tree -- sub >subtree-path.tar &&
|
||||
make_dir extract &&
|
||||
"$TAR" xf subtree-path.tar -C extract &&
|
||||
check_dir extract sub
|
||||
check_dir extract
|
||||
'
|
||||
|
||||
ZIPINFO=zipinfo
|
||||
|
Loading…
Reference in New Issue
Block a user