From: Heather Lapointe <alpha@alphaservcomputing.solutions> Ensuring functionality works with and without submodules. We expect --recurse-submodules to fail if there are uninitialized submodules present. Signed-off-by: Heather Lapointe <alpha@alphaservcomputing.solutions> --- archive.c | 2 +- t/t5005-archive-submodules.sh | 83 +++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100755 t/t5005-archive-submodules.sh diff --git a/archive.c b/archive.c index f81ef741487..b0a3181f7f5 100644 --- a/archive.c +++ b/archive.c @@ -179,7 +179,7 @@ static int write_archive_entry( err = write_entry(repo, args, oid, path.buf, path.len, mode, NULL, 0); if (err) return err; - return (S_ISDIR(mode) ? READ_TREE_RECURSIVE : 0); + return READ_TREE_RECURSIVE; } if (args->verbose) diff --git a/t/t5005-archive-submodules.sh b/t/t5005-archive-submodules.sh new file mode 100755 index 00000000000..aad6cfd1082 --- /dev/null +++ b/t/t5005-archive-submodules.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +test_description='git archive --recurse-submodules test' + +. ./test-lib.sh + +check_tar() { + tarfile=$1.tar + listfile=$1.lst + dir=$1 + dir_with_prefix=$dir/$2 + + test_expect_success ' extract tar archive' ' + (mkdir $dir && cd $dir && "$TAR" xf -) <$tarfile + ' +} + +check_added() { + dir=$1 + path_in_fs=$2 + path_in_archive=$3 + + test_expect_success " validate extra file $path_in_archive" ' + test -f $dir/$path_in_archive && + diff -r $path_in_fs $dir/$path_in_archive + ' +} + +check_not_added() { + dir=$1 + path_in_archive=$2 + + test_expect_success " validate unpresent file $path_in_archive" ' + ! test -f $dir/$path_in_archive && + ! test -d $dir/$path_in_archive + ' +} + +test_expect_success 'setup' ' + rm -rf repo_with_submodules submodule1 uninited_repo_with_submodules && + git init repo_with_submodules && + git init submodule1 && + ( + cd submodule1 && + echo "dir1/sub1/file1.txt" > "file1.txt" && + git add file1.txt && + git commit -m "initialize with file1.txt" + ) && + ( + cd repo_with_submodules && + echo "file2" > file2.txt && + git add file2.txt && + git commit -m "initialize with file2.txt" && + mkdir -p dir1 && + git submodule add ../submodule1 dir1/sub1 && + git commit -m "add submodule1" + ) && + git clone repo_with_submodules uninited_repo_with_submodules +' + +test_expect_success 'archive without recurse, non-init' ' + git -C uninited_repo_with_submodules archive -v HEAD >b.tar +' + +check_tar b +check_added b uninited_repo_with_submodules/file2.txt file2.txt +check_not_added b uninited_repo_with_submodules/dir1/sub1/file1.txt + +# It is expected that --recurse-submodules will not work if submodules are not +# initialized. +test_expect_success 'archive with recurse, non-init' ' + ! git -C uninited_repo_with_submodules archive --recurse-submodules -v HEAD >b2-err.tar +' + +test_expect_success 'archive with recurse, init' ' + git -C repo_with_submodules archive --recurse-submodules -v HEAD >b3.tar +' + +check_tar b3 +check_added b3 repo_with_submodules/file2.txt file2.txt +check_added b3 repo_with_submodules/dir1/sub1/file1.txt dir1/sub1/file1.txt + +test_done -- gitgitgadget