# 2010-11-18 Dr. Alistair Ward ## 1.0.0.0 * First version of the package. ## 1.0.0.1 * Created **src/Squeeze/** sub-directory & then modified module-names accordingly. * Pacified **hlint**. * Added a makefile. ## 1.0.0.2 * Tested with ghc-7.0.1 * Added *.spec*-file. ## 1.0.1.0 * Improved the basic algorithm, by permitting the file-list to be bisected; each file-combination resulting from the LHS, is then concatenated with each of those resulting from the recursively bisected RHS. * Used **Control.Parallel.Strategies** to parallelize the concatenation of each combination from the LH-list, with each of those from the RH-list. * Added default values of command-line flags, to usage-message. * Used new **ToolShed.Package**-module. (1.0.1.1) * Replaced `Data.List.subsequences` with a tailored version which terminates combinations when they've grown too large, providing a better and more predictable performance-gain than recursive list-bisection. * Reduced recursive list-bisection to a single bisection, for the sole purpose of facilitating parallelisation. * Added module **Squeeze.QC** to define **Test.QuickCheck** tests and command-line option **--verbose**, to govern level of output. * Partitioned into new modules; **Squeeze.File**, **Squeeze.FileSizeBounds** and **Squeeze.FileCombination**. ## 1.0.1.2 * Fixed typo in CPP-statement in **Squeeze.QC**. * Fixed negated reference to unparenthesised CPP-macro **MIN_VERSION**. * Protected reference in **Main**, to `Test.QuickCheck.verboseCheck`, using CPP-statement. ## 1.0.1.3 * Amended *.spec*-file to define RPM-package, to install under **/usr**, rather than **/usr/local**. * Renamed package from **Squeeze** to **squeeze**, for compatibility with Debian's *.deb*-format. * Added directory-structure required to build *.deb*-package. ## 1.0.1.4 * Corrected command-line processing of the special file **-**, which reads standard-input as requested, but disregarded any other command-line options. * Refined man-page to be an **extra-source-file** in the *.cabal*-file and the *.spec*-file. * Ported to compile against alternative integral definitions of `Squeeze.File.FileSize`. * Added manually controlled **llvm** flag to the *.cabal*-file. * Replaced references to the module **ToolShed.Package** with **Distribution.Package**. * Reacted to the creation of module **ToolShed.Defaultable**. * Uploaded to [Hackage](http://hackage.haskell.org/packages/hackage.html). ## 1.0.2.0 * Reimplemented `Squeeze.File.aggregateSize` using `foldr` rather than `foldl`. * Removed use of `Control.Parallel.Strategies` from **Squeeze.Squeeze**, which ruined performance on one core and had no obvious benefit on two. * Changed the definition of `Squeeze.FileCombinations.FileCombinations` from a `Pair` to a record-style data-type with selective strictness-annotation. * Renamed `Squeeze.FileCombination.concatenate` to `(Squeeze.FileCombination.<+>)` and `Squeeze.FileCombination.prepend` to `(Squeeze.FileCombination.+>)`. * Used new module **ToolShed.TimeAction**, to permit measurement of the CPU-time required to find the best fit. * Added the number, mean file-size and standard-deviation, to the output, when flag **--verbose** is specified; and as a side-effect, created a dependency on the package **factory**. * Replaced module **Squeeze.FileSizeBounds** with **Factory.Data.Interval**, requiring use of **toolshed-0.12.0.0**. * Made the data-type `CommandOptions.CommandOptions` polymorphic in terms of the *ratio*-type fields. * Inserted new layers **Data** and **Test** into the module-hierarchy, and relocated existing modules accordingly. * Added module **Squeeze.Test.Performance** to test with randomly generated virtual files. ## 1.0.2.1 * Added check for zero file-names when reading from stdin. * Corrected the syntax required when specifying ratios, in the man-page. ## 1.0.2.2 * Renamed `Squeeze.Data.File.order` to `Squeeze.Data.File.orderBySize`. * Used **Paths_squeeze.version** in **Main**, rather than hard-coding it. * Added `Squeeze.Data.CommandOptions.getErrors` to permit better error-diagnosis. * Reacted to new module-hierarchy and addition of method `ToolShed.SelfValidate.getErrors`, in toolshed-0.13.0.0. * Replaced use of `Control.Exception.bracket` with `System.IO.withFile`, in `Squeeze.Data.File.findSize`. * Replaced `System` with `System.Environment` and `System.Exit`. * Removed dependency on **haskell98**. ## 1.0.2.3 * Added class `Show` to context for `Squeeze.Test.Performance.run`, for migration to **ghc-7.4.1**. ## 1.0.2.4 * Added details to any failure to parse the command-line arguments. * Defined package's name using program's name & enhanced usage-message, in **Main.hs**. * Re-implemented logging using `Control.Monad.Writer.Writer` & renamed `Squeeze.Squeeze.findBestFitM` to `Squeeze.Squeeze.findBestFitWriter`. * Implemented **verbose** functionality in **Squeeze.Test.Performance**. * Added command-line flag **includeEmpty**, to allow one to include empty files & directories in any solution. ## 1.0.3.0 * Changed **Main** to replace calls to `error` from inside the IO-monad, with `Control.Monad.fail`. * Changed **Main**; by adding a command-line option to define the seed for the random-generator used for performance-testing; to permit **includeEmpty** to take an optional Boolean argument, rather than a mandatory one; to read `Squeeze.Data.CommandOptions.getMinimumUsageRatio` as a `Double`, rather than a `Rational`. * Renamed the accessors in **Squeeze.Data.CommandOptions**, & removed `bisectionRatio` & associated code. * Added **Squeeze.Control.Concurrent.DivideAndConquer**, called from **Main** to utilise multiple CPU-cores where available. * Trapped command-line arguments to which garbage has been appended. * Changed **Data.CommandOptions** to use `Distribution.Verbosity.Verbosity`. ## 1.0.4.0 * Corrected the Copyright-statement in `Main.main.optDescrList.printVersion`. * Renamed **Squeeze.Test.QC** to **Squeeze.Test.QuickChecks**; migrating its tests to a new module **Squeeze.Test.Squeeze**, & added new tests `prop_monotonicFileSize` & `prop_uniqueFileNames`, requiring package **toolshed-0.14.0.0**; added module **Squeeze.Test.Data.FileCombinations**. * Amended the log-messages printed by **Main**. * Removed the command-line option **graphPerformance**, which printed only CPU-seconds rather than elapsed time, & therefore didn't correctly represent the multi-threaded implementation. * Removed the printing of CPU-seconds when not testing performance; this is better left to **/usr/bin/time**. * Compensated for the potential rejection of some virtual files after generation of a test-population. * Used new class `Factory.Math.Probability.Distribution` & bumped required version to **factory-0.2.1.0**. * Replaced the command-line option **--testPerformance**, with **--testPerformanceContinuous** & **--testPerformanceDiscrete**. ## 1.0.4.1 * Removed `ToolShed.SelfValidate.isValid commandOptions` from `Main.runQuickChecks`; since the command-options aren't used. * Added **changelog.Debian** to the *.cabal*-file. * Relocated `Main.distribute` to `Squeeze.Squeeze.distributeAndFindBestFit` & added check on whether maximum size has been exceeded. * Added `Squeeze.Squeeze.partitionEmptyFilesAndDistributeAndFindBestFit`, to efficiently account for empty files, & relocated calculation of file-statistics to this function. * Amended `Test.Performance.run`, replacing call to `Squeeze.Squeeze.findBestFit` with `Squeeze.Squeeze.distributeAndFindBestFit`, to permit multi-threaded performance-tests. * Added function `Squeeze.Data.CommandOptions.mkCommandOptions` & modules **Squeeze.Test.Data.Verbosity** & **Squeeze.Test.Data.CommandOptions** for future QuickChecks. * Extracted `Squeeze.Data.File.expandDirectory` from `Squeeze.Data.File.findSize` to clarify the logic. Symlinks are also now permissible input files. * Added `Squeeze.Data.File.findDuplicates`, & trapped duplicate files implicit within those directories specified. ## 1.0.4.2 * Improved the syntax of **verbosity** in the usage-message. * Tested with **haskell-platform-2013.2.0.0**. * Added a function `Data.CommandOptions.subtractFile` to adjust `Data.CommandOptions.CommandOptions` after removing a file from the problem; previously done incorrectly, causing an error when running with **+RTS -N2**. ## 1.0.4.3 * Changed the value of `0/0` to **0** rather than **1** in `Data.CommandOptions.subtractFile`. ## 1.0.4.4 * Either replaced instances of `(<$>)` with `fmap` to avoid ambiguity between **Control.Applicative** & **Prelude** which (from **base-4.8**) also exports this symbol, or hid the symbol when importing the **Prelude**. * In module **Main**, redirected version-message to stderr. ## 1.0.4.5 * Added the compiler to the output returned for the command-line option **version**. * Specified compiler-option **context-stack** in **Main.hs**, to account for call to `printf`. ## 1.0.4.6 * Minimised the explicit size of compiler's 'context-stack' in module **Main.hs**. * In module **Squeeze.Data.File.hs**, replaced the use of the package **unix** with the package **directory**, for compatibility with Windows. ## 1.0.4.7 * Increased the specified value of compiler-option **context-stack** in module **Main.hs**, to account for call to `printf`. ## 1.0.4.8 * Changed flag **threaded** in the *.cabal*-file to **manual**. * Added **Default-language**-specification to the *.cabal*-file. * Added file **README.markdown**. * Converted this file to markdown-format. * Replaced `System.Exit.exitWith System.Exit.ExitSuccess` with `System.Exit.exitSuccess`. * Moved the entry-point to the test-suite from **Main.hs** to **Test.hs**, both to integrate with **cabal** & to minimise the dependencies of the executable. * Partitioned the source-files into **src-lib**, **src-exe**, & **src-test** directories, & referenced them individually from the *.cabal*-file to avoid repeated compilation. * Used **CPP** to control the import of symbols from **Control.Applicative**. * Changed default **minimumUsageRatio** in module **Squeeze.Data.CommandOptions** from 99% to 90%.