diff --git a/Creds.hs b/Creds.hs index 3bbf6f7b28..02fc67c3a9 100644 --- a/Creds.hs +++ b/Creds.hs @@ -42,12 +42,11 @@ import qualified Utility.FileIO as F import qualified Data.ByteString.Lazy.Char8 as L8 import qualified Data.ByteString.Char8 as S8 import qualified Data.Map as M -import qualified System.FilePath.ByteString as P {- A CredPair can be stored in a file, or in the environment, or - in a remote's configuration. -} data CredPairStorage = CredPairStorage - { credPairFile :: FilePath + { credPairFile :: OsPath , credPairEnvironment :: (String, String) , credPairRemoteField :: RemoteConfigField } @@ -196,21 +195,21 @@ existsCacheCredPair storage = {- Stores the creds in a file inside gitAnnexCredsDir that only the user - can read. -} -writeCreds :: Creds -> FilePath -> Annex () +writeCreds :: Creds -> OsPath -> Annex () writeCreds creds file = do d <- fromRepo gitAnnexCredsDir createAnnexDirectory d - liftIO $ writeFileProtected (d P. toRawFilePath file) creds + liftIO $ writeFileProtected (d file) creds -readCreds :: FilePath -> Annex (Maybe Creds) +readCreds :: OsPath -> Annex (Maybe Creds) readCreds f = do - f' <- toOsPath . toRawFilePath <$> credsFile f + f' <- credsFile f liftIO $ catchMaybeIO $ decodeBS . S8.unlines . fileLines' <$> F.readFile' f' -credsFile :: FilePath -> Annex FilePath +credsFile :: OsPath -> Annex OsPath credsFile basefile = do - d <- fromRawFilePath <$> fromRepo gitAnnexCredsDir + d <- fromRepo gitAnnexCredsDir return $ d basefile encodeCredPair :: CredPair -> Creds @@ -221,10 +220,10 @@ decodeCredPair creds = case lines creds of l:p:[] -> Just (l, p) _ -> Nothing -removeCreds :: FilePath -> Annex () +removeCreds :: OsPath -> Annex () removeCreds file = do d <- fromRepo gitAnnexCredsDir - liftIO $ removeWhenExistsWith R.removeLink (d P. toRawFilePath file) + liftIO $ removeWhenExistsWith R.removeLink (fromOsPath (d file)) includeCredsInfo :: ParsedRemoteConfig -> CredPairStorage -> [(String, String)] -> Annex [(String, String)] includeCredsInfo pc@(ParsedRemoteConfig cm _) storage info = do diff --git a/Database/Benchmark.hs b/Database/Benchmark.hs index 552236df95..d2296dc33c 100644 --- a/Database/Benchmark.hs +++ b/Database/Benchmark.hs @@ -26,13 +26,12 @@ import qualified Data.ByteString.Short as S (toShort) import qualified Data.ByteString.Char8 as B8 import System.Random import Control.Concurrent -import qualified System.FilePath.ByteString as P #endif benchmarkDbs :: CriterionMode -> Integer -> Annex () #ifdef WITH_BENCHMARK -benchmarkDbs mode n = withTmpDirIn "." (toOsPath "benchmark") $ \tmpdir -> do - db <- benchDb (toRawFilePath tmpdir) n +benchmarkDbs mode n = withTmpDirIn (literalOsPath ".") (literalOsPath "benchmark") $ \tmpdir -> do + db <- benchDb tmpdir n liftIO $ runMode mode [ bgroup "keys database" [ getAssociatedFilesHitBench db @@ -93,7 +92,7 @@ keyN n = mkKey $ \k -> k } fileN :: Integer -> TopFilePath -fileN n = asTopFilePath (toRawFilePath ("file" ++ show n)) +fileN n = asTopFilePath (toOsPath ("file" ++ show n)) keyMiss :: Key keyMiss = keyN 0 -- 0 is never stored @@ -103,7 +102,7 @@ fileMiss = fileN 0 -- 0 is never stored data BenchDb = BenchDb H.DbQueue Integer (MVar Integer) -benchDb :: RawFilePath -> Integer -> Annex BenchDb +benchDb :: OsPath -> Integer -> Annex BenchDb benchDb tmpdir num = do liftIO $ putStrLn $ "setting up database with " ++ show num ++ " items" initDb db SQL.createTables @@ -115,6 +114,6 @@ benchDb tmpdir num = do mv <- liftIO $ newMVar 1 return (BenchDb h num mv) where - db = tmpdir P. toRawFilePath (show num "db") + db = tmpdir toOsPath (show num) literalOsPath "db" #endif /* WITH_BENCHMARK */ diff --git a/Database/Init.hs b/Database/Init.hs index 6f7ba09faf..7a07beabde 100644 --- a/Database/Init.hs +++ b/Database/Init.hs @@ -20,7 +20,6 @@ import Database.RawFilePath import Database.Persist.Sqlite import Lens.Micro import qualified Data.Text as T -import qualified System.FilePath.ByteString as P {- Ensures that the database is freshly initialized. Deletes any - existing database. Pass the migration action for the database. @@ -30,26 +29,26 @@ import qualified System.FilePath.ByteString as P - file causes Sqlite to always use the same permissions for additional - files it writes later on -} -initDb :: P.RawFilePath -> SqlPersistM () -> Annex () +initDb :: OsPath -> SqlPersistM () -> Annex () initDb db migration = do - let dbdir = P.takeDirectory db - let tmpdbdir = dbdir <> ".tmp" - let tmpdb = tmpdbdir P. "db" - let tmpdb' = T.pack (fromRawFilePath tmpdb) + let dbdir = takeDirectory db + let tmpdbdir = dbdir <> literalOsPath ".tmp" + let tmpdb = tmpdbdir literalOsPath "db" + let tmpdb' = fromOsPath tmpdb createAnnexDirectory tmpdbdir #if MIN_VERSION_persistent_sqlite(2,13,3) - liftIO $ runSqliteInfo' tmpdb (enableWAL tmpdb') migration + liftIO $ runSqliteInfo' tmpdb' (enableWAL tmpdb') migration #else liftIO $ runSqliteInfo (enableWAL tmpdb') migration #endif setAnnexDirPerm tmpdbdir -- Work around sqlite bug that prevents it from honoring -- less restrictive umasks. - liftIO $ R.setFileMode tmpdb =<< defaultFileMode + liftIO $ R.setFileMode tmpdb' =<< defaultFileMode setAnnexFilePerm tmpdb liftIO $ do - void $ tryIO $ removeDirectoryRecursive (fromRawFilePath dbdir) - R.rename tmpdbdir dbdir + void $ tryIO $ removeDirectoryRecursive dbdir + R.rename (fromOsPath tmpdbdir) (fromOsPath dbdir) {- Make sure that the database uses WAL mode, to prevent readers - from blocking writers, and prevent a writer from blocking readers. @@ -59,6 +58,6 @@ initDb db migration = do - - Note that once WAL mode is enabled, it will persist whenever the - database is opened. -} -enableWAL :: T.Text -> SqliteConnectionInfo +enableWAL :: RawFilePath -> SqliteConnectionInfo enableWAL db = over walEnabled (const True) $ - mkSqliteConnectionInfo db + mkSqliteConnectionInfo (T.pack (fromRawFilePath db)) diff --git a/P2P/Address.hs b/P2P/Address.hs index a7b3c6db07..1a3186aca9 100644 --- a/P2P/Address.hs +++ b/P2P/Address.hs @@ -5,6 +5,8 @@ - Licensed under the GNU AGPL version 3 or higher. -} +{-# LANGUAGE OverloadedStrings #-} + module P2P.Address where import qualified Annex @@ -75,24 +77,24 @@ storeP2PAddress addr = do addrs <- loadP2PAddresses unless (addr `elem` addrs) $ do let s = unlines $ map formatP2PAddress (addr:addrs) - let tmpnam = p2pAddressCredsFile ++ ".new" + let tmpnam = p2pAddressCredsFile <> literalOsPath ".new" writeCreds s tmpnam tmpf <- credsFile tmpnam destf <- credsFile p2pAddressCredsFile -- This may be run by root, so make the creds file -- and directory have the same owner and group as -- the git repository directory has. - st <- liftIO . R.getFileStatus . toRawFilePath - =<< Annex.fromRepo repoLocation - let fixowner f = R.setOwnerAndGroup (toRawFilePath f) (fileOwner st) (fileGroup st) + st <- liftIO . R.getFileStatus . fromOsPath + =<< Annex.fromRepo repoPath + let fixowner f = R.setOwnerAndGroup (fromOsPath f) (fileOwner st) (fileGroup st) liftIO $ do fixowner tmpf fixowner (takeDirectory tmpf) fixowner (takeDirectory (takeDirectory tmpf)) renameFile tmpf destf -p2pAddressCredsFile :: FilePath -p2pAddressCredsFile = "p2paddrs" +p2pAddressCredsFile :: OsPath +p2pAddressCredsFile = literalOsPath "p2paddrs" torAppName :: AppName torAppName = "tor-annex" diff --git a/P2P/Auth.hs b/P2P/Auth.hs index 346b781b37..20a8ce460d 100644 --- a/P2P/Auth.hs +++ b/P2P/Auth.hs @@ -5,6 +5,8 @@ - Licensed under the GNU AGPL version 3 or higher. -} +{-# LANGUAGE OverloadedStrings #-} + module P2P.Auth where import Annex.Common @@ -35,8 +37,8 @@ storeP2PAuthToken t = do let d = unlines $ map (T.unpack . fromAuthToken) (t:ts) writeCreds d p2pAuthCredsFile -p2pAuthCredsFile :: FilePath -p2pAuthCredsFile = "p2pauth" +p2pAuthCredsFile :: OsPath +p2pAuthCredsFile = literalOsPath "p2pauth" -- | Loads the AuthToken to use when connecting with a given P2P address. -- @@ -59,8 +61,9 @@ storeP2PRemoteAuthToken addr t = writeCreds (T.unpack $ fromAuthToken t) (addressCredsFile addr) -addressCredsFile :: P2PAddress -> FilePath +addressCredsFile :: P2PAddress -> OsPath -- We can omit the port and just use the onion address for the creds file, -- because any given tor hidden service runs on a single port and has a -- unique onion address. -addressCredsFile (TorAnnex (OnionAddress onionaddr) _port) = onionaddr +addressCredsFile (TorAnnex (OnionAddress onionaddr) _port) = + toOsPath onionaddr diff --git a/Remote/Helper/AWS.hs b/Remote/Helper/AWS.hs index 0f5f4b885a..92608ee0a8 100644 --- a/Remote/Helper/AWS.hs +++ b/Remote/Helper/AWS.hs @@ -23,7 +23,7 @@ import Data.Text (Text) creds :: UUID -> CredPairStorage creds u = CredPairStorage - { credPairFile = fromUUID u + { credPairFile = literalOsPath (fromUUID u) , credPairEnvironment = ("AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY") , credPairRemoteField = s3credsField }