You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2014/04/24 18:21:12 UTC
git commit: Moved prepare-release-branch and tag-release into new
module "cadance-release"
Repository: cordova-coho
Updated Branches:
refs/heads/master 5fe52de8f -> 3da926b21
Moved prepare-release-branch and tag-release into new module "cadance-release"
Project: http://git-wip-us.apache.org/repos/asf/cordova-coho/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-coho/commit/3da926b2
Tree: http://git-wip-us.apache.org/repos/asf/cordova-coho/tree/3da926b2
Diff: http://git-wip-us.apache.org/repos/asf/cordova-coho/diff/3da926b2
Branch: refs/heads/master
Commit: 3da926b2176da8a8fde540b3ed01803e44dc468d
Parents: 5fe52de
Author: Andrew Grieve <ag...@chromium.org>
Authored: Thu Apr 24 12:20:43 2014 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Apr 24 12:20:43 2014 -0400
----------------------------------------------------------------------
coho | 2 +-
src/cadance-release.js | 260 ++++++++++++++++++++++++++++++++++++++++++++
src/executil.js | 2 +-
src/gitutil.js | 8 ++
src/main.js | 257 +------------------------------------------
5 files changed, 274 insertions(+), 255 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/3da926b2/coho
----------------------------------------------------------------------
diff --git a/coho b/coho
index a9e2902..e56322e 100755
--- a/coho
+++ b/coho
@@ -24,4 +24,4 @@ try {
console.log('Node v0.11.0 or higher is required. You have ' + process.version);
process.exit(1);
}
-require('./src/main');
+require('./src/main')();
http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/3da926b2/src/cadance-release.js
----------------------------------------------------------------------
diff --git a/src/cadance-release.js b/src/cadance-release.js
new file mode 100644
index 0000000..b068bb7
--- /dev/null
+++ b/src/cadance-release.js
@@ -0,0 +1,260 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+var fs = require('fs');
+var path = require('path');
+var optimist = require('optimist');
+var shelljs = require('shelljs');
+var apputil = require('./apputil');
+var executil = require('./executil');
+var flagutil = require('./flagutil');
+var gitutil = require('./gitutil');
+var repoutil = require('./repoutil');
+var repoupdate = require('./repo-update');
+var print = apputil.print;
+
+function createPlatformDevVersion(version) {
+ // e.g. "3.1.0" -> "3.2.0-dev".
+ // e.g. "3.1.2-0.8.0-rc2" -> "3.2.0-0.8.0-dev".
+ version = version.replace(/-rc.*$/, '');
+ var parts = version.split('.');
+ parts[1] = String(+parts[1] + 1);
+ var cliSafeParts = parts[2].split('-');
+ cliSafeParts[0] = '0';
+ parts[2] = cliSafeParts.join('-');
+ return parts.join('.') + '-dev';
+}
+
+function getVersionBranchName(version) {
+ if (/-dev$/.test(version)) {
+ return 'master';
+ }
+ return version.replace(/\d+(-?rc\d)?$/, 'x');
+}
+
+function cpAndLog(src, dest) {
+ print('Coping File:', src, '->', dest);
+ // Throws upon failure.
+ shelljs.cp('-f', src, dest);
+ if (shelljs.error()) {
+ apputil.fatal('Copy failed.');
+ }
+}
+
+function configureReleaseCommandFlags(opt) {
+ var opt = flagutil.registerRepoFlag(opt)
+ opt = opt
+ .options('version', {
+ desc: 'The version to use for the branch. Must match the pattern #.#.#[-rc#]',
+ demand: true
+ });
+ opt = flagutil.registerHelpFlag(opt);
+ argv = opt.argv;
+
+ if (argv.h) {
+ optimist.showHelp();
+ process.exit(1);
+ }
+ var version = flagutil.validateVersionString(argv.version);
+ return argv;
+}
+
+var hasBuiltJs = '';
+
+function *updateJsSnapshot(repo, version) {
+ function *ensureJsIsBuilt() {
+ var cordovaJsRepo = repoutil.getRepoById('js');
+ if (hasBuiltJs != version) {
+ yield repoutil.forEachRepo([cordovaJsRepo], function*() {
+ yield gitutil.stashAndPop(cordovaJsRepo, function*() {
+ if (getVersionBranchName(version) == 'master') {
+ yield gitutil.gitCheckout('master');
+ } else {
+ yield gitutil.gitCheckout(version);
+ }
+ yield executil.execHelper(executil.ARGS('grunt'));
+ hasBuiltJs = version;
+ });
+ });
+ }
+ }
+
+ if (repoutil.repoGroups.platform.indexOf(repo) == -1) {
+ return;
+ }
+
+ if (repo.cordovaJsPaths) {
+ yield ensureJsIsBuilt();
+ repo.cordovaJsPaths.forEach(function(jsPath) {
+ var src = path.join('..', 'cordova-js', 'pkg', repo.cordovaJsSrcName || ('cordova.' + repo.id + '.js'));
+ cpAndLog(src, jsPath);
+ });
+ if (yield gitutil.pendingChangesExist()) {
+ yield executil.execHelper(executil.ARGS('git commit -am', 'Update JS snapshot to version ' + version + ' (via coho)'));
+ }
+ } else if (repoutil.repoGroups.all.indexOf(repo) != -1) {
+ print('*** DO NOT KNOW HOW TO UPDATE cordova.js FOR THIS REPO ***');
+ }
+}
+
+function *updateRepoVersion(repo, version) {
+ // Update the VERSION files.
+ var versionFilePaths = repo.versionFilePaths || ['VERSION'];
+ if (fs.existsSync(versionFilePaths[0])) {
+ versionFilePaths.forEach(function(versionFilePath) {
+ fs.writeFileSync(versionFilePath, version + '\n');
+ });
+ shelljs.config.fatal = true;
+ if (repo.id == 'android') {
+ shelljs.sed('-i', /CORDOVA_VERSION.*=.*;/, 'CORDOVA_VERSION = "' + version + '";', path.join('framework', 'src', 'org', 'apache', 'cordova', 'CordovaWebView.java'));
+ shelljs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('bin', 'templates', 'cordova', 'version'));
+ }
+ shelljs.config.fatal = false;
+ if (!(yield gitutil.pendingChangesExist())) {
+ print('VERSION file was already up-to-date.');
+ }
+ } else {
+ console.warn('No VERSION file exists in repo ' + repo.repoName);
+ }
+
+ if (yield gitutil.pendingChangesExist()) {
+ yield executil.execHelper(executil.ARGS('git commit -am', 'Set VERSION to ' + version + ' (via coho)'));
+ }
+}
+
+exports.prepareReleaseBranchCommand = function*() {
+ var argv = configureReleaseCommandFlags(optimist
+ .usage('Prepares release branches but does not create tags. This includes:\n' +
+ ' 1. Creating the branch if it doesn\'t already exist\n' +
+ ' 2. Updating cordova.js snapshot and VERSION file.\n' +
+ '\n' +
+ 'Command is safe to run multiple times, and can be run for the purpose\n' +
+ 'of checking out existing release branches.\n' +
+ '\n' +
+ 'Command can also be used to update the JS snapshot after release \n' +
+ 'branches have been created.\n' +
+ '\n' +
+ 'Usage: $0 prepare-release-branch --version=2.8.0-rc1')
+ );
+ var repos = flagutil.computeReposFromFlag(argv.r);
+ var version = flagutil.validateVersionString(argv.version);
+ var branchName = getVersionBranchName(version);
+
+ // First - perform precondition checks.
+ yield repoupdate.updateRepos(repos, [], true);
+
+ var cordovaJsRepo = repoutil.getRepoById('js');
+
+ // Ensure cordova-js comes first.
+ var repoIndex = repos.indexOf(cordovaJsRepo);
+ if (repoIndex != -1) {
+ repos.splice(repoIndex, 1);
+ repos.unshift(cordovaJsRepo);
+ }
+
+ yield repoutil.forEachRepo(repos, function*(repo) {
+ yield gitutil.stashAndPop(repo, function*() {
+ // git fetch + update master
+ yield repoupdate.updateRepos([repo], ['master'], false);
+
+ // Either create or pull down the branch.
+ if (yield gitutil.remoteBranchExists(repo, branchName)) {
+ print('Remote branch already exists for repo: ' + repo.repoName);
+ // Check out and rebase.
+ yield repoupdate.updateRepos([repo], [branchName], true);
+ yield gitutil.gitCheckout(branchName);
+ } else if (yield gitutil.localBranchExists(branchName)) {
+ yield executil.execHelper(executil.ARGS('git checkout ' + branchName));
+ } else {
+ yield gitutil.gitCheckout('master');
+ yield executil.execHelper(executil.ARGS('git checkout -b ' + branchName));
+ }
+ yield updateJsSnapshot(repo, version);
+ print(repo.repoName + ': ' + 'Setting VERSION to "' + version + '" on branch + "' + branchName + '".');
+ yield updateRepoVersion(repo, version);
+
+ yield gitutil.gitCheckout('master');
+ var devVersion = createPlatformDevVersion(version);
+ print(repo.repoName + ': ' + 'Setting VERSION to "' + devVersion + '" on branch + "master".');
+ yield updateRepoVersion(repo, devVersion);
+ yield updateJsSnapshot(repo, devVersion);
+ yield gitutil.gitCheckout(branchName);
+ });
+ });
+
+ executil.reportGitPushResult(repos, ['master', branchName]);
+}
+
+exports.tagReleaseBranchCommand = function*(argv) {
+ var argv = configureReleaseCommandFlags(optimist
+ .usage('Tags a release branches.\n' +
+ '\n' +
+ 'Usage: $0 tag-release --version=2.8.0-rc1')
+ .options('pretend', {
+ desc: 'Don\'t actually run git commands, just print out what would be run.',
+ })
+ );
+ var repos = flagutil.computeReposFromFlag(argv.r);
+ var version = flagutil.validateVersionString(argv.version);
+ var pretend = argv.pretend;
+ var branchName = getVersionBranchName(version);
+
+ // First - perform precondition checks.
+ yield repoupdate.updateRepos(repos, [], true);
+
+ function *execOrPretend(cmd) {
+ if (pretend) {
+ print('PRETENDING TO RUN: ' + cmd.join(' '));
+ } else {
+ yield executil.execHelper(cmd);
+ }
+ }
+ yield repoutil.forEachRepo(repos, function*(repo) {
+ yield gitutil.stashAndPop(repo, function*() {
+ // git fetch.
+ yield repoupdate.updateRepos([repo], [], false);
+
+ if (yield gitutil.remoteBranchExists(repo, branchName)) {
+ print('Remote branch already exists for repo: ' + repo.repoName);
+ yield gitutil.gitCheckout(branchName);
+ } else {
+ apputil.fatal('Release branch does not exist for repo ' + repo.repoName);
+ }
+
+ // git merge
+ yield repoupdate.updateRepos([repo], [branchName], true);
+
+ // Create/update the tag.
+ var tagName = yield gitutil.retrieveCurrentTagName();
+ if (tagName != version) {
+ if (yield gitutil.tagExists(version)) {
+ yield execOrPretend(executil.ARGS('git tag ' + version + ' --force'));
+ } else {
+ yield execOrPretend(executil.ARGS('git tag ' + version));
+ }
+ yield execOrPretend(executil.ARGS('git push --tags ' + repo.remoteName + ' ' + branchName));
+ } else {
+ print('Repo ' + repo.repoName + ' is already tagged.');
+ }
+ });
+ });
+
+ print('');
+ print('All work complete.');
+}
http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/3da926b2/src/executil.js
----------------------------------------------------------------------
diff --git a/src/executil.js b/src/executil.js
index 483200e..0625339 100644
--- a/src/executil.js
+++ b/src/executil.js
@@ -63,7 +63,7 @@ exports.reportGitPushResult = function(repos, branches) {
var flagsStr = repos.map(function(r) { return '-r ' + r.id; }).join(' ') + ' ' + branches.map(function(b) { return '-b ' + b; }).join(' ');
print('All work complete. ' + gitCommitCount + ' commits were made locally.');
print('To review changes:');
- print(' ' + process.argv[1] + ' repo-status ' + flagsStr + ' | less');
+ print(' ' + process.argv[1] + ' repo-status ' + flagsStr + ' --diff | less');
print('To push changes:');
print(' ' + process.argv[1] + ' repo-push ' + flagsStr);
print('To revert all local commits:');
http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/3da926b2/src/gitutil.js
----------------------------------------------------------------------
diff --git a/src/gitutil.js b/src/gitutil.js
index eff1513..b625170 100644
--- a/src/gitutil.js
+++ b/src/gitutil.js
@@ -79,3 +79,11 @@ exports.localBranchExists = function*(name) {
return !!(yield executil.execHelper(executil.ARGS('git branch --list ' + name), true));
}
+exports.retrieveCurrentTagName = function() {
+ // This will return the tag name plus commit info it not directly at a tag.
+ // That's fine since all users of this function are meant to use the result
+ // in an equality check.
+ return executil.execHelper(executil.ARGS('git describe --tags HEAD'), true, true);
+}
+
+
http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/3da926b2/src/main.js
----------------------------------------------------------------------
diff --git a/src/main.js b/src/main.js
index c0c5221..9b79bfd 100644
--- a/src/main.js
+++ b/src/main.js
@@ -17,263 +17,15 @@ specific language governing permissions and limitations
under the License.
*/
-var co = require('co');
-var fs = require('fs');
-var path = require('path');
-var flagutil = require('./flagutil');
-var apputil = require('./apputil');
-var executil = require('./executil');
-var gitutil = require('./gitutil');
-var repoutil = require('./repoutil');
-var repoupdate = require('./repo-update');
-var print = apputil.print;
try {
+ var co = require('co');
var optimist = require('optimist');
- var shjs = require('shelljs');
- var Q = require('q');
} catch (e) {
console.log('Please run "npm install" from this directory:\n\t' + __dirname);
process.exit(2);
}
-function createPlatformDevVersion(version) {
- // e.g. "3.1.0" -> "3.2.0-dev".
- // e.g. "3.1.2-0.8.0-rc2" -> "3.2.0-0.8.0-dev".
- version = version.replace(/-rc.*$/, '');
- var parts = version.split('.');
- parts[1] = String(+parts[1] + 1);
- var cliSafeParts = parts[2].split('-');
- cliSafeParts[0] = '0';
- parts[2] = cliSafeParts.join('-');
- return parts.join('.') + '-dev';
-}
-
-function getVersionBranchName(version) {
- if (/-dev$/.test(version)) {
- return 'master';
- }
- return version.replace(/\d+(-?rc\d)?$/, 'x');
-}
-
-function cpAndLog(src, dest) {
- print('Coping File:', src, '->', dest);
- // Throws upon failure.
- shjs.cp('-f', src, dest);
- if (shjs.error()) {
- apputil.fatal('Copy failed.');
- }
-}
-
-function retrieveCurrentTagName() {
- // This will return the tag name plus commit info it not directly at a tag.
- // That's fine since all users of this function are meant to use the result
- // in an equality check.
- return executil.execHelper(executil.ARGS('git describe --tags HEAD'), true, true);
-}
-
-function configureReleaseCommandFlags(opt) {
- var opt = flagutil.registerRepoFlag(opt)
- opt = opt
- .options('version', {
- desc: 'The version to use for the branch. Must match the pattern #.#.#[-rc#]',
- demand: true
- });
- opt = flagutil.registerHelpFlag(opt);
- argv = opt.argv;
-
- if (argv.h) {
- optimist.showHelp();
- process.exit(1);
- }
- var version = flagutil.validateVersionString(argv.version);
- return argv;
-}
-
-var hasBuiltJs = '';
-
-function *updateJsSnapshot(repo, version) {
- function *ensureJsIsBuilt() {
- var cordovaJsRepo = repoutil.getRepoById('js');
- if (hasBuiltJs != version) {
- yield repoutil.forEachRepo([cordovaJsRepo], function*() {
- yield gitutil.stashAndPop(cordovaJsRepo, function*() {
- if (getVersionBranchName(version) == 'master') {
- yield gitutil.gitCheckout('master');
- } else {
- yield gitutil.gitCheckout(version);
- }
- yield executil.execHelper(executil.ARGS('grunt'));
- hasBuiltJs = version;
- });
- });
- }
- }
-
- if (repoutil.repoGroups.platform.indexOf(repo) == -1) {
- return;
- }
-
- if (repo.cordovaJsPaths) {
- yield ensureJsIsBuilt();
- repo.cordovaJsPaths.forEach(function(jsPath) {
- var src = path.join('..', 'cordova-js', 'pkg', repo.cordovaJsSrcName || ('cordova.' + repo.id + '.js'));
- cpAndLog(src, jsPath);
- });
- if (yield gitutil.pendingChangesExist()) {
- yield executil.execHelper(executil.ARGS('git commit -am', 'Update JS snapshot to version ' + version + ' (via coho)'));
- }
- } else if (repoutil.repoGroups.all.indexOf(repo) != -1) {
- print('*** DO NOT KNOW HOW TO UPDATE cordova.js FOR THIS REPO ***');
- }
-}
-
-function *updateRepoVersion(repo, version) {
- // Update the VERSION files.
- var versionFilePaths = repo.versionFilePaths || ['VERSION'];
- if (fs.existsSync(versionFilePaths[0])) {
- versionFilePaths.forEach(function(versionFilePath) {
- fs.writeFileSync(versionFilePath, version + '\n');
- });
- shjs.config.apputil.fatal = true;
- if (repo.id == 'android') {
- shjs.sed('-i', /CORDOVA_VERSION.*=.*;/, 'CORDOVA_VERSION = "' + version + '";', path.join('framework', 'src', 'org', 'apache', 'cordova', 'CordovaWebView.java'));
- shjs.sed('-i', /VERSION.*=.*;/, 'VERSION = "' + version + '";', path.join('bin', 'templates', 'cordova', 'version'));
- }
- shjs.config.apputil.fatal = false;
- if (!(yield gitutil.pendingChangesExist())) {
- print('VERSION file was already up-to-date.');
- }
- } else {
- console.warn('No VERSION file exists in repo ' + repo.repoName);
- }
-
- if (yield gitutil.pendingChangesExist()) {
- yield executil.execHelper(executil.ARGS('git commit -am', 'Set VERSION to ' + version + ' (via coho)'));
- }
-}
-
-function *prepareReleaseBranchCommand() {
- var argv = configureReleaseCommandFlags(optimist
- .usage('Prepares release branches but does not create tags. This includes:\n' +
- ' 1. Creating the branch if it doesn\'t already exist\n' +
- ' 2. Updating cordova.js snapshot and VERSION file.\n' +
- '\n' +
- 'Command is safe to run multiple times, and can be run for the purpose\n' +
- 'of checking out existing release branches.\n' +
- '\n' +
- 'Command can also be used to update the JS snapshot after release \n' +
- 'branches have been created.\n' +
- '\n' +
- 'Usage: $0 prepare-release-branch --version=2.8.0-rc1')
- );
- var repos = flagutil.computeReposFromFlag(argv.r);
- var version = flagutil.validateVersionString(argv.version);
- var branchName = getVersionBranchName(version);
-
- // First - perform precondition checks.
- yield repoupdate.updateRepos(repos, [], true);
-
- var cordovaJsRepo = repoutil.getRepoById('js');
-
- // Ensure cordova-js comes first.
- var repoIndex = repos.indexOf(cordovaJsRepo);
- if (repoIndex != -1) {
- repos.splice(repoIndex, 1);
- repos.unshift(cordovaJsRepo);
- }
-
- yield repoutil.forEachRepo(repos, function*(repo) {
- yield gitutil.stashAndPop(repo, function*() {
- // git fetch + update master
- yield repoupdate.updateRepos([repo], ['master'], false);
-
- // Either create or pull down the branch.
- if (yield gitutil.remoteBranchExists(repo, branchName)) {
- print('Remote branch already exists for repo: ' + repo.repoName);
- // Check out and rebase.
- yield repoupdate.updateRepos([repo], [branchName], true);
- yield gitutil.gitCheckout(branchName);
- } else if (yield gitutil.localBranchExists(branchName)) {
- yield executil.execHelper(executil.ARGS('git checkout ' + branchName));
- } else {
- yield gitutil.gitCheckout('master');
- yield executil.execHelper(executil.ARGS('git checkout -b ' + branchName));
- }
- yield updateJsSnapshot(repo, version);
- print(repo.repoName + ': ' + 'Setting VERSION to "' + version + '" on branch + "' + branchName + '".');
- yield updateRepoVersion(repo, version);
-
- yield gitutil.gitCheckout('master');
- var devVersion = createPlatformDevVersion(version);
- print(repo.repoName + ': ' + 'Setting VERSION to "' + devVersion + '" on branch + "master".');
- yield updateRepoVersion(repo, devVersion);
- yield updateJsSnapshot(repo, devVersion);
- yield gitutil.gitCheckout(branchName);
- });
- });
-
- executil.reportGitPushResult(repos, ['master', branchName]);
-}
-
-function *tagReleaseBranchCommand(argv) {
- var argv = configureReleaseCommandFlags(optimist
- .usage('Tags a release branches.\n' +
- '\n' +
- 'Usage: $0 tag-release --version=2.8.0-rc1')
- .options('pretend', {
- desc: 'Don\'t actually run git commands, just print out what would be run.',
- })
- );
- var repos = flagutil.computeReposFromFlag(argv.r);
- var version = flagutil.validateVersionString(argv.version);
- var pretend = argv.pretend;
- var branchName = getVersionBranchName(version);
-
- // First - perform precondition checks.
- yield repoupdate.updateRepos(repos, [], true);
-
- function *execOrPretend(cmd) {
- if (pretend) {
- print('PRETENDING TO RUN: ' + cmd.join(' '));
- } else {
- yield executil.execHelper(cmd);
- }
- }
- yield repoutil.forEachRepo(repos, function*(repo) {
- yield gitutil.stashAndPop(repo, function*() {
- // git fetch.
- yield repoupdate.updateRepos([repo], [], false);
-
- if (yield gitutil.remoteBranchExists(repo, branchName)) {
- print('Remote branch already exists for repo: ' + repo.repoName);
- yield gitutil.gitCheckout(branchName);
- } else {
- apputil.fatal('Release branch does not exist for repo ' + repo.repoName);
- }
-
- // git merge
- yield repoupdate.updateRepos([repo], [branchName], true);
-
- // Create/update the tag.
- var tagName = yield retrieveCurrentTagName();
- if (tagName != version) {
- if (yield gitutil.tagExists(version)) {
- yield execOrPretend(executil.ARGS('git tag ' + version + ' --force'));
- } else {
- yield execOrPretend(executil.ARGS('git tag ' + version));
- }
- yield execOrPretend(executil.ARGS('git push --tags ' + repo.remoteName + ' ' + branchName));
- } else {
- print('Repo ' + repo.repoName + ' is already tagged.');
- }
- });
- });
-
- print('');
- print('All work complete.');
-}
-
-function main() {
+module.exports = function() {
var commandList = [
{
name: 'repo-clone',
@@ -306,11 +58,11 @@ function main() {
}, {
name: 'prepare-release-branch',
desc: 'Branches, updates JS, updates VERSION. Safe to run multiple times.',
- entryPoint: prepareReleaseBranchCommand
+ entryPoint: require('./cadance-release').prepareReleaseBranchCommand
}, {
name: 'tag-release',
desc: 'Tags repos for a release.',
- entryPoint: tagReleaseBranchCommand
+ entryPoint: require('./cadance-release').tagReleaseBranchCommand
}, {
name: 'audit-license-headers',
desc: 'Uses Apache RAT to look for missing license headers.',
@@ -379,4 +131,3 @@ function main() {
var entry = commandMap[command].entryPoint;
co(entry)();
}
-main();