diff options
author | Joey Hess <joey@kitenet.net> | 2013-02-23 12:32:09 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-02-23 12:41:22 -0400 |
commit | c59733b3b1e2a359d074ce6c351137a09bf363c6 (patch) | |
tree | fd30e95ed7b61cf3b4a1ffd9b175fb10d2f1c450 /Git | |
parent | 5534aceab89789fc2c284bd700aaa59a8e105937 (diff) |
Additional GIT_DIR support bugfixes. May actually work now.
Two fixes. First, and most importantly, relax the isLinkToAnnex check
to only look for /annex/objects/, not [^|/].git/annex/objects. If
GIT_DIR is used with a detached work tree, the git directory is
not necessarily named .git.
There are important caveats with doing that at all, since git-annex will
make symlinks that point at GIT_DIR, which means that the relative path
between GIT_DIR and GIT_WORK_TREE needs to remain stable across all clones
of the repository.
----
The other fix is just fixing crazy and wrong code that, when GIT_DIR is
set, expects to still find a git repository in the path below the work
tree, and uses some of its configuration, and some of GIT_DIR. What was I
thinking, and why can't I seem to get this code right?
Diffstat (limited to 'Git')
-rw-r--r-- | Git/Construct.hs | 16 | ||||
-rw-r--r-- | Git/CurrentRepo.hs | 16 |
2 files changed, 16 insertions, 16 deletions
diff --git a/Git/Construct.hs b/Git/Construct.hs index bafb16874..f9f4b464a 100644 --- a/Git/Construct.hs +++ b/Git/Construct.hs @@ -17,6 +17,7 @@ module Git.Construct ( fromRemotes, fromRemoteLocation, repoAbsPath, + newFrom, ) where import System.Posix.User @@ -31,17 +32,16 @@ import Utility.UserInfo {- Finds the git repository used for the cwd, which may be in a parent - directory. -} -fromCwd :: IO Repo -fromCwd = getCurrentDirectory >>= seekUp checkForRepo +fromCwd :: IO (Maybe Repo) +fromCwd = getCurrentDirectory >>= seekUp where - norepo = error "Not in a git repository." - seekUp check dir = do - r <- check dir + seekUp dir = do + r <- checkForRepo dir case r of Nothing -> case parentDir dir of - "" -> norepo - d -> seekUp check d - Just loc -> newFrom loc + "" -> return Nothing + d -> seekUp d + Just loc -> Just <$> newFrom loc {- Local Repo constructor, accepts a relative or absolute path. -} fromPath :: FilePath -> IO Repo diff --git a/Git/CurrentRepo.hs b/Git/CurrentRepo.hs index e309bf2f6..482873960 100644 --- a/Git/CurrentRepo.hs +++ b/Git/CurrentRepo.hs @@ -47,15 +47,15 @@ get = do unsetEnv s Just <$> absPath d Nothing -> return Nothing - configure Nothing r = Git.Config.read r - configure (Just d) r = do - r' <- Git.Config.read r - -- Let GIT_DIR override the default gitdir. + + configure Nothing (Just r) = Git.Config.read r + configure (Just d) _ = do absd <- absPath d - return $ changelocation r' $ Local - { gitdir = absd - , worktree = worktree (location r') - } + cwd <- getCurrentDirectory + r <- newFrom $ Local { gitdir = absd, worktree = Just cwd } + Git.Config.read r + configure Nothing Nothing = error "Not in a git repository." + addworktree w r = changelocation r $ Local { gitdir = gitdir (location r), worktree = w } changelocation r l = r { location = l } |