This repository was archived by the owner on Apr 18, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathshows.js
More file actions
131 lines (116 loc) · 4 KB
/
shows.js
File metadata and controls
131 lines (116 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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
}
}