From be7a95c7bcb4e78d267f56385ad0995c08395f3f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 6 Jan 2015 14:50:15 -0400 Subject: try to avoid Windows MAX_PATH limit, by using \\?\ prefix on git repo path --- Annex.hs | 2 +- Git.hs | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Annex.hs b/Annex.hs index 82a378f79..7806a9129 100644 --- a/Annex.hs +++ b/Annex.hs @@ -187,7 +187,7 @@ newState c r = AnnexState - Ensures the config is read, if it was not already. -} new :: Git.Repo -> IO AnnexState new r = do - r' <- Git.Config.read r + r' <- Git.adjustPath <$> Git.Config.read r let c = extractGitConfig r' newState c <$> if annexDirect c then fixupDirect r' else return r' diff --git a/Git.hs b/Git.hs index 55b44a925..032824fa7 100644 --- a/Git.hs +++ b/Git.hs @@ -30,6 +30,7 @@ module Git ( attributes, hookPath, assertLocal, + adjustPath, ) where import Network.URI (uriPath, uriScheme, unEscapeString) @@ -139,3 +140,26 @@ hookPath script repo = do #else isexecutable f = isExecutable . fileMode <$> getFileStatus f #endif + +{- Adusts the path to a local Repo. + - + - On windows, prefixing a path with \\?\ makes it be processed as a raw + - path (/ is not converted to \). The benefit is that such a path does + - avoids Windows's 260 byte limitation on the entire path. -} +adjustPath :: Repo -> Repo +adjustPath r@(Repo { location = l@(Local { gitdir = d, worktree = w }) }) = r + { location = l + { gitdir = adjustPath' d + , worktree = fmap adjustPath' w + } + } +adjustPath r@(Repo { location = LocalUnknown d }) = + r { location = LocalUnknown (adjustPath' d) } +adjustPath r = r + +adjustPath' :: FilePath -> FilePath +#if mingw32_HOST_OS +adjustPath' d = "\\\\?\\" ++ d +#else +adjustPath' = id +#endif -- cgit v1.2.3