From 097605e2e9788f3aacc4a6d73d41990cccb20ff9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 22 May 2016 14:58:04 -0400 Subject: [PATCH] git's handing of relative GIT_INDEX_FILE is more insane than I thought; always make absolute This is actually worse than I thought; when git is being run with a detached work tree, GIT_INDEX_FILE is treated as a path relative to CWD, instead of the normal behavior of relative the top of the work tree. This seems to make it basically impossible for any program that wants to use GIT_INDEX_FILE to use anything other than an absolute path to it; there are too many configurations to keep straight that can change how git interprets what should be a simple relative path to a file. (I have complained to the git developers.) --- Annex/GitOverlay.hs | 2 +- Git/Index.hs | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Annex/GitOverlay.hs b/Annex/GitOverlay.hs index 2eae5e7fef..2193b74498 100644 --- a/Annex/GitOverlay.hs +++ b/Annex/GitOverlay.hs @@ -19,7 +19,7 @@ import qualified Annex {- Runs an action using a different git index file. -} withIndexFile :: FilePath -> Annex a -> Annex a withIndexFile f a = do - f' <- inRepo $ indexEnvVal f + f' <- liftIO $ indexEnvVal f withAltRepo (\g -> addGitEnv g indexEnv f') (\g g' -> g' { gitEnv = gitEnv g }) diff --git a/Git/Index.hs b/Git/Index.hs index 8c1049e7cf..85ea480b5c 100644 --- a/Git/Index.hs +++ b/Git/Index.hs @@ -9,19 +9,24 @@ module Git.Index where import Common import Git -import Git.FilePath import Utility.Env indexEnv :: String indexEnv = "GIT_INDEX_FILE" -{- When relative, GIT_INDEX_FILE is interpreted by git as being +{- Gets value to set GIT_INDEX_FILE to. Input should be absolute path, + - or relative to the CWD. + - + - When relative, GIT_INDEX_FILE is interpreted by git as being - relative to the top of the work tree of the git repository, - - not to the CWD. -} -indexEnvVal :: FilePath -> Repo -> IO String -indexEnvVal index r - | isAbsolute index = return index - | otherwise = getTopFilePath <$> toTopFilePath index r + - not to the CWD. Worse, other environment variables (GIT_WORK_TREE) + - or git options (--work-tree) or configuration (core.worktree) + - can change what the relative path is interpreted relative to. + - + - So, an absolute path is the only safe option for this to return. + -} +indexEnvVal :: FilePath -> IO String +indexEnvVal = absPath {- Forces git to use the specified index file. - @@ -31,9 +36,9 @@ indexEnvVal index r - Warning: Not thread safe. -} override :: FilePath -> Repo -> IO (IO ()) -override index r = do +override index _r = do res <- getEnv var - val <- indexEnvVal index r + val <- indexEnvVal index setEnv var val True return $ reset res where