CB-12538: give release manager option of automatically merging master into release branch in the case the release branch already exists.
Project: http://git-wip-us.apache.org/repos/asf/cordova-coho/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-coho/commit/2a85b540 Tree: http://git-wip-us.apache.org/repos/asf/cordova-coho/tree/2a85b540 Diff: http://git-wip-us.apache.org/repos/asf/cordova-coho/diff/2a85b540 Branch: refs/heads/master Commit: 2a85b5406f6fc0a8ebd72e094dd9e8104218431b Parents: e88653f Author: filmaj <[email protected]> Authored: Fri Mar 3 14:49:44 2017 -0800 Committer: filmaj <[email protected]> Committed: Tue Apr 25 17:28:08 2017 -0700 ---------------------------------------------------------------------- src/executil.js | 2 ++ src/gitutil.js | 16 ++++++++++++--- src/plugin-release.js | 44 ++++++++++++++++++++++++++++++++++------ src/update-release-notes.js | 4 ++-- 4 files changed, 55 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/2a85b540/src/executil.js ---------------------------------------------------------------------- diff --git a/src/executil.js b/src/executil.js index d389d25..3b294b5 100644 --- a/src/executil.js +++ b/src/executil.js @@ -38,6 +38,8 @@ exports.verbose = false; // silent == true or 1 ==> don't print command, don't print output // silent == 2 ==> don't print command, print output // silent == 3 ==> print command, don't print output +// TODO: this function should be consolidated to promises, and shouldnt take win/fail callbacks. +// some async confusion here function execHelper(cmdAndArgs, silent, allowError, win, fail) { // there are times where we want silent but not allowError. if (null == allowError) { http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/2a85b540/src/gitutil.js ---------------------------------------------------------------------- diff --git a/src/gitutil.js b/src/gitutil.js index 15a23dd..d449ec0 100644 --- a/src/gitutil.js +++ b/src/gitutil.js @@ -105,8 +105,14 @@ exports.retrieveCurrentBranchName = function*(allowDetached) { return match[1]; } -exports.remoteBranchExists = function*(repo, name) { - return !!(yield executil.execHelper(executil.ARGS('git branch -r --list ' + repo.remoteName + '/' + name), true)); +exports.remoteBranchExists = function*(repo, branch) { + var branch_token = (repo.remoteName || 'origin') + '/' + branch; + var stdout = yield executil.execHelper(executil.ARGS('git branch -r --list ' + branch_token), false, false); + if (stdout.indexOf(branch_token) > -1) { + return true; + } else { + return false; + } } exports.stashAndPop = function*(repo, func) { @@ -180,10 +186,14 @@ exports.tagRepo = function*(version) { exports.pushToOrigin = function*(ref) { // TODO TEST: uncomment once ready to test - return yield executil.execHelper(executil.ARGS('git push origin', ref)); + //return yield executil.execHelper(executil.ARGS('git push origin', ref)); } exports.diff = function*(first, second) { var args = executil.ARGS('git diff', first + '..' + second); return yield executil.execHelper(args, true, false); } + +exports.merge = function*(ref, win, fail) { + return yield executil.execHelper(executil.ARGS('git merge', ref), false, false, win, fail); +} http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/2a85b540/src/plugin-release.js ---------------------------------------------------------------------- diff --git a/src/plugin-release.js b/src/plugin-release.js index fa5b355..83c9174 100644 --- a/src/plugin-release.js +++ b/src/plugin-release.js @@ -62,6 +62,7 @@ var svn_repos; // cordova dist and dist/dev svn repos var plugin_data = {}; // massive object containing plugin release-relevant information var plugins_to_release = []; // array of plugin names that need releasing var plugins_ommitted = []; // array of plugin names that DO NOT need releasing +var plugins_to_merge_manually = []; // array of plugin names that RM will need to merge master into release branch manually. var svn_user; // username for apache svn var svn_password; // password for apache svn @@ -359,7 +360,9 @@ function *interactive_plugins_release() { console.log('Removing the "-dev" suffix from versions...'); return co.wrap(function *() { yield repoutil.forEachRepo(plugin_repos, function*(repo) { + yield gitutil.gitCheckout('master'); var current_version = yield versionutil.getRepoVersion(repo); + console.log(repo.repoName, '\'s current version is', current_version); var devless_version = versionutil.removeDev(current_version); plugin_data[repo.repoName].current_release = devless_version; yield versionutil.updateRepoVersion(repo, devless_version, {commitChanges:false}); @@ -456,19 +459,48 @@ function *interactive_plugins_release() { }).then(function(repos_with_existing_release_branch) { // Here we are passed an array of repos that already had release branches created prior to starting the release process. // Our mission in this clause, should we choose to accept it, is to merge master back into the branch. But, this can be dangerous! - // TODO: Should we ask the user to handle the merge / cherry pick, then? Or should we merge automatically? - // This section, right now, simply tells the user to handle the merge manually in a seperate shell. - // IF THEY FAIL TO DO THIS, then we will seriously fuck shit up by pushing release branches up (done in next promise section). :/ + // Ask the RM if they want us to handle the merge automatically. + // If the RM says no, we will prompt them to handle it manually later. console.warn('Some release branches already exist!'); - console.warn('You will need to manually cherry-pick or merge from master into the release branch for these repos manually!'); var prompts = []; repos_with_existing_release_branch.forEach(function(repo) { var plugin_name = repo.repoName; var rb = versionutil.getReleaseBranchNameFromVersion(plugin_data[plugin_name].current_release) prompts.push({ type: 'confirm', - name: 'rb_proceed_' + plugin_name, - message: plugin_name + ' already has an existing release branch "' + rb + '". You will need to manually merge or cherry-pick the master branch into the "' + rb + '" branch. Once you have done this (probably in a separate shell or command prompt), hit Enter to continue.' + name: 'rb_automerge_proceed_' + plugin_name, + message: plugin_name + ' already has an existing release branch "' + rb + '". Do you want me to automatically merge master into this branch for you? If no, I will prompt you to modify the release branch yourself at a later time in this session.' + }); + }); + return inquirer.prompt(prompts); + }).then(function(answers) { + return co.wrap(function *() { + var prompts = []; + yield repoutil.forEachRepo(plugin_repos, function*(repo) { + var plugin_name = repo.repoName; + if (answers['rb_automerge_proceed_' + plugin_name]) { + // Auto-merge master into the release branch. + var rb = versionutil.getReleaseBranchNameFromVersion(plugin_data[plugin_name].current_release); + console.log('Checking out "' + rb + '" branch of', plugin_name, 'merging master in...'); + yield gitutil.gitCheckout(rb); + yield gitutil.merge('master', function() { console.log('merge was fine, continuing.'); }, function(e) { + plugins_to_merge_manually.push(plugin_name); + }); + } else { + plugins_to_merge_manually.push(plugin_name); + } + }); + return inquirer.prompt(prompts); + })(); + }).then(function() { + // prompt the RM about the plugins with manual merging work needed here. + var prompts = []; + plugins_to_merge_manually.forEach(function(plugin_name) { + var rb = versionutil.getReleaseBranchNameFromVersion(plugin_data[plugin_name].current_release) + prompts.push({ + type: 'confirm', + name: 'rb_manualmerge_proceed_' + plugin_name, + message: plugin_name + ' already has an existing release branch "' + rb + '", and it needs a manual merge of master into it (either because you specified that, or because there was a merge conflict during auto-merge. Now is your chance to manually merge / cherry-pick / resolve conflicts on the "' + rb + '" branch. Once you have done this (probably in a separate shell or command prompt), hit Enter to continue.' }); }); return inquirer.prompt(prompts); http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/2a85b540/src/update-release-notes.js ---------------------------------------------------------------------- diff --git a/src/update-release-notes.js b/src/update-release-notes.js index 505def1..2b8795b 100644 --- a/src/update-release-notes.js +++ b/src/update-release-notes.js @@ -41,7 +41,7 @@ module.exports = function*() { .options('from-tag', {desc: 'Update since a specific tag instead of the "most recent" tag'}) .options('to-tag', {desc: 'Update to a specific tag instead of "master"'}) .options('override-date', {desc: 'Update to a specific date instead of today.'}) - .options('last-two-tags', {desc: 'Update with the latest and previous tagged commits'}); + .options('last-two-tags', {desc: 'Update with the latest and previous tagged commits'}); argv = opt.argv; if (argv.h) { @@ -109,7 +109,7 @@ function *createNotes(repo, newVersion, changes, overrideDate) { // pump changes through JIRA linkifier first through a stream pipe var transformer = linkify.stream("CB"); var read = new stream.Readable(); - read._read = function(){};// noop + read._read = function(){};// noop read.push(changes); read.push(null); var write = new stream.Writable(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
