diff --git a/Annex/Sim.hs b/Annex/Sim.hs index ea66cea3e0..f184376074 100644 --- a/Annex/Sim.hs +++ b/Annex/Sim.hs @@ -199,6 +199,7 @@ data SimCommand | CommandDisconnect Connections | CommandAddTree RepoName PreferredContentExpression | CommandAdd RawFilePath ByteSize [RepoName] + | CommandAddMulti Int String ByteSize ByteSize [RepoName] | CommandStep Int | CommandAction SimAction | CommandSeed Int @@ -319,6 +320,16 @@ applySimCommand' (CommandAdd file sz repos) st _ = { simFiles = M.insert file k (simFiles st') } in go k st'' rest +applySimCommand' (CommandAddMulti n suffix minsz maxsz repos) st repobyname = + let (sz, st') = simRandom st (randomR (minsz, maxsz)) id + file = toRawFilePath (show n ++ suffix) + in case applySimCommand' (CommandAdd file sz repos) st' repobyname of + Left err -> Left err + Right (Right st'') -> + case pred n of + 0 -> Right (Right st'') + n' -> applySimCommand' (CommandAddMulti n' suffix minsz maxsz repos) st'' repobyname + Right (Left _) -> error "applySimCommand' CommandAddMulti" applySimCommand' (CommandStep _) _ _ = error "applySimCommand' CommandStep" applySimCommand' (CommandAction act) st _ = case getSimActionComponents act st of diff --git a/Annex/Sim/File.hs b/Annex/Sim/File.hs index d987276710..11c66248c4 100644 --- a/Annex/Sim/File.hs +++ b/Annex/Sim/File.hs @@ -49,6 +49,8 @@ generateSimFile = unlines . map unwords . go ["addtree", name, expr] : go rest go (CommandAdd f sz repos : rest) = (["add", fromRawFilePath f, showsize sz] ++ map fromRepoName repos) : go rest + go (CommandAddMulti n suffix minsz maxsz repos : rest) = + (["addmulti", show n, suffix, showsize minsz, showsize maxsz] ++ map fromRepoName repos) : go rest go (CommandStep n : rest) = ["step", show n] : go rest go (CommandAction act : rest) = formatAction act : go rest @@ -127,6 +129,16 @@ parseSimCommand ("add":filename:size:repos) = sz (map RepoName repos) Nothing -> Left $ "Unable to parse file size \"" ++ size ++ "\"" +parseSimCommand ("addmulti":num:suffix:minsize:maxsize:repos) = + case readSize dataUnits minsize of + Just minsz -> case readSize dataUnits maxsize of + Just maxsz -> case readMaybe num of + Just n -> Right $ CommandAddMulti + n suffix minsz maxsz + (map RepoName repos) + Nothing -> Left $ "Unable to parse number \"" ++ num ++ "\"" + Nothing -> Left $ "Unable to parse file size \"" ++ maxsize ++ "\"" + Nothing -> Left $ "Unable to parse file size \"" ++ minsize ++ "\"" parseSimCommand ("step":n:[]) = case readMaybe n of Just n' -> Right $ CommandStep n' diff --git a/doc/git-annex-sim.mdwn b/doc/git-annex-sim.mdwn index b87befdf07..eeb3b1cf07 100644 --- a/doc/git-annex-sim.mdwn +++ b/doc/git-annex-sim.mdwn @@ -137,6 +137,9 @@ as passed to "git annex sim" while a simulation is running. This can be used with the same files more than once, to make multiple repositories in the simulation contain the same files. + Note that adding a large number of files to the simulation can slow it + down and make it use a lot of memory. + * `add filename size repo [repo ...]` Create a simulated annexed file with the specified filename and size, @@ -156,6 +159,23 @@ as passed to "git annex sim" while a simulation is running. different repositories. The files in the simulation are the same across all simulated repositories. +* `addmulti N suffix minsize maxsize repo [repo ...] + + Add multiple simulated annexed files, with random sizes in the range + between minsize and maxsize. + + The files are named by combining the number, which starts at 1 and goes + up to N, with the suffix. + + For example: + + addmulti 100 testfile.jpg 100kb 10mb foo + + That adds files named "1testfile.jpg", 2testfile.jpg", etc. + + Note that adding a large number of files to the simulation can slow it + down and make it use a lot of memory. + * `step N` Run the simulation forward by this many steps. diff --git a/doc/todo/git-annex_proxies.mdwn b/doc/todo/git-annex_proxies.mdwn index 1bcaedabaf..56d15a30bc 100644 --- a/doc/todo/git-annex_proxies.mdwn +++ b/doc/todo/git-annex_proxies.mdwn @@ -34,9 +34,6 @@ Planned schedule of work: * sim: Test ActionDropUnwanted Nothing -* sim: Command to create a set of files with random sizes in a specified - range. - * sim: implement addtree * sim: implement ActionDropUnwanted