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);
|
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;
|
||||||
|
@ -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' '
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user