summaryrefslogtreecommitdiff
path: root/Types
diff options
context:
space:
mode:
authorJoey Hess <joeyh@joeyh.name>2019-01-01 13:49:19 -0400
committerJoey Hess <joeyh@joeyh.name>2019-01-01 14:45:33 -0400
commit9cc6d5549b84e0ca8a0375aa14ecc8d359c977cc (patch)
tree15fece3c9f8ba4cab2604a92967fcdcac782d41d /Types
parent1f52e5c5cbc2bd4845d0c332cbfabd0bdd6e19fb (diff)
convert UUID from String to ByteString
This should make == comparison of UUIDs somewhat faster, and perhaps a few other operations around maps of UUIDs etc. FromUUID/ToUUID are used to convert String, which is still used for all IO of UUIDs. Eventually the hope is those instances can be removed, and all git-annex branch log files etc use ByteString throughout, for a real speed improvement. Note the use of fromRawFilePath / toRawFilePath -- while a UUID usually contains only alphanumerics and so could be treated as ascii, it's conceivable that some git-annex repository has been initialized using a UUID that is not only not a canonical UUID, but contains high unicode or invalid unicode. Using the filesystem encoding avoids any problems with such a thing. However, a NUL in a UUID seems extremely unlikely, so I didn't use encodeBS / decodeBS to avoid their extra overhead in handling NULs. The Read/Show instance for UUID luckily serializes the same way for ByteString as it did for String.
Diffstat (limited to 'Types')
-rw-r--r--Types/UUID.hs34
1 files changed, 27 insertions, 7 deletions
diff --git a/Types/UUID.hs b/Types/UUID.hs
index f5c9cda301..5efc26dd0b 100644
--- a/Types/UUID.hs
+++ b/Types/UUID.hs
@@ -1,6 +1,6 @@
{- git-annex UUID type
-
- - Copyright 2011 Joey Hess <id@joeyh.name>
+ - Copyright 2011-2019 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -9,29 +9,49 @@
module Types.UUID where
+import qualified Data.ByteString as B
import qualified Data.Map as M
import qualified Data.UUID as U
import Data.Maybe
+import Utility.FileSystemEncoding
import qualified Utility.SimpleProtocol as Proto
-- A UUID is either an arbitrary opaque string, or UUID info may be missing.
-data UUID = NoUUID | UUID String
+data UUID = NoUUID | UUID B.ByteString
deriving (Eq, Ord, Show, Read)
-fromUUID :: UUID -> String
-fromUUID (UUID u) = u
-fromUUID NoUUID = ""
+class FromUUID a where
+ fromUUID :: UUID -> a
class ToUUID a where
toUUID :: a -> UUID
+instance FromUUID UUID where
+ fromUUID = id
+
instance ToUUID UUID where
toUUID = id
+instance FromUUID B.ByteString where
+ fromUUID (UUID u) = u
+ fromUUID NoUUID = B.empty
+
+instance ToUUID B.ByteString where
+ toUUID b
+ | B.null b = NoUUID
+ | otherwise = UUID b
+
+instance FromUUID String where
+ fromUUID s = fromRawFilePath (fromUUID s)
+
instance ToUUID String where
- toUUID [] = NoUUID
- toUUID s = UUID s
+ toUUID s = toUUID (toRawFilePath s)
+
+-- There is no matching FromUUID U.UUID because a git-annex UUID may
+-- be NoUUID or perhaps contain something not allowed in a canonical UUID.
+instance ToUUID U.UUID where
+ toUUID = toUUID . U.toASCIIBytes
isUUID :: String -> Bool
isUUID = isJust . U.fromString