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();