summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Remote/Rsync.hs38
-rw-r--r--Utility/Rsync.hs3
-rw-r--r--debian/changelog3
-rw-r--r--doc/design/assistant/android.mdwn2
4 files changed, 31 insertions, 15 deletions
diff --git a/Remote/Rsync.hs b/Remote/Rsync.hs
index 88540a34b..58b66b74b 100644
--- a/Remote/Rsync.hs
+++ b/Remote/Rsync.hs
@@ -155,18 +155,20 @@ retrieveEncrypted o (cipher, enck) _ f p = withTmp enck $ \tmp ->
)
remove :: RsyncOpts -> Key -> Annex Bool
-remove o k = withRsyncScratchDir $ \tmp -> liftIO $ do
- {- Send an empty directory to rysnc to make it delete. -}
- let dummy = tmp </> keyFile k
- createDirectoryIfMissing True dummy
- rsync $ rsyncOptions o ++
- map (\s -> Param $ "--include=" ++ s) includes ++
- [ Param "--exclude=*" -- exclude everything else
- , Params "--quiet --delete --recursive"
- , partialParams
- , Param $ addTrailingPathSeparator dummy
- , Param $ rsyncUrl o
- ]
+remove o k = do
+ ps <- sendParams
+ withRsyncScratchDir $ \tmp -> liftIO $ do
+ {- Send an empty directory to rysnc to make it delete. -}
+ let dummy = tmp </> keyFile k
+ createDirectoryIfMissing True dummy
+ rsync $ rsyncOptions o ++ ps ++
+ map (\s -> Param $ "--include=" ++ s) includes ++
+ [ Param "--exclude=*" -- exclude everything else
+ , Params "--quiet --delete --recursive"
+ , partialParams
+ , Param $ addTrailingPathSeparator dummy
+ , Param $ rsyncUrl o
+ ]
where
{- Specify include rules to match the directories where the
- content could be. Note that the parent directories have
@@ -200,6 +202,15 @@ checkPresent r o k = do
partialParams :: CommandParam
partialParams = Params "--partial --partial-dir=.rsync-partial"
+{- When sending files from crippled filesystems, the permissions can be all
+ - messed up, and it's better to use the default permissions on the
+ - destination. -}
+sendParams :: Annex [CommandParam]
+sendParams = ifM crippledFileSystem
+ ( return [rsyncUseDestinationPermissions]
+ , return []
+ )
+
{- Runs an action in an empty scratch directory that can be used to build
- up trees for rsync. -}
withRsyncScratchDir :: (FilePath -> Annex Bool) -> Annex Bool
@@ -261,8 +272,9 @@ rsyncSend o callback k canrename src = withRsyncScratchDir $ \tmp -> do
liftIO $ createLink src dest
return True
)
+ ps <- sendParams
if ok
- then rsyncRemote o (Just callback)
+ then rsyncRemote o (Just callback) $ ps ++
[ Param "--recursive"
, partialParams
-- tmp/ to send contents of tmp dir
diff --git a/Utility/Rsync.hs b/Utility/Rsync.hs
index d4eeddc8c..652da8b20 100644
--- a/Utility/Rsync.hs
+++ b/Utility/Rsync.hs
@@ -45,6 +45,9 @@ rsyncServerParams =
, Params "-e.Lsf ."
]
+rsyncUseDestinationPermissions :: CommandParam
+rsyncUseDestinationPermissions = Param "--chmod=ugo=rwX"
+
rsync :: [CommandParam] -> IO Bool
rsync = boolSystem "rsync"
diff --git a/debian/changelog b/debian/changelog
index 758d01504..502afde18 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -18,6 +18,9 @@ git-annex (4.20130502) UNRELEASED; urgency=low
* SHA: Add a runtime sanity check that sha commands output something
that appears to be a real sha.
* configure: Better checking that sha commands output in the desired format.
+ * rsync special remotes: When sending from a crippled filesystem, use
+ the destination's default file permissions, as the local ones can
+ be arbitrarily broken. (Ie, ----rwxr-x for files on Android)
-- Joey Hess <joeyh@debian.org> Thu, 02 May 2013 20:39:19 -0400
diff --git a/doc/design/assistant/android.mdwn b/doc/design/assistant/android.mdwn
index 268b5aba3..278fad210 100644
--- a/doc/design/assistant/android.mdwn
+++ b/doc/design/assistant/android.mdwn
@@ -23,8 +23,6 @@
jobs when low on battery or run flat out when plugged in.
* The app should be aware of network status, and avoid expensive data
transfers when not on wifi. This may need to be configurable.
-* Jabber and Webdav configuration both fail with
- "getProtocolByname: does not exist (no such protocol name: tcp)"
* glacier and local pairing are not yet enabled for Android.
* The "Files" link doesn't start a file browser. Should be possible to do
on Android via intents, I suppose?