From: Tom Scogland <scogland1@xxxxxxxx> The documentation for archive states: The path of the file in the archive is built by concatenating the value of the last `--prefix` moption (if any) before this `--add-virtual-file` and <path>. This matches the documentation for --add-file and the behavior works for that option, but --prefix is ignored for --add-virtual-file. This commit modifies archive.c to include the prefix in the path and adds a check into the existing add-virtual-file test to ensure that it honors both the most recent prefix before the flag. In looking for others with this issue, I found message a143e25a70b44b82b4ee6fa3bb2bcda4@xxxxxxxxxxxxxxxxxxxx on the mailing list, where Stefan proposed a basically identical patch to archive.c back in February, so the main addition here is the test along with that patch. Signed-off-by: Tom Scogland <scogland1@xxxxxxxx> --- archive: make --add-virtual-file honor --prefix Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1719%2Ftrws%2Fhonor-prefix-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1719/trws/honor-prefix-v1 Pull-Request: https://github.com/git/git/pull/1719 archive.c | 11 +++++------ t/t5003-archive-zip.sh | 8 ++++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/archive.c b/archive.c index 5287fcdd8e0..90086a1708f 100644 --- a/archive.c +++ b/archive.c @@ -365,12 +365,11 @@ int write_archive_entries(struct archiver_args *args, put_be64(fake_oid.hash, i + 1); + strbuf_reset(&path_in_archive); + if (info->base) + strbuf_addstr(&path_in_archive, info->base); + strbuf_addstr(&path_in_archive, basename(path)); if (!info->content) { - strbuf_reset(&path_in_archive); - if (info->base) - strbuf_addstr(&path_in_archive, info->base); - strbuf_addstr(&path_in_archive, basename(path)); - strbuf_reset(&content); if (strbuf_read_file(&content, path, info->stat.st_size) < 0) err = error_errno(_("cannot read '%s'"), path); @@ -381,7 +380,7 @@ int write_archive_entries(struct archiver_args *args, content.buf, content.len); } else { err = write_entry(args, &fake_oid, - path, strlen(path), + path_in_archive.buf, path_in_archive.len, canon_mode(info->stat.st_mode), info->content, info->stat.st_size); } diff --git a/t/t5003-archive-zip.sh b/t/t5003-archive-zip.sh index 961c6aac256..acc8bc4fcd6 100755 --- a/t/t5003-archive-zip.sh +++ b/t/t5003-archive-zip.sh @@ -218,14 +218,18 @@ test_expect_success UNZIP 'git archive --format=zip --add-virtual-file' ' fi && git archive --format=zip >with_file_with_content.zip \ --add-virtual-file=\""$PATHNAME"\": \ - --add-virtual-file=hello:world $EMPTY_TREE && + --add-virtual-file=hello:world \ + --prefix=subdir/ --add-virtual-file=hello:world \ + --prefix= $EMPTY_TREE && test_when_finished "rm -rf tmp-unpack" && mkdir tmp-unpack && ( cd tmp-unpack && "$GIT_UNZIP" ../with_file_with_content.zip && test_path_is_file hello && test_path_is_file "$PATHNAME" && - test world = $(cat hello) + test world = $(cat hello) && + test_path_is_file subdir/hello && + test world = $(cat subdir/hello) ) ' base-commit: 786a3e4b8d754d2b14b1208b98eeb0a554ef19a8 -- gitgitgadget