This commit is contained in:
Joey Hess 2010-10-12 13:10:07 -04:00
parent ea5d7fe07a
commit dc1d5e6831
3 changed files with 39 additions and 47 deletions

View file

@ -10,13 +10,12 @@ module Annex (
import System.Posix.Files import System.Posix.Files
import System.Directory import System.Directory
import System.Cmd.Utils
import System.IO
import GitRepo import GitRepo
import Utility import Utility
import Locations import Locations
import Backend import Backend
import BackendList import BackendList
import UUID
import LocationLog import LocationLog
-- git-annex's runtime state -- git-annex's runtime state
@ -86,12 +85,7 @@ unannexFile state file = do
{- Sets up a git repo for git-annex. May be called repeatedly. -} {- Sets up a git repo for git-annex. May be called repeatedly. -}
gitPrep :: GitRepo -> IO () gitPrep :: GitRepo -> IO ()
gitPrep repo = do gitPrep repo = do
-- Make sure that the repo has an annex.uuid setting. prepUUID repo
if ("" == gitConfig repo "annex.uuid" "")
then do
uuid <- genUUID
gitRun repo ["config", "annex.uuid", uuid]
else return ()
-- configure git to use union merge driver on state files -- configure git to use union merge driver on state files
let attrLine = stateLoc ++ "/*.log merge=union" let attrLine = stateLoc ++ "/*.log merge=union"
@ -108,9 +102,3 @@ gitPrep repo = do
appendFile attributes $ attrLine ++ "\n" appendFile attributes $ attrLine ++ "\n"
gitAdd repo attributes gitAdd repo attributes
else return () else return ()
{- Generates a UUID. There is a library for this, but it's not packaged,
- so use the command line tool. -}
genUUID :: IO String
genUUID = do
pOpen ReadFromPipe "uuid" ["-m"] $ \h -> hGetLine h

34
TODO
View file

@ -1,39 +1,7 @@
* bug when annexing files in a subdir of a git repo * bug when annexing files in a subdir of a git repo
* how to handle git mv file? * how to handle git mv file?
* query remotes for their annex.name settings, or figure out a different * query remotes for their annex.uuid settings
solution to nameing problem?
- querying network remotes all the time will be slow. local caching in
.git/config?
- having a git annex name and a git remote name that are distinct
will be confusing
- but git remote names are repo-local, I want a global name
- really, I don't want a name at all, I want a per-repo UUID
So, each repo has a UUID, stored in annex.uuid.
And also, the last seen UUID for each remote is listed:
remote.origin.annex-uuid=d3d2474c-d5c3-11df-80a9-002170d25c55
Then when it need to find a repo by UUID, it can see if a known remote
has it -- and then query the remote to confirm the repo there still has
that UUID (a different repo may have been mounted there).
Failing that, it can force a refresh of all uuids, updating .git/config,
and check again.
- Only downside for this is that if I put a repo on a usb disk,
and it is disconnected and I have no remote for it,
git-annex will have to say:
"You asked for a file that is only present on a git repo with
UUID d3d2474c-d5c3-11df-80a9-002170d25c55 -- and I don't know
where it is."
To solve that, let .git-annex/uuid.map map between uuids and descriptions,
like "d3d2474c-d5c3-11df-80a9-002170d25c55 SATA drive labeled '* arch-2'"
* hook up LocationLog * hook up LocationLog
* --push/--pull/--get/--want/--drop * --push/--pull/--get/--want/--drop

36
UUID.hs Normal file
View file

@ -0,0 +1,36 @@
{- git-annex uuids
-
- Each git repository used by git-annex has an annex.uuid setting that
- uniquely identifies that repository.
-
-}
module UUID (
getUUID,
prepUUID,
genUUID
) where
import System.Cmd.Utils
import System.IO
import GitRepo
configkey="annex.uuid"
{- Generates a UUID. There is a library for this, but it's not packaged,
- so use the command line tool. -}
genUUID :: IO String
genUUID = do
pOpen ReadFromPipe "uuid" ["-m"] $ \h -> hGetLine h
getUUID :: GitRepo -> String
getUUID repo = gitConfig repo "annex.uuid" ""
{- Make sure that the repo has an annex.uuid setting. -}
prepUUID :: GitRepo -> IO ()
prepUUID repo =
if ("" == getUUID repo)
then do
uuid <- genUUID
gitRun repo ["config", configkey, uuid]
else return ()