89 lines
2.7 KiB
JavaScript
Raw Normal View History

'use strict';
var GITHUB_CLIENT_ID = '2031dbe958e741775201';
var GITHUB_CLIENT_SECRET = 'd509a1e5e89248ce5d4211cb06995edcd979667d';
var SCOPE = 'public_repo';
var fs = require('fs');
var qs = require('querystring');
var crypto = require('crypto');
var express = require('express');
var opener = require('opener');
var github = require('github-basic');
var pr = require('pull-request');
var readdirp = require('lsr').sync;
// todo: check that the version is a new un-released version
// todo: check the user has commit access to the github repo
// todo: check the user is an owner in npm
// todo: check History.md has been updated
var version = require('./package.json').version;
var compiledWebsite = require('./docs/stop.js');
function getToken(gotToken) {
try {
var settings = JSON.parse(fs.readFileSync(__dirname + '/.release.json', 'utf8'));
return gotToken(settings.token);
} catch (ex) {
// use server to initialize config
}
var app = express();
var state = crypto.randomBytes(8).toString('hex');
var server = null;
app.get('/', function (req, res, next) {
if (req.query.code) return next();
res.redirect('https://github.com/login/oauth/authorize?client_id=' + GITHUB_CLIENT_ID
+ '&scope=' + SCOPE
+ '&redirect_uri=http://localhost:1337/'
+ '&state=' + state);
});
app.get('/', function (req, res, next) {
var code = req.query.code;
var u = 'https://github.com/login/oauth/access_token'
+ '?client_id=' + GITHUB_CLIENT_ID
+ '&client_secret=' + GITHUB_CLIENT_SECRET
+ '&code=' + code
+ '&state=' + state;
github.buffer('GET', u, {}, {}, function (err, response) {
if (err) return next(err);
req.token = qs.parse(response.body);
next();
});
});
app.get('/', function (req, res, next) {
res.send('got token, return to terminal');
server.close();
fs.writeFileSync(__dirname + '/.release.json', JSON.stringify({token: req.token}));
gotToken(req.token);
});
server = app.listen(1337);
server.setTimeout(3000);
opener('http://localhost:1337');
}
getToken(function (token) {
compiledWebsite.then(function () {
var fileUpdates = readdirp(__dirname + '/docs/out').filter(function (info) {
return info.isFile();
}).map(function (info) {
return {
path: info.path.replace(/^\.\//, ''),
content: fs.readFileSync(info.fullPath)
};
});
return pr.commit('visionmedia', 'jade', {
branch: 'gh-pages',
message: 'Update website for ' + version,
updates: fileUpdates
}, {auth: {type: 'oauth', token: token.access_token}});
}).then(function () {
// todo: release the new npm package, set the tag and commit etc.
}).done();
});