Merge branch 'rs/archive-with-attr-pathspec-fix'

"git archive" with pathspec magic that uses the attribute
information did not work well, which has been corrected.

* rs/archive-with-attr-pathspec-fix:
  archive: load index before pathspec checks
This commit is contained in:
Junio C Hamano 2024-09-30 16:16:15 -07:00
commit c58eee0928
2 changed files with 32 additions and 19 deletions

View file

@ -304,8 +304,6 @@ int write_archive_entries(struct archiver_args *args,
write_archive_entry_fn_t write_entry)
{
struct archiver_context context;
struct unpack_trees_options opts;
struct tree_desc t;
int err;
struct strbuf path_in_archive = STRBUF_INIT;
struct strbuf content = STRBUF_INIT;
@ -331,23 +329,6 @@ int write_archive_entries(struct archiver_args *args,
context.args = args;
context.write_entry = write_entry;
/*
* Setup index and instruct attr to read index only
*/
if (!args->worktree_attributes) {
memset(&opts, 0, sizeof(opts));
opts.index_only = 1;
opts.head_idx = -1;
opts.src_index = args->repo->index;
opts.dst_index = args->repo->index;
opts.fn = oneway_merge;
init_tree_desc(&t, &args->tree->object.oid,
args->tree->buffer, args->tree->size);
if (unpack_trees(1, &t, &opts))
return -1;
git_attr_set_direction(GIT_ATTR_INDEX);
}
err = read_tree(args->repo, args->tree,
&args->pathspec,
queue_or_write_archive_entry,
@ -540,6 +521,26 @@ static void parse_treeish_arg(const char **argv,
if (!tree)
die(_("not a tree object: %s"), oid_to_hex(&oid));
/*
* Setup index and instruct attr to read index only
*/
if (!ar_args->worktree_attributes) {
struct unpack_trees_options opts;
struct tree_desc t;
memset(&opts, 0, sizeof(opts));
opts.index_only = 1;
opts.head_idx = -1;
opts.src_index = ar_args->repo->index;
opts.dst_index = ar_args->repo->index;
opts.fn = oneway_merge;
init_tree_desc(&t, &tree->object.oid, tree->buffer, tree->size);
if (unpack_trees(1, &t, &opts))
die(_("unable to checkout working tree"));
git_attr_set_direction(GIT_ATTR_INDEX);
}
ar_args->refname = ref;
ar_args->tree = tree;
ar_args->commit_oid = commit_oid;

View file

@ -137,6 +137,8 @@ test_expect_success 'end-of-options is correctly eaten' '
test_expect_success 'populate workdir' '
mkdir a &&
echo "a files_named_a" >.gitattributes &&
git add .gitattributes &&
echo simple textfile >a/a &&
ten=0123456789 &&
hundred="$ten$ten$ten$ten$ten$ten$ten$ten$ten$ten" &&
@ -450,6 +452,16 @@ test_expect_success 'allow pathspecs that resolve to the current directory' '
test_cmp expect actual
'
test_expect_success 'attr pathspec in bare repo' '
test_expect_code 0 git --git-dir=bare.git archive -v HEAD \
":(attr:files_named_a)" >/dev/null 2>actual &&
cat >expect <<-\EOF &&
a/
a/a
EOF
test_cmp expect actual
'
# Pull the size and date of each entry in a tarfile using the system tar.
#
# We'll pull out only the year from the date; that avoids any question of