summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-06-02 13:50:05 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-06-02 13:50:43 -0400
commit60e30564338ebd9b18b5e229a9050478e5b8c423 (patch)
tree29f6aeecaea4ec7301951636b62b12980a816306
parenta19c55d87ae35f4b65d3a4668c2dca1cf6f875df (diff)
sync --content: Fix bug that caused transfers of files to be made to a git remote that does not have a UUID. This particularly impacted clones from gcrypt repositories.
Added guard in Annex.Transfer to prevent this problem at a deeper level. I'm unhappy ith NoUUID, but having Maybe UUID instead wouldn't help either if nothing checked that there was a UUID. Since there legitimately need to be Remotes that do not have a UUID, I can't see a way to fix it at the type level, short making there be two separate types of Remotes.
-rw-r--r--Annex/Transfer.hs11
-rw-r--r--CHANGELOG3
-rw-r--r--Command/Sync.hs3
-rw-r--r--doc/bugs/gcrypt_special_remote_not_being_encrypted.mdwn2
-rw-r--r--doc/bugs/gcrypt_special_remote_not_being_encrypted/comment_2_d4e46b73fa82ba84b123bc4f2d372ea9._comment28
5 files changed, 44 insertions, 3 deletions
diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs
index 213de0648..78ef0e502 100644
--- a/Annex/Transfer.hs
+++ b/Annex/Transfer.hs
@@ -46,10 +46,17 @@ noObserver :: TransferObserver
noObserver _ _ _ = noop
upload :: Observable v => UUID -> Key -> AssociatedFile -> RetryDecider -> TransferObserver -> (MeterUpdate -> Annex v) -> NotifyWitness -> Annex v
-upload u key f d o a _witness = runTransfer (Transfer Upload u key) f d o a
+upload u key f d o a _witness = guardHaveUUID u $
+ runTransfer (Transfer Upload u key) f d o a
download :: Observable v => UUID -> Key -> AssociatedFile -> RetryDecider -> TransferObserver -> (MeterUpdate -> Annex v) -> NotifyWitness -> Annex v
-download u key f d o a _witness = runTransfer (Transfer Download u key) f d o a
+download u key f d o a _witness = guardHaveUUID u $
+ runTransfer (Transfer Download u key) f d o a
+
+guardHaveUUID :: Observable v => UUID -> Annex v -> Annex v
+guardHaveUUID u a
+ | u == NoUUID = return observeFailure
+ | otherwise = a
{- Runs a transfer action. Creates and locks the lock file while the
- action is running, and stores info in the transfer information
diff --git a/CHANGELOG b/CHANGELOG
index 06c9974df..fc6720928 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,9 @@ git-annex (6.20160528) UNRELEASED; urgency=medium
union merging and performing transitions.
* Remove Makefile from cabal tarball; man page building is now handled by
a small haskell program.
+ * sync --content: Fix bug that caused transfers of files to be made
+ to a git remote that does not have a UUID. This particularly impacted
+ clones from gcrypt repositories.
-- Joey Hess <id@joeyh.name> Fri, 27 May 2016 13:12:48 -0400
diff --git a/Command/Sync.hs b/Command/Sync.hs
index 1169b95c8..c003aa41d 100644
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -106,7 +106,8 @@ seek o = allowConcurrentOutput $ do
remotes <- syncRemotes (syncWith o)
let gitremotes = filter Remote.gitSyncableRemote remotes
- let dataremotes = filter (not . remoteAnnexIgnore . Remote.gitconfig) remotes
+ let dataremotes = filter (\r -> Remote.uuid r /= NoUUID) $
+ filter (not . remoteAnnexIgnore . Remote.gitconfig) remotes
-- Syncing involves many actions, any of which can independently
-- fail, without preventing the others from running.
diff --git a/doc/bugs/gcrypt_special_remote_not_being_encrypted.mdwn b/doc/bugs/gcrypt_special_remote_not_being_encrypted.mdwn
index 2185bec2d..6433f53dc 100644
--- a/doc/bugs/gcrypt_special_remote_not_being_encrypted.mdwn
+++ b/doc/bugs/gcrypt_special_remote_not_being_encrypted.mdwn
@@ -71,3 +71,5 @@ The remote server that use ssh is Debian Jessie, without git-annex installed (I
### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
Yes, everything works very nicely except this issue.
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/gcrypt_special_remote_not_being_encrypted/comment_2_d4e46b73fa82ba84b123bc4f2d372ea9._comment b/doc/bugs/gcrypt_special_remote_not_being_encrypted/comment_2_d4e46b73fa82ba84b123bc4f2d372ea9._comment
new file mode 100644
index 000000000..39b3bc58b
--- /dev/null
+++ b/doc/bugs/gcrypt_special_remote_not_being_encrypted/comment_2_d4e46b73fa82ba84b123bc4f2d372ea9._comment
@@ -0,0 +1,28 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2016-06-02T17:32:24Z"
+ content="""
+The bug is limited to `git annex sync --content` because it
+didn't check if the git remote had no git-annex UUID before
+sending files to it. Commands like `git annex copy` always check that the
+remote has a UUID.
+
+I've made `git annex sync --content` also check for a UUID. So, it won't
+send any file contents to the origin remote in this configuration. I don't
+think it makes sense to have git-annex auto-promote the origin remote to a
+gcrypt special remote; you can just enableremote the special remote to make
+git-annex send the files to it, properly encrypted.
+
+When this bug occurs, git-annex actually doesn't remember that it's sent
+the un-encrypted files to the remote. I suggest that you just delete all
+files in the remote's annex/ directory of the gcrypt repository
+whose names do not start with "GPGHMACSHA1", in order to clean up from this
+bug.
+
+----
+
+The deeper problem is git-annex is able to transfer objects to a remote
+that does not have a UUID at all. I've put in a guard at a deeper level to
+prevent this whole class of problems.
+"""]]