vulcan 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/vulcan +1 -1
- data/lib/vulcan/cli.rb +7 -2
- data/lib/vulcan/version.rb +1 -1
- data/server/node_modules/connect-form/node_modules/formidable/Readme.md +13 -2
- data/server/node_modules/connect-form/node_modules/formidable/lib/incoming_form.js +19 -7
- data/server/node_modules/connect-form/node_modules/formidable/lib/multipart_parser.js +12 -1
- data/server/node_modules/connect-form/node_modules/formidable/package.json +1 -1
- data/server/node_modules/connect-form/node_modules/formidable/test/fixture/file/plain.txt +1 -0
- data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/no-filename/generic.http +13 -0
- data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +0 -10
- data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +0 -9
- data/server/node_modules/connect-form/node_modules/formidable/test/fixture/js/no-filename.js +3 -0
- data/server/node_modules/connect-form/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +1 -1
- data/server/node_modules/express/History.md +13 -1
- data/server/node_modules/express/bin/express +5 -4
- data/server/node_modules/express/lib/express.js +1 -1
- data/server/node_modules/express/lib/request.js +14 -2
- data/server/node_modules/express/lib/response.js +3 -2
- data/server/node_modules/express/lib/utils.js +13 -0
- data/server/node_modules/express/lib/view/view.js +2 -1
- data/server/node_modules/express/node_modules/mime/mime.js +3 -3
- data/server/node_modules/express/node_modules/mime/package.json +21 -10
- data/server/node_modules/express/node_modules/mime/test.js +2 -3
- data/server/node_modules/express/node_modules/mime/{mime.types → types/mime.types} +0 -0
- data/server/node_modules/express/node_modules/mime/{node.types → types/node.types} +17 -0
- data/server/node_modules/express/node_modules/mkdirp/LICENSE +21 -0
- data/server/node_modules/express/node_modules/mkdirp/README.markdown +21 -0
- data/server/node_modules/express/node_modules/mkdirp/examples/pow.js +6 -0
- data/server/node_modules/express/node_modules/mkdirp/examples/pow.js.orig +6 -0
- data/server/node_modules/express/node_modules/mkdirp/examples/pow.js.rej +19 -0
- data/server/node_modules/express/node_modules/mkdirp/index.js +20 -0
- data/server/node_modules/express/node_modules/mkdirp/package.json +23 -0
- data/server/node_modules/express/node_modules/mkdirp/test/mkdirp.js +28 -0
- data/server/node_modules/express/node_modules/mkdirp/test/race.js +41 -0
- data/server/node_modules/express/node_modules/mkdirp/test/rel.js +32 -0
- data/server/node_modules/express/package.json +4 -3
- data/server/node_modules/express/testing/index.js +17 -0
- data/server/node_modules/express/testing/views/users.jade +1 -0
- data/server/web.js +49 -52
- metadata +25 -11
- data/server/node_modules/express/node_modules/mime/index.js +0 -1
data/bin/vulcan
CHANGED
data/lib/vulcan/cli.rb
CHANGED
@@ -10,7 +10,7 @@ require "yaml"
|
|
10
10
|
class Vulcan::CLI < Thor
|
11
11
|
|
12
12
|
desc "build", <<-DESC
|
13
|
-
build a piece of software for the heroku cloud using
|
13
|
+
build a piece of software for the heroku cloud using COMMAND as a build command
|
14
14
|
if no COMMAND is specified, a sensible default will be chosen for you
|
15
15
|
|
16
16
|
DESC
|
@@ -94,7 +94,7 @@ update the build server
|
|
94
94
|
DESC
|
95
95
|
|
96
96
|
def update
|
97
|
-
error "no
|
97
|
+
error "no app yet, create first" unless config[:app]
|
98
98
|
|
99
99
|
FileUtils.mkdir_p File.expand_path("~/.heroku/plugins/heroku-credentials")
|
100
100
|
|
@@ -106,6 +106,11 @@ update the build server
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
class Heroku::Command::Credentials < Heroku::Command::Base
|
109
|
+
|
110
|
+
# credentials
|
111
|
+
#
|
112
|
+
# list your api key
|
113
|
+
#
|
109
114
|
def index
|
110
115
|
puts Heroku::Auth.api_key
|
111
116
|
end
|
data/lib/vulcan/version.rb
CHANGED
@@ -20,6 +20,15 @@ a big variety of clients and is considered production-ready.
|
|
20
20
|
|
21
21
|
## Changelog
|
22
22
|
|
23
|
+
### v1.0.5
|
24
|
+
|
25
|
+
* Support filename="" in multipart parts
|
26
|
+
* Explain unexpected end() errors in parser better
|
27
|
+
|
28
|
+
### v1.0.4
|
29
|
+
|
30
|
+
* Detect a good default tmp directory regardless of plattform. (#88)
|
31
|
+
|
23
32
|
### v1.0.3
|
24
33
|
|
25
34
|
* Fix problems with utf8 characters (#84) / semicolons in filenames (#58)
|
@@ -142,9 +151,11 @@ Creates a new incoming form.
|
|
142
151
|
|
143
152
|
The encoding to use for incoming form fields.
|
144
153
|
|
145
|
-
#### incomingForm.uploadDir = '/tmp'
|
154
|
+
#### incomingForm.uploadDir = process.env.TMP || '/tmp' || process.cwd()
|
146
155
|
|
147
|
-
The directory for placing file uploads in. You can later on move them using
|
156
|
+
The directory for placing file uploads in. You can later on move them using
|
157
|
+
`fs.rename()`. The default directoy is picked at module load time depending on
|
158
|
+
the first existing directory from those listed above.
|
148
159
|
|
149
160
|
#### incomingForm.keepExtensions = false
|
150
161
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
if (global.GENTLY) require = GENTLY.hijack(require);
|
2
2
|
|
3
|
+
var fs = require('fs');
|
3
4
|
var util = require('./util'),
|
4
5
|
path = require('path'),
|
5
6
|
File = require('./file'),
|
@@ -17,7 +18,7 @@ function IncomingForm() {
|
|
17
18
|
|
18
19
|
this.maxFieldsSize = 2 * 1024 * 1024;
|
19
20
|
this.keepExtensions = false;
|
20
|
-
this.uploadDir =
|
21
|
+
this.uploadDir = IncomingForm.UPLOAD_DIR;
|
21
22
|
this.encoding = 'utf-8';
|
22
23
|
this.headers = null;
|
23
24
|
this.type = null;
|
@@ -32,6 +33,20 @@ function IncomingForm() {
|
|
32
33
|
util.inherits(IncomingForm, EventEmitter);
|
33
34
|
exports.IncomingForm = IncomingForm;
|
34
35
|
|
36
|
+
IncomingForm.UPLOAD_DIR = (function() {
|
37
|
+
var dirs = [process.env.TMP, '/tmp', process.cwd()];
|
38
|
+
for (var i = 0; i < dirs.length; i++) {
|
39
|
+
var dir = dirs[i];
|
40
|
+
var isDirectory = false;
|
41
|
+
|
42
|
+
try {
|
43
|
+
isDirectory = fs.statSync(dir).isDirectory();
|
44
|
+
} catch (e) {}
|
45
|
+
|
46
|
+
if (isDirectory) return dir;
|
47
|
+
}
|
48
|
+
})();
|
49
|
+
|
35
50
|
IncomingForm.prototype.parse = function(req, cb) {
|
36
51
|
this.pause = function() {
|
37
52
|
try {
|
@@ -147,7 +162,7 @@ IncomingForm.prototype.onPart = function(part) {
|
|
147
162
|
IncomingForm.prototype.handlePart = function(part) {
|
148
163
|
var self = this;
|
149
164
|
|
150
|
-
if (
|
165
|
+
if (part.filename === undefined) {
|
151
166
|
var value = ''
|
152
167
|
, decoder = new StringDecoder(this.encoding);
|
153
168
|
|
@@ -278,10 +293,7 @@ IncomingForm.prototype._initMultipart = function(boundary) {
|
|
278
293
|
part.name = m[1];
|
279
294
|
}
|
280
295
|
|
281
|
-
|
282
|
-
if (filename) {
|
283
|
-
part.filename = filename;
|
284
|
-
}
|
296
|
+
part.filename = self._fileName(headerValue);
|
285
297
|
} else if (headerField == 'content-type') {
|
286
298
|
part.mime = headerValue;
|
287
299
|
}
|
@@ -311,7 +323,7 @@ IncomingForm.prototype._initMultipart = function(boundary) {
|
|
311
323
|
};
|
312
324
|
|
313
325
|
IncomingForm.prototype._fileName = function(headerValue) {
|
314
|
-
var m = headerValue.match(/filename="(
|
326
|
+
var m = headerValue.match(/filename="(.*?)"($|; )/i)
|
315
327
|
if (!m) return;
|
316
328
|
|
317
329
|
var filename = m[1].substr(m[1].lastIndexOf('\\') + 1);
|
@@ -49,6 +49,13 @@ function MultipartParser() {
|
|
49
49
|
};
|
50
50
|
exports.MultipartParser = MultipartParser;
|
51
51
|
|
52
|
+
MultipartParser.stateToString = function(stateNumber) {
|
53
|
+
for (var state in S) {
|
54
|
+
var number = S[state];
|
55
|
+
if (number === stateNumber) return state;
|
56
|
+
}
|
57
|
+
};
|
58
|
+
|
52
59
|
MultipartParser.prototype.initWithBoundary = function(str) {
|
53
60
|
this.boundary = new Buffer(str.length+4);
|
54
61
|
this.boundary.write('\r\n--', 'ascii', 0);
|
@@ -296,6 +303,10 @@ MultipartParser.prototype.write = function(buffer) {
|
|
296
303
|
|
297
304
|
MultipartParser.prototype.end = function() {
|
298
305
|
if (this.state != S.END) {
|
299
|
-
return new Error('MultipartParser.end(): stream ended unexpectedly');
|
306
|
+
return new Error('MultipartParser.end(): stream ended unexpectedly: ' + this.explain());
|
300
307
|
}
|
301
308
|
};
|
309
|
+
|
310
|
+
MultipartParser.prototype.explain = function() {
|
311
|
+
return 'state = ' + MultipartParser.stateToString(this.state);
|
312
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
I am a plain text file
|
@@ -0,0 +1,13 @@
|
|
1
|
+
POST /upload HTTP/1.1
|
2
|
+
Host: localhost:8080
|
3
|
+
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarytyE4wkKlZ5CQJVTG
|
4
|
+
Content-Length: 1000
|
5
|
+
|
6
|
+
------WebKitFormBoundarytyE4wkKlZ5CQJVTG
|
7
|
+
Content-Disposition: form-data; name="upload"; filename=""
|
8
|
+
Content-Type: text/plain
|
9
|
+
|
10
|
+
I am a plain text file
|
11
|
+
|
12
|
+
------WebKitFormBoundarytyE4wkKlZ5CQJVTG--
|
13
|
+
|
@@ -24,13 +24,3 @@ Content-Type: text/plain
|
|
24
24
|
I am a text file with a funky name!
|
25
25
|
|
26
26
|
------WebKitFormBoundarytyE4wkKlZ5CQJVTG--
|
27
|
-
GET /favicon.ico HTTP/1.1
|
28
|
-
Host: localhost:8080
|
29
|
-
Connection: keep-alive
|
30
|
-
Accept: */*
|
31
|
-
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1
|
32
|
-
Accept-Encoding: gzip,deflate,sdch
|
33
|
-
Accept-Language: en-US,en;q=0.8
|
34
|
-
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
|
35
|
-
Cookie: jqCookieJar_tablesorter=%7B%22showListTable%22%3A%5B%5B5%2C1%5D%2C%5B1%2C0%5D%5D%7D
|
36
|
-
|
@@ -22,12 +22,3 @@ Content-Type: text/plain
|
|
22
22
|
|
23
23
|
|
24
24
|
------WebKitFormBoundaryEvqBNplR3ByrwQPa--
|
25
|
-
GET /favicon.ico HTTP/1.1
|
26
|
-
Host: 192.168.56.1:8080
|
27
|
-
Connection: keep-alive
|
28
|
-
Accept: */*
|
29
|
-
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30
|
30
|
-
Accept-Encoding: gzip,deflate,sdch
|
31
|
-
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
|
32
|
-
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
|
33
|
-
|
@@ -40,7 +40,7 @@ test(function parserError() {
|
|
40
40
|
|
41
41
|
test(function end() {
|
42
42
|
(function testError() {
|
43
|
-
assert.equal(parser.end().message, 'MultipartParser.end(): stream ended unexpectedly');
|
43
|
+
assert.equal(parser.end().message, 'MultipartParser.end(): stream ended unexpectedly: ' + parser.explain());
|
44
44
|
})();
|
45
45
|
|
46
46
|
(function testRegular() {
|
@@ -1,4 +1,15 @@
|
|
1
1
|
|
2
|
+
2.4.7 / 2011-10-05
|
3
|
+
==================
|
4
|
+
|
5
|
+
* Added mkdirp to express(1). Closes #795
|
6
|
+
* Added simple _json-config_ example
|
7
|
+
* Added shorthand for the parsed request's pathname via `req.path`
|
8
|
+
* Changed connect dep to 1.7.x to fix npm issue...
|
9
|
+
* Fixed `res.redirect()` __HEAD__ support. [reported by xerox]
|
10
|
+
* Fixed `req.flash()`, only escape args
|
11
|
+
* Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie]
|
12
|
+
|
2
13
|
2.4.6 / 2011-08-22
|
3
14
|
==================
|
4
15
|
|
@@ -9,7 +20,8 @@
|
|
9
20
|
|
10
21
|
* Added support for routes to handle errors. Closes #809
|
11
22
|
* Added `app.routes.all()`. Closes #803
|
12
|
-
* Added "basepath" setting to work in conjunction with reverse proxies etc.
|
23
|
+
* Added "basepath" setting to work in conjunction with reverse proxies etc.
|
24
|
+
* Refactored `Route` to use a single array of callbacks
|
13
25
|
* Added support for multiple callbacks for `app.param()`. Closes #801
|
14
26
|
Closes #805
|
15
27
|
* Changed: removed .call(self) for route callbacks
|
@@ -5,13 +5,14 @@
|
|
5
5
|
*/
|
6
6
|
|
7
7
|
var fs = require('fs')
|
8
|
-
, exec = require('child_process').exec
|
8
|
+
, exec = require('child_process').exec
|
9
|
+
, mkdirp = require('mkdirp');
|
9
10
|
|
10
11
|
/**
|
11
12
|
* Framework version.
|
12
13
|
*/
|
13
14
|
|
14
|
-
var version = '2.4.
|
15
|
+
var version = '2.4.7';
|
15
16
|
|
16
17
|
/**
|
17
18
|
* Add session support.
|
@@ -398,9 +399,9 @@ function prompt(msg, fn) {
|
|
398
399
|
*/
|
399
400
|
|
400
401
|
function mkdir(path, fn) {
|
401
|
-
|
402
|
+
mkdirp(path, 0755, function(err){
|
402
403
|
if (err) throw err;
|
403
|
-
console.log(' \
|
404
|
+
console.log(' \033[36mcreate\033[0m : ' + path);
|
404
405
|
fn && fn();
|
405
406
|
});
|
406
407
|
}
|
@@ -12,6 +12,7 @@
|
|
12
12
|
var http = require('http')
|
13
13
|
, req = http.IncomingMessage.prototype
|
14
14
|
, utils = require('./utils')
|
15
|
+
, parse = require('url').parse
|
15
16
|
, mime = require('mime');
|
16
17
|
|
17
18
|
/**
|
@@ -87,6 +88,17 @@ req.get = function(field, param){
|
|
87
88
|
return RegExp.$1 || RegExp.$2;
|
88
89
|
};
|
89
90
|
|
91
|
+
/**
|
92
|
+
* Short-hand for `require('url').parse(req.url).pathname`.
|
93
|
+
*
|
94
|
+
* @return {String}
|
95
|
+
* @api public
|
96
|
+
*/
|
97
|
+
|
98
|
+
req.__defineGetter__('path', function(){
|
99
|
+
return parse(this.url).pathname;
|
100
|
+
});
|
101
|
+
|
90
102
|
/**
|
91
103
|
* Check if the _Accept_ header is present, and includes the given `type`.
|
92
104
|
*
|
@@ -217,10 +229,10 @@ req.flash = function(type, msg){
|
|
217
229
|
, args = arguments
|
218
230
|
, formatters = this.app.flashFormatters || {};
|
219
231
|
formatters.__proto__ = flashFormatters;
|
220
|
-
msg = utils.miniMarkdown(
|
232
|
+
msg = utils.miniMarkdown(msg);
|
221
233
|
msg = msg.replace(/%([a-zA-Z])/g, function(_, format){
|
222
234
|
var formatter = formatters[format];
|
223
|
-
if (formatter) return formatter(args[i++]);
|
235
|
+
if (formatter) return formatter(utils.escape(args[i++]));
|
224
236
|
});
|
225
237
|
return (msgs[type] = msgs[type] || []).push(msg);
|
226
238
|
} else if (type) {
|
@@ -105,7 +105,7 @@ res.send = function(body, headers, status){
|
|
105
105
|
|
106
106
|
// respond
|
107
107
|
this.statusCode = status;
|
108
|
-
this.end('HEAD' == this.req.method ?
|
108
|
+
this.end('HEAD' == this.req.method ? null : body);
|
109
109
|
return this;
|
110
110
|
};
|
111
111
|
|
@@ -376,6 +376,7 @@ res.redirect = function(url, status){
|
|
376
376
|
, req = this.req
|
377
377
|
, base = app.set('basepath') || app.route
|
378
378
|
, status = status || 302
|
379
|
+
, head = 'HEAD' == req.method
|
379
380
|
, body;
|
380
381
|
|
381
382
|
// Setup redirect map
|
@@ -418,7 +419,7 @@ res.redirect = function(url, status){
|
|
418
419
|
// Respond
|
419
420
|
this.statusCode = status;
|
420
421
|
this.header('Location', url);
|
421
|
-
this.end(body);
|
422
|
+
this.end(head ? null : body);
|
422
423
|
};
|
423
424
|
|
424
425
|
/**
|
@@ -5,6 +5,19 @@
|
|
5
5
|
* MIT Licensed
|
6
6
|
*/
|
7
7
|
|
8
|
+
/**
|
9
|
+
* Check if `path` looks absolute.
|
10
|
+
*
|
11
|
+
* @param {String} path
|
12
|
+
* @return {Boolean}
|
13
|
+
* @api private
|
14
|
+
*/
|
15
|
+
|
16
|
+
exports.isAbsolute = function(path){
|
17
|
+
if ('/' == path[0]) return true;
|
18
|
+
if (':' == path[1] && '\\' == path[2]) return true;
|
19
|
+
};
|
20
|
+
|
8
21
|
/**
|
9
22
|
* Merge object `b` with `a` giving precedence to
|
10
23
|
* values in object `a`.
|
@@ -10,6 +10,7 @@
|
|
10
10
|
*/
|
11
11
|
|
12
12
|
var path = require('path')
|
13
|
+
, utils = require('../utils')
|
13
14
|
, extname = path.extname
|
14
15
|
, dirname = path.dirname
|
15
16
|
, basename = path.basename
|
@@ -99,7 +100,7 @@ View.prototype.resolvePath = function(){
|
|
99
100
|
// Implicit engine
|
100
101
|
if (!~this.basename.indexOf('.')) path += this.extension;
|
101
102
|
// Absolute
|
102
|
-
if (
|
103
|
+
if (utils.isAbsolute(path)) return path;
|
103
104
|
// Relative to parent
|
104
105
|
if (this.relative && this.parent) return this.parent.dirname + '/' + path;
|
105
106
|
// Relative to root
|
@@ -83,10 +83,10 @@ var mime = module.exports = {
|
|
83
83
|
|
84
84
|
// Load our local copy of
|
85
85
|
// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
|
86
|
-
mime.load(path.join(__dirname, 'mime.types'));
|
86
|
+
mime.load(path.join(__dirname, 'types/mime.types'));
|
87
87
|
|
88
|
-
// Overlay enhancements
|
89
|
-
mime.load(path.join(__dirname, 'node.types'));
|
88
|
+
// Overlay enhancements submitted by the node.js community
|
89
|
+
mime.load(path.join(__dirname, 'types/node.types'));
|
90
90
|
|
91
91
|
// Set the default type
|
92
92
|
mime.default_type = mime.types.bin;
|
@@ -1,11 +1,22 @@
|
|
1
|
-
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
,
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
{
|
2
|
+
"author": {
|
3
|
+
"name": "Robert Kieffer",
|
4
|
+
"url": "http://github.com/broofa",
|
5
|
+
"email": "robert@broofa.com"
|
6
|
+
},
|
7
|
+
"contributors": [
|
8
|
+
{
|
9
|
+
"name": "Benjamin Thomas",
|
10
|
+
"url": "http://github.com/bentomas",
|
11
|
+
"email": "benjamin@benjaminthomas.org"
|
12
|
+
}
|
13
|
+
],
|
14
|
+
"dependencies": {},
|
15
|
+
"description": "A comprehensive library for mime-type mapping",
|
16
|
+
"devDependencies": {"async_testing": ""},
|
17
|
+
"keywords": ["util", "mime"],
|
18
|
+
"main": "mime.js",
|
19
|
+
"name": "mime",
|
20
|
+
"repository": {"url": "http://github.com/bentomas/node-mime", "type": "git"},
|
21
|
+
"version": "1.2.4"
|
11
22
|
}
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/**
|
2
|
-
* Requires the async_testing module
|
3
|
-
* of this module.
|
2
|
+
* Requires the async_testing module
|
4
3
|
*
|
5
|
-
*
|
4
|
+
* Usage: node test.js
|
6
5
|
*/
|
7
6
|
var mime = require('./mime');
|
8
7
|
exports["test mime lookup"] = function(test) {
|
File without changes
|
@@ -1,3 +1,20 @@
|
|
1
|
+
# What: Google Chrome Extension
|
2
|
+
# Why: To allow apps to (work) be served with the right content type header.
|
3
|
+
# http://codereview.chromium.org/2830017
|
4
|
+
# Added by: niftylettuce
|
5
|
+
application/x-chrome-extension crx
|
6
|
+
|
7
|
+
# What: OTF Message Silencer
|
8
|
+
# Why: To silence the "Resource interpreted as font but transferred with MIME
|
9
|
+
# type font/otf" message that occurs in Google Chrome
|
10
|
+
# Added by: niftylettuce
|
11
|
+
font/opentype otf
|
12
|
+
|
13
|
+
# What: HTC support
|
14
|
+
# Why: To properly render .htc files such as CSS3PIE
|
15
|
+
# Added by: niftylettuce
|
16
|
+
text/x-component htc
|
17
|
+
|
1
18
|
# What: HTML5 application cache manifest
|
2
19
|
# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps
|
3
20
|
# per https://developer.mozilla.org/en/offline_resources_in_firefox
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright 2010 James Halliday (mail@substack.net)
|
2
|
+
|
3
|
+
This project is free software released under the MIT/X11 license:
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
mkdirp
|
2
|
+
======
|
3
|
+
|
4
|
+
Like `mkdir -p`, but in node.js!
|
5
|
+
|
6
|
+
Example
|
7
|
+
=======
|
8
|
+
|
9
|
+
pow.js
|
10
|
+
------
|
11
|
+
var mkdirp = require('mkdirp');
|
12
|
+
|
13
|
+
mkdirp('/tmp/foo/bar/baz', 0755, function (err) {
|
14
|
+
if (err) console.error(err)
|
15
|
+
else console.log('pow!')
|
16
|
+
});
|
17
|
+
|
18
|
+
Output
|
19
|
+
pow!
|
20
|
+
|
21
|
+
And now /tmp/foo/bar/baz exists, huzzah!
|
@@ -0,0 +1,19 @@
|
|
1
|
+
--- examples/pow.js
|
2
|
+
+++ examples/pow.js
|
3
|
+
@@ -1,6 +1,15 @@
|
4
|
+
-var mkdirp = require('mkdirp').mkdirp;
|
5
|
+
+var mkdirp = require('../').mkdirp,
|
6
|
+
+ mkdirpSync = require('../').mkdirpSync;
|
7
|
+
|
8
|
+
mkdirp('/tmp/foo/bar/baz', 0755, function (err) {
|
9
|
+
if (err) console.error(err)
|
10
|
+
else console.log('pow!')
|
11
|
+
});
|
12
|
+
+
|
13
|
+
+try {
|
14
|
+
+ mkdirpSync('/tmp/bar/foo/baz', 0755);
|
15
|
+
+ console.log('double pow!');
|
16
|
+
+}
|
17
|
+
+catch (ex) {
|
18
|
+
+ console.log(ex);
|
19
|
+
+}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
var path = require('path');
|
2
|
+
var fs = require('fs');
|
3
|
+
|
4
|
+
var exports = module.exports = function mkdirP (p, mode, f) {
|
5
|
+
var cb = f || function () {};
|
6
|
+
p = path.resolve(p);
|
7
|
+
|
8
|
+
var ps = path.normalize(p).split('/');
|
9
|
+
path.exists(p, function (exists) {
|
10
|
+
if (exists) cb(null);
|
11
|
+
else mkdirP(ps.slice(0,-1).join('/'), mode, function (err) {
|
12
|
+
if (err && err.code !== 'EEXIST') cb(err)
|
13
|
+
else fs.mkdir(p, mode, function (err) {
|
14
|
+
if (err && err.code !== 'EEXIST') cb(err)
|
15
|
+
else cb()
|
16
|
+
});
|
17
|
+
});
|
18
|
+
});
|
19
|
+
};
|
20
|
+
exports.mkdirp = exports.mkdirP = module.exports;
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{
|
2
|
+
"name" : "mkdirp",
|
3
|
+
"description" : "Recursively mkdir, like `mkdir -p`",
|
4
|
+
"version" : "0.0.7",
|
5
|
+
"author" : "James Halliday <mail@substack.net> (http://substack.net)",
|
6
|
+
"main" : "./index",
|
7
|
+
"keywords" : [
|
8
|
+
"mkdir",
|
9
|
+
"directory"
|
10
|
+
],
|
11
|
+
"repository" : {
|
12
|
+
"type" : "git",
|
13
|
+
"url" : "http://github.com/substack/node-mkdirp.git"
|
14
|
+
},
|
15
|
+
"scripts" : {
|
16
|
+
"test" : "node node_modules/tap/bin/tap.js test/*.js"
|
17
|
+
},
|
18
|
+
"devDependencies" : {
|
19
|
+
"tap" : "0.0.x"
|
20
|
+
},
|
21
|
+
"license" : "MIT/X11",
|
22
|
+
"engines": { "node": "*" }
|
23
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
var mkdirp = require('../');
|
2
|
+
var path = require('path');
|
3
|
+
var fs = require('fs');
|
4
|
+
var test = require('tap').test;
|
5
|
+
|
6
|
+
test('woo', function (t) {
|
7
|
+
t.plan(2);
|
8
|
+
var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
|
9
|
+
var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
|
10
|
+
var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
|
11
|
+
|
12
|
+
var file = '/tmp/' + [x,y,z].join('/');
|
13
|
+
|
14
|
+
mkdirp(file, 0755, function (err) {
|
15
|
+
if (err) t.fail(err);
|
16
|
+
else path.exists(file, function (ex) {
|
17
|
+
if (!ex) t.fail('file not created')
|
18
|
+
else fs.stat(file, function (err, stat) {
|
19
|
+
if (err) t.fail(err)
|
20
|
+
else {
|
21
|
+
t.equal(stat.mode & 0777, 0755);
|
22
|
+
t.ok(stat.isDirectory(), 'target not a directory');
|
23
|
+
t.end();
|
24
|
+
}
|
25
|
+
})
|
26
|
+
})
|
27
|
+
});
|
28
|
+
});
|
@@ -0,0 +1,41 @@
|
|
1
|
+
var mkdirp = require('../').mkdirp;
|
2
|
+
var path = require('path');
|
3
|
+
var fs = require('fs');
|
4
|
+
var test = require('tap').test;
|
5
|
+
|
6
|
+
test('race', function (t) {
|
7
|
+
t.plan(4);
|
8
|
+
var ps = [ '', 'tmp' ];
|
9
|
+
|
10
|
+
for (var i = 0; i < 25; i++) {
|
11
|
+
var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
|
12
|
+
ps.push(dir);
|
13
|
+
}
|
14
|
+
var file = ps.join('/');
|
15
|
+
|
16
|
+
var res = 2;
|
17
|
+
mk(file, function () {
|
18
|
+
if (--res === 0) t.end();
|
19
|
+
});
|
20
|
+
|
21
|
+
mk(file, function () {
|
22
|
+
if (--res === 0) t.end();
|
23
|
+
});
|
24
|
+
|
25
|
+
function mk (file, cb) {
|
26
|
+
mkdirp(file, 0755, function (err) {
|
27
|
+
if (err) t.fail(err);
|
28
|
+
else path.exists(file, function (ex) {
|
29
|
+
if (!ex) t.fail('file not created')
|
30
|
+
else fs.stat(file, function (err, stat) {
|
31
|
+
if (err) t.fail(err)
|
32
|
+
else {
|
33
|
+
t.equal(stat.mode & 0777, 0755);
|
34
|
+
t.ok(stat.isDirectory(), 'target not a directory');
|
35
|
+
if (cb) cb();
|
36
|
+
}
|
37
|
+
})
|
38
|
+
})
|
39
|
+
});
|
40
|
+
}
|
41
|
+
});
|
@@ -0,0 +1,32 @@
|
|
1
|
+
var mkdirp = require('../');
|
2
|
+
var path = require('path');
|
3
|
+
var fs = require('fs');
|
4
|
+
var test = require('tap').test;
|
5
|
+
|
6
|
+
test('rel', function (t) {
|
7
|
+
t.plan(2);
|
8
|
+
var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
|
9
|
+
var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
|
10
|
+
var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
|
11
|
+
|
12
|
+
var cwd = process.cwd();
|
13
|
+
process.chdir('/tmp');
|
14
|
+
|
15
|
+
var file = [x,y,z].join('/');
|
16
|
+
|
17
|
+
mkdirp(file, 0755, function (err) {
|
18
|
+
if (err) t.fail(err);
|
19
|
+
else path.exists(file, function (ex) {
|
20
|
+
if (!ex) t.fail('file not created')
|
21
|
+
else fs.stat(file, function (err, stat) {
|
22
|
+
if (err) t.fail(err)
|
23
|
+
else {
|
24
|
+
process.chdir(cwd);
|
25
|
+
t.equal(stat.mode & 0777, 0755);
|
26
|
+
t.ok(stat.isDirectory(), 'target not a directory');
|
27
|
+
t.end();
|
28
|
+
}
|
29
|
+
})
|
30
|
+
})
|
31
|
+
});
|
32
|
+
});
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "express",
|
3
3
|
"description": "Sinatra inspired web development framework",
|
4
|
-
"version": "2.4.
|
4
|
+
"version": "2.4.7",
|
5
5
|
"author": "TJ Holowaychuk <tj@vision-media.ca>",
|
6
6
|
"contributors": [
|
7
7
|
{ "name": "TJ Holowaychuk", "email": "tj@vision-media.ca" },
|
@@ -10,9 +10,10 @@
|
|
10
10
|
{ "name": "Guillermo Rauch", "email": "rauchg@gmail.com" }
|
11
11
|
],
|
12
12
|
"dependencies": {
|
13
|
-
"connect": "
|
13
|
+
"connect": "1.7.x",
|
14
14
|
"mime": ">= 0.0.1",
|
15
|
-
"qs": ">= 0.3.1"
|
15
|
+
"qs": ">= 0.3.1",
|
16
|
+
"mkdirp": "0.0.7"
|
16
17
|
},
|
17
18
|
"devDependencies": {
|
18
19
|
"connect-form": "0.2.1",
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
/**
|
3
|
+
* Module dependencies.
|
4
|
+
*/
|
5
|
+
|
6
|
+
var express = require('../')
|
7
|
+
, crypto = require('crypto');
|
8
|
+
|
9
|
+
var app = express.createServer();
|
10
|
+
|
11
|
+
app.get('/', function(req, res){
|
12
|
+
res.set({ foo: 'bar', bar: 'baz' });
|
13
|
+
res.set('X-API-Key', 'foobarbaz');
|
14
|
+
res.send('ok');
|
15
|
+
});
|
16
|
+
|
17
|
+
app.listen(3000);
|
@@ -0,0 +1 @@
|
|
1
|
+
h2 Users
|
data/server/web.js
CHANGED
@@ -34,62 +34,59 @@ app.post('/make', function(request, response, next) {
|
|
34
34
|
// form handler
|
35
35
|
request.form.complete(function(err, fields, files) {
|
36
36
|
|
37
|
-
// if there's an error
|
38
|
-
if (err) {
|
39
|
-
|
40
|
-
// pass through to the next handler
|
41
|
-
next(err);
|
37
|
+
// if there's an error, pass through to the next handler
|
38
|
+
if (err) { return next(err); }
|
42
39
|
|
40
|
+
// match on the shared secret
|
41
|
+
if (fields.secret != process.env.SECRET) {
|
42
|
+
response.write('invalid secret');
|
43
|
+
response.send(500);
|
43
44
|
} else {
|
44
45
|
|
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
|
-
// return the build id as a header
|
89
|
-
response.header('X-Make-Id', id);
|
90
|
-
});
|
91
|
-
}
|
46
|
+
var id = uuid();
|
47
|
+
var command = fields.command;
|
48
|
+
var prefix = fields.prefix;
|
49
|
+
|
50
|
+
// create a couchdb documents for this build
|
51
|
+
db.save(id, { command:command, prefix:prefix }, function(err, doc) {
|
52
|
+
if (err) { return next(err); }
|
53
|
+
|
54
|
+
// save the input tarball as an attachment
|
55
|
+
db.saveAttachment(
|
56
|
+
doc.id,
|
57
|
+
doc.rev,
|
58
|
+
'input',
|
59
|
+
'application/octet-stream',
|
60
|
+
fs.createReadStream(files.code.path),
|
61
|
+
function(err, data) {
|
62
|
+
if (err) { return next(err); }
|
63
|
+
|
64
|
+
// spawn bin/make with this build id
|
65
|
+
var ls = spawner.spawn('bin/make ' + id, function(err) {
|
66
|
+
response.write('could not spawn: ' + err);
|
67
|
+
response.send(500);
|
68
|
+
});
|
69
|
+
|
70
|
+
ls.on('error', function(error) {
|
71
|
+
response.write('error: ' + err);
|
72
|
+
response.send(500);
|
73
|
+
});
|
74
|
+
|
75
|
+
ls.on('data', function(data) {
|
76
|
+
response.write(data);
|
77
|
+
});
|
78
|
+
|
79
|
+
ls.on('exit', function(code) {
|
80
|
+
response.end();
|
81
|
+
});
|
82
|
+
}
|
83
|
+
);
|
84
|
+
|
85
|
+
// return the build id as a header
|
86
|
+
response.header('X-Make-Id', id);
|
87
|
+
});
|
92
88
|
}
|
89
|
+
|
93
90
|
});
|
94
91
|
}
|
95
92
|
});
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vulcan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-09
|
12
|
+
date: 2011-12-09 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multipart-post
|
16
|
-
requirement: &
|
16
|
+
requirement: &70327900819780 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.1.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70327900819780
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rest-client
|
27
|
-
requirement: &
|
27
|
+
requirement: &70327900819280 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.6.7
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70327900819280
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: thor
|
38
|
-
requirement: &
|
38
|
+
requirement: &70327900818820 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 0.14.6
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70327900818820
|
47
47
|
description: Build software in the cloud
|
48
48
|
email: ddollar@gmail.com
|
49
49
|
executables:
|
@@ -82,6 +82,8 @@ files:
|
|
82
82
|
- server/node_modules/connect-form/node_modules/formidable/test/fast/test-incoming-form.js
|
83
83
|
- ! 'server/node_modules/connect-form/node_modules/formidable/test/fixture/file/:
|
84
84
|
\ ? % * | " < > . ☃ ; '' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt'
|
85
|
+
- server/node_modules/connect-form/node_modules/formidable/test/fixture/file/plain.txt
|
86
|
+
- server/node_modules/connect-form/node_modules/formidable/test/fixture/http/no-filename/generic.http
|
85
87
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md
|
86
88
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http
|
87
89
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http
|
@@ -90,6 +92,7 @@ files:
|
|
90
92
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-7.http
|
91
93
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-8.http
|
92
94
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-safari-5.http
|
95
|
+
- server/node_modules/connect-form/node_modules/formidable/test/fixture/js/no-filename.js
|
93
96
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/js/special-chars-in-filename.js
|
94
97
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/multi_video.upload
|
95
98
|
- server/node_modules/connect-form/node_modules/formidable/test/fixture/multipart.js
|
@@ -454,14 +457,23 @@ files:
|
|
454
457
|
- server/node_modules/express/node_modules/connect/LICENSE
|
455
458
|
- server/node_modules/express/node_modules/connect/package.json
|
456
459
|
- server/node_modules/express/node_modules/connect/test.js
|
457
|
-
- server/node_modules/express/node_modules/mime/index.js
|
458
460
|
- server/node_modules/express/node_modules/mime/LICENSE
|
459
461
|
- server/node_modules/express/node_modules/mime/mime.js
|
460
|
-
- server/node_modules/express/node_modules/mime/mime.types
|
461
|
-
- server/node_modules/express/node_modules/mime/node.types
|
462
462
|
- server/node_modules/express/node_modules/mime/package.json
|
463
463
|
- server/node_modules/express/node_modules/mime/README.md
|
464
464
|
- server/node_modules/express/node_modules/mime/test.js
|
465
|
+
- server/node_modules/express/node_modules/mime/types/mime.types
|
466
|
+
- server/node_modules/express/node_modules/mime/types/node.types
|
467
|
+
- server/node_modules/express/node_modules/mkdirp/examples/pow.js
|
468
|
+
- server/node_modules/express/node_modules/mkdirp/examples/pow.js.orig
|
469
|
+
- server/node_modules/express/node_modules/mkdirp/examples/pow.js.rej
|
470
|
+
- server/node_modules/express/node_modules/mkdirp/index.js
|
471
|
+
- server/node_modules/express/node_modules/mkdirp/LICENSE
|
472
|
+
- server/node_modules/express/node_modules/mkdirp/package.json
|
473
|
+
- server/node_modules/express/node_modules/mkdirp/README.markdown
|
474
|
+
- server/node_modules/express/node_modules/mkdirp/test/mkdirp.js
|
475
|
+
- server/node_modules/express/node_modules/mkdirp/test/race.js
|
476
|
+
- server/node_modules/express/node_modules/mkdirp/test/rel.js
|
465
477
|
- server/node_modules/express/node_modules/qs/benchmark.js
|
466
478
|
- server/node_modules/express/node_modules/qs/examples.js
|
467
479
|
- server/node_modules/express/node_modules/qs/History.md
|
@@ -502,6 +514,8 @@ files:
|
|
502
514
|
- server/node_modules/express/node_modules/qs/test/stringify.test.js
|
503
515
|
- server/node_modules/express/package.json
|
504
516
|
- server/node_modules/express/Readme.md
|
517
|
+
- server/node_modules/express/testing/index.js
|
518
|
+
- server/node_modules/express/testing/views/users.jade
|
505
519
|
- server/node_modules/knox/History.md
|
506
520
|
- server/node_modules/knox/index.html
|
507
521
|
- server/node_modules/knox/index.js
|
@@ -1 +0,0 @@
|
|
1
|
-
module.exports = require('./mime');
|