diff --git a/README.md b/README.md index 2fb948c6..db2b099a 100644 --- a/README.md +++ b/README.md @@ -223,6 +223,16 @@ Throws an error if the resolver is not yet resolved. ----------- +##### Public static functions + +`Resolver#clearRuntimeCache` + +Clears the resolver runtime cache, that is, data stored statically. +Resolvers may cache data based on the sources to speed up calls to `hasNew` and `resolve` for the +same source. + +----------- + ##### Protected functions `Resolver#_createTempDir()`: Promise diff --git a/lib/resolve/Resolver.js b/lib/resolve/Resolver.js index 9f6bda3f..9bccc833 100644 --- a/lib/resolve/Resolver.js +++ b/lib/resolve/Resolver.js @@ -17,7 +17,7 @@ var Resolver = function (source, options) { this._source = source; this._target = options.target || '*'; - this._name = options.name || this._source; + this._name = options.name || path.basename(this._source); this._guessedName = !options.name; this._config = options.config || config; }; @@ -79,6 +79,10 @@ Resolver.prototype.getPkgMeta = function () { // ----------------- +Resolver.clearRuntimeCache = function () {}; + +// ----------------- + // Abstract function that should be implemented by concrete resolvers Resolver.prototype._resolveSelf = function () { throw new Error('_resolveSelf not implemented'); @@ -186,4 +190,5 @@ Resolver.prototype._createIgnoreFilter = function (ignore) { return list.matches(filename); }; }; + module.exports = Resolver; \ No newline at end of file diff --git a/lib/resolve/resolvers/GitRemoteResolver.js b/lib/resolve/resolvers/GitRemoteResolver.js index f3041c43..c16b87dd 100644 --- a/lib/resolve/resolvers/GitRemoteResolver.js +++ b/lib/resolve/resolvers/GitRemoteResolver.js @@ -6,6 +6,11 @@ var cmd = require('../../util/cmd'); var GitRemoteResolver = function (source, options) { GitResolver.call(this, source, options); + + // If the name was guessed, remove the trailing .git + if (this._guessedName && mout.string.endsWith(this._name, '.git')) { + this._name = this._name.slice(0, -4); + } }; util.inherits(GitRemoteResolver, GitResolver); diff --git a/lib/resolve/resolvers/GitResolver.js b/lib/resolve/resolvers/GitResolver.js index 6e0189d2..12ccff34 100644 --- a/lib/resolve/resolvers/GitResolver.js +++ b/lib/resolve/resolvers/GitResolver.js @@ -10,14 +10,10 @@ var createError = require('../../util/createError'); var GitResolver = function (source, options) { Resolver.call(this, source, options); - - // Guess the name - if (this._guessedName) { - this._name = path.basename(this._source, '.git'); - } }; util.inherits(GitResolver, Resolver); +mout.object.mixIn(GitResolver, Resolver); // ----------------- @@ -275,4 +271,11 @@ GitResolver.fetchBranches = function (source) { }.bind(this)); }; +GitResolver.clearRuntimeCache = function () { + GitResolver._branches = null; + GitResolver._tags = null; + GitResolver._versions = null; + GitResolver._refs = null; +}; + module.exports = GitResolver; diff --git a/test/resolve/resolvers/gitFsResolver.js b/test/resolve/resolvers/gitFsResolver.js index 039d49fb..6eba4608 100644 --- a/test/resolve/resolvers/gitFsResolver.js +++ b/test/resolve/resolvers/gitFsResolver.js @@ -8,11 +8,8 @@ var GitFsResolver = require('../../../lib/resolve/resolvers/GitFsResolver'); describe('GitFsResolver', function () { var testPackage = path.resolve(__dirname, '../../assets/github-test-package'); - function cleanInternalResolverCache() { - delete GitFsResolver._versions; - delete GitFsResolver._tags; - delete GitFsResolver._branches; - delete GitFsResolver._refs; + function clearResolverRuntimeCache() { + GitFsResolver.clearRuntimeCache(); } describe('.constructor', function () { @@ -23,8 +20,9 @@ describe('GitFsResolver', function () { }); it('should make paths absolute and normalized', function () { - var resolver = new GitFsResolver(path.relative(process.cwd(), testPackage)); + var resolver; + resolver = new GitFsResolver(path.relative(process.cwd(), testPackage)); expect(resolver.getSource()).to.equal(testPackage); resolver = new GitFsResolver(testPackage + '/something/..'); @@ -173,18 +171,22 @@ describe('GitFsResolver', function () { }); describe('#fetchRefs', function () { - afterEach(cleanInternalResolverCache); + afterEach(clearResolverRuntimeCache); it('should resolve to the references of the local repository', function (next) { GitFsResolver.fetchRefs(testPackage) .then(function (refs) { + // Remove master and test only for the first 7 refs + refs = refs.slice(1, 8); + expect(refs).to.eql([ - 'f99467d1069892ea639b6a3d2afdbff6ac62f44e refs/heads/master', '8b03dbbe20e0bc4f1fae2811ea0063121eb1b155 refs/heads/some-branch', '122ac45fd22671a23cf77055a32d06d5a7baedd0 refs/tags/0.0.1', '34dd75a11e686be862844996392e96e9457c7467 refs/tags/0.0.2', '92327598500f115d09ab14f16cde23718fc87658 refs/tags/0.1.0', - '192bc846a342eb8ae62bb1a54d1394959e6fcd92 refs/tags/0.1.1' + '192bc846a342eb8ae62bb1a54d1394959e6fcd92 refs/tags/0.1.1', + 'a920e518bc9eda908018ea299cad48d358a111ce refs/tags/0.2.0', + '388de53beca50cfc1927535622727090cb0f04f8 refs/tags/0.2.1' ]); next(); }) @@ -204,12 +206,17 @@ describe('GitFsResolver', function () { return GitFsResolver.fetchRefs(testPackage); }) .then(function (refs) { + // Test only for the first 6 refs + refs = refs.slice(0, 7); + expect(refs).to.eql([ '8b03dbbe20e0bc4f1fae2811ea0063121eb1b155 refs/heads/some-branch', '122ac45fd22671a23cf77055a32d06d5a7baedd0 refs/tags/0.0.1', '34dd75a11e686be862844996392e96e9457c7467 refs/tags/0.0.2', '92327598500f115d09ab14f16cde23718fc87658 refs/tags/0.1.0', - '192bc846a342eb8ae62bb1a54d1394959e6fcd92 refs/tags/0.1.1' + '192bc846a342eb8ae62bb1a54d1394959e6fcd92 refs/tags/0.1.1', + 'a920e518bc9eda908018ea299cad48d358a111ce refs/tags/0.2.0', + '388de53beca50cfc1927535622727090cb0f04f8 refs/tags/0.2.1' ]); next(); }) diff --git a/test/resolve/resolvers/gitRemoteResolver.js b/test/resolve/resolvers/gitRemoteResolver.js index 73884292..851ba203 100644 --- a/test/resolve/resolvers/gitRemoteResolver.js +++ b/test/resolve/resolvers/gitRemoteResolver.js @@ -6,11 +6,8 @@ var GitRemoteResolver = require('../../../lib/resolve/resolvers/GitRemoteResolve describe('GitRemoteResolver', function () { var testPackage = path.resolve(__dirname, '../../assets/github-test-package'); - function cleanInternalResolverCache() { - delete GitRemoteResolver._versions; - delete GitRemoteResolver._tags; - delete GitRemoteResolver._branches; - delete GitRemoteResolver._refs; + function clearResolverRuntimeCache() { + GitRemoteResolver.clearRuntimeCache(); } describe('.constructor', function () { @@ -91,13 +88,15 @@ describe('GitRemoteResolver', function () { }); describe('#fetchRefs', function () { - afterEach(cleanInternalResolverCache); + afterEach(clearResolverRuntimeCache); it('should resolve to the references of the remote repository', function (next) { GitRemoteResolver.fetchRefs('file://' + testPackage) .then(function (refs) { + // Remove master and test only for the first 13 refs + refs = refs.slice(1, 14); + expect(refs).to.eql([ - 'f99467d1069892ea639b6a3d2afdbff6ac62f44e refs/heads/master', '8b03dbbe20e0bc4f1fae2811ea0063121eb1b155 refs/heads/some-branch', '122ac45fd22671a23cf77055a32d06d5a7baedd0 refs/tags/0.0.1', '19b3a35cc7fded9a8a60d5b8fc0d18eb4940c476 refs/tags/0.0.1^{}', @@ -106,7 +105,11 @@ describe('GitRemoteResolver', function () { '92327598500f115d09ab14f16cde23718fc87658 refs/tags/0.1.0', 'b273e321ebc69381be2780668a22e28bec9e2b07 refs/tags/0.1.0^{}', '192bc846a342eb8ae62bb1a54d1394959e6fcd92 refs/tags/0.1.1', - 'f99467d1069892ea639b6a3d2afdbff6ac62f44e refs/tags/0.1.1^{}' + 'f99467d1069892ea639b6a3d2afdbff6ac62f44e refs/tags/0.1.1^{}', + 'a920e518bc9eda908018ea299cad48d358a111ce refs/tags/0.2.0', + '65dc372d73c76ed4904ee209ed77c09d44f4dc53 refs/tags/0.2.0^{}', + '388de53beca50cfc1927535622727090cb0f04f8 refs/tags/0.2.1', + '108b8fd803481afa9d537e5551beb6d5946ee045 refs/tags/0.2.1^{}' ]); next(); }) @@ -128,6 +131,9 @@ describe('GitRemoteResolver', function () { return GitRemoteResolver.fetchRefs('file://' + testPackage); }) .then(function (refs) { + // Test only for the first 12 refs + refs = refs.slice(0, 13); + expect(refs).to.eql([ '8b03dbbe20e0bc4f1fae2811ea0063121eb1b155 refs/heads/some-branch', '122ac45fd22671a23cf77055a32d06d5a7baedd0 refs/tags/0.0.1', @@ -137,7 +143,11 @@ describe('GitRemoteResolver', function () { '92327598500f115d09ab14f16cde23718fc87658 refs/tags/0.1.0', 'b273e321ebc69381be2780668a22e28bec9e2b07 refs/tags/0.1.0^{}', '192bc846a342eb8ae62bb1a54d1394959e6fcd92 refs/tags/0.1.1', - 'f99467d1069892ea639b6a3d2afdbff6ac62f44e refs/tags/0.1.1^{}' + 'f99467d1069892ea639b6a3d2afdbff6ac62f44e refs/tags/0.1.1^{}', + 'a920e518bc9eda908018ea299cad48d358a111ce refs/tags/0.2.0', + '65dc372d73c76ed4904ee209ed77c09d44f4dc53 refs/tags/0.2.0^{}', + '388de53beca50cfc1927535622727090cb0f04f8 refs/tags/0.2.1', + '108b8fd803481afa9d537e5551beb6d5946ee045 refs/tags/0.2.1^{}' ]); next(); }) diff --git a/test/resolve/resolvers/gitResolver.js b/test/resolve/resolvers/gitResolver.js index 37604f3f..7ad298fa 100644 --- a/test/resolve/resolvers/gitResolver.js +++ b/test/resolve/resolvers/gitResolver.js @@ -14,12 +14,9 @@ describe('GitResolver', function () { var tempDir = path.resolve(__dirname, '../../assets/tmp'), originalFetchRefs = GitResolver.fetchRefs; - function cleanInternalResolverCache() { + function clearResolverRuntimeCache() { GitResolver.fetchRefs = originalFetchRefs; - delete GitResolver._versions; - delete GitResolver._tags; - delete GitResolver._branches; - delete GitResolver._refs; + GitResolver.clearRuntimeCache(); } describe('.hasNew', function () { @@ -28,7 +25,7 @@ describe('GitResolver', function () { }); afterEach(function (next) { - cleanInternalResolverCache(); + clearResolverRuntimeCache(); rimraf(tempDir, next); }); @@ -253,7 +250,7 @@ describe('GitResolver', function () { }); describe('._resolveSelf', function () { - afterEach(cleanInternalResolverCache); + afterEach(clearResolverRuntimeCache); it('should call the necessary functions by the correct order', function (next) { function DummyResolver() { @@ -361,7 +358,7 @@ describe('GitResolver', function () { }); describe('._findResolution', function () { - afterEach(cleanInternalResolverCache); + afterEach(clearResolverRuntimeCache); it('should resolve to an object', function (next) { var resolver; @@ -629,7 +626,7 @@ describe('GitResolver', function () { }); afterEach(function (next) { - cleanInternalResolverCache(); + clearResolverRuntimeCache(); // Need to chmodr before removing..at least on windows // because .git has some read only files chmodr(tempDir, 0777, function () { @@ -796,7 +793,7 @@ describe('GitResolver', function () { }); describe('#fetchBranches', function () { - afterEach(cleanInternalResolverCache); + afterEach(clearResolverRuntimeCache); it('should resolve to an empty object if no heads are found', function (next) { GitResolver.fetchRefs = function () { @@ -896,7 +893,7 @@ describe('GitResolver', function () { }); describe('#fetchTags', function () { - afterEach(cleanInternalResolverCache); + afterEach(clearResolverRuntimeCache); it('should resolve to an empty array if no tags are found', function (next) { GitResolver.fetchRefs = function () { @@ -999,8 +996,15 @@ describe('GitResolver', function () { }); }); + describe('#clearRuntimeCache', function () { + it.skip('should clear refs cache'); + it.skip('should clear branches cache'); + it.skip('should clear tags cache'); + it.skip('should clear versions cache'); + }); + describe('#fetchVersions', function () { - afterEach(cleanInternalResolverCache); + afterEach(clearResolverRuntimeCache); it('should resolve to an empty array if no tags are found', function (next) { GitResolver.fetchRefs = function () {