Command line tool to delete cabal library packages
Haskell
Switch branches/tags
Latest commit 5e67450 Mar 21, 2015 @iquiw Initial support for package key
This enables to delete library dirs that are named in package key,
which is used by GHC-7.10 and Cabal-1.22.

README.rst

cabal-delete README

1   Summary

cabal-delete deletes installed directories of the specified package and unregisters it if it has no reverse dependency and it is not installed with ghc. It cannot delete executable packages.

cabal-delete also has some utility commands to show package info, list packages multiple version installed, and list packages with no reverse dependency.

If parent directory of libraryDirs or importDirs contain no other files than to be deleted, then delete the parent directory and haddockHTMLs directories. Otherwise, delete the libraryDirs or importDirs and ignore haddockHTMLs directories.

2   Usage

2.1   Delete packages

To delete package, type "cabal-delete package". You may need sudo to delete directories root owns.

If the package has no reverse dependency, message like the following is displayed:

$ cabal-delete ghc-paths
The following directories will be processed.
    D: Delete, N: NotFound, I: Ignore, A: Abort
[D] /usr/local/ghc/pkg/lib/ghc-paths-0.1.0.8/ghc-7.0.4
[D] /usr/local/ghc/pkg/share/doc/ghc-paths-0.1.0.8
Do you want to delete ghc-paths-0.1.0.8 ? [Y]es, [N]o, [A]ll:

where the mark means;

  • [D] means it will be deleted if 'Y' or just enter key is pressed.
  • [N] means it is found in package.conf (package.cache), but not exist.
  • [I] means it does not contain package name. So it may be common directory, will be ignored.
  • [A] means it is installed under the directory ghc installed. So delete process will be aborted.

If it has reverse dependencies, message like the following is displayed:

$ cabal-delete parsec-2.1.0.1
The follwoing packages depend on parsec-2.1.0.1
vty-4.3.0.0
regex-tdfa-1.1.2
salvia-protocol-1.0.1

If -R option is specified, dependent packages will be delete recursively.

If -n option is specified, cabal-delete will not perform actual operation (dry-run mode).

2.2   Show package information

To show package's information, type "cabal-delete -i package".

This shows name, description, dependencies and reverse dependencies as follows:

$ cabal-delete -i failure
Name:            failure-0.1.1
Description:     A simple type class for success/failure computations.
Depends:         base-4.5.1.0 transformers-0.2.2.0
LibraryDirs:     /usr/local/ghc/pkg/lib/failure-0.1.1/ghc-7.4.2
ImportDirs:      /usr/local/ghc/pkg/lib/failure-0.1.1/ghc-7.4.2
HaddockDirs:     /usr/local/ghc/pkg/share/doc/failure-0.1.1/html

Name:            failure-0.2.0.1
Description:     A simple type class for success/failure computations.
Depends:         base-4.5.1.0 transformers-0.3.0.0
ReverseDepends:  hamlet-1.1.1 http-conduit-1.6.1.2 xml-conduit-1.0.3.1
                 yesod-core-1.1.3
LibraryDirs:     /usr/local/ghc/pkg/lib/failure-0.2.0.1/ghc-7.4.2
ImportDirs:      /usr/local/ghc/pkg/lib/failure-0.2.0.1/ghc-7.4.2
HaddockDirs:     /usr/local/ghc/pkg/share/doc/failure-0.2.0.1/html

2.3   Show packages that have multiple versions

To show packages with multiple versions installed, type "cabal-delete -l":

$ cabal-delete -l
The following packages have multiple versions.

base                   : 3.0.3.2 4.2.0.1
control-monad-failure  : 0.6.1 0.7.0
data-accessor          : 0.2.1.2 0.2.1.3
data-accessor-template : 0.2.1.3 0.2.1.4
dyre                   : 0.8.2 0.8.3
extensible-exceptions  : 0.1.1.1 0.1.1.2
failure                : 0.0.0.3 0.1.0
...

To show packages with multiple minor versions installed, type "cabal-delete -m". i.e. Packages with same major version and different minor versions installed:

$ cabal-delete -m
The following packages have multiple minor versions.

data-accessor          : 0.2.1.2 0.2.1.3
data-accessor-template : 0.2.1.3 0.2.1.4
dyre                   : 0.8.2 0.8.3
extensible-exceptions  : 0.1.1.1 0.1.1.2
...

2.4   Show packages that have no reverse dependency

To show packages that have no reverse dependency, type "cabal-delete -r":

$ cabal-delete -r
The following packages have no reverse dependency.

BlazeHtml-0.1
Imlib-0.1.2
control-monad-failure-0.6.1
control-monad-failure-0.7.0
criterion-0.5.0.0
data-accessor-template-0.2.1.4
dph-par-0.4.0
dph-seq-0.4.0
dyre-0.8.3
extensible-exceptions-0.1.1.1
...

3   Options

The following options are available:

usage: cabal-delete [option] [package...]

  -R  --recursive          delete packages recuresively
  -a  --all                process both user and global packages
  -g  --global             process global packages instead of local packages
  -h  --help               show this help
  -i  --info               show package info
  -l  --multiple-versions  list packages with multiple versions
  -m  --multiple-minors    list packages with multiple minor versions
  -r  --reverse-depends    list packages with no reverse dependency
  -n  --dry-run            check what will happen without actual action
  -v  --version            show version number

4   Bug

  • cabal-delete cannot distinguish if same packages (same version) are installed in both global and user's package databases when --all option is specified.

5   TODO

  1. Refactoring...
  2. Do not perform recursive delete if any of dependent packages is [A] case.
  3. -y option not to query user's answer (non-interactive mode).