blob: a812f7656e77c04789184a22ab8abafed1831220 [file] [log] [blame]
var shows = exports
shows.package = function (doc, req) {
require("monkeypatch").patch(Object, Date, Array, String)
var semver = require("semver")
, code = 200
, headers = {"Content-Type":"application/json"}
, body = null
delete doc.ctime
delete doc.mtime
if (doc.versions) Object.keys(doc.versions).forEach(function (v) {
delete doc.versions[v].ctime
delete doc.versions[v].mtime
})
// legacy kludge
if (doc.versions) for (var v in doc.versions) {
var clean = semver.clean(v, true)
doc.versions[v].directories = doc.versions[v].directories || {}
if (clean !== v) {
var p = doc.versions[v]
delete doc.versions[v]
p.version = v = clean
p._id = p.name + '@' + p.version
doc.versions[clean] = p
}
if (doc.versions[v].dist.tarball) {
// if there is an attachment for this tarball, then use that.
// make it point at THIS registry that is being requested,
// with the full /db/_design/app/_rewrite if that is being used,
// or just the /name if not.
var t = doc.versions[v].dist.tarball
t = t.replace(/^https?:\/\/[^\/:]+(:[0-9]+)?/, '')
var f = t.match(/[^\/]+$/)[0]
var requestedPath = req.requested_path
if (doc._attachments && doc._attachments[f]) {
// workaround for old couch versions that didn't
// have requested_path
if (requestedPath && -1 === requestedPath.indexOf('show'))
requestedPath = requestedPath.slice(0)
else {
var path = req.path
if (path) {
var i = path.indexOf('_show')
if (i !== -1) {
requestedPath = path.slice(0)
requestedPath.splice(i, i + 2, '_rewrite')
}
} else return {
code : 500,
body : JSON.stringify({error: 'bad couch'}),
headers : headers
}
}
// doc.versions[v].dist._origTarball = doc.versions[v].dist.tarball
// doc.versions[v].dist._headers = req.headers
// doc.versions[v].dist._query = req.query
// doc.versions[v].dist._reqPath = req.requested_path
// doc.versions[v].dist._path = req.path
// doc.versions[v].dist._t = t.slice(0)
// actual location of tarball should always be:
// .../_rewrite/pkg/-/pkg-version.tgz
// or: /pkg/-/pkg-version.tgz
// depending on what requested path is.
var tf = [doc.name, '-', t.split('/').pop()]
var i = requestedPath.indexOf('_rewrite')
if (i !== -1) {
tf = requestedPath.slice(0, i + 1).concat(tf)
}
t = '/' + tf.join('/')
var h = "http://" + req.headers.Host
doc.versions[v].dist.tarball = h + t
} else {
doc.versions[v].dist.noattachment = true
}
}
}
if (doc["dist-tags"]) for (var tag in doc["dist-tags"]) {
var clean = semver.clean(doc["dist-tags"][tag], true)
if (!clean) delete doc["dist-tags"][tag]
else doc["dist-tags"][tag] = clean
}
// end kludge
if (req.query.version) {
// could be either one!
var ver = req.query.version
var clean = semver.clean(ver, true)
if (clean && clean !== ver && (clean in doc.versions))
ver = clean
// if not a valid version, then treat as a tag.
if ((!(ver in doc.versions) && (ver in doc["dist-tags"]))
|| !semver.valid(ver)) {
ver = doc["dist-tags"][ver]
}
body = doc.versions[ver]
if (!body) {
code = 404
body = {"error" : "version not found: "+req.query.version}
}
} else {
body = doc
for (var i in body) if (i.charAt(0) === "_" && i !== "_id" && i !== "_rev" && i !== "_attachments") {
delete body[i]
}
for (var i in body.time) {
if (!body.versions[i]) delete body.time[i]
else body.time[i] = new Date(Date.parse(body.time[i])).toISOString()
}
}
body = req.query.jsonp
? req.query.jsonp + "(" + JSON.stringify(body) + ")"
: toJSON(body)
return {
code : code,
body : body,
headers : headers
}
}