2011-10-15 21:47:03 +00:00
|
|
|
{- git-annex uuids
|
|
|
|
-
|
|
|
|
- Each git repository used by git-annex has an annex.uuid setting that
|
|
|
|
- uniquely identifies that repository.
|
|
|
|
-
|
|
|
|
- UUIDs of remotes are cached in git config, using keys named
|
|
|
|
- remote.<name>.annex-uuid
|
|
|
|
-
|
2016-01-20 20:55:06 +00:00
|
|
|
- Copyright 2010-2016 Joey Hess <id@joeyh.name>
|
2011-10-15 21:47:03 +00:00
|
|
|
-
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
-}
|
|
|
|
|
|
|
|
module Annex.UUID (
|
|
|
|
getUUID,
|
|
|
|
getRepoUUID,
|
|
|
|
getUncachedUUID,
|
2015-10-15 19:28:29 +00:00
|
|
|
isUUIDConfigured,
|
2011-10-15 21:47:03 +00:00
|
|
|
prepUUID,
|
2012-04-27 16:21:38 +00:00
|
|
|
genUUID,
|
2013-09-05 20:02:39 +00:00
|
|
|
genUUIDInNameSpace,
|
|
|
|
gCryptNameSpace,
|
2012-04-27 16:21:38 +00:00
|
|
|
removeRepoUUID,
|
2012-11-05 21:43:17 +00:00
|
|
|
storeUUID,
|
2014-04-16 00:13:35 +00:00
|
|
|
storeUUIDIn,
|
2013-09-05 20:02:39 +00:00
|
|
|
setUUID,
|
2014-12-17 17:57:52 +00:00
|
|
|
webUUID,
|
|
|
|
bitTorrentUUID,
|
2011-10-15 21:47:03 +00:00
|
|
|
) where
|
|
|
|
|
2016-01-20 20:36:33 +00:00
|
|
|
import Annex.Common
|
2016-01-20 20:55:06 +00:00
|
|
|
import qualified Annex
|
2011-10-15 21:47:03 +00:00
|
|
|
import qualified Git
|
2011-12-13 19:05:07 +00:00
|
|
|
import qualified Git.Config
|
2011-10-15 21:47:03 +00:00
|
|
|
import Config
|
|
|
|
|
2013-02-10 18:52:54 +00:00
|
|
|
import qualified Data.UUID as U
|
2016-07-27 11:38:11 +00:00
|
|
|
import qualified Data.UUID.V4 as U4
|
2013-09-05 20:02:39 +00:00
|
|
|
import qualified Data.UUID.V5 as U5
|
|
|
|
import Data.Bits.Utils
|
2013-02-10 18:52:54 +00:00
|
|
|
|
2012-05-06 00:15:32 +00:00
|
|
|
configkey :: ConfigKey
|
|
|
|
configkey = annexConfig "uuid"
|
2011-10-15 21:47:03 +00:00
|
|
|
|
2013-02-10 18:52:54 +00:00
|
|
|
{- Generates a random UUID, that does not include the MAC address. -}
|
2011-10-15 21:47:03 +00:00
|
|
|
genUUID :: IO UUID
|
2016-07-27 11:38:11 +00:00
|
|
|
genUUID = UUID . show <$> U4.nextRandom
|
2011-10-15 21:47:03 +00:00
|
|
|
|
2013-09-05 20:02:39 +00:00
|
|
|
{- Generates a UUID from a given string, using a namespace.
|
|
|
|
- Given the same namespace, the same string will always result
|
|
|
|
- in the same UUID. -}
|
|
|
|
genUUIDInNameSpace :: U.UUID -> String -> UUID
|
|
|
|
genUUIDInNameSpace namespace = UUID . show . U5.generateNamed namespace . s2w8
|
|
|
|
|
|
|
|
{- Namespace used for UUIDs derived from git-remote-gcrypt ids. -}
|
|
|
|
gCryptNameSpace :: U.UUID
|
|
|
|
gCryptNameSpace = U5.generateNamed U5.namespaceURL $
|
|
|
|
s2w8 "http://git-annex.branchable.com/design/gcrypt/"
|
|
|
|
|
2011-11-19 19:40:40 +00:00
|
|
|
{- Get current repository's UUID. -}
|
2011-10-15 21:47:03 +00:00
|
|
|
getUUID :: Annex UUID
|
2016-01-20 20:55:06 +00:00
|
|
|
getUUID = annexUUID <$> Annex.getGitConfig
|
2011-10-15 21:47:03 +00:00
|
|
|
|
2016-01-20 20:55:06 +00:00
|
|
|
{- Looks up a remote repo's UUID, caching it in .git/config if
|
|
|
|
- it's not already. -}
|
2011-10-15 21:47:03 +00:00
|
|
|
getRepoUUID :: Git.Repo -> Annex UUID
|
|
|
|
getRepoUUID r = do
|
2012-03-22 04:23:15 +00:00
|
|
|
c <- toUUID <$> getConfig cachekey ""
|
2011-10-15 21:47:03 +00:00
|
|
|
let u = getUncachedUUID r
|
|
|
|
|
2011-11-07 18:46:01 +00:00
|
|
|
if c /= u && u /= NoUUID
|
2011-10-15 21:47:03 +00:00
|
|
|
then do
|
2011-11-08 19:34:10 +00:00
|
|
|
updatecache u
|
2011-10-15 21:47:03 +00:00
|
|
|
return u
|
|
|
|
else return c
|
2012-12-13 04:24:19 +00:00
|
|
|
where
|
|
|
|
updatecache u = do
|
|
|
|
g <- gitRepo
|
2014-04-16 00:13:35 +00:00
|
|
|
when (g /= r) $ storeUUIDIn cachekey u
|
2012-12-13 04:24:19 +00:00
|
|
|
cachekey = remoteConfig r "uuid"
|
2011-10-15 21:47:03 +00:00
|
|
|
|
2012-04-27 16:21:38 +00:00
|
|
|
removeRepoUUID :: Annex ()
|
2016-01-20 20:55:06 +00:00
|
|
|
removeRepoUUID = do
|
|
|
|
unsetConfig configkey
|
|
|
|
storeUUID NoUUID
|
2012-04-27 16:21:38 +00:00
|
|
|
|
2011-10-15 21:47:03 +00:00
|
|
|
getUncachedUUID :: Git.Repo -> UUID
|
2012-05-06 00:15:32 +00:00
|
|
|
getUncachedUUID = toUUID . Git.Config.get key ""
|
2012-12-13 04:24:19 +00:00
|
|
|
where
|
|
|
|
(ConfigKey key) = configkey
|
2011-10-15 21:47:03 +00:00
|
|
|
|
2015-10-15 19:28:29 +00:00
|
|
|
-- Does the repo's config have a key for the UUID?
|
|
|
|
-- True even when the key has no value.
|
|
|
|
isUUIDConfigured :: Git.Repo -> Bool
|
|
|
|
isUUIDConfigured = isJust . Git.Config.getMaybe key
|
|
|
|
where
|
|
|
|
(ConfigKey key) = configkey
|
|
|
|
|
2011-10-15 21:47:03 +00:00
|
|
|
{- Make sure that the repo has an annex.uuid setting. -}
|
|
|
|
prepUUID :: Annex ()
|
2011-11-07 18:46:01 +00:00
|
|
|
prepUUID = whenM ((==) NoUUID <$> getUUID) $
|
2014-04-16 00:13:35 +00:00
|
|
|
storeUUID =<< liftIO genUUID
|
2011-11-07 18:46:01 +00:00
|
|
|
|
2014-04-16 00:13:35 +00:00
|
|
|
storeUUID :: UUID -> Annex ()
|
2016-01-20 20:55:06 +00:00
|
|
|
storeUUID u = do
|
|
|
|
Annex.changeGitConfig $ \c -> c { annexUUID = u }
|
|
|
|
storeUUIDIn configkey u
|
2014-04-16 00:13:35 +00:00
|
|
|
|
|
|
|
storeUUIDIn :: ConfigKey -> UUID -> Annex ()
|
|
|
|
storeUUIDIn configfield = setConfig configfield . fromUUID
|
2013-09-05 20:02:39 +00:00
|
|
|
|
|
|
|
{- Only sets the configkey in the Repo; does not change .git/config -}
|
|
|
|
setUUID :: Git.Repo -> UUID -> IO Git.Repo
|
|
|
|
setUUID r u = do
|
|
|
|
let s = show configkey ++ "=" ++ fromUUID u
|
|
|
|
Git.Config.store s r
|
2014-12-17 17:57:52 +00:00
|
|
|
|
|
|
|
-- Dummy uuid for the whole web. Do not alter.
|
|
|
|
webUUID :: UUID
|
|
|
|
webUUID = UUID "00000000-0000-0000-0000-000000000001"
|
|
|
|
|
|
|
|
-- Dummy uuid for bittorrent. Do not alter.
|
|
|
|
bitTorrentUUID :: UUID
|
|
|
|
bitTorrentUUID = UUID "00000000-0000-0000-0000-000000000002"
|