mirror of
https://github.com/git/git.git
synced 2024-11-23 09:56:28 +08:00
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:
commit
c58eee0928
39
archive.c
39
archive.c
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user