+1 to the proposal.

One thing I have reservations about is having a recommended version syntax with 
other formats still supported but deprecated.
As far as I understand the recommended syntax is there so we can guarantee a 
uniqueness of the OSGi versions (when the source version is unique). Instead of 
having a recommended syntax can we document what we consider a unique version 
and let the user decide what format to follow?

Svet.


> On 20.06.2017 г., at 14:23, Alex Heneveld <alex.henev...@cloudsoftcorp.com> 
> wrote:
> 
> 
> I've drafted the documentation for how this could be explained to users.  
> This may be easier to grok than the email:
> 
> https://github.com/apache/brooklyn-docs/pull/198/files#diff-21dacc664dfe4d0a156d65d768a0f0e2R28
> 
> Best
> Alex
> 
> 
> 
> On 19/06/2017 17:39, Alex Heneveld wrote:
>> 
>> Hi All-
>> 
>> TL;DR - I am proposing that we encourage versions in Brooklyn of the form 
>> "1.1.0" or "1.2-qualifier" such as "1.2-SNAPSHOT", silently mapping when 
>> needed to OSGi as "1.1.0" or "1.2.0.qualifier" / "1.2.0.SNAPSHOT"
>> 
>> 
>> Further to my last mail -- we have a bit of discord between various 
>> versioning schemes--
>> 
>> * GitHub SemVer - which everyone talks lovingly about (though often not 
>> knowledgeably, and it's stricter than I realized!)
>> * OSGi versioning - a precursor to (1), in widespread use but I've never 
>> heard anyone say anything nice about it
>> * Maven - allows whatever you want but has recommendations and conventions 
>> most people kinda follow
>> 
>> They all agree on up to three numbers at the start.  It's what comes after 
>> that varies, usually either a "-" (semver, maven, conventions) or "." 
>> (osgi), followed by qualifiers.  If practice almost everyone seems to do "-" 
>> followed by qualifiers -- however qualifiers in practice often don't follow 
>> the strict constraints of semver (no leading zeroes, no underscores) nor 
>> some of the maven recommendations (use of build number).
>> 
>> (Detailed summary on SemVer and OSGi versioning is included below for 
>> reference.)
>> 
>> So far, Brooklyn hasn't had an opinion and I liked it that way. However when 
>> registering OSGi bundles we MUST confirm with OSGi versioning there.  I'm 
>> pretty sure it's NOT desirable to enforce OSGi versioning on types, given 
>> that few people use it.  BUT we are moving to a world where I think we want 
>> type versions (entity versions etc) to align with bundle versions:  there is 
>> really no point in types having different versions to their defining bundle! 
>>  This makes for an incompatibility between what people would naturally use 
>> and what we have to use within OSGi.
>> 
>> With examples, my assumption is that people want to use and see strings like 
>> "1.1-SNAPSHOT".   But under the covers the OSGi bundle needs to have 
>> "1.1.0.SNAPSHOT".
>> 
>> I propose we resolve this by recommending a version syntax which fits what 
>> most things people are doing and which is bi-di mappable to OSGi.  We use 
>> this version everywhere except where a strict OSGi version is needed.  We 
>> WARN if we get a non-compliant version in a place which might be ambiguous.  
>> And we minimise places where we need to rely on mapping.  (The main place a 
>> mapping is needed is if we need to create an OSGi version or compare with an 
>> OSGi version.)
>> 
>> Specifically I propose that Brooklyn type versions SHOULD be:
>> 
>>    <major> ( "." <minor> ( "." <patch> ")? )? ( "-" <qualifier>) ?
>>    where qualifier can have letters, numbers, "-" or "_" but NOT additional 
>> ".".
>> 
>> We construct an OSGi version, when needed, by replacing the first "-" with 
>> "." and inserting 0's if needed for a missing minor/patch.  So 
>> "1.1-SNAPSHOT" becomes "1.1.0.SNAPSHOT" when an OSGi version is needed.
>> 
>> Note that the above is a SHOULD.  The only strict requirement is the version 
>> string MUST NOT contain a ":".  (That breaks parsing.)
>> 
>> Where non-compliant versions are supplied, we WARN, but things work.  We 
>> apply simple heuristics to create a valid OSGi version -- but the problem is 
>> that we can no longer guarantee uniqueness ("0.0.0-a" and "0.0.0.a" would be 
>> conflated), and the result is possibly quite different to the input (eg "v1" 
>> would become "0.0.0.v1").  For this reason if given a non-compliant version 
>> string we WARN what the result is and that the resulting OSGi version could 
>> conflict with similar but not-identical version strings -- but things work 
>> fine unless someone is trying to have different bundles for "0.0.0-a" and 
>> "0.0.0.a"!
>> 
>> (If version is taken from MANIFEST.MF we reverse map to find the brooklyn 
>> type versions, by changing the ".<qualifier>" to "-<qualifier>"; no warning 
>> is needed here however as there is no risk of non-uniqueness.)
>> 
>> Returning to examples:
>> 
>> * If a user specifies "1.1-SNAPSHOT" that's what they will see everywhere 
>> except deep within OSGi where they will see "1.1.0.SNAPSHOT"
>> * If a user includes a MANIFEST.MF they would have to use "1.1.0.SNAPSHOT" 
>> syntax there; they should still use "1.1-SNAPSHOT" in the catalog.bom (or 
>> "1.1.0-SNAPSHOT" would be fine too).  If they use "1.1.0.SNAPSHOT" in the 
>> catalog.bom things will work, but they will get a warning, and 
>> "1.1.0-SNAPSHOT" is what will display in the UI.  If a different number or 
>> qualifier (eg "1.2.0-SNAPSHOT" or "1.1-beta") is used, it will give an ERROR 
>> because the mapping will make an inconsistent OSGi version.
>> 
>> I think the only other big options are to require OSGi everywhere (user 
>> unfriendly, and bad for backwards compatibility) or completely decouple OSGi 
>> bundle version from type versions (overly confusing).  So while I'm 
>> reluctant to get in to the "versions should look like XXX" I think it's 
>> worth it to play nicely in OSGi and semver, and the above I think is the 
>> simplest and best way (even if the technicalities don't look so simple on 
>> first read!).
>> 
>> That said if there are version strings people want that aren't going to be 
>> well-supported with this proposal, please shout now!
>> 
>> Best
>> Alex
>> 
>> 
>> 
>> APPENDIX - Comparison of SemVer and OSGi
>> 
>> GITHUB SEMVER - https://github.com/mojombo/semver/blob/master/semver.md
>> 
>> *<major> "." <minor> "." <patch> ( "-" <pre_release_id> )?  ( "+" <build_id> 
>> )?*
>> 
>> The first three parts are numbers.
>> Where <pre_release_id> and <build_id> are dot-separated tokens made up of 
>> letters, digits, and "-".
>> Key things:
>> * numbers and and pre_release_id tokens must not consist of numbers with 
>> leading zeros (e.g. "1.01" is not valid, nor is "1.0.0-01"; but "1.0.0+01" 
>> is)
>> * "-" immediately after the patch indicates pre-release and special 
>> precedence rules apply
>> * build-id metadata should be ignored when computing precedence
>> 
>> 
>> OSGI VERSIONING - https://www.osgi.org/release-4-version-4-3-download/ - 
>> sections 1.3.2 and 3.2.5
>> 
>> *<major> ( "." <minor> ( "." <micro> ( "." <qualifier> )? )? )?*
>> 
>> The first three parts are the same as semver, except leading zeros are 
>> allowed.
>> <qualifier> consists of letters, numbers, "-", and "_".
>> 
>> 
>> SUMMARY OF DIFFERENCES
>> 
>> (1) OSGi allows abbreviating when there is no qualifier data (e.g. "1.1") 
>> whereas semver doesn't (has to be "1.1.0")
>> (2) OSGi requires a dot before the qualifier, whereas semver uses "-" or "+" 
>> depending on what the qualifier is meant for
>> (3) OSGi permits underscores but not dots; semver permits dots to separate 
>> non-empty tokens
>> 
>> END
>> 
> 

Reply via email to