try to avoid Windows MAX_PATH limit, by using \\?\ prefix on git repo path
This commit is contained in:
parent
ae14354686
commit
c15fc92c16
2 changed files with 25 additions and 1 deletions
2
Annex.hs
2
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'
|
||||
|
||||
|
|
24
Git.hs
24
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
|
||||
|
|
Loading…
Reference in a new issue