2011-01-07 00:09:49 +00:00
|
|
|
{- git-annex test suite
|
|
|
|
-
|
2013-02-27 19:35:07 +00:00
|
|
|
- Copyright 2010-2013 Joey Hess <joey@kitenet.net>
|
2011-01-07 00:09:49 +00:00
|
|
|
-
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
-}
|
|
|
|
|
2013-05-17 20:45:44 +00:00
|
|
|
{-# LANGUAGE CPP #-}
|
|
|
|
|
2013-02-27 19:35:07 +00:00
|
|
|
module Test where
|
|
|
|
|
2013-08-06 04:12:06 +00:00
|
|
|
import Test.Tasty
|
|
|
|
import Test.Tasty.Runners
|
|
|
|
import Test.Tasty.HUnit
|
|
|
|
import Test.Tasty.QuickCheck
|
2014-01-27 18:22:44 +00:00
|
|
|
import Test.Tasty.Ingredients.Rerun
|
2014-01-21 18:24:30 +00:00
|
|
|
import Data.Monoid
|
2011-04-25 19:28:41 +00:00
|
|
|
|
2014-01-21 04:08:43 +00:00
|
|
|
import Options.Applicative hiding (command)
|
2012-02-03 20:57:07 +00:00
|
|
|
import Control.Exception.Extensible
|
2011-01-12 05:58:23 +00:00
|
|
|
import qualified Data.Map as M
|
2011-02-09 04:12:45 +00:00
|
|
|
import System.IO.HVFS (SystemFS(..))
|
2013-02-28 03:21:43 +00:00
|
|
|
import qualified Text.JSON
|
2013-05-12 23:13:38 +00:00
|
|
|
import System.Path
|
2014-02-07 00:33:30 +00:00
|
|
|
import qualified Data.ByteString.Lazy as L
|
2010-11-02 21:08:16 +00:00
|
|
|
|
2011-10-04 02:24:57 +00:00
|
|
|
import Common
|
2011-08-22 20:14:12 +00:00
|
|
|
|
2011-10-04 02:24:57 +00:00
|
|
|
import qualified Utility.SafeCommand
|
2011-01-11 19:43:29 +00:00
|
|
|
import qualified Annex
|
2011-10-15 21:47:03 +00:00
|
|
|
import qualified Annex.UUID
|
2011-01-11 19:43:29 +00:00
|
|
|
import qualified Backend
|
2012-05-18 22:20:53 +00:00
|
|
|
import qualified Git.CurrentRepo
|
2011-12-13 19:22:43 +00:00
|
|
|
import qualified Git.Filename
|
2014-02-07 00:33:30 +00:00
|
|
|
import qualified Git.Types
|
2011-01-07 00:26:57 +00:00
|
|
|
import qualified Locations
|
2012-06-21 17:04:24 +00:00
|
|
|
import qualified Types.KeySource
|
2011-06-14 01:51:52 +00:00
|
|
|
import qualified Types.Backend
|
2012-12-20 03:43:15 +00:00
|
|
|
import qualified Types.TrustLevel
|
2011-01-26 01:49:04 +00:00
|
|
|
import qualified Types
|
2013-11-14 21:03:49 +00:00
|
|
|
import qualified Logs
|
2011-10-15 20:21:08 +00:00
|
|
|
import qualified Logs.UUIDBased
|
|
|
|
import qualified Logs.Trust
|
|
|
|
import qualified Logs.Remote
|
2012-05-06 00:11:08 +00:00
|
|
|
import qualified Logs.Unused
|
2012-12-19 20:15:39 +00:00
|
|
|
import qualified Logs.Transfer
|
2012-12-20 02:14:12 +00:00
|
|
|
import qualified Logs.Presence
|
2014-02-12 21:54:28 +00:00
|
|
|
import qualified Types.MetaData
|
2011-03-27 20:58:28 +00:00
|
|
|
import qualified Remote
|
2011-06-14 01:51:52 +00:00
|
|
|
import qualified Types.Key
|
2012-04-30 17:59:05 +00:00
|
|
|
import qualified Types.Messages
|
2013-05-15 21:44:30 +00:00
|
|
|
import qualified Config
|
2013-03-13 20:16:01 +00:00
|
|
|
import qualified Config.Cost
|
2011-04-21 20:56:24 +00:00
|
|
|
import qualified Crypto
|
2014-01-26 20:36:31 +00:00
|
|
|
import qualified Annex.Init
|
2014-02-07 00:33:30 +00:00
|
|
|
import qualified Annex.CatFile
|
2011-08-22 20:14:12 +00:00
|
|
|
import qualified Utility.Path
|
2011-09-28 19:17:45 +00:00
|
|
|
import qualified Utility.FileMode
|
2011-12-21 03:20:36 +00:00
|
|
|
import qualified Build.SysConfig
|
2011-12-23 00:14:35 +00:00
|
|
|
import qualified Utility.Format
|
2012-09-08 03:23:52 +00:00
|
|
|
import qualified Utility.Verifiable
|
2012-10-11 17:45:09 +00:00
|
|
|
import qualified Utility.Process
|
2012-10-16 02:22:40 +00:00
|
|
|
import qualified Utility.Misc
|
2013-02-14 20:17:40 +00:00
|
|
|
import qualified Utility.InodeCache
|
2013-05-11 22:23:41 +00:00
|
|
|
import qualified Utility.Env
|
2013-05-25 01:33:54 +00:00
|
|
|
import qualified Utility.Matcher
|
2013-05-25 17:51:36 +00:00
|
|
|
import qualified Utility.Exception
|
2013-11-14 21:03:49 +00:00
|
|
|
import qualified Utility.Hash
|
|
|
|
import qualified Utility.Scheduled
|
|
|
|
import qualified Utility.HumanTime
|
2014-02-03 15:38:20 +00:00
|
|
|
import qualified Utility.ThreadScheduler
|
2013-08-04 17:07:55 +00:00
|
|
|
#ifndef mingw32_HOST_OS
|
2014-01-26 20:25:55 +00:00
|
|
|
import qualified CmdLine.GitAnnex as GitAnnex
|
2013-11-14 21:03:49 +00:00
|
|
|
import qualified Remote.Helper.Encryptable
|
|
|
|
import qualified Types.Crypto
|
|
|
|
import qualified Utility.Gpg
|
2013-05-17 20:51:46 +00:00
|
|
|
#endif
|
2010-11-02 20:49:35 +00:00
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
type TestEnv = M.Map String String
|
|
|
|
|
2014-01-21 04:08:43 +00:00
|
|
|
main :: [String] -> IO ()
|
|
|
|
main ps = do
|
2013-08-06 04:12:06 +00:00
|
|
|
let tests = testGroup "Tests"
|
2014-01-21 18:04:50 +00:00
|
|
|
-- Test both direct and indirect mode.
|
|
|
|
-- Windows is only going to use direct mode,
|
|
|
|
-- so don't test twice.
|
|
|
|
[ properties
|
|
|
|
#ifndef mingw32_HOST_OS
|
|
|
|
, withTestEnv True $ unitTests "(direct)"
|
|
|
|
, withTestEnv False $ unitTests "(indirect)"
|
2013-06-18 20:35:44 +00:00
|
|
|
#else
|
2014-01-21 18:04:50 +00:00
|
|
|
, withTestEnv False $ unitTests ""
|
2013-06-18 20:35:44 +00:00
|
|
|
#endif
|
2014-01-21 18:04:50 +00:00
|
|
|
]
|
|
|
|
|
2014-01-21 04:08:43 +00:00
|
|
|
-- Can't use tasty's defaultMain because one of the command line
|
|
|
|
-- parameters is "test".
|
|
|
|
let pinfo = info (helper <*> suiteOptionParser ingredients tests)
|
|
|
|
( fullDesc <> header "Builtin test suite" )
|
|
|
|
opts <- either (\f -> error =<< errMessage f "git-annex test") return $
|
|
|
|
execParserPure (prefs idm) pinfo ps
|
|
|
|
case tryIngredients ingredients opts tests of
|
|
|
|
Nothing -> error "No tests found!?"
|
|
|
|
Just act -> ifM act
|
|
|
|
( exitSuccess
|
|
|
|
, do
|
|
|
|
putStrLn " (This could be due to a bug in git-annex, or an incompatability"
|
|
|
|
putStrLn " with utilities, such as git, installed on this system.)"
|
|
|
|
exitFailure
|
|
|
|
)
|
|
|
|
|
|
|
|
ingredients :: [Ingredient]
|
|
|
|
ingredients =
|
2014-01-27 18:22:44 +00:00
|
|
|
[ rerunningTests [consoleTestReporter]
|
2014-01-21 04:08:43 +00:00
|
|
|
, listingTests
|
|
|
|
]
|
2013-08-06 04:12:06 +00:00
|
|
|
|
|
|
|
properties :: TestTree
|
2014-01-21 18:04:50 +00:00
|
|
|
properties = localOption (QuickCheckTests 1000) $ testGroup "QuickCheck"
|
2013-08-06 04:12:06 +00:00
|
|
|
[ testProperty "prop_idempotent_deencode_git" Git.Filename.prop_idempotent_deencode
|
|
|
|
, testProperty "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode
|
|
|
|
, testProperty "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey
|
|
|
|
, testProperty "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode
|
2013-11-14 21:03:49 +00:00
|
|
|
, testProperty "prop_idempotent_key_decode" Types.Key.prop_idempotent_key_decode
|
2013-08-06 04:12:06 +00:00
|
|
|
, testProperty "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape
|
|
|
|
, testProperty "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword
|
2013-11-14 21:03:49 +00:00
|
|
|
, testProperty "prop_logs_sane" Logs.prop_logs_sane
|
2013-08-06 04:12:06 +00:00
|
|
|
, testProperty "prop_idempotent_configEscape" Logs.Remote.prop_idempotent_configEscape
|
|
|
|
, testProperty "prop_parse_show_Config" Logs.Remote.prop_parse_show_Config
|
|
|
|
, testProperty "prop_parentDir_basics" Utility.Path.prop_parentDir_basics
|
|
|
|
, testProperty "prop_relPathDirToFile_basics" Utility.Path.prop_relPathDirToFile_basics
|
|
|
|
, testProperty "prop_relPathDirToFile_regressionTest" Utility.Path.prop_relPathDirToFile_regressionTest
|
|
|
|
, testProperty "prop_cost_sane" Config.Cost.prop_cost_sane
|
|
|
|
, testProperty "prop_matcher_sane" Utility.Matcher.prop_matcher_sane
|
|
|
|
, testProperty "prop_HmacSha1WithCipher_sane" Crypto.prop_HmacSha1WithCipher_sane
|
|
|
|
, testProperty "prop_TimeStamp_sane" Logs.UUIDBased.prop_TimeStamp_sane
|
|
|
|
, testProperty "prop_addLog_sane" Logs.UUIDBased.prop_addLog_sane
|
|
|
|
, testProperty "prop_verifiable_sane" Utility.Verifiable.prop_verifiable_sane
|
|
|
|
, testProperty "prop_segment_regressionTest" Utility.Misc.prop_segment_regressionTest
|
|
|
|
, testProperty "prop_read_write_transferinfo" Logs.Transfer.prop_read_write_transferinfo
|
|
|
|
, testProperty "prop_read_show_inodecache" Utility.InodeCache.prop_read_show_inodecache
|
|
|
|
, testProperty "prop_parse_show_log" Logs.Presence.prop_parse_show_log
|
|
|
|
, testProperty "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel
|
|
|
|
, testProperty "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog
|
2013-11-14 21:03:49 +00:00
|
|
|
, testProperty "prop_hashes_stable" Utility.Hash.prop_hashes_stable
|
|
|
|
, testProperty "prop_schedule_roundtrips" Utility.Scheduled.prop_schedule_roundtrips
|
|
|
|
, testProperty "prop_duration_roundtrips" Utility.HumanTime.prop_duration_roundtrips
|
2014-02-12 21:54:28 +00:00
|
|
|
, testProperty "prop_updateMetaData_sane" Types.MetaData.prop_updateMetaData_sane
|
|
|
|
, testProperty "prop_metadata_serialize" Types.MetaData.prop_metadata_serialize
|
2010-11-02 21:08:16 +00:00
|
|
|
]
|
|
|
|
|
2014-01-21 18:24:30 +00:00
|
|
|
{- These tests set up the test environment, but also test some basic parts
|
|
|
|
- of git-annex. They are always run before the unitTests. -}
|
|
|
|
initTests :: TestEnv -> TestTree
|
2014-02-11 05:35:11 +00:00
|
|
|
initTests env = testGroup "Init Tests"
|
2013-02-28 05:21:22 +00:00
|
|
|
[ check "init" test_init
|
|
|
|
, check "add" test_add
|
2014-01-21 18:24:30 +00:00
|
|
|
]
|
|
|
|
where
|
|
|
|
check desc t = testCase desc (t env)
|
|
|
|
|
|
|
|
unitTests :: String -> IO TestEnv -> TestTree
|
|
|
|
unitTests note getenv = testGroup ("Unit Tests " ++ note)
|
|
|
|
[ check "add sha1dup" test_add_sha1dup
|
|
|
|
, check "add extras" test_add_extras
|
2013-02-28 05:21:22 +00:00
|
|
|
, check "reinject" test_reinject
|
2013-11-14 21:03:49 +00:00
|
|
|
, check "unannex (no copy)" test_unannex_nocopy
|
|
|
|
, check "unannex (with copy)" test_unannex_withcopy
|
|
|
|
, check "drop (no remote)" test_drop_noremote
|
|
|
|
, check "drop (with remote)" test_drop_withremote
|
|
|
|
, check "drop (untrusted remote)" test_drop_untrustedremote
|
2013-02-28 05:21:22 +00:00
|
|
|
, check "get" test_get
|
|
|
|
, check "move" test_move
|
|
|
|
, check "copy" test_copy
|
|
|
|
, check "lock" test_lock
|
2013-11-14 21:03:49 +00:00
|
|
|
, check "edit (no pre-commit)" test_edit
|
|
|
|
, check "edit (pre-commit)" test_edit_precommit
|
2013-02-28 05:21:22 +00:00
|
|
|
, check "fix" test_fix
|
|
|
|
, check "trust" test_trust
|
2013-11-14 21:03:49 +00:00
|
|
|
, check "fsck (basics)" test_fsck_basic
|
|
|
|
, check "fsck (bare)" test_fsck_bare
|
|
|
|
, check "fsck (local untrusted)" test_fsck_localuntrusted
|
|
|
|
, check "fsck (remote untrusted)" test_fsck_remoteuntrusted
|
2013-02-28 05:21:22 +00:00
|
|
|
, check "migrate" test_migrate
|
2013-11-14 21:03:49 +00:00
|
|
|
, check "migrate (via gitattributes)" test_migrate_via_gitattributes
|
2013-02-28 05:21:22 +00:00
|
|
|
, check" unused" test_unused
|
|
|
|
, check "describe" test_describe
|
|
|
|
, check "find" test_find
|
|
|
|
, check "merge" test_merge
|
2013-11-14 21:03:49 +00:00
|
|
|
, check "info" test_info
|
2013-02-28 05:21:22 +00:00
|
|
|
, check "version" test_version
|
|
|
|
, check "sync" test_sync
|
2013-05-20 19:51:40 +00:00
|
|
|
, check "union merge regression" test_union_merge_regression
|
2013-11-15 00:09:47 +00:00
|
|
|
, check "conflict resolution" test_conflict_resolution_movein_bug
|
2013-11-14 21:03:49 +00:00
|
|
|
, check "conflict_resolution (mixed directory and file)" test_mixed_conflict_resolution
|
2014-02-04 19:31:53 +00:00
|
|
|
, check "conflict_resolution (mixed directory and file) 2" test_mixed_conflict_resolution2
|
2013-02-28 05:21:22 +00:00
|
|
|
, check "map" test_map
|
|
|
|
, check "uninit" test_uninit
|
2013-11-14 21:03:49 +00:00
|
|
|
, check "uninit (in git-annex branch)" test_uninit_inbranch
|
2013-02-28 05:21:22 +00:00
|
|
|
, check "upgrade" test_upgrade
|
|
|
|
, check "whereis" test_whereis
|
|
|
|
, check "hook remote" test_hook_remote
|
|
|
|
, check "directory remote" test_directory_remote
|
|
|
|
, check "rsync remote" test_rsync_remote
|
|
|
|
, check "bup remote" test_bup_remote
|
|
|
|
, check "crypto" test_crypto
|
2013-05-25 17:51:36 +00:00
|
|
|
, check "preferred content" test_preferred_content
|
2014-02-07 00:33:30 +00:00
|
|
|
, check "add subdirs" test_add_subdirs
|
2011-01-07 00:09:49 +00:00
|
|
|
]
|
2013-02-28 05:21:22 +00:00
|
|
|
where
|
2014-01-21 18:04:50 +00:00
|
|
|
check desc t = testCase desc (getenv >>= t)
|
2011-01-07 00:09:49 +00:00
|
|
|
|
2014-01-21 18:24:30 +00:00
|
|
|
-- this test case create the main repo
|
2013-08-06 04:12:06 +00:00
|
|
|
test_init :: TestEnv -> Assertion
|
|
|
|
test_init env = innewrepo env $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "init" [reponame] @? "init failed"
|
2013-05-20 18:09:50 +00:00
|
|
|
handleforcedirect env
|
2012-11-11 04:51:07 +00:00
|
|
|
where
|
|
|
|
reponame = "test repo"
|
2011-01-07 00:09:49 +00:00
|
|
|
|
2013-08-06 04:12:06 +00:00
|
|
|
-- this test case runs in the main repo, to set up a basic
|
|
|
|
-- annexed file that later tests will use
|
|
|
|
test_add :: TestEnv -> Assertion
|
|
|
|
test_add env = inmainrepo env $ do
|
|
|
|
writeFile annexedfile $ content annexedfile
|
|
|
|
git_annex env "add" [annexedfile] @? "add failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
writeFile sha1annexedfile $ content sha1annexedfile
|
|
|
|
git_annex env "add" [sha1annexedfile, "--backend=SHA1"] @? "add with SHA1 failed"
|
|
|
|
annexed_present sha1annexedfile
|
|
|
|
checkbackend sha1annexedfile backendSHA1
|
2013-11-14 21:03:49 +00:00
|
|
|
ifM (annexeval Config.isDirect)
|
|
|
|
( do
|
|
|
|
writeFile ingitfile $ content ingitfile
|
|
|
|
not <$> boolSystem "git" [Param "add", File ingitfile] @? "git add failed to fail in direct mode"
|
2014-02-10 22:29:15 +00:00
|
|
|
nukeFile ingitfile
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "sync" [] @? "sync failed"
|
|
|
|
, do
|
|
|
|
writeFile ingitfile $ content ingitfile
|
|
|
|
boolSystem "git" [Param "add", File ingitfile] @? "git add failed"
|
|
|
|
boolSystem "git" [Params "commit -q -m commit"] @? "git commit failed"
|
|
|
|
git_annex env "add" [ingitfile] @? "add ingitfile should be no-op"
|
|
|
|
unannexed ingitfile
|
|
|
|
)
|
2013-08-06 04:12:06 +00:00
|
|
|
|
|
|
|
test_add_sha1dup :: TestEnv -> Assertion
|
|
|
|
test_add_sha1dup env = intmpclonerepo env $ do
|
|
|
|
writeFile sha1annexedfiledup $ content sha1annexedfiledup
|
|
|
|
git_annex env "add" [sha1annexedfiledup, "--backend=SHA1"] @? "add of second file with same SHA1 failed"
|
|
|
|
annexed_present sha1annexedfiledup
|
|
|
|
annexed_present sha1annexedfile
|
|
|
|
|
2014-01-21 18:24:30 +00:00
|
|
|
test_add_extras :: TestEnv -> Assertion
|
|
|
|
test_add_extras env = intmpclonerepo env $ do
|
|
|
|
writeFile wormannexedfile $ content wormannexedfile
|
|
|
|
git_annex env "add" [wormannexedfile, "--backend=WORM"] @? "add with WORM failed"
|
|
|
|
annexed_present wormannexedfile
|
|
|
|
checkbackend wormannexedfile backendWORM
|
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_reinject :: TestEnv -> Assertion
|
|
|
|
test_reinject env = intmpclonerepoInDirect env $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "drop" ["--force", sha1annexedfile] @? "drop failed"
|
2011-01-11 23:59:11 +00:00
|
|
|
writeFile tmp $ content sha1annexedfile
|
2014-02-11 05:35:11 +00:00
|
|
|
r <- annexeval $ Types.Backend.getKey backendSHA1
|
2013-02-15 20:06:22 +00:00
|
|
|
Types.KeySource.KeySource { Types.KeySource.keyFilename = tmp, Types.KeySource.contentLocation = tmp, Types.KeySource.inodeCache = Nothing }
|
2012-08-08 20:06:01 +00:00
|
|
|
let key = Types.Key.key2file $ fromJust r
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "reinject" [tmp, sha1annexedfile] @? "reinject failed"
|
2013-05-15 23:58:40 +00:00
|
|
|
git_annex env "fromkey" [key, sha1annexedfiledup] @? "fromkey failed for dup"
|
2011-10-31 16:47:13 +00:00
|
|
|
annexed_present sha1annexedfiledup
|
2012-11-11 04:51:07 +00:00
|
|
|
where
|
|
|
|
tmp = "tmpfile"
|
2011-01-11 23:59:11 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_unannex_nocopy :: TestEnv -> Assertion
|
|
|
|
test_unannex_nocopy env = intmpclonerepo env $ do
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
git_annex env "unannex" [annexedfile] @? "unannex failed with no copy"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
|
|
|
|
test_unannex_withcopy :: TestEnv -> Assertion
|
|
|
|
test_unannex_withcopy env = intmpclonerepo env $ do
|
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
git_annex env "unannex" [annexedfile, sha1annexedfile] @? "unannex failed"
|
|
|
|
unannexed annexedfile
|
|
|
|
git_annex env "unannex" [annexedfile] @? "unannex failed on non-annexed file"
|
|
|
|
unannexed annexedfile
|
|
|
|
unlessM (annexeval Config.isDirect) $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "unannex" [ingitfile] @? "unannex ingitfile should be no-op"
|
2012-11-11 04:51:07 +00:00
|
|
|
unannexed ingitfile
|
2011-01-07 01:39:26 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_drop_noremote :: TestEnv -> Assertion
|
|
|
|
test_drop_noremote env = intmpclonerepo env $ do
|
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
|
|
|
boolSystem "git" [Params "remote rm origin"]
|
|
|
|
@? "git remote rm origin failed"
|
|
|
|
not <$> git_annex env "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of file"
|
|
|
|
annexed_present annexedfile
|
|
|
|
git_annex env "drop" ["--force", annexedfile] @? "drop --force failed"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
git_annex env "drop" [annexedfile] @? "drop of dropped file failed"
|
|
|
|
unlessM (annexeval Config.isDirect) $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "drop" [ingitfile] @? "drop ingitfile should be no-op"
|
2012-11-11 04:51:07 +00:00
|
|
|
unannexed ingitfile
|
2013-11-14 21:03:49 +00:00
|
|
|
|
|
|
|
test_drop_withremote :: TestEnv -> Assertion
|
|
|
|
test_drop_withremote env = intmpclonerepo env $ do
|
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
|
|
|
annexed_present annexedfile
|
2014-01-20 20:47:56 +00:00
|
|
|
git_annex env "numcopies" ["2"] @? "numcopies config failed"
|
|
|
|
not <$> git_annex env "drop" [annexedfile] @? "drop succeeded although numcopies is not satisfied"
|
|
|
|
git_annex env "numcopies" ["1"] @? "numcopies config failed"
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "drop" [annexedfile] @? "drop failed though origin has copy"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
inmainrepo env $ annexed_present annexedfile
|
|
|
|
|
|
|
|
test_drop_untrustedremote :: TestEnv -> Assertion
|
2013-11-15 00:09:47 +00:00
|
|
|
test_drop_untrustedremote env = intmpclonerepo env $ do
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "untrust" ["origin"] @? "untrust of origin failed"
|
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
not <$> git_annex env "drop" [annexedfile] @? "drop wrongly suceeded with only an untrusted copy of the file"
|
|
|
|
annexed_present annexedfile
|
|
|
|
inmainrepo env $ annexed_present annexedfile
|
|
|
|
|
|
|
|
test_get :: TestEnv -> Assertion
|
|
|
|
test_get env = intmpclonerepo env $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_present annexedfile
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
|
|
|
inmainrepo env $ annexed_present annexedfile
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file already here failed"
|
|
|
|
inmainrepo env $ annexed_present annexedfile
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-11-14 21:03:49 +00:00
|
|
|
unlessM (annexeval Config.isDirect) $ do
|
|
|
|
inmainrepo env $ unannexed ingitfile
|
|
|
|
unannexed ingitfile
|
|
|
|
git_annex env "get" [ingitfile] @? "get ingitfile should be no-op"
|
|
|
|
inmainrepo env $ unannexed ingitfile
|
|
|
|
unannexed ingitfile
|
2011-01-07 05:02:06 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_move :: TestEnv -> Assertion
|
|
|
|
test_move env = intmpclonerepo env $ do
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_present annexedfile
|
|
|
|
git_annex env "move" ["--from", "origin", annexedfile] @? "move --from of file failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_notpresent annexedfile
|
|
|
|
git_annex env "move" ["--from", "origin", annexedfile] @? "move --from of file already here failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_notpresent annexedfile
|
|
|
|
git_annex env "move" ["--to", "origin", annexedfile] @? "move --to of file failed"
|
|
|
|
inmainrepo env $ annexed_present annexedfile
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "move" ["--to", "origin", annexedfile] @? "move --to of file already there failed"
|
|
|
|
inmainrepo env $ annexed_present annexedfile
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-11-14 21:03:49 +00:00
|
|
|
unlessM (annexeval Config.isDirect) $ do
|
|
|
|
unannexed ingitfile
|
|
|
|
inmainrepo env $ unannexed ingitfile
|
|
|
|
git_annex env "move" ["--to", "origin", ingitfile] @? "move of ingitfile should be no-op"
|
|
|
|
unannexed ingitfile
|
|
|
|
inmainrepo env $ unannexed ingitfile
|
|
|
|
git_annex env "move" ["--from", "origin", ingitfile] @? "move of ingitfile should be no-op"
|
|
|
|
unannexed ingitfile
|
|
|
|
inmainrepo env $ unannexed ingitfile
|
|
|
|
|
|
|
|
test_copy :: TestEnv -> Assertion
|
|
|
|
test_copy env = intmpclonerepo env $ do
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_present annexedfile
|
|
|
|
git_annex env "copy" ["--from", "origin", annexedfile] @? "copy --from of file failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_present annexedfile
|
|
|
|
git_annex env "copy" ["--from", "origin", annexedfile] @? "copy --from of file already here failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_present annexedfile
|
|
|
|
git_annex env "copy" ["--to", "origin", annexedfile] @? "copy --to of file already there failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_present annexedfile
|
|
|
|
git_annex env "move" ["--to", "origin", annexedfile] @? "move --to of file already there failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo env $ annexed_present annexedfile
|
2013-11-14 21:03:49 +00:00
|
|
|
unlessM (annexeval Config.isDirect) $ do
|
|
|
|
unannexed ingitfile
|
|
|
|
inmainrepo env $ unannexed ingitfile
|
|
|
|
git_annex env "copy" ["--to", "origin", ingitfile] @? "copy of ingitfile should be no-op"
|
|
|
|
unannexed ingitfile
|
|
|
|
inmainrepo env $ unannexed ingitfile
|
|
|
|
git_annex env "copy" ["--from", "origin", ingitfile] @? "copy of ingitfile should be no-op"
|
|
|
|
checkregularfile ingitfile
|
|
|
|
checkcontent ingitfile
|
|
|
|
|
|
|
|
test_preferred_content :: TestEnv -> Assertion
|
|
|
|
test_preferred_content env = intmpclonerepo env $ do
|
2013-05-25 17:51:36 +00:00
|
|
|
annexed_notpresent annexedfile
|
|
|
|
-- get --auto only looks at numcopies when preferred content is not
|
|
|
|
-- set, and with 1 copy existing, does not get the file.
|
|
|
|
git_annex env "get" ["--auto", annexedfile] @? "get --auto of file failed with default preferred content"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "wanted" [".", "standard"] @? "set expression to standard failed"
|
2013-05-25 17:51:36 +00:00
|
|
|
git_annex env "group" [".", "client"] @? "set group to standard failed"
|
|
|
|
git_annex env "get" ["--auto", annexedfile] @? "get --auto of file failed for client"
|
|
|
|
annexed_present annexedfile
|
|
|
|
git_annex env "ungroup" [".", "client"] @? "ungroup failed"
|
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "wanted" [".", "standard"] @? "set expression to standard failed"
|
2013-05-25 17:51:36 +00:00
|
|
|
git_annex env "group" [".", "manual"] @? "set group to manual failed"
|
|
|
|
-- drop --auto with manual leaves the file where it is
|
|
|
|
git_annex env "drop" ["--auto", annexedfile] @? "drop --auto of file failed with manual preferred content"
|
|
|
|
annexed_present annexedfile
|
|
|
|
git_annex env "drop" [annexedfile] @? "drop of file failed"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
-- get --auto with manual does not get the file
|
|
|
|
git_annex env "get" ["--auto", annexedfile] @? "get --auto of file failed with manual preferred content"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
git_annex env "ungroup" [".", "client"] @? "ungroup failed"
|
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "wanted" [".", "exclude=*"] @? "set expression to exclude=* failed"
|
2013-05-25 17:51:36 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
git_annex env "drop" ["--auto", annexedfile] @? "drop --auto of file failed with exclude=*"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
git_annex env "get" ["--auto", annexedfile] @? "get --auto of file failed with exclude=*"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_lock :: TestEnv -> Assertion
|
|
|
|
test_lock env = intmpclonerepoInDirect env $ do
|
2011-01-14 03:46:02 +00:00
|
|
|
-- regression test: unlock of not present file should skip it
|
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
not <$> git_annex env "unlock" [annexedfile] @? "unlock failed to fail with not present file"
|
2011-01-14 03:46:02 +00:00
|
|
|
annexed_notpresent annexedfile
|
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "unlock" [annexedfile] @? "unlock failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
unannexed annexedfile
|
|
|
|
-- write different content, to verify that lock
|
|
|
|
-- throws it away
|
|
|
|
changecontent annexedfile
|
2011-07-15 07:12:05 +00:00
|
|
|
writeFile annexedfile $ content annexedfile ++ "foo"
|
2013-12-15 17:33:09 +00:00
|
|
|
not <$> git_annex env "lock" [annexedfile] @? "lock failed to fail without --force"
|
2013-12-24 18:02:02 +00:00
|
|
|
git_annex env "lock" ["--force", annexedfile] @? "lock --force failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "unlock" [annexedfile] @? "unlock failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
unannexed annexedfile
|
|
|
|
changecontent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "add" [annexedfile] @? "add of modified file failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
runchecks [checklink, checkunwritable] annexedfile
|
|
|
|
c <- readFile annexedfile
|
2011-07-15 07:12:05 +00:00
|
|
|
assertEqual "content of modified file" c (changedcontent annexedfile)
|
2013-05-15 21:22:45 +00:00
|
|
|
r' <- git_annex env "drop" [annexedfile]
|
2011-01-14 03:46:02 +00:00
|
|
|
not r' @? "drop wrongly succeeded with no known copy of modified file"
|
2011-01-07 18:06:32 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_edit :: TestEnv -> Assertion
|
|
|
|
test_edit = test_edit' False
|
|
|
|
|
|
|
|
test_edit_precommit :: TestEnv -> Assertion
|
|
|
|
test_edit_precommit = test_edit' True
|
|
|
|
|
|
|
|
test_edit' :: Bool -> TestEnv -> Assertion
|
|
|
|
test_edit' precommit env = intmpclonerepoInDirect env $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
2012-11-11 04:51:07 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "edit" [annexedfile] @? "edit failed"
|
2012-11-11 04:51:07 +00:00
|
|
|
unannexed annexedfile
|
|
|
|
changecontent annexedfile
|
2013-05-16 02:10:49 +00:00
|
|
|
boolSystem "git" [Param "add", File annexedfile]
|
|
|
|
@? "git add of edited file failed"
|
2012-11-11 04:51:07 +00:00
|
|
|
if precommit
|
2013-05-16 02:10:49 +00:00
|
|
|
then git_annex env "pre-commit" []
|
|
|
|
@? "pre-commit failed"
|
|
|
|
else boolSystem "git" [Params "commit -q -m contentchanged"]
|
|
|
|
@? "git commit of edited file failed"
|
2012-11-11 04:51:07 +00:00
|
|
|
runchecks [checklink, checkunwritable] annexedfile
|
|
|
|
c <- readFile annexedfile
|
|
|
|
assertEqual "content of modified file" c (changedcontent annexedfile)
|
2013-05-15 21:22:45 +00:00
|
|
|
not <$> git_annex env "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of modified file"
|
2011-01-07 18:06:32 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_fix :: TestEnv -> Assertion
|
|
|
|
test_fix env = intmpclonerepoInDirect env $ do
|
2011-01-07 18:08:43 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "fix" [annexedfile] @? "fix of not present failed"
|
2011-01-07 18:08:43 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "fix" [annexedfile] @? "fix of present file failed"
|
2011-01-07 18:08:43 +00:00
|
|
|
annexed_present annexedfile
|
2011-01-07 18:06:32 +00:00
|
|
|
createDirectory subdir
|
2011-08-22 20:14:12 +00:00
|
|
|
boolSystem "git" [Param "mv", File annexedfile, File subdir]
|
2011-01-07 18:06:32 +00:00
|
|
|
@? "git mv failed"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "fix" [newfile] @? "fix of moved file failed"
|
2011-01-07 18:06:32 +00:00
|
|
|
runchecks [checklink, checkunwritable] newfile
|
|
|
|
c <- readFile newfile
|
2011-07-15 07:12:05 +00:00
|
|
|
assertEqual "content of moved file" c (content annexedfile)
|
2012-11-11 04:51:07 +00:00
|
|
|
where
|
|
|
|
subdir = "s"
|
|
|
|
newfile = subdir ++ "/" ++ annexedfile
|
2011-01-07 01:39:26 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_trust :: TestEnv -> Assertion
|
|
|
|
test_trust env = intmpclonerepo env $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "trust" [repo] @? "trust failed"
|
2011-10-15 20:21:08 +00:00
|
|
|
trustcheck Logs.Trust.Trusted "trusted 1"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "trust" [repo] @? "trust of trusted failed"
|
2011-10-15 20:21:08 +00:00
|
|
|
trustcheck Logs.Trust.Trusted "trusted 2"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "untrust" [repo] @? "untrust failed"
|
2011-10-15 20:21:08 +00:00
|
|
|
trustcheck Logs.Trust.UnTrusted "untrusted 1"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "untrust" [repo] @? "untrust of untrusted failed"
|
2011-10-15 20:21:08 +00:00
|
|
|
trustcheck Logs.Trust.UnTrusted "untrusted 2"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "dead" [repo] @? "dead failed"
|
2011-12-20 20:26:39 +00:00
|
|
|
trustcheck Logs.Trust.DeadTrusted "deadtrusted 1"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "dead" [repo] @? "dead of dead failed"
|
2011-12-20 20:26:39 +00:00
|
|
|
trustcheck Logs.Trust.DeadTrusted "deadtrusted 2"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "semitrust" [repo] @? "semitrust failed"
|
2011-10-15 20:21:08 +00:00
|
|
|
trustcheck Logs.Trust.SemiTrusted "semitrusted 1"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "semitrust" [repo] @? "semitrust of semitrusted failed"
|
2011-10-15 20:21:08 +00:00
|
|
|
trustcheck Logs.Trust.SemiTrusted "semitrusted 2"
|
2012-11-11 04:51:07 +00:00
|
|
|
where
|
|
|
|
repo = "origin"
|
|
|
|
trustcheck expected msg = do
|
|
|
|
present <- annexeval $ do
|
|
|
|
l <- Logs.Trust.trustGet expected
|
|
|
|
u <- Remote.nameToUUID repo
|
|
|
|
return $ u `elem` l
|
|
|
|
assertBool msg present
|
2011-01-11 22:50:18 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_fsck_basic :: TestEnv -> Assertion
|
|
|
|
test_fsck_basic env = intmpclonerepo env $ do
|
|
|
|
git_annex env "fsck" [] @? "fsck failed"
|
2014-01-20 20:47:56 +00:00
|
|
|
git_annex env "numcopies" ["2"] @? "numcopies config failed"
|
2013-11-14 21:03:49 +00:00
|
|
|
fsck_should_fail env "numcopies unsatisfied"
|
2014-01-20 20:47:56 +00:00
|
|
|
git_annex env "numcopies" ["1"] @? "numcopies config failed"
|
2013-11-15 00:09:47 +00:00
|
|
|
corrupt annexedfile
|
|
|
|
corrupt sha1annexedfile
|
2012-11-11 04:51:07 +00:00
|
|
|
where
|
|
|
|
corrupt f = do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [f] @? "get of file failed"
|
2012-11-11 04:51:07 +00:00
|
|
|
Utility.FileMode.allowWrite f
|
|
|
|
writeFile f (changedcontent f)
|
2013-05-17 19:20:21 +00:00
|
|
|
ifM (annexeval Config.isDirect)
|
|
|
|
( git_annex env "fsck" [] @? "fsck failed in direct mode with changed file content"
|
|
|
|
, not <$> git_annex env "fsck" [] @? "fsck failed to fail with corrupted file content"
|
|
|
|
)
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "fsck" [] @? "fsck unexpectedly failed again; previous one did not fix problem with " ++ f
|
2011-01-11 23:34:28 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_fsck_bare :: TestEnv -> Assertion
|
2014-02-11 05:35:11 +00:00
|
|
|
test_fsck_bare env = intmpbareclonerepo env $
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "fsck" [] @? "fsck failed"
|
|
|
|
|
|
|
|
test_fsck_localuntrusted :: TestEnv -> Assertion
|
|
|
|
test_fsck_localuntrusted env = intmpclonerepo env $ do
|
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
|
|
|
git_annex env "untrust" ["origin"] @? "untrust of origin repo failed"
|
|
|
|
git_annex env "untrust" ["."] @? "untrust of current repo failed"
|
|
|
|
fsck_should_fail env "content only available in untrusted (current) repository"
|
|
|
|
git_annex env "trust" ["."] @? "trust of current repo failed"
|
|
|
|
git_annex env "fsck" [annexedfile] @? "fsck failed on file present in trusted repo"
|
|
|
|
|
|
|
|
test_fsck_remoteuntrusted :: TestEnv -> Assertion
|
|
|
|
test_fsck_remoteuntrusted env = intmpclonerepo env $ do
|
2014-01-20 20:47:56 +00:00
|
|
|
git_annex env "numcopies" ["2"] @? "numcopies config failed"
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
|
|
|
git_annex env "get" [sha1annexedfile] @? "get failed"
|
|
|
|
git_annex env "fsck" [] @? "fsck failed with numcopies=2 and 2 copies"
|
|
|
|
git_annex env "untrust" ["origin"] @? "untrust of origin failed"
|
|
|
|
fsck_should_fail env "content not replicated to enough non-untrusted repositories"
|
|
|
|
|
|
|
|
fsck_should_fail :: TestEnv -> String -> Assertion
|
|
|
|
fsck_should_fail env m = not <$> git_annex env "fsck" []
|
|
|
|
@? "fsck failed to fail with " ++ m
|
|
|
|
|
|
|
|
test_migrate :: TestEnv -> Assertion
|
|
|
|
test_migrate = test_migrate' False
|
|
|
|
|
|
|
|
test_migrate_via_gitattributes :: TestEnv -> Assertion
|
|
|
|
test_migrate_via_gitattributes = test_migrate' True
|
|
|
|
|
|
|
|
test_migrate' :: Bool -> TestEnv -> Assertion
|
|
|
|
test_migrate' usegitattributes env = intmpclonerepoInDirect env $ do
|
2012-11-11 04:51:07 +00:00
|
|
|
annexed_notpresent annexedfile
|
|
|
|
annexed_notpresent sha1annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "migrate" [annexedfile] @? "migrate of not present failed"
|
|
|
|
git_annex env "migrate" [sha1annexedfile] @? "migrate of not present failed"
|
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
|
|
|
git_annex env "get" [sha1annexedfile] @? "get of file failed"
|
2012-11-11 04:51:07 +00:00
|
|
|
annexed_present annexedfile
|
|
|
|
annexed_present sha1annexedfile
|
|
|
|
if usegitattributes
|
|
|
|
then do
|
2014-02-11 05:35:11 +00:00
|
|
|
writeFile ".gitattributes" "* annex.backend=SHA1"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "migrate" [sha1annexedfile]
|
2012-11-11 04:51:07 +00:00
|
|
|
@? "migrate sha1annexedfile failed"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "migrate" [annexedfile]
|
2012-11-11 04:51:07 +00:00
|
|
|
@? "migrate annexedfile failed"
|
|
|
|
else do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "migrate" [sha1annexedfile, "--backend", "SHA1"]
|
2012-11-11 04:51:07 +00:00
|
|
|
@? "migrate sha1annexedfile failed"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "migrate" [annexedfile, "--backend", "SHA1"]
|
2012-11-11 04:51:07 +00:00
|
|
|
@? "migrate annexedfile failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
annexed_present sha1annexedfile
|
|
|
|
checkbackend annexedfile backendSHA1
|
|
|
|
checkbackend sha1annexedfile backendSHA1
|
|
|
|
|
|
|
|
-- check that reversing a migration works
|
2014-02-11 05:35:11 +00:00
|
|
|
writeFile ".gitattributes" "* annex.backend=SHA256"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "migrate" [sha1annexedfile]
|
2012-11-11 04:51:07 +00:00
|
|
|
@? "migrate sha1annexedfile failed"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "migrate" [annexedfile]
|
2012-11-11 04:51:07 +00:00
|
|
|
@? "migrate annexedfile failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
annexed_present sha1annexedfile
|
|
|
|
checkbackend annexedfile backendSHA256
|
|
|
|
checkbackend sha1annexedfile backendSHA256
|
2011-01-12 01:11:32 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_unused :: TestEnv -> Assertion
|
2013-05-17 19:16:28 +00:00
|
|
|
-- This test is broken in direct mode
|
2013-11-14 21:03:49 +00:00
|
|
|
test_unused env = intmpclonerepoInDirect env $ do
|
2011-01-12 05:58:23 +00:00
|
|
|
-- keys have to be looked up before files are removed
|
|
|
|
annexedfilekey <- annexeval $ findkey annexedfile
|
|
|
|
sha1annexedfilekey <- annexeval $ findkey sha1annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
|
|
|
git_annex env "get" [sha1annexedfile] @? "get of file failed"
|
2012-09-21 04:49:48 +00:00
|
|
|
checkunused [] "after get"
|
2013-05-17 18:52:12 +00:00
|
|
|
boolSystem "git" [Params "rm -fq", File annexedfile] @? "git rm failed"
|
2012-09-21 04:49:48 +00:00
|
|
|
checkunused [] "after rm"
|
2011-09-30 01:11:48 +00:00
|
|
|
boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed"
|
2012-09-21 04:49:48 +00:00
|
|
|
checkunused [] "after commit"
|
2011-09-28 21:48:11 +00:00
|
|
|
-- unused checks origin/master; once it's gone it is really unused
|
|
|
|
boolSystem "git" [Params "remote rm origin"] @? "git remote rm origin failed"
|
2012-09-21 04:49:48 +00:00
|
|
|
checkunused [annexedfilekey] "after origin branches are gone"
|
2013-05-17 18:52:12 +00:00
|
|
|
boolSystem "git" [Params "rm -fq", File sha1annexedfile] @? "git rm failed"
|
2011-09-30 01:11:48 +00:00
|
|
|
boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed"
|
2012-09-21 04:49:48 +00:00
|
|
|
checkunused [annexedfilekey, sha1annexedfilekey] "after rm sha1annexedfile"
|
2011-01-12 05:58:23 +00:00
|
|
|
|
|
|
|
-- good opportunity to test dropkey also
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "dropkey" ["--force", Types.Key.key2file annexedfilekey]
|
2011-01-12 05:58:23 +00:00
|
|
|
@? "dropkey failed"
|
2012-09-21 04:49:48 +00:00
|
|
|
checkunused [sha1annexedfilekey] ("after dropkey --force " ++ Types.Key.key2file annexedfilekey)
|
2011-01-12 05:58:23 +00:00
|
|
|
|
2013-07-30 18:17:09 +00:00
|
|
|
not <$> git_annex env "dropunused" ["1"] @? "dropunused failed to fail without --force"
|
|
|
|
git_annex env "dropunused" ["--force", "1"] @? "dropunused failed"
|
2012-09-21 04:49:48 +00:00
|
|
|
checkunused [] "after dropunused"
|
2013-07-30 18:17:09 +00:00
|
|
|
not <$> git_annex env "dropunused" ["--force", "10", "501"] @? "dropunused failed to fail on bogus numbers"
|
2011-01-12 05:58:23 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
-- unused used to miss symlinks that were not staged and pointed
|
|
|
|
-- at annexed content, and think that content was unused
|
|
|
|
writeFile "unusedfile" "unusedcontent"
|
|
|
|
git_annex env "add" ["unusedfile"] @? "add of unusedfile failed"
|
|
|
|
unusedfilekey <- annexeval $ findkey "unusedfile"
|
|
|
|
renameFile "unusedfile" "unusedunstagedfile"
|
|
|
|
boolSystem "git" [Params "rm -qf", File "unusedfile"] @? "git rm failed"
|
|
|
|
checkunused [] "with unstaged link"
|
|
|
|
removeFile "unusedunstagedfile"
|
|
|
|
checkunused [unusedfilekey] "with unstaged link deleted"
|
|
|
|
|
|
|
|
-- unused used to miss symlinks that were deleted or modified
|
|
|
|
-- manually, but commited as such.
|
|
|
|
writeFile "unusedfile" "unusedcontent"
|
|
|
|
git_annex env "add" ["unusedfile"] @? "add of unusedfile failed"
|
|
|
|
boolSystem "git" [Param "add", File "unusedfile"] @? "git add failed"
|
|
|
|
unusedfilekey' <- annexeval $ findkey "unusedfile"
|
|
|
|
checkunused [] "with staged deleted link"
|
|
|
|
boolSystem "git" [Params "rm -qf", File "unusedfile"] @? "git rm failed"
|
|
|
|
checkunused [unusedfilekey'] "with staged link deleted"
|
|
|
|
|
|
|
|
-- unused used to miss symlinks that were deleted or modified
|
|
|
|
-- manually, but not staged as such.
|
|
|
|
writeFile "unusedfile" "unusedcontent"
|
|
|
|
git_annex env "add" ["unusedfile"] @? "add of unusedfile failed"
|
|
|
|
boolSystem "git" [Param "add", File "unusedfile"] @? "git add failed"
|
|
|
|
unusedfilekey'' <- annexeval $ findkey "unusedfile"
|
|
|
|
checkunused [] "with unstaged deleted link"
|
|
|
|
removeFile "unusedfile"
|
|
|
|
checkunused [unusedfilekey''] "with unstaged link deleted"
|
|
|
|
|
2012-11-11 04:51:07 +00:00
|
|
|
where
|
|
|
|
checkunused expectedkeys desc = do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "unused" [] @? "unused failed"
|
2014-01-22 19:33:02 +00:00
|
|
|
unusedmap <- annexeval $ Logs.Unused.readUnusedMap ""
|
2012-11-11 04:51:07 +00:00
|
|
|
let unusedkeys = M.elems unusedmap
|
|
|
|
assertEqual ("unused keys differ " ++ desc)
|
|
|
|
(sort expectedkeys) (sort unusedkeys)
|
|
|
|
findkey f = do
|
|
|
|
r <- Backend.lookupFile f
|
|
|
|
return $ fst $ fromJust r
|
2011-01-12 05:58:23 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_describe :: TestEnv -> Assertion
|
|
|
|
test_describe env = intmpclonerepo env $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "describe" [".", "this repo"] @? "describe 1 failed"
|
|
|
|
git_annex env "describe" ["origin", "origin repo"] @? "describe 2 failed"
|
2011-12-20 20:26:39 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_find :: TestEnv -> Assertion
|
|
|
|
test_find env = intmpclonerepo env $ do
|
2011-12-20 20:26:39 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex_expectoutput env "find" [] []
|
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
2011-12-21 06:32:40 +00:00
|
|
|
annexed_present annexedfile
|
|
|
|
annexed_notpresent sha1annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex_expectoutput env "find" [] [annexedfile]
|
|
|
|
git_annex_expectoutput env "find" ["--exclude", annexedfile, "--and", "--exclude", sha1annexedfile] []
|
|
|
|
git_annex_expectoutput env "find" ["--include", annexedfile] [annexedfile]
|
|
|
|
git_annex_expectoutput env "find" ["--not", "--in", "origin"] []
|
|
|
|
git_annex_expectoutput env "find" ["--copies", "1", "--and", "--not", "--copies", "2"] [sha1annexedfile]
|
|
|
|
git_annex_expectoutput env "find" ["--inbackend", "SHA1"] [sha1annexedfile]
|
|
|
|
git_annex_expectoutput env "find" ["--inbackend", "WORM"] []
|
2011-12-20 20:26:39 +00:00
|
|
|
|
2013-02-26 17:49:22 +00:00
|
|
|
{- --include=* should match files in subdirectories too,
|
|
|
|
- and --exclude=* should exclude them. -}
|
|
|
|
createDirectory "dir"
|
|
|
|
writeFile "dir/subfile" "subfile"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "add" ["dir"] @? "add of subdir failed"
|
|
|
|
git_annex_expectoutput env "find" ["--include", "*", "--exclude", annexedfile, "--exclude", sha1annexedfile] ["dir/subfile"]
|
|
|
|
git_annex_expectoutput env "find" ["--exclude", "*"] []
|
2013-02-26 17:49:22 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_merge :: TestEnv -> Assertion
|
2014-02-11 05:35:11 +00:00
|
|
|
test_merge env = intmpclonerepo env $
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "merge" [] @? "merge failed"
|
2011-12-20 20:26:39 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_info :: TestEnv -> Assertion
|
|
|
|
test_info env = intmpclonerepo env $ do
|
|
|
|
json <- git_annex_output env "info" ["--json"]
|
2013-02-28 03:21:43 +00:00
|
|
|
case Text.JSON.decodeStrict json :: Text.JSON.Result (Text.JSON.JSObject Text.JSON.JSValue) of
|
|
|
|
Text.JSON.Ok _ -> return ()
|
|
|
|
Text.JSON.Error e -> assertFailure e
|
2011-12-20 20:26:39 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_version :: TestEnv -> Assertion
|
2014-02-11 05:35:11 +00:00
|
|
|
test_version env = intmpclonerepo env $
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "version" [] @? "version failed"
|
2011-12-20 21:31:25 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_sync :: TestEnv -> Assertion
|
|
|
|
test_sync env = intmpclonerepo env $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "sync" [] @? "sync failed"
|
2013-07-30 21:03:50 +00:00
|
|
|
{- Regression test for bug fixed in
|
|
|
|
- 7b0970b340d7faeb745c666146c7f701ec71808f, where in direct mode
|
|
|
|
- sync committed the symlink standin file to the annex. -}
|
|
|
|
git_annex_expectoutput env "find" ["--in", "."] []
|
2011-12-20 20:26:39 +00:00
|
|
|
|
2013-05-20 19:51:40 +00:00
|
|
|
{- Regression test for union merge bug fixed in
|
2013-01-17 20:02:58 +00:00
|
|
|
- 0214e0fb175a608a49b812d81b4632c081f63027 -}
|
2013-11-14 21:03:49 +00:00
|
|
|
test_union_merge_regression :: TestEnv -> Assertion
|
|
|
|
test_union_merge_regression env =
|
2013-01-17 20:02:58 +00:00
|
|
|
{- We need 3 repos to see this bug. -}
|
2014-02-11 05:35:11 +00:00
|
|
|
withtmpclonerepo env False $ \r1 ->
|
|
|
|
withtmpclonerepo env False $ \r2 ->
|
2013-05-15 21:22:45 +00:00
|
|
|
withtmpclonerepo env False $ \r3 -> do
|
|
|
|
forM_ [r1, r2, r3] $ \r -> indir env r $ do
|
2013-01-17 20:02:58 +00:00
|
|
|
when (r /= r1) $
|
|
|
|
boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add"
|
|
|
|
when (r /= r2) $
|
|
|
|
boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add"
|
|
|
|
when (r /= r3) $
|
|
|
|
boolSystem "git" [Params "remote add r3", File ("../../" ++ r3)] @? "remote add"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
2013-01-17 20:02:58 +00:00
|
|
|
boolSystem "git" [Params "remote rm origin"] @? "remote rm"
|
2013-05-15 21:22:45 +00:00
|
|
|
forM_ [r3, r2, r1] $ \r -> indir env r $
|
|
|
|
git_annex env "sync" [] @? "sync failed"
|
|
|
|
forM_ [r3, r2] $ \r -> indir env r $
|
|
|
|
git_annex env "drop" ["--force", annexedfile] @? "drop failed"
|
|
|
|
indir env r1 $ do
|
|
|
|
git_annex env "sync" [] @? "sync failed in r1"
|
|
|
|
git_annex_expectoutput env "find" ["--in", "r3"] []
|
2013-01-17 20:02:58 +00:00
|
|
|
{- This was the bug. The sync
|
|
|
|
- mangled location log data and it
|
|
|
|
- thought the file was still in r2 -}
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex_expectoutput env "find" ["--in", "r2"] []
|
2013-01-17 20:02:58 +00:00
|
|
|
|
2013-05-20 19:51:40 +00:00
|
|
|
{- Regression test for the automatic conflict resolution bug fixed
|
|
|
|
- in f4ba19f2b8a76a1676da7bb5850baa40d9c388e2. -}
|
2013-11-15 00:09:47 +00:00
|
|
|
test_conflict_resolution_movein_bug :: TestEnv -> Assertion
|
2014-02-11 05:35:11 +00:00
|
|
|
test_conflict_resolution_movein_bug env = withtmpclonerepo env False $ \r1 ->
|
2013-11-14 21:03:49 +00:00
|
|
|
withtmpclonerepo env False $ \r2 -> do
|
|
|
|
let rname r = if r == r1 then "r1" else "r2"
|
|
|
|
forM_ [r1, r2] $ \r -> indir env r $ do
|
|
|
|
{- Get all files, see check below. -}
|
|
|
|
git_annex env "get" [] @? "get failed"
|
2014-02-03 16:03:10 +00:00
|
|
|
disconnectOrigin
|
2013-11-14 21:03:49 +00:00
|
|
|
pair env r1 r2
|
|
|
|
forM_ [r1, r2] $ \r -> indir env r $ do
|
|
|
|
{- Set up a conflict. -}
|
|
|
|
let newcontent = content annexedfile ++ rname r
|
|
|
|
ifM (annexeval Config.isDirect)
|
|
|
|
( writeFile annexedfile newcontent
|
|
|
|
, do
|
|
|
|
git_annex env "unlock" [annexedfile] @? "unlock failed"
|
|
|
|
writeFile annexedfile newcontent
|
|
|
|
)
|
|
|
|
{- Sync twice in r1 so it gets the conflict resolution
|
|
|
|
- update from r2 -}
|
2014-02-11 05:35:11 +00:00
|
|
|
forM_ [r1, r2, r1] $ \r -> indir env r $
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "sync" ["--force"] @? "sync failed in " ++ rname r
|
|
|
|
{- After the sync, it should be possible to get all
|
|
|
|
- files. This includes both sides of the conflict,
|
|
|
|
- although the filenames are not easily predictable.
|
|
|
|
-
|
|
|
|
- The bug caused, in direct mode, one repo to
|
|
|
|
- be missing the content of the file that had
|
|
|
|
- been put in it. -}
|
|
|
|
forM_ [r1, r2] $ \r -> indir env r $ do
|
|
|
|
git_annex env "get" [] @? "unable to get all files after merge conflict resolution in " ++ rname r
|
|
|
|
|
|
|
|
{- Check merge conflict resolution when one side is an annexed
|
|
|
|
- file, and the other is a directory. -}
|
|
|
|
test_mixed_conflict_resolution :: TestEnv -> Assertion
|
|
|
|
test_mixed_conflict_resolution env = do
|
|
|
|
check_mixed_conflict True
|
|
|
|
check_mixed_conflict False
|
|
|
|
where
|
|
|
|
check_mixed_conflict inr1 = withtmpclonerepo env False $ \r1 ->
|
2013-05-20 19:51:40 +00:00
|
|
|
withtmpclonerepo env False $ \r2 -> do
|
2013-11-14 21:03:49 +00:00
|
|
|
indir env r1 $ do
|
2014-02-03 16:03:10 +00:00
|
|
|
disconnectOrigin
|
2013-11-14 21:03:49 +00:00
|
|
|
writeFile conflictor "conflictor"
|
|
|
|
git_annex env "add" [conflictor] @? "add conflicter failed"
|
2014-02-03 15:19:41 +00:00
|
|
|
git_annex env "sync" [] @? "sync failed in r1"
|
2013-11-14 21:03:49 +00:00
|
|
|
indir env r2 $ do
|
2014-02-03 16:03:10 +00:00
|
|
|
disconnectOrigin
|
2013-11-14 21:03:49 +00:00
|
|
|
createDirectory conflictor
|
|
|
|
writeFile (conflictor </> "subfile") "subfile"
|
|
|
|
git_annex env "add" [conflictor] @? "add conflicter failed"
|
2014-02-03 15:19:41 +00:00
|
|
|
git_annex env "sync" [] @? "sync failed in r2"
|
2013-11-14 21:03:49 +00:00
|
|
|
pair env r1 r2
|
2014-02-03 18:32:07 +00:00
|
|
|
let l = if inr1 then [r1, r2] else [r2, r1]
|
|
|
|
forM_ l $ \r -> indir env r $
|
2013-11-14 21:03:49 +00:00
|
|
|
git_annex env "sync" [] @? "sync failed in mixed conflict"
|
2014-02-03 18:32:07 +00:00
|
|
|
checkmerge "r1" r1
|
|
|
|
checkmerge "r1" r2
|
2014-02-04 19:14:16 +00:00
|
|
|
conflictor = "conflictor"
|
|
|
|
variantprefix = conflictor ++ ".variant"
|
|
|
|
checkmerge what d = do
|
|
|
|
doesDirectoryExist (d </> conflictor) @? (d ++ " conflictor directory missing")
|
|
|
|
l <- getDirectoryContents d
|
|
|
|
any (variantprefix `isPrefixOf`) l
|
|
|
|
@? (what ++ " conflictor file missing in: " ++ show l )
|
|
|
|
|
2014-02-04 19:31:53 +00:00
|
|
|
{-
|
|
|
|
- During conflict resolution, one of the annexed files in git is
|
|
|
|
- accidentially converted from a symlink to a regular file.
|
|
|
|
- This only happens on crippled filesystems.
|
|
|
|
-
|
|
|
|
- This test case happens to detect the problem when it tries the next
|
|
|
|
- pass of conflict resolution, since it's unable to resolve a conflict
|
|
|
|
- between an annexed and non-annexed file.
|
|
|
|
-}
|
|
|
|
test_mixed_conflict_resolution2 :: TestEnv -> Assertion
|
|
|
|
test_mixed_conflict_resolution2 env = go >> go
|
2014-02-04 19:14:16 +00:00
|
|
|
where
|
2014-02-04 19:31:53 +00:00
|
|
|
go = withtmpclonerepo env False $ \r1 ->
|
2014-02-04 19:14:16 +00:00
|
|
|
withtmpclonerepo env False $ \r2 -> do
|
|
|
|
indir env r1 $ do
|
|
|
|
writeFile conflictor "conflictor"
|
|
|
|
git_annex env "add" [conflictor] @? "add conflicter failed"
|
|
|
|
git_annex env "sync" [] @? "sync failed in r1"
|
|
|
|
indir env r2 $ do
|
|
|
|
createDirectory conflictor
|
|
|
|
writeFile (conflictor </> "subfile") "subfile"
|
|
|
|
git_annex env "add" [conflictor] @? "add conflicter failed"
|
|
|
|
git_annex env "sync" [] @? "sync failed in r2"
|
|
|
|
conflictor = "conflictor"
|
2013-11-14 21:03:49 +00:00
|
|
|
|
2014-02-03 16:03:10 +00:00
|
|
|
{- Set up repos as remotes of each other. -}
|
2013-11-14 21:03:49 +00:00
|
|
|
pair :: TestEnv -> FilePath -> FilePath -> Assertion
|
|
|
|
pair env r1 r2 = forM_ [r1, r2] $ \r -> indir env r $ do
|
|
|
|
when (r /= r1) $
|
|
|
|
boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add"
|
|
|
|
when (r /= r2) $
|
|
|
|
boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add"
|
|
|
|
|
|
|
|
test_map :: TestEnv -> Assertion
|
|
|
|
test_map env = intmpclonerepo env $ do
|
2011-12-20 20:31:59 +00:00
|
|
|
-- set descriptions, that will be looked for in the map
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "describe" [".", "this repo"] @? "describe 1 failed"
|
|
|
|
git_annex env "describe" ["origin", "origin repo"] @? "describe 2 failed"
|
2011-12-20 20:31:59 +00:00
|
|
|
-- --fast avoids it running graphviz, not a build dependency
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "map" ["--fast"] @? "map failed"
|
2011-12-20 21:31:25 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_uninit :: TestEnv -> Assertion
|
|
|
|
test_uninit env = intmpclonerepo env $ do
|
|
|
|
git_annex env "get" [] @? "get failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
_ <- git_annex env "uninit" [] -- exit status not checked; does abnormal exit
|
|
|
|
checkregularfile annexedfile
|
|
|
|
doesDirectoryExist ".git" @? ".git vanished in uninit"
|
|
|
|
|
|
|
|
test_uninit_inbranch :: TestEnv -> Assertion
|
|
|
|
test_uninit_inbranch env = intmpclonerepoInDirect env $ do
|
|
|
|
boolSystem "git" [Params "checkout git-annex"] @? "git checkout git-annex"
|
|
|
|
not <$> git_annex env "uninit" [] @? "uninit failed to fail when git-annex branch was checked out"
|
|
|
|
|
|
|
|
test_upgrade :: TestEnv -> Assertion
|
|
|
|
test_upgrade env = intmpclonerepo env $ do
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "upgrade" [] @? "upgrade from same version failed"
|
2011-12-20 21:31:25 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_whereis :: TestEnv -> Assertion
|
|
|
|
test_whereis env = intmpclonerepo env $ do
|
2011-12-20 21:31:25 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "whereis" [annexedfile] @? "whereis on non-present file failed"
|
|
|
|
git_annex env "untrust" ["origin"] @? "untrust failed"
|
|
|
|
not <$> git_annex env "whereis" [annexedfile] @? "whereis on non-present file only present in untrusted repo failed to fail"
|
|
|
|
git_annex env "get" [annexedfile] @? "get failed"
|
2011-12-20 21:31:25 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "whereis" [annexedfile] @? "whereis on present file failed"
|
2011-12-20 20:31:59 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_hook_remote :: TestEnv -> Assertion
|
|
|
|
test_hook_remote env = intmpclonerepo env $ do
|
2013-08-04 17:07:55 +00:00
|
|
|
#ifndef mingw32_HOST_OS
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "initremote" (words "foo type=hook encryption=none hooktype=foo") @? "initremote failed"
|
2011-12-20 19:13:36 +00:00
|
|
|
createDirectory dir
|
|
|
|
git_config "annex.foo-store-hook" $
|
|
|
|
"cp $ANNEX_FILE " ++ loc
|
|
|
|
git_config "annex.foo-retrieve-hook" $
|
|
|
|
"cp " ++ loc ++ " $ANNEX_FILE"
|
|
|
|
git_config "annex.foo-remove-hook" $
|
|
|
|
"rm -f " ++ loc
|
|
|
|
git_config "annex.foo-checkpresent-hook" $
|
|
|
|
"if [ -e " ++ loc ++ " ]; then echo $ANNEX_KEY; fi"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
2011-12-20 19:13:36 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to hook remote failed"
|
2011-12-20 19:13:36 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
|
2011-12-20 19:13:36 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from hook remote failed"
|
2011-12-20 19:13:36 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
2012-11-11 04:51:07 +00:00
|
|
|
where
|
|
|
|
dir = "dir"
|
|
|
|
loc = dir ++ "/$ANNEX_KEY"
|
|
|
|
git_config k v = boolSystem "git" [Param "config", Param k, Param v]
|
|
|
|
@? "git config failed"
|
2013-06-18 20:12:43 +00:00
|
|
|
#else
|
|
|
|
-- this test doesn't work in Windows TODO
|
|
|
|
noop
|
|
|
|
#endif
|
2011-12-20 19:13:36 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_directory_remote :: TestEnv -> Assertion
|
|
|
|
test_directory_remote env = intmpclonerepo env $ do
|
2011-12-20 19:17:56 +00:00
|
|
|
createDirectory "dir"
|
2014-02-11 05:35:11 +00:00
|
|
|
git_annex env "initremote" (words "foo type=directory encryption=none directory=dir") @? "initremote failed"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to directory remote failed"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from directory remote failed"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_rsync_remote :: TestEnv -> Assertion
|
|
|
|
test_rsync_remote env = intmpclonerepo env $ do
|
2013-08-04 17:07:55 +00:00
|
|
|
#ifndef mingw32_HOST_OS
|
2011-12-20 19:17:56 +00:00
|
|
|
createDirectory "dir"
|
2014-02-11 05:35:11 +00:00
|
|
|
git_annex env "initremote" (words "foo type=rsync encryption=none rsyncurl=dir") @? "initremote failed"
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to rsync remote failed"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from rsync remote failed"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
|
2011-12-20 19:17:56 +00:00
|
|
|
annexed_present annexedfile
|
2013-06-18 20:12:43 +00:00
|
|
|
#else
|
2014-02-04 18:23:41 +00:00
|
|
|
-- Rsync remotes with a rsyncurl of a directory do not currently
|
|
|
|
-- work on Windows.
|
2013-06-18 20:12:43 +00:00
|
|
|
noop
|
|
|
|
#endif
|
2011-12-20 19:17:56 +00:00
|
|
|
|
2013-11-14 21:03:49 +00:00
|
|
|
test_bup_remote :: TestEnv -> Assertion
|
|
|
|
test_bup_remote env = intmpclonerepo env $ when Build.SysConfig.bup $ do
|
2011-12-21 17:50:33 +00:00
|
|
|
dir <- absPath "dir" -- bup special remote needs an absolute path
|
|
|
|
createDirectory dir
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "initremote" (words $ "foo type=bup encryption=none buprepo="++dir) @? "initremote failed"
|
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
2011-12-21 17:50:33 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to bup remote failed"
|
2011-12-21 17:50:33 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
|
2011-12-21 17:50:33 +00:00
|
|
|
annexed_notpresent annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex env "copy" [annexedfile, "--from", "foo"] @? "copy --from bup remote failed"
|
2011-12-21 17:50:33 +00:00
|
|
|
annexed_present annexedfile
|
2013-05-15 21:22:45 +00:00
|
|
|
not <$> git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from bup remote failed to fail"
|
2011-12-21 17:50:33 +00:00
|
|
|
annexed_present annexedfile
|
|
|
|
|
2011-12-21 18:10:36 +00:00
|
|
|
-- gpg is not a build dependency, so only test when it's available
|
2013-11-14 21:03:49 +00:00
|
|
|
test_crypto :: TestEnv -> Assertion
|
2013-08-04 17:07:55 +00:00
|
|
|
#ifndef mingw32_HOST_OS
|
2013-11-14 21:03:49 +00:00
|
|
|
test_crypto env = do
|
|
|
|
testscheme "shared"
|
|
|
|
testscheme "hybrid"
|
|
|
|
testscheme "pubkey"
|
|
|
|
where
|
|
|
|
testscheme scheme = intmpclonerepo env $ whenM (Utility.Path.inPath Utility.Gpg.gpgcmd) $ do
|
|
|
|
Utility.Gpg.testTestHarness @? "test harness self-test failed"
|
|
|
|
Utility.Gpg.testHarness $ do
|
|
|
|
createDirectory "dir"
|
|
|
|
let a cmd = git_annex env cmd $
|
|
|
|
[ "foo"
|
|
|
|
, "type=directory"
|
|
|
|
, "encryption=" ++ scheme
|
|
|
|
, "directory=dir"
|
|
|
|
, "highRandomQuality=false"
|
|
|
|
] ++ if scheme `elem` ["hybrid","pubkey"]
|
|
|
|
then ["keyid=" ++ Utility.Gpg.testKeyId]
|
|
|
|
else []
|
|
|
|
a "initremote" @? "initremote failed"
|
|
|
|
not <$> a "initremote" @? "initremote failed to fail when run twice in a row"
|
|
|
|
a "enableremote" @? "enableremote failed"
|
|
|
|
a "enableremote" @? "enableremote failed when run twice in a row"
|
|
|
|
git_annex env "get" [annexedfile] @? "get of file failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to encrypted remote failed"
|
|
|
|
(c,k) <- annexeval $ do
|
|
|
|
uuid <- Remote.nameToUUID "foo"
|
|
|
|
rs <- Logs.Remote.readRemoteLog
|
|
|
|
Just (k,_) <- Backend.lookupFile annexedfile
|
|
|
|
return (fromJust $ M.lookup uuid rs, k)
|
|
|
|
let key = if scheme `elem` ["hybrid","pubkey"]
|
|
|
|
then Just $ Utility.Gpg.KeyIds [Utility.Gpg.testKeyId]
|
|
|
|
else Nothing
|
|
|
|
testEncryptedRemote scheme key c [k] @? "invalid crypto setup"
|
|
|
|
|
|
|
|
annexed_present annexedfile
|
|
|
|
git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
|
|
|
|
annexed_notpresent annexedfile
|
|
|
|
git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from encrypted remote failed"
|
|
|
|
annexed_present annexedfile
|
|
|
|
not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
|
|
|
|
annexed_present annexedfile
|
|
|
|
{- Ensure the configuration complies with the encryption scheme, and
|
|
|
|
- that all keys are encrypted properly for the given directory remote. -}
|
|
|
|
testEncryptedRemote scheme ks c keys = case Remote.Helper.Encryptable.extractCipher c of
|
|
|
|
Just cip@Crypto.SharedCipher{} | scheme == "shared" && isNothing ks ->
|
|
|
|
checkKeys cip Nothing
|
|
|
|
Just cip@(Crypto.EncryptedCipher encipher v ks')
|
|
|
|
| checkScheme v && keysMatch ks' ->
|
|
|
|
checkKeys cip (Just v) <&&> checkCipher encipher ks'
|
|
|
|
_ -> return False
|
|
|
|
where
|
|
|
|
keysMatch (Utility.Gpg.KeyIds ks') =
|
|
|
|
maybe False (\(Utility.Gpg.KeyIds ks2) ->
|
|
|
|
sort (nub ks2) == sort (nub ks')) ks
|
|
|
|
checkCipher encipher = Utility.Gpg.checkEncryptionStream encipher . Just
|
|
|
|
checkScheme Types.Crypto.Hybrid = scheme == "hybrid"
|
|
|
|
checkScheme Types.Crypto.PubKey = scheme == "pubkey"
|
|
|
|
checkKeys cip mvariant = do
|
|
|
|
cipher <- Crypto.decryptCipher cip
|
|
|
|
files <- filterM doesFileExist $
|
|
|
|
map ("dir" </>) $ concatMap (key2files cipher) keys
|
|
|
|
return (not $ null files) <&&> allM (checkFile mvariant) files
|
|
|
|
checkFile mvariant filename =
|
|
|
|
Utility.Gpg.checkEncryptionFile filename $
|
|
|
|
if mvariant == Just Types.Crypto.PubKey then ks else Nothing
|
|
|
|
key2files cipher = Locations.keyPaths .
|
|
|
|
Crypto.encryptKey Types.Crypto.HmacSha1 cipher
|
2013-05-17 20:49:34 +00:00
|
|
|
#else
|
2013-11-14 21:03:49 +00:00
|
|
|
test_crypto _env = putStrLn "gpg testing not implemented on Windows"
|
2013-05-17 20:49:34 +00:00
|
|
|
#endif
|
2011-12-21 03:20:36 +00:00
|
|
|
|
2014-02-07 00:33:30 +00:00
|
|
|
test_add_subdirs :: TestEnv -> Assertion
|
|
|
|
test_add_subdirs env = intmpclonerepo env $ do
|
|
|
|
createDirectory "dir"
|
|
|
|
writeFile ("dir" </> "foo") $ "dir/" ++ content annexedfile
|
|
|
|
git_annex env "add" ["dir"] @? "add of subdir failed"
|
|
|
|
|
|
|
|
{- Regression test for Windows bug where symlinks were not
|
|
|
|
- calculated correctly for files in subdirs. -}
|
|
|
|
git_annex env "sync" [] @? "sync failed"
|
|
|
|
l <- annexeval $ encodeW8 . L.unpack <$> Annex.CatFile.catObject (Git.Types.Ref "HEAD:dir/foo")
|
|
|
|
"../.git/annex/" `isPrefixOf` l @? ("symlink from subdir to .git/annex is wrong: " ++ l)
|
|
|
|
|
|
|
|
createDirectory "dir2"
|
|
|
|
writeFile ("dir2" </> "foo") $ content annexedfile
|
|
|
|
setCurrentDirectory "dir"
|
|
|
|
git_annex env "add" [".." </> "dir2"] @? "add of ../subdir failed"
|
|
|
|
|
2011-01-11 22:50:18 +00:00
|
|
|
-- This is equivilant to running git-annex, but it's all run in-process
|
2013-05-17 20:45:44 +00:00
|
|
|
-- (when the OS allows) so test coverage collection works.
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex :: TestEnv -> String -> [String] -> IO Bool
|
|
|
|
git_annex env command params = do
|
2013-08-04 17:07:55 +00:00
|
|
|
#ifndef mingw32_HOST_OS
|
2013-05-15 21:22:45 +00:00
|
|
|
forM_ (M.toList env) $ \(var, val) ->
|
|
|
|
Utility.Env.setEnv var val True
|
|
|
|
|
2011-01-07 01:39:26 +00:00
|
|
|
-- catch all errors, including normally fatal errors
|
2014-02-11 05:35:11 +00:00
|
|
|
r <- try run::IO (Either SomeException ())
|
2011-01-07 00:26:57 +00:00
|
|
|
case r of
|
|
|
|
Right _ -> return True
|
|
|
|
Left _ -> return False
|
2012-11-11 04:51:07 +00:00
|
|
|
where
|
|
|
|
run = GitAnnex.run (command:"-q":params)
|
2013-05-17 20:45:44 +00:00
|
|
|
#else
|
|
|
|
Utility.SafeCommand.boolSystemEnv "git-annex"
|
|
|
|
(map Param $ command : params)
|
|
|
|
(Just $ M.toList env)
|
|
|
|
#endif
|
2011-01-07 00:09:49 +00:00
|
|
|
|
2011-12-21 06:32:40 +00:00
|
|
|
{- Runs git-annex and returns its output. -}
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex_output :: TestEnv -> String -> [String] -> IO String
|
|
|
|
git_annex_output env command params = do
|
2013-05-17 20:45:44 +00:00
|
|
|
got <- Utility.Process.readProcessEnv "git-annex" (command:params)
|
|
|
|
(Just $ M.toList env)
|
2011-12-21 06:32:40 +00:00
|
|
|
-- XXX since the above is a separate process, code coverage stats are
|
|
|
|
-- not gathered for things run in it.
|
2012-10-11 17:45:09 +00:00
|
|
|
-- Run same command again, to get code coverage.
|
2013-05-15 21:22:45 +00:00
|
|
|
_ <- git_annex env command params
|
2011-12-21 06:32:40 +00:00
|
|
|
return got
|
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
git_annex_expectoutput :: TestEnv -> String -> [String] -> [String] -> IO ()
|
|
|
|
git_annex_expectoutput env command params expected = do
|
|
|
|
got <- lines <$> git_annex_output env command params
|
2011-12-21 06:32:40 +00:00
|
|
|
got == expected @? ("unexpected value running " ++ command ++ " " ++ show params ++ " -- got: " ++ show got ++ " expected: " ++ show expected)
|
|
|
|
|
2011-01-11 22:50:18 +00:00
|
|
|
-- Runs an action in the current annex. Note that shutdown actions
|
|
|
|
-- are not run; this should only be used for actions that query state.
|
2011-01-26 01:49:04 +00:00
|
|
|
annexeval :: Types.Annex a -> IO a
|
2011-01-11 22:50:18 +00:00
|
|
|
annexeval a = do
|
2012-05-18 22:20:53 +00:00
|
|
|
s <- Annex.new =<< Git.CurrentRepo.get
|
2012-04-30 17:59:05 +00:00
|
|
|
Annex.eval s $ do
|
|
|
|
Annex.setOutput Types.Messages.QuietOutput
|
|
|
|
a
|
2011-01-11 22:50:18 +00:00
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
innewrepo :: TestEnv -> Assertion -> Assertion
|
|
|
|
innewrepo env a = withgitrepo env $ \r -> indir env r a
|
2011-01-07 01:39:26 +00:00
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
inmainrepo :: TestEnv -> Assertion -> Assertion
|
2014-02-11 05:35:11 +00:00
|
|
|
inmainrepo env = indir env mainrepodir
|
2011-01-07 01:39:26 +00:00
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
intmpclonerepo :: TestEnv -> Assertion -> Assertion
|
|
|
|
intmpclonerepo env a = withtmpclonerepo env False $ \r -> indir env r a
|
2011-12-21 18:20:41 +00:00
|
|
|
|
2013-05-17 18:52:12 +00:00
|
|
|
intmpclonerepoInDirect :: TestEnv -> Assertion -> Assertion
|
|
|
|
intmpclonerepoInDirect env a = intmpclonerepo env $
|
|
|
|
ifM isdirect
|
|
|
|
( putStrLn "not supported in direct mode; skipping"
|
|
|
|
, a
|
|
|
|
)
|
|
|
|
where
|
|
|
|
isdirect = annexeval $ do
|
2014-01-26 20:36:31 +00:00
|
|
|
Annex.Init.initialize Nothing
|
2013-05-17 18:52:12 +00:00
|
|
|
Config.isDirect
|
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
intmpbareclonerepo :: TestEnv -> Assertion -> Assertion
|
|
|
|
intmpbareclonerepo env a = withtmpclonerepo env True $ \r -> indir env r a
|
2011-01-07 02:22:09 +00:00
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
withtmpclonerepo :: TestEnv -> Bool -> (FilePath -> Assertion) -> Assertion
|
|
|
|
withtmpclonerepo env bare a = do
|
2013-01-17 20:02:58 +00:00
|
|
|
dir <- tmprepodir
|
2013-05-15 21:22:45 +00:00
|
|
|
bracket (clonerepo env mainrepodir dir bare) cleanup a
|
2011-01-07 02:22:09 +00:00
|
|
|
|
2014-02-03 16:03:10 +00:00
|
|
|
disconnectOrigin :: Assertion
|
|
|
|
disconnectOrigin = boolSystem "git" [Params "remote rm origin"] @? "remote rm"
|
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
withgitrepo :: TestEnv -> (FilePath -> Assertion) -> Assertion
|
|
|
|
withgitrepo env = bracket (setuprepo env mainrepodir) return
|
2011-01-07 01:39:26 +00:00
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
indir :: TestEnv -> FilePath -> Assertion -> Assertion
|
|
|
|
indir env dir a = do
|
2011-01-07 00:09:49 +00:00
|
|
|
cwd <- getCurrentDirectory
|
2011-01-08 19:00:04 +00:00
|
|
|
-- Assertion failures throw non-IO errors; catch
|
|
|
|
-- any type of error and change back to cwd before
|
|
|
|
-- rethrowing.
|
2013-05-15 21:22:45 +00:00
|
|
|
r <- bracket_ (changeToTmpDir env dir) (setCurrentDirectory cwd)
|
2014-02-11 05:35:11 +00:00
|
|
|
(try a::IO (Either SomeException ()))
|
2011-01-08 19:00:04 +00:00
|
|
|
case r of
|
|
|
|
Right () -> return ()
|
2011-01-08 19:14:41 +00:00
|
|
|
Left e -> throw e
|
2011-01-07 00:09:49 +00:00
|
|
|
|
2013-05-15 21:22:45 +00:00
|
|
|
setuprepo :: TestEnv -> FilePath -> IO FilePath
|
|
|
|
setuprepo env dir = do
|
2011-01-07 01:39:26 +00:00
|
|
|
cleanup dir
|
|
|
|
ensuretmpdir
|
2011-08-22 20:14:12 +00:00
|
|
|
boolSystem "git" [Params "init -q", File dir] @? "git init failed"
|
2014-02-04 18:23:41 +00:00
|
|
|
configrepo env dir
|
2011-01-07 01:39:26 +00:00
|
|
|
return dir
|
|
|
|
|
2011-01-07 02:22:09 +00:00
|
|
|
-- clones are always done as local clones; we cannot test ssh clones
|
2013-05-15 21:22:45 +00:00
|
|
|
clonerepo :: TestEnv -> FilePath -> FilePath -> Bool -> IO FilePath
|
|
|
|
clonerepo env old new bare = do
|
2011-01-07 02:22:09 +00:00
|
|
|
cleanup new
|
|
|
|
ensuretmpdir
|
2011-12-21 18:20:41 +00:00
|
|
|
let b = if bare then " --bare" else ""
|
|
|
|
boolSystem "git" [Params ("clone -q" ++ b), File old, File new] @? "git clone failed"
|
2013-05-15 21:22:45 +00:00
|
|
|
indir env new $
|
|
|
|
git_annex env "init" ["-q", new] @? "git annex init failed"
|
2014-02-04 18:23:41 +00:00
|
|
|
configrepo env new
|
2014-02-11 05:35:11 +00:00
|
|
|
unless bare $
|
2013-05-20 18:09:50 +00:00
|
|
|
indir env new $
|
|
|
|
handleforcedirect env
|
2011-01-07 02:22:09 +00:00
|
|
|
return new
|
2013-05-20 18:09:50 +00:00
|
|
|
|
2014-02-04 18:23:41 +00:00
|
|
|
configrepo :: TestEnv -> FilePath -> IO ()
|
|
|
|
configrepo env dir = indir env dir $ do
|
|
|
|
boolSystem "git" [Params "config user.name", Param "Test User"] @? "git config failed"
|
|
|
|
boolSystem "git" [Params "config user.email test@example.com"] @? "git config failed"
|
|
|
|
|
2013-05-20 18:09:50 +00:00
|
|
|
handleforcedirect :: TestEnv -> IO ()
|
|
|
|
handleforcedirect env = when (M.lookup "FORCEDIRECT" env == Just "1") $
|
|
|
|
git_annex env "direct" ["-q"] @? "git annex direct failed"
|
2011-01-07 01:39:26 +00:00
|
|
|
|
|
|
|
ensuretmpdir :: IO ()
|
|
|
|
ensuretmpdir = do
|
|
|
|
e <- doesDirectoryExist tmpdir
|
|
|
|
unless e $
|
|
|
|
createDirectory tmpdir
|
|
|
|
|
|
|
|
cleanup :: FilePath -> IO ()
|
2014-02-03 15:38:20 +00:00
|
|
|
cleanup = cleanup' False
|
|
|
|
|
|
|
|
cleanup' :: Bool -> FilePath -> IO ()
|
|
|
|
cleanup' final dir = whenM (doesDirectoryExist dir) $ do
|
|
|
|
-- Allow all files and directories to be written to, so
|
|
|
|
-- they can be deleted. Both git and git-annex use file
|
|
|
|
-- permissions to prevent deletion.
|
|
|
|
recurseDir SystemFS dir >>=
|
2014-02-03 18:20:39 +00:00
|
|
|
mapM_ (void . tryIO . Utility.FileMode.allowWrite)
|
2014-02-03 15:38:20 +00:00
|
|
|
-- This sometimes fails on Windows, due to some files
|
|
|
|
-- being still opened by a subprocess.
|
2014-02-11 05:35:11 +00:00
|
|
|
catchIO (removeDirectoryRecursive dir) $ \e ->
|
2014-02-03 15:38:20 +00:00
|
|
|
when final $ do
|
|
|
|
print e
|
|
|
|
putStrLn "sleeping 10 seconds and will retry directory cleanup"
|
|
|
|
Utility.ThreadScheduler.threadDelaySeconds (Utility.ThreadScheduler.Seconds 10)
|
2014-02-11 05:35:11 +00:00
|
|
|
whenM (doesDirectoryExist dir) $
|
2014-02-03 15:38:20 +00:00
|
|
|
removeDirectoryRecursive dir
|
2011-01-07 02:22:09 +00:00
|
|
|
|
|
|
|
checklink :: FilePath -> Assertion
|
|
|
|
checklink f = do
|
|
|
|
s <- getSymbolicLinkStatus f
|
2013-05-15 23:58:40 +00:00
|
|
|
-- in direct mode, it may be a symlink, or not, depending
|
|
|
|
-- on whether the content is present.
|
|
|
|
unlessM (annexeval Config.isDirect) $
|
|
|
|
isSymbolicLink s @? f ++ " is not a symlink"
|
2011-01-07 02:22:09 +00:00
|
|
|
|
2011-01-07 05:02:06 +00:00
|
|
|
checkregularfile :: FilePath -> Assertion
|
|
|
|
checkregularfile f = do
|
|
|
|
s <- getSymbolicLinkStatus f
|
|
|
|
isRegularFile s @? f ++ " is not a normal file"
|
|
|
|
return ()
|
|
|
|
|
|
|
|
checkcontent :: FilePath -> Assertion
|
|
|
|
checkcontent f = do
|
2013-05-25 17:51:36 +00:00
|
|
|
c <- Utility.Exception.catchDefaultIO "could not read file" $ readFile f
|
2013-05-15 23:58:40 +00:00
|
|
|
assertEqual ("checkcontent " ++ f) (content f) c
|
2011-01-07 02:22:09 +00:00
|
|
|
|
|
|
|
checkunwritable :: FilePath -> Assertion
|
2013-05-15 23:58:40 +00:00
|
|
|
checkunwritable f = unlessM (annexeval Config.isDirect) $ do
|
|
|
|
-- Look at permissions bits rather than trying to write or
|
|
|
|
-- using fileAccess because if run as root, any file can be
|
|
|
|
-- modified despite permissions.
|
|
|
|
s <- getFileStatus f
|
|
|
|
let mode = fileMode s
|
2014-02-11 05:35:11 +00:00
|
|
|
when (mode == mode `unionFileModes` ownerWriteMode) $
|
|
|
|
assertFailure $ "able to modify annexed file's " ++ f ++ " content"
|
2011-01-07 02:22:09 +00:00
|
|
|
|
2011-01-07 18:06:32 +00:00
|
|
|
checkwritable :: FilePath -> Assertion
|
|
|
|
checkwritable f = do
|
2012-02-03 20:57:07 +00:00
|
|
|
r <- tryIO $ writeFile f $ content f
|
2011-01-07 18:06:32 +00:00
|
|
|
case r of
|
|
|
|
Left _ -> assertFailure $ "unable to modify " ++ f
|
|
|
|
Right _ -> return ()
|
|
|
|
|
2011-01-07 02:22:09 +00:00
|
|
|
checkdangling :: FilePath -> Assertion
|
2013-05-15 23:33:27 +00:00
|
|
|
checkdangling f = ifM (annexeval Config.crippledFileSystem)
|
|
|
|
( return () -- probably no real symlinks to test
|
|
|
|
, do
|
|
|
|
r <- tryIO $ readFile f
|
|
|
|
case r of
|
|
|
|
Left _ -> return () -- expected; dangling link
|
|
|
|
Right _ -> assertFailure $ f ++ " was not a dangling link as expected"
|
|
|
|
)
|
2011-01-07 01:39:26 +00:00
|
|
|
|
2011-01-11 19:43:29 +00:00
|
|
|
checklocationlog :: FilePath -> Bool -> Assertion
|
|
|
|
checklocationlog f expected = do
|
2011-10-15 21:47:03 +00:00
|
|
|
thisuuid <- annexeval Annex.UUID.getUUID
|
2011-01-11 22:50:18 +00:00
|
|
|
r <- annexeval $ Backend.lookupFile f
|
2011-01-11 19:43:29 +00:00
|
|
|
case r of
|
|
|
|
Just (k, _) -> do
|
2012-01-10 17:11:16 +00:00
|
|
|
uuids <- annexeval $ Remote.keyLocations k
|
2014-02-11 05:35:11 +00:00
|
|
|
assertEqual ("bad content in location log for " ++ f ++ " key " ++ Types.Key.key2file k ++ " uuid " ++ show thisuuid)
|
2011-01-30 16:01:56 +00:00
|
|
|
expected (thisuuid `elem` uuids)
|
2011-01-11 19:43:29 +00:00
|
|
|
_ -> assertFailure $ f ++ " failed to look up key"
|
|
|
|
|
2011-12-31 08:11:39 +00:00
|
|
|
checkbackend :: FilePath -> Types.Backend -> Assertion
|
2011-12-21 18:10:36 +00:00
|
|
|
checkbackend file expected = do
|
|
|
|
r <- annexeval $ Backend.lookupFile file
|
|
|
|
let b = snd $ fromJust r
|
|
|
|
assertEqual ("backend for " ++ file) expected b
|
|
|
|
|
2011-01-11 19:43:29 +00:00
|
|
|
inlocationlog :: FilePath -> Assertion
|
|
|
|
inlocationlog f = checklocationlog f True
|
|
|
|
|
|
|
|
notinlocationlog :: FilePath -> Assertion
|
|
|
|
notinlocationlog f = checklocationlog f False
|
|
|
|
|
2011-01-07 18:06:32 +00:00
|
|
|
runchecks :: [FilePath -> Assertion] -> FilePath -> Assertion
|
|
|
|
runchecks [] _ = return ()
|
|
|
|
runchecks (a:as) f = do
|
|
|
|
a f
|
|
|
|
runchecks as f
|
|
|
|
|
|
|
|
annexed_notpresent :: FilePath -> Assertion
|
2011-01-11 19:43:29 +00:00
|
|
|
annexed_notpresent = runchecks
|
2011-04-27 00:21:24 +00:00
|
|
|
[checklink, checkdangling, notinlocationlog]
|
2011-01-07 18:06:32 +00:00
|
|
|
|
|
|
|
annexed_present :: FilePath -> Assertion
|
2011-01-11 19:43:29 +00:00
|
|
|
annexed_present = runchecks
|
|
|
|
[checklink, checkcontent, checkunwritable, inlocationlog]
|
2011-01-07 18:06:32 +00:00
|
|
|
|
|
|
|
unannexed :: FilePath -> Assertion
|
|
|
|
unannexed = runchecks [checkregularfile, checkcontent, checkwritable]
|
|
|
|
|
2014-01-21 18:24:30 +00:00
|
|
|
withTestEnv :: Bool -> (IO TestEnv -> TestTree) -> TestTree
|
|
|
|
withTestEnv forcedirect = withResource prepare release
|
|
|
|
where
|
|
|
|
prepare = do
|
|
|
|
env <- prepareTestEnv forcedirect
|
2014-01-27 18:22:44 +00:00
|
|
|
case tryIngredients [consoleTestReporter] mempty (initTests env) of
|
2014-01-21 18:24:30 +00:00
|
|
|
Nothing -> error "No tests found!?"
|
|
|
|
Just act -> unlessM act $
|
|
|
|
error "init tests failed! cannot continue"
|
|
|
|
return env
|
|
|
|
release = releaseTestEnv
|
|
|
|
|
2014-01-21 18:04:50 +00:00
|
|
|
releaseTestEnv :: TestEnv -> IO ()
|
2014-02-11 05:35:11 +00:00
|
|
|
releaseTestEnv _env = cleanup' True tmpdir
|
2014-01-21 18:04:50 +00:00
|
|
|
|
|
|
|
prepareTestEnv :: Bool -> IO TestEnv
|
|
|
|
prepareTestEnv forcedirect = do
|
2013-02-27 19:48:26 +00:00
|
|
|
whenM (doesDirectoryExist tmpdir) $
|
|
|
|
error $ "The temporary directory " ++ tmpdir ++ " already exists; cannot run test suite."
|
2013-02-27 19:35:07 +00:00
|
|
|
|
2011-01-07 18:06:32 +00:00
|
|
|
cwd <- getCurrentDirectory
|
2013-05-15 21:22:45 +00:00
|
|
|
p <- Utility.Env.getEnvDefault "PATH" ""
|
|
|
|
|
|
|
|
let env =
|
|
|
|
-- Ensure that the just-built git annex is used.
|
2013-07-30 20:57:17 +00:00
|
|
|
[ ("PATH", cwd ++ [searchPathSeparator] ++ p)
|
2013-05-15 21:22:45 +00:00
|
|
|
, ("TOPDIR", cwd)
|
|
|
|
-- Avoid git complaining if it cannot determine the user's
|
|
|
|
-- email address, or exploding if it doesn't know the user's
|
|
|
|
-- name.
|
|
|
|
, ("GIT_AUTHOR_EMAIL", "test@example.com")
|
|
|
|
, ("GIT_AUTHOR_NAME", "git-annex test")
|
|
|
|
, ("GIT_COMMITTER_EMAIL", "test@example.com")
|
|
|
|
, ("GIT_COMMITTER_NAME", "git-annex test")
|
|
|
|
-- force gpg into batch mode for the tests
|
|
|
|
, ("GPG_BATCH", "1")
|
2013-05-20 18:09:50 +00:00
|
|
|
, ("FORCEDIRECT", if forcedirect then "1" else "")
|
2013-05-15 21:22:45 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
return $ M.fromList env
|
|
|
|
|
|
|
|
changeToTmpDir :: TestEnv -> FilePath -> IO ()
|
|
|
|
changeToTmpDir env t = do
|
|
|
|
let topdir = fromMaybe "" $ M.lookup "TOPDIR" env
|
2013-05-11 23:14:30 +00:00
|
|
|
setCurrentDirectory $ topdir ++ "/" ++ t
|
2011-01-07 18:06:32 +00:00
|
|
|
|
|
|
|
tmpdir :: String
|
2011-01-07 01:39:26 +00:00
|
|
|
tmpdir = ".t"
|
|
|
|
|
2013-01-17 20:02:58 +00:00
|
|
|
mainrepodir :: FilePath
|
2013-06-18 18:08:35 +00:00
|
|
|
mainrepodir = tmpdir </> "repo"
|
2011-01-07 01:39:26 +00:00
|
|
|
|
2013-01-17 20:02:58 +00:00
|
|
|
tmprepodir :: IO FilePath
|
|
|
|
tmprepodir = go (0 :: Int)
|
|
|
|
where
|
|
|
|
go n = do
|
2013-06-18 18:08:35 +00:00
|
|
|
let d = tmpdir </> "tmprepo" ++ show n
|
2013-01-17 20:02:58 +00:00
|
|
|
ifM (doesDirectoryExist d)
|
|
|
|
( go $ n + 1
|
|
|
|
, return d
|
|
|
|
)
|
2011-01-07 18:06:32 +00:00
|
|
|
|
2011-01-07 05:02:06 +00:00
|
|
|
annexedfile :: String
|
|
|
|
annexedfile = "foo"
|
|
|
|
|
2011-12-21 18:10:36 +00:00
|
|
|
wormannexedfile :: String
|
|
|
|
wormannexedfile = "apple"
|
|
|
|
|
2011-01-11 23:59:11 +00:00
|
|
|
sha1annexedfile :: String
|
|
|
|
sha1annexedfile = "sha1foo"
|
|
|
|
|
2011-01-27 18:01:30 +00:00
|
|
|
sha1annexedfiledup :: String
|
|
|
|
sha1annexedfiledup = "sha1foodup"
|
|
|
|
|
2011-01-07 05:02:06 +00:00
|
|
|
ingitfile :: String
|
|
|
|
ingitfile = "bar"
|
2011-01-07 02:22:09 +00:00
|
|
|
|
2011-01-07 05:02:06 +00:00
|
|
|
content :: FilePath -> String
|
|
|
|
content f
|
|
|
|
| f == annexedfile = "annexed file content"
|
|
|
|
| f == ingitfile = "normal file content"
|
2011-01-11 23:59:11 +00:00
|
|
|
| f == sha1annexedfile ="sha1 annexed file content"
|
2011-01-27 18:01:30 +00:00
|
|
|
| f == sha1annexedfiledup = content sha1annexedfile
|
2011-12-21 18:10:36 +00:00
|
|
|
| f == wormannexedfile = "worm annexed file content"
|
2011-01-07 05:02:06 +00:00
|
|
|
| otherwise = "unknown file " ++ f
|
2011-01-07 18:06:32 +00:00
|
|
|
|
|
|
|
changecontent :: FilePath -> IO ()
|
|
|
|
changecontent f = writeFile f $ changedcontent f
|
|
|
|
|
|
|
|
changedcontent :: FilePath -> String
|
2014-02-11 05:35:11 +00:00
|
|
|
changedcontent f = content f ++ " (modified)"
|
2011-03-02 17:47:45 +00:00
|
|
|
|
2011-12-31 08:11:39 +00:00
|
|
|
backendSHA1 :: Types.Backend
|
2011-03-02 17:47:45 +00:00
|
|
|
backendSHA1 = backend_ "SHA1"
|
|
|
|
|
2011-12-31 08:11:39 +00:00
|
|
|
backendSHA256 :: Types.Backend
|
2011-12-20 20:06:15 +00:00
|
|
|
backendSHA256 = backend_ "SHA256"
|
2011-03-02 17:47:45 +00:00
|
|
|
|
2011-12-31 08:11:39 +00:00
|
|
|
backendWORM :: Types.Backend
|
2011-12-21 18:10:36 +00:00
|
|
|
backendWORM = backend_ "WORM"
|
|
|
|
|
2011-12-31 08:11:39 +00:00
|
|
|
backend_ :: String -> Types.Backend
|
2014-02-11 05:35:11 +00:00
|
|
|
backend_ = Backend.lookupBackendName
|