From bd3f54b66e5bea6204ab8ba3066a5c5db7c9ed75 Mon Sep 17 00:00:00 2001 From: Maksim Gruzdev Date: Thu, 14 Aug 2025 19:47:06 +0300 Subject: [PATCH] #54 +mr -h command --- lib/HelpCommand.js | 13 +++++++++++++ lib/MrCommand.js | 2 ++ lib/ParsedArgs.js | 4 ++++ mr.js | 2 +- tests/HelpCommand.js | 32 ++++++++++++++++++++++++++++++++ tests/ParsedArgs.js | 6 ++++++ 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 lib/HelpCommand.js create mode 100644 tests/HelpCommand.js diff --git a/lib/HelpCommand.js b/lib/HelpCommand.js new file mode 100644 index 0000000..6ee1bd7 --- /dev/null +++ b/lib/HelpCommand.js @@ -0,0 +1,13 @@ +module.exports = class { + async todo () { + if (!global.FUZZ) { + console.log(`mr -h | --help # this help message +mr # push current branch to its origin +mr TASK-42 # switch to existing TASK-42 (create if needed) +mr TASK-42 from release # create TASK-42 from release branch +mr TASK-42 to main # merge TASK-42 into main +mr to main # merge current branch into main`) + } + return {todo: []} + } +} diff --git a/lib/MrCommand.js b/lib/MrCommand.js index 768bed6..a778627 100644 --- a/lib/MrCommand.js +++ b/lib/MrCommand.js @@ -5,6 +5,7 @@ const Push = require('./PushCommand') const Create = require('./CreateCommand') const Switch = require('./SwitchCommand') const Merge = require('./MergeCommand') +const Help = require('./HelpCommand') module.exports = class MrCommand { static withParsedArgs (parsedArgs) { @@ -16,6 +17,7 @@ module.exports = class MrCommand { Switch, Create: Switch, Merge, + Help, } let commands = {} for (let [name, clazz] of Object.entries (name2command)) { diff --git a/lib/ParsedArgs.js b/lib/ParsedArgs.js index 416aa1c..1ffd399 100644 --- a/lib/ParsedArgs.js +++ b/lib/ParsedArgs.js @@ -4,6 +4,10 @@ module.exports = class { } value() { + if (this.argv.includes('-h') || this.argv.includes('--help')) { + return {action: 'Help'} + } + const [branch, verb, src_or_dst] = this.argv const usage = `usage: mr TASK-42 [from|to main]` diff --git a/mr.js b/mr.js index 5506eda..65bf2f5 100644 --- a/mr.js +++ b/mr.js @@ -4,7 +4,7 @@ const MrCommand = require('./lib/MrCommand') const RunCommand = require('./lib/RunCommand') const main = async (argv) => { - // @todo #0:1h add help --version with usage examples + // @todo #0:1h check minimal node version and exit if too old await new RunCommand ( await MrCommand.withParsedArgs( new ParsedArgs ( diff --git a/tests/HelpCommand.js b/tests/HelpCommand.js new file mode 100644 index 0000000..903439c --- /dev/null +++ b/tests/HelpCommand.js @@ -0,0 +1,32 @@ +const {describe, it, mock} = require ('node:test') +const assert = require ('assert') +const MrCommand = require ('../lib/MrCommand') +const ParsedArgs = require ('../lib/ParsedArgs') + +describe('HelpCommand', () => { + it ('help command prints help and returns empty todo', async (t) => { + const logCalls = [] + mock.method(console, 'log', function(msg) { + logCalls.push(msg) + }) + + const parsedArgs = new ParsedArgs (['-h']) + const todo = await MrCommand.withParsedArgs (parsedArgs).todo() + + assert.deepStrictEqual(todo.todo, []) + assert.ok(logCalls[0].startsWith('mr -h | --help')) + }) + + it ('--help flag works the same way', async (t) => { + const logCalls = [] + mock.method(console, 'log', function(msg) { + logCalls.push(msg) + }) + + const parsedArgs = new ParsedArgs (['--help']) + const todo = await MrCommand.withParsedArgs (parsedArgs).todo() + + assert.deepStrictEqual(todo.todo, []) + assert.ok(logCalls[0].startsWith('mr -h | --help')) + }) +}) diff --git a/tests/ParsedArgs.js b/tests/ParsedArgs.js index 2cee25b..eb834b6 100644 --- a/tests/ParsedArgs.js +++ b/tests/ParsedArgs.js @@ -26,4 +26,10 @@ describe('ParsedArgs', () => { it ('deploy current to release', async (t) => { assert.deepStrictEqual(await new ParsedArgs (toArgv (`to release`)).value (), {src: '__CURRENT_BRANCH__', action: 'Merge', dst: 'release'}) }) + it ('help with -h flag', async (t) => { + assert.deepStrictEqual(await new ParsedArgs (['-h']).value (), {action: 'Help'}) + }) + it ('help with --help flag', async (t) => { + assert.deepStrictEqual(await new ParsedArgs (['--help']).value (), {action: 'Help'}) + }) })