Hi!<br><br>I&#39;m pleased to announce the first release of my program package-vt. It&#39;s role is to detect changes between two versions of package that should cause version bump.<br><br>Recommended versioning policy for Haskell packages is on the wiki [1].<br>
<br>The ultimate goal is to get as good approximation of the algorithm specified there as possible. Currently the tool is far from being complete: it only detects changes to exports in .cabal and module files, but doesn&#39;t take any types into consideration, not to mention other possible heuristics.<br>
<br>This tool is not meant as a replacement for developer&#39;s own brain. It
can only detect a subset of changes, and there will always be some important
changes it won&#39;t catch, like adding such line:<br>

<span style="font-family: courier new,monospace;">head (_:y:_) = y</span><br>

<br>

However, it can be used for some quality checks.<br>

<br>Thing that needs improving is user interface. No options are currently accepted. This, and a lot more, will change in future versions.<br><br>You can find a Git repo here [2]. The repo contains &#39;tests&#39; directory with two useful scripts. You can use them to run package-vt on anything from Hackage.<br>
Here are a few random usage examples:<br><br>1) Detect small change within module<br><br><span style="font-family: courier new,monospace;">package-vt packages/HCL/1.1/HCL-1.1/HCL.cabal packages/HCL/1.2/HCL-1.2/HCL.cabal </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">Single changes:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">ChangeABC : Entity added to module ModuleName &quot;HCL&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">EVar (UnQual (Ident &quot;prompt1&quot;))</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Biggest change comes from:</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">ChangeABC : Entity added to module ModuleName &quot;HCL&quot;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">EVar (UnQual (Ident &quot;prompt1&quot;))</span><br><br>2) Detect new module added to .cabal<br style="font-family: courier new,monospace;"><br><span style="font-family: courier new,monospace;">package-vt 0.2.0/AERN-Net-0.2.0/AERN-Net.cabal 0.2.1/AERN-Net-0.2.1/AERN-Net.cabal</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">Single changes:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">ChangeABC : Entity added to module ModuleName &quot;Control.ERNet.Foundations.Process&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">EThingAll (UnQual (Ident &quot;ERProcessAction&quot;))</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---ChangeABC : Module(s) added.(Consider AB change if new modules are likely to cause name collisions)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&quot;Control/ERNet/Blocks/Real/LFT&quot;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Biggest change comes from:</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">ChangeABC : Module(s) added.(Consider AB change if new modules are likely to cause name collisions)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&quot;Control/ERNet/Blocks/Real/LFT&quot;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><br>3) Using testing script: package-vt correctly detects that AERN-RnToRM-0.4.9 should rather be 0.5.0 because the module  <span style="font-family: courier new,monospace;">Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Field <span style="font-family: arial,helvetica,sans-serif;">has been removed.</span></span><br>
<br><span style="font-family: courier new,monospace;">./test-on-package.lhs AERN-RnToRm</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">--cut--</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt;&gt;&gt; Testing package-vt on AERN-RnToRm-0.4.2 and AERN-RnToRm-0.4.9</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Parse error: VarSym &quot;#&quot; : SrcLoc {srcFilename = &quot;0.4.2/AERN-RnToRm-0.4.2/src/Data/Number/ER/RnToRm/Approx/DomTransl.hs&quot;, srcLine = 174, srcColumn = 1}</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">Single changes:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">ChangeABC : Entity added to module ModuleName &quot;Data.Number.ER.RnToRm.Approx&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">EVar (UnQual (Ident &quot;keyPointsConsistencyCheck&quot;))</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">EVar (UnQual (Ident &quot;keyPointsPointwiseConsistencyCheck&quot;))</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---ChangeABC : Entity added to module ModuleName &quot;Data.Number.ER.RnToRm.UnitDom.Approx&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">EVar (UnQual (Ident &quot;keyPointsConsistencyCheck&quot;))</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">EVar (UnQual (Ident &quot;keyPointsPointwiseConsistencyCheck&quot;))</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---ChangeAB : Module(s) removed/renamed.</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&quot;Data/Number/ER/RnToRm/UnitDom/ChebyshevBase/Polynom/Field&quot;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Biggest change comes from:</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">ChangeAB : Module(s) removed/renamed.</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&quot;Data/Number/ER/RnToRm/UnitDom/ChebyshevBase/Polynom/Field&quot;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">---</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">ExitSuccess</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">--cut--</span><br><br>In case of any trouble please email me or report an issue here [3].<br>In the near future I&#39;ll post more specific plans about development on my blog [4].<br>
<br>I hope you will find it useful.<br><br>Best regards,<br><br>Krzysztof Skrzętnicki<br><br>[1] <a href="http://www.haskell.org/haskellwiki/Package_versioning_policy">http://www.haskell.org/haskellwiki/Package_versioning_policy</a><br>
[2] <a href="http://github.com/Tener/haskell-package-vt">http://github.com/Tener/haskell-package-vt</a><br>[3] <a href="http://github.com/Tener/haskell-package-vt/issues">http://github.com/Tener/haskell-package-vt/issues</a><br>
[4] <a href="http://mostlycode.wordpress.com">http://mostlycode.wordpress.com</a><br>