summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-02-04 00:06:23 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-02-04 00:06:23 -0400
commit0fd0e414ec593dcb965ca9a348798857be2bb3e9 (patch)
tree4d1976f8f61dc86128073699a7109867db8383ff
parent67c1facad150cfbc706721cbd9b482be22a31f4c (diff)
color unreachable nodes
-rw-r--r--Command/Map.hs17
-rw-r--r--Dot.hs43
2 files changed, 40 insertions, 20 deletions
diff --git a/Command/Map.hs b/Command/Map.hs
index fa2a41253..bc117d479 100644
--- a/Command/Map.hs
+++ b/Command/Map.hs
@@ -51,11 +51,12 @@ start = do
- displayed as a node, and each of its remotes is represented as an edge
- pointing at the node for the remote. -}
drawMap :: [Git.Repo] -> (M.Map UUID String) -> String
-drawMap rs umap = Dot.graph $ repos ++ others
+drawMap rs umap = Dot.graph $ others ++ repos
where
repos = map (node umap rs) rs
others = map uuidnode (M.keys umap)
- uuidnode u = Dot.graphNode u $ M.findWithDefault "" u umap
+ uuidnode u = unreachable $
+ Dot.graphNode u $ M.findWithDefault "" u umap
hostname :: Git.Repo -> String
hostname r
@@ -78,7 +79,7 @@ repoName umap r
Just n -> n
Nothing -> "unknown"
-{- A unique id for the node. Uses the annex.uuid if available. -}
+{- A unique id for the node for a repo. Uses the annex.uuid if available. -}
nodeId :: Git.Repo -> String
nodeId r =
case (getUncachedUUID r) of
@@ -90,8 +91,11 @@ node :: (M.Map UUID String) -> [Git.Repo] -> Git.Repo -> String
node umap fullinfo r = unlines $ n:edges
where
n = Dot.subGraph (hostname r) (basehostname r) $
- Dot.graphNode (nodeId r) (repoName umap r)
+ decorate $ Dot.graphNode (nodeId r) (repoName umap r)
edges = map (edge umap fullinfo r) (Git.remotes r)
+ decorate
+ | Git.configMap r == M.empty = unreachable
+ | otherwise = reachable
{- An edge between two repos. The second repo is a remote of the first. -}
edge :: (M.Map UUID String) -> [Git.Repo] -> Git.Repo -> Git.Repo -> String
@@ -115,6 +119,11 @@ edge umap fullinfo from to =
then Nothing
else Just n
+unreachable :: String -> String
+unreachable s = Dot.fillColor "red" s
+reachable :: String -> String
+reachable s = Dot.fillColor "white" s
+
{- Recursively searches out remotes starting with the specified repo. -}
spider :: Git.Repo -> Annex [Git.Repo]
spider r = spider' [r] []
diff --git a/Dot.hs b/Dot.hs
index 1d9c29c53..0507c638c 100644
--- a/Dot.hs
+++ b/Dot.hs
@@ -9,39 +9,50 @@ module Dot where -- import qualified
{- generates a graph description from a list of lines -}
graph :: [String] -> String
-graph s = unlines $ [header] ++ s ++ [footer]
+graph s = unlines $ [header] ++ map formatLine s ++ [footer]
where
header = "digraph map {"
footer= "}"
{- a node in the graph -}
graphNode :: String -> String -> String
-graphNode nodeid desc = lineLabeled desc $ quote nodeid
+graphNode nodeid desc = label desc $ quote nodeid
{- an edge between two nodes -}
graphEdge :: String -> String -> Maybe String -> String
-graphEdge fromid toid d =
- case d of
- Nothing -> line edge
- Just desc -> lineLabeled desc edge
+graphEdge fromid toid desc =
+ case desc of
+ Nothing -> edge
+ Just d -> label d edge
where
edge = quote fromid ++ " -> " ++ quote toid
-quote :: String -> String
-quote s = "\"" ++ s ++ "\""
+{- adds a label to a node or edge -}
+label :: String -> String -> String
+label l s = attr "label" l s
-line :: String -> String
-line s = "\t" ++ s ++ ";"
+{- adds an attribute to a node or edge
+ - (can be called multiple times for multiple attributes) -}
+attr :: String -> String -> String -> String
+attr a v s = s ++ " [ " ++ a ++ "=" ++ quote v ++ " ]"
-{- a line with a label -}
-lineLabeled :: String -> String -> String
-lineLabeled label s = line $ s ++ " [ label=" ++ quote label ++ " ]"
+{- fills a node with a color -}
+fillColor :: String -> String -> String
+fillColor color s = attr "fillcolor" color $ attr "style" "filled" $ s
{- apply to graphNode to put the node in a labeled box -}
subGraph :: String -> String -> String -> String
-subGraph subid label s = line $
- "subgraph " ++ name ++ "{\n" ++ setlabel ++ "\n" ++ s ++ "\n}"
+subGraph subid l s =
+ "subgraph " ++ name ++ "{\n\t" ++ setlabel ++ "\n\t\t" ++ s ++ "\n\t}"
where
-- the "cluster_" makes dot draw a box
name = quote ("cluster_" ++ subid)
- setlabel = line $ "label=" ++ quote label
+ setlabel = formatLine $ "label=" ++ quote l
+
+formatLine :: String -> String
+formatLine s = "\t" ++ s ++ ";"
+
+quote :: String -> String
+quote s = "\"" ++ s' ++ "\""
+ where
+ s' = filter (/= '"') s