try to avoid Windows MAX_PATH limit, by using \\?\ prefix on git repo path

This commit is contained in:
Joey Hess 2015-01-06 14:50:15 -04:00
parent ae14354686
commit c15fc92c16
2 changed files with 25 additions and 1 deletions

View file

@ -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'

24
Git.hs
View file

@ -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