diff options
author | Joey Hess <joey@kitenet.net> | 2013-09-12 12:21:21 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-09-12 12:21:21 -0400 |
commit | 1769d091fb3983ad57406de0b699725641becfa9 (patch) | |
tree | bbdb93807942c2be3ab4fdeef5323468eaa68d86 /Command | |
parent | 138176a46fa237fe31e42220e622b401b76da6c2 (diff) |
remotes: New command, displays a compact table of remotes that contain files. (Thanks, anarcat for display code and mastensg for inspiration.)
Note that it would be possible to extend the display to show all
repositories. But there can be a lot of repositories that are not set up as
remotes, and it would significantly clutter the display to show them all.
Since we're not showing all repositories, it's not worth trying to show
numcopies count either.
I decided to embrace these limitations and call the command remotes.
Diffstat (limited to 'Command')
-rw-r--r-- | Command/Remotes.hs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/Command/Remotes.hs b/Command/Remotes.hs new file mode 100644 index 000000000..f9ae9b3cd --- /dev/null +++ b/Command/Remotes.hs @@ -0,0 +1,64 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Remotes where + +import qualified Data.Set as S + +import Common.Annex +import Command +import Remote +import Logs.Trust +import Annex.UUID + +def :: [Command] +def = [noCommit $ command "remotes" paramPaths seek + SectionQuery "show which remotes contain files"] + +seek :: [CommandSeek] +seek = + [ withValue getList $ \l -> withNothing $ startHeader l + , withValue getList $ \l -> withFilesInGit $ whenAnnexed $ start l + ] + +getList :: Annex [(UUID, RemoteName, TrustLevel)] +getList = do + rs <- remoteList + ts <- mapM (lookupTrust . uuid) rs + hereu <- getUUID + heretrust <- lookupTrust hereu + return $ (hereu, "here", heretrust) : zip3 (map uuid rs) (map name rs) ts + +startHeader :: [(UUID, RemoteName, TrustLevel)] -> CommandStart +startHeader l = do + liftIO $ putStrLn $ header $ map (\(_, n, t) -> (n, t)) l + stop + +start :: [(UUID, RemoteName, TrustLevel)] -> FilePath -> (Key, Backend) -> CommandStart +start l file (key, _) = do + ls <- S.fromList <$> keyLocations key + liftIO $ putStrLn $ format (map (\(u, _, t) -> (t, S.member u ls)) l) file + stop + +type RemoteName = String +type Present = Bool + +header :: [(RemoteName, TrustLevel)] -> String +header remotes = (unlines $ zipWith formatheader [0..] remotes) ++ (pipes (length remotes)) + where + formatheader n (remotename, trustlevel) = (pipes n) ++ remotename ++ (trust trustlevel) + pipes = flip replicate '|' + trust UnTrusted = " (untrusted)" + trust _ = "" + +format :: [(TrustLevel, Present)] -> FilePath -> String +format remotes file = thereMap ++ " " ++ file + where + thereMap = concatMap there remotes + there (UnTrusted, True) = "x" + there (_, True) = "X" + there (_, False) = "_" |