!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc d e f g h i j k l m n o p q r s t u v w x y z { | } ~  +Get the names of all files in a directory. ( This filters out the fake files like  and '..' +Get the names of all the dirs in this one. ( This filters out the fake files like  and '..' 0Get all the files reachable from this directory Drop out the fake  and '..' dirst from a list of paths. Read a time of day string like 17:34:05 in the local time zone [ and convert that to a UTC time of day. Good for parsing command line args to buildbots. PGet a local time stamp with format YYYYMMDD_HHMMSS. Good for naming files with. Get the local midnight we've just had as a . Get the local midnight that we've just had, as a . Get the local midnight we're about to have as a . Get the local midnight we're about to have as a . V         9Map of event names to their details and build commands. :Records when an event should start, and when it last ran. A unique name for this event. - Used when writing the schedule to a file. When to run the command. Modifier to the previous. )When the event was last started, if any. &When the event last finished, if any. Modifier to when. 2Wait until after this time before doing it first. If the event hasn'-t been invoked before then do it immediately # when we start the cron process. When to invoke some event. !Do it each day at this time. The ''days'' are UTC days, not local ones. (Do it some time after it last finished. *Do it some time after we last started it. Don't do it, ever. Just keep doing it.  !XGiven the current time and a list of events, determine which one should be started now. S If several events are avaliable then take the one with the earliest start time. "BGiven the current time, decide whether an event could be started.  If the  is  this always returns true.  The  SkipFirst5 modifier is ignored, as this is handled separately. #CGet the list of events in a schedule, ignoring the build commands. $"A nice way to produce a schedule. %BGiven an event name, lookup the associated event from a schedule. &JGiven an event name, lookup the associated build command from a schedule. 'LGiven a new version of an event, update any matching event in the schedule. E If the event not already there then return the original schedule.   !"#$%&'  !" $%&'#     !"#$%&' EContinually read lines from a handle and write them to this channel. ' When the handle hits EOF then write ! to the channel. "EContinually read lines from some channels and write them to handles.  When all the channels return ! then we' re done.  When we',re done, signal this fact on the semaphore.  " "(Global builder configuration. )*6Log all system commands executed to this file handle. +%Uniqueish id for this build process.  On POSIX we'd use the PID, but that doesn't work on Windows. L The id is initialised by the Haskell random number generator on startup. ,1Sequence number for generating fresh file names. -)Scratch directory for making temp files. .The default build config. ()*+,-.()*+,-)*+,-. /0#1)Print a number of picoseconds as a time. 2+Print a float number of seconds as a time. 3VPretty print a signed float, with a percentage change relative to a reference figure.  Comes out like  0.235( +5) for a +5 percent swing. 4APrint a float number of seconds, rounding it and, prefixing with + or - appropriately. 55Right justify a doc, padding with a given character. 6$Right justify a string with spaces. 77Left justify a string, padding with a given character. 8#Left justify a string with spaces. 9-Blank text. This is different different from $1 because it comes out a a newline when used in a %. G&'()*+,-./0123456$78%9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_/0123456789 /0124356789 /00123456789 :;;A sequence of lines, without newline charaters on the end. <O(1) No logs here. = O(1) Check if the log is empty. >O(n) Convert a ; to a `. ?O(n) Convert a ` to a ;. @ O(1) Add a : to the start of a ;. A O(1) Add a : to the end of a ;. B#O(log(min(n1,n2))) Concatenate two ;s. C'O(n) Take the first m lines from a log D&O(n) Take the last m lines from a log :;<=>?@ABCD ;:<=>?@ABCD :;<=>?@ABCD EThe errors we recognise. F6A build command needs the following file to continue. 0 This can be used for writing make-like bots. GSome property check< was supposed to return the given boolean value, but it didn't. H$Some miscellanous IO action failed. INSome system command fell over, and it barfed out the given stdout and stderr. JKLMNSome generic error EFGHIJKLMN E NIHGFJKLMFGHIJKLMNOKThe builder monad encapsulates and IO action that can fail with an error, 1 and also read some global configuration info. PRun a build command. QDRun a build command, reporting whether it succeeded to the console. > If it succeeded then return Just the result, else Nothing. RLike runBuildPrintWithConfig but also takes a  BuildConfig. a'Get a unique(ish) id for this process. b The random seeds the global generator with the cpu time in psecs, which should be good enough. S#Throw an error in the build monad. T4Throw a needs error saying we needs the given file. U(Lift an IO action into the build monad. G If the action throws any exceptions they get caught and turned into  H exceptions in our O monad. VLike b, but with teh monadz. WPrint some text to stdout. X1Print some text to stdout followed by a newline. YPrint a blank line to stdout ZPrint a ----- line to stdout [Print a ===== line to stdout OPQRaSTUVWXYZ[OPQRaSTUVWXYZ[\Some testable property. ]^#Testable properties are checkable. 3 If the check returns false then throw an error. _#Testable properties are checkable. 2 If the check returns true then throw an error. `*Check some property while printing what we' re doing. a*Check some property while printing what we' re doing. \]^_`a\]^_`a\]]^_`ab*Log a system command to the handle in our  BuildConfig , if any. %()*+,-.EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abENIHGFJKLM()*+,-.OPQRSTUVWXYZ[bbc1The result of running a benchmark several times. 6 We include the name of the original benchmark to it's easy to lookup the results. defg(The result of running a benchmark once. hi<The wall-clock time taken to run the benchmark (in seconds) jETime that the benchmark itself reported was taken to run its kernel. k5Holds elapsed, cpu, and system timings (in seconds). lmnop'Describes a benchmark that we can run. qr!A unique name for the benchmark. s0Setup command to run before the main benchmark. tPThe benchmark command to run. Only the time taken to run this part is measured. uCheck /2 cleanup command to run after the main benchmark. cdefghijklmnopqrstucdefdefghijhijklmnolmnopqrstuqrstu v2Aspects of a benchmark runtime we can talk about. wxyz{/Get a particular aspect of a benchmark result. |1Get the average runtime from a benchmark result. }1Get the minimum runtime from a benchmark result. ~1Get the maximum runtime from a benchmark result. ?Get the min, avg, and max runtimes from this benchmark result. c%Get the pretty name of a TimeAspect. vwxyz{|}~ vzyxw{|}~ vzyxwwxyz{|}~ 6Header to use when pretty printing benchmark results. .Pretty print an aspect of a benchmark result. 9 If the given aspect does not exist in the result then !. Aspect of the result to print. &Optional prior result for comparison. The result to print.  MPretty print a comparison of all the aspects of these two benchmark results.  The first result is the ` baseline', while the second is the `current' one. a The numbers from the current results are printed, with a percentage relative to the baseline. MPretty print a comparison of all the aspects of these two benchmark results.  The first result is the ` baseline' while the second is the `current' one. [ All the numbers from the current results are printed, with a percentage relative to the [ baseline if there is one. If there is no baseline for a particular result then we still  print the current one.  +Run a command, returning its elapsed time. Run a benchmark once. CRun a benchmark once, logging activity and timings to the console. @Run a benchmark several times, logging activity to the console. 7 Optionally print a comparison with a prior results. Number of iterations. )Optional previous result for comparison. Benchmark to run. ARun a benchmark serveral times, logging activity to the console. A Also lookup prior results for comparison from the given list. G If there is no matching entry then run the benchmark anyway, but don't print the comparison. 7Number of times to run each benchmark to get averages. List of prior results. The benchmark to run. &cdefghijklmnopqrstuvwxyz{|}~pqrstuklmnoghijcdef %Sleep for a given number of seconds. *Sleep for a given number of milliseconds. ?Given a schedule of commands, run them when their time is due. Y Only one command is run at a time. If several commands could be started at a specific ^ moment, then we take the one with the earliest potential start time. If any command throws  an error in the O! monad then the whole loop does.   !"#$%&'de/Run a system command, returning its exit code. !Run a successful system command.  If the exit code is f then throw an error in the O monad. 7Quietly run a system command, returning its exit code. )Quietly run a successful system command.  If the exit code is f then throw an error in the O monad. @Run a successful system command, returning what it wrote to its stdout.  If anything was written to stderr then treat that as failure. ! If it fails due to writing to stderr or returning f  then throw an error in the O monad. HQuietly run a successful system command, returning what it wrote to its stdout.  If anything was written to stderr then treat that as failure. ! If it fails due to writing to stderr or returning f  then throw an error in the O monad. Like  , but in the O monad. Like  , but in the O monad. Like  , but in the O( monad and throw an error if it returns f. Like , but with strings. $Run a system command, returning its g and what was written to stdout and stderr. Whether stdout and stderr, should be forwarded to the parent process. Command to run. What to pass to the command's stdin. hijklfg  /Properties of the file system we can test for. Some file is empty. Some directory exists. Some file exists. (Some executable is in the current path. VRun a command in a different working directory. Throws an error if the directory doesn' t exist. ECreate a new directory with the given name, run a command within it, X then change out and recursively delete the directory. Throws an error if a directory ' with the given name already exists. Delete a dir recursively if it's there, otherwise do nothing.  Unlike m, this function does . not follow symlinks, it just deletes them.  Create a new directory if it isn'2t already there, or return successfully if it is. ^Create a temp file, pass it to some command, then delete the file after the command finishes. n#Allocate a new temporary file name )Generic information about the platform we're running on.  The environment consists of the , and some tool versions. @Get the current environment, including versions of these tools. 7List of tool names and commands to get their versions. )Get information about the host platform. !Get the name of this host, using uname. !Get the host architecture, using uname. #Get the host processor name, using uname. %Get the host operating system, using uname. -Get the host operating system release, using uname. 8Get the version of this GHC, or throw an error if it can' t be found. 8Get the version of this GCC, or throw an error if it can' t be found. $A simple build results file format. Merge some BuildResults. 5 If we have data for a named benchmark in multiple , + then we take the first one in the list. 9 The resultTime and environment is taken from the last ,  in the list. +An external mailer that can send messages. . Also contains mail server info if needed. & We only support msmtp at the moment. #An email message that we can send. 7Create a mail with a given from, to, subject and body. > Fill in the date and message id based on the current time. > Valid dates and message ids are needed to prevent the mail  being bounced by spambots. ''from''$ field. Should be an email address. ''to''$ field. Should be an email address. Subject line. Message body. %Render an email message as a string. Send a mail message. oUse wget% to check if a web-page is gettable. * The page is deleted after downloading. !The given host is reachable with ping. pqKijklfg&'()*+,-./0123456$78%9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_       !"#$%&'()*+,-./0123456789EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~r !"#$%%&&'()*+,-./0123456789:;<=>?@AABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{{|}~~                        ! " # $ % & ' ( )*+,-,.,/,0,12345464748494:;<=>?@AT@AB@AC@AD@AE@AF@AG@AH@AI@AJ@AK@AL@AM@AN@AO@AP@AQ@AR@AS@AT@AU@AV@AW@AX@AY@AZ@A[@A\@A]@A^@A_@A`@Aa@Ab@Ac@Ad@Ae@Af@Ag@Ah@Ai@Aj@Ak@Al@Am@An@Ao@Ap@Aq@Aq@Ar@As@At@Au@Av@Aw@Ax@Ay@Az@A{|}~ buildbox-1.2.0.0BuildBox.IO.FileBuildBox.IO.Directory BuildBox.TimeBuildBox.Cron.ScheduleBuildBox.BuildBuildBox.PrettyBuildBox.Data.LogBuildBox.Build.TestableBuildBox.BenchmarkBuildBox.Benchmark.TimeAspectBuildBox.Benchmark.PrettyBuildBox.Benchmark.CompareBuildBox.Command.Sleep BuildBox.CronBuildBox.Command.SystemBuildBox.Command.FileBuildBox.Command.Environment BuildBox.FileFormat.BuildResultsBuildBox.Command.MailBuildBox.Command.Network!BuildBox.Command.System.InternalsBuildBox.Build.BuildStateBuildBox.Build.BuildErrorBuildBox.Build.BaseBuildBox.Benchmark.BaseBuildBoxatomicWriteFile lsFilesInlsDirsIntraceFilesFromreadLocalTimeOfDayAsUTC getStampyTimegetMidnightTodayLocalgetMidnightTodayUTCgetMidnightTomorrowLocalgetMidnightTomorrowUTCScheduleEvent eventName eventWheneventWhenModifiereventLastStartedeventLastEnded EventName WhenModifier WaitUntil ImmediateWhenDailyAfterEveryNeverAlwayssecondminutehourdayearliestEventToStartAteventCouldStartAteventsOfSchedule makeSchedulelookupEventOfSchedulelookupCommandOfScheduleadjustEventOfSchedule BuildStatebuildStateLogSystem buildStateId buildStateSeqbuildStateScratchDirbuildStateDefaultPrettyppr pprPSecTime pprFloatTime pprFloatRef pprFloatSRpadRcpadRpadLcpadLblankLineLogemptynulltoString fromString<||>>< firstLines lastLines BuildError ErrorNeedsErrorCheckFailed ErrorIOErrorErrorSystemCmdFailed buildErrorCmdbuildErrorCodebuildErrorStdoutbuildErrorStderr ErrorOtherBuildrunBuild runBuildPrintrunBuildPrintWithStatethrowneedsiowhenMoutoutLnoutBlankoutLineoutLINETestabletestcheck checkFalse outCheckOkoutCheckFalseOk logSystem BenchResultbenchResultNamebenchResultRunsBenchRunResultbenchRunResultElapsedbenchRunResultKernelTiming timingElapsed timingCpu timingSys Benchmark benchmarkNamebenchmarkSetupbenchmarkCommandbenchmarkCheck TimeAspectTimeAspectKernelSysTimeAspectKernelCpuTimeAspectKernelElapsedTimeAspectElapsedtakeTimeAspectOfBenchRunResulttakeAvgTimeOfBenchResulttakeMinTimeOfBenchResulttakeMaxTimeOfBenchResulttakeMinAvgMaxOfBenchResultpprBenchResultAspectHeaderpprBenchResultAspect pprComparisonpprComparisonsrunTimedCommandrunBenchmarkOnceoutRunBenchmarkOnceoutRunBenchmarkAgainstoutRunBenchmarkWithsleepmsleepcronLoopsystemssystemqsystemqssystem ssystemOut qssystemOut systemTee systemTeeLog ssystemTee systemTeeIOsystemTeeLogIOPropFile FileEmptyHasDirHasFile HasExecutableinDir inScratchDir clobberDir ensureDir withTempFilePlatformplatformHostNameplatformHostArchplatformHostProcessorplatformHostOSplatformHostRelease EnvironmentenvironmentPlatformenvironmentVersionsgetEnvironmentWithgetHostPlatform getHostName getHostArchgetHostProcessor getHostOSgetHostRelease getVersionGHC getVersionGCC BuildResultsbuildResultTimebuildResultEnvironmentbuildResultBench mergeResultsMailer MailerMSMTP mailerPath mailerPortMailmailFrommailTo mailSubjectmailTime mailTimeZone mailMessageIdmailBodycreateMailWithCurrentTime renderMailsendMailWithMailer PropNetwork UrlGettable HostReachablebaseGHC.Base. dropDotPaths time-1.1.4Data.Time.LocalTime.LocalTime LocalTimeData.Time.Clock.UTCUTCTimeData.Time.Format formatTimeformatCharacter FormatTimeData.Time.Format.Parse readsTimereadTime parseTime buildTime ParseTimeutcToLocalZonedTime getZonedTimezonedTimeToUTCutcToZonedTimelocalTimeToUT1ut1ToLocalTimelocalTimeToUTCutcToLocalTimelocalTimeOfDaylocalDay zonedTimeZonezonedTimeToLocalTime ZonedTimeData.Time.LocalTime.TimeOfDaytimeOfDayToDayFractiondayFractionToTimeOfDaytimeOfDayToTimetimeToTimeOfDaylocalToUTCTimeOfDayutcToLocalTimeOfDaymakeTimeOfDayValidmiddaymidnighttodSectodMintodHour TimeOfDayData.Time.LocalTime.TimeZonegetCurrentTimeZone getTimeZoneutctimeZoneOffsetStringtimeZoneOffsetString'hoursToTimeZoneminutesToTimeZone timeZoneNametimeZoneSummerOnlytimeZoneMinutesTimeZoneData.Time.ClockgetCurrentTimeData.Time.Clock.UTCDiff diffUTCTime addUTCTime utctDayTimeutctDayNominalDiffTimeData.Time.Calendar.GregorianaddGregorianYearsRollOveraddGregorianYearsClipaddGregorianMonthsRollOveraddGregorianMonthsClipgregorianMonthLength showGregorianfromGregorianValid fromGregorian toGregorianData.Time.Calendar.OrdinalDate isLeapYearData.Time.Calendar.DaysdiffDaysaddDaystoModifiedJulianDayModifiedJulianDayDayData.Time.Calendar.PrivateNumericPadOptionData.Time.Clock.ScalepicosecondsToDiffTimesecondsToDiffTimegetModJulianDate ModJulianDate UniversalTimeDiffTimestreamIn Data.MaybeNothing streamOutsten12ipretty-1.0.1.1Text.PrettyPrint.HughesPJvcat fullRenderrender renderStylefcatfsepcatsep<+><>$+$$$nest zeroWidthTextptexttextcharisEmpty punctuatehanghsephcatbracesbracketsparens doubleQuotesquotesrationaldoublefloatintegerintrbracelbracerbracklbrackrparenlparenequalsspacecommacolonsemistyleribbonsPerLine lineLengthmodeStylePageMode ZigZagModeLeftMode OneLineModeModeDocChrStrPStr TextDetailsString getUniqueId Control.Monadwhen$fPrettyTimeAspectdebugtraceGHC.IO.Exception ExitFailureExitCode slurpChan System.Exit exitSuccess exitFailureexitWith ExitSuccessdirectory-1.0.1.1System.DirectoryremoveDirectoryRecursive newTempFilesendMailWithMSMTPURLHostName