From bce7e0dd96fc7cc637ac690beaa8c4ba1793d915 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 11 Dec 2014 16:09:56 -0400 Subject: [PATCH] use subdir for addurl when it creates multiple files The --file parameter specifies the subdir in this mode. --- Command/AddUrl.hs | 34 +++++++++++++++++----------------- Remote/External.hs | 6 ++---- Types/UrlContents.hs | 7 +++---- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/Command/AddUrl.hs b/Command/AddUrl.hs index aaa1128034..a89b454778 100644 --- a/Command/AddUrl.hs +++ b/Command/AddUrl.hs @@ -60,14 +60,10 @@ seek us = do if Remote.uuid r == webUUID then void $ commandAction $ startWeb relaxed optfile pathdepth u else do - let handlecontents url c = case c of - UrlContents sz mkf -> - void $ commandAction $ - startRemote r relaxed optfile pathdepth url sz mkf - UrlNested l -> forM_ l $ - uncurry handlecontents + pathmax <- liftIO $ fileNameLengthLimit "." + let deffile = fromMaybe (urlString2file u pathdepth pathmax) optfile res <- tryNonAsync $ maybe - (error "unable to checkUrl") + (error $ "unable to checkUrl of " ++ Remote.name r) (flip id u) (Remote.checkUrl r) case res of @@ -75,20 +71,19 @@ seek us = do showStart "addurl" u warning (show e) next $ next $ return False - Right c -> handlecontents u c + Right (UrlContents sz mf) -> do + void $ commandAction $ + startRemote r relaxed (fromMaybe deffile mf) pathdepth u sz + Right (UrlMulti l) -> + forM_ l $ \(u', sz, f) -> + void $ commandAction $ + startRemote r relaxed (deffile f) pathdepth u' sz -startRemote :: Remote -> Bool -> Maybe FilePath -> Maybe Int -> String -> Maybe Integer -> (FilePath -> FilePath) -> CommandStart -startRemote r relaxed optfile pathdepth s sz mkf = do - url <- case Url.parseURIRelaxed s of - Nothing -> error $ "bad uri " ++ s - Just u -> pure u - pathmax <- liftIO $ fileNameLengthLimit "." - let file = mkf $ choosefile $ url2file url pathdepth pathmax +startRemote :: Remote -> Bool -> FilePath -> Maybe Int -> String -> Maybe Integer -> CommandStart +startRemote r relaxed file pathdepth s sz = do showStart "addurl" file showNote $ "using " ++ Remote.name r next $ performRemote r relaxed s file sz - where - choosefile = flip fromMaybe optfile performRemote :: Remote -> Bool -> URLString -> FilePath -> Maybe Integer -> CommandPerform performRemote r relaxed uri file sz = ifAnnexed file adduri geturi @@ -324,3 +319,8 @@ url2file url pathdepth pathmax = case pathdepth of frombits a = intercalate "/" $ a urlbits urlbits = map (truncateFilePath pathmax . sanitizeFilePath) $ filter (not . null) $ split "/" fullurl + +urlString2file :: URLString -> Maybe Int -> Int -> FilePath +urlString2file s pathdepth pathmax = case Url.parseURIRelaxed s of + Nothing -> error $ "bad uri " ++ s + Just u -> url2file u pathdepth pathmax diff --git a/Remote/External.hs b/Remote/External.hs index c5330f7ea6..1a43a1ca75 100644 --- a/Remote/External.hs +++ b/Remote/External.hs @@ -434,10 +434,8 @@ checkurl :: External -> URLString -> Annex UrlContents checkurl external url = handleRequest external (CHECKURL url) Nothing $ \req -> case req of CHECKURL_CONTENTS sz f -> Just $ return $ UrlContents sz - (if null f then id else const f) - CHECKURL_MULTI l -> Just $ return $ UrlNested $ map mknested l + (if null f then Nothing else Just f) + CHECKURL_MULTI l -> Just $ return $ UrlMulti l CHECKURL_FAILURE errmsg -> Just $ error errmsg UNSUPPORTED_REQUEST -> error "CHECKURL not implemented by external special remote" _ -> Nothing - where - mknested (url', sz, f) = (url', UrlContents sz (const f)) diff --git a/Types/UrlContents.hs b/Types/UrlContents.hs index 81b195fe3f..ae50c6b40d 100644 --- a/Types/UrlContents.hs +++ b/Types/UrlContents.hs @@ -11,9 +11,8 @@ import Utility.Url data UrlContents -- An URL contains a file, whose size may be known. - -- A default filename will be provided, and can be overridded - -- or built on. - = UrlContents (Maybe Integer) (FilePath -> FilePath) + -- There might be a nicer filename to use. + = UrlContents (Maybe Integer) (Maybe FilePath) -- Sometimes an URL points to multiple files, each accessible -- by their own URL. - | UrlNested [(URLString, UrlContents)] + | UrlMulti [(URLString, Maybe Integer, FilePath)]