[[!comment format=mdwn
 username="joey"
 subject="""comment 1"""
 date="2015-05-27T15:24:07Z"
 content="""
The Utility.* modules are shared amoung several of my projects (git-annex,
propeller, github-backup, ..), but I'm not really happy enough with them to
make them a proper haskell library. 

For one thing, there's no unifying principle; it's just whatever bits of
code I happened to write that were refactorable out of the main program. I
don't want to end up with another MissingH like tarball library here.

And for another thing, I don't think I want to commit to api stability, or
even api versioning for all of that stuff.

Some parts of it, I'm somewhat happier with, and hope to eventually break
out into proper haskell libraries. For example, Utility.Scheduled is pretty
good (and mostly re-exported from Propellor.Property.Scheduled anyway).

OTOH, Utility.Process .. not happy with that at all from a design POV.
I'd recommend you just use System.Process, or
[Data.Streaming.Process](http://hackage.haskell.org/package/streaming-commons-0.1.12/docs/Data-Streaming-Process.html).
Although there is the problem that `PROPELLOR_DEBUG` relies on
Utility.Process adding calls to debugging functions, so you'd need to do that
by hand.

Maybe what makes sense is for some part of propellor to re-export qualified
subsets of `Utility.*`, on a case-by-case basis as users find need for them.
I counted the Utility imports inside Propellor.Property, they are:

	17 import Utility.SafeCommand
	 8 import Utility.FileMode
	 2 import Utility.Path
	 2 import Utility.Env
	 2 import Utility.DataUnits
	 1 import Utility.ThreadScheduler
	 1 import Utility.Scheduled
	 1 import Utility.FileSystemEncoding
	 1 import Utility.Applicative

So, I'm inclined to have Propellor.Property.Cmd re-export Utility.SafeCommand,
and leave it at that for now. It makes sense that propellor export a primitive
that runs a command to a Bool, does any requested debug output, for use by the
many Properties that involve running commands.

(If you want to break out some part of Utility into a separate library
and maintain it, I'd be ok with that too.)
"""]]
