summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-10-25 17:31:07 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-10-25 17:31:07 -0400
commit8beed17168aab12bb4045b6d8635b37503d5099b (patch)
tree1332678e95f6ef8588164c4f82eeee6b8c59392f
parent1aa19422ac8748eeff219ac4f46df166dae783c5 (diff)
drop incomplete bare repo support
Added a bug about it. Now git annex move --from works fully
-rw-r--r--Locations.hs14
-rw-r--r--Remotes.hs34
-rw-r--r--doc/bugs/bare_git_repos.mdwn14
3 files changed, 34 insertions, 28 deletions
diff --git a/Locations.hs b/Locations.hs
index 92918a7e0..c2c747e58 100644
--- a/Locations.hs
+++ b/Locations.hs
@@ -28,22 +28,22 @@ gitStateDir repo = (Git.workTree repo) ++ "/" ++ stateLoc
- <backend:fragment>
-
- 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 67ebd75f9..c9c65babe 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 000000000..e24d7a7ee
--- /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.)