packages feed

staversion-0.2.2.0: README.md

# staversion

![travis status](https://api.travis-ci.org/debug-ito/staversion.png)

staversion is a command-line tool to look for version numbers of Haskell packages.

See `--help` message for detailed usage.

## Package version in Stackage

staversion mainly focuses on package versions in stackage, i.e. it answers to questions like "What version is the package X in stackage lts-Y.ZZ?" It aims to make it easier to write `build-depends` section in YOUR_PACKAGE.cabal.

    $ staversion --resolver lts-4.2 conduit
    ------ lts-4.2
    conduit ==1.2.6.1
    
    $ staversion --resolver lts-4.2 --resolver lts-7.0 conduit
    ------ lts-4.2
    conduit ==1.2.6.1
    
    ------ lts-7.0
    conduit ==1.2.7
    
    $ staversion --resolver lts-4.2 --resolver lts-6 conduit base
    ------ lts-4.2
    conduit ==1.2.6.1,
    base ==4.8.2.0
    
    ------ lts-6 (lts-6.31)
    conduit ==1.2.9.1,
    base ==4.8.2.0

staversion first reads build plan YAML files that are stored locally in your computer, then it tries to fetch them over network.

## Package version of your current stack project

If you omit `--resolver` (`-r`) option (or explicitly specify `--stack-default` (`-S`) option), staversion reads `stack.yaml` of your current project, and searches for package versions in the resolver specified in the `stack.yaml`.

    $ staversion conduit
    ------ default stack resolver (lts-10.8)
    conduit ==1.2.13.1


## Package version in Hackage

You can also look up the latest version numbers hosted on hackage with `--hackage` (`-H`) option.

    $ staversion --hackage conduit base
    ------ latest in hackage
    conduit ==1.2.8,
    base ==4.9.0.0

## Package version for build-depends

You can also specify .cabal files in the query. In that case, staversion reads `build-depends` fields in all sections of those .cabal files, and shows versions of the dependency packages.

    $ staversion --hackage staversion.cabal 
    ------ latest in hackage
    -- staversion.cabal - library
    base ==4.9.0.0,
    unordered-containers ==0.2.7.2,
    aeson ==1.0.2.1,
    text ==1.2.2.1,
    bytestring ==0.10.8.1,
    yaml ==0.8.21.1,
    filepath ==1.4.1.1,
    directory ==1.3.0.0,
    optparse-applicative ==0.13.0.0,
    containers ==0.5.9.1,
    http-client ==0.5.5,
    http-client-tls ==0.3.3,
    http-types ==0.9.1,
    transformers ==0.5.2.0,
    transformers-compat ==0.5.1.4,
    megaparsec ==5.1.2
    
    (snip)

## Package version ranges over different resolvers

With `--aggregate` (`-a`) option, you can aggregate version numbers in different resolvers into a version range using the given aggregation rule.

For example, `or` rule just concatenates versions with `(||)` condition.

    $ staversion --aggregate or -r lts-5 -r lts-6 -r lts-7 -H aeson
    ------ lts-5 (lts-5.18), lts-6 (lts-6.31), lts-7 (lts-7.20), latest in hackage
    aeson ==0.9.0.1 || ==0.11.3.0 || ==1.1.1.0

`pvp` rule aggregates versions into a range that should be compatible with the obtained versions in terms of PVP (Package Versioning Policy.)

    $ staversion --aggregate pvp -r lts-5 -r lts-6 -r lts-7 -H aeson
    ------ lts-5 (lts-5.18), lts-6 (lts-6.31), lts-7 (lts-7.22), latest in hackage
    aeson >=0.9.0.1 && <0.10 || >=0.11.3 && <0.12 || ==1.2.*

You can use `--aggregate` option with querying .cabal files.

    $ staversion --aggregate pvp -r lts-6 -r lts-7 -r lts-8 staversion.cabal 
    ------ lts-6 (lts-6.31), lts-7 (lts-7.22), lts-8 (lts-8.13)
    -- staversion.cabal - library
    base >=4.8.2 && <4.10,
    unordered-containers >=0.2.8 && <0.3,
    aeson >=0.11.3 && <0.12 || >=1.0.2.1 && <1.1,
    text >=1.2.2.1 && <1.3,
    bytestring >=0.10.6 && <0.11,
    yaml >=0.8.22 && <0.9,
    filepath ==1.4.*,
    directory >=1.2.2 && <1.4,
    optparse-applicative >=0.12.1 && <0.13 || >=0.13.2 && <0.14,
    containers >=0.5.6.2 && <0.6,
    http-client >=0.4.31.2 && <0.5 || >=0.5.6.1 && <0.6,
    
    (snip)


## TODO

- Cache build plans in some local storage (SQLite?)

## Author

Toshio Ito <debug.ito@gmail.com>