git-annex/test.hs

972 lines
37 KiB
Haskell
Raw Normal View History

{- git-annex test suite
-
- Copyright 2010-2012 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
2012-02-20 15:08:50 +00:00
{-# OPTIONS_GHC -fno-warn-orphans #-}
2010-11-02 21:08:16 +00:00
import Test.HUnit
import Test.HUnit.Tools
import Test.QuickCheck
2012-12-20 04:02:33 +00:00
import Test.QuickCheck.Instances ()
import System.Posix.Directory (changeWorkingDirectory)
import System.Posix.Files
2011-01-07 06:14:48 +00:00
import System.Posix.Env
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
import System.IO.HVFS (SystemFS(..))
2011-12-21 06:32:40 +00:00
import Text.JSON
2010-11-02 21:08:16 +00:00
import Common
2012-12-20 02:58:31 +00:00
import Utility.QuickCheck ()
import qualified Utility.SafeCommand
2011-01-11 19:43:29 +00:00
import qualified Annex
import qualified Annex.UUID
2011-01-11 19:43:29 +00:00
import qualified Backend
import qualified Git.CurrentRepo
2011-12-13 19:22:43 +00:00
import qualified Git.Filename
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
import qualified Types
import qualified GitAnnex
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
import qualified Logs.Transfer
import qualified Logs.Presence
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
import qualified Config
2011-04-21 20:56:24 +00:00
import qualified Crypto
import qualified Utility.Path
2011-09-28 19:17:45 +00:00
import qualified Utility.FileMode
import qualified Utility.Gpg
import qualified Build.SysConfig
import qualified Utility.Format
import qualified Utility.Verifiable
import qualified Utility.Process
import qualified Utility.Misc
2012-12-19 20:36:19 +00:00
import qualified Annex.Content.Direct
2010-11-02 20:49:35 +00:00
-- instances for quickcheck
2011-06-14 01:51:52 +00:00
instance Arbitrary Types.Key.Key where
2012-12-19 20:36:19 +00:00
arbitrary = Types.Key.Key
<$> arbitrary
<*> (listOf1 $ elements ['A'..'Z']) -- BACKEND
2012-12-19 20:36:19 +00:00
<*> ((abs <$>) <$> arbitrary) -- size cannot be negative
<*> arbitrary
instance Arbitrary Logs.Transfer.TransferInfo where
arbitrary = Logs.Transfer.TransferInfo
<$> arbitrary
<*> arbitrary
<*> pure Nothing -- cannot generate a ThreadID
<*> pure Nothing -- remote not needed
<*> arbitrary
-- associated file cannot be empty (but can be Nothing)
<*> arbitrary `suchThat` (/= Just "")
<*> arbitrary
2012-12-19 20:36:19 +00:00
instance Arbitrary Annex.Content.Direct.Cache where
arbitrary = Annex.Content.Direct.Cache
<$> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary Logs.Presence.LogLine where
arbitrary = Logs.Presence.LogLine
<$> arbitrary
<*> elements [minBound..maxBound]
2012-12-20 02:58:31 +00:00
<*> arbitrary `suchThat` ('\n' `notElem`)
2011-01-07 06:14:48 +00:00
main :: IO ()
2011-01-07 01:39:26 +00:00
main = do
prepare
2011-01-26 20:20:28 +00:00
r <- runVerboseTests $ TestList [quickcheck, blackbox]
2011-01-07 01:39:26 +00:00
cleanup tmpdir
2011-01-07 06:14:48 +00:00
propigate r
propigate :: (Counts, Int) -> IO ()
propigate (Counts { errors = e , failures = f }, _)
| e+f > 0 = error "failed"
2011-01-07 06:14:48 +00:00
| otherwise = return ()
2011-01-26 20:20:28 +00:00
quickcheck :: Test
quickcheck = TestLabel "quickcheck" $ TestList
[ qctest "prop_idempotent_deencode_git" Git.Filename.prop_idempotent_deencode
, qctest "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode
, qctest "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey
, qctest "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode
, qctest "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape
, qctest "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword
2011-10-15 20:21:08 +00:00
, qctest "prop_idempotent_configEscape" Logs.Remote.prop_idempotent_configEscape
2012-12-20 04:02:33 +00:00
, qctest "prop_parse_show_Config" Logs.Remote.prop_parse_show_Config
, qctest "prop_parentDir_basics" Utility.Path.prop_parentDir_basics
, qctest "prop_relPathDirToFile_basics" Utility.Path.prop_relPathDirToFile_basics
, qctest "prop_relPathDirToFile_regressionTest" Utility.Path.prop_relPathDirToFile_regressionTest
, qctest "prop_cost_sane" Config.prop_cost_sane
2011-04-21 20:56:24 +00:00
, qctest "prop_hmacWithCipher_sane" Crypto.prop_hmacWithCipher_sane
2011-10-15 20:21:08 +00:00
, qctest "prop_TimeStamp_sane" Logs.UUIDBased.prop_TimeStamp_sane
, qctest "prop_addLog_sane" Logs.UUIDBased.prop_addLog_sane
, qctest "prop_verifiable_sane" Utility.Verifiable.prop_verifiable_sane
, qctest "prop_segment_regressionTest" Utility.Misc.prop_segment_regressionTest
, qctest "prop_read_write_transferinfo" Logs.Transfer.prop_read_write_transferinfo
2012-12-19 20:36:19 +00:00
, qctest "prop_read_show_direct" Annex.Content.Direct.prop_read_show_direct
, qctest "prop_parse_show_log" Logs.Presence.prop_parse_show_log
2012-12-20 03:43:15 +00:00
, qctest "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel
2012-12-20 04:06:55 +00:00
, qctest "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog
2010-11-02 21:08:16 +00:00
]
2011-01-26 20:20:28 +00:00
blackbox :: Test
blackbox = TestLabel "blackbox" $ TestList
2011-01-07 01:39:26 +00:00
-- test order matters, later tests may rely on state from earlier
[ test_init
, test_add
2011-10-31 19:18:41 +00:00
, test_reinject
2011-01-07 01:39:26 +00:00
, test_unannex
, test_drop
2011-01-07 02:22:09 +00:00
, test_get
2011-01-07 05:02:06 +00:00
, test_move
2011-01-07 06:14:48 +00:00
, test_copy
, test_lock
, test_edit
, test_fix
2011-01-11 22:50:18 +00:00
, test_trust
2011-01-11 23:34:28 +00:00
, test_fsck
2011-01-12 01:11:32 +00:00
, test_migrate
2011-01-12 05:58:23 +00:00
, test_unused
, test_describe
, test_find
, test_merge
, test_status
, test_version
, test_sync
, test_map
, test_uninit
, test_upgrade
, test_whereis
, test_hook_remote
, test_directory_remote
, test_rsync_remote
2011-12-21 17:50:33 +00:00
, test_bup_remote
, test_crypto
]
test_init :: Test
test_init = "git-annex init" ~: TestCase $ innewrepo $ do
2011-12-20 19:48:25 +00:00
git_annex "init" [reponame] @? "init failed"
2012-11-11 04:51:07 +00:00
where
reponame = "test repo"
test_add :: Test
test_add = "git-annex add" ~: TestList [basic, sha1dup, subdirs]
2012-11-11 04:51:07 +00:00
where
-- this test case runs in the main repo, to set up a basic
-- annexed file that later tests will use
basic = TestCase $ inmainrepo $ do
writeFile annexedfile $ content annexedfile
git_annex "add" [annexedfile] @? "add failed"
annexed_present annexedfile
writeFile sha1annexedfile $ content sha1annexedfile
git_annex "add" [sha1annexedfile, "--backend=SHA1"] @? "add with SHA1 failed"
annexed_present sha1annexedfile
checkbackend sha1annexedfile backendSHA1
writeFile wormannexedfile $ content wormannexedfile
git_annex "add" [wormannexedfile, "--backend=WORM"] @? "add with WORM failed"
annexed_present wormannexedfile
checkbackend wormannexedfile backendWORM
boolSystem "git" [Params "rm --force -q", File wormannexedfile] @? "git rm failed"
writeFile ingitfile $ content ingitfile
boolSystem "git" [Param "add", File ingitfile] @? "git add failed"
boolSystem "git" [Params "commit -q -a -m commit"] @? "git commit failed"
git_annex "add" [ingitfile] @? "add ingitfile should be no-op"
unannexed ingitfile
sha1dup = TestCase $ intmpclonerepo $ do
writeFile sha1annexedfiledup $ content sha1annexedfiledup
git_annex "add" [sha1annexedfiledup, "--backend=SHA1"] @? "add of second file with same SHA1 failed"
annexed_present sha1annexedfiledup
annexed_present sha1annexedfile
subdirs = TestCase $ intmpclonerepo $ do
createDirectory "dir"
writeFile "dir/foo" $ content annexedfile
git_annex "add" ["dir"] @? "add of subdir failed"
createDirectory "dir2"
writeFile "dir2/foo" $ content annexedfile
changeWorkingDirectory "dir"
git_annex "add" ["../dir2"] @? "add of ../subdir failed"
2011-10-31 19:18:41 +00:00
test_reinject :: Test
test_reinject = "git-annex reinject/fromkey" ~: TestCase $ intmpclonerepo $ do
2011-12-20 19:48:25 +00:00
git_annex "drop" ["--force", sha1annexedfile] @? "drop failed"
2011-01-11 23:59:11 +00:00
writeFile tmp $ content sha1annexedfile
2012-06-05 23:54:44 +00:00
r <- annexeval $ Types.Backend.getKey backendSHA1 $
2012-06-21 17:04:24 +00:00
Types.KeySource.KeySource { Types.KeySource.keyFilename = tmp, Types.KeySource.contentLocation = tmp }
let key = Types.Key.key2file $ fromJust r
2011-12-20 19:48:25 +00:00
git_annex "reinject" [tmp, sha1annexedfile] @? "reinject failed"
git_annex "fromkey" [key, sha1annexedfiledup] @? "fromkey failed"
annexed_present sha1annexedfiledup
2012-11-11 04:51:07 +00:00
where
tmp = "tmpfile"
2011-01-11 23:59:11 +00:00
2011-01-07 01:39:26 +00:00
test_unannex :: Test
test_unannex = "git-annex unannex" ~: TestList [nocopy, withcopy]
2012-11-11 04:51:07 +00:00
where
nocopy = "no content" ~: intmpclonerepo $ do
annexed_notpresent annexedfile
git_annex "unannex" [annexedfile] @? "unannex failed with no copy"
annexed_notpresent annexedfile
withcopy = "with content" ~: intmpclonerepo $ do
git_annex "get" [annexedfile] @? "get failed"
annexed_present annexedfile
git_annex "unannex" [annexedfile, sha1annexedfile] @? "unannex failed"
unannexed annexedfile
git_annex "unannex" [annexedfile] @? "unannex failed on non-annexed file"
unannexed annexedfile
git_annex "unannex" [ingitfile] @? "unannex ingitfile should be no-op"
unannexed ingitfile
2011-01-07 01:39:26 +00:00
test_drop :: Test
2011-01-27 00:03:03 +00:00
test_drop = "git-annex drop" ~: TestList [noremote, withremote, untrustedremote]
2012-11-11 04:51:07 +00:00
where
noremote = "no remotes" ~: TestCase $ intmpclonerepo $ do
git_annex "get" [annexedfile] @? "get failed"
boolSystem "git" [Params "remote rm origin"]
@? "git remote rm origin failed"
not <$> git_annex "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of file"
annexed_present annexedfile
git_annex "drop" ["--force", annexedfile] @? "drop --force failed"
annexed_notpresent annexedfile
git_annex "drop" [annexedfile] @? "drop of dropped file failed"
git_annex "drop" [ingitfile] @? "drop ingitfile should be no-op"
unannexed ingitfile
withremote = "with remote" ~: TestCase $ intmpclonerepo $ do
git_annex "get" [annexedfile] @? "get failed"
annexed_present annexedfile
git_annex "drop" [annexedfile] @? "drop failed though origin has copy"
annexed_notpresent annexedfile
inmainrepo $ annexed_present annexedfile
untrustedremote = "untrusted remote" ~: TestCase $ intmpclonerepo $ do
git_annex "untrust" ["origin"] @? "untrust of origin failed"
git_annex "get" [annexedfile] @? "get failed"
annexed_present annexedfile
not <$> git_annex "drop" [annexedfile] @? "drop wrongly suceeded with only an untrusted copy of the file"
annexed_present annexedfile
inmainrepo $ annexed_present annexedfile
2011-01-07 02:22:09 +00:00
test_get :: Test
test_get = "git-annex get" ~: TestCase $ intmpclonerepo $ do
inmainrepo $ annexed_present annexedfile
annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "get" [annexedfile] @? "get of file failed"
inmainrepo $ annexed_present annexedfile
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "get" [annexedfile] @? "get of file already here failed"
inmainrepo $ annexed_present annexedfile
annexed_present annexedfile
inmainrepo $ unannexed ingitfile
unannexed ingitfile
2011-12-20 19:48:25 +00:00
git_annex "get" [ingitfile] @? "get ingitfile should be no-op"
inmainrepo $ unannexed ingitfile
unannexed ingitfile
2011-01-07 05:02:06 +00:00
test_move :: Test
test_move = "git-annex move" ~: TestCase $ intmpclonerepo $ do
annexed_notpresent annexedfile
inmainrepo $ annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "move" ["--from", "origin", annexedfile] @? "move --from of file failed"
annexed_present annexedfile
inmainrepo $ annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "move" ["--from", "origin", annexedfile] @? "move --from of file already here failed"
annexed_present annexedfile
inmainrepo $ annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "move" ["--to", "origin", annexedfile] @? "move --to of file failed"
inmainrepo $ annexed_present annexedfile
annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "move" ["--to", "origin", annexedfile] @? "move --to of file already there failed"
inmainrepo $ annexed_present annexedfile
annexed_notpresent annexedfile
unannexed ingitfile
inmainrepo $ unannexed ingitfile
2011-12-20 19:48:25 +00:00
git_annex "move" ["--to", "origin", ingitfile] @? "move of ingitfile should be no-op"
unannexed ingitfile
inmainrepo $ unannexed ingitfile
2011-12-20 19:48:25 +00:00
git_annex "move" ["--from", "origin", ingitfile] @? "move of ingitfile should be no-op"
unannexed ingitfile
inmainrepo $ unannexed ingitfile
2011-01-07 06:14:48 +00:00
test_copy :: Test
test_copy = "git-annex copy" ~: TestCase $ intmpclonerepo $ do
annexed_notpresent annexedfile
inmainrepo $ annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "copy" ["--from", "origin", annexedfile] @? "copy --from of file failed"
annexed_present annexedfile
inmainrepo $ annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "copy" ["--from", "origin", annexedfile] @? "copy --from of file already here failed"
annexed_present annexedfile
inmainrepo $ annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "copy" ["--to", "origin", annexedfile] @? "copy --to of file already there failed"
annexed_present annexedfile
inmainrepo $ annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "move" ["--to", "origin", annexedfile] @? "move --to of file already there failed"
annexed_notpresent annexedfile
inmainrepo $ annexed_present annexedfile
unannexed ingitfile
inmainrepo $ unannexed ingitfile
2011-12-20 19:48:25 +00:00
git_annex "copy" ["--to", "origin", ingitfile] @? "copy of ingitfile should be no-op"
unannexed ingitfile
inmainrepo $ unannexed ingitfile
2011-12-20 19:48:25 +00:00
git_annex "copy" ["--from", "origin", ingitfile] @? "copy of ingitfile should be no-op"
2011-01-07 06:18:39 +00:00
checkregularfile ingitfile
checkcontent ingitfile
2011-01-07 05:02:06 +00:00
test_lock :: Test
test_lock = "git-annex unlock/lock" ~: intmpclonerepo $ do
-- regression test: unlock of not present file should skip it
annexed_notpresent annexedfile
not <$> git_annex "unlock" [annexedfile] @? "unlock failed to fail with not present file"
annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "get" [annexedfile] @? "get of file failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "unlock" [annexedfile] @? "unlock failed"
unannexed annexedfile
-- write different content, to verify that lock
-- throws it away
changecontent annexedfile
writeFile annexedfile $ content annexedfile ++ "foo"
2011-12-20 19:48:25 +00:00
git_annex "lock" [annexedfile] @? "lock failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "unlock" [annexedfile] @? "unlock failed"
unannexed annexedfile
changecontent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "add" [annexedfile] @? "add of modified file failed"
runchecks [checklink, checkunwritable] annexedfile
c <- readFile annexedfile
assertEqual "content of modified file" c (changedcontent annexedfile)
2011-12-20 19:48:25 +00:00
r' <- git_annex "drop" [annexedfile]
not r' @? "drop wrongly succeeded with no known copy of modified file"
test_edit :: Test
2011-01-12 00:48:58 +00:00
test_edit = "git-annex edit/commit" ~: TestList [t False, t True]
2012-11-11 04:51:07 +00:00
where t precommit = TestCase $ intmpclonerepo $ do
git_annex "get" [annexedfile] @? "get of file failed"
annexed_present annexedfile
git_annex "edit" [annexedfile] @? "edit failed"
unannexed annexedfile
changecontent annexedfile
if precommit
then do
-- pre-commit depends on the file being
-- staged, normally git commit does this
boolSystem "git" [Param "add", File annexedfile]
@? "git add of edited file failed"
git_annex "pre-commit" []
@? "pre-commit failed"
else do
boolSystem "git" [Params "commit -q -a -m contentchanged"]
@? "git commit of edited file failed"
runchecks [checklink, checkunwritable] annexedfile
c <- readFile annexedfile
assertEqual "content of modified file" c (changedcontent annexedfile)
not <$> git_annex "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of modified file"
test_fix :: Test
test_fix = "git-annex fix" ~: intmpclonerepo $ do
2011-01-07 18:08:43 +00:00
annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "fix" [annexedfile] @? "fix of not present failed"
2011-01-07 18:08:43 +00:00
annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "get" [annexedfile] @? "get of file failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "fix" [annexedfile] @? "fix of present file failed"
2011-01-07 18:08:43 +00:00
annexed_present annexedfile
createDirectory subdir
boolSystem "git" [Param "mv", File annexedfile, File subdir]
@? "git mv failed"
2011-12-20 19:48:25 +00:00
git_annex "fix" [newfile] @? "fix of moved file failed"
runchecks [checklink, checkunwritable] newfile
c <- readFile newfile
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
2011-01-11 22:50:18 +00:00
test_trust :: Test
test_trust = "git-annex trust/untrust/semitrust/dead" ~: intmpclonerepo $ do
2011-12-20 19:48:25 +00:00
git_annex "trust" [repo] @? "trust failed"
2011-10-15 20:21:08 +00:00
trustcheck Logs.Trust.Trusted "trusted 1"
2011-12-20 19:48:25 +00:00
git_annex "trust" [repo] @? "trust of trusted failed"
2011-10-15 20:21:08 +00:00
trustcheck Logs.Trust.Trusted "trusted 2"
2011-12-20 19:48:25 +00:00
git_annex "untrust" [repo] @? "untrust failed"
2011-10-15 20:21:08 +00:00
trustcheck Logs.Trust.UnTrusted "untrusted 1"
2011-12-20 19:48:25 +00:00
git_annex "untrust" [repo] @? "untrust of untrusted failed"
2011-10-15 20:21:08 +00:00
trustcheck Logs.Trust.UnTrusted "untrusted 2"
git_annex "dead" [repo] @? "dead failed"
trustcheck Logs.Trust.DeadTrusted "deadtrusted 1"
git_annex "dead" [repo] @? "dead of dead failed"
trustcheck Logs.Trust.DeadTrusted "deadtrusted 2"
2011-12-20 19:48:25 +00:00
git_annex "semitrust" [repo] @? "semitrust failed"
2011-10-15 20:21:08 +00:00
trustcheck Logs.Trust.SemiTrusted "semitrusted 1"
2011-12-20 19:48:25 +00:00
git_annex "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
2011-01-11 23:34:28 +00:00
test_fsck :: Test
2011-12-21 18:20:41 +00:00
test_fsck = "git-annex fsck" ~: TestList [basicfsck, barefsck, withlocaluntrusted, withremoteuntrusted]
2012-11-11 04:51:07 +00:00
where
basicfsck = TestCase $ intmpclonerepo $ do
git_annex "fsck" [] @? "fsck failed"
boolSystem "git" [Params "config annex.numcopies 2"] @? "git config failed"
fsck_should_fail "numcopies unsatisfied"
boolSystem "git" [Params "config annex.numcopies 1"] @? "git config failed"
corrupt annexedfile
corrupt sha1annexedfile
barefsck = TestCase $ intmpbareclonerepo $ do
git_annex "fsck" [] @? "fsck failed"
withlocaluntrusted = TestCase $ intmpclonerepo $ do
git_annex "get" [annexedfile] @? "get failed"
git_annex "untrust" ["origin"] @? "untrust of origin repo failed"
git_annex "untrust" ["."] @? "untrust of current repo failed"
fsck_should_fail "content only available in untrusted (current) repository"
git_annex "trust" ["."] @? "trust of current repo failed"
git_annex "fsck" [annexedfile] @? "fsck failed on file present in trusted repo"
withremoteuntrusted = TestCase $ intmpclonerepo $ do
boolSystem "git" [Params "config annex.numcopies 2"] @? "git config failed"
git_annex "get" [annexedfile] @? "get failed"
git_annex "get" [sha1annexedfile] @? "get failed"
git_annex "fsck" [] @? "fsck failed with numcopies=2 and 2 copies"
git_annex "untrust" ["origin"] @? "untrust of origin failed"
fsck_should_fail "content not replicated to enough non-untrusted repositories"
corrupt f = do
git_annex "get" [f] @? "get of file failed"
Utility.FileMode.allowWrite f
writeFile f (changedcontent f)
not <$> git_annex "fsck" [] @? "fsck failed to fail with corrupted file content"
git_annex "fsck" [] @? "fsck unexpectedly failed again; previous one did not fix problem with " ++ f
fsck_should_fail m = do
not <$> git_annex "fsck" [] @? "fsck failed to fail with " ++ m
2011-01-11 23:34:28 +00:00
2011-01-12 01:11:32 +00:00
test_migrate :: Test
test_migrate = "git-annex migrate" ~: TestList [t False, t True]
2012-11-11 04:51:07 +00:00
where t usegitattributes = TestCase $ intmpclonerepo $ do
annexed_notpresent annexedfile
annexed_notpresent sha1annexedfile
git_annex "migrate" [annexedfile] @? "migrate of not present failed"
git_annex "migrate" [sha1annexedfile] @? "migrate of not present failed"
git_annex "get" [annexedfile] @? "get of file failed"
git_annex "get" [sha1annexedfile] @? "get of file failed"
annexed_present annexedfile
annexed_present sha1annexedfile
if usegitattributes
then do
writeFile ".gitattributes" $ "* annex.backend=SHA1"
git_annex "migrate" [sha1annexedfile]
@? "migrate sha1annexedfile failed"
git_annex "migrate" [annexedfile]
@? "migrate annexedfile failed"
else do
git_annex "migrate" [sha1annexedfile, "--backend", "SHA1"]
@? "migrate sha1annexedfile failed"
git_annex "migrate" [annexedfile, "--backend", "SHA1"]
@? "migrate annexedfile failed"
annexed_present annexedfile
annexed_present sha1annexedfile
checkbackend annexedfile backendSHA1
checkbackend sha1annexedfile backendSHA1
-- check that reversing a migration works
writeFile ".gitattributes" $ "* annex.backend=SHA256"
git_annex "migrate" [sha1annexedfile]
@? "migrate sha1annexedfile failed"
git_annex "migrate" [annexedfile]
@? "migrate annexedfile failed"
annexed_present annexedfile
annexed_present sha1annexedfile
checkbackend annexedfile backendSHA256
checkbackend sha1annexedfile backendSHA256
2011-01-12 01:11:32 +00:00
2011-01-12 05:58:23 +00:00
test_unused :: Test
test_unused = "git-annex unused/dropunused" ~: intmpclonerepo $ do
-- keys have to be looked up before files are removed
annexedfilekey <- annexeval $ findkey annexedfile
sha1annexedfilekey <- annexeval $ findkey sha1annexedfile
2011-12-20 19:48:25 +00:00
git_annex "get" [annexedfile] @? "get of file failed"
git_annex "get" [sha1annexedfile] @? "get of file failed"
checkunused [] "after get"
boolSystem "git" [Params "rm -q", File annexedfile] @? "git rm failed"
checkunused [] "after rm"
2011-09-30 01:11:48 +00:00
boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed"
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"
checkunused [annexedfilekey] "after origin branches are gone"
boolSystem "git" [Params "rm -q", File sha1annexedfile] @? "git rm failed"
2011-09-30 01:11:48 +00:00
boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed"
checkunused [annexedfilekey, sha1annexedfilekey] "after rm sha1annexedfile"
2011-01-12 05:58:23 +00:00
-- good opportunity to test dropkey also
git_annex "dropkey" ["--force", Types.Key.key2file annexedfilekey]
2011-01-12 05:58:23 +00:00
@? "dropkey failed"
checkunused [sha1annexedfilekey] ("after dropkey --force " ++ Types.Key.key2file annexedfilekey)
2011-01-12 05:58:23 +00:00
2011-12-20 19:48:25 +00:00
git_annex "dropunused" ["1", "2"] @? "dropunused failed"
checkunused [] "after dropunused"
2011-12-20 19:48:25 +00:00
git_annex "dropunused" ["10", "501"] @? "dropunused failed on bogus numbers"
2011-01-12 05:58:23 +00:00
2012-11-11 04:51:07 +00:00
where
checkunused expectedkeys desc = do
git_annex "unused" [] @? "unused failed"
unusedmap <- annexeval $ Logs.Unused.readUnusedLog ""
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
test_describe :: Test
test_describe = "git-annex describe" ~: intmpclonerepo $ do
git_annex "describe" [".", "this repo"] @? "describe 1 failed"
git_annex "describe" ["origin", "origin repo"] @? "describe 2 failed"
test_find :: Test
test_find = "git-annex find" ~: intmpclonerepo $ do
annexed_notpresent annexedfile
2011-12-21 06:32:40 +00:00
git_annex_expectoutput "find" [] []
git_annex "get" [annexedfile] @? "get failed"
annexed_present annexedfile
annexed_notpresent sha1annexedfile
git_annex_expectoutput "find" [] [annexedfile]
git_annex_expectoutput "find" ["--exclude", annexedfile, "--and", "--exclude", sha1annexedfile] []
git_annex_expectoutput "find" ["--include", annexedfile] [annexedfile]
2011-12-21 06:32:40 +00:00
git_annex_expectoutput "find" ["--not", "--in", "origin"] []
git_annex_expectoutput "find" ["--copies", "1", "--and", "--not", "--copies", "2"] [sha1annexedfile]
git_annex_expectoutput "find" ["--inbackend", "SHA1"] [sha1annexedfile]
git_annex_expectoutput "find" ["--inbackend", "WORM"] []
test_merge :: Test
test_merge = "git-annex merge" ~: intmpclonerepo $ do
git_annex "merge" [] @? "merge failed"
test_status :: Test
test_status = "git-annex status" ~: intmpclonerepo $ do
2011-12-21 06:32:40 +00:00
json <- git_annex_output "status" ["--json"]
case Text.JSON.decodeStrict json :: Text.JSON.Result (JSObject JSValue) of
Ok _ -> return ()
Error e -> assertFailure e
test_version :: Test
test_version = "git-annex version" ~: intmpclonerepo $ do
git_annex "version" [] @? "version failed"
test_sync :: Test
test_sync = "git-annex sync" ~: intmpclonerepo $ do
git_annex "sync" [] @? "sync failed"
test_map :: Test
test_map = "git-annex map" ~: intmpclonerepo $ do
-- set descriptions, that will be looked for in the map
git_annex "describe" [".", "this repo"] @? "describe 1 failed"
git_annex "describe" ["origin", "origin repo"] @? "describe 2 failed"
-- --fast avoids it running graphviz, not a build dependency
git_annex "map" ["--fast"] @? "map failed"
test_uninit :: Test
test_uninit = "git-annex uninit" ~: intmpclonerepo $ do
git_annex "get" [] @? "get failed"
annexed_present annexedfile
boolSystem "git" [Params "checkout git-annex"] @? "git checkout git-annex"
not <$> git_annex "uninit" [] @? "uninit failed to fail when git-annex branch was checked out"
boolSystem "git" [Params "checkout master"] @? "git checkout master"
2011-12-21 06:32:40 +00:00
_ <- git_annex "uninit" [] -- exit status not checked; does abnormal exit
checkregularfile annexedfile
doesDirectoryExist ".git" @? ".git vanished in uninit"
2011-12-21 06:32:40 +00:00
not <$> doesDirectoryExist ".git/annex" @? ".git/annex still present after uninit"
test_upgrade :: Test
test_upgrade = "git-annex upgrade" ~: intmpclonerepo $ do
git_annex "upgrade" [] @? "upgrade from same version failed"
test_whereis :: Test
test_whereis = "git-annex whereis" ~: intmpclonerepo $ do
annexed_notpresent annexedfile
git_annex "whereis" [annexedfile] @? "whereis on non-present file failed"
git_annex "untrust" ["origin"] @? "untrust failed"
not <$> git_annex "whereis" [annexedfile] @? "whereis on non-present file only present in untrusted repo failed to fail"
git_annex "get" [annexedfile] @? "get failed"
annexed_present annexedfile
git_annex "whereis" [annexedfile] @? "whereis on present file failed"
test_hook_remote :: Test
test_hook_remote = "git-annex hook remote" ~: intmpclonerepo $ do
git_annex "initremote" (words "foo type=hook encryption=none hooktype=foo") @? "initremote failed"
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"
2011-12-20 19:48:25 +00:00
git_annex "get" [annexedfile] @? "get of file failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "copy" [annexedfile, "--to", "foo"] @? "copy --to hook remote failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "move" [annexedfile, "--from", "foo"] @? "move --from hook remote failed"
annexed_present annexedfile
not <$> git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
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"
test_directory_remote :: Test
test_directory_remote = "git-annex directory remote" ~: intmpclonerepo $ do
createDirectory "dir"
git_annex "initremote" (words $ "foo type=directory encryption=none directory=dir") @? "initremote failed"
2011-12-20 19:48:25 +00:00
git_annex "get" [annexedfile] @? "get of file failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "copy" [annexedfile, "--to", "foo"] @? "copy --to directory remote failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "move" [annexedfile, "--from", "foo"] @? "move --from directory remote failed"
annexed_present annexedfile
not <$> git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
annexed_present annexedfile
test_rsync_remote :: Test
test_rsync_remote = "git-annex rsync remote" ~: intmpclonerepo $ do
createDirectory "dir"
git_annex "initremote" (words $ "foo type=rsync encryption=none rsyncurl=dir") @? "initremote failed"
2011-12-20 19:48:25 +00:00
git_annex "get" [annexedfile] @? "get of file failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "copy" [annexedfile, "--to", "foo"] @? "copy --to rsync remote failed"
annexed_present annexedfile
2011-12-20 19:48:25 +00:00
git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
annexed_notpresent annexedfile
2011-12-20 19:48:25 +00:00
git_annex "move" [annexedfile, "--from", "foo"] @? "move --from rsync remote failed"
annexed_present annexedfile
not <$> git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
annexed_present annexedfile
2011-12-21 17:50:33 +00:00
test_bup_remote :: Test
2011-12-21 18:10:36 +00:00
test_bup_remote = "git-annex bup remote" ~: intmpclonerepo $ 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
git_annex "initremote" (words $ "foo type=bup encryption=none buprepo="++dir) @? "initremote failed"
git_annex "get" [annexedfile] @? "get of file failed"
annexed_present annexedfile
git_annex "copy" [annexedfile, "--to", "foo"] @? "copy --to bup remote failed"
annexed_present annexedfile
git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
annexed_notpresent annexedfile
git_annex "copy" [annexedfile, "--from", "foo"] @? "copy --from bup remote failed"
annexed_present annexedfile
not <$> git_annex "move" [annexedfile, "--from", "foo"] @? "move --from bup remote failed to fail"
annexed_present annexedfile
2011-12-21 18:10:36 +00:00
-- gpg is not a build dependency, so only test when it's available
test_crypto :: Test
2011-12-21 18:10:36 +00:00
test_crypto = "git-annex crypto" ~: intmpclonerepo $ when Build.SysConfig.gpg $ do
-- force gpg into batch mode for the tests
setEnv "GPG_BATCH" "1" True
2011-12-21 18:10:36 +00:00
Utility.Gpg.testTestHarness @? "test harness self-test failed"
Utility.Gpg.testHarness $ do
createDirectory "dir"
let initremote = git_annex "initremote"
[ "foo"
, "type=directory"
, "encryption=" ++ Utility.Gpg.testKeyId
, "directory=dir"
]
initremote @? "initremote failed"
initremote @? "initremote failed when run twice in a row"
git_annex "get" [annexedfile] @? "get of file failed"
annexed_present annexedfile
git_annex "copy" [annexedfile, "--to", "foo"] @? "copy --to encrypted remote failed"
annexed_present annexedfile
git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
annexed_notpresent annexedfile
git_annex "move" [annexedfile, "--from", "foo"] @? "move --from encrypted remote failed"
annexed_present annexedfile
not <$> git_annex "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
annexed_present annexedfile
2011-01-11 22:50:18 +00:00
-- This is equivilant to running git-annex, but it's all run in-process
-- so test coverage collection works.
git_annex :: String -> [String] -> IO Bool
git_annex command params = do
2011-01-07 01:39:26 +00:00
-- catch all errors, including normally fatal errors
2012-02-03 20:57:07 +00:00
r <- try (run)::IO (Either SomeException ())
case r of
Right _ -> return True
Left _ -> return False
2012-11-11 04:51:07 +00:00
where
run = GitAnnex.run (command:"-q":params)
2011-12-21 06:32:40 +00:00
{- Runs git-annex and returns its output. -}
git_annex_output :: String -> [String] -> IO String
git_annex_output command params = do
got <- Utility.Process.readProcess "git-annex" (command:params)
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.
-- Run same command again, to get code coverage.
2011-12-21 06:32:40 +00:00
_ <- git_annex command params
return got
git_annex_expectoutput :: String -> [String] -> [String] -> IO ()
git_annex_expectoutput command params expected = do
got <- lines <$> git_annex_output command params
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.
annexeval :: Types.Annex a -> IO a
2011-01-11 22:50:18 +00:00
annexeval a = do
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
innewrepo :: Assertion -> Assertion
innewrepo a = withgitrepo $ \r -> indir r a
2011-01-07 01:39:26 +00:00
inmainrepo :: Assertion -> Assertion
inmainrepo a = indir mainrepodir a
2011-01-07 01:39:26 +00:00
intmpclonerepo :: Assertion -> Assertion
2011-12-21 18:20:41 +00:00
intmpclonerepo a = withtmpclonerepo False $ \r -> indir r a
intmpbareclonerepo :: Assertion -> Assertion
intmpbareclonerepo a = withtmpclonerepo True $ \r -> indir r a
2011-01-07 02:22:09 +00:00
2011-12-21 18:20:41 +00:00
withtmpclonerepo :: Bool -> (FilePath -> Assertion) -> Assertion
withtmpclonerepo bare = bracket (clonerepo mainrepodir tmprepodir bare) cleanup
2011-01-07 02:22:09 +00:00
2011-01-07 01:39:26 +00:00
withgitrepo :: (FilePath -> Assertion) -> Assertion
withgitrepo = bracket (setuprepo mainrepodir) return
2011-01-07 01:39:26 +00:00
indir :: FilePath -> Assertion -> Assertion
indir dir a = do
cwd <- getCurrentDirectory
-- Assertion failures throw non-IO errors; catch
-- any type of error and change back to cwd before
-- rethrowing.
2011-11-26 16:08:54 +00:00
r <- bracket_ (changeToTmpDir dir) (changeWorkingDirectory cwd)
2012-02-03 20:57:07 +00:00
(try (a)::IO (Either SomeException ()))
case r of
Right () -> return ()
Left e -> throw e
2011-01-07 01:39:26 +00:00
setuprepo :: FilePath -> IO FilePath
setuprepo dir = do
cleanup dir
ensuretmpdir
boolSystem "git" [Params "init -q", File dir] @? "git init failed"
indir 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"
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
2011-12-21 18:20:41 +00:00
clonerepo :: FilePath -> FilePath -> Bool -> IO FilePath
clonerepo 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"
indir new $ git_annex "init" ["-q", new] @? "git annex init failed"
2011-01-07 02:22:09 +00:00
return new
2011-01-07 01:39:26 +00:00
ensuretmpdir :: IO ()
ensuretmpdir = do
e <- doesDirectoryExist tmpdir
unless e $
createDirectory tmpdir
cleanup :: FilePath -> IO ()
cleanup dir = do
e <- doesDirectoryExist dir
when e $ do
-- git-annex prevents annexed file content from being
2011-02-09 05:01:06 +00:00
-- removed via directory permissions; undo
recurseDir SystemFS dir >>=
filterM doesDirectoryExist >>=
2011-09-28 19:17:45 +00:00
mapM_ Utility.FileMode.allowWrite
2011-01-07 01:39:26 +00:00
removeDirectoryRecursive dir
2011-01-07 02:22:09 +00:00
checklink :: FilePath -> Assertion
checklink f = do
s <- getSymbolicLinkStatus f
2011-01-07 05:02:06 +00:00
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
c <- readFile f
assertEqual ("checkcontent " ++ f) c (content f)
2011-01-07 02:22:09 +00:00
checkunwritable :: FilePath -> Assertion
checkunwritable f = do
2011-04-27 00:21:24 +00:00
-- 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
if (mode == mode `unionFileModes` ownerWriteMode)
then assertFailure $ "able to modify annexed file's " ++ f ++ " content"
else return ()
2011-01-07 02:22:09 +00:00
checkwritable :: FilePath -> Assertion
checkwritable f = do
2012-02-03 20:57:07 +00:00
r <- tryIO $ writeFile f $ content f
case r of
Left _ -> assertFailure $ "unable to modify " ++ f
Right _ -> return ()
2011-01-07 02:22:09 +00:00
checkdangling :: FilePath -> Assertion
checkdangling f = do
2012-02-03 20:57:07 +00:00
r <- tryIO $ readFile f
2011-01-07 02:22:09 +00:00
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
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
uuids <- annexeval $ Remote.keyLocations k
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
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]
annexed_present :: FilePath -> Assertion
2011-01-11 19:43:29 +00:00
annexed_present = runchecks
[checklink, checkcontent, checkunwritable, inlocationlog]
unannexed :: FilePath -> Assertion
unannexed = runchecks [checkregularfile, checkcontent, checkwritable]
prepare :: IO ()
prepare = do
-- While PATH is mostly avoided, the commit hook does run it,
-- and so does git_annex_output. Make sure that the just-built
-- git annex is used.
cwd <- getCurrentDirectory
p <- getEnvDefault "PATH" ""
setEnv "PATH" (cwd ++ ":" ++ p) True
setEnv "TOPDIR" cwd True
-- Avoid git complaining if it cannot determine the user's email
-- address, or exploding if it doesn't know the user's name.
setEnv "GIT_AUTHOR_EMAIL" "test@example.com" True
setEnv "GIT_AUTHOR_NAME" "git-annex test" True
setEnv "GIT_COMMITTER_EMAIL" "test@example.com" True
setEnv "GIT_COMMITTER_NAME" "git-annex test" True
changeToTmpDir :: FilePath -> IO ()
changeToTmpDir t = do
-- Hack alert. Threading state to here was too much bother.
topdir <- getEnvDefault "TOPDIR" ""
changeWorkingDirectory $ topdir ++ "/" ++ t
tmpdir :: String
2011-01-07 01:39:26 +00:00
tmpdir = ".t"
mainrepodir :: String
mainrepodir = tmpdir ++ "/repo"
2011-01-07 01:39:26 +00:00
tmprepodir :: String
tmprepodir = tmpdir ++ "/tmprepo"
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"
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"
| 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
changecontent :: FilePath -> IO ()
changecontent f = writeFile f $ changedcontent f
changedcontent :: FilePath -> String
changedcontent f = (content f) ++ " (modified)"
2011-12-31 08:11:39 +00:00
backendSHA1 :: Types.Backend
backendSHA1 = backend_ "SHA1"
2011-12-31 08:11:39 +00:00
backendSHA256 :: Types.Backend
backendSHA256 = backend_ "SHA256"
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
backend_ name = Backend.lookupBackendName name