From 40dbb0ffaf1f4d0238c6bc51bf2c2cb491d79828 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Tue, 31 Dec 2013 04:54:57 +0100 Subject: [PATCH] Ignore prerelease versions if possible, fixes #1017 --- lib/util/semver.js | 8 ++--- test/core/resolvers/gitResolver.js | 49 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/lib/util/semver.js b/lib/util/semver.js index 124ab0f5..d0a19535 100644 --- a/lib/util/semver.js +++ b/lib/util/semver.js @@ -20,11 +20,11 @@ function maxSatisfying(versions, range, strictMatch) { } } - // When strict match is enabled and range is *, - // give priority to non-pre-releases - // We do this by filtering every pre-release version range = typeof range === 'string' ? range.trim() : range; - if (strictMatch && (!range || range === '*')) { + + // When strict match is enabled give priority to non-pre-releases + // We do this by filtering every pre-release version + if (strictMatch) { filteredVersions = versions.map(function (version) { return !isPreRelease(version) ? version : null; }); diff --git a/test/core/resolvers/gitResolver.js b/test/core/resolvers/gitResolver.js index b2ddcc32..e0b22029 100644 --- a/test/core/resolvers/gitResolver.js +++ b/test/core/resolvers/gitResolver.js @@ -481,6 +481,31 @@ describe('GitResolver', function () { .done(); }); + it('should resolve "0.1.*" to the latest version if a repository has valid semver tags, ignoring pre-releases', function (next) { + var resolver; + + GitResolver.refs = function () { + return Q.resolve([ + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/master', + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/tags/0.1.0', + 'cccccccccccccccccccccccccccccccccccccccc refs/tags/v0.1.1', + 'dddddddddddddddddddddddddddddddddddddddd refs/tags/0.1.2-rc.1' // Should ignore release candidates + ]); + }; + + resolver = create('foo'); + resolver._findResolution('0.1.*') + .then(function (resolution) { + expect(resolution).to.eql({ + type: 'version', + tag: 'v0.1.1', + commit: 'cccccccccccccccccccccccccccccccccccccccc' + }); + next(); + }) + .done(); + }); + it('should resolve "*" to the latest version if a repository has valid semver tags, not ignoring pre-releases if they are the only versions', function (next) { var resolver; @@ -505,6 +530,30 @@ describe('GitResolver', function () { .done(); }); + it('should resolve "0.1.*" to the latest version if a repository has valid semver tags, not ignoring pre-releases if they are the only versions', function (next) { + var resolver; + + GitResolver.refs = function () { + return Q.resolve([ + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/master', + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/tags/0.1.0-rc.1', + 'cccccccccccccccccccccccccccccccccccccccc refs/tags/0.1.0-rc.2' + ]); + }; + + resolver = create('foo'); + resolver._findResolution('0.1.*') + .then(function (resolution) { + expect(resolution).to.eql({ + type: 'version', + tag: '0.1.0-rc.2', + commit: 'cccccccccccccccccccccccccccccccccccccccc' + }); + next(); + }) + .done(); + }); + it('should resolve to the latest version that matches a range/version', function (next) { var resolver;