/* ! update.js run $ npm install run $ node unpdate.js Downloads latest version of microformat-shiv and it tests form github repo Files downloaded: * microformat-shiv.js (note: modern version) * lib * test/interface-tests * test/module-tests * test/standards-tests * test/static Copyright (C) 2015 Glenn Jones. All Rights Reserved. MIT License: https://raw.github.com/glennjones/microformat-shiv/master/license.txt */ // configuration var deployDir = '../' exportedSymbol = 'try {\n // mozilla jsm support\n Components.utils.importGlobalProperties(["URL"]);\n} catch(e) {}\nthis.EXPORTED_SYMBOLS = [\'Microformats\'];'; var path = require('path'), request = require('request'), fs = require('fs-extra'), download = require('download-github-repo'); var repo = 'glennjones/microformat-shiv', tempDir = path.resolve(__dirname, 'temp-repo'), deployDirResolved = path.resolve(__dirname, deployDir), pathList = [ ['/modern/microformat-shiv-modern.js', '/microformat-shiv.js'], ['/lib', '/test/lib'], ['/test/interface-tests', '/test/interface-tests'], ['/test/module-tests', '/test/module-tests'], ['/test/standards-tests', '/test/standards-tests'], ['/test/static', '/test/static'] ]; getLastBuildState( repo, function( err, buildState) { if (buildState) { console.log('last build state:', buildState); if (buildState === 'passed') { console.log('downloading git repo', repo); getLastCommitDate( repo, function( err, date) { if (date) { console.log( 'last commit:', new Date(date).toString() ); } }); updateFromRepo(); } else { console.log('not updating because of build state is failing please contact Glenn Jones glennjones@gmail.com'); } } else { console.log('could not get build state from travis-ci:', err); } }); /** * updates from directories and files from repo * */ function updateFromRepo() { download(repo, tempDir, function(err, data) { // the err and data from download-github-repo give false negatives if ( fs.existsSync( tempDir ) ) { var version = getRepoVersion(); removeCurrentFiles( pathList, deployDirResolved ); addNewFiles( pathList, deployDirResolved ); fs.removeSync(tempDir); // changes files for firefox replaceInFile('/test/module-tests/index.html', /..\/..\/lib\//g, '../lib/' ); addExportedSymbol( '/microformat-shiv.js' ); console.log('microformat-shiv is now uptodate to v' + version); } else { console.log('error getting repo', err); } }); } /** * removes old version of delpoyed directories and files * * @param {Array} pathList * @param {String} deployDirResolved */ function removeCurrentFiles( pathList, deployDirResolved ) { pathList.forEach( function( path ) { console.log('removed:', deployDirResolved + path[1]); fs.removeSync(deployDirResolved + path[1]); }); } /** * copies over required directories and files into deployed path * * @param {Array} pathList * @param {String} deployDirResolved */ function addNewFiles( pathList, deployDirResolved ) { pathList.forEach( function( path ) { console.log('added:', deployDirResolved + path[1]); fs.copySync(tempDir + path[0], deployDirResolved + path[1]); }); } /** * gets the repo version number * * @return {String} */ function getRepoVersion() { var pack = fs.readFileSync(path.resolve(tempDir, 'package.json'), {encoding: 'utf8'}); if (pack) { pack = JSON.parse(pack) if (pack && pack.version) { return pack.version; } } return ''; } /** * get the last commit date from github repo * * @param {String} repo * @param {Function} callback */ function getLastCommitDate( repo, callback ) { var options = { url: 'https://api.github.com/repos/' + repo + '/commits?per_page=1', headers: { 'User-Agent': 'request' } }; request(options, function (error, response, body) { if (!error && response.statusCode == 200) { var date = null, json = JSON.parse(body); if (json && json.length && json[0].commit && json[0].commit.author ) { date = json[0].commit.author.date; } callback(null, date); } else { console.log(error, response, body); callback('fail to get last commit date', null); } }); } /** * get the last build state from travis-ci * * @param {String} repo * @param {Function} callback */ function getLastBuildState( repo, callback ) { var options = { url: 'https://api.travis-ci.org/repos/' + repo, headers: { 'User-Agent': 'request', 'Accept': 'application/vnd.travis-ci.2+json' } }; request(options, function (error, response, body) { if (!error && response.statusCode == 200) { var buildState = null, json = JSON.parse(body); if (json && json.repo && json.repo.last_build_state ) { buildState = json.repo.last_build_state; } callback(null, buildState); } else { console.log(error, response, body); callback('fail to get last build state', null); } }); } /** * adds exported symbol to microformat-shiv.js file * * @param {String} path * @param {String} content */ function addExportedSymbol( path ) { if (path === '/microformat-shiv.js') { fs.appendFileSync(deployDirResolved + '/microformat-shiv.js', '\r\n' + exportedSymbol + '\r\n'); console.log('appended exported symbol to microformat-shiv.js'); } } /** * adds exported symbol to microformat-shiv.js file * * @param {String} path * @param {String} content */ function replaceInFile( path, findStr, replaceStr ) { readFile(deployDirResolved + path, function(err, fileStr) { if (fileStr) { fileStr = fileStr.replace(findStr, replaceStr) writeFile(deployDirResolved + path, fileStr); console.log('replaced ' + findStr + ' with ' + replaceStr + ' in ' + path); } else { console.log('error replaced strings in ' + path); } }) } /** * write a file * * @param {String} path * @param {String} content */ function writeFile(path, content) { fs.writeFile(path, content, 'utf8', function(err) { if (err) { console.log(err); } else { console.log('The file: ' + path + ' was saved'); } }); } /** * read a file * * @param {String} path * @param {Function} callback */ function readFile(path, callback) { fs.readFile(path, 'utf8', callback); }