view: Avoid using cute unicode homomorphs for '/' and '\' and instead use ugly escaping, as the unicode method doesn't work on non-unicode supporting systems.

This commit is contained in:
Joey Hess 2016-01-08 12:45:32 -04:00
parent 6b963426a0
commit 42619e2231
Failed to extract signature
5 changed files with 39 additions and 20 deletions

View file

@ -226,32 +226,22 @@ toViewPath :: MetaValue -> FilePath
toViewPath = concatMap escapeslash . fromMetaValue toViewPath = concatMap escapeslash . fromMetaValue
where where
escapeslash c escapeslash c
| c == '/' = [pseudoSlash] | c == '/' = "%_"
| c == '\\' = [pseudoBackslash] | c == '\\' = "%."
| c == pseudoSlash = [pseudoSlash, pseudoSlash] | c == '%' = "%%"
| c == pseudoBackslash = [pseudoBackslash, pseudoBackslash]
| otherwise = [c] | otherwise = [c]
fromViewPath :: FilePath -> MetaValue fromViewPath :: FilePath -> MetaValue
fromViewPath = toMetaValue . deescapeslash [] fromViewPath = toMetaValue . deescapeslash []
where where
deescapeslash s [] = reverse s deescapeslash s [] = reverse s
deescapeslash s (c:cs) deescapeslash s ('%':'_':cs) = deescapeslash ('/':s) cs
| c == pseudoSlash = case cs of deescapeslash s ('%':'.':cs) = deescapeslash ('\\':s) cs
(c':cs') deescapeslash s ('%':'%':cs) = deescapeslash ('%':s) cs
| c' == pseudoSlash -> deescapeslash (pseudoSlash:s) cs' deescapeslash s (c:cs) = deescapeslash (c:s) cs
_ -> deescapeslash ('/':s) cs
| c == pseudoBackslash = case cs of
(c':cs')
| c' == pseudoBackslash -> deescapeslash (pseudoBackslash:s) cs'
_ -> deescapeslash ('/':s) cs
| otherwise = deescapeslash (c:s) cs
pseudoSlash :: Char prop_viewPath_roundtrips :: MetaValue -> Bool
pseudoSlash = '\8725' -- '' /= '/' prop_viewPath_roundtrips v = fromViewPath (toViewPath v) == v
pseudoBackslash :: Char
pseudoBackslash = '\9586' -- '' /= '\'
pathProduct :: [[FilePath]] -> [FilePath] pathProduct :: [[FilePath]] -> [FilePath]
pathProduct [] = [] pathProduct [] = []

View file

@ -173,6 +173,7 @@ properties = localOption (QuickCheckTests 1000) $ testGroup "QuickCheck"
, testProperty "prop_metadata_sane" Types.MetaData.prop_metadata_sane , testProperty "prop_metadata_sane" Types.MetaData.prop_metadata_sane
, testProperty "prop_metadata_serialize" Types.MetaData.prop_metadata_serialize , testProperty "prop_metadata_serialize" Types.MetaData.prop_metadata_serialize
, testProperty "prop_branchView_legal" Logs.View.prop_branchView_legal , testProperty "prop_branchView_legal" Logs.View.prop_branchView_legal
, testProperty "prop_viewPath_roundtrips" Annex.View.prop_viewPath_roundtrips
, testProperty "prop_view_roundtrips" Annex.View.prop_view_roundtrips , testProperty "prop_view_roundtrips" Annex.View.prop_view_roundtrips
, testProperty "prop_viewedFile_rountrips" Annex.View.ViewedFile.prop_viewedFile_roundtrips , testProperty "prop_viewedFile_rountrips" Annex.View.ViewedFile.prop_viewedFile_roundtrips
, testProperty "prop_b64_roundtrips" Utility.Base64.prop_b64_roundtrips , testProperty "prop_b64_roundtrips" Utility.Base64.prop_b64_roundtrips

4
debian/changelog vendored
View file

@ -25,6 +25,7 @@ git-annex (6.20151219) UNRELEASED; urgency=medium
* fix: Adjusts unlocked files as configured by annex.thin. * fix: Adjusts unlocked files as configured by annex.thin.
* persistent-sqlite is now a hard build dependency, since v6 repository * persistent-sqlite is now a hard build dependency, since v6 repository
mode needs it. mode needs it.
* status: On crippled filesystems, was displaying M for all annexed files * status: On crippled filesystems, was displaying M for all annexed files
that were present. Probably caused by a change to what git status that were present. Probably caused by a change to what git status
displays in this situation. Fixed by treating files git thinks are displays in this situation. Fixed by treating files git thinks are
@ -47,6 +48,9 @@ git-annex (6.20151219) UNRELEASED; urgency=medium
* rekey: No longer copies over urls from the old to the new key. * rekey: No longer copies over urls from the old to the new key.
It makes sense for migrate to do that, but not for this low-level It makes sense for migrate to do that, but not for this low-level
(and little used) plumbing command to. (and little used) plumbing command to.
* view: Avoid using cute unicode homomorphs for '/' and '\' and instead
use ugly escaping, as the unicode method doesn't work on non-unicode
supporting systems.
-- Joey Hess <id@joeyh.name> Sat, 19 Dec 2015 13:31:17 -0400 -- Joey Hess <id@joeyh.name> Sat, 19 Dec 2015 13:31:17 -0400

View file

@ -39,4 +39,4 @@ I was trying out the metadata extraction via libextractor and for the mimetype t
Apart from this git-annex is working very well for me. I mostly use it as an archive, distributing numerous copies on various hard drives and cloud providers and keeping track of what is where.Its an amazing tool for that. Apart from this git-annex is working very well for me. I mostly use it as an archive, distributing numerous copies on various hard drives and cloud providers and keeping track of what is where.Its an amazing tool for that.
> [[done]] --[[Joey]]

View file

@ -0,0 +1,24 @@
[[!comment format=mdwn
username="joey"
subject="""comment 1"""
date="2016-01-08T15:52:22Z"
content="""
I was able to reproduce this problem, but only with LANG=C. It works in a
unicode locale.
What's torpedoing this is a hack that it uses to handle "/" in a view.
pseudoSlash :: Char
pseudoSlash = '\8725' -- '' /= '/'
It's necessary that in a view, each viewed metadata component yield exactly one
level of directory hierarchy. Otherwise, it would be impossible to reverse
"a/b/c/file" when viewing on 2 metadata components --
is that "a/b" and "c" or "a" and "b/c"?
Which is why I used this cutsey hack, but yeah, it requires working
unicode support.
Sigh, 2016 and still can't have nice things.. Suppose it'll have to use an
ugly encoding for them instead.
"""]]