#Versioning
1 messages · Page 2 of 1
Another point: future goals of separating loader and neoforge-api itself
If this starts going down the fabric route (Which users seem to be fine with as far as versioning goes) - it's full semver over there
yeah I have no opinions about it because I personally would prefer neoforge to continue being the monolithic option
I am VERY much a baremetal kind of programmer and want to know breaking changes first. Semver is important af for that
I'm a high-level programmer, I want things to be as thought-free as possible, and having a monotonic versioning means I can very easily specify a breaking changes window without worrying
[2.0,3.0) will never have the possibility of me forgetting to update the version range after bumping the mc version
but if it's back to 1.0 every major version I may forget to reset the minimum version and releasea mod with [1.0.453,) that actually would have worked from 1.0
Imagine a future scenario, after a user installed fancymodloader-3:
- platform-mods
- neoforge-core-2.1.0.jar
- neoforge-events-1.0.0.jar
- somecoremods-mixins-12.3.0.jar
- mods
- compactmachines-26.0.0.jar
Rebuttal: required MC version in the same place, game denies to load and you'll be RIGHT next to that other number
Also.. we could technically move the minimum Neo version out of manual assignment. It gets added to META-INF on build, with the range being chosen from [<targeted NEO dependency>, NEO-version-major + 1)
Then nobody could forget. Ever. It'd enforce that you only bump Neo version in dev when you ACTUALLY need something
So META-INF/MANIFEST.MF:
Neoforge-Build-Version: 1.2.0
Mc version does not make sense in the artifact id at all
I oppose that definitely
I guess having the mc at the start of the version would be bad for if we ever get froge up and running and publishing
so personally, we should follow fabric in that regard
having it as a suffix
this means keeping the major version sorted nicely would be important
Personally I think bumping the major version every single mc release is the way to go
And we can prematurely bump it for snapshots
to clarify: as I understand it that would result in significant gaps in the major versions for each MC release, is that intended?
mc release is not a snapshot
you literally just said mc release in the way I intended
So, if we're going the route of "one breaking change window, try to follow semver", can we at least kill the .1 system?
50.0.0-beta.1 -> 50.0.0-beta.420 = rapid breaking changes
50.0.0 = stable
50.1.0 = new feature hype
etc
all I mean is when working on snapshots you bump the major to indicate it's for the next mc release
oh, so there is not a bump per snapshot
but not for any further snapshots till a release
yes
got it, that makes sense
lol we would be on .0.0 forever
why not just allow breaking changes at any point but bump the major
like how normal semver works
We just had a huge discussion on that.. people apparently want a single BC window
meh idrc either way
I would argue we need to keep the major starting at 47 like it is now
So that we have the option to backport in the future if we want
that doesn't work, 50.0.0-beta compares as LESS than 50.0, and will be included in versionRange=[49,50)
oops ping
holy shit the brainfart
or at least that's what someone said
I didn't actually verify the claim
and assumed they were stating a fact and not just an assumption
This makes sense to me, but there's one issue - say someone depends on [4.1.2, 5.0.0) to not work with neoforge for the next BC window. This will allow the mod to run with 5.0.0-beta.1 just fine, because that's before 5.0.0
This is a fact about how semver works, and about how maven version ranges work
Versions with metadata come before the same version without it
Which makes sense, but causes issues with maven version ranges
The version ranges that fabric uses have some ways around this I believe, but yeah, it's not great
can we add support for the 4.x style syntax?
Link?
4.+ to depend on any version in the 4 major version
Like you can do in gradle dependencies
Or 4.x for the same, like fabric, I believe, does?
That's not a bad idea actually
Let's us use a proper semver version scheme
I think they mean maven 4.x or maybe the 4 is just an example
cuz afaik we use something something apache 3.x
Because people would just use 4.+ instead of [4.0.0, 5.0.0)` and wouldn't catch those prerelease versions
I'm pretty sure it's an example
Though I could be wrong
Personally I'd prefer 4.+ over 4.x` as the former is what gradle uses
sure, not picky about the character
And the two actually mean different things, which matters in cases like this
4.+ excludes those pesky prereleases
we already have enough confusion with what's the neo and what's the forge version, we need to start over
that's a bit strong
no it's not strong
we are actively overlapping with forge
but in binary incompatible ways
that's the worst possible situation
so backporting to older versions will be literally impossible
no, we still have the aliasing
neoforge:1.0 can expose forge:47.1.3 as a compatible modid/version pair
so in summary my opinions:
- neoforge-1.21:1.0.43 -> neoforge-1.22:1.0.0 -- 🤷♂️
- neoforge-1.21:1.0.43 -> neoforge-1.22:2.0.0 -- ✅✅
- neoforge:1.0.43+mc1.21 -> neoforge:2.0.0+mc1.22 ✅
- neoforge:1.0.43 -> neoforge:2.0.0 😕 (I'm ok with it as a developer but the downloaded files REALLY need the mc version for the user benefit)
- neoforge:1.21.0-1.0.43 -> 1.22.0-1.0.0 🤷♂️
- neoforge:1.21.0-1.0.43 -> 1.22.0-2.0.0 🤷♂️✅
- neoforge:1.21.0.43 -> 1.22.0.0 ⛔ (please no anything but this)
Personally, if we take embeddedt's suggestion of allowing 2.+ version ranges, I'd go for a simple semver system with -alpha.1 etc. for snapshots and -beta.1 etc. for BC window stuff
could solve the issue of not knowing the MC version with a simple page listing the mappings, e.g. 1.0 -> 1.20, 2.0 -> 1.21, etc
Just noting, we cannot restart versioning per MC version
People need to depend on neoforge, and that means having version formats that are stable over MC versions
Even if the artifact ID isn't
But Neo increments major every MC version anyway..
Because they need to shove something in the mods.toml
if you see above, I agree
We can't restart versioning from 1 though each MC version. If we did that, how would I depend on "neoforge for 1.21, 1.22, or 1.23 on this version range" in a mods.toml?
I still argue we can get rid of the manual min version check in mods.toml, in favor of build-time metadata
build-time min version is a big no from me
...but mods should be able to be marked as running on lower versions than they were built on
And forge shouldn't be "special" in this regard. It's a mod dependency like any other
I like to build in the newest version available to make sure nothing broke, but I specify the minimum I'm compatible with
Given that i compile on the latest, and test backwards for compatibility that would break my entire workflow
And break my support range
So I don't think that is a good idea
Given that in some cases I build on a newer version, but work on versions for previous MC versions...
Yeah no can we please not do that
If we keep one breaking change and major per MC, it's easy. "Compiled with Neo 48.1.36, requires at least 48.1"
What if I compiled with 48.1.36 but function fine on 40.2.1?
Okay, argument made
Can't have a complete discussion without throwing out ideas and finding what definitely WILL break workflows
Also, I highly dislike the idea of special casing forge dependencies compared to other mod deps
I mean, that's the point of a discussion, yes, to figure out which ideas are infeasible just due to how stuff works. And always depending on the version present at build time is both infeasible, as that's not how lots of people write mods, and there's no good reason they shouldn't be able to write them the way they do, and also generally ugly, as it means you special case neoforge dependencies compared to other dependencies
You'd still need to specify the top end of the version range somewhere anyways
I think the larger problem here is not being able to specify multiple MC versions cleaner - it's coupling MC version and Neo version too closely. I feel like Fabric really had the right idea by versioning areas of changes
So you could say "MC 1.18 - 1.20.1" in one range, and something like "dimensions 1.0" in another
Right but that only makes sense with Fabric's super long guarantees of no BCs. For forge, the BC windows are coupled to MC versions
And we should bump the forge major version on BCs, no matter what
When I depend on forge versions, I am also depending on MC versions, for that reason
Current system works better than most people would like to admit, IMO
Just remove the concept of latest and recommended builds, make x.0.y unstable and x.1.y stable
We can spend hours discussing a new system that is 10x as bureaucratic and complicated, or just keep the system that works pretty damn well
Also, no reason to reset the version IMO... I don't expect Forge to continue to exist anyway
I don't agree with that assumption
I can get behind that, but something similar was discussed earlier and my problem with it also applies to this
I mean I don't know how long forge will continue to exist for
but I think it's in bad faith to use the same modid because "it won't exist in the future"
if we change modid but keep the version that I don't care about
I don't give a damn, really
(I'm referring to this #1146802696465158174 message)
Discord is the easiest way to communicate over voice, video, and text. Chat, hang out, and stay close with your friends and communities.
Yeah sure modid change but keep version is good
but I do think it can be confusing for the users while forge exists
which is something I'd like to avoid
I don't expect that to be significant
Modpacks will have to use Neo and so users too
IMO the download site, right now, should be saying "NeoForge for 1.20.1 version 1.0.45 (Forge 47.1.3)"
Gonna be honest, while I'm aware of the actual situation, there's probably a lot of confused users looking for a forge build that doesn't exist yet and also a bunch who think having the same modId but higher version than actual forge is a malicious attempt to get people to switch to neoforge
Idk, I'm annoyed at the message spam for something that looks like a non-issue to me
it's a community discussion, there's diferring opinions, the whole point is to give people a chance to be heard
that said, this discussion has probably lasted far too long already
there should have been a deadline for proposals and a vote if more than one proposal fit the requirements
It sounds like something that the SC should decide once and for all
Make a list of potential issues and proposals, then pick something that's simple and that works
(or so I would approach it, at least)
Personally:
- One release per commit is extremely nice for automation and has worked well.
- RBs don't make sense, so only use 0 for unstable and 1 for stable.
- Keep same major version as Forge cause resetting it is awkward and useless
- Maybe change modid (or maybe not)
I'd say we should try to follow semver because honestly it's easy to. And I think the .1/.0 being the only things for that middle version shouldn't stick around - it's needlessly confusing
And it also doesn't describe what's going on
there's no realistic way to follow semver
Version numbers should describe at a glance what we're looking at
we can't bump minor every time we add something
I'm confused why not
I don't think there's any reason to follow semver
Bumping the minor version with new features, and patch for bug fixes, is pretty easy
also, IMO having the 0/1+ thing is a lot more meaningful for at a glance knowing what we are looking at
More meaningful than having stuff in the BC window have a prerelease qualifier?
That's in my opinion a lot more informative
And allows you to follow the same pattern for snapshot releases if those ever exist
That would imply the viewer would have to have prior knowledge that the minor version is not new feature but recommended build which is not general standard according to semvar
not if each person making a PR has to do it manually
haven't we established that 1.0.0-beta doesn't work with maven versioning?
no one sees versions that way except programming nerds
I reject the assertion that semver is a general standard
Why would they have to? When merging a PR, you generally squash, right? And you get to name the commit. So just add a [feature] prefix to the name if you want to bump minor or something
to anyone from the general public major version = big change, minor version = small change, patch version = very small change
there's no implicit meaning beyond that except to devs
Then how would you read the version of a new project you haven’t seen before? What assumption would you make about major.minor.patch numbers?
It's more of a general standard than whatever the heck the current system is supposed to be interpreted as
none at all, I would see a version and take it
mostly because I hate the idea of semver owning the idea of versions that have semantics
at most, if I see 3.0 I would think "oh this project has gone through two major refactorings"
But forge doesn’t even follow that then. Minor is recommended build in forge and small and very small changes shoved into patch
Basically, it should be obvious at a glance, at a version number in the breaking change window, that "this could break whenever". And it should be obvious at a glance at something post that window that "this won't break till ________". Whatever system you end up on has to do that. The current .0/.1 system does not, unless you already have a good understanding of how the forge RB system works
Whether or not you end up following strict semver, something more semver like will help address that issue, in my opinion
But the issue needs addressed somehow
Using a prerelease version for stuff in the BC window makes it obvious that it can break
On other hand, recommended build isn’t that important to know at a glance. Once it happens, you either know that version already or will use latest always
The current .0/.1 system does not, unless you already have a good understanding of how the forge RB system works
this is true regardless of what semantics the version has
And following semver conventions - at least with the major version representing breaking changes - ensures the second part
yes, I honestly believe that the ideal system would have the minor version bump any time there's meaningful changes beyond small bugfixes
such that the patch version changing becomes "if you aren't crashing no need to update"
the minor version is "if you want new features update"
and the major version is "if you update you have to update all your mods too"
I just think bumping minor for additions is an unreasonable maintenance burden for the team
It's not though. If I have stuff in the BC window end in -beta.1... it's a lot more obvious that it may break
I wonder how many messages have been posted here by now...
Oh sure. So, semver-like even if it's not "proper" semver - that makes a lot of sense to me
Could the minor bump be automated somehow? Idk what’s possible on GitHub but like a tag to a pr that it is a feature and the build detects that and bumps minor instead of patch.
maintainer vote is first
the closest I can imagine is a label on the PR which is used by CI on merge
Yes, trivially
We do it for GroovyMC projects
but that requires that the maintainers make 100% certain that th e right label is applied before merging
if we were really following semver to that extent, then bug fixes would be pulled into a patch release before moving onto features in the next minor
Based on a prefix on commit names
and direct pushing becomes strictly prohibited
might require multiple synchronous release branches
This isn't a bad thing necessarily
as I said: maintenance burden
SimpleCI is a terrible system in that you don't know which build corresponds to what and builds fail if git isn't cloned properly
Could just have a different patch version for each big fix PR too. No big deal with that
I agree, there's better ways to do it. But it is definitely possible and SimpleCI proves it
So then we end up shoving commits inside of jars so there's at least some way to tell if you're desperate, which kills caching and worsens build performance
Tags make stuff more obvious
And yeah, we should probably be tagging releases
(we as in GroovyMC)
(and I'll be setting that up for the projects I maintain soon enough)
It would be so much simpler if it just read the commit title and used that as the version if it starts with a v
the forge approach is simple and almost fool-proof: tags only need to be created when an explicit decision is made to bump versions, CI takes care of the rest.
no "before merge" checklists to worry about, no beginner mistakes to worry about, no delaying merging because the team people are too busy and adding more red tape has made it too much effort to continue helping
Commit "v1.1.2" publishes version 1.1.2. So much simpler
Yeah, this makes finding the commit for a given version difficult though. I'd say that manual tags should be used for version bumps, yes, but that if there is no tag, then the system should make a tag for the newly released version. Though maybe that leads to too many tags
The existing Forge versioning works fine
there's always a tag. when a new mc version is released, it is tagged. that's part of the porting process.
You would have a tag every commit if you were tagging for every build...
Does it tag every forge version after that though?
Right, which makes finding a commit from a version painful
patch = number of commits since newest annotated tag in the branch
That's what SimpleCI does too
While I’m not a fan of the needing of prior knowledge for minor version meaning in forge, seems better to just stick with that versioning for Neo
Just have it explained somewhere like doc or on versions page
also we could easily include the commit hash in the changelog
it's kinda silly that we don't
47.1.120(47f72a765bc):
changes here
I do think that BC window should be expressed as a prerelease because that's what that's meant for and it is intuitively meaningful
Because we have the PR number which links to the commit hash
But I do miss having PR authors listed in changelogs like the good old days. Was always nice seeing from a glance who worked on a PR without having to manually look up all the PR numbers
prohibiting direct pushing's already been vetoed by SC
Why was that removed. Was prs with multiple authors an issue or did authors not want to be listed
Nope, orion changed it during the move to teamcity and that was that
🤷♀️ I thought it was
PR and self-merge should be the norm
I recall Curle saying in the private channel that we don't have triage anymore, people can merge directly
For the toolchain stuff like NG and Neoform it doesn't really matter
Presumably someone else still has to merge for obvious reasons though
Seems like something that would be a maintainer vote not a decision by the SC? Unless I've misunderstood how stuff works
PRs are required https://github.com/neoforged/NeoForge/rules/51021
there's no requirement for the merge to happen by someone else tho
So make a PR, forget to test it, merge it yourself straight away and we're screwed... Got it
From what I've seen with the move from master to main and this, it looks like SC can override that process
no requirement mind you, as in, there's no github rule unlike the PR enforcement. there's still the informal "let someone else do it"
...from what cpw was saying in general a few weeks back that is not the case, if there hasn't at least been a maintainer vote when it's relevant. If it is the case then the whole discussion had there is a moot point
org admins can also bypass everything anyways
yes and that's stupid, I'm still not sure why we disabled the rule for org owner...
it means an org owner can push directly which is bad for.. multiple obvious reasons (security, auditability)
There was no maintainer vote as far as I'm aware. Me and some others said we weren't a fan in the private channel but as far as I can see it went ahead regardless without any proper vote
there's I think three concerns wrt the choice of versioning. in no particular order:
- how will the average user know which mc version a random installer file in their downloads folder is for
- how will users/devs know if a version is within breaking changes window and they have to expect future breakage when choosing to use it
- how will users know if it's safe to update from their existing version to a new one
wrt the current forge versioning:
- no issue, mc version is part of the filename
- no issue, breaking changes are only allowed if minor is 0
- no issue, versions before minor=1 need to be tested before updating, versions after minor=1 should continue working without introducing new incompatibilities
I think the existing forge scheme is reasonably clear on all 3. the only maybe-concern it has is that the maven version includes the mc version, but the internal version does not. is this a real issue? I don't particularly think so, it has worked fine for 10 years.
considering all the concerns expressed here, my current opinion (yes it will fluctuate I'm not screaming from any hill):
- reset version along with new modid, to celebrate the culmination of the forking effort (seems like the version and modid/artifact is the only remaining thing where neoforge hasn't rebranded, because the aliasing system doesn't exist yet)
- continue having the mc version prefixed in the maven artifact
- continue excluding the mc version from the mods.toml version string -- we can use the minecraft dependency for mc range checks
- major = new breaking changes period, whatever prompts us to have one
- minor = added new major feature/API -- this depends on the team choosing to take on this additional burden. I would still have .0 reserved for breaking changes period regardless
- patch = autocounting via git
if there isn't a formal vote there's no decision
Note that I'm a moderator so I might be unable to see a special maintainer voting channel or the like
But the change happened regardless
iirc said discussion was promoted by github for mobile not displaying rules correctly..?
and thats why the enforcement for another member approval was removed
it wasn't a decision per se, it was a UX and accessibility issue
I'm going to debate your answer to point 2. There is an issue because it's not at all intuitive that "minor version of 0" should mean "BC window". That's kinda random when we've got stuff like prerelease versions meant for that. I'd also debate on 3 - there is not issue if you know the rules and the rules aren't obvious. If we switched to something semver like with prereleases, it would be far more obvious how it works
Every time I try making a PR to neoforged since the switch to main, the github for desktop app has problems finding the repo, especially the preview PR function
The GitHub for desktop app sucks in general
So you can argue the same ux point for not changing it
The neoforged repos are exclusively the only ones I have this problem with. And I've been using the app for over half a decade
Personally, I would propose making the BC window distinction use a prerelease, and tagging the minor version manually whenever there's a fairly large change or new feature merged
So not strict semver
But more intuitive to someone who doesn't know neoforge versioning madness than the current scheme
that happens if you have both remotes (forge and neo) in the same git repo
And the CoC notice showed up fine today on master branch repos when doing my first PR to some new repos in the forge project
and in any case that was a decision that had to be done when the org was created, so there were exactly 4 people to weigh in on it
I didn't. Clean clone
Always a clean clone for the neo stuff. It's a pita for the sake of avoiding correct usage of a word
we don't have a CoC on github (or in general screm, still need to do that and figure out the final rules) so you wouldn't be promoted one in any case
I've been using gh desktop since forever and my personal repos use main so /shrug
So your point about rules not showing up without using main is not only incorrect, it's irrelevant
what point
Am I mixing up convos?
I'm talking about actual rules, not the CoC
branch rulesets, the only thing on github's side that can enforce an approval from another remember before merging
those rules would not show up in the github mobile app when a PR is to be merged, it would just say "PR can't be merged" without mentioning why
Alright, thank you for clarifying
I don't like the prerelease in the version because it requires changing how version ranges are specified in the mods.toml, it means I can no longer do [47,48) because 48.0-beta would be included. so meh. if it wasn't for this I'd be agreeing with you.
someone suggested even/odd versioning
that is probably even more confusing for the average user
(that is, all odd versions are prerelease, all even are stable -- or the other way around)
Are you sure an exclusive upper maven version range would include beta versions of said upper range?
I haven't verified myself, but it seems to be something people say is true
of course everyone could be wrong I guess
well the thinking is that [47,48) does "if version >= 47 && version < 48"
and 48-beta is < 48
if version ranges are compared like that, it makea sense that it would be true
Yeah that makes sense, although I would hope the version checking logic would factor in betas and the like
yeah I still don't know if, IMO, [48,) should include betas for 48. in a way I think it should
48.0.0-beta should compare as a version between 48.0 and 48.0.0
Both including and excluding makes sense depending on different logic
Whatever maven actually does is probably the expected behaviour
alphas and betas are intentionally lower than the "release" version
so [48, should not include betas, rcs or alphas
the issue is [,48)
does that include the alphas and betas?
because by any meaningful sense of version range, it should not
48.0-alpha.1 should NOT compare as inside [47,48)
48 is 48.0.0 > 48.0.0-alpha
so if it's exclusive 48 than everything lower should be included
yes I understand the logic
I'm saying that this logic, while it makes sense, it does not represent how we think of versions
so I am wondering if our mods.toml version checking actually does that
I need to implement a mavencompare command in camelot lol
@rapid totem if you're bored ^
OH right I can test give me a second
Not including alphas and betas in <=48 also makes sense for different reasons
I was thinking I would have to create a dummy mod with version and shit
As I said, whatever forge actually does is what matters to us
but I don't I just need the Expression Evaluator in intellij heh
lowcode mods
or just open a random Java project, add the apache maven versioning library and just test :P
defaultversion is the name of the class I believe
or comparableversion, one of those
VersionRange.createFromVersionSpec("[47,48)").containsVersion(new DefaultArtifactVersion("48.0.0-beta.1"))
result = true
VersionRange.createFromVersionSpec("[47,48)").containsVersion(new DefaultArtifactVersion("48.0.0"))
result = false
there we go
confirmed, maven versioning is trash
I'd say allowing the use of 1.+ versions in the mods.toml, or allowing the use of the "dummy" prerelease version 4.0.0- which comes before all others, or even starting versioning at .1 would all solve that
Semver parsing is painful though
luke: the issue is if I want to depend on [1.3.5,2.0)
1.+ syntax cannot represent that properly
It does though. It just is a flaw of maven version ranges specifying stuff by endpoints. Because it turns out you can assume both endpoints are well defined
that's what libraries are for
Sure, that's what you'd use a "dummy" prerelease version for. [1.3.5,2.0-)
>=1.3.5 <2.0
Where 2.0- is below all 2.0 prereleases
not sure if that's semver spec or just fabric sugar
no sane human thinks that [47,48) will include 48.0-beta.1
that would still include 2.0-beta.1 as part of the range
Yes they do. 48-beta is before 48
to YOU
I'm with giga here
To anyone. It's a _pre_release
because you have learned of it
Think about it: 1.20.1-rc.1 comes before 1.20.1
common sense would say that the moment the major version became 48, it was excluded from that range
But regardless, this particular issue is one fabric solved ages ago
By not using maven version ranges
While it makes sense either way you look at it, you wouldn't expect a variant of version 2 to be included when you say anything upto but excluding version 2
Because maven version ranges suck
And expect two well defined endpoints
Which is the issue here because the latter endpoint isn't well defined
Maven version ranges are easy to parse though which is nice
Or rather it is to us but can't be expressed in a maven version range
The semver handling in mods.groovy v2 is a lot simpler than v1, but it's still a lot more complicated than maven
It wouldn't though. If we put all the versions on a number line (which is what I think of when I see that syntax), then you'd expect the prereleases to be in the range
first library I see on google https://github.com/zafarkhaja/jsemver#external-dsl
First thing I see in the readme
except I wouldn't. because to me, 48.0.0-beta is < 48.0.0 but > 48.0 -- the trailing .0 are NOT useless IMO. versions are NOT a number line.
but anyhow
if anything is bikeshedding, this is
the matter is still the same
Maty I spent days trying to use libs for this before settling on doing it myself. Maybe for comparisons you can get away with it but for full parsing and conversion it's not a simple "hurr durr just import this random lib I found that says it's experimental"
if we continue using maven versioning
then I cannot vote in favor of having beta tags in the version
I am happy with beta tags in the version if we move away from maven version ranges -- whatever the alternative looks like
otherwise even if it's uglier semantically, I prefer .0 = breaking changes, .1+ = no breaking changes
that's irrelevant, the library has been with a major 0 since 2015, it is used by over 700 people (not projects, which is more), and in any case we don't need api stability for the library that checks the version range
Most notably the most popular still maintained semver lib for java has a recent issue opened for testing basic version range formats
Wait what? That is even less intuitive
The trailing zeros better dang well just be visual preference
Cause if not that's even more confusing
to me, the beta tag applies to the version component it's attached to
48.0.0-beta is ["48", "0", "0-beta"]
@nocturne moat what does fabric use for semver testing
Seriously mate, check what you're linking to before saying it's easy https://github.com/zafarkhaja/jsemver/issues/54#issuecomment-1509615352
it's still in the 48.0 family, just happens that the patch version is a pseudo-number that compares less than 0
...sure. But as 48 is 48.0.0, it's still less than 48
Well it's a reasonable assumption coming from knowing nothing about versions. It's how normal numbers work after all. 48=48.0
in my mind.
but anyhow my thoughts on versioning are way offtopic
and we have spammed this discussion well enough
and they do not affect the choice of versions
But yeah, this is a solved problem. The sort of version ranges fabric uses get around the limitations of maven ones by not requiring well defined end points
because I would love to have beta tags
I just think they are not compatible with using maven version ranges
it's FOSS, can always fork it, my point was that people already did most of the work
so
if maven version ranges - 🚫 beta tags
if other library that doesn't share the same issue - ✅ beta tags
Could always use a fake prerelease version then? Like, allow [1, 2-). That's still basically a maven version ranges
Then I refer you back to this maty
no like forge is using org.apache.maven.artifact.versioning lol
literally maven versions
Oh yeah sure.
it's not about the format, it's about how the library interprets the string
But okay then, there's a question: is moving either away from maven version ranges, or to a slightly modified version, feasible and something you'd want to do?
Take 5mins to actually look into this rather than assuming it's as simple as importing a random library and making a minor bugfix here or there. From the guy who spent days trying libs and then manual parsing very recently
From the guy who did manual parsing before you - its pain but not that much pain. Fabric and quilt have both done it before
since I'm not really active as a maintainer right now, my vote here is 90% from the point of view of a mod developer
and the other 10% is not wanting neoforge to fall into the "red tape trap" and delay merging PRs because the team finds it too much of a chore to go through the checklist
Yours breaks on 1.19.4- 
From the perspective of not at all a maintainer but a mod developer - the current system really sucks but whatever
I think mine does too actually lol
Yeah because I was trying to make the same system parse maven and semver version ranges at once
Otherwise I'd have just done what fabric did
huh, I really like the forge system, I just look at the number I have in my build.gradle, and copy it to the mods.toml :P
Which was way simpler
and I know that the next major = 100% chance my mod won't work anymore
Yeah but I don't know what that version means
My point is more that maty throwing a random Google search result link of a lib to say that it's easy is really lazy
Or rather, I do but it wasn't obvious
Especially when it doesn't take long to see that it's marked as experimental and has known issues related to beta parsing
I'll link you two libs that do it great!
http://github.com/fabricmc/fabric-loader
https://github.com/quiltmc/quilt-loader
Those are entire mod loaders 
anyhow I have stated my current opinions which are predicated on what we do wrt version range annoyances. feel free to poke me again if there's any meaningful decision that may impact my opinions :P
I'd worry less about how feasible implementing that is and more about whether neoforge wants to bother shipping it's own system for it
Because it's obvious that it's feasible
Because yeah, other modloaders do it
If people wanna go down that road then go ahead
But it's not an easy feat compared to maven version parsing
Sure you've done it before, but with a lot of long regex queries
To be clear I'm not against adopting semver, I'm merely pointing out that it's harder to implement properly than maven
And that suggesting it's as easy as importing the first random lib you find on Google is ignorant
What do you mean by testing?
Semver version range parsing
Fabric is 0ver anyway
That's not really relevant here though
and not nice to say to modmuss directly
Fabric is 0-ver, latest is 0.87 or something. But not sure if he meant that or "over"
I haven't touched modding in general for a while so I wouldn't know
It's an actual thing: https://0ver.org
Software's most popular versioning scheme!
then my bad
It's not your fault at all for not knowing. 😂
Yes it's zero ver lol, not "over"
From the about page 
ZeroVer is satire, please do not use it. We sincerely hope no project release schedules were harmed as a result of this humble attempt at programmer humor.
So in my experience NuGet has pretty good version handling and parsing, maybe it would be worth looking into how it parses versions to base a custom solution on?

👀
Oh no, fancy math symbols
∉ means not element of

smh, not using actual words
1.20.2-beta vs. [1.20.1,1.20.2) ?
@remote apex
in standard maven versioning 1.20.2-beta ∈ [1.20.1,1.20.2)
wait for latest commit to be built, update the bot and try it yourself

since maven versioning only cares about ordering and not compatibility
too busy with regexes

that's semver
oh didn't look at the command 
1.0.0+a < 1.0.0+b
can we convert the maven ranges from the mods.toml to semver ranges internally and use semver from there on?
2.0.0+alpha.1 ∉ [1.0.0,2.0.0)
but
2.0.0+alpha.1 > 2.0.0
Why?
2.0.0-alpha.1 ∈ [1.0.0,2.0.0)
so we don't need to change the mods.toml format but can use semver comparison
2.0.0-alpha.1 ∈ [1.0.0,2)
So, has floating versions like this been considered? This could allow neoforge to be versioned something like 193.1.x where 193 = MC 19.3, 1 = first release for 19.3, x = build/bugfix/etc
It also allows the use of metadata to indicate prerelease versions, which mods won't pick up by default unless they opt-in
what about snapshots?
I imagine they would work using the next available minecraft version with release metadata to indicate which snapshot
so, 194.1.x-snapshot.snapver
but we don't know if a snapshot is for a minor or a major
we don't, but snapshots tend to not last very long either, and I imagine they're mostly used for development anyway
not if we get froge up and running
alternatively, you could keep them on the same version, so 193.1.x-snapshot.snapver for a snapshot ahead of 1.19.3
since it would be the "next release" you could also possibly bump the second digit too
it's possible that multiple mc versions could match up but I can't think of any off hand where that would be the case, at least with two digits
but take 1.7.10 for example that would be 710 which is higher that 193
Okay, but if we're pinning users to 193.1.* then that's not an issue; it's only an issue if you're asking for the * version, which you shouldn't
The only real issue I would see with something like this is if Minecraft releases 1.71.0, which would conflict with 1.7.10 under this versioning
However, I'm operating under the assumption that neoforge won't backport so it shouldn't be an issue for the most part
making assumptions, are we?
And if that really is a dealbreaker, the versioning could be mcver.mcver.neover-snapshot.snapver, so for example 20.3.1 for the first release for 1.20.3, or 20.3.2-snapshot.23w35a for snapshot 23w35a against the latest version 20.3
The biggest issue with that is that you've gotten rid of the biggest opportunity to use floating versions
so I can't say that I'm compatible with any bugfix versions of neoforge for a given minecraft version
there was an argument made to not use the mc version in the actual neo version but only in the meta to have it in the download filename
I suppose that works
the main thing we need to decide on is what the 3 numbers should stand for and how the alpha/beta markers should be used
for that I had this proposal
then in that case, we should just have major.minor.bugfix, where:
- major = breaking changes in neo (caused by minecraft or neo itself)
- minor = new features or minecraft versions (e.g. mc1.2.3 vs mc1.2.4 or neo adding a new convenience api)
- bugfix = a number incremented for every bugfix
and for prereleases: snapshot.snapverfor snapshots (e.g.snapshot.23w35a)rc.rcnumberfor release candidates (e.g. when a new Minecraft version drops and we think we're almost stable)beta.betanumberfor nightly builds (builds when main is committed to)alphafor dev builds (in IDEs and the like, or maybe for PRs)
and for build metadata:mc.mcverfor minecraft versions (e.g.mc.1_7_10ormc.1_20_1)sha.hashfor build commits (e.g.sha.0974ecc)dirtyfor dirty builds (in IDEs and the like)
careful snapshot, rc, beta, alpha would compare lexically
also snapshot is not a good idea because maven handles that different
Maven specifically handles the -SNAPSHOT version suffix, iirc
the thinking here is that:
- snapshots aren't stable so they're an important part of the version
- we'd likely want builds going out for full testing
- we'd also want to build main to make sure it succeeds and allow testing against these in-flight versions
- we'd want to distinguish dev builds, these should never get published to maven
- we want the mc version in the build metadata so it's in the filename
- we want the sha in the build metadata so that if a user reports a bug we have an exact commit to start searching from
- we want the dirty status in the build metadata so we can tell if the build was clean
the goal is that this metadata can be combined to some extent, so for example, 1.0.0-snapshot.23w35a.alpha+mc.1_20_3.sha.0974ecc.dirty would be a full version number
I think maintainer controlled versioning was something that is not wanted
so it should all be done automatically
I personally really dislike that idea because it makes it a lot easier for breaking changes to sneak in to supposedly stable versions
I want maintainer-controlled versioning
I don't know the opinions of the others on the team, except perhaps Curle
I would gladly support writing tools and automations to make the release management a lot easier
words require language, math is the universal language
Go use Minecraft enchantment table language
In my mods, I use manual versioning. However, I think auto versioning makes a lot of sense for neoforge. Every change gets a build. It also means you can easily identify what commit broke something. But being able to disable builds for things that don't change the final output would be beneficial. Especially when GitHub has features now to merge queue multiple things at once, I don't think it's much of a concern to use auto versioning
thats just the standard galactic alphabet with magical sounding words
Yeah, that's the goal behind the -beta versions, so you still get builds for every change, but deciding what goes into a full release is still a manual effort
But it's not beta
(and when to make that release)
it's "beta" in that it hasn't been fully tested
It should be
that's why my proposal exists
anything that makes it to the main branch after breaking change period should not be reverted unless extreme circumstances

doing a full test on every PR isn't really feasible, especially considering that some PRs may interact with each other
As I see it, if we use manual versioning, the # of commits will just double... As we will just be spending half the time bumping a number cuz we want things to build a version
It is definitely feasible. This is a systemic issue that requires us to work on both our automated and manual processes
having to test inter-PR functionality is understandable but it should still be fully tested
the merger takes on any responsibility of issues
by "full test" I mean something like forgecraft 😛
the idea would be that something like forgecraft would use the -beta builds to test and develop against
no, I was using it as an example of what I meant
I would prefer we get it right the first time
that's never going to happen, you should know this by now 😛
the whole point behind my proposal is that we're accepting that we won't always get it right and designing in checks to allow us to spot and fix these problems before it goes out to users
Why not just use the actual snapshot name for the snapshot field? And what about April fools
And what about pre releases and RCs
and there needs to be proper tooling to make the release management a lot easier so there's not "bump version" commits
And how does it sort
because we could have more than one builds during one snapshot
I also understand and accept that we won't get it right. But tbh we should be getting it right enough that it makes beta versions and manual releases not a concern.
That's not what I meant
you are suggesting keeping an int count of the snapshot # we are on
they are just differently named snapshots
but idk why vs just using the actual snapshot name
we could use that but a version under that would look like this: 1.0.0-alpha.23w35a.1+23w35a
ah fair enough
I think the problem is wouldn't any version suffixed with -beta and -alpha be sorted after the original version?
I guess you would have to bump the patch version after a -beta or -alpha cycle
maven or semver?
There's no winning because either beta and alpha get sorted before the base version and then you're fucking over version ranges or it's sorted after the base version then you have to delete the suffix and bump the number
maven I believe
If we tell people to use semver, a la 1.2.* then yes, prerelease versions are not included. I'm not 100% sure how gradle would deal with it, but we could likely add tooling to use semver versioning for downloading neoforge through neogradle
Are we talking BC period or snapshots now?
let's not write more custom dependency resolution please
Snapshots could be alpha or pre releases, but I'd rather keep clean numbers for normal mc version releases
elaborate
if I understand correctly, the version that somebody downloads just to play with mods should look like 1.2.3+mc.4_5_6
more like neoforge-1.0.0+1.20.3.jar
yeah, something like that
What if:
Non-snapshot builds
Use x.y.z as the version:
- x is a number indicating the Minecraft version
- y is 1 in the breaking change period and always 2 after
- z is the commit count for the x.y series
- the concept of recommended builds disappears, and instead we only have latest
Snapshot builds
Same as before but y is set to 0.
Alternatively, x.{0,1}.z for non-snapshot and x.0.0-pre.<snapshot name>.<some commit count>
Most importantly we keep the automatic versioning
And we keep things dead simple...
always have been
so, the first snapshot build for 1.20.2's prereleases would be 1.20.2.0.1
I was thinking 48.0.0
I honestly really dislike the whole concept of the "breaking change period", because it discourages making major changes until the next minecraft version where the changes you're making don't even make sense
I've said it before and I'll say it again: my biggest gripe with the current system is that middle digit and if we're changing anything we should change that. The "0 is BC window, 1 is RB" setup makes no sense, honestly
Monica that's not gonna change. We must keep the versions stable past some point
I dunno, it makes sense to me 🤷♀️
you better be joking
That's not true at all, you can easily keep making breaking changes as long as you bump a version number indicating that you've made a breaking change
It should be obvious at a glance that a BC window build is not stable and that a post BC window build is stable till the next BC window
yes, and the middle digit is what we use to indicate that it's a BC window build
No, you can't, because then you break random mods that thought they would be stable for the rest of an MC version. Not every mod dev has enough free time to update their mod multiple times per MC version...
Just look at what happened when the license field got added - was that back in 1.12?
no, after that
Then they stay on the old version of neoforge, I don't see the problem?
1.14 or .15 or .16 was the license field
then users get annoyed because some mods only work with 1.20.1.2.x and some mods only work with 1.20.1.3.x
Mods pre that version and mods post that version don't work together though they have the same MC version... You're making the existing problem of mods on different MC versions far worse by adding a new variable
that's already the case though ¯_(ツ)_/¯
Yes but the meaning of that digit isn't obvious just from looking at a version string. At least with prereleases I can make a damn good guess at what it probably means
It's not though? Not post BC window
but it's not? as it stands with forge throw any 1.20.1 mod in and it will probably work...
Post BC window basically everything will run on latest
I really really dislike the ambiguity in having the middle number be a boolean for snapshot that is what pre release markers like alpha/beta are for
That's exactly what I'm saying
Is the only worry with using prerelease versioning for BC window stuff that it'll be included in the wrong range for maven versions?
If that's the case why don't we change the mods.toml spec to use something more sensible than maven version ranges that allows blurrier edges?
The system fabric uses is pretty clever for this sort of stuff though there's any number of potential solutions
They use a sort of semver version range, yes
my idea is convert the maven version range to a semver range and use that to match
That wouldn't work
why not?
The semver version range >=3.0.0 <4.0.0 still contains 4.0.0-alpha
You need to use the different types of semver version ranges
An exception was thrown: Invalid version: >=3.0.0 <4.0.0
What I would instead allow is the use of 4.0.0- in maven version ranges
Semver versioning: 4.0.0-alpha ∈ >=3.0.0 <4.0.0
Where that versioning is a special prerelease that can't exist, and is before all other pre releases
Note that the bot's semver parsing has a lot of known bugs atm...
The other option is the, like, ~ prefix on semver version ranges or whatever else it allows
An exception was thrown: Invalid range: >=3.0.0 <4.0.0-
Semver versioning: 4.0.0-alpha ∉ ^3.0.0
There you go, there's a solution
Whatever you're using doesn't obey semver then
Because with semver, prereleases are still before actual releases
From semver.org:
When major, minor, and patch are equal, a pre-release version has lower precedence than a normal version
but they are not included in the range that is the difference between maven range and semver range
They are included in the range...
It's almost as if semver is hard to fully implement correctly and has varying opinions and bugs...
That range means >=3.0.0 and <4.0.0. Prereleases obey that, according to the semver rules of precedence. It's that simple
such as?
There exists other tools, like the ^ and ~ prefixes, for comparisons that have fuzzy upper bounds
I showed you two immediately after you updated the bot
yeah those aren't bugs you tried with invalid versions
the problem is that if I want my mod to depend on norge [3.0.0, 4.0.0), then I don't want it to be used with prereleases for 4.0.0, so we cannot use semver semantics
Apparently 1 - 3 not containing 2.1 is not a bug now
1.0 is an invalid semver version
And 1.0.* not containing 1.1.1 is not a bug either
Yes we can. The semver semantics for that range are ^3.0.0
An exception was thrown: Invalid range: >=^3.0.0
again you tested with 1.1 which is an invalid version
Semver versioning: 4.0.0-alpha ∉ ^3.0.0
why are we even using semver
Semver versioning: 3.0.0 ∈ ^3.0.0
An exception was thrown: Invalid version: 2.1
Maty...
Semver semantics. We've said nothing about using strict semver for the versions
No quite
The bot is correct though
It's >= on the low end, yes
3.0.0 is equal to or higher than 3.0.0
But yeah, allowing caret ranges solves the issue with using prereleases quite handily in my mind
You're telling me 3.0.0 is not included in >=3.0.0 now maty...
wut are you on about mate
Paint the bot said it is included...
If someone wants a weirder range, they can use multiple ranges: >4.2.3 <=5.0.0, ^5.0.0 gives you stuff from 4.2.3 till 5.0.0 prereleases
My bad, I didn't see the cross through the symbol
I'm used to == and =/= kind of format
An exception was thrown: Invalid range: >4.2.3 <=5.0.0, ^5.0.0
Does the bot support multiple ranges?
I'm guessing not from that
But that's a simple "or" so not the hardest part to implement
Ah, makes sense
https://www.npmjs.com/package/semver the grammar and spec
Semver versioning: 5.0.0-pre.1 ∈ >4.2.3 <=5.0.0 || ^5.0.0
Uh, wait, wrong range
Semver versioning: 6.0.0-pre.1 ∉ >4.2.3 <=5.0.0 || ^6.0.0
Wait wrong again... Gah
An exception was thrown: Invalid range: >4.2.3 <=5.0.0, ^5.0.0
Semver versioning: 6.0.0-pre.1 ∉ >4.2.3 <=5.0.0 || ^5.0.0
I see you're having a great time with your clipboard
That's the comparison
Basically, that range means "4.2.3 till 6.0.0, but no 6.0.0 or prereleases of 6.0.0"
And is pretty easy to express, especially if you're not on mobile and keep hitting the wrong keys
I mean can't you also >4.2.3 <6.0.0
No. That includes 6.0.0-beta
hmm right
That's the same issue as maven version ranges. Semver version ranges solves it
Semver versioning: 6.0.0-pre.1 ∈ >4.2.3 <6.0.0
But that's why you can't just change the semantics of maven version ranges and call it a day
You need to support caret ranges. Which are a proper solution for this
well
Maven versioning: 2.0.0 ∈ [2,3.0.0-a)
I'd also say go with flexver, not semver, which can have any number of components
Maven versioning: 3.0.0-beta ∈ [2,3.0.0-a)
I believe alpha and beta have special cases
Solution, do a community wide poll on neoforge versioning!
Maven versioning: 3.0.0-beta ∉ [2,3.0.0-alpha)
What can go wrong
Maven versioning: 3.0.0-alpha ∉ [2,3.0.0-alpha)
I mean that works
I'd say caret ranges are more elegant, but yeah, it's technically possible
Maven versioning: 3.0.0-alpha.1 ∉ [2,3.0.0-alpha)
tho
...which means imo there's no excuse not to use pre releases for BC window stuff
huh
that should be smaller 
lovely
the biggest problem with flexver and semver is that their spec only defines how to compare versions
not ranges
When would you even compare ranges? Like, intersections/unions of ranges?
Turns out you only need to know how to compare individual versions for that one
no i mean the range spec
Oh sure. Yeah, but go with a spec of a standard implementation (the one on npm for instance) or one used in the modding world (fabric/quilt's solution) and you're good to go
how semver compliant is fabric. does it require exactly 3 components
I think they allow more/less than 3
Which we'd want to too
Because this needs to consume mod versions
And not all of those have exactly 3 components
... honestly, I'd be happy if neoforge did: x.y
- x is the major version, updated once per MC version.
- y is the number of commits since the end of the BC window
- add -pre.z for BC window or -alpha.w for snapshots
Could add a third digit if you wanted to too, of course, or add a +mc_version to clear stuff up too
And then use either what Maty showed with maven version ranges or caret ranges to exclude the prereleases from the range in a mods.toml
I'd say BC is more like beta but yeah
for carets we do pmuch have to switch to flex/semver
Yes. I'd say that's a decision to be made - whether to stick with maven ranges or not. This is only about the ranges, though, and has no impact on the actual version scheme we pick
As this demonstrates
i personally think asterisks like in #1137179119713529876 message would be better
Oh sure semver version ranges support something like that too I think
Hmm, what was it...
Semver versioning: 6.0.0-alpha ∉ 5.x
That's it
or *
So if we switched to semver version ranges we'd get both, basically
Semver versioning: 1.19.3 ∈ 1.19.*
yeah
biggest problem with semver is that the spec wants exactly 3 components
yes but that's not semver
I mean. Strict adherence to specs will only cause us pain in a world where we're modding a game
there's also NuGet versions which can support four components as well as the rest of semver
Might as well use flexver at that point though, which has arbitrary components
(the nuget grammar is identical to semver versions except it accepts an optional leading digit for compatibility with older .NET stuff which used the four digits, most stuff uses three digits now)
we should create neover
Honestly? If we don't just stick with maven ranges, whatever solution we use to parse versions and version ranges should be bundled as a separate library and distributed on maven central, and should have a written out spec, yes
But if we do stick with maven ranges that "alpha comes first" thing actually saves us and means we can still use prereleases for BC window just fine
yes can we please not have the loader contain the versioning code 
Yeah, that's kinda why I was proposing nuget's solution since it's already fairly well-established and understood by people
And also has the extra digit so we could do 19.4.x.y for versions if people really want that
Yes but "exactly 4 versions" isn't good when people definitely use, like, 2 or 5 or stuff. We can't break existing versioning schemes of mods. Any version that is currently a valid mod version, should keep being one. And as currently that's any maven version, we need to support that
We can't constrain versions in a way they're not already constrained
considering that we're making breaking changes for the next MC version, moving to a different versioning scheme seems like it would be fine, especially if it means in general version checking is more consistent ¯_(ツ)_/¯
No. Breaking changes force others to update. Breaking a versioning scheme... What do they even do? Now they have to break version continuity. That's more than just a breaking change
.NET did just that and everyone managed fine 😛
Neoforge isn't .NET. Frankly, I see no reason to limit versions to "exactly 3 or 4 components" if we're not forcing strict semver, which would be a bad idea anyways.
If we're already allowing 4 components, might as well just make it arbitrary so it works with all versions that currently do
Let's keep maven versioning since it's been used for some time and works fine
The intent of semver is to get a message across regarding the kind of changes just by looking at the version. In the context of Neo, this message is worthless because we ask users to always use the latest Neo version for a given Minecraft version
Yes everyone is used to semver, however you have to understand that it solves a problem that is not relevant to Neo at all
Now, I think 0/1/2 minor version for status is fair enough since it has the most important property of being increasing. The question is how we choose the major version
We could probably do 1902, 2001, 2002, etc
I think we should keep maven versioning, so 1.20.2.0.1 is not usable
But 2002.0.1 would work
I think 48.0.1 is also fine, maybe as 48.0.1+1.20.2 if we want the mc version in the artifact
We can keep maven versioning and still use a prerelease for BC window...
And frankly I see no reason not to do so given that a prerelease is kinda the intended method, in both maven versioning and semver, of communicating exactly this thing
See: #1137179119713529876 message
The version range issue isn't really an issue as maven puts alpha as a special "first" prerelease
Pre releases are extremely awkward to use. We moved away from them in AE2 for that reason
Why are they awkward to use?
They, semantically, get across the information in question far clearer than using the middle digit for that does
Maven versioning allows more than three components though
Does it? I thought it was 3 numbers and a patch
It's easier to use shorter versions, basically
Semver is not useful for our users
to fix those issues this seems to be a good proposal (since it starts the patch version at 1 to prevent non stable from matching)
we just need to strip meta manually before matching to ignore it
but I still think we should use alpha and beta flags instead of a number meaning the same thing since it is easier to understand for the people that have not read the version spec
So what's the current TL;DR about versioning? I was busy this afternoon
also, I don't expect anyone to use it, but I did write this this afternoon. (No that's not why I was busy lol)
https://github.com/gigaherz/Versible
Supports intervals, comparison operators, and wildcards.
It's designed for consistency instead of intuitiveness, so: 2.0-alpha < 2.0 < 2.0.0-alpha < 2.0.0 (yeah 2.0 != 2.0.0 in this library, I expect people will hate that with a passion but it fixes the consistency)
TODO: make the parsing tests more thorough, especially invalid inputs, and I have to finish writing javadocs
Christ that sounds unintuitive. And somehow is different from both maven and semver conventions
I'd say people can just specify the maven range [1.2.3, 2-alpha) to miss out on any of the snapshots, because maven treats alpha special and shoves it first
Or use semver ranges instead with caret ranges or wildcards
This does also mean that 2.0 != 2.0.0 though which is... Inconsistent, I'd argue
no that's the whole point, it makes the whole thing more consistent, at the cost of intuitiveness
The existing stuff is consistent though?
It's just unintuitive
And limited
I disagree, having 2.0-alpha included in [1.0,2.0) is not consistent with the numbering
Yes it is though. It's consistent with interval notation and natural ordering of versions
It's unintuitive, yes
But at some point you're arguing semantics
we disagree on semantics, then
But regardless I don't see the benefit your system would bring over semver ranges
Which allows the same thing with less... Funkiness
anyhow I know people will hate that. I knew it before I started coding. but I wrote it regardless because IMO, it's the better solution.
so I offer this solution to the world. will the world take it? probably not. that's fine. I just want it to exist.
but really, despite 2.0 != 2.0.0, the ranges work intuitively in almost every possible case, and perfectly match the definition of the intervals
every unique value of a version has a place in the line
tomorrow I'll write the readme and javadocs, so that people can understand my rationale and all the details about what the design implies
That's fair. Personally, I'd say that either sticking with maven ranges or using semver/flexver ranges would work fine - after all, this issue isn't really an issue with either of those two (due to the solution for maven ranges of just bounding based on the first possible prerelease). I'd definitely say that neo's versioning should use prereleases though
We're not gonna use custom version parsing / comparison code
I'm a bit worried that an impractical versioning scheme will be chosen just because "semver good, everything else bad"
Yeah, frankly I feel at this point we should just do x.y.z+mcver style versioning where we bump major on breaking changes and minor.patch can be whatever (new features, build number, whatever)
i definitely very much want the first number to change whenever there's a breaking change that is important for me to look at
(like if the capability or registry stuff goes in separately, i want to make sure i don't have a mod that claims to be compatible but is in fact completely broken)
I forget, why can't we just do 48.0.1
yeah, I will repeat what I think should be the minimum requirements for versioning:
- breaking changes = major version bump
- in-dev / stable should be differentiated somehow (I don't care how)
- monotonic
the things I want from the versioning scheme:
- mc version in non significant part (so it shows up in artifact file name)
- NO version information in the artifact name
- it needs support the possibility of froge releases (releases for snapshots)
- it needs to support a BC period that is clearly visible in the version (no prior information needed)
forge's versioning scheme fits all 3, except in-dev is flagged with .0 which is not easy to figure out by users that don't already known
because we are introducing breaking changes between us and mcf
that doesn't really matter IF we change the modid to neoforge
that feels like a non-sequitur
yeah, breaking.x.y[-alpha/beta/rc/whatever]+mcver
which IMO should be a hard requirement
honestly i want the versioning to restart at 1 too, because it lets us make things clearer
I don't think neo should release for 1.20.2 with the intention to break forge compat, and still use "forge" anywhere in its metadata
though since forge/neo use the same loader (mostly) i can see wanting to keep the loader version the same
agree
assuming the loader is still compatible, it should use the same versioning as forge; if it's also breaking then it should start at 1
so, if we go for forge versioning and continue from 48 (with neoforge modid), I'm good.
if we pick 48.0-alpha.1 I'm also good
do a community poll for versioning~ Totally will work out just fine! (joking)
if we restart with either format, I'm good
yeah, my wishlist is:
- major version = indicator of breaking changes
- minor/patch version = whatever, could include the build number
- prerelease identifier = alpha/beta/dev/whatever
- metadata = minecraft version
i'd probably do minor = recommended builds, where 0 = "we're still soliciting changes for this version" and >1 = "we've pretty much settled on the final api for this version"
the minor may necessitate bumping if there are minor additions (like for example a new api which makes certain use cases easier, but is technically possible without it)
Yes please
why? we are a new project
we don't have 47 prior releases
we don't need neo 48.0.3 and forge 48.0.3 to coexist with entirely different apis
yeah, restarting versioning from 1 makes it very clear that it's a different project with different goals to me
and is very much not compatible
wouldn't that cause problems when we get back up to 47 again
or do we just pull a Windows 10 and skip it
i mean, yesn't
We're also a fork
There's no good reason to not continue with the versioning, IMO
What if we ever decide to continue an old version? (Unlikely but still)
yeah, backporting is probably the one major reason why we should continue with the current version numbering
personally i don't see much point in that endeavour but i'm not everyone
nah, because currently we use forge id, and we should switch to neoforge when restarting
we shouldn't be using net.neoforge.forge either way, but specially not if we restart
"we should" without any argument to back it up 🤔
Honestly, I think that x.y[-alpha.a][-beta.b]+mc is not a bad solution
x bumps on MC versions, y bumps per commit
maybe we could do 1.0-beta.1 as the first version
a and b are for snapshots and BC region stuff
That's what I'm proposing, yeah
there's also the possibility of moving older versions to an "archive" maven so they're still accessible, but wouldn't "conflict" with regular versions
yea this looks good
the argument is simple: it is morally wrong to call neo "forge", when we are no longer compatible with forge.
so basically my proposal but with 2 instead of 3 components
the argument is that mods on CF are depending on forge 47.1.<whatever> when they actually depend on neo so the mods won't be usable on forge with no indication
and that too
we're not forge and we don't have the same api as forge
it's like ae2 calling itself refinedstorage
The way I see it it's more like ae2 calling itself "ae"
Changing the modid makes sense
We should change the modid
But we don't need to restart the versioning
actually if we backport neoforge it's probably gonna have to use the forge modid/artifact for compatibility anyway so it's not like it'd be an issue 🤔
remember, people can do this to be compatible with both loaders, only if we change modid ```toml
[[dependencies.mod1]]
modId="forge"
mandatory=false
versionRange="[48.0.17,49)"
[[dependencies.mod1]]
modId="neoforge"
mandatory=false
versionRange="[48.0.5,49-alpha)"
Is there a reason not to restart versioning if we're already changing the mod ID?
Like, it's a new thing
continuity
So it should have new versioning
suppose we choose to support 1.19.2
continuity with what though? 😛
what version do we call it?
old times /s
Ah, that's not a bad point
it's also not necessarily one we need to think of
Okay, so the first release for 1.20.2, under my proposal, would be 48.0-beta.1+1.20.2 then
Though honestly I still think restarting versioning is easiest
old versions have been mostly dropped and by the time we decide on deving on an older version IF we do people have moved one
If we're backporting stuff, that'll probably be a special release cycle anyways
There's a good thing to argue that the 48 represents the version of Minecraft that it's built for (1.20.2 being roughly the 48th release)
So we could just, like
Move that into an actual part of the version
That would be easier if minecraft stuck to a somewhat normal versioning
Yeah, I feel that if we're backporting we'd probably have to use the forge modid, or something like neoforge-legacy-119
someone suggested 1.20.2.x for neo builds but I find that horrible to look at :P
that number is probably off by like 10 at this point
But what about 20.2.0-beta.1?
let's see how off it is actually
Then, say, for MC 1.30 you'd have 30.0.0
the issue is .2 feels weird since it's still a major break XD
Yeah, I agree
But hey, we don't need to follow strict semver
Just, like, "makes enough sense" versioning
Proposal
- artifact-name/modid:
neoforge - version:
x.y+mcx= breaking change from mc/neoy= build number after release-beta.badded in breaking change periodb= the build number inside the breaking change period
-alpha.aadded for snapshot versionsa= the build number inside snapshot versions
mc= minecraft version
so I still prefer either full restart and bump on breaking changes window opening
or we continue with forge's versioning
the rest I feel is nitpicking and whatever I don't care enough
I'd say go with this, and then one of giga's two optins (so x is either 1 or 48)
On the backporting stuff, what if somebody made a single jar mod compatible with 1.18, 1.19 and 1.20? how would they specify the completely incompatible "forks" of neoforge that would exist for each version? I feel that would have to be a separate modid
also since we are not doing snapshots, and if we ever do them odds are it's better to use a different artifact id,
IMO we should use -alpha for in-dev porting, such as the case for 1.20.2 neo which will release with missing major breaks
so the release for the pre1 version would be 1.0-alpha.1+1.20.2-pre1
no point reserving -alpha for snapshots
Sure. As long as we also have -beta for BC window
yes, -alpha for "we are still porting stuff", and -beta for "all the breaking changes that were approved by the community, have been merged"
No reason you couldn't use -alpha for snapshot and in-dev. Like, especially if you add the +MC-version to the end
that's very roughly, there's 81 releases of mc
lol
Personally i dont really like +mc, but i have no solution other than mc-
Close enough

Keep in mind some versions were stable for many years
so TL;DR from me: do whatever you want, but change the modid please :P
yeah so we don't need to break the stability and introduce neo for 1.12
The interval between updates prior to 1.7 averaged to like, 2 years
That's Forge updates, not Minecraft
the +mc is so that it doesn't factor into the version range algorithm, but is still in the jar downloaded by users so they can tell which version they're using/downloading
basically balancing what's convenient for modders vs what's convenient for users
(modders specify their minecraft versions in a different way)
Currently, don't we only have the mc version in artifact names? how does +mc benifit us over mc- the way its been for years (speaking of making sense to users)
IMO the mods.toml version for neo should exclude the +mc part
it should only be in the maven release for metadata purposes
iirc it always has excluded the mc version
yeah, anything after the + is ignored
I think someone said maven does NOT ignore it?
it does factor into the version range
makes sense
Maven versioning: 1.0+a < 1.0+b
but still
Maven versioning: 1.2+abc ∈ [1.2,1.3)
so it works for basically all use cases
Maven versioning: 1.2+abc ∈ [1.2,1.3-alpha)
yeah it's basically about getting rid of having to specify the minecraft version everywhere, since i assume requesting neoforge 1.2.3 will accept 1.2.3+1.20.2
I have no idea if maven (gradle maven support) allows specifying a version without the +tag
Maven versioning: 1.0+a ∉ [1.0+b,)
But you already dont have to specify the mc version everywhere with mc- as its only in the maven artifact names, moving it to +mc, and still excluding it from the in-game version number does nothing different than the current system
it has to be specified in the dependencies section of build.gradle
How do you specify a dependency on a version range accross MC versions?
and?
I mean we could exclude mc in the interna lversion
In gradle too
Moving to +mc does not solve that problem.
modstomlversion = NEO_VERSION
mavenversion = MC_VERSION + "-" + NEO_VERSION
would work fine really (I mean it's literally how forge does it and has been doing it for ages)
metadata is ignored in version ranges - that's the point of it
Dependencies in mods.toml already dont require the mc version, so im not sure what your point is here. In Gradle, you will always have to specify the mc version
Why is the MC version required in gradle? Why can't we just move it to metadata, so that the gradle version and mods.toml version line up?
Like, for forge in gradle I have to specify 1.20.1-47.1.75 or whatever. Wouldn't it be better to just have 47.1.75+1.20.1 everywhere and have the same versioning scheme everywhere?
How does that change anything though, Your still specifying the Minecraft version.
Yes but the version in the mods.toml is the same as the version in the gradle file
I don't have to separately track a "forge version" and a "MC version". I only track a single, unified forge version
Except you wouldn't because remapping pain
and always use the latest neo version 
But basically, you currently have to specify, separately, two things that are really the same thing
So if we could unify that, is there really a reason not to?
Like, I'll turn that back around on you: why does using 1.20.2-whatever change anything as compared to using whatever+1.20.2?
Do you have any documentation references that you can site for +blah being a tag, ComparableVersion and DefaultArtifactVersion, the stuff we use for parsing dependencies does not support excluding +asdf from the comparison
I think covers point is that it literally doesn't change anything - it's what we use now
^
Its just moving it for the sake of moving it
it does literally nothing
If anything, it would confuse end users, as Forge, the thing they have known how to download for years, now suddenly has different versions. The masses are not smart.
but that doesn't work for mods the idea was to be an example for mods but for mods that special casing with the mc version on the fron does not exist
? what special casing?
Forge does not special case anything with versions, it literally just does not prepend the mc version in its mods.toml
It's not though?
in my mods.toml I depend on forge 47.1.3. In my gradle stuff I depend on forge 1.20.1-47.1.3
I'm saying whatever we do those two should be the same
And the easiest way to do that without weird side effects is to move it to metadata
version in build.gradle = 1.19.2-43.2.0
version in mods.toml = 43.2.0
If you use metadata, you can do version range comparisons without the metadata
So it's not necessary in the mods.toml
but for mods it would be:
build.gradle = 1.19.2-1.0
mods.toml = 1.19.2-1.0
from my worldview, in my build.gradle I depend on forge 1.20.1-47.1.3, in my mods.toml I depend on minecraft 1.20.1 and forge 47.1.3
so... they are the same number
But if you add it it's still all valid
Nothing i have seen with maven versioning, mentions anything to do with metadata, i have asked for citations, and have received nothing
please cite
loaderVersion="[${lang_version},)"
[[dependencies.mod1]]
modId="forge"
mandatory=true
versionRange="[${forge_version},)"
ordering="NONE"
side="BOTH"
[[dependencies.mod1]]
modId="minecraft"
mandatory=true
versionRange="[${mc_version}]"
ordering="NONE"
side="BOTH"
processResources {
filesMatching('META-INF/mods.toml') {
expand 'mc_version': forgeVersion.split('-')[0],
'forge_version': forgeVersion.split('-')[1],
'lang_version': forgeVersion.split('-')[1].split('\\.')[0]
}
}
magic
maven doesn't have metadata https://docs.oracle.com/middleware/1221/core/MAVEN/maven_version.htm#MAVEN8905
https://semver.org/#spec-item-10 is how this is used in semver. Maven treats them a bit differently - notably, if you do an exact version comparison you need them but they're considered to be above the base version, so they fall witihn version ranges, unlike prereleases. See #bot-commands message
If maven does not support it, i think the entire argument of using it is moot
...I just said maven supports it
They just treat it slightly differently
In a way that still works for us
^
But not as a prerelease
Which is important
And makes it useful
Because qualifiers will still work fine with version ranges
See #bot-commands message for another good example
Unlike the current system, this would let you have a single, unified version which:
- can be compared against version ranges specified with or without the MC version
- contains the MC version
- still allows for
-betaand-alphastuff - doesn't leave you with two different neoforge versions in two different places
There is no reason that the neoforge artifact should have a different version than the neoforge mod
Why does NeoForge need to declare the mc version as part of its dependency, when we have the minecraft mod. If this were to be used for that, and we could do partial versions PLUS the mc version depdency purely with the neoforge version, i'd see the benifit. I see absolutely no benifit to this over the current system, besides the few people who do not build-time replace their mods.tomls
Your entire argument is hinged around having to declare it in 2 different places, the solution to that is: instead of still declaring it in 2 places, declare it in one and auto-gen the other. This is simple gradle stuff. That snippet i pasted above works, dev time and release time.
My argument is not about having to declare in in two different places. It's about having two different versions. Any comparisons and checks I do in terms of versions at compile time are inherently wrong to do at runtime with the current system
Additionally, why should I specify both a MC and a forge dependency in my mods.toml when the forge version determines the MC version present?
Seems redundant to me...
Especially because I only ever depend on a MC version in dev by depending on a forge version
So what I'm actually depending on, at runtime, is "this forge version and the MC version it comes with"
because you generally declare a [34.23,) dependency on Forge, which, if you dont declare a [1.19.2] dependency on Minecraft, means Forge will attempt to load your mod on newer incompatible versions
using tags does not solve that
Sure. Why not declare a single [34.23,35-alpha) dependency on forge instead?
Especially as most people don't use a [1.19.2] format dependency
They use [1.20,1.21) or [1.19.2,1.19.3)
Well, that'd be invalid anyway
Cause that's what the MDK does
Hmm? which one?
Which leaves the endpoint open just like covers was trying to avoid