diff --git a/ChangeLog.md b/ChangeLog.md index b0867608b..9a2332db5 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,4 +1,14 @@ +11 Dec 2013, version 0.5.6 + +- fixing a few crashes related to tags + +8 Dec 2013, version 0.5.4 + +- latest tag always shows highest version available (issue #8) +- added a configurable timeout for requests to uplinks (issue #18) +- users with bad authentication header are considered not logged in (issue #17) + 24 Nov 2013, version 0.5.3 - added proxy support for requests to uplinks (issue #13) diff --git a/lib/storage.js b/lib/storage.js index 06714883a..2d4a2caf6 100644 --- a/lib/storage.js +++ b/lib/storage.js @@ -469,7 +469,7 @@ Storage.prototype.get_package = function(name, options, callback) { if (!~whitelist.indexOf(i)) delete result[i] } - result['dist-tags'].latest = Object.keys(result.versions).sort(semver.compareLoose) + result['dist-tags'].latest = Storage._semver_sort(Object.keys(result.versions)) for (var i in result['dist-tags']) { if (Array.isArray(result['dist-tags'][i])) { result['dist-tags'][i] = result['dist-tags'][i][result['dist-tags'][i].length-1] @@ -508,10 +508,19 @@ Storage._merge_versions = function(local, up) { } if (local['dist-tags'][i].indexOf(up['dist-tags'][i]) === -1) { local['dist-tags'][i].push(up['dist-tags'][i]) - local['dist-tags'][i].sort(semver.compareLoose) + local['dist-tags'][i] = Storage._semver_sort(local['dist-tags'][i]) } } } +// function filters out bad semver versions and sorts the array +// exported for unit tests only +Storage._semver_sort = function semver_sort(array) { + return array + .filter(function(x) { return semver.parse(x, true) != null }) + .sort(semver.compareLoose) + .map(String) +} + module.exports = Storage diff --git a/package.yaml b/package.yaml index a89341652..582b75b1a 100644 --- a/package.yaml +++ b/package.yaml @@ -1,7 +1,7 @@ # use "yapm install ." if you're installing this from git repository name: sinopia -version: 0.5.3 +version: 0.5.6 description: Private npm repository server author: diff --git a/test/config-1.yaml b/test/config-1.yaml index 3526e3e03..8549c33ca 100644 --- a/test/config-1.yaml +++ b/test/config-1.yaml @@ -5,6 +5,8 @@ users: password: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 uplinks: + express: + url: http://localhost:55550/ server2: url: http://localhost:55552/ @@ -24,6 +26,11 @@ packages: proxy_access: server2 proxy_publish: server2 + 'testexp*': + allow_access: all + allow_publish: all + proxy_access: express + '*': allow_access: test undefined allow_publish: test undefined diff --git a/test/fixtures/tags.json b/test/fixtures/tags.json new file mode 100644 index 000000000..08b2322d9 --- /dev/null +++ b/test/fixtures/tags.json @@ -0,0 +1,50 @@ +{ + "name": "testexp_tags", + "versions": { + "0.1.0": { + "name": "testexp_tags", + "version": "0.0.0", + "dist": { + "shasum": "fake", + "tarball": "http://localhost:55551/testexp_tags/-/blahblah" + } + }, + "0.1.1alpha": { + "name": "testexp_tags", + "version": "0.0.0", + "dist": { + "shasum": "fake", + "tarball": "http://localhost:55551/testexp_tags/-/blahblah" + } + }, + "0.1.2": { + "name": "testexp_tags", + "version": "0.0.0", + "dist": { + "shasum": "fake", + "tarball": "http://localhost:55551/testexp_tags/-/blahblah" + } + }, + "0.1.3alpha": { + "name": "testexp_tags", + "version": "0.0.0", + "dist": { + "shasum": "fake", + "tarball": "http://localhost:55551/testexp_tags/-/blahblah" + } + }, + "1.1": { + "name": "testexp_tags", + "version": "0.0.0", + "dist": { + "shasum": "fake", + "tarball": "http://localhost:55551/testexp_tags/-/blahblah" + } + } + }, + "dist-tags": { + "latest": "5.4.3", + "something": "0.1.1alpha", + "bad": "1.1" + } +} diff --git a/test/lib/package.js b/test/lib/package.js index 5768910d9..e380872c8 100644 --- a/test/lib/package.js +++ b/test/lib/package.js @@ -1,8 +1,8 @@ -module.exports = function(name) { +module.exports = function(name, version) { return { "name": name, - "version": "0.0.0", + "version": version || "0.0.0", "dist": { "shasum": "fake", "tarball": "http://localhost:55551/"+escape(name)+"/-/blahblah" diff --git a/test/st_merge.js b/test/st_merge.js index 014d0c514..6e0d4c7ce 100644 --- a/test/st_merge.js +++ b/test/st_merge.js @@ -1,4 +1,5 @@ var assert = require('assert') + , semver_sort = require('../lib/storage')._semver_sort , merge = require('../lib/storage')._merge_versions //require('../lib/logger').setup() @@ -39,5 +40,14 @@ exports['Merge'] = { 'dist-tags': {w:["1.1.1","2.2.2-rc2","2.2.2","3.3.3","12.2.2"]}, }) }, + + 'semver_sort': function() { + assert.deepEqual(semver_sort(['1.2.3','1.2','1.2.3a','1.2.3c','1.2.3-b']), + [ '1.2.3a', + '1.2.3-b', + '1.2.3c', + '1.2.3' ] + ) + }, } diff --git a/test/start.sh b/test/start.sh index 011563d81..3ebdfeca9 100755 --- a/test/start.sh +++ b/test/start.sh @@ -4,7 +4,7 @@ CWD=$(pwd) PATH='../node_modules/.bin':$PATH TESTDIR=$(dirname $0) cd $TESTDIR -mocha -R list --ui exports ./tests.js ./no_proxy.js +mocha -R list --ui exports ./tests.js ./no_proxy.js ./st_merge.js TESTRES=$? cd $CWD exit $TESTRES diff --git a/test/tags.js b/test/tags.js new file mode 100644 index 000000000..d8c3d0348 --- /dev/null +++ b/test/tags.js @@ -0,0 +1,34 @@ +var assert = require('assert') + , ex = module.exports + , server = process.server + , readfile = require('fs').readFileSync + , express = process.express + +ex['testing for 404'] = function(cb) { + server.get_package('testexp_tags', function(res, body) { + // shouldn't exist yet + assert.equal(res.statusCode, 404) + assert(~body.error.indexOf('no such package')) + cb() + }) +} + +ex['setting up server with bad tags'] = function(cb) { + express.get('/testexp_tags', function(req, res) { + res.send(JSON.parse(readfile('fixtures/tags.json'))) + }) + cb() +} + +ex['fetching package again'] = function(cb) { + server.get_package('testexp_tags', function(res, body) { + // shouldn't exist yet + assert.equal(res.statusCode, 200) + assert.equal(typeof(body.versions['1.1']), 'object') + assert.equal(body['dist-tags'].something, '0.1.1alpha') + assert.equal(body['dist-tags'].latest, '0.1.3alpha') + assert.equal(body['dist-tags'].bad, null) + cb() + }) +} + diff --git a/test/tests.js b/test/tests.js index 3142e41f0..ceeae381d 100644 --- a/test/tests.js +++ b/test/tests.js @@ -3,16 +3,21 @@ var fs = require('fs') , assert = require('assert') , Server = require('./lib/server') , readfile = require('fs').readFileSync + , express = require('express') , ex = module.exports var forks = process.forks = [] process.server = new Server('http://localhost:55551/') process.server2 = new Server('http://localhost:55552/') +process.express = express() + +process.express.listen(55550) ex['Startup:'] = require('./startup') ex['Basic:'] = require('./basic') ex['Mirror:'] = require('./mirror') ex['Race:'] = require('./race') +ex['Tags:'] = require('./tags') process.on('exit', function() { if (forks[0]) forks[0].kill()