diff options
-rw-r--r-- | Command/Semitrust.hs | 4 | ||||
-rw-r--r-- | Command/Trust.hs | 4 | ||||
-rw-r--r-- | Command/Untrust.hs | 4 | ||||
-rw-r--r-- | Remotes.hs | 1 | ||||
-rw-r--r-- | Trust.hs | 2 | ||||
-rw-r--r-- | debian/changelog | 1 | ||||
-rw-r--r-- | doc/git-annex.mdwn | 2 | ||||
-rw-r--r-- | test.hs | 64 |
8 files changed, 47 insertions, 35 deletions
diff --git a/Command/Semitrust.hs b/Command/Semitrust.hs index 8ed95f5a3..a91d25359 100644 --- a/Command/Semitrust.hs +++ b/Command/Semitrust.hs @@ -21,11 +21,11 @@ command = [Command "semitrust" (paramRepeating paramRemote) seek seek :: [CommandSeek] seek = [withString start] -{- Marks a remote as not trusted. -} start :: CommandStartString start name = do + showStart "semitrust" name + Remotes.readConfigs r <- Remotes.byName name - showStart "untrust" name return $ Just $ perform r perform :: Git.Repo -> CommandPerform diff --git a/Command/Trust.hs b/Command/Trust.hs index a40c8dccc..3fbff68b8 100644 --- a/Command/Trust.hs +++ b/Command/Trust.hs @@ -21,11 +21,11 @@ command = [Command "trust" (paramRepeating paramRemote) seek seek :: [CommandSeek] seek = [withString start] -{- Marks a remote as trusted. -} start :: CommandStartString start name = do - r <- Remotes.byName name showStart "trust" name + Remotes.readConfigs + r <- Remotes.byName name return $ Just $ perform r perform :: Git.Repo -> CommandPerform diff --git a/Command/Untrust.hs b/Command/Untrust.hs index 9e884e812..69d0ab391 100644 --- a/Command/Untrust.hs +++ b/Command/Untrust.hs @@ -21,11 +21,11 @@ command = [Command "untrust" (paramRepeating paramRemote) seek seek :: [CommandSeek] seek = [withString start] -{- Marks a remote as not trusted. -} start :: CommandStartString start name = do - r <- Remotes.byName name showStart "untrust" name + Remotes.readConfigs + r <- Remotes.byName name return $ Just $ perform r perform :: Git.Repo -> CommandPerform diff --git a/Remotes.hs b/Remotes.hs index e8a78a59e..fe5b7f767 100644 --- a/Remotes.hs +++ b/Remotes.hs @@ -222,6 +222,7 @@ same a b = Git.repoRemoteName a == Git.repoRemoteName b {- Looks up a remote by name. -} byName :: String -> Annex Git.Repo +byName "." = Annex.gitRepo -- special case to refer to current repository byName name = do when (null name) $ error "no remote specified" g <- Annex.gitRepo @@ -73,6 +73,8 @@ trustMapParse s = M.fromList $ map pair $ filter (not . null) $ lines s {- Changes the trust level for a uuid in the trustLog, and commits it. -} trustSet :: UUID -> TrustLevel -> Annex () trustSet uuid level = do + when (null uuid) $ + error "unknown UUID; cannot modify trust level" m <- trustMap when (M.lookup uuid m /= Just level) $ do let m' = M.insert uuid level m diff --git a/debian/changelog b/debian/changelog index 529a0896b..8b863b947 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,7 @@ git-annex (0.19) UNRELEASED; urgency=low * There are now three levels of repository trust. * untrust: Now marks the current repository as untrusted. * semitrust: Now restores the default trust level. (What untrust used to do.) + * fsck: Warn if content is only in untrusted repositories. -- Joey Hess <joeyh@debian.org> Wed, 19 Jan 2011 18:07:51 -0400 diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 9c2be8dc9..d2cde35a0 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -186,6 +186,8 @@ Many git-annex commands will stage changes for later `git commit` by you. Records that a repository is [[trusted|trust]] to not unexpectedly lose content. Use with care. + To trust the current repository, use "." + * untrust [repository ...] Records that a repository is [[not trusted|trust]] and could lose content @@ -42,7 +42,7 @@ import qualified Command.DropUnused main :: IO () main = do prepare - r <- runVerboseTests $ TestList [quickchecks, toplevels] + r <- runVerboseTests $ TestList [quickcheck, blackbox] cleanup tmpdir propigate r @@ -51,8 +51,8 @@ propigate (Counts { errors = e }, _) | e > 0 = error "failed" | otherwise = return () -quickchecks :: Test -quickchecks = TestLabel "quickchecks" $ TestList +quickcheck :: Test +quickcheck = TestLabel "quickcheck" $ TestList [ qctest "prop_idempotent_deencode" Git.prop_idempotent_deencode , qctest "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey , qctest "prop_idempotent_key_read_show" BackendTypes.prop_idempotent_key_read_show @@ -62,8 +62,8 @@ quickchecks = TestLabel "quickchecks" $ TestList , qctest "prop_relPathDirToDir_basics" Utility.prop_relPathDirToDir_basics ] -toplevels :: Test -toplevels = TestLabel "toplevel" $ TestList +blackbox :: Test +blackbox = TestLabel "blackbox" $ TestList -- test order matters, later tests may rely on state from earlier [ test_init , test_add @@ -290,38 +290,44 @@ test_fix = "git-annex fix" ~: intmpclonerepo $ do test_trust :: Test test_trust = "git-annex trust/untrust/semitrust" ~: intmpclonerepo $ do - trustcheck Trust.SemiTrusted - git_annex "trust" ["-q", "origin"] @? "trust failed" - trustcheck Trust.Trusted - git_annex "trust" ["-q", "origin"] @? "trust of trusted failed" - trustcheck Trust.Trusted - git_annex "untrust" ["-q", "origin"] @? "untrust failed" - trustcheck Trust.UnTrusted - git_annex "untrust" ["-q", "origin"] @? "untrust of untrusted failed" - trustcheck Trust.UnTrusted - git_annex "semitrust" ["-q", "origin"] @? "semitrust failed" - trustcheck Trust.SemiTrusted - git_annex "semitrust" ["-q", "origin"] @? "semitrust of semitrusted failed" - trustcheck Trust.SemiTrusted + git_annex "trust" ["-q", repo] @? "trust failed" + trustcheck Trust.Trusted "trusted 1" + git_annex "trust" ["-q", repo] @? "trust of trusted failed" + trustcheck Trust.Trusted "trusted 2" + git_annex "untrust" ["-q", repo] @? "untrust failed" + trustcheck Trust.UnTrusted "untrusted 1" + git_annex "untrust" ["-q", repo] @? "untrust of untrusted failed" + trustcheck Trust.UnTrusted "untrusted 2" + git_annex "semitrust" ["-q", repo] @? "semitrust failed" + trustcheck Trust.SemiTrusted "semitrusted 1" + git_annex "semitrust" ["-q", repo] @? "semitrust of semitrusted failed" + trustcheck Trust.SemiTrusted "semitrusted 2" where - trustcheck expected = do + trustcheck expected msg = do present <- annexeval $ do + Remotes.readConfigs l <- Trust.trustGet expected - r <- Remotes.byName "origin" + r <- Remotes.byName repo u <- UUID.getUUID r return $ elem u l - assertEqual ("trust value " ++ show expected) True present + assertBool msg present + repo = "origin" test_fsck :: Test -test_fsck = "git-annex fsck" ~: intmpclonerepo $ do - git_annex "fsck" ["-q"] @? "fsck failed" - Utility.boolSystem "git" ["config", "annex.numcopies", "2"] @? "git config failed" - r <- git_annex "fsck" ["-q"] - not r @? "fsck failed to fail with numcopies unsatisfied" - Utility.boolSystem "git" ["config", "annex.numcopies", "1"] @? "git config failed" - corrupt annexedfile - corrupt sha1annexedfile +test_fsck = "git-annex fsck" ~: TestList [basicfsck, withlocaluntrusted] where + basicfsck = TestCase $ intmpclonerepo $ do + git_annex "fsck" ["-q"] @? "fsck failed" + Utility.boolSystem "git" ["config", "annex.numcopies", "2"] @? "git config failed" + r <- git_annex "fsck" ["-q"] + not r @? "fsck failed to fail with numcopies unsatisfied" + Utility.boolSystem "git" ["config", "annex.numcopies", "1"] @? "git config failed" + corrupt annexedfile + corrupt sha1annexedfile + withlocaluntrusted = TestCase $ intmpcopyrepo $ do + git_annex "untrust" ["-q", "."] @? "untrust of current repo failed" + r <- git_annex "fsck" ["-q"] + not r @? "fsck failed to fail with content only available in untrusted (current) repository" corrupt f = do git_annex "get" ["-q", f] @? "get of file failed" Content.allowWrite f |