From 552fd52bd565ee786d2637cd1c6f1d96802d9049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Cruz?= Date: Wed, 3 Jul 2013 14:31:15 +0100 Subject: [PATCH] Fix parallel usage of .versions in the git resolver. --- lib/core/resolvers/GitResolver.js | 10 +++-- test/core/resolvers/gitResolver.js | 69 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/lib/core/resolvers/GitResolver.js b/lib/core/resolvers/GitResolver.js index 779a5abe..6a02d4fb 100644 --- a/lib/core/resolvers/GitResolver.js +++ b/lib/core/resolvers/GitResolver.js @@ -95,7 +95,7 @@ GitResolver.prototype._findResolution = function (target) { } // Target is a range/version - if (semver.valid(target) != null || semver.validRange(target) != null) { + if (semver.validRange(target)) { return self.versions(this._source, true) .then(function (versions) { // If there are no tags and target is *, @@ -214,7 +214,9 @@ GitResolver.versions = function (source, extra) { if (value) { return Q.resolve(value) - .then(function (versions) { + .then(function () { + var versions = this._cache.versions.get(source); + // If no extra information was requested, // resolve simply with the versions if (!extra) { @@ -224,14 +226,14 @@ GitResolver.versions = function (source, extra) { } return versions; - }); + }.bind(this)); } value = this.tags(source) .then(function (tags) { - var versions = []; var tag; var version; + var versions = []; // For each tag for (tag in tags) { diff --git a/test/core/resolvers/gitResolver.js b/test/core/resolvers/gitResolver.js index 64145c71..93a655c6 100644 --- a/test/core/resolvers/gitResolver.js +++ b/test/core/resolvers/gitResolver.js @@ -992,6 +992,30 @@ describe('GitResolver', function () { }) .done(); }); + + it('should work if requested in parallel for the same source', function (next) { + GitResolver.refs = function () { + return Q.resolve([ + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/master', + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/heads/some-branch' + ]); + }; + + Q.all([ + GitResolver.branches('foo'), + GitResolver.branches('foo') + ]) + .spread(function (branches1, branches2) { + expect(branches1).to.eql({ + 'master': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + 'some-branch': 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' + }); + expect(branches1).to.eql(branches2); + + next(); + }) + .done(); + }); }); describe('#tags', function () { @@ -1092,6 +1116,30 @@ describe('GitResolver', function () { }) .done(); }); + + it('should work if requested in parallel for the same source', function (next) { + GitResolver.refs = function () { + return Q.resolve([ + 'cccccccccccccccccccccccccccccccccccccccc refs/tags/0.3.1', + 'dddddddddddddddddddddddddddddddddddddddd refs/tags/some-tag' + ]); + }; + + Q.all([ + GitResolver.tags('foo'), + GitResolver.tags('foo') + ]) + .spread(function (tags1, tags2) { + expect(tags1).to.eql({ + '0.3.1': 'cccccccccccccccccccccccccccccccccccccccc', + 'some-tag': 'dddddddddddddddddddddddddddddddddddddddd' + }); + expect(tags2).to.eql(tags1); + + next(); + }) + .done(); + }); }); describe('#clearRuntimeCache', function () { @@ -1264,5 +1312,26 @@ describe('GitResolver', function () { }) .done(); }); + + it('should work if requested in parallel for the same source', function (next) { + GitResolver.refs = function () { + return Q.resolve([ + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/tags/0.2.1', + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/tags/0.1.0' + ]); + }; + + Q.all([ + GitResolver.versions('foo'), + GitResolver.versions('foo') + ]) + .spread(function (versions1, versions2) { + expect(versions1).to.eql(['0.2.1', '0.1.0']); + expect(versions2).to.eql(versions1); + + next(); + }) + .done(); + }); }); });