From 8beed17168aab12bb4045b6d8635b37503d5099b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 25 Oct 2010 17:31:07 -0400 Subject: [PATCH] drop incomplete bare repo support Added a bug about it. Now git annex move --from works fully --- Locations.hs | 14 +++++++------- Remotes.hs | 34 +++++++++++++--------------------- doc/bugs/bare_git_repos.mdwn | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 doc/bugs/bare_git_repos.mdwn diff --git a/Locations.hs b/Locations.hs index 92918a7e0c..c2c747e582 100644 --- a/Locations.hs +++ b/Locations.hs @@ -28,22 +28,22 @@ gitStateDir repo = (Git.workTree repo) ++ "/" ++ stateLoc - - - That allows deriving the key and backend by looking at the symlink to it. - - - - Note that even if the repo is a bare repo, the annex is put in a .git - - sub -} annexLocation :: Git.Repo -> Key -> FilePath annexLocation r key = (Git.workTree r) ++ "/" ++ (annexLocationRelative r key) -{- Annexed file's location relative to git's working tree. -} +{- Annexed file's location relative to git's working tree. + - + - Note: Assumes repo is NOT bare.-} annexLocationRelative :: Git.Repo -> Key -> FilePath -annexLocationRelative r key = Git.dir r ++ "/annex/" ++ (keyFile key) +annexLocationRelative r key = ".git/annex/" ++ (keyFile key) {- .git-annex/tmp is used for temp files - -} + - + - Note: Assumes repo is NOT bare. -} annexTmpLocation :: Git.Repo -> FilePath -annexTmpLocation r = (Git.workTree r) ++ "/" ++ Git.dir r ++ "/annex/tmp/" +annexTmpLocation r = (Git.workTree r) ++ ".git/annex/tmp/" {- Converts a key into a filename fragment. - diff --git a/Remotes.hs b/Remotes.hs index 67ebd75f97..c9c65babeb 100644 --- a/Remotes.hs +++ b/Remotes.hs @@ -188,27 +188,19 @@ tryGitConfigRead r = do {- Tries to copy a key's content from a remote to a file. -} copyFromRemote :: Git.Repo -> Key -> FilePath -> Annex Bool copyFromRemote r key file = do - -- annexLocation needs the git config to have been read for a remote, - -- so do that now if it hasn't been already - result <- tryGitConfigRead r - case (result) of - Left err -> return False - Right from -> copy from + Core.showNote $ "copying from " ++ (Git.repoDescribe r) ++ "..." + if (not $ Git.repoIsUrl r) + then getlocal + else if (Git.repoIsSsh r) + then getssh + else error "copying from non-ssh repo not supported" where - copy from = do - Core.showNote $ "copying from " ++ (Git.repoDescribe from) ++ "..." - if (not $ Git.repoIsUrl from) - then getlocal - else if (Git.repoIsSsh from) - then getssh - else error "copying from non-ssh repo not supported" - where - getlocal = liftIO $ boolSystem "cp" ["-a", location, file] - getssh = do - liftIO $ putStrLn "" -- make way for scp progress bar - liftIO $ boolSystem "scp" [sshlocation, file] - location = annexLocation from key - sshlocation = (Git.urlHost from) ++ ":" ++ location + getlocal = liftIO $ boolSystem "cp" ["-a", location, file] + getssh = do + liftIO $ putStrLn "" -- make way for scp progress bar + liftIO $ boolSystem "scp" [sshlocation, file] + location = annexLocation r key + sshlocation = (Git.urlHost r) ++ ":" ++ location {- Tries to copy a key's content to a remote. -} copyToRemote :: Git.Repo -> Key -> Annex Bool @@ -255,7 +247,7 @@ updateRemoteLogStatus r key = do -- TODO: remote log locking let mergecmd = "cat >> " ++ (shellEscape $ logFile r key) ++ " && " ++ "cd " ++ (shellEscape $ Git.workTree r) ++ " && " ++ - "git add " ++ (shellEscape $ gitStateDir r) + "git add " ++ (shellEscape $ stateLoc) let shellcmd = if (not $ Git.repoIsUrl r) then pOpen WriteToPipe "sh" ["-c", mergecmd] else if (Git.repoIsSsh r) diff --git a/doc/bugs/bare_git_repos.mdwn b/doc/bugs/bare_git_repos.mdwn new file mode 100644 index 0000000000..e24d7a7ee3 --- /dev/null +++ b/doc/bugs/bare_git_repos.mdwn @@ -0,0 +1,14 @@ +It would be nice if git-annex could be used in bare git repos. +However, that is not currently supported. Problems include: + +* git-annex often does not read a git repo's config before touching it, + so it doesn't know if the repo is bare or not + (reading the config when operating on ssh repos would be a pain and SLOW; + I had some of that code in as of 1aa19422ac8748eeff219ac4f46df166dae783c5, + but ripped it all out) +* .. which results in creating `.git/annex` in a bare repo, which mightily + confuses git (so it will complain that the bare repo is not + a git repo at all!) +* `.git-annex/` needs to have state recorded to it and committed, and that + is not possible with a bare repo. (If [[todo/branching]] were done, + that might be fixed.)