summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-03-03 14:51:57 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-03-03 14:51:57 -0400
commitd651d4985b9fca2fbeeab2f1b700e6423994c400 (patch)
tree5b24d489aa5a8f35f3bbe100c6d844afbdfa150d
parent7ea9f52c2859a72f8e46522338c1c8a112549d84 (diff)
some initial support for local bare repos
This relies on git-annex's behavior of reading the config of local repos. That allows repoIsLocalBare to examine the git config for core.bare. Hopefully, gitAnnexLocation, gitAnnexDir, and gitAnnexObjectDir are only used on local repos. But, I have not audited fully, since they're probably not (see for example copyToRemote). And so, the functions fall back to their old non-bare-aware behavior for non-local repos.
-rw-r--r--Content.hs4
-rw-r--r--GitRepo.hs18
-rw-r--r--Locations.hs33
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.
-