summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-01-15 14:16:48 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-01-15 14:16:48 -0400
commit38d5ad051eb93c5b939755587a720a6f6ca7ef4e (patch)
treead7c23abee2d40b33ebd4c66d671dfba6a097b26
parent349117d6b4744ba7125841933fe9c2ea78515927 (diff)
whereis --json: Urls are now listed inside the remote that claims them, rather than all together at the end.
-rw-r--r--Command/Info.hs2
-rw-r--r--Command/Whereis.hs47
-rw-r--r--Remote.hs8
-rw-r--r--debian/changelog7
-rw-r--r--doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them.mdwn2
-rw-r--r--doc/bugs/new_whereis_--json_lost_information_about_web_urls_if_other_special_remotes_provide_them/comment_1_c53cf9bbcef391f9072b6d3618d8be12._comment16
6 files changed, 59 insertions, 23 deletions
diff --git a/Command/Info.hs b/Command/Info.hs
index cb55602a6..8816ecbcf 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 ba815f33c..9117cde9e 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
+
+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)
-performRemoteUrls :: Key -> Remote -> Annex ()
-performRemoteUrls key remote = do
- ls <- (++)
+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 4f57af996..c9b11403c 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 4aa99b866..5e5b93032 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 <id@joeyh.name> 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 cad6a4623..bd860e9e4 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 000000000..8cf26b724
--- /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.)
+"""]]