mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.7 KiB
98 lines
2.7 KiB
|
|
// fetch the data
|
|
// modify to remove the version in question
|
|
// If no versions remaining, then DELETE
|
|
// else, PUT the modified data
|
|
// delete the tarball
|
|
|
|
module.exports = unpublish
|
|
|
|
var request = require("./request.js")
|
|
, log = require("../log.js")
|
|
, get = require("./get.js")
|
|
, semver = require("semver")
|
|
, url = require("url")
|
|
, chain = require("slide").chain
|
|
|
|
function unpublish (name, ver, cb) {
|
|
if (!cb) cb = ver, ver = null
|
|
if (!cb) throw new Error(
|
|
"Not enough arguments for registry unpublish")
|
|
|
|
get(name, null, -1, true, function (er, data) {
|
|
if (er) return log(name+" not published", "unpublish", cb)
|
|
// remove all if no version specified
|
|
if (!ver) {
|
|
log("No version specified, removing all", "unpublish")
|
|
return request("DELETE", name+'/-rev/'+data._rev, cb)
|
|
}
|
|
|
|
var versions = data.versions || {}
|
|
, versionPublic = versions.hasOwnProperty(ver)
|
|
|
|
if (!versionPublic) log(name+"@"+ver+" not published", "unpublish")
|
|
else {
|
|
var dist = versions[ver].dist
|
|
log.verbose(dist, "removing attachments")
|
|
}
|
|
|
|
delete versions[ver]
|
|
// if it was the only version, then delete the whole package.
|
|
if (!Object.keys(versions).length) {
|
|
log("No versions remain, removing entire package", "unpublish")
|
|
return request("DELETE", name+"/-rev/"+data._rev, cb)
|
|
}
|
|
|
|
if (!versionPublic) return cb()
|
|
|
|
var latestVer = data["dist-tags"].latest
|
|
for (var tag in data["dist-tags"]) {
|
|
if (data["dist-tags"][tag] === ver) delete data["dist-tags"][tag]
|
|
}
|
|
|
|
if (latestVer === ver) {
|
|
data["dist-tags"].latest =
|
|
Object.getOwnPropertyNames(versions).sort(semver.compare).pop()
|
|
}
|
|
|
|
var rev = data._rev
|
|
delete data._revisions
|
|
delete data._attachments
|
|
// log(data._rev, "rev")
|
|
request.PUT(name+"/-rev/"+rev, data,
|
|
log.er(detacher(data, dist, cb), "Failed to update the data"))
|
|
})
|
|
}
|
|
|
|
function detacher (data, dist, cb) { return function (er) {
|
|
if (er) return cb(er)
|
|
get(data.name, function (er, data) {
|
|
if (er) return cb(er)
|
|
|
|
var tb = url.parse(dist.tarball)
|
|
|
|
detach(data, tb.pathname, data._rev, function (er) {
|
|
if (er || !dist.bin) return cb(er)
|
|
chain(Object.keys(dist.bin).map(function (bt) {
|
|
return function (cb) {
|
|
var d = dist.bin[bt]
|
|
detach(data, url.parse(d.tarball).pathname, null, cb)
|
|
}
|
|
}), cb)
|
|
})
|
|
})
|
|
}}
|
|
|
|
function detach (data, path, rev, cb) {
|
|
if (rev) {
|
|
path += "/-rev/" + rev
|
|
log(path, "detach")
|
|
return request("DELETE", path, cb)
|
|
}
|
|
get(data.name, function (er, data) {
|
|
rev = data._rev
|
|
if (!rev) return cb(new Error(
|
|
"No _rev found in "+data._id))
|
|
detach(data, path, rev, cb)
|
|
})
|
|
}
|
|
|