Hello.

As a follow-up of
  http://markmail.org/message/jckbknphndecglns
and
  http://markmail.org/message/f3g33kvevf52xohf
I summarize what I think should be allowed for versioning
modularized components of the "Commons" project.

Assume there are two modules in project "Commons ModProj":
  commons-modproj-foo
  commons-modproj-bar

Their respective "top-level package" would be:
  org.apache.commons.modproj.foo
  org.apache.commons.modproj.bar

I propose that versioning of the modules are independent
(as if they were different components).

As said in the referred posts, it would allow the version
numbers to reflect the actual state of each of the module.
For example, assume that this proposal is validated, and
that
  commons-modproj-foo-1.0
  commons-modproj-bar-1.1
were released.

Note: for the sake of exercising the version changes, all the
cases below happen in the sequence shown (ala "switch" with
"case" without "break").

=== Case (A) ===

We must release a non-BC upgrade of "bar".
Hence, we would release
  commons-modproj-bar-2.0
with "top-level package"
  org.apache.commons.modproj.bar2

Advantage: applications that only use module "foo" are unaffected.

=== Case (B) ===

Assume that "bar" depends on "foo".

 -- Case (B1) --
   We release a BC version of "foo":
     commons-modproj-foo-1.1

  * Case (B1+)
      The upgrade consists of new features only.
      Module "bar" is totally unaffected (what worked with foo-1.0
      works the same with foo-1.1) and no new release of "bar2"
      will happen.

      Advantage: users of "bar2" only will not wonder whether they
      should upgrade (if they did not intend to use new features,
      there is no reason for them to upgrade).

  * Case (B1-)
      The upgrade consists of bug fixes.
      Both modules will be released, i.e.
        commons-modproj-foo-1.1.1
        commons-modproj-bar2-2.0.1

      This will trigger an upgrade for all users (who care about
      correctness).

 -- Case (B2) --
   We release a non-BC version of "foo":
     commons-modproj-foo2-2.0
   with "top-level package"
     org.apache.commons.modproj.foo2

     * Case (B2+)
         The upgrade is purely a re-design.

         The development team is free to (major) release the new
         "foo2-2.0" without having upgraded "bar2", i.e. latest "bar2"
         (2.0.1) still uses "foo-1.1.1".

         ~ Case (B2+sync)
           Team is able to provide, at time of release, a bridge and
           release
             commons-modproj-bar2-2.1
so that users of "bar2-2.1" will transparently use "foo2-2.0"
           (in place of "foo-1.1.1").

         ~ Case (B2+async)
           Team is able to provide (or improve) the bridge later on,
           i.e. release
              commons-modproj-foo2-2.1
              commons-modproj-bar2-2.2
so that users of "bar2" only will transparently use "foo2-2.1"
           (in place of "foo-1.1.1" or "foo2-2.0").

        Advantages:
         - Redesigned "foo" can be released without worrying about
           upgrading "bar" (RERO).
         - Users of "bar2" only can either not worry about upgrade,
           or just update their version dependency (not changing a
           single line of code).

     * Case (B2++)
         Previous re-design turned out to be sub-optimal.

         A new major "foo" is released:
           commons-modproj-foo3-3.0
         with "top-level package"
           org.apache.commons.modproj.foo3

         [Same (non-)consequences for "bar2" as previous case.]

     * Case (B2-)
         An upgrade also contains bug-fixes.

         A new major "foo" will be released, i.e.
           commons-modproj-foo4-4.0
         with "top-level package"
           org.apache.commons.modproj.foo4
         together with a new major "bar"
           commons-modproj-bar3-3.0
         with "top-level package"
           org.apache.commons.modproj.bar3

         Here the upgrade of "bar" will force its users to think
         about whether they need to upgrade (whether they are
         impacted by the bugs or they want to have support usually
         provided for latest version only).

=== Case (C) ===

People want to completely redesign the whole "ModProj" functionality.

We can release
  commons-modproj2-foo-1.0
  commons-modproj2-bar-1.0

Their respective "top-level package" would be:
  org.apache.commons.modproj2.foo
  org.apache.commons.modproj2.bar


At this point we'd have these modules officially released:
  commons-modproj-foo4-4.0
  commons-modproj-bar3-3.0
  commons-modproj2-foo-1.0
  commons-modproj2-bar-1.0
all happily living together[1]; and improvements can be easily
exchanged among the different lines of development (e.g. via
"git" branches).

Obviously, the significant change is that version numbers are
tied to modules, not component.  Does that pose a problem?[2]
[It should be clear that having the same version numbers for
"foo" and "bar" would be a pure coincidence.]

In particular, version and package changes are confined to
where code changes happen; they follow the development of
specific features (while non-impacted code is not forced to
adopt a version that is actually related to "foreign" code).

Another fundamental advantage, community-wise, is that it is
conducive to maintaining a good relationship among developers
even if they want to "scratch different itches".[3]

In effet, this scheme would allow to group codes by "broad"
subject while module management could be fine-grained,[4]
up to using specific version suffixes (such as "-dev" or
"-extras") to convey intended use or audience or level of
support...


Regards,
Gilles

[1] Provided the dependencies are correct of course.
[2] According to Stian, it does not (IIRC).
[3] Whereas the current scheme turned different POV into personal
    fights, with punctual winners and losers (however gracefully
    they think they can handle it) but an enduring overall loss
    for the community.
[4] On a par with the varying levels of development (for whatever
    reasons, such as lack of time or lack of contributors) of those
    modules.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to