* When a special remote has chunking enabled, but no chunk sizes are
recorded (or the recorded ones are not found), speculatively try
chunks using the configured chunk size.
+ * Fixed some problems that prevented this command from working:
+ git submodule foreach git annex init
-- Joey Hess <id@joeyh.name> Thu, 08 Oct 2020 10:48:17 -0400
repoAbsPath,
checkForRepo,
newFrom,
+ adjustGitDirFile,
) where
#ifndef mingw32_HOST_OS
, ret (takeDirectory canondir)
)
| otherwise = ifM (doesDirectoryExist dir)
- ( gitDirFile dir >>= maybe (ret dir) (pure . newFrom)
+ ( checkGitDirFile dir >>= maybe (ret dir) (pure . newFrom)
-- git falls back to dir.git when dir doesn't
-- exist, as long as dir didn't end with a
-- path separator
checkForRepo :: FilePath -> IO (Maybe RepoLocation)
checkForRepo dir =
check isRepo $
- check (gitDirFile dir) $
+ check (checkGitDirFile dir) $
check isBareRepo $
return Nothing
where
<&&> doesDirectoryExist (dir </> "objects")
gitSignature file = doesFileExist $ dir </> file
+-- Check for a .git file.
+checkGitDirFile :: FilePath -> IO (Maybe RepoLocation)
+checkGitDirFile dir = adjustGitDirFile' $ Local
+ { gitdir = toRawFilePath (dir </> ".git")
+ , worktree = Just (toRawFilePath dir)
+ }
+
-- git-submodule, git-worktree, and --separate-git-dir
-- make .git be a file pointing to the real git directory.
-- Detect that, and return a RepoLocation with gitdir pointing
-- to the real git directory.
-gitDirFile :: FilePath -> IO (Maybe RepoLocation)
-gitDirFile dir = do
- c <- firstLine <$>
- catchDefaultIO "" (readFile $ dir </> ".git")
- return $ if gitdirprefix `isPrefixOf` c
- then Just $ Local
- { gitdir = toRawFilePath $ absPathFrom dir $
- drop (length gitdirprefix) c
- , worktree = Just (toRawFilePath dir)
- }
- else Nothing
+adjustGitDirFile :: RepoLocation -> IO RepoLocation
+adjustGitDirFile loc = fromMaybe loc <$> adjustGitDirFile' loc
+
+adjustGitDirFile' :: RepoLocation -> IO (Maybe RepoLocation)
+adjustGitDirFile' loc = do
+ let gd = fromRawFilePath (gitdir loc)
+ c <- firstLine <$> catchDefaultIO "" (readFile gd)
+ if gitdirprefix `isPrefixOf` c
+ then do
+ top <- takeDirectory <$> absPath gd
+ return $ Just $ loc
+ { gitdir = toRawFilePath $ absPathFrom top $
+ drop (length gitdirprefix) c
+ }
+ else return Nothing
where
gitdirprefix = "gitdir: "
+
newFrom :: RepoLocation -> Repo
newFrom l = Repo
{ location = l
configure (Just d) _ = do
absd <- absPath d
curr <- getCurrentDirectory
- r <- Git.Config.read $ newFrom $
- Local
- { gitdir = toRawFilePath absd
- , worktree = Just (toRawFilePath curr)
- }
+ loc <- adjustGitDirFile $ Local
+ { gitdir = toRawFilePath absd
+ , worktree = Just (toRawFilePath curr)
+ }
+ r <- Git.Config.read $ newFrom loc
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
.git/modules/sub/config has "core.worktree = ../../../sub"
git clone sets that. And it's a path from ../.git/modules/sub/
-back to the work tree. git-annex interprets it as well, a regular path
-from the cwd, like it usually is. It's worth noting that setting
-`GIT_WORK_TREE` to the same value makes git behave differently!
-Nothing in git's docs seem to explain this mess.
+back to the work tree. git-annex interprets it as relative to `GIT_DIR`,
+which git submodule sets to ".git".
So git-annex needs to check if .git is a gitdir: reference, and
-then interpret core.worktree relative to it.
+then interpret core.worktree relative to what it points to.
Or, alternatively, fixupUnusualRepos could learn to tell if the *current*
command is git-annex init, and go ahead with the fixes. Which would avoid