From 966762b8abcba44322ed1f0161ad32b8cadfd9bf Mon Sep 17 00:00:00 2001 From: Preben Ingvaldsen Date: Fri, 22 Jun 2018 17:11:44 -0700 Subject: [PATCH] commands: add additional export test coverage Add additional integration tests to test various functionality of the `migrate export` command --- test/test-migrate-export.sh | 245 +++++++++++++++++++++++++++++++++- test/test-migrate-fixtures.sh | 69 +++++++++- 2 files changed, 307 insertions(+), 7 deletions(-) diff --git a/test/test-migrate-export.sh b/test/test-migrate-export.sh index 7ee4ce10..39ddbf75 100755 --- a/test/test-migrate-export.sh +++ b/test/test-migrate-export.sh @@ -7,26 +7,36 @@ begin_test "migrate export (default branch)" ( set -e - setup_multiple_local_branches + setup_multiple_local_branches_tracked - md_oid="$(calc_oid "$(git cat-file -p :a.md)")" - txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")" + md_oid="$(calc_oid "$(cat a.md)")" + txt_oid="$(calc_oid "$(cat a.txt)")" - git lfs migrate import + git checkout my-feature + md_feature_oid="$(calc_oid "$(cat a.md)")" + git checkout master assert_pointer "refs/heads/master" "a.md" "$md_oid" "140" assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120" + assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30" git lfs migrate export --include="*.md, *.txt" [ ! $(assert_pointer "refs/heads/master" "a.md" "$md_oid" "140") ] [ ! $(assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120") ] + assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30" master="$(git rev-parse refs/heads/master)" + feature="$(git rev-parse refs/heads/my-feature)" + master_attrs="$(git cat-file -p "$master:.gitattributes")" + feature_attrs="$(git cat-file -p "$feature:.gitattributes")" echo "$master_attrs" | grep -q "*.md text -filter -merge -diff" echo "$master_attrs" | grep -q "*.txt text -filter -merge -diff" + + [ ! $(echo "$feature_attrs" | grep -q "*.md text -filter -merge -diff") ] + [ ! $(echo "$feature_attrs" | grep -q "*.txt text -filter -merge -diff") ] ) end_test @@ -36,6 +46,8 @@ begin_test "migrate export (with remote)" setup_single_remote_branch_tracked + git push origin master + md_oid="$(calc_oid "$(cat a.md)")" txt_oid="$(calc_oid "$(cat a.txt)")" @@ -60,3 +72,228 @@ begin_test "migrate export (with remote)" echo "$master_attrs" | grep -q "*.txt text -filter -merge -diff" ) end_test + +begin_test "migrate export (include/exclude args)" +( + set -e + + setup_multiple_local_branches_tracked + + md_oid="$(calc_oid "$(cat a.md)")" + txt_oid="$(calc_oid "$(cat a.txt)")" + + assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120" + + git lfs migrate export --include="*" --exclude="a.md" + + [ ! $(assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120") ] + assert_pointer "refs/heads/master" "a.md" "$md_oid" "140" + + master="$(git rev-parse refs/heads/master)" + + master_attrs="$(git cat-file -p "$master:.gitattributes")" + + echo "$master_attrs" | grep -q "* text -filter -merge -diff" + echo "$master_attrs" | grep -q "a.md filter=lfs diff=lfs merge=lfs" + +) +end_test + +begin_test "migrate export (bare repository)" +( + set -e + + setup_single_remote_branch_tracked + git push origin master + make_bare + + git lfs migrate export --everything --include="*" +) +end_test + +begin_test "migrate export (given branch)" +( + set -e + + setup_multiple_local_branches_tracked + + md_oid="$(calc_oid "$(cat a.md)")" + txt_oid="$(calc_oid "$(cat a.txt)")" + + git checkout my-feature + md_feature_oid="$(calc_oid "$(cat a.md)")" + git checkout master + + assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30" + assert_pointer "refs/heads/my-feature" "a.txt" "$txt_oid" "120" + assert_pointer "refs/heads/master" "a.md" "$md_oid" "140" + assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120" + + git lfs migrate export --include="*.md,*.txt" my-feature + + [ ! $(assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30") ] + [ ! $(assert_pointer "refs/heads/my-feature" "a.txt" "$txt_oid" "120") ] + [ ! $(assert_pointer "refs/heads/master" "a.md" "$md_oid" "140") ] + [ ! $(assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120") ] + + master="$(git rev-parse refs/heads/master)" + feature="$(git rev-parse refs/heads/my-feature)" + + master_attrs="$(git cat-file -p "$master:.gitattributes")" + feature_attrs="$(git cat-file -p "$feature:.gitattributes")" + + echo "$master_attrs" | grep -q "*.md text -filter -merge -diff" + echo "$master_attrs" | grep -q "*.txt text -filter -merge -diff" + echo "$feature_attrs" | grep -q "*.md text -filter -merge -diff" + echo "$feature_attrs" | grep -q "*.txt text -filter -merge -diff" +) +end_test + +begin_test "migrate export (no filter)" +( + set -e + + setup_multiple_local_branches_tracked + + git lfs migrate export 2>&1 | tee migrate.log + if [ ${PIPESTATUS[0]} -eq 0 ]; then + echo >&2 "fatal: expected git lfs migrate export to fail, didn't" + exit 1 + fi + + grep "fatal: one or more files must be specified with --include" migrate.log +) +end_test + +begin_test "migrate export (exclude remote refs)" +( + set -e + + setup_single_remote_branch_tracked + + md_oid="$(calc_oid "$(cat a.md)")" + txt_oid="$(calc_oid "$(cat a.txt)")" + + git checkout refs/remotes/origin/master + md_remote_oid="$(calc_oid "$(cat a.md)")" + txt_remote_oid="$(calc_oid "$(cat a.txt)")" + git checkout master + + assert_pointer "refs/heads/master" "a.md" "$md_oid" "50" + assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30" + + assert_pointer "refs/remotes/origin/master" "a.md" "$md_remote_oid" "140" + assert_pointer "refs/remotes/origin/master" "a.txt" "$txt_remote_oid" "120" + + git lfs migrate export --include="*.md,*.txt" + + [ ! $(assert_pointer "refs/heads/master" "a.md" "$md_oid" "50") ] + [ ! $(assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30") ] + + assert_pointer "refs/remotes/origin/master" "a.md" "$md_remote_oid" "140" + assert_pointer "refs/remotes/origin/master" "a.txt" "$txt_remote_oid" "120" + + master="$(git rev-parse refs/heads/master)" + remote="$(git rev-parse refs/remotes/origin/master)" + + master_attrs="$(git cat-file -p "$master:.gitattributes")" + remote_attrs="$(git cat-file -p "$remote:.gitattributes")" + + echo "$master_attrs" | grep -q "*.md text -filter -merge -diff" + echo "$master_attrs" | grep -q "*.txt text -filter -merge -diff" + + [ ! $(echo "$remote_attrs" | grep -q "*.md text -filter -merge -diff") ] + [ ! $(echo "$remote_attrs" | grep -q "*.txt text -filter -merge -diff") ] +) +end_test + +begin_test "migrate export (--skip-fetch)" +( + set -e + + setup_single_remote_branch_tracked + + md_master_oid="$(calc_oid "$(cat a.md)")" + txt_master_oid="$(calc_oid "$(cat a.txt)")" + + git checkout refs/remotes/origin/master + md_remote_oid="$(calc_oid "$(cat a.md)")" + txt_remote_oid="$(calc_oid "$(cat a.txt)")" + git checkout master + + git tag pseudo-remote "$(git rev-parse refs/remotes/origin/master)" + # Remove the refs/remotes/origin/master ref, and instruct 'git lfs migrate' to + # not fetch it. + git update-ref -d refs/remotes/origin/master + + assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "50" + assert_pointer "pseudo-remote" "a.md" "$md_remote_oid" "140" + assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "30" + assert_pointer "pseudo-remote" "a.txt" "$txt_remote_oid" "120" + + git lfs migrate export --skip-fetch --include="*.md,*.txt" + + [ ! $(assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "50") ] + [ ! $(assert_pointer "pseudo-remote" "a.md" "$md_remote_oid" "140") ] + [ ! $(assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "30") ] + [ ! $(assert_pointer "pseudo-remote" "a.txt" "$txt_remote_oid" "120") ] + + master="$(git rev-parse refs/heads/master)" + remote="$(git rev-parse pseudo-remote)" + + master_attrs="$(git cat-file -p "$master:.gitattributes")" + remote_attrs="$(git cat-file -p "$remote:.gitattributes")" + + echo "$master_attrs" | grep -q "*.md text -filter -merge -diff" + echo "$master_attrs" | grep -q "*.txt text -filter -merge -diff" + echo "$remote_attrs" | grep -q "*.md text -filter -merge -diff" + echo "$remote_attrs" | grep -q "*.txt text -filter -merge -diff" +) +end_test + +begin_test "migrate export (include/exclude ref)" +( + set -e + + setup_multiple_remote_branches_gitattrs + + md_master_oid="$(calc_oid "$(cat a.md)")" + txt_master_oid="$(calc_oid "$(cat a.txt)")" + + git checkout refs/remotes/origin/master + md_remote_oid="$(calc_oid "$(cat a.md)")" + txt_remote_oid="$(calc_oid "$(cat a.txt)")" + + git checkout my-feature + md_feature_oid="$(calc_oid "$(cat a.md)")" + txt_feature_oid="$(calc_oid "$(cat a.txt)")" + + git checkout master + + git lfs migrate export \ + --include="*.txt" \ + --include-ref=refs/heads/my-feature \ + --exclude-ref=refs/heads/master + + assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "21" + assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "20" + + assert_pointer "refs/remotes/origin/master" "a.md" "$md_remote_oid" "11" + assert_pointer "refs/remotes/origin/master" "a.txt" "$txt_remote_oid" "10" + + assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31" + [ ! $(assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30") ] + + master="$(git rev-parse refs/heads/master)" + feature="$(git rev-parse refs/heads/my-feature)" + remote="$(git rev-parse refs/remotes/origin/master)" + + master_attrs="$(git cat-file -p "$master:.gitattributes")" + remote_attrs="$(git cat-file -p "$remote:.gitattributes")" + feature_attrs="$(git cat-file -p "$feature:.gitattributes")" + + [ ! $(echo "$master_attrs" | grep -q "*.txt text -filter -merge -diff") ] + [ ! $(echo "$remote_attrs" | grep -q "*.txt text -filter -merge -diff") ] + echo "$feature_attrs" | grep -q "*.txt text -filter -merge -diff" +) +end_test diff --git a/test/test-migrate-fixtures.sh b/test/test-migrate-fixtures.sh index 0dea5c25..e1d2a62b 100755 --- a/test/test-migrate-fixtures.sh +++ b/test/test-migrate-fixtures.sh @@ -134,6 +134,36 @@ setup_multiple_local_branches_with_gitattrs() { git commit -m "add .gitattributes" } +# setup_multiple_local_branches_tracked creates a repo with exactly the same +# structure as in setup_multiple_local_branches, but with all files tracked by +# Git LFS +setup_multiple_local_branches_tracked() { + set -e + + reponame="migrate-info-multiple-local-branches" + + remove_and_create_local_repo "$reponame" + + git lfs track "*.txt" "*.md" + git add .gitattributes + git commit -m "initial commit" + + base64 < /dev/urandom | head -c 120 > a.txt + base64 < /dev/urandom | head -c 140 > a.md + + git add a.txt a.md + git commit -m "add a.{txt,md}" + + git checkout -b my-feature + + base64 < /dev/urandom | head -c 30 > a.md + + git add a.md + git commit -m "add an additional 30 bytes to a.md" + + git checkout master +} + # setup_local_branch_with_space creates a repository as follows: # # A @@ -202,7 +232,7 @@ setup_single_remote_branch_with_gitattrs() { } # Creates a repo identical to setup_single_remote_branch, except with *.md and -# *.txt files tracked by Git LFS, and all commits pushed to master +# *.txt files tracked by Git LFS setup_single_remote_branch_tracked() { set -e @@ -227,8 +257,6 @@ setup_single_remote_branch_tracked() { git add a.md a.txt git commit -m "add an additional 30, 50 bytes to a.{txt,md}" - - git push origin master } # setup_multiple_remote_branches creates a repository as follows: @@ -277,6 +305,41 @@ setup_multiple_remote_branches() { git checkout master } +# Creates a repo identical to that in setup_multiple_remote_branches(), but +# with all files tracked by Git LFS +setup_multiple_remote_branches_gitattrs() { + set -e + + reponame="migrate-info-exclude-remote-refs-given-branch" + + remove_and_create_remote_repo "$reponame" + + git lfs track "*.txt" "*.md" + git add .gitattributes + git commit -m "initial commit" + + base64 < /dev/urandom | head -c 10 > a.txt + base64 < /dev/urandom | head -c 11 > a.md + git add a.txt a.md + git commit -m "add 10, 11 bytes, a.{txt,md}" + + git push origin master + + base64 < /dev/urandom | head -c 20 > a.txt + base64 < /dev/urandom | head -c 21 > a.md + git add a.txt a.md + git commit -m "add 20, 21 bytes, a.{txt,md}" + + git checkout -b my-feature + + base64 < /dev/urandom | head -c 30 > a.txt + base64 < /dev/urandom | head -c 31 > a.md + git add a.txt a.md + git commit -m "add 30, 31 bytes, a.{txt,md}" + + git checkout master +} + # setup_single_local_branch_with_tags creates a repository as follows: # # A---B