/* ! 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 = "../"; var 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); }