update unicode FilePath handling
Based on http://hackage.haskell.org/trac/ghc/ticket/3307 , whether FilePath contains decoded unicode varies by OS. So, add a configure check for it. Also, renamed showFile to filePathToString
This commit is contained in:
parent
285fb2bb08
commit
5a50a7cf13
11 changed files with 34 additions and 16 deletions
|
@ -193,14 +193,14 @@ checkKeyNumCopies key file numcopies = do
|
|||
|
||||
missingNote :: String -> Int -> Int -> String -> String
|
||||
missingNote file 0 _ [] =
|
||||
"** No known copies of " ++ showFile file ++ " exist!"
|
||||
"** No known copies of " ++ filePathToString file ++ " exist!"
|
||||
missingNote file 0 _ untrusted =
|
||||
"Only these untrusted locations may have copies of " ++ showFile file ++
|
||||
"Only these untrusted locations may have copies of " ++ filePathToString file ++
|
||||
"\n" ++ untrusted ++
|
||||
"Back it up to trusted locations with git-annex copy."
|
||||
missingNote file present needed [] =
|
||||
"Only " ++ show present ++ " of " ++ show needed ++
|
||||
" trustworthy copies of " ++ showFile file ++ " exist." ++
|
||||
" trustworthy copies of " ++ filePathToString file ++ " exist." ++
|
||||
"\nBack it up with git-annex copy."
|
||||
missingNote file present needed untrusted =
|
||||
missingNote file present needed [] ++
|
||||
|
|
|
@ -58,5 +58,5 @@ checkKeySHA1 key = do
|
|||
then return True
|
||||
else do
|
||||
dest <- moveBad key
|
||||
warning $ "Bad file content; moved to " ++ showFile dest
|
||||
warning $ "Bad file content; moved to " ++ filePathToString dest
|
||||
return False
|
||||
|
|
|
@ -67,5 +67,5 @@ checkKeySize key = do
|
|||
then return True
|
||||
else do
|
||||
dest <- moveBad key
|
||||
warning $ "Bad file size; moved to " ++ showFile dest
|
||||
warning $ "Bad file size; moved to " ++ filePathToString dest
|
||||
return False
|
||||
|
|
|
@ -25,5 +25,5 @@ seek = [withFilesInGit start]
|
|||
start :: CommandStartString
|
||||
start file = isAnnexed file $ \(key, _) -> do
|
||||
exists <- inAnnex key
|
||||
when exists $ liftIO $ putStrLn $ showFile file
|
||||
when exists $ liftIO $ putStrLn $ filePathToString file
|
||||
return Nothing
|
||||
|
|
|
@ -33,7 +33,7 @@ perform pair@(file, _) = do
|
|||
ok <- doCommand $ Command.Add.start pair
|
||||
if ok
|
||||
then return $ Just $ cleanup file
|
||||
else error $ "failed to add " ++ showFile file ++ "; canceling commit"
|
||||
else error $ "failed to add " ++ filePathToString file ++ "; canceling commit"
|
||||
|
||||
cleanup :: FilePath -> CommandCleanup
|
||||
cleanup file = do
|
||||
|
|
|
@ -68,7 +68,7 @@ checkUnused = do
|
|||
dropmsg = ["(To remove unwanted data: git-annex dropunused NUMBER)"]
|
||||
|
||||
table l = [" NUMBER KEY"] ++ map cols l
|
||||
cols (n,k) = " " ++ pad 6 (show n) ++ " " ++ (showFile . show) k
|
||||
cols (n,k) = " " ++ pad 6 (show n) ++ " " ++ (filePathToString . show) k
|
||||
pad n s = s ++ replicate (n - length s) ' '
|
||||
|
||||
number :: Int -> [a] -> [(Int, a)]
|
||||
|
|
|
@ -50,7 +50,7 @@ calcGitLink file key = do
|
|||
cwd <- liftIO $ getCurrentDirectory
|
||||
let absfile = case absNormPath cwd file of
|
||||
Just f -> f
|
||||
Nothing -> error $ "unable to normalize " ++ showFile file
|
||||
Nothing -> error $ "unable to normalize " ++ filePathToString file
|
||||
return $ relPathDirToDir (parentDir absfile) (Git.workTree g) ++
|
||||
annexLocation key
|
||||
|
||||
|
|
14
Messages.hs
14
Messages.hs
|
@ -11,10 +11,11 @@ import Control.Monad.State (liftIO)
|
|||
import System.IO
|
||||
import Control.Monad (unless)
|
||||
import Data.String.Utils
|
||||
import Codec.Binary.UTF8.String as UTF8
|
||||
import qualified Codec.Binary.UTF8.String as UTF8
|
||||
|
||||
import Types
|
||||
import qualified Annex
|
||||
import SysConfig
|
||||
|
||||
verbose :: Annex () -> Annex ()
|
||||
verbose a = do
|
||||
|
@ -26,7 +27,7 @@ showSideAction s = verbose $ liftIO $ putStrLn $ "(" ++ s ++ ")"
|
|||
|
||||
showStart :: String -> String -> Annex ()
|
||||
showStart command file = verbose $ do
|
||||
liftIO $ putStr $ command ++ " " ++ showFile file ++ " "
|
||||
liftIO $ putStr $ command ++ " " ++ filePathToString file ++ " "
|
||||
liftIO $ hFlush stdout
|
||||
|
||||
showNote :: String -> Annex ()
|
||||
|
@ -58,7 +59,8 @@ warning w = do
|
|||
indent :: String -> String
|
||||
indent s = join "\n" $ map (\l -> " " ++ l) $ lines s
|
||||
|
||||
{- Prepares a filename for display. This is needed because strings are
|
||||
- internally represented in git-annex is non-decoded form. -}
|
||||
showFile :: FilePath -> String
|
||||
showFile = decodeString
|
||||
{- Prepares a filename for display. This is needed because on many
|
||||
- platforms (eg, unix), FilePaths are internally stored in
|
||||
- non-decoded form. -}
|
||||
filePathToString :: FilePath -> String
|
||||
filePathToString = if unicodefilepath then id else UTF8.decodeString
|
||||
|
|
15
configure.hs
15
configure.hs
|
@ -1,6 +1,7 @@
|
|||
{- Checks system configuration and generates SysConfig.hs. -}
|
||||
|
||||
import System.Directory
|
||||
import Data.List
|
||||
|
||||
import TestConfig
|
||||
|
||||
|
@ -13,6 +14,7 @@ tests = [
|
|||
, TestCase "sha1sum" $ requireCmd "sha1sum" "sha1sum </dev/null"
|
||||
, TestCase "xargs -0" $ requireCmd "xargs_0" "xargs -0 </dev/null"
|
||||
, TestCase "rsync" $ requireCmd "rsync" "rsync --version >/dev/null"
|
||||
, TestCase "unicode FilePath support" $ unicodeFilePath
|
||||
]
|
||||
|
||||
tmpDir :: String
|
||||
|
@ -27,6 +29,19 @@ testCp k option = TestCase cmd $ testCmd k run
|
|||
cmd = "cp " ++ option
|
||||
run = cmd ++ " " ++ testFile ++ " " ++ testFile ++ ".new"
|
||||
|
||||
{- Checks if FilePaths contain decoded unicode, or not. The testdata
|
||||
- directory contains a "unicode-test-ü" file; try to find the file,
|
||||
- and see if the "ü" is encoded correctly.
|
||||
-
|
||||
- Note that the file is shipped with git-annex, rather than created,
|
||||
- to avoid other potential unicode issues.
|
||||
-}
|
||||
unicodeFilePath :: Test
|
||||
unicodeFilePath = do
|
||||
fs <- getDirectoryContents "testdata"
|
||||
let file = head $ filter (isInfixOf "unicode-test") fs
|
||||
return $ Config "unicodefilepath" (BoolConfig $ isInfixOf "ü" file)
|
||||
|
||||
setup :: IO ()
|
||||
setup = do
|
||||
createDirectoryIfMissing True tmpDir
|
||||
|
|
|
@ -46,7 +46,7 @@ It looks like the common latin1-to-UTF8 encoding. Functionality other than otupu
|
|||
> user's configured encoding), and allow haskell's output encoding to then
|
||||
> encode it according to the user's locale configuration.
|
||||
> > This is now [[implemented|done]]. I'm not very happy that I have to watch
|
||||
> > out for any place that a filename is output and call `showFile`
|
||||
> > out for any place that a filename is output and call `filePathToString`
|
||||
> > on it, but there are really not too many such places in git-annex.
|
||||
> >
|
||||
> > Note that this only affects filenames apparently.
|
||||
|
|
1
testdata/unicode-test-ö
vendored
Normal file
1
testdata/unicode-test-ö
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
hi
|
Loading…
Reference in a new issue