39 lines
1.2 KiB
Haskell
39 lines
1.2 KiB
Haskell
{- git-annex file locations
|
|
-}
|
|
|
|
module Locations (
|
|
gitStateDir,
|
|
stateLoc,
|
|
keyFile,
|
|
annexLocation,
|
|
backendFile
|
|
) where
|
|
|
|
import Data.String.Utils
|
|
import Types
|
|
import GitRepo
|
|
|
|
{- Long-term, cross-repo state is stored in files inside the .git-annex
|
|
- directory, in the git repository's working tree. -}
|
|
stateLoc = ".git-annex"
|
|
gitStateDir :: GitRepo -> FilePath
|
|
gitStateDir repo = (gitWorkTree repo) ++ "/" ++ stateLoc ++ "/"
|
|
|
|
{- Generates a filename that can be used to record a key somewhere to disk.
|
|
- Just escape "/" in the key name, to keep a flat
|
|
- tree of files and avoid issues with files ending with "/" etc. -}
|
|
keyFile :: Key -> FilePath
|
|
keyFile key = replace "/" "%" $ replace "%" "%%" key
|
|
|
|
{- An annexed file's content is stored somewhere under .git/annex/,
|
|
- based on the key. -}
|
|
annexLocation :: State -> Key -> FilePath
|
|
annexLocation state key = gitDir (repo state) ++ "/annex/" ++ (keyFile key)
|
|
|
|
{- The mapping from filename to its key is stored in the .git-annex directory,
|
|
- in a file named `key/$filename.$backend` -}
|
|
backendFile :: State -> Backend -> FilePath -> String
|
|
backendFile state backend file =
|
|
gitStateDir (repo state) ++ "key/" ++
|
|
(gitRelative (repo state) file) ++
|
|
"." ++ (name backend)
|