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 checksmaint
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)
|
write_archive_entry_fn_t write_entry)
|
||||||
{
|
{
|
||||||
struct archiver_context context;
|
struct archiver_context context;
|
||||||
struct unpack_trees_options opts;
|
|
||||||
struct tree_desc t;
|
|
||||||
int err;
|
int err;
|
||||||
struct strbuf path_in_archive = STRBUF_INIT;
|
struct strbuf path_in_archive = STRBUF_INIT;
|
||||||
struct strbuf content = STRBUF_INIT;
|
struct strbuf content = STRBUF_INIT;
|
||||||
|
@ -331,23 +329,6 @@ int write_archive_entries(struct archiver_args *args,
|
||||||
context.args = args;
|
context.args = args;
|
||||||
context.write_entry = write_entry;
|
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,
|
err = read_tree(args->repo, args->tree,
|
||||||
&args->pathspec,
|
&args->pathspec,
|
||||||
queue_or_write_archive_entry,
|
queue_or_write_archive_entry,
|
||||||
|
@ -540,6 +521,26 @@ static void parse_treeish_arg(const char **argv,
|
||||||
if (!tree)
|
if (!tree)
|
||||||
die(_("not a tree object: %s"), oid_to_hex(&oid));
|
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->refname = ref;
|
||||||
ar_args->tree = tree;
|
ar_args->tree = tree;
|
||||||
ar_args->commit_oid = commit_oid;
|
ar_args->commit_oid = commit_oid;
|
||||||
|
|
|
@ -137,6 +137,8 @@ test_expect_success 'end-of-options is correctly eaten' '
|
||||||
|
|
||||||
test_expect_success 'populate workdir' '
|
test_expect_success 'populate workdir' '
|
||||||
mkdir a &&
|
mkdir a &&
|
||||||
|
echo "a files_named_a" >.gitattributes &&
|
||||||
|
git add .gitattributes &&
|
||||||
echo simple textfile >a/a &&
|
echo simple textfile >a/a &&
|
||||||
ten=0123456789 &&
|
ten=0123456789 &&
|
||||||
hundred="$ten$ten$ten$ten$ten$ten$ten$ten$ten$ten" &&
|
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_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.
|
# 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
|
# We'll pull out only the year from the date; that avoids any question of
|
||||||
|
|
Loading…
Reference in New Issue