in openapi-diff/src/modeler/AutoRest.Swagger/Model/ServiceDefinition.cs [405:459]
private void CompareVersions(ComparisonContext<ServiceDefinition> context, string newVer, string oldVer)
{
var oldVersion = oldVer.Split('.');
var newVersion = newVer.Split('.');
// If the version consists only of numbers separated by '.', we'll consider it semantic versioning.
if (!context.Strict && oldVersion.Length > 0 && newVersion.Length > 0)
{
bool versionChanged = false;
// Situation 1: The versioning scheme is semantic, i.e. it uses a major.minr.build-number scheme, where each component is an integer.
// In this case, we care about the major/minor numbers, but not the build number. In othe words, ifall that is different
// is the build number, it will not be treated as a version change.
int oldMajor = 0, newMajor = 0;
bool integers = int.TryParse(oldVersion[0], out oldMajor) && int.TryParse(newVersion[0], out newMajor);
if (integers && oldMajor != newMajor)
{
versionChanged = true;
if (oldMajor > newMajor)
{
context.LogError(ComparisonMessages.VersionsReversed, oldVer, newVer);
}
}
if (!versionChanged && integers && oldVersion.Length > 1 && newVersion.Length > 1)
{
int oldMinor = 0, newMinor = 0;
integers = int.TryParse(oldVersion[1], out oldMinor) && int.TryParse(newVersion[1], out newMinor);
if (integers && oldMinor != newMinor)
{
versionChanged = true;
if (oldMinor > newMinor)
{
context.LogError(ComparisonMessages.VersionsReversed, oldVer, newVer);
}
}
}
// Situation 2: The versioning scheme is something else, maybe a date or just a label?
// Regardless of what it is, we just check whether the two strings are equal or not.
if (!versionChanged && !integers)
{
versionChanged = !oldVer.ToLower().Equals(newVer.ToLower());
}
context.Strict = !versionChanged;
}
}