On Sun, Jun 11, 2017 at 7:37 PM, Gary Gregory <garydgreg...@gmail.com>
wrote:

> Is one upshot of this is that we should base the version number based on
> this OSGi report tool?
>

There are a few choices so the SEF upshot selector
<http://www.hkpro.com/index.php?option=com_content&view=article&id=129:the-trigger-groups&catid=4:special-topics&Itemid=5>
should
be set to Fun :-)

One group of choices revolve around the term "version number".   There are
a few different version numbers involved here.

   1. The Maven version number  (i.e. ${project.version} )
   2. The OSGI bundle version (i.e. the one in the  "Bundle-Version"
   manifest header).
   3. The package version for each exported package (e.g. the value of
   version in the manifest header below)
      - Export-Package: org.apache.common.weasels;version="1.1.0"

Another group of choices revolve around interpretations of the term "base".

   1. automatically applying all suggested version numbers, without further
   review (e.g. for maven, writing  goals for the packaging phases).
   2. executing the baseline goal during the verify stage, possibly failing
   the build if the versions contain errors (or warnings), possibly only
   reporting.

Another level  of choice  is whether to have  different policies for
different levels of change.

   -  For example, if the maven version is taken as a given, code could be
   written to restrict changes to the level implied by  the maven version
   change. Thus, micro releases would be failed if any API changes, minor
   versions would be failed if no API changes, or any  Major changes, were
   found.

Some specific decisions:

   1. Setting the maven-bump match the maximum API change.
      - Advantages: This gives appropriate behavior when maven version
      ranges are used (e.g. <version>[1.1,2)</version>).
      - Disadvantages: If the artifact contains a lot of unrelated
      functionality, this may unnecessarily affect dependents that
don't need to
      change. This is especially problematic if it's a major-level change.
   2. Requiring *all* package version numbers to match.
      - This either requires (1), or the addition of a new, manually set
      property
      - Advantages: Require-Bundle imports with ranges will work (however,
      these are not considered good practice)
      - Disadvantages: Packages with changes at a lower level than the
      maximum will nevertheless be treated as if they had the higher level of
      changes.
         - This can require redundant  versions of identical classes to be
         loaded (if the imported packages are not used in any exported packages)
         - This can cause a system to ignore an updated artifact containing
         fixes to packages it uses, solely because of changes to
package it does not
         use.
         - In the worst case, cause systems that would otherwise have been
         resolvable to fail (e.g if a bundle wants to import two
bundles that would
         otherwise have had compatible  ranges for a used package to
no longer have
         a compatible range).
      3. Having per-package versions:
      - This requires (e.g.) incrementing the version number in a
      package-info.java @Version annotation for the first change of a
given level
      for each release.
      - Advantages:
         - most precise package versions (obviously :-).
         - Avoids disadvantages in (2)
         - Lays groundwork for use of other package annotations
            - e.g.:  @Export annotation to indicate package is for export,
            with other packages considered private (could also be used
for jig-slaw)
         - Disadvantages:
         - Requires updating one or more version number  per release,
         either manually or automatically
         - If NOT (1), OSGI systems that make use of pax mvn / aether URLs
          (e.g. Apache Kafka ) may not work optimally (if a repository index is
         used, this is not a problem)
      4. Automatically incrementing per-package versions:
      - Advantages:
         - Does not require developer to edit package-info.java @Version
         annotation.
      - Disadvantages:
         - Does not require developer to edit package-info.java @Version
         annotation.  "*Wait - that's not backwards compatible*?"
         - Requires some Mojo (most suitable place would be in Apache Felix
         maven-bundle-plugin).
      5. Automatically initializing per-package versions:
      - Advantages:
         - Avoids having to manually create or edit a large number of
         packages. Allows a uniform policy to be set.
      - Disadvantages:
         - Requires a small amount of code (could be new goal, could be
         groovy or bash/perl script).

A big part of the decision comes down to how to handle breaking changes.
If there is a policy to reduce unintended API changes, then manually
bumping package versions if the API change is required is probably best.  A
failing  bundle:baseline can be thought of like a failing unit  test;
either there's a bug in the code (api change is wrong), or there's a bug in
the unit test (the @Version is wrong).  Automatically accepting all API
changes then seems a little like automatically adding an @Ignore to a
failing test case.

Looking forward, it is a useful starting point for thinking more carefully
about how packages and artifacts are structured - which parts of a  project
is the API, and what part is implementation; are API and implementation
classes mixed in the same package;  is a lot of unrelated functionality
mixed in to a package;  etc.

Adding bundle:baseline to the commons parent verify stage seems like a
sensible move regardless.  This should not replace japicmp, as they have
non-overlapping features. These goals  should replace CLIRR, which is
obsolete (so obsolete that won't run under jdk-9 because jdk 1.5 bytecode
is no longer supported) .
Simon
p.s.

It would definitely be nice if the Felix Maven Bundle Plugin were able to
auto add/update package-info.java files & @Version annotations, with
configurable policies (e.g. limit auto-bumps to micro/minor/major; use
maven project.version as limit; adjust maven project.version, etc.).
[I'm not sure quite how auto-adjusting maven version bumping should work in
multi-project builds (should all children be forced to the same version, or
should each sub-project have its own version, so that if there are no
changes made in a subproject, there needn't be a new artifact released). ]

That's an issue for a different tracker :-)
Simon

Reply via email to