diff --git a/.eslintrc b/.eslintrc index 92e1562..14fa3fe 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,6 +1,12 @@ { + "globals": { + "module": true, + "exports": true, + "process": true, + "child_process": true + }, "ecmaFeatures": { - "jsx": true + "jsx": false }, "parser": "espree", "env": { diff --git a/bin/open-commander.js b/bin/open-commander.js index 771d7be..91635ca 100644 --- a/bin/open-commander.js +++ b/bin/open-commander.js @@ -1,11 +1,10 @@ 'use strict'; -/* global module, process */ var fs = require('fs'); var path = require('path'); var commander = require('commander'); -var child_process = require('child_process'); -var inquirer = require('inquirer'); +// var inquirer = require('inquirer'); +var gitremote = require('../lib/gitremote'); // resolve absolute path to relative path base repository root. function resolve(filepath, cwd, root) { @@ -154,33 +153,35 @@ module.exports = function(argv, option, callback) { }; } - var RE_REMOTE_BRANCH_NAME = /^(\w+)\/(.+)/; - var cwd = commander.cwd || process.cwd(); - var remoteBranches = child_process.execSync( - 'git branch -r', - {cwd: cwd} - ).toString() - .trim() - .split(/\r\n|\r|\n/) - .map(function(branchName) { return branchName.trim(); }) - .filter(function(branchName) { - return branchName.replace(RE_REMOTE_BRANCH_NAME, '$2') !== option.cwb && - branchName.indexOf(' -> ') === -1; // ` origin/HEAD -> origin/master` - }); - - if (!options.args['branch-A'] && remoteBranches.length > 1) { - inquirer.prompt([{ - name: 'remoteBranch', - type: 'list', - message: 'Choose remote brance to compare:', - choices: remoteBranches, - }]).then(function(answers) { - var br = answers.remoteBranch; - var m = RE_REMOTE_BRANCH_NAME.exec(br); - options.args['branch-A'] = m[2]; - return callback(options); - }); - return; + if (!options.args['branch-A']) { + var cwd = commander.cwd || process.cwd(); + var remoteBranches = gitremote.getBaseBranches(cwd); + var remoteBranchLength = remoteBranches.length; + if (remoteBranchLength === 0) { + console.log('Not found base branch, rebase it before create PR/MR.'); + return; + // remoteBranches = gitremote.getRemoteBranches(cwd) + // .map(function(br) { + // return br.name; + // }) + // .filter(function(name) { + // return name !== option.cwb; + // }); + } + // TODO: 目前这个分支走不到,后面获取所有的祖先分支列表时再供用户选择。 + // if (remoteBranchLength > 1) { + // inquirer.prompt([{ + // name: 'remoteBranch', + // type: 'list', + // message: 'Choose remote brance to compare:', + // choices: remoteBranches, + // }]).then(function(answers) { + // options.args['branch-A'] = answers.remoteBranch; + // return callback(options); + // }); + // return; + // } + options.args['branch-A'] = remoteBranches[0]; } break; diff --git a/lib/gitremote.js b/lib/gitremote.js index 6c10197..74f5517 100644 --- a/lib/gitremote.js +++ b/lib/gitremote.js @@ -46,3 +46,59 @@ exports.getGitRootPath = function(cwd) { return null; } }; + +var RE_REMOTE_BRANCH_NAME = /^(\w+)\/(.+)/; // "origin/branch-name" +exports.getRemoteBranches = function(cwd) { + var remoteBranches = child_process.execSync( + 'git branch -r', + {cwd: cwd} + ).toString() + .trim() + .split(/\r\n|\r|\n/) + .filter(function(branchName) { + return branchName && + branchName.indexOf(' -> ') === -1; // ` origin/HEAD -> origin/master` + }) + .map(function(branchName) { + var br = branchName.trim(); + var m = RE_REMOTE_BRANCH_NAME.exec(br); + return { + fullName: br, + remote: m[1], + name: m[2], + }; + }); + return remoteBranches; +}; + +var RE_CURRENT_BASE_BRANCHES = /^[ -+]*\*/; +var RE_BASE_BRANCHE_NAME = /.*\[([^\]\^~]+).*/; // " +* [MS170216105211~2^2] test: fixed lint" +exports.getBaseBranches = function(cwd) { + var cwb = exports.getCurrentBranch(cwd); + var baseBranches = child_process.execSync( + 'git show-branch --no-color', + {cwd: cwd} + ).toString() + .trim() + .split(/\r\n|\r|\n/) + .filter(function(line) { + return RE_CURRENT_BASE_BRANCHES.test(line); + }) + .map(function(line) { + var m = RE_BASE_BRANCHE_NAME.exec(line); + return m ? m[1] : null; + }) + .filter(function(branchName) { + return branchName !== cwb; + }); + // TODO: 获取当前分支的所有祖先分支列表,并按照倒序排列,最近切出的祖先分支排第一。 + return baseBranches.length >= 0 ? [baseBranches[0]] : []; + // return unique(baseBranches); +}; + +// function unique(array) { + // return array.filter(function(item, index) { + // var firstIndex = array.indexOf(item); + // return firstIndex === index; + // }); +// }