summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Locations.hs1
-rw-r--r--Remote/WebDAV.hs82
-rw-r--r--doc/special_remotes/webdav.mdwn4
-rw-r--r--doc/tips/using_box.com_as_a_special_remote.mdwn15
4 files changed, 47 insertions, 55 deletions
diff --git a/Locations.hs b/Locations.hs
index 3a7c89ea7..6213385bd 100644
--- a/Locations.hs
+++ b/Locations.hs
@@ -11,6 +11,7 @@ module Locations (
keyPaths,
gitAnnexLocation,
annexLocations,
+ annexLocation,
gitAnnexDir,
gitAnnexObjectDir,
gitAnnexTmpDir,
diff --git a/Remote/WebDAV.hs b/Remote/WebDAV.hs
index 3747e8179..b7a355c1f 100644
--- a/Remote/WebDAV.hs
+++ b/Remote/WebDAV.hs
@@ -81,15 +81,14 @@ webdavSetup u c = do
setRemoteCredPair c (davCreds u)
store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
-store r k _f _p = do
+store r k _f _p = davAction r False $ \(baseurl, user, pass) -> do
+ let url = davLocation baseurl k
+ liftIO $ davMkdir (urlParent url) user pass
f <- inRepo $ gitAnnexLocation k
- davAction r False $ \(baseurl, user, pass) -> liftIO $ do
- let url = Prelude.head $ davLocations baseurl k
- davMkdir (urlParent url) user pass
- b <- L.readFile f
- v <- catchMaybeHttp $ putContentAndProps url user pass
- (noProps, (contentType, b))
- return $ isJust v
+ b <- liftIO $ L.readFile f
+ v <- liftIO $ catchMaybeHttp $ putContentAndProps url user pass
+ (noProps, (contentType, b))
+ return $ isJust v
storeEncrypted :: Remote -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool
storeEncrypted r (cipher, enck) k _p = davAction r False $ \creds -> liftIO $ do
@@ -98,14 +97,13 @@ storeEncrypted r (cipher, enck) k _p = davAction r False $ \creds -> liftIO $ do
retrieve :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool
retrieve r k _f d = davAction r False $ liftIO . go
where
- go (baseurl, user, pass) = get $ davLocations baseurl k
- where
- get [] = return False
- get (u:urls) = maybe (get urls) save
- =<< catchMaybeHttp (getPropsAndContent u user pass)
- save (_, (_, b)) = do
- L.writeFile d b
- return True
+ go (baseurl, user, pass) = do
+ let url = davLocation baseurl k
+ maybe (return False) save
+ =<< catchMaybeHttp (getPropsAndContent url user pass)
+ save (_, (_, b)) = do
+ L.writeFile d b
+ return True
retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool
retrieveCheap _ _ _ = return False
@@ -117,39 +115,24 @@ retrieveEncrypted r (cipher, enck) _ f = davAction r False $ \creds -> do
remove :: Remote -> Key -> Annex Bool
remove r k = davAction r False $ liftIO . go
where
- go (baseurl, user, pass) = delone $ davLocations baseurl k
- where
- delone [] = return False
- delone (u:urls) = maybe (delone urls) (const $ return True)
- =<< catchMaybeHttp (deletedir u)
-
- {- Rather than deleting first the file, and then its
- - immediate parent directory (to clean up), delete the
- - parent directory, along with all its contents in a
- - single recursive DAV call.
- -
- - The file is the only thing we keep in there, and this
- - is faster. -}
- deletedir u = deleteContent (urlParent u) user pass
+ go (baseurl, user, pass) = do
+ let url = davLocation baseurl k
+ isJust <$> catchMaybeHttp (deleteContent url user pass)
checkPresent :: Remote -> Key -> Annex (Either String Bool)
-checkPresent r k = davAction r noconn go
+checkPresent r k = davAction r noconn $ \(baseurl, user, pass) -> do
+ showAction $ "checking " ++ name r
+ let url = davLocation baseurl k
+ v <- liftIO $ catchHttp $ getProps url user pass
+ case v of
+ Right _ -> return $ Right True
+ Left (Left (StatusCodeException status _))
+ | statusCode status == statusCode notFound404 -> return $ Right False
+ | otherwise -> return $ Left $ show $ statusMessage status
+ Left (Left httpexception) -> return $ Left $ show httpexception
+ Left (Right ioexception) -> return $ Left $ show ioexception
where
noconn = Left $ error $ name r ++ " not configured"
- go (baseurl, user, pass) = do
- showAction $ "checking " ++ name r
- liftIO $ check $ davLocations baseurl k
- where
- check [] = return $ Right False
- check (u:urls) = do
- v <- catchHttp $ getProps u user pass
- case v of
- Right _ -> return $ Right True
- Left (Left (StatusCodeException status _))
- | statusCode status == statusCode notFound404 -> check urls
- | otherwise -> return $ Left $ show $ statusMessage status
- Left (Left httpexception) -> return $ Left $ show httpexception
- Left (Right ioexception) -> return $ Left $ show ioexception
davAction :: Remote -> a -> ((DavUrl, DavUser, DavPass) -> Annex a) -> Annex a
davAction r unconfigured action = case config r of
@@ -167,12 +150,9 @@ toDavUser = B8.fromString
toDavPass :: String -> DavPass
toDavPass = B8.fromString
-{- All possibile locations to try to access a given Key.
- -
- - This is intentially the same as the directory special remote uses, to
- - allow interoperability. -}
-davLocations :: DavUrl -> Key -> [DavUrl]
-davLocations baseurl k = map (davUrl baseurl) (keyPaths k)
+{- The location to use to store a Key. -}
+davLocation :: DavUrl -> Key -> DavUrl
+davLocation baseurl k = davUrl baseurl $ hashDirLower k </> keyFile k
davUrl :: DavUrl -> FilePath -> DavUrl
davUrl baseurl file = baseurl </> file
diff --git a/doc/special_remotes/webdav.mdwn b/doc/special_remotes/webdav.mdwn
index c5b53dc4b..8421dd5f4 100644
--- a/doc/special_remotes/webdav.mdwn
+++ b/doc/special_remotes/webdav.mdwn
@@ -28,10 +28,10 @@ the webdav remote.
WebDAV. For use when the WebDAV server has file size
limitations. The default is to never chunk files.
The value can use specified using any commonly used units.
- Example: `chunksize=100 megabytes`
+ Example: `chunksize=75 megabytes`
Note that enabling chunking on an existing remote with non-chunked
files is not recommended.
Setup example:
- # WEBDAV_USERNAME=joey@kitenet.net WEBDAV_PASSWORD=xxxxxxx git annex initremote box.com type=webdav url=https://www.box.com/dav/git-annex encryption=joey@kitenet.net
+ # WEBDAV_USERNAME=joey@kitenet.net WEBDAV_PASSWORD=xxxxxxx git annex initremote box.com type=webdav url=https://www.box.com/dav/git-annex chunksize=75mb encryption=joey@kitenet.net
diff --git a/doc/tips/using_box.com_as_a_special_remote.mdwn b/doc/tips/using_box.com_as_a_special_remote.mdwn
index cafbc033c..6616d0a1e 100644
--- a/doc/tips/using_box.com_as_a_special_remote.mdwn
+++ b/doc/tips/using_box.com_as_a_special_remote.mdwn
@@ -2,8 +2,19 @@
for providing 50 gb of free storage if you sign up with its Android client.
(Or a few gb free otherwise.)
-With a little setup, git-annex can use Box as a
-[[special remote|special_remotes]].
+git-annex can use Box as a [[special remote|special_remotes]].
+Recent versions of git-annex make this very easy to set up:
+
+ WEBDAV_USERNAME=you@example.com WEBDAV_PASSWORD=xxxxxxx git annex initremote box.com type=webdav url=https://www.box.com/dav/git-annex chunksize=75mb encryption=you@example.com
+
+Note the use of chunksize; Box has a 100 mb maximum file size, and this
+breaks up large files into chunks before that limit is reached.
+
+# old davfs2 method
+
+This method is deprecated, but still documented here just in case.
+Note that the files stored using this method cannot reliably be retreived
+using the webdav special remote.
## davfs2 setup