summaryrefslogtreecommitdiff
path: root/Git
diff options
context:
space:
mode:
authorGravatar Joey Hess <id@joeyh.name>2013-05-12 17:18:48 -0500
committerGravatar Joey Hess <id@joeyh.name>2013-05-12 17:29:49 -0500
commitb02c68304aa5051086e29a0cb6547fdf856aa93d (patch)
tree104139431d5e4df6258a7b7f000ecd605a3bf096 /Git
parentac86f7dbae96c5b813147bf8de5fe40df002671e (diff)
deal with git using / internally, even on DOS
Diffstat (limited to 'Git')
-rwxr-xr-x[-rw-r--r--]Git/CatFile.hs4
-rwxr-xr-x[-rw-r--r--]Git/FilePath.hs26
-rwxr-xr-x[-rw-r--r--]Git/UpdateIndex.hs11
3 files changed, 35 insertions, 6 deletions
diff --git a/Git/CatFile.hs b/Git/CatFile.hs
index b83241445..5ab10b187 100644..100755
--- a/Git/CatFile.hs
+++ b/Git/CatFile.hs
@@ -23,6 +23,7 @@ import Git
import Git.Sha
import Git.Command
import Git.Types
+import Git.FilePath
import qualified Utility.CoProcess as CoProcess
type CatFileHandle = CoProcess.CoProcessHandle
@@ -38,7 +39,8 @@ catFileStop = CoProcess.stop
{- Reads a file from a specified branch. -}
catFile :: CatFileHandle -> Branch -> FilePath -> IO L.ByteString
-catFile h branch file = catObject h $ Ref $ show branch ++ ":" ++ file
+catFile h branch file = catObject h $ Ref $
+ show branch ++ ":" ++ toInternalGitPath file
{- Uses a running git cat-file read the content of an object.
- Objects that do not exist will have "" returned. -}
diff --git a/Git/FilePath.hs b/Git/FilePath.hs
index 6344353d6..c3813fe9e 100644..100755
--- a/Git/FilePath.hs
+++ b/Git/FilePath.hs
@@ -5,16 +5,21 @@
- top of the repository even when run in a subdirectory. Adding some
- types helps keep that straight.
-
- - Copyright 2012 Joey Hess <joey@kitenet.net>
+ - Copyright 2012-2013 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
+{-# LANGUAGE CPP #-}
+
module Git.FilePath (
TopFilePath,
getTopFilePath,
toTopFilePath,
asTopFilePath,
+ InternalGitPath,
+ toInternalGitPath,
+ fromInternalGitPath
) where
import Common
@@ -32,3 +37,22 @@ toTopFilePath file repo = TopFilePath <$>
- repository -}
asTopFilePath :: FilePath -> TopFilePath
asTopFilePath file = TopFilePath file
+
+{- Git may use a different representation of a path when storing
+ - it internally. For example, on Windows, git uses '/' to separate paths
+ - stored in the repository, despite Windows using '\' -}
+type InternalGitPath = String
+
+toInternalGitPath :: FilePath -> InternalGitPath
+#ifndef __WINDOWS__
+toInternalGitPath = id
+#else
+toInternalGitPath = replace "\\" "/"
+#endif
+
+fromInternalGitPath :: InternalGitPath -> FilePath
+#ifndef __WINDOWS__
+fromInternalGitPath = id
+#else
+fromInternalGitPath = replace "/" "\\"
+#endif
diff --git a/Git/UpdateIndex.hs b/Git/UpdateIndex.hs
index aa65b4429..5d07e2011 100644..100755
--- a/Git/UpdateIndex.hs
+++ b/Git/UpdateIndex.hs
@@ -1,11 +1,11 @@
{- git-update-index library
-
- - Copyright 2011, 2012 Joey Hess <joey@kitenet.net>
+ - Copyright 2011-2013 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
-{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE BangPatterns, CPP #-}
module Git.UpdateIndex (
Streamer,
@@ -59,13 +59,13 @@ lsTree (Ref x) repo streamer = do
- a given file with a given sha. -}
updateIndexLine :: Sha -> BlobType -> TopFilePath -> String
updateIndexLine sha filetype file =
- show filetype ++ " blob " ++ show sha ++ "\t" ++ getTopFilePath file
+ show filetype ++ " blob " ++ show sha ++ "\t" ++ indexPath file
{- A streamer that removes a file from the index. -}
unstageFile :: FilePath -> Repo -> IO Streamer
unstageFile file repo = do
p <- toTopFilePath file repo
- return $ pureStreamer $ "0 " ++ show nullSha ++ "\t" ++ getTopFilePath p
+ return $ pureStreamer $ "0 " ++ show nullSha ++ "\t" ++ indexPath p
{- A streamer that adds a symlink to the index. -}
stageSymlink :: FilePath -> Sha -> Repo -> IO Streamer
@@ -75,3 +75,6 @@ stageSymlink file sha repo = do
<*> pure SymlinkBlob
<*> toTopFilePath file repo
return $ pureStreamer line
+
+indexPath :: TopFilePath -> InternalGitPath
+indexPath = toInternalGitPath . getTopFilePath