diff options
-rw-r--r-- | Content.hs | 4 | ||||
-rw-r--r-- | GitRepo.hs | 18 | ||||
-rw-r--r-- | Locations.hs | 33 |
3 files changed, 35 insertions, 20 deletions
diff --git a/Content.hs b/Content.hs index cb954f4a0..658d9a861 100644 --- a/Content.hs +++ b/Content.hs @@ -51,8 +51,8 @@ calcGitLink file key = do let absfile = case absNormPath cwd file of Just f -> f Nothing -> error $ "unable to normalize " ++ filePathToString file - return $ relPathDirToDir (parentDir absfile) (Git.workTree g) ++ - annexLocation key + return $ relPathDirToDir (parentDir absfile) + (Git.workTree g) </> ".git" </> annexLocation key {- Updates the LocationLog when a key's presence changes. -} logStatus :: Key -> LogStatus -> Annex () diff --git a/GitRepo.hs b/GitRepo.hs index 04a0c2d54..ba0125121 100644 --- a/GitRepo.hs +++ b/GitRepo.hs @@ -16,6 +16,8 @@ module GitRepo ( localToUrl, repoIsUrl, repoIsSsh, + repoIsLocalBare, + repoIsLocalFull, repoDescribe, repoLocation, workTree, @@ -161,6 +163,14 @@ repoIsSsh Repo { location = Url url } | otherwise = False repoIsSsh _ = False +repoIsLocalBare :: Repo -> Bool +repoIsLocalBare r@(Repo { location = Dir _ }) = configBare r +repoIsLocalBare _ = False + +repoIsLocalFull :: Repo -> Bool +repoIsLocalFull r@(Repo { location = Dir _ }) = not $ configBare r +repoIsLocalFull _ = False + assertLocal :: Repo -> a -> a assertLocal repo action = if not $ repoIsUrl repo @@ -174,8 +184,8 @@ assertUrl repo action = else error $ "acting on local git repo " ++ repoDescribe repo ++ " not supported" -bare :: Repo -> Bool -bare repo = case Map.lookup "core.bare" $ config repo of +configBare :: Repo -> Bool +configBare repo = case Map.lookup "core.bare" $ config repo of Just v -> configTrue v Nothing -> error $ "it is not known if git repo " ++ repoDescribe repo ++ @@ -184,13 +194,13 @@ bare repo = case Map.lookup "core.bare" $ config repo of {- Path to a repository's gitattributes file. -} attributes :: Repo -> String attributes repo - | bare repo = workTree repo ++ "/info/.gitattributes" + | configBare repo = workTree repo ++ "/info/.gitattributes" | otherwise = workTree repo ++ "/.gitattributes" {- Path to a repository's .git directory, relative to its workTree. -} gitDir :: Repo -> String gitDir repo - | bare repo = "" + | configBare repo = "" | otherwise = ".git" {- Path to a repository's --work-tree, that is, its top. diff --git a/Locations.hs b/Locations.hs index d30ceb136..908d5b74e 100644 --- a/Locations.hs +++ b/Locations.hs @@ -50,35 +50,40 @@ stateDir = addTrailingPathSeparator $ ".git-annex" gitStateDir :: Git.Repo -> FilePath gitStateDir repo = addTrailingPathSeparator $ Git.workTree repo </> stateDir -{- Annexed content is stored in .git/annex/objects; .git/annex is used - - for other temporary storage also. -} +{- The directory git annex uses for local state, relative to the .git + - directory -} annexDir :: FilePath -annexDir = addTrailingPathSeparator $ ".git/annex" +annexDir = addTrailingPathSeparator $ "annex" + +{- The directory git annex uses for locally available object content, + - relative to the .git directory -} objectDir :: FilePath objectDir = addTrailingPathSeparator $ annexDir </> "objects" -{- Annexed file's location relative to git's working tree. - - - - Note: Assumes repo is NOT bare.-} +{- Annexed file's location relative to the .git directory. -} annexLocation :: Key -> FilePath -annexLocation key = ".git/annex/objects" </> f </> f +annexLocation key = objectDir </> f </> f where f = keyFile key {- Annexed file's absolute location in a repository. -} gitAnnexLocation :: Git.Repo -> Key -> FilePath -gitAnnexLocation r key = Git.workTree r </> annexLocation key +gitAnnexLocation r key + | Git.repoIsLocalBare r = Git.workTree r </> annexLocation key + | otherwise = Git.workTree r </> ".git" </> annexLocation key -{- The annex directory of a repository. - - - - Note: Assumes repo is NOT bare. -} +{- The annex directory of a repository. -} gitAnnexDir :: Git.Repo -> FilePath -gitAnnexDir r = addTrailingPathSeparator $ Git.workTree r </> annexDir +gitAnnexDir r + | Git.repoIsLocalBare r = addTrailingPathSeparator $ Git.workTree r </> annexDir + | otherwise = addTrailingPathSeparator $ Git.workTree r </> ".git" </> annexDir {- The part of the annex directory where file contents are stored. -} gitAnnexObjectDir :: Git.Repo -> FilePath -gitAnnexObjectDir r = addTrailingPathSeparator $ Git.workTree r </> objectDir +gitAnnexObjectDir r + | Git.repoIsLocalBare r = addTrailingPathSeparator $ Git.workTree r </> objectDir + | otherwise = addTrailingPathSeparator $ Git.workTree r </> ".git" </> objectDir {- .git-annex/tmp/ is used for temp files -} gitAnnexTmpDir :: Git.Repo -> FilePath @@ -98,7 +103,7 @@ gitAnnexUnusedLog r = gitAnnexDir r </> "unused" {- Checks a symlink target to see if it appears to point to annexed content. -} isLinkToAnnex :: FilePath -> Bool -isLinkToAnnex s = ("/" ++ objectDir) `isInfixOf` s +isLinkToAnnex s = ("/.git/" ++ objectDir) `isInfixOf` s {- Converts a key into a filename fragment. - |