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:
Junio C Hamano 2017-09-25 15:24:07 +09:00
commit 62b1cb7b13
4 changed files with 6 additions and 21 deletions

View File

@ -121,11 +121,6 @@ static int check_attr_export_subst(const struct attr_check *check)
return check && ATTR_TRUE(check->items[1].value); 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, static int write_archive_entry(const unsigned char *sha1, const char *base,
int baselen, const char *filename, unsigned mode, int stage, int baselen, const char *filename, unsigned mode, int stage,
void *context) void *context)
@ -147,7 +142,7 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
strbuf_addch(&path, '/'); strbuf_addch(&path, '/');
path_without_prefix = path.buf + args->baselen; path_without_prefix = path.buf + args->baselen;
if (!S_ISDIR(mode) || !should_queue_directories(args)) { if (!S_ISDIR(mode)) {
const struct attr_check *check; const struct attr_check *check;
check = get_archive_attrs(path_without_prefix); check = get_archive_attrs(path_without_prefix);
if (check_attr_export_ignore(check)) 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); 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, static void queue_directory(const unsigned char *sha1,
struct strbuf *base, const char *filename, struct strbuf *base, const char *filename,
unsigned mode, int stage, struct archiver_context *c) 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, err = read_tree_recursive(args->tree, "", 0, 0, &args->pathspec,
should_queue_directories(args) ? queue_or_write_archive_entry,
queue_or_write_archive_entry :
write_archive_entry_buf,
&context); &context);
if (err == READ_TREE_RECURSIVE) if (err == READ_TREE_RECURSIVE)
err = 0; err = 0;

View File

@ -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
test_expect_missing archive-pathspec/ignored-by-tree.d/file test_expect_missing archive-pathspec/ignored-by-tree.d/file
test_expect_exists archive-pathspec/ignored-by-worktree 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_missing archive-pathspec/excluded-by-pathspec.d/file
test_expect_success 'git archive with wildcard pathspec' ' test_expect_success 'git archive with wildcard pathspec' '

View File

@ -76,7 +76,7 @@ test_expect_missing archive/deep/and/slashless/ &&
test_expect_missing archive/deep/and/slashless/foo && test_expect_missing archive/deep/and/slashless/foo &&
test_expect_missing archive/deep/with/wildcard/ && test_expect_missing archive/deep/with/wildcard/ &&
test_expect_missing archive/deep/with/wildcard/foo && 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-only-if-dir/
test_expect_missing archive/one-level-lower/two-levels-lower/ignored-ony-if-dir/ignored-by-ignored-dir test_expect_missing archive/one-level-lower/two-levels-lower/ignored-ony-if-dir/ignored-by-ignored-dir

View File

@ -108,14 +108,14 @@ test_expect_success 'archive empty subtree with no pathspec' '
git archive --format=tar $root_tree >subtree-all.tar && git archive --format=tar $root_tree >subtree-all.tar &&
make_dir extract && make_dir extract &&
"$TAR" xf subtree-all.tar -C extract && "$TAR" xf subtree-all.tar -C extract &&
check_dir extract sub check_dir extract
' '
test_expect_success 'archive empty subtree by direct pathspec' ' test_expect_success 'archive empty subtree by direct pathspec' '
git archive --format=tar $root_tree -- sub >subtree-path.tar && git archive --format=tar $root_tree -- sub >subtree-path.tar &&
make_dir extract && make_dir extract &&
"$TAR" xf subtree-path.tar -C extract && "$TAR" xf subtree-path.tar -C extract &&
check_dir extract sub check_dir extract
' '
ZIPINFO=zipinfo ZIPINFO=zipinfo