I built a preliminary prototype of "cabal update" enhancements:

A) Using a Lazy I/O bytestring with the HTTP download, so that it can do a streaming-decompress on-the-fly (This gives a 30% speedup on my machine)

B) Using the bytestring-progress library to show a useful progress report on the whole process. Unfortunately, due to the PVP, the version constraints are (as usual) over-restrictive, so they need to be relaxed. Until the fix is put on hackage, you have to install bytestring-progress from https://github.com/Peaker/bytestring-progress

C) It's quick&dirty (Proof of concept), because:
C.1) No version constraints on bytestring-progress
C.2) Using hSetBuffering on stdout and ANSI terminal codes, which may be problematic in different kinds of terminals
C.3) The only way to disable it is setting verbosity=quiet. It probably deserves its own option

I hope it's a useful demonstration of the utility of this, though. It makes "cabal update" something I'd dread a little less to run :)

Also, I was wondering why there's no monad for the passing of Verbosity around to so many functions. Then I could easily add more options that go around to control things like whether to show progress bars...

Eyal