# This file is to be sourced, not executed # Copyright (C) 2011 Colin Walters # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. set -euo pipefail echo "1..$((72 + ${extra_basic_tests:-0}))" $CMD_PREFIX ostree --version > version.yaml python -c 'import yaml; yaml.safe_load(open("version.yaml"))' echo "ok yaml version" CHECKOUT_U_ARG="" COMMIT_ARGS="" DIFF_ARGS="" if is_bare_user_only_repo repo; then # In bare-user-only repos we can only represent files with uid/gid 0, no # xattrs and canonical permissions, so we need to commit them as such, or # we end up with repos that don't pass fsck COMMIT_ARGS="--canonical-permissions" DIFF_ARGS="--owner-uid=0 --owner-gid=0 --no-xattrs" # Also, since we can't check out uid=0 files we need to check out in user mode CHECKOUT_U_ARG="-U" fi validate_checkout_basic() { (cd $1; assert_has_file firstfile assert_has_file baz/cow assert_file_has_content baz/cow moo assert_has_file baz/deeper/ohyeah assert_symlink_has_content somelink nosuchfile ) } $OSTREE checkout test2 checkout-test2 validate_checkout_basic checkout-test2 if grep -q 'mode=bare$' repo/config; then assert_not_streq $(stat -c '%h' checkout-test2/firstfile) 1 fi echo "ok checkout" # Note this tests bare-user *and* bare-user-only rm checkout-test2 -rf if grep -q bare-user repo/config; then $OSTREE checkout -U -H test2 checkout-test2 else $OSTREE checkout -H test2 checkout-test2 fi validate_checkout_basic checkout-test2 rm checkout-test2 -rf # Only do these tests on bare-user/bare, not bare-user-only # since the latter automatically synthesizes -U if it's not passed. if ! is_bare_user_only_repo repo; then if grep -q bare-user repo/config; then if $OSTREE checkout -H test2 checkout-test2 2>err.txt; then assert_not_reached "checkout -H worked?" fi assert_file_has_content err.txt "User repository.*requires.*user" else if $OSTREE checkout -U -H test2 checkout-test2 2>err.txt; then assert_not_reached "checkout -H worked?" fi assert_file_has_content err.txt "Bare repository mode cannot hardlink in user" fi fi echo "ok checkout -H" rm checkout-test2 -rf $OSTREE checkout -C test2 checkout-test2 for file in firstfile baz/cow baz/alink; do assert_streq $(stat -c '%h' checkout-test2/$file) 1 done echo "ok checkout -C" $OSTREE rev-parse test2 $OSTREE rev-parse 'test2^' $OSTREE rev-parse 'test2^^' 2>/dev/null && fatal "rev-parse test2^^ unexpectedly succeeded!" echo "ok rev-parse" checksum=$($OSTREE rev-parse test2) partial=${checksum:0:6} echo "partial:" $partial echo "corresponds to:" $checksum $OSTREE rev-parse test2 > checksum $OSTREE rev-parse $partial > partial-results assert_file_has_content checksum $(cat partial-results) echo "ok shortened checksum" (cd repo && ${CMD_PREFIX} ostree rev-parse test2) echo "ok repo-in-cwd" if ! skip_one_without_user_xattrs; then rm test-repo -rf ostree_repo_init test-repo --mode=bare-user ostree_repo_init test-repo --mode=bare-user rm test-repo -rf echo "ok repo-init on existing repo" fi if ! skip_one_without_user_xattrs; then rm test-repo -rf ostree_repo_init test-repo --mode=bare-user ${CMD_PREFIX} ostree --repo=test-repo refs rm -rf test-repo/tmp ${CMD_PREFIX} ostree --repo=test-repo refs assert_has_dir test-repo/tmp echo "ok autocreate tmp" fi rm checkout-test2 -rf $OSTREE checkout test2 checkout-test2 cd checkout-test2 rm firstfile $OSTREE commit ${COMMIT_ARGS} -b test2 -s delete cd $test_tmpdir $OSTREE checkout test2 $test_tmpdir/checkout-test2-2 cd $test_tmpdir/checkout-test2-2 assert_not_has_file firstfile assert_has_file baz/saucer echo "ok removal" mkdir -p a/nested/tree echo one > a/nested/tree/1 echo two2 > a/nested/2 echo 3 > a/nested/3 touch a/4 echo fivebaby > a/5 touch a/6 echo whee > 7 mkdir -p another/nested/tree echo anotherone > another/nested/tree/1 echo whee2 > another/whee # FIXME - remove grep for . $OSTREE commit ${COMMIT_ARGS} -b test2 -s "Another commit" echo "ok commit" cd ${test_tmpdir} $OSTREE checkout test2 $test_tmpdir/checkout-test2-3 cd checkout-test2-3 assert_has_file a/nested/2 assert_file_has_content a/nested/2 'two2' echo "ok stdin contents" cd ${test_tmpdir}/checkout-test2-3 echo 4 > four mkdir -p yet/another/tree echo leaf > yet/another/tree/green echo helloworld > yet/message rm a/5 $OSTREE commit ${COMMIT_ARGS} -b test2 -s "Current directory" echo "ok cwd commit" cd ${test_tmpdir} $OSTREE checkout test2 $test_tmpdir/checkout-test2-4 cd checkout-test2-4 assert_file_has_content yet/another/tree/green 'leaf' assert_file_has_content four '4' echo "ok cwd contents" cd ${test_tmpdir} $OSTREE commit ${COMMIT_ARGS} -b test2-no-parent -s '' $test_tmpdir/checkout-test2-4 assert_streq $($OSTREE log test2-no-parent |grep '^commit' | wc -l) "1" $OSTREE commit ${COMMIT_ARGS} -b test2-no-parent -s '' --parent=none $test_tmpdir/checkout-test2-4 assert_streq $($OSTREE log test2-no-parent |grep '^commit' | wc -l) "1" echo "ok commit no parent" cd ${test_tmpdir} # Do the --bind-ref=, so we store both branches sorted # in metadata and thus the checksums remain the same. empty_rev=$($OSTREE commit ${COMMIT_ARGS} -b test2-no-subject --bind-ref=test2-no-subject-2 -s '' --timestamp="2005-10-29 12:43:29 +0000" $test_tmpdir/checkout-test2-4) omitted_rev=$($OSTREE commit ${COMMIT_ARGS} -b test2-no-subject-2 --bind-ref=test2-no-subject --timestamp="2005-10-29 12:43:29 +0000" $test_tmpdir/checkout-test2-4) assert_streq $empty_rev $omitted_rev echo "ok commit no subject" cd ${test_tmpdir} cat >commitmsg.txt < log.txt assert_file_has_content log.txt '^ *This is a long$' assert_file_has_content log.txt '^ *Build-Host:.*example.com$' assert_file_has_content log.txt '^ *Crunchy-With.*true$' $OSTREE refs --delete branch-with-commitmsg echo "ok commit body file" cd ${test_tmpdir} $OSTREE commit ${COMMIT_ARGS} -b test2-custom-parent -s '' $test_tmpdir/checkout-test2-4 $OSTREE commit ${COMMIT_ARGS} -b test2-custom-parent -s '' $test_tmpdir/checkout-test2-4 $OSTREE commit ${COMMIT_ARGS} -b test2-custom-parent -s '' $test_tmpdir/checkout-test2-4 assert_streq $($OSTREE log test2-custom-parent |grep '^commit' | wc -l) "3" prevparent=$($OSTREE rev-parse test2-custom-parent^) $OSTREE commit ${COMMIT_ARGS} -b test2-custom-parent -s '' --parent=${prevparent} $test_tmpdir/checkout-test2-4 assert_streq $($OSTREE log test2-custom-parent |grep '^commit' | wc -l) "3" echo "ok commit custom parent" cd ${test_tmpdir} orphaned_rev=$($OSTREE commit ${COMMIT_ARGS} --orphan -s "$(date)" $test_tmpdir/checkout-test2-4) $OSTREE ls ${orphaned_rev} >/dev/null $OSTREE prune --refs-only if $OSTREE ls ${orphaned_rev} 2>err.txt; then assert_not_reached "Found orphaned commit" fi assert_file_has_content err.txt "No such metadata object" echo "ok commit orphaned" cd ${test_tmpdir} $OSTREE diff test2^ test2 > diff-test2 assert_file_has_content diff-test2 'D */a/5' assert_file_has_content diff-test2 'A */yet$' assert_file_has_content diff-test2 'A */yet/message$' assert_file_has_content diff-test2 'A */yet/another/tree/green$' echo "ok diff revisions" cd ${test_tmpdir}/checkout-test2-4 echo afile > oh-look-a-file $OSTREE diff test2 ./ > ${test_tmpdir}/diff-test2-2 rm oh-look-a-file cd ${test_tmpdir} assert_file_has_content diff-test2-2 'A *oh-look-a-file$' echo "ok diff cwd" cd ${test_tmpdir}/checkout-test2-4 $OSTREE diff ${DIFF_ARGS} test2 ./ > ${test_tmpdir}/diff-test2 assert_file_empty ${test_tmpdir}/diff-test2 $OSTREE diff ${DIFF_ARGS} test2 --owner-uid=$((`id -u`+1)) ./ > ${test_tmpdir}/diff-test2 assert_file_has_content ${test_tmpdir}/diff-test2 'M */yet$' assert_file_has_content ${test_tmpdir}/diff-test2 'M */yet/message$' assert_file_has_content ${test_tmpdir}/diff-test2 'M */yet/another/tree/green$' echo "ok diff file with different uid" $OSTREE diff ${DIFF_ARGS} test2 --owner-gid=$((`id -g`+1)) ./ > ${test_tmpdir}/diff-test2 assert_file_has_content ${test_tmpdir}/diff-test2 'M */yet$' assert_file_has_content ${test_tmpdir}/diff-test2 'M */yet/message$' assert_file_has_content ${test_tmpdir}/diff-test2 'M */yet/another/tree/green$' echo "ok diff file with different gid" cd ${test_tmpdir}/checkout-test2-4 rm four mkdir four touch four/other $OSTREE diff test2 ./ > ${test_tmpdir}/diff-test2-2 cd ${test_tmpdir} assert_file_has_content diff-test2-2 'M */four$' echo "ok diff file changing type" if ! skip_one_without_user_xattrs; then cd ${test_tmpdir} mkdir repo2 # Use a different mode to test hardlinking metadata only if grep -q 'mode=archive' repo/config || is_bare_user_only_repo repo; then opposite_mode=bare-user else opposite_mode=archive fi ostree_repo_init repo2 --mode=$opposite_mode ${CMD_PREFIX} ostree --repo=repo2 pull-local repo test2_commitid=$(${CMD_PREFIX} ostree --repo=repo rev-parse test2) test2_commit_relpath=/objects/${test2_commitid:0:2}/${test2_commitid:2}.commit assert_files_hardlinked repo/${test2_commit_relpath} repo2/${test2_commit_relpath} echo "ok pull-local (hardlinking metadata)" fi if ! skip_one_without_user_xattrs; then cd ${test_tmpdir} rm repo2 -rf && mkdir repo2 ostree_repo_init repo2 --mode=$opposite_mode ${CMD_PREFIX} ostree --repo=repo2 pull-local --bareuseronly-files repo test2 ${CMD_PREFIX} ostree --repo=repo2 fsck -q echo "ok pull-local --bareuseronly-files" fi # This is mostly a copy of the suid test in test-basic-user-only.sh, # but for the `pull --bareuseronly-files` case. cd ${test_tmpdir} rm repo-input -rf ostree_repo_init repo-input init --mode=archive cd ${test_tmpdir} cat > statoverride.txt < files/some-setuid chmod 0644 files/some-setuid $CMD_PREFIX ostree --repo=repo-input commit -b content-with-suid --statoverride=statoverride.txt --tree=dir=files if $CMD_PREFIX ostree pull-local --repo=repo --bareuseronly-files repo-input content-with-suid 2>err.txt; then assert_not_reached "copying suid file with --bareuseronly-files worked?" fi assert_file_has_content err.txt 'object.*\.file: invalid mode.*with bits 040.*' echo "ok pull-local (bareuseronly files)" if ! skip_one_without_user_xattrs; then cd ${test_tmpdir} ${CMD_PREFIX} ostree --repo=repo2 checkout ${CHECKOUT_U_ARG} test2 test2-checkout-from-local-clone cd test2-checkout-from-local-clone assert_file_has_content yet/another/tree/green 'leaf' echo "ok local clone checkout" fi $OSTREE checkout -U test2 checkout-user-test2 echo "ok user checkout" $OSTREE commit ${COMMIT_ARGS} -b test2 -s "Another commit" --tree=ref=test2 echo "ok commit from ref" $OSTREE commit ${COMMIT_ARGS} -b test2 -s "Another commit with modifier" --tree=ref=test2 --owner-uid=`id -u` echo "ok commit from ref with modifier" $OSTREE commit ${COMMIT_ARGS} -b trees/test2 -s 'ref with / in it' --tree=ref=test2 echo "ok commit ref with /" old_rev=$($OSTREE rev-parse test2) $OSTREE ls -R -C test2 $OSTREE commit ${COMMIT_ARGS} --skip-if-unchanged -b trees/test2 -s 'should not be committed' --tree=ref=test2 $OSTREE ls -R -C test2 new_rev=$($OSTREE rev-parse test2) assert_streq "${old_rev}" "${new_rev}" echo "ok commit --skip-if-unchanged" cd ${test_tmpdir}/checkout-test2-4 $OSTREE commit ${COMMIT_ARGS} -b test2 -s "no xattrs" --no-xattrs echo "ok commit with no xattrs" mkdir tree-A tree-B touch tree-A/file-a tree-B/file-b $OSTREE commit ${COMMIT_ARGS} -b test3-1 -s "Initial tree" --tree=dir=tree-A $OSTREE commit ${COMMIT_ARGS} -b test3-2 -s "Replacement tree" --tree=dir=tree-B $OSTREE commit ${COMMIT_ARGS} -b test3-combined -s "combined tree" --tree=ref=test3-1 --tree=ref=test3-2 $OSTREE checkout test3-combined checkout-test3-combined assert_has_file checkout-test3-combined/file-a assert_has_file checkout-test3-combined/file-b echo "ok commit combined ref trees" # NB: The + is optional, but we need to make sure we support it cd ${test_tmpdir} cat > test-statoverride.txt < a/readable-only chmod 664 a/readable-only $OSTREE commit ${COMMIT_ARGS} -b test2-override -s "with statoverride" --statoverride=../test-statoverride.txt cd ${test_tmpdir} $OSTREE checkout test2-override checkout-test2-override if ! is_bare_user_only_repo repo; then test -g checkout-test2-override/a/nested/2 test -u checkout-test2-override/a/nested/3 else test '!' -g checkout-test2-override/a/nested/2 test '!' -u checkout-test2-override/a/nested/3 fi assert_file_has_mode checkout-test2-override/a/readable-only 600 echo "ok commit statoverride" cd ${test_tmpdir} cat > test-skiplist.txt <err.txt; then assert_not_reached "cat directory" fi assert_file_has_content err.txt "open directory" done rm checkout-test2 -rf $OSTREE cat test2 /yet/another/tree/green > greenfile-contents assert_file_has_content greenfile-contents "leaf" $OSTREE checkout test2 checkout-test2 ls -alR checkout-test2 ln -sr checkout-test2/{four,four-link} ln -sr checkout-test2/{baz/cow,cow-link} ln -sr checkout-test2/{cow-link,cow-link-link} $OSTREE commit -b test2-withlink --tree=dir=checkout-test2 if $OSTREE cat test2-withlink /four-link 2>err.txt; then assert_not_reached "cat directory" fi assert_file_has_content err.txt "open directory" for path in /cow-link /cow-link-link; do $OSTREE cat test2-withlink $path >contents.txt assert_file_has_content contents.txt moo done echo "ok cat-file" cd ${test_tmpdir} $OSTREE checkout --subpath /yet/another test2 checkout-test2-subpath cd checkout-test2-subpath assert_file_has_content tree/green "leaf" cd ${test_tmpdir} rm checkout-test2-subpath -rf $OSTREE ls -R test2 # Test checking out a file $OSTREE checkout --subpath /baz/saucer test2 checkout-test2-subpath assert_file_has_content checkout-test2-subpath/saucer alien # Test checking out a file without making a subdir mkdir t cd t $OSTREE checkout --subpath /baz/saucer test2 . assert_file_has_content saucer alien rm t -rf echo "ok checkout subpath" cd ${test_tmpdir} $OSTREE checkout --union test2 checkout-test2-union find checkout-test2-union | wc -l > union-files-count $OSTREE checkout --union test2 checkout-test2-union find checkout-test2-union | wc -l > union-files-count.new cmp union-files-count{,.new} cd checkout-test2-union assert_file_has_content ./yet/another/tree/green "leaf" echo "ok checkout union 1" cd ${test_tmpdir} $OSTREE commit ${COMMIT_ARGS} -b test-union-add --tree=ref=test2 $OSTREE checkout test-union-add checkout-test-union-add echo 'file for union add testing' > checkout-test-union-add/union-add-test echo 'another file for union add testing' > checkout-test-union-add/union-add-test2 $OSTREE commit ${COMMIT_ARGS} -b test-union-add --tree=dir=checkout-test-union-add rm checkout-test-union-add -rf # Check out previous $OSTREE checkout test-union-add^ checkout-test-union-add assert_not_has_file checkout-test-union-add/union-add-test assert_not_has_file checkout-test-union-add/union-add-test2 # Now create a file we don't want overwritten echo 'existing file for union add' > checkout-test-union-add/union-add-test $OSTREE checkout --union-add test-union-add checkout-test-union-add assert_file_has_content checkout-test-union-add/union-add-test 'existing file for union add' assert_file_has_content checkout-test-union-add/union-add-test2 'another file for union add testing' echo "ok checkout union add" # Create some new files for testing cd ${test_tmpdir} mkdir disjoint-union-test mkdir disjoint-union-test/test_one chmod a+w disjoint-union-test/test_one echo 'file for add dirs testing' > disjoint-union-test/test_one/test_file $OSTREE commit ${COMMIT_ARGS} -b test-disjoint-union --tree=dir=disjoint-union-test $OSTREE checkout --disjoint-union test-disjoint-union checkout-test-disjoint-union echo "ok adding new directories and new file" # Make a new file, and try the checkout again echo 'second test file' > disjoint-union-test/test_one/test_second_file $OSTREE commit ${COMMIT_ARGS} -b test-disjoint-union --tree=dir=disjoint-union-test # Check out the latest commit, should fail due to presence of existing files if $OSTREE checkout --disjoint-union test-disjoint-union checkout-test-disjoint-union 2> err.txt; then assert_not_reached "checking out files unexpectedly succeeded!" fi assert_file_has_content err.txt 'File exists' # Verify that Union mode still functions properly rm checkout-test-disjoint-union/test_one/test_file echo 'file for testing union mode alongwith disjoint-union mode' > checkout-test-disjoint-union/test_one/test_file $OSTREE checkout --union test-disjoint-union checkout-test-disjoint-union assert_has_file checkout-test-disjoint-union/test_one/test_second_file # This shows the file with same name has been successfully overwriten assert_file_has_content checkout-test-disjoint-union/test_one/test_file 'file for add dirs testing' echo "ok checkout disjoint union" cd ${test_tmpdir} rm files -rf && mkdir files mkdir files/worldwritable-dir chmod a+w files/worldwritable-dir $CMD_PREFIX ostree --repo=repo commit -b content-with-dir-world-writable --tree=dir=files rm dir-co -rf $CMD_PREFIX ostree --repo=repo checkout -U -H -M content-with-dir-world-writable dir-co assert_file_has_mode dir-co/worldwritable-dir 775 if ! is_bare_user_only_repo repo; then rm dir-co -rf $CMD_PREFIX ostree --repo=repo checkout -U -H content-with-dir-world-writable dir-co assert_file_has_mode dir-co/worldwritable-dir 777 fi rm dir-co -rf echo "ok checkout bareuseronly dir" cd ${test_tmpdir} rm -rf shadow-repo mkdir shadow-repo ostree_repo_init shadow-repo ${CMD_PREFIX} ostree --repo=shadow-repo config set core.parent $(pwd)/repo rm -rf test2-checkout parent_rev_test2=$(${CMD_PREFIX} ostree --repo=repo rev-parse test2) ${CMD_PREFIX} ostree --repo=shadow-repo checkout ${CHECKOUT_U_ARG} "${parent_rev_test2}" test2-checkout echo "ok checkout from shadow repo" cd ${test_tmpdir} if $OSTREE checkout test2 --subpath /enoent 2>err.txt; then assert_not_reached "checking outnonexistent file unexpectedly succeeded!" fi assert_file_has_content err.txt 'No such file or directory' echo "ok subdir enoent" cd ${test_tmpdir} $OSTREE checkout test2 --allow-noent --subpath /enoent 2>/dev/null echo "ok subdir noent" if ! skip_one_without_user_xattrs; then cd ${test_tmpdir} mkdir repo3 ostree_repo_init repo3 --mode=bare-user ${CMD_PREFIX} ostree --repo=repo3 pull-local --remote=aremote repo test2 ${CMD_PREFIX} ostree --repo=repo3 rev-parse aremote/test2 echo "ok pull-local with --remote arg" fi if ! skip_one_without_user_xattrs; then cd ${test_tmpdir} ${CMD_PREFIX} ostree --repo=repo3 prune find repo3/objects -name '*.commit' > objlist-before-prune rm repo3/refs/heads/* repo3/refs/mirrors/* repo3/refs/remotes/* -rf ${CMD_PREFIX} ostree --repo=repo3 prune --refs-only find repo3/objects -name '*.commit' > objlist-after-prune if cmp -s objlist-before-prune objlist-after-prune; then fatal "Prune didn't delete anything!" fi rm repo3 objlist-before-prune objlist-after-prune -rf echo "ok prune" fi cd ${test_tmpdir} rm repo3 -rf ostree_repo_init repo3 --mode=archive ${CMD_PREFIX} ostree --repo=repo3 pull-local --remote=aremote repo test2 rm repo3/refs/remotes -rf mkdir repo3/refs/remotes ${CMD_PREFIX} ostree --repo=repo3 prune --refs-only find repo3/objects -name '*.filez' > file-objects if test -s file-objects; then assert_not_reached "prune didn't delete all objects" fi echo "ok prune in archive deleted everything" cd ${test_tmpdir} rm -rf test2-checkout $OSTREE checkout test2 test2-checkout (cd test2-checkout && $OSTREE commit ${COMMIT_ARGS} --link-checkout-speedup -b test2 -s "tmp") echo "ok commit with link speedup" cd ${test_tmpdir} $OSTREE ls test2 echo "ok ls with no argument" cd ${test_tmpdir} if $OSTREE ls test2 /baz/cow/notadir 2>errmsg; then assert_not_reached fi assert_file_has_content errmsg "Not a directory" echo "ok ls of not a directory" cd ${test_tmpdir} $OSTREE show test2 echo "ok show with non-checksum" cd $test_tmpdir/checkout-test2 checksum=$($OSTREE commit ${COMMIT_ARGS} -b test4 -s "Third commit") cd ${test_tmpdir} $OSTREE show test4 > show-output assert_file_has_content show-output "Third commit" assert_file_has_content show-output "commit $checksum" echo "ok show full output" cd $test_tmpdir/checkout-test2 checksum1=$($OSTREE commit ${COMMIT_ARGS} -b test5 -s "First commit") checksum2=$($OSTREE commit ${COMMIT_ARGS} -b test5 -s "Second commit") cd ${test_tmpdir} $OSTREE log test5 > log-output assert_file_has_content log-output "First commit" assert_file_has_content log-output "commit $checksum1" assert_file_has_content log-output "Second commit" assert_file_has_content log-output "commit $checksum2" echo "ok log output" cd $test_tmpdir/checkout-test2 checksum1=$($OSTREE commit ${COMMIT_ARGS} -b test6 -s "First commit") checksum2=$($OSTREE commit ${COMMIT_ARGS} -b test6 -s "Second commit") cd ${test_tmpdir} $OSTREE show test6 > show-output assert_file_has_content show-output "commit $checksum2" $OSTREE reset test6 $checksum1 $OSTREE show test6 > show-output assert_file_has_content show-output "commit $checksum1" echo "ok basic reset" cd ${test_tmpdir} rm checkout-test2 -rf $OSTREE checkout test2 checkout-test2 touch checkout-test2/sometestfile $OSTREE commit ${COMMIT_ARGS} -s sometest -b test2 checkout-test2 echo "ok commit with directory filename" cd $test_tmpdir/checkout-test2 $OSTREE commit ${COMMIT_ARGS} -b test2 -s "Metadata string" --add-metadata-string=FOO=BAR --add-metadata-string=KITTENS=CUTE --add-detached-metadata-string=SIGNATURE=HANCOCK --tree=ref=test2 cd ${test_tmpdir} $OSTREE show --print-metadata-key=FOO test2 > test2-meta assert_file_has_content test2-meta "BAR" $OSTREE show --print-metadata-key=KITTENS test2 > test2-meta assert_file_has_content test2-meta "CUTE" $OSTREE show --print-detached-metadata-key=SIGNATURE test2 > test2-meta assert_file_has_content test2-meta "HANCOCK" echo "ok metadata commit with strings" if ! skip_one_without_user_xattrs; then cd ${test_tmpdir} rm repo2 -rf mkdir repo2 ostree_repo_init repo2 --mode=bare-user ${CMD_PREFIX} ostree --repo=repo2 pull-local repo ${CMD_PREFIX} ostree --repo=repo2 show --print-detached-metadata-key=SIGNATURE test2 > test2-meta assert_file_has_content test2-meta "HANCOCK" echo "ok pull-local after commit metadata" fi cd ${test_tmpdir} ${CMD_PREFIX} ostree --repo=repo remote --set=tls-permissive=true add aremote http://remote.example.com/repo testos/buildmaster/x86_64-runtime assert_file_has_content repo/config 'tls-permissive=true' assert_file_has_content repo/config 'remote\.example\.com' echo "ok remote add with set" cd ${test_tmpdir} ${CMD_PREFIX} ostree --repo=repo remote show-url aremote > aremote-url.txt assert_file_has_content aremote-url.txt 'http.*remote\.example\.com/repo' echo "ok remote show-url" cd ${test_tmpdir} rm -rf test2-checkout if grep bare-user repo/config; then $OSTREE checkout -U test2 test2-checkout else $OSTREE checkout test2 test2-checkout fi stat '--format=%Y' test2-checkout/baz/cow > cow-mtime assert_file_has_content cow-mtime 0 stat '--format=%Y' test2-checkout/baz/deeper > deeper-mtime assert_file_has_content deeper-mtime 0 echo "ok content mtime" cd ${test_tmpdir} rm -rf test2-checkout mkdir -p test2-checkout cd test2-checkout mkfifo afifo if $OSTREE commit ${COMMIT_ARGS} -b test2 -s "Attempt to commit a FIFO" 2>../errmsg; then assert_not_reached "Committing a FIFO unexpetedly succeeded!" assert_file_has_content ../errmsg "Unsupported file type" fi echo "ok commit of fifo was rejected" cd ${test_tmpdir} rm repo2 -rf mkdir repo2 ostree_repo_init repo2 --mode=archive ${CMD_PREFIX} ostree --repo=repo2 pull-local repo rm -rf test2-checkout ${CMD_PREFIX} ostree --repo=repo2 checkout -U --disable-cache test2 test2-checkout if test -d repo2/uncompressed-objects-cache; then ls repo2/uncompressed-objects-cache > ls.txt if test -s ls.txt; then assert_not_reached "repo has uncompressed objects" fi fi rm test2-checkout -rf ${CMD_PREFIX} ostree --repo=repo2 checkout -U test2 test2-checkout assert_file_has_content test2-checkout/baz/cow moo assert_has_dir repo2/uncompressed-objects-cache ls repo2/uncompressed-objects-cache > ls.txt if ! test -s ls.txt; then assert_not_reached "repo didn't cache uncompressed objects" fi # we're in archive mode, but the repo we pull-local from might be # bare-user-only, in which case, we skip these checks since bare-user-only # doesn't store permission bits if ! is_bare_user_only_repo repo; then assert_file_has_mode test2-checkout/baz/cowro 600 assert_file_has_mode test2-checkout/baz/deeper/ohyeahx 755 fi echo "ok disable cache checkout" cd ${test_tmpdir} rm checkout-test2 -rf $OSTREE checkout test2 checkout-test2 date > checkout-test2/date.txt rm repo/tmp/* -rf export TEST_BOOTID=3072029c-8b10-60d1-d31b-8422eeff9b42 if env OSTREE_REPO_TEST_ERROR=pre-commit OSTREE_BOOTID=${TEST_BOOTID} \ $OSTREE commit ${COMMIT_ARGS} -b test2 -s '' $test_tmpdir/checkout-test2 2>err.txt; then assert_not_reached "Should have hit OSTREE_REPO_TEST_ERROR_PRE_COMMIT" fi assert_file_has_content err.txt OSTREE_REPO_TEST_ERROR_PRE_COMMIT found_staging=0 for d in $(find repo/tmp/ -maxdepth 1 -type d); do bn=$(basename $d) if test ${bn##staging-} != ${bn}; then assert_str_match "${bn}" "^staging-${TEST_BOOTID}-" found_staging=1 fi done assert_streq "${found_staging}" 1 echo "ok test error pre commit/bootid" # Whiteouts cd ${test_tmpdir} mkdir -p overlay/baz/ if touch overlay/baz/.wh.cow && touch overlay/.wh.deeper; then touch overlay/anewfile mkdir overlay/anewdir/ touch overlay/anewdir/blah $OSTREE --repo=repo commit ${COMMIT_ARGS} -b overlay -s 'overlay' --tree=dir=overlay rm overlay -rf for branch in test2 overlay; do $OSTREE --repo=repo checkout --union --whiteouts ${branch} overlay-co done for f in .wh.deeper baz/cow baz/.wh.cow; do assert_not_has_file overlay-co/${f} done assert_not_has_dir overlay-co/deeper assert_has_file overlay-co/anewdir/blah assert_has_file overlay-co/anewfile echo "ok whiteouts enabled" # Now double check whiteouts are not processed without --whiteouts rm overlay-co -rf for branch in test2 overlay; do $OSTREE --repo=repo checkout --union ${branch} overlay-co done for f in .wh.deeper baz/cow baz/.wh.cow; do assert_has_file overlay-co/${f} done assert_not_has_dir overlay-co/deeper assert_has_file overlay-co/anewdir/blah assert_has_file overlay-co/anewfile echo "ok whiteouts disabled" else echo "ok # SKIP whiteouts do not work, are you using aufs?" echo "ok # SKIP whiteouts do not work, are you using aufs?" fi cd ${test_tmpdir} rm -rf test2-checkout mkdir -p test2-checkout cd test2-checkout touch should-not-be-fsynced $OSTREE commit ${COMMIT_ARGS} -b test2 -s "Unfsynced commit" --fsync=false # Run this test only as non-root user. When run as root, the chmod # won't have any effect. if test "$(id -u)" != "0"; then cd ${test_tmpdir} rm -f expected-fail error-message $OSTREE init --mode=archive --repo=repo-noperm chmod -w repo-noperm/objects $OSTREE --repo=repo-noperm pull-local repo 2> error-message || touch expected-fail chmod +w repo-noperm/objects assert_has_file expected-fail assert_file_has_content error-message "Permission denied" echo "ok unwritable repo was caught" else echo "ok # SKIP not run when root" fi cd ${test_tmpdir} rm -rf test2-checkout mkdir -p test2-checkout cd test2-checkout touch blah stat --printf="%.Y\n" ${test_tmpdir}/repo > ${test_tmpdir}/timestamp-orig.txt $OSTREE commit ${COMMIT_ARGS} -b test2 -s "Should bump the mtime" stat --printf="%.Y\n" ${test_tmpdir}/repo > ${test_tmpdir}/timestamp-new.txt cd .. if cmp timestamp-{orig,new}.txt; then assert_not_reached "failed to update mtime on repo" fi echo "ok mtime updated" cd ${test_tmpdir} $OSTREE init --mode=bare --repo=repo-extensions assert_has_dir repo-extensions/extensions echo "ok extensions dir"