summaryrefslogtreecommitdiff
path: root/Git.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-01-06 14:50:15 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-01-06 14:50:15 -0400
commitbe7a95c7bcb4e78d267f56385ad0995c08395f3f (patch)
tree348d153d7a8ab54810fdbd9101cebeabf17f6ef6 /Git.hs
parent27195fc7ecb70e185e9a78f8bd3d758bfe262a22 (diff)
try to avoid Windows MAX_PATH limit, by using \\?\ prefix on git repo path
Diffstat (limited to 'Git.hs')
-rw-r--r--Git.hs24
1 files changed, 24 insertions, 0 deletions
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