converted Info

This commit is contained in:
Joey Hess 2015-07-11 10:41:52 -04:00
parent 9ad20c2869
commit 215f636bb3
2 changed files with 63 additions and 52 deletions

View file

@ -63,7 +63,7 @@ import qualified Command.List
--import qualified Command.Log
import qualified Command.Merge
import qualified Command.ResolveMerge
--import qualified Command.Info
import qualified Command.Info
--import qualified Command.Status
import qualified Command.Migrate
import qualified Command.Uninit
@ -190,7 +190,7 @@ cmds =
-- , Command.Log.cmd
, Command.Merge.cmd
, Command.ResolveMerge.cmd
-- , Command.Info.cmd
, Command.Info.cmd
-- , Command.Status.cmd
, Command.Migrate.cmd
, Command.Map.cmd

View file

@ -70,80 +70,94 @@ data StatInfo = StatInfo
, referencedData :: Maybe KeyData
, repoData :: M.Map UUID KeyData
, numCopiesStats :: Maybe NumCopiesStats
, infoOptions :: InfoOptions
}
emptyStatInfo :: StatInfo
emptyStatInfo :: InfoOptions -> StatInfo
emptyStatInfo = StatInfo Nothing Nothing M.empty Nothing
-- a state monad for running Stats in
type StatState = StateT StatInfo Annex
cmd :: Command
cmd = noCommit $ dontCheck repoExists $ withOptions (jsonOption : bytesOption : annexedMatchingOptions) $
cmd = noCommit $ dontCheck repoExists $ withGlobalOptions (jsonOption : annexedMatchingOptions) $
command "info" SectionQuery
"shows information about the specified item or the repository as a whole"
(paramRepeating paramItem) (withParams seek)
(paramRepeating paramItem) (seek <$$> optParser)
seek :: CmdParams -> CommandSeek
seek = withWords start
data InfoOptions = InfoOptions
{ infoFor :: CmdParams
, bytesOption :: Bool
}
start :: [String] -> CommandStart
start [] = do
globalInfo
optParser :: CmdParamsDesc -> Parser InfoOptions
optParser desc = InfoOptions
<$> cmdParams desc
<*> switch
( long "bytes"
<> help "display file sizes in bytes"
)
seek :: InfoOptions -> CommandSeek
seek o = withWords (start o) (infoFor o)
start :: InfoOptions -> [String] -> CommandStart
start o [] = do
globalInfo o
stop
start ps = do
mapM_ itemInfo ps
start o ps = do
mapM_ (itemInfo o) ps
stop
globalInfo :: Annex ()
globalInfo = do
globalInfo :: InfoOptions -> Annex ()
globalInfo o = do
stats <- selStats global_fast_stats global_slow_stats
showCustom "info" $ do
evalStateT (mapM_ showStat stats) emptyStatInfo
evalStateT (mapM_ showStat stats) (emptyStatInfo o)
return True
itemInfo :: String -> Annex ()
itemInfo p = ifM (isdir p)
( dirInfo p
itemInfo :: InfoOptions -> String -> Annex ()
itemInfo o p = ifM (isdir p)
( dirInfo o p
, do
v <- Remote.byName' p
case v of
Right r -> remoteInfo r
Right r -> remoteInfo o r
Left _ -> do
v' <- Remote.nameToUUID' p
case v' of
Right u -> uuidInfo u
Left _ -> maybe noinfo (fileInfo p)
Right u -> uuidInfo o u
Left _ -> maybe noinfo (fileInfo o p)
=<< isAnnexLink p
)
where
isdir = liftIO . catchBoolIO . (isDirectory <$$> getFileStatus)
noinfo = error $ p ++ " is not a directory or an annexed file or a remote or a uuid"
dirInfo :: FilePath -> Annex ()
dirInfo dir = showCustom (unwords ["info", dir]) $ do
dirInfo :: InfoOptions -> FilePath -> Annex ()
dirInfo o dir = showCustom (unwords ["info", dir]) $ do
stats <- selStats (tostats dir_fast_stats) (tostats dir_slow_stats)
evalStateT (mapM_ showStat stats) =<< getDirStatInfo dir
evalStateT (mapM_ showStat stats) =<< getDirStatInfo o dir
return True
where
tostats = map (\s -> s dir)
fileInfo :: FilePath -> Key -> Annex ()
fileInfo file k = showCustom (unwords ["info", file]) $ do
evalStateT (mapM_ showStat (file_stats file k)) emptyStatInfo
fileInfo :: InfoOptions -> FilePath -> Key -> Annex ()
fileInfo o file k = showCustom (unwords ["info", file]) $ do
evalStateT (mapM_ showStat (file_stats file k)) (emptyStatInfo o)
return True
remoteInfo :: Remote -> Annex ()
remoteInfo r = showCustom (unwords ["info", Remote.name r]) $ do
remoteInfo :: InfoOptions -> Remote -> Annex ()
remoteInfo o r = showCustom (unwords ["info", Remote.name r]) $ do
i <- map (\(k, v) -> simpleStat k (pure v)) <$> Remote.getInfo r
l <- selStats (remote_fast_stats r ++ i) (uuid_slow_stats (Remote.uuid r))
evalStateT (mapM_ showStat l) emptyStatInfo
evalStateT (mapM_ showStat l) (emptyStatInfo o)
return True
uuidInfo :: UUID -> Annex ()
uuidInfo u = showCustom (unwords ["info", fromUUID u]) $ do
uuidInfo :: InfoOptions -> UUID -> Annex ()
uuidInfo o u = showCustom (unwords ["info", fromUUID u]) $ do
l <- selStats [] ((uuid_slow_stats u))
evalStateT (mapM_ showStat l) emptyStatInfo
evalStateT (mapM_ showStat l) (emptyStatInfo o)
return True
selStats :: [Stat] -> [Stat] -> Annex [Stat]
@ -299,7 +313,7 @@ local_annex_keys = stat "local annex keys" $ json show $
local_annex_size :: Stat
local_annex_size = simpleStat "local annex size" $
lift . showSizeKeys =<< cachedPresentData
showSizeKeys =<< cachedPresentData
remote_annex_keys :: UUID -> Stat
remote_annex_keys u = stat "remote annex keys" $ json show $
@ -307,7 +321,7 @@ remote_annex_keys u = stat "remote annex keys" $ json show $
remote_annex_size :: UUID -> Stat
remote_annex_size u = simpleStat "remote annex size" $
lift . showSizeKeys =<< cachedRemoteData u
showSizeKeys =<< cachedRemoteData u
known_annex_files :: Stat
known_annex_files = stat "annexed files in working tree" $ json show $
@ -315,7 +329,7 @@ known_annex_files = stat "annexed files in working tree" $ json show $
known_annex_size :: Stat
known_annex_size = simpleStat "size of annexed files in working tree" $
lift . showSizeKeys =<< cachedReferencedData
showSizeKeys =<< cachedReferencedData
tmp_size :: Stat
tmp_size = staleSize "temporary object directory size" gitAnnexTmpObjectDir
@ -324,7 +338,7 @@ bad_data_size :: Stat
bad_data_size = staleSize "bad keys size" gitAnnexBadDir
key_size :: Key -> Stat
key_size k = simpleStat "size" $ lift $ showSizeKeys $ foldKeys [k]
key_size k = simpleStat "size" $ showSizeKeys $ foldKeys [k]
key_name :: Key -> Stat
key_name k = simpleStat "key" $ pure $ key2file k
@ -340,7 +354,7 @@ bloom_info = simpleStat "bloom filter size" $ do
-- Two bloom filters are used at the same time when running
-- git-annex unused, so double the size of one.
sizer <- lift mkSizer
sizer <- mkSizer
size <- sizer memoryUnits False . (* 2) . fromIntegral . fst <$>
lift bloomBitsHashes
@ -372,10 +386,10 @@ transfer_list = stat desc $ nojson $ lift $ do
]
disk_size :: Stat
disk_size = simpleStat "available local disk space" $ lift $
disk_size = simpleStat "available local disk space" $
calcfree
<$> (annexDiskReserve <$> Annex.getGitConfig)
<*> inRepo (getDiskFree . gitAnnexDir)
<$> (lift $ annexDiskReserve <$> Annex.getGitConfig)
<*> (lift $ inRepo $ getDiskFree . gitAnnexDir)
<*> mkSizer
where
calcfree reserve (Just have) sizer = unwords
@ -409,7 +423,7 @@ numcopies_stats = stat "numcopies stats" $ json fmt $
reposizes_stats :: Stat
reposizes_stats = stat desc $ nojson $ do
sizer <- lift mkSizer
sizer <- mkSizer
l <- map (\(u, kd) -> (u, sizer storageUnits True (sizeKeys kd)))
. sortBy (flip (comparing (sizeKeys . snd)))
. M.toList
@ -466,14 +480,14 @@ cachedNumCopiesStats = numCopiesStats <$> get
cachedRepoData :: StatState (M.Map UUID KeyData)
cachedRepoData = repoData <$> get
getDirStatInfo :: FilePath -> Annex StatInfo
getDirStatInfo dir = do
getDirStatInfo :: InfoOptions -> FilePath -> Annex StatInfo
getDirStatInfo o dir = do
fast <- Annex.getState Annex.fast
matcher <- Limit.getMatcher
(presentdata, referenceddata, numcopiesstats, repodata) <-
Command.Unused.withKeysFilesReferencedIn dir initial
(update matcher fast)
return $ StatInfo (Just presentdata) (Just referenceddata) repodata (Just numcopiesstats)
return $ StatInfo (Just presentdata) (Just referenceddata) repodata (Just numcopiesstats) o
where
initial = (emptyKeyData, emptyKeyData, emptyNumCopiesStats, M.empty)
update matcher fast key file vs@(presentdata, referenceddata, numcopiesstats, repodata) =
@ -530,7 +544,7 @@ updateNumCopiesStats file (NumCopiesStats m) locs = do
let !ret = NumCopiesStats m'
return ret
showSizeKeys :: KeyData -> Annex String
showSizeKeys :: KeyData -> StatState String
showSizeKeys d = do
sizer <- mkSizer
return $ total sizer ++ missingnote
@ -550,7 +564,7 @@ staleSize label dirspec = go =<< lift (dirKeys dirspec)
onsize 0 = nostat
onsize size = stat label $
json (++ aside "clean up with git-annex unused") $ do
sizer <- lift mkSizer
sizer <- mkSizer
return $ sizer storageUnits False size
keysizes keys = do
dir <- lift $ fromRepo dirspec
@ -563,11 +577,8 @@ aside s = " (" ++ s ++ ")"
multiLine :: [String] -> String
multiLine = concatMap (\l -> "\n\t" ++ l)
mkSizer :: Annex ([Unit] -> Bool -> ByteSize -> String)
mkSizer = ifM (getOptionFlag bytesOption)
mkSizer :: StatState ([Unit] -> Bool -> ByteSize -> String)
mkSizer = ifM (bytesOption . infoOptions <$> get)
( return (const $ const show)
, return roughSize
)
bytesOption :: Option
bytesOption = flagOption [] "bytes" "display file sizes in bytes"