summaryrefslogtreecommitdiff
path: root/Git/CurrentRepo.hs
diff options
context:
space:
mode:
authorJoey Hess <joeyh@joeyh.name>2020-01-02 12:34:10 -0400
committerJoey Hess <joeyh@joeyh.name>2020-01-02 12:42:57 -0400
commit9df8a6eb9405dde4464d27133c04f5ee539a85de (patch)
tree8a7ac5f52be8679f8a2525515a0b2c1b715c99ad /Git/CurrentRepo.hs
parent16022a8b98f4bc134542e78a42538364d2f97d92 (diff)
downloadgit-repair-9df8a6eb9405dde4464d27133c04f5ee539a85de.tar.gz
merge from git-annex and relicense accordingly
Merge git library and utility from git-annex. The former is now relicensed AGPL, so git-repair as a whole becomes AGPL. For simplicity, I am relicensing the remainder of the code in git-repair AGPL as well, per the header changes in this commit. While that code is also technically available under the GPL license, as it's been released under that license before, changes going forward will be only released by me under the AGPL.
Diffstat (limited to 'Git/CurrentRepo.hs')
-rw-r--r--Git/CurrentRepo.hs44
1 files changed, 35 insertions, 9 deletions
diff --git a/Git/CurrentRepo.hs b/Git/CurrentRepo.hs
index 69a679e..054a81e 100644
--- a/Git/CurrentRepo.hs
+++ b/Git/CurrentRepo.hs
@@ -2,7 +2,7 @@
-
- Copyright 2012 Joey Hess <id@joeyh.name>
-
- - Licensed under the GNU GPL version 3 or higher.
+ - Licensed under the GNU AGPL version 3 or higher.
-}
module Git.CurrentRepo where
@@ -12,6 +12,7 @@ import Git.Types
import Git.Construct
import qualified Git.Config
import Utility.Env
+import Utility.Env.Set
{- Gets the current git repository.
-
@@ -24,12 +25,20 @@ import Utility.Env
- directory if necessary to ensure it is within the repository's work
- tree. While not needed for git commands, this is useful for anything
- else that looks for files in the worktree.
+ -
+ - Also works around a git bug when running some hooks. It
+ - runs the hooks in the top of the repository, but if GIT_WORK_TREE
+ - was relative (but not "."), it then points to the wrong directory.
+ - In this situation GIT_PREFIX contains the directory that
+ - GIT_WORK_TREE is relative to.
-}
get :: IO Repo
get = do
- gd <- pathenv "GIT_DIR"
+ gd <- getpathenv "GIT_DIR"
r <- configure gd =<< fromCwd
- wt <- maybe (worktree $ location r) Just <$> pathenv "GIT_WORK_TREE"
+ prefix <- getpathenv "GIT_PREFIX"
+ wt <- maybe (fromRawFilePath <$> worktree (location r)) Just
+ <$> getpathenvprefix "GIT_WORK_TREE" prefix
case wt of
Nothing -> return r
Just d -> do
@@ -38,22 +47,39 @@ get = do
setCurrentDirectory d
return $ addworktree wt r
where
- pathenv s = do
+ getpathenv s = do
v <- getEnv s
case v of
Just d -> do
unsetEnv s
- Just <$> absPath d
+ return (Just d)
+ Nothing -> return Nothing
+
+ getpathenvprefix s (Just prefix) | not (null prefix) =
+ getpathenv s >>= \case
Nothing -> return Nothing
+ Just d
+ | d == "." -> return (Just d)
+ | otherwise -> Just <$> absPath (prefix </> d)
+ getpathenvprefix s _ = getpathenv s
configure Nothing (Just r) = Git.Config.read r
configure (Just d) _ = do
absd <- absPath d
curr <- getCurrentDirectory
- Git.Config.read $ newFrom $
- Local { gitdir = absd, worktree = Just curr }
+ r <- Git.Config.read $ newFrom $
+ Local
+ { gitdir = toRawFilePath absd
+ , worktree = Just (toRawFilePath curr)
+ }
+ return $ if Git.Config.isBare r
+ then r { location = (location r) { worktree = Nothing } }
+ else r
+
configure Nothing Nothing = giveup "Not in a git repository."
- addworktree w r = changelocation r $
- Local { gitdir = gitdir (location r), worktree = w }
+ addworktree w r = changelocation r $ Local
+ { gitdir = gitdir (location r)
+ , worktree = fmap toRawFilePath w
+ }
changelocation r l = r { location = l }