From 6eada0f22e7743b5c3e338984e26426ab45b7a3e Mon Sep 17 00:00:00 2001 From: Alex Kocharin Date: Sun, 13 Apr 2014 02:04:48 +0000 Subject: [PATCH] preserve tags when publishing something (ref #63) --- lib/index.js | 18 +++++-- lib/local-storage.js | 24 +++++---- lib/storage.js | 6 +-- lib/utils.js | 2 +- test/functional/fixtures/newnpmreg.json | 1 + test/functional/fixtures/tags.json | 1 - test/functional/index.js | 1 + test/functional/newnpmreg.js | 72 +++++++++++++++++++++++++ test/functional/tags.js | 2 +- 9 files changed, 106 insertions(+), 21 deletions(-) create mode 100644 test/functional/fixtures/newnpmreg.json create mode 100644 test/functional/newnpmreg.js diff --git a/lib/index.js b/lib/index.js index cf505932..7fb457b3 100644 --- a/lib/index.js +++ b/lib/index.js @@ -215,7 +215,9 @@ module.exports = function(config_hash) { app.put('/:package/:tag', can('publish'), media('application/json'), function(req, res, next) { if (typeof(req.body) !== 'string') return next('route') - storage.add_tag(req.params.package, req.body, req.params.tag, function(err) { + var tags = {} + tags[req.params.tag] = req.body + storage.add_tags(req.params.package, tags, function(err) { if (err) return next(err) res.status(201) return res.send({ @@ -293,9 +295,13 @@ module.exports = function(config_hash) { create_version(t2, metadata.versions[t2], function(err) { if (err) return next(err) - res.status(201) - return res.send({ - ok: ok_message + add_tags(metadata['dist-tags'], function(err) { + if (err) return next(err) + + res.status(201) + return res.send({ + ok: ok_message + }) }) }) }) @@ -318,6 +324,10 @@ module.exports = function(config_hash) { function create_version(version, data, cb) { storage.add_version(name, version, data, null, cb) } + + function add_tags(tags, cb) { + storage.add_tags(name, tags, cb) + } }) // unpublishing an entire package diff --git a/lib/local-storage.js b/lib/local-storage.js index 68d9d61c..a8621caf 100644 --- a/lib/local-storage.js +++ b/lib/local-storage.js @@ -134,13 +134,13 @@ Storage.prototype.update_versions = function(name, newdata, callback) { if (verdata.dist && verdata.dist.tarball) { var url = utils.parse_tarball_url( - verdata.dist.__sinopia_orig_tarball || verdata.dist.tarball + /*verdata.dist.__sinopia_orig_tarball ||*/ verdata.dist.tarball ) // we do NOT overwrite any existing records if (url != null && data._distfiles[url.filename] == null) { data._distfiles[url.filename] = { - url: verdata.dist.__sinopia_orig_tarball || verdata.dist.tarball, + url: /*verdata.dist.__sinopia_orig_tarball ||*/ verdata.dist.tarball, sha: verdata.dist.shasum, } } @@ -222,19 +222,21 @@ Storage.prototype.add_version = function(name, version, metadata, tag, callback) }, callback) } -Storage.prototype.add_tag = function(name, version, tag, callback) { +Storage.prototype.add_tags = function(name, tags, callback) { var self = this self.update_package(name, function updater(data, cb) { - if (data.versions[version] == null) { - return cb(new UError({ - status: 404, - msg: "this version doesn't exist" - })) - } + for (var t in tags) { + if (data.versions[tags[t]] == null) { + return cb(new UError({ + status: 404, + msg: "this version doesn't exist" + })) + } - utils.tag_version(data, version, tag, self.config) - cb() + utils.tag_version(data, tags[t], t, self.config) + cb() + } }, callback) } diff --git a/lib/storage.js b/lib/storage.js index 93e0695b..3c9973f5 100644 --- a/lib/storage.js +++ b/lib/storage.js @@ -122,8 +122,8 @@ Storage.prototype.add_version = function(name, version, metadata, tag, callback) // // Used storages: local (write) // -Storage.prototype.add_tag = function(name, version, tag, callback) { - return this.local.add_tag(name, version, tag, callback) +Storage.prototype.add_tags = function(name, tag_hash, callback) { + return this.local.add_tags(name, tag_hash, callback) } // @@ -301,7 +301,7 @@ Storage.prototype.get_package = function(name, options, callback) { if (whitelist.indexOf(i) === -1) delete result[i] } - if (self.config.ignore_latest_tag) { + if (self.config.ignore_latest_tag || !result['dist-tags'].latest) { result['dist-tags'].latest = utils.semver_sort(Object.keys(result.versions)) } diff --git a/lib/utils.js b/lib/utils.js index da29af60..485a75cb 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -84,7 +84,7 @@ module.exports.filter_tarball_urls = function(pkg, req, config) { for (var ver in pkg.versions) { var dist = pkg.versions[ver].dist if (dist != null && dist.tarball != null) { - dist.__sinopia_orig_tarball = dist.tarball + //dist.__sinopia_orig_tarball = dist.tarball dist.tarball = filter(dist.tarball) } } diff --git a/test/functional/fixtures/newnpmreg.json b/test/functional/fixtures/newnpmreg.json new file mode 100644 index 00000000..8194040d --- /dev/null +++ b/test/functional/fixtures/newnpmreg.json @@ -0,0 +1 @@ +{"_id":"testpkg-newnpmreg","name":"testpkg-newnpmreg","description":"","dist-tags":{"foo":"0.0.0","latest":"0.0.0"},"versions":{"0.0.0":{"name":"testpkg-newnpmreg","version":"0.0.0","description":"","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":""},"author":"","license":"ISC","_id":"testpkg-newnpmreg@0.0.0","dist":{"shasum":"8ee7331cbc641581b1a8cecd9d38d744a8feb863","tarball":"http://localhost:1234/testpkg-newnpmreg/-/testpkg-newnpmreg-0.0.0.tgz"},"_from":".","_npmVersion":"1.3.1","_npmUser":{"name":"alex","email":"alex@kocharin.ru"},"maintainers":[{"name":"alex","email":"alex@kocharin.ru"}]}},"readme":"","maintainers":[{"name":"alex","email":"alex@kocharin.ru"}],"_attachments":{"testpkg-newnpmreg-0.0.0.tgz":{"content_type":"application/octet-stream","data":"H4sIAAAAAAAAA+2TsW7CMBCGM/spTh6YKHUSIJLXqkPnrixWcIMLsS3btCDEu/fs0Ba1SFVVVISUP8Odzqf/zlY+K+qlaOSt7eLo2RudnVmMsel4DBjzasKOY1JZlJDlRVkU5aSspnnG8pIVOZ6fe5FTWvsgHK7yV5/uLvARr0Q7qkUrKadB+mCXzY2Wr9q2TjZ0SF+k88poPGUj/LAyl752yoauioVWqJgpPZcb/Hmw0jV4ynfJEw9lvTAwo/fOGcdBG4h18FbW6knJ+YzCYAByowLkdD+kTlrjVTBumzy2Nq7XqIDea7eKY7FJrMPCuG6Hlaql9rHr4fGO7i/9pFcl+4X/rWhX557xA/9FVZ3gv+j5/w9F+jl8g58c0OeQyCdH3HOglETsObxTTw7McwLJClt+wzz5JD45IPEcEHjMEfg0r8M9pQfaOSDs5NLP16tXr15XqzeJD6m5AAwAAA==","length":352}}} diff --git a/test/functional/fixtures/tags.json b/test/functional/fixtures/tags.json index aff3a968..63487cca 100644 --- a/test/functional/fixtures/tags.json +++ b/test/functional/fixtures/tags.json @@ -43,7 +43,6 @@ } }, "dist-tags": { - "latest": "5.4.3", "something": "0.1.1alpha", "bad": "1.1" } diff --git a/test/functional/index.js b/test/functional/index.js index ddfb37de..ca51de53 100644 --- a/test/functional/index.js +++ b/test/functional/index.js @@ -42,6 +42,7 @@ describe('Func', function() { require('./gzip')() require('./incomplete')() require('./mirror')() + require('./newnpmreg')() require('./race')() require('./racycrash')() require('./security')() diff --git a/test/functional/newnpmreg.js b/test/functional/newnpmreg.js new file mode 100644 index 00000000..abb5b8b0 --- /dev/null +++ b/test/functional/newnpmreg.js @@ -0,0 +1,72 @@ +var assert = require('assert') + +function readfile(x) { + return require('fs').readFileSync(__dirname + '/' + x) +} + +function sha(x) { + return require('crypto').createHash('sha1', 'binary').update(x).digest('hex') +} + +module.exports = function() { + var server = process.server + var server2 = process.server2 + + describe('newnpmreg', function() { + before(function(cb) { + server.request({ + uri: '/testpkg-newnpmreg', + headers: { + 'content-type': 'application/json', + }, + method: 'PUT', + json: JSON.parse(readfile('fixtures/newnpmreg.json')), + }, function(err, res, body) { + assert.equal(res.statusCode, 201) + cb() + }) + }) + + it('add pkg', function(){}) + + it('server1 - tarball', function(cb) { + server.get_tarball('testpkg-newnpmreg', 'testpkg-newnpmreg-0.0.0.tgz', function(res, body) { + assert.equal(res.statusCode, 200) + // not real sha due to utf8 conversion + assert.strictEqual(sha(body), '789ca61e3426ce55c4983451b58e62b04abceaf6') + cb() + }) + }) + + it('server2 - tarball', function(cb) { + server2.get_tarball('testpkg-newnpmreg', 'testpkg-newnpmreg-0.0.0.tgz', function(res, body) { + assert.equal(res.statusCode, 200) + // not real sha due to utf8 conversion + assert.strictEqual(sha(body), '789ca61e3426ce55c4983451b58e62b04abceaf6') + cb() + }) + }) + + it('server1 - package', function(cb) { + server.get_package('testpkg-newnpmreg', function(res, body) { + assert.equal(res.statusCode, 200) + assert.equal(body.name, 'testpkg-newnpmreg') + assert.equal(body.versions['0.0.0'].name, 'testpkg-newnpmreg') + assert.equal(body.versions['0.0.0'].dist.tarball, 'http://localhost:55551/testpkg-newnpmreg/-/testpkg-newnpmreg-0.0.0.tgz') + assert.deepEqual(body['dist-tags'], {foo: '0.0.0', latest: '0.0.0'}) + cb() + }) + }) + + it('server2 - package', function(cb) { + server2.get_package('testpkg-newnpmreg', function(res, body) { + assert.equal(res.statusCode, 200) + assert.equal(body.name, 'testpkg-newnpmreg') + assert.equal(body.versions['0.0.0'].name, 'testpkg-newnpmreg') + assert.equal(body.versions['0.0.0'].dist.tarball, 'http://localhost:55552/testpkg-newnpmreg/-/testpkg-newnpmreg-0.0.0.tgz') + assert.deepEqual(body['dist-tags'], {foo: '0.0.0', latest: '0.0.0'}) + cb() + }) + }) + }) +} diff --git a/test/functional/tags.js b/test/functional/tags.js index cf2a4e3d..c985a325 100644 --- a/test/functional/tags.js +++ b/test/functional/tags.js @@ -32,7 +32,7 @@ module.exports = function() { assert.equal(typeof(body.versions['1.1']), 'object') assert.equal(body['dist-tags'].something, '0.1.1alpha') // note: 5.4.3 is invalid tag, 0.1.3alpha is highest semver - assert.equal(body['dist-tags'].latest, '5.4.3') + assert.equal(body['dist-tags'].latest, '0.1.3alpha') assert.equal(body['dist-tags'].bad, null) cb() })