diff --git a/Command/Info.hs b/Command/Info.hs index cb55602a6a..8816ecbcf3 100644 --- a/Command/Info.hs +++ b/Command/Info.hs @@ -425,7 +425,7 @@ reposizes_stats = stat desc $ nojson $ do let maxlen = maximum (map (length . snd) l) descm <- lift uuidDescriptions -- This also handles json display. - s <- lift $ prettyPrintUUIDsWith (Just "size") desc descm $ + s <- lift $ prettyPrintUUIDsWith (Just "size") desc descm (Just . show) $ map (\(u, sz) -> (u, Just $ mkdisp sz maxlen)) l return $ countRepoList (length l) s where diff --git a/Command/Whereis.hs b/Command/Whereis.hs index ba815f33c8..9117cde9e4 100644 --- a/Command/Whereis.hs +++ b/Command/Whereis.hs @@ -13,6 +13,7 @@ import Remote import Logs.Trust import Logs.Web import Remote.Web (getWebUrls) +import Annex.UUID import qualified Data.Map as M @@ -54,32 +55,39 @@ start' remotemap key afile = do perform :: M.Map UUID Remote -> Key -> CommandPerform perform remotemap key = do locations <- keyLocations key + urls <- getUUIDUrls key locations remotemap (untrustedlocations, safelocations) <- trustPartition UnTrusted locations let num = length safelocations showNote $ show num ++ " " ++ copiesplural num - pp <- prettyPrintUUIDs "whereis" safelocations + pp <- ppwhereis "whereis" safelocations urls unless (null safelocations) $ showLongNote pp - pp' <- prettyPrintUUIDs "untrusted" untrustedlocations + pp' <- ppwhereis "untrusted" untrustedlocations urls unless (null untrustedlocations) $ showLongNote $ untrustedheader ++ pp' - -- Since other remotes than the web remote can set urls - -- where a key can be downloaded, get and show all such urls - -- as a special case. - showRemoteUrls "web" =<< getWebUrls key - forM_ (mapMaybe (`M.lookup` remotemap) locations) $ - performRemoteUrls key + mapM_ (showRemoteUrls remotemap) urls + if null safelocations then stop else next $ return True where copiesplural 1 = "copy" copiesplural _ = "copies" untrustedheader = "The following untrusted locations may also have copies:\n" + ppwhereis h ls urls = do + descm <- uuidDescriptions + let urlvals = map (\(u, us) -> (u, Just us)) $ + filter (\(u,_) -> u `elem` ls) urls + prettyPrintUUIDsWith (Just "urls") h descm (const Nothing) urlvals -performRemoteUrls :: Key -> Remote -> Annex () -performRemoteUrls key remote = do - ls <- (++) +getUUIDUrls :: Key -> [UUID] -> M.Map UUID Remote -> Annex [(UUID, [URLString])] +getUUIDUrls key uuids remotemap = forM uuids $ \uu -> (,) + <$> pure uu + <*> maybe (pure []) (getRemoteUrls key) (M.lookup uu remotemap) + +getRemoteUrls :: Key -> Remote -> Annex [URLString] +getRemoteUrls key remote + | uuid remote == webUUID = getWebUrls key + | otherwise = (++) <$> askremote <*> claimedurls - showRemoteUrls (name remote) ls where askremote = maybe (pure []) (flip id key) (whereisKey remote) claimedurls = do @@ -89,10 +97,11 @@ performRemoteUrls key remote = do <$> getUrls key filterM (\u -> (==) <$> pure remote <*> claimingUrl u) us -showRemoteUrls :: String -> [String] -> Annex () -showRemoteUrls nm us - | null us = return () - | otherwise = do - let ls = unlines $ map (\u -> nm ++ ": " ++ u) us - outputMessage noop ('\n' : indent ls ++ "\n") - maybeShowJSON [("urls", us)] +showRemoteUrls :: M.Map UUID Remote -> (UUID, [URLString]) -> Annex () +showRemoteUrls remotemap (uu, us) + | null us = noop + | otherwise = case M.lookup uu remotemap of + Just r -> do + let ls = unlines $ map (\u -> name r ++ ": " ++ u) us + outputMessage noop ('\n' : indent ls ++ "\n") + Nothing -> noop diff --git a/Remote.hs b/Remote.hs index 4f57af996e..c9b11403c5 100644 --- a/Remote.hs +++ b/Remote.hs @@ -183,6 +183,7 @@ prettyPrintUUIDs header uuids = do prettyPrintUUIDsDescs :: String -> M.Map UUID RemoteName -> [UUID] -> Annex String prettyPrintUUIDsDescs header descm uuids = prettyPrintUUIDsWith Nothing header descm + (const Nothing) (zip uuids (repeat (Nothing :: Maybe String))) {- An optional field can be included in the list of UUIDs. -} @@ -191,9 +192,10 @@ prettyPrintUUIDsWith => Maybe String -> String -> M.Map UUID RemoteName + -> (v -> Maybe String) -> [(UUID, Maybe v)] -> Annex String -prettyPrintUUIDsWith optfield header descm uuidvals = do +prettyPrintUUIDsWith optfield header descm showval uuidvals = do hereu <- getUUID maybeShowJSON [(header, map (jsonify hereu) uuidvals)] return $ unwords $ map (\u -> "\t" ++ prettify hereu u ++ "\n") uuidvals @@ -209,9 +211,9 @@ prettyPrintUUIDsWith optfield header descm uuidvals = do | null n && ishere = "here" | ishere = addName n "here" | otherwise = n - addoptval s = case optval of + addoptval s = case showval =<< optval of Nothing -> s - Just val -> show val ++ ": " ++ s + Just val -> val ++ ": " ++ s jsonify hereu (u, optval) = toJSObject $ catMaybes [ Just ("uuid", toJSON $ fromUUID u) , Just ("description", toJSON $ finddescription u) diff --git a/debian/changelog b/debian/changelog index 4aa99b8660..5e5b930329 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +git-annex (6.20160115) UNRELEASED; urgency=medium + + * whereis --json: Urls are now listed inside the remote that claims them, + rather than all together at the end. + + -- Joey Hess Fri, 15 Jan 2016 14:05:01 -0400 + git-annex (6.20160114) unstable; urgency=medium "hexapodia as the key insight" diff --git a/doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them.mdwn b/doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them.mdwn index cad6a4623e..bd860e9e48 100644 --- a/doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them.mdwn +++ b/doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them.mdwn @@ -89,3 +89,5 @@ as you can see -- only --json format is missing on web remote URLs. I guess, id what is the purpose of note in current output anyways since it just duplicates information in 'whereis' field? [[!meta author=yoh]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them/comment_1_c53cf9bbcef391f9072b6d3618d8be12._comment b/doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them/comment_1_c53cf9bbcef391f9072b6d3618d8be12._comment new file mode 100644 index 0000000000..8cf26b7242 --- /dev/null +++ b/doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them/comment_1_c53cf9bbcef391f9072b6d3618d8be12._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2016-01-15T18:10:26Z" + content=""" +The web urls were included in the json output, but it seems some json +parsers, including the one you're using, only show the last value of an +attribute when multiple values are repeated, as happened when there were +both web and other remotes with urls. + +Anyway, I've updated the json output to include the url list inside the +remote's record. + +(The "note" just collects any output that is not explicitly formatted as +json.) +"""]]