iQ.      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-#.MShould atomically write a file by writing it to a tmp file then renaming it. * TODO: Does not yet work as advertised. ..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 0 to the channel. 1EContinually read lines from some channels and write them to handles.  When all the channels return 0 then we' re done.  When we',re done, signal this fact on the semaphore. /1/1Global 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.  !"#$ !"# !"#$ %&;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 2. *O(n) Convert a 2 to a &. + O(1) Add a % to the start of a &. , O(1) Add a % to the end of a &. -#O(log(min(n1,n2))) Concatenate two &s. .'O(n) Take the first m lines from a log /&O(n) Take the last m lines from a log %&'()*+,-./ &%'()*+,-./ %&'()*+,-./0101010112Read 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. 3PGet a local time stamp with format YYYYMMDD_HHMMSS. Good for naming files with. 4Get the local midnight we've just had as a 34. 5Get the local midnight that we've just had, as a 56. 6Get the local midnight we're about to have as a 34. 7Get the local midnight we're about to have as a 56. V789:;<=>?@ABCDEFGH34IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk56lmnopqrstuvwxyz{|}~234567234567234567 89:5Right justify a doc, padding with a given character. ;$Right justify a string with spaces. <7Left justify a string, padding with a given character. =#Left justify a string with spaces. >-Blank text. This is different different from 1 because it comes out a a newline when used in a . ?Like @ but don',t display fractional part when the value is < 1000. M Good for units where fractional values might not make sense (like bytes). @=Pretty print an engineering value, to 4 significant figures.  Valid range is 10^(-24) (y/yocto) to 10^(+24) (Y/Yotta). & Out of range values yield Nothing.  examples:   liftM render $ pprEngDouble "J" 102400 ==> Just "1.024MJ"  liftM render $ pprEngDouble "s" 0.0000123 ==> Just "12.30us" E89:;<=>?@ 89:;<=>@? 899:;<=>?@A*Some static size of the benchmark that isn't affected during the run. BC%Some resource used during execution. DEF'Something that takes time to evaluate. GHIJKLMNOPABCDEFGHIJKLMNOPMPONFLKJIHGCEDABABBCEDDEFLKJIHGGHIJKLMPONNOP Q-Statistics extracted from many-valued data. RSTUV'Make statistics from a list of values. WReturn ; if the predicate matches any of the min, avg, max values. X'Lift a function to each component of a RQ Y.Lift a binary function to each component of a RQ QRSTUVWXY QRSTUVWXY QRSTURSTUVWXY ZA single valued piece of data. [Z[Z[Z[[ \+Collate some data, while preserving units. ]^bA wrapper type used to store data of varying physical units in a homogenous collection structure. _`a>Determine the units used by the elements of some collection, ( by inspecting the elements directly.  Returns 0; when applied to empty collections, as they have no units. bc*Represents the units used for some thing. defBytes of data. ghSeconds of time. ijGHelpful wrapper for constructing seconds-valued aspect data. Examples: Time TotalWall `secs`" 10 :: WithUnits (Aspect Single)k Similar to j. l&Apply a function to unit-wrapped data m'Apply a function to unit-wrapped data. n/Transform values of each unit type as a group. o.Transform values of each unit type as a group pCollate some data.  $ collateWithUnits [ Time KernelCpu `secs` 5 $ , Time KernelCpu `secs` 10 $ , Time TotalWall `secs` 55 $ , Size ExeSize `bytes` 100884 $ , Time TotalWall `secs` 52 ]  => L [ WithSeconds (Time KernelCpu [Seconds 5.0, Seconds 10.0]) L , WithSeconds (Time TotalWall [Seconds 55.0, Seconds 52.0]) : , WithBytes (Size ExeSize [Bytes 1024])] \]^_`abcdefghijklmnophifgcedab^`_jklmno\]p\]]^`__`abbceddefgghiijklmnop qGA Quirk is some extended information about a benchmark or test that isn't represented  by an Aspect3. These are singleton pieces of data where it doesn't make sense to - average them or compute other statistics. rstuqrstuqutsrqutsrrstu vComparisons of statistics wxThe comparison of two values. yA new value that doesn't have a baseline. z{.Comparison of a recent value with a baseline. |}~#Make a comparison from two values. /Apply a function to the swing of a comparison. Make a comparison of two RQ. Make a y. Return  if any of the swings in the wv match the given function. vwxyz{|}~x{y|}~zvwvwwx{y|}~zyz{|}~"Holds a detail about a benchmark. The c= is the type constructor of the carrier that holds the data. Useful instances for c include [Z, `[ ]`, RQ, {x and wv. 0Split an aspect into its named detail and data. -Make an aspect from a named detail and data.  If the detail doesn'#t match the units of the data then 0. ,Gather a list of pairs on the first element / gather [(0, 1), (0, 2), (3, 2), (4, 5), (3, 1)]  = [(0, [1, 2] ), (3, [2, 1] ), (4, [5])] ,Compute statistics for many-valued aspects. >Compare lists of aspects. The first argument is the baseline. ELookup the baseline result for some aspect and produce a comparison. *Apply a function to the data in an aspect 2Apply a function to the data in a wrapped aspect. ETransform the data in an aspect, possibly changing the carrier type. =Apply a function to the aspect data, producing a new aspect.  If the aspect details don' t match then .   The errors we recognise. 6A build command needs the following file to continue. 0 This can be used for writing make-like bots. Some property check< was supposed to return the given boolean value, but it didn't. $Some miscellanous IO action failed. NSome system command fell over, and it barfed out the given stdout and stderr. Some generic error  !KThe builder monad encapsulates and IO action that can fail with an error, 1 and also read some global configuration info. LRun a build command. The first argument is a directory that can be used for  temporary files (like "/tmp") Like J, but Run a build command, reporting whether it succeeded to the console. > If it succeeded then return Just the result, else Nothing. Like runBuildPrintWithConfig but also takes a  BuildConfig. -Discard the resulting value of a compuation.  Used like successfully . runBuild ... '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. #Throw an error in the build monad. 4Throw a needs error saying we needs the given file. ] A catcher could then usefully create the file, or defer the compuation until it has been  created. (Lift an IO action into the build monad. G If the action throws any exceptions they get caught and turned into   exceptions in our  monad. Like , but with teh monadz. Print some text to stdout. 1Print some text to stdout followed by a newline. Print a blank line to stdout Print a ----- line to stdout Print a ===== line to stdout 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. *Check some property while printing what we' re doing. +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. *Log a system command to the handle in our  BuildConfig , if any. & !"#$  !"#$%Sleep for a given number of seconds. *Sleep for a given number of milliseconds. /Run a system command, returning its exit code. !Run a successful system command.  If the exit code is  then throw an error in the  monad. 7Quietly run a system command, returning its exit code. )Quietly run a successful system command.  If the exit code is  then throw an error in the  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   then throw an error in the  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   then throw an error in the  monad. Like  , but in the  monad. Like  , but in the  monad. Like  , but in the ( monad and throw an error if it returns . Like , but with strings. $Run a system command, returning its  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.   /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 , 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. #Allocate a new temporary file name Use wget% to check if a web-page is gettable. * The page is deleted after downloading. !The given host is reachable with ping. )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. +An external mailer that can send messages. . Also contains mail server info if needed. 9Send mail via MSMTP, which is a stand-alone SMTP sender. / This might be be easier to set up if you don't have a real MTA installed.  Get it from http:msmtp.sourceforge.net/ 7Send the mail by writing to the stdin of this command.  On many systems the command sendmail# will be aliased to an appropriate F wrapper for whatever Mail Transfer Agent (MTA) you have installed. #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.  IList all patches in the given repository. If no repository is given, the & current working directory is used. 0Retrieve the last N changes from the repository FRetrieve all patches submitted to the repository after the given time  ?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 ! monad then the whole loop does.   KABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopvwxyz{|}~ .Holds the result of running a benchmark once. What iteration this run was.  Use 1 for the first ''real'') iteration derived by running a program.  Use 0 for ''fake''3 iterations computed by statistics or comparisons. $Information about the run that doesn't carry units, * eg whether it timed out or segfaulted. FAspects of the benchmark run that carry units and can have statistics  extracted from them. 3We include the name of the original benchmark to it's easy to lookup the results.  If the < is carrying data derived directly by running a benchmark, # there will be an element of the ( for each iteration. On the other hand,  If the 8 is carrying statistics or comparison data there should W be a single element with an index of 0. This is suggested usage, and adhered to by 3 the functions in this module, but not required. %Concatenate the results of all runs.  The the resulting  has a single - with an index of 0, containing all aspects. %Collate the aspects of each run. See p! for an explanation and example.  3Compute statistics from collated aspects of a run.  7Collate the aspects, then compute statistics of a run.  *Compute comparisons of benchmark results. ! Both results must have the same  else .  \Compute comparisons of benchmark result, looking up the baseline results from a given list. ? If there are no matching baseline results then this creates a y in the output.  3Compare some baseline results against new results. ? If there are no matching baseline results then this creates a y in the output. MReturn true if any of the aspect data in a result matches a given predicate. \Return true if any of the aspects have swung by more than a given fraction since last time.  For example, use 0.1 for 10 percent. Merge lists of *s, preferring results from earlier lists. R In the output list there is one result for every named benchmark in the input. JGiven a fraction (like 0.1 for 10 percent), split some results into three  groups:  ''winners'',  ''losers'' and  ''others''. P The losers are benchmarks had any aspect increase by more than the fraction. J Winners are non-losers, where any aspect decreased by the fraction. ) Others are not winners or losers. BCreate a new baseline from original baseline, and recent results. Q If any of the recent results are winners then use them, otherwise use results  from the old baseline. &Comparisons to guide the advancement. Baseline results. Recent results. New baseline. %Apply a function to the aspects of a  Lift a function to the  in a  Lift a binary function to the  BenchResults in a  'Lift a function to the aspects of each . .Lift a binary function to the aspects of each . %Apply a function to the aspects of a  $Lift a function to the aspects of a  -Lift a binary function to the aspects of two s.  The resulting  gets all the quirks from both.                6Produce a human readable report of benchmark results. IIf you only want the results within a fractional swing from the baseline  then pass something like  (Just 0.1) as the first parameter for a 10% swing, & otherwise all results are printed. "'Describes a benchmark that we can run. !A unique name for the benchmark. 0Setup command to run before the main benchmark.  The benchmark command to run. _ The time taken to run this part is automatically measured and added to the overall results. !Check /2 cleanup command to run after the main benchmark.  ! ! !"+Run a command, returning its elapsed time. #Run a benchmark once. &Iteration number to tag results with. Benchmark to run. $CRun a benchmark once, logging activity and timings to the console. %Iteration number to tag results with Benchmark to run. %ARun a benchmark serveral times, logging activity to the console. C Also lookup prior results and print comparisons during the run. 7Number of times to run each benchmark to get averages. List of prior results. The benchmark to run. '      !"#$%  !"#$%"#$%&$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. ,!Take test results from the first '&, except for the named M one which we take from the second. If the named test is not in the second % then take it from the first. If it's not anywhere then Nothing. -!Advance benchmark results as per . ; The resultTime and environment is taken from the second '&. &'()*+,-&'()*+,-&'()*'()*+,-#789:;<=>?@ABCDEFGH34IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk56lmnopqrstuvwxyz{|}~  !"#$23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-$$%%&'()*+,-./0123456789:;<=>?@@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrrstuvwxy z z { | } ~                    d      !!!!!!!!!!!!!!       !"#$%&'()*+,-./"0"0"1"2"3"4567899:;<=>?@ABCDEBFGHIJHIJHKLHKLHMNHMOHMPHQRHQSHQTHQUHQVHIWHIXHIYHIZHI[HI\HI]HI^HI_HI`HIaHIbHIcHIcHdeHdfHdgHdhHdiHdjHdkHdlHdmHdnHdoHdpHdqHdqHrsHrtHruHrvHrwHrxHryHrzHr{Hr|Hr}Hr}H~HHHKHKHKHHHHHHHHHHHHHHHHHHHHHHH  B!BBFBBBBBBbuildbox-1.5.0.1BuildBox.Cron.ScheduleBuildBox.BuildBuildBox.Data.LogBuildBox.Data.Dividable BuildBox.TimeBuildBox.PrettyBuildBox.Aspect.DetailBuildBox.Aspect.StatsBuildBox.Aspect.SingleBuildBox.Aspect.UnitsBuildBox.QuirkBuildBox.Aspect.ComparisonBuildBox.AspectBuildBox.Build.TestableBuildBox.IO.DirectoryBuildBox.Command.SleepBuildBox.Command.SystemBuildBox.Command.FileBuildBox.Command.NetworkBuildBox.Command.EnvironmentBuildBox.Command.MailBuildBox.Command.Darcs BuildBox.CronBuildBox.Benchmark.BenchResultBuildBox.Reports.BenchResultBuildBox.Benchmark BuildBox.FileFormat.BuildResultsBuildBox.IO.File!BuildBox.Command.System.InternalsBuildBox.Build.BuildStateBuildBox.Aspect.AspectBuildBox.Build.BuildErrorBuildBox.Build.BaseBuildBox.Benchmark.BenchmarkBuildBoxScheduleEvent eventName eventWheneventWhenModifiereventLastStartedeventLastEnded EventName WhenModifier WaitUntil ImmediateWhenDailyAfterEveryNeverAlwayssecondminutehourdayearliestEventToStartAteventCouldStartAteventsOfSchedule makeSchedulelookupEventOfSchedulelookupCommandOfScheduleadjustEventOfSchedule BuildStatebuildStateLogSystem buildStateId buildStateSeqbuildStateScratchDirbuildStateDefaultLineLogemptynulltoString fromString<||>>< firstLines lastLines DividabledividereadLocalTimeOfDayAsUTC getStampyTimegetMidnightTodayLocalgetMidnightTodayUTCgetMidnightTomorrowLocalgetMidnightTomorrowUTCPrettypprpadRcpadRpadLcpadLblank pprEngInteger pprEngDoubleSizedExeSizeUsed HeapAllocHeapMaxTimed KernelSys KernelCpu KernelWallTotalSysTotalCpu TotalWallDetail DetailSized DetailUsed DetailTimedStatsstatsMinstatsAvgstatsMax makeStats predStats liftStats liftStats2Single Collatablecollate WithUnits WithBytes WithSecondsHasUnitshasUnitsIsUnitsIsBytes IsSecondsBytesSecondssecsbytes appWithUnits liftWithUnitsliftsWithUnitsliftsWithUnits2collateWithUnitsQuirk QuirkTimeout QuirkExitCode QuirkFailedQuirkSucceededStatsComparison Comparison ComparisonNew comparisonNewcomparisonBaselinecomparisonRecentcomparisonSwingmakeComparisonappSwingmakeStatsComparisonmakeStatsComparisonNewpredSwingStatsComparisonAspectSizeTime splitAspect makeAspectmakeAspectStatsmakeAspectComparisonsmakeAspectComparison appAspectappAspectWithUnits liftAspect liftAspect2 BuildError ErrorNeedsErrorCheckFailed ErrorIOErrorErrorSystemCmdFailed buildErrorCmdbuildErrorCodebuildErrorStdoutbuildErrorStderr ErrorOtherBuildrunBuild runBuildPrintrunBuildPrintWithState successfullythrowneedsiowhenMoutoutLnoutBlankoutLineoutLINETestabletestcheck checkFalse outCheckOkoutCheckFalseOk lsFilesInlsDirsIntraceFilesFrom logSystemsleepmsleepsystemssystemqsystemqssystem ssystemOut qssystemOut systemTee systemTeeLog ssystemTee systemTeeIOsystemTeeLogIOPropFile FileEmptyHasDirHasFile HasExecutableinDir inScratchDir clobberDir ensureDir withTempFile PropNetwork UrlGettable HostReachablePlatformplatformHostNameplatformHostArchplatformHostProcessorplatformHostOSplatformHostRelease EnvironmentenvironmentPlatformenvironmentVersionsgetEnvironmentWithgetHostPlatform getHostName getHostArchgetHostProcessor getHostOSgetHostRelease getVersionGHC getVersionGCCMailer MailerMSMTP mailerPortMailerSendmail mailerPathmailerExtraFlagsMailmailFrommailTo mailSubjectmailTime mailTimeZone mailMessageIdmailBodycreateMailWithCurrentTime renderMailsendMailWithMailer DarcsPatchdarcsTimestamp darcsAuthor darcsComment EmailAddress DarcsPathchangeschangesN changesAftercronLoopBenchRunResultbenchRunResultIndexbenchRunResultQuirksbenchRunResultAspects BenchResultbenchResultNamebenchResultRunsconcatBenchResultcollateBenchResultstatCollatedBenchResultstatBenchResultcompareBenchResultscompareBenchResultWithcompareManyBenchResultspredBenchResultswungBenchResultmergeBenchResultssplitBenchResultsadvanceBenchResultsappBenchRunResultliftBenchRunResultliftBenchRunResult2liftToAspectsOfBenchResultliftToAspectsOfBenchResult2appRunResultAspectsliftRunResultAspectsliftRunResultAspects2reportBenchResults Benchmark benchmarkNamebenchmarkSetupbenchmarkCommandbenchmarkCheckrunTimedCommandrunBenchmarkOnceoutRunBenchmarkOnceoutRunBenchmarkWith BuildResultsbuildResultTimebuildResultEnvironmentbuildResultBench mergeResults acceptResultadvanceResultsatomicWriteFilestreamInbase Data.MaybeNothing streamOutsGHC.BaseString time-1.2.0.3Data.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 UniversalTimeDiffTimepretty-1.0.1.2Text.PrettyPrint.HughesPJvcat fullRenderrender renderStylefcatfsepcatsep<+><>$+$$$nest zeroWidthTextptexttextcharisEmpty punctuatehanghsephcatbracesbracketsparens doubleQuotesquotesrationaldoublefloatintegerintrbracelbracerbracklbrackrparenlparenequalsspacecommacolonsemistyleribbonsPerLine lineLengthmodeStylePageMode ZigZagModeLeftMode OneLineModeModeDocChrStrPStr TextDetailsghc-primGHC.BoolTrueUnitsisUnitsgather lookupAspectGHC.Errerror getUniqueId Control.Monadwhen. dropDotPathsdebugtraceGHC.IO.Exception ExitFailureExitCode slurpChan System.Exit exitSuccess exitFailureexitWith ExitSuccessdirectory-1.1.0.0System.DirectoryremoveDirectoryRecursive newTempFileURLHostNamedarcs splitPatches