GeezerVison is showing github.com — src: port --bash-completion to C++ · nodejs/node@82fbedc
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/internal/main/print_bash_completion.js -29Lines changed: 0 additions & 29 deletions Collapse file Copy file name to clipboardExpand all lines: node.gyp -1Lines changed: 0 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
| 139 | 139 | 'lib/internal/main/eval_string.js', | 140 | 140 | 'lib/internal/main/eval_stdin.js', | 141 | 141 | 'lib/internal/main/inspect.js', | 142 | | - 'lib/internal/main/print_bash_completion.js', | 143 | 142 | 'lib/internal/main/print_help.js', | 144 | 143 | 'lib/internal/main/prof_process.js', | 145 | 144 | 'lib/internal/main/repl.js', | |
Collapse file Copy file name to clipboardExpand all lines: src/node.cc +12-3Lines changed: 12 additions & 3 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -400,9 +400,6 @@ MaybeLocal<Value> StartMainThreadExecution(Environment* env) { | 400 | 400 | return StartExecution(env, "internal/main/print_help"); | 401 | 401 | } | 402 | 402 |
| 403 | | - if (per_process::cli_options->print_bash_completion) { | 404 | | - return StartExecution(env, "internal/main/print_bash_completion"); | 405 | | - } | 406 | 403 |
| 407 | 404 | if (env->options()->prof_process) { | 408 | 405 | return StartExecution(env, "internal/main/prof_process"); | @@ -875,6 +872,12 @@ void Init(int* argc, | 875 | 872 | exit(0); | 876 | 873 | } | 877 | 874 |
| | 875 | + if (per_process::cli_options->print_bash_completion) { | | 876 | + std::string completion = options_parser::GetBashCompletion(); | | 877 | + printf("%s\n", completion.c_str()); | | 878 | + exit(0); | | 879 | + } | | 880 | + | 878 | 881 | if (per_process::cli_options->print_v8_help) { | 879 | 882 | V8::SetFlagsFromString("--help", 6); // Doesn't return. | 880 | 883 | UNREACHABLE(); | @@ -944,6 +947,12 @@ InitializationResult InitializeOncePerProcess(int argc, char** argv) { | 944 | 947 | return result; | 945 | 948 | } | 946 | 949 |
| | 950 | + if (per_process::cli_options->print_bash_completion) { | | 951 | + std::string completion = options_parser::GetBashCompletion(); | | 952 | + printf("%s\n", completion.c_str()); | | 953 | + exit(0); | | 954 | + } | | 955 | + | 947 | 956 | if (per_process::cli_options->print_v8_help) { | 948 | 957 | V8::SetFlagsFromString("--help", 6); // Doesn't return. | 949 | 958 | UNREACHABLE(); | |
Collapse file Copy file name to clipboardExpand all lines: src/node_options.cc +39Lines changed: 39 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 4 | 4 | #include "env-inl.h" | 5 | 5 | #include "node_binding.h" | 6 | 6 |
| | 7 | +#include <errno.h> | | 8 | +#include <sstream> | 7 | 9 | #include <cstdlib> // strtoul, errno | 8 | 10 |
| 9 | 11 | using v8::Boolean; | @@ -843,6 +845,43 @@ HostPort SplitHostPort(const std::string& arg, | 843 | 845 | ParseAndValidatePort(arg.substr(colon + 1), errors) }; | 844 | 846 | } | 845 | 847 |
| | 848 | +std::string GetBashCompletion() { | | 849 | + Mutex::ScopedLock lock(per_process::cli_options_mutex); | | 850 | + const auto& parser = _ppop_instance; | | 851 | + | | 852 | + std::ostringstream out; | | 853 | + | | 854 | + out << "_node_complete() {\n" | | 855 | + " local cur_word options\n" | | 856 | + " cur_word=\"${COMP_WORDS[COMP_CWORD]}\"\n" | | 857 | + " if [[ \"${cur_word}\" == -* ]] ; then\n" | | 858 | + " COMPREPLY=( $(compgen -W '"; | | 859 | + | | 860 | + for (const auto& item : parser.options_) { | | 861 | + if (item.first[0] != '[') { | | 862 | + out << item.first << " "; | | 863 | + } | | 864 | + } | | 865 | + for (const auto& item : parser.aliases_) { | | 866 | + if (item.first[0] != '[') { | | 867 | + out << item.first << " "; | | 868 | + } | | 869 | + } | | 870 | + if (parser.aliases_.size() > 0) { | | 871 | + out.seekp(-1, out.cur); // Strip the trailing space | | 872 | + } | | 873 | + | | 874 | + out << "' -- \"${cur_word}\") )\n" | | 875 | + " return 0\n" | | 876 | + " else\n" | | 877 | + " COMPREPLY=( $(compgen -f \"${cur_word}\") )\n" | | 878 | + " return 0\n" | | 879 | + " fi\n" | | 880 | + "}\n" | | 881 | + "complete -F _node_complete node node_g"; | | 882 | + return out.str(); | | 883 | +} | | 884 | + | 846 | 885 | // Return a map containing all the options and their metadata as well | 847 | 886 | // as the aliases | 848 | 887 | void GetOptions(const FunctionCallbackInfo<Value>& args) { | |
Collapse file Copy file name to clipboardExpand all lines: src/node_options.h +2Lines changed: 2 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -253,6 +253,7 @@ namespace options_parser { | 253 | 253 | HostPort SplitHostPort(const std::string& arg, | 254 | 254 | std::vector<std::string>* errors); | 255 | 255 | void GetOptions(const v8::FunctionCallbackInfo<v8::Value>& args); | | 256 | +std::string GetBashCompletion(); | 256 | 257 |
| 257 | 258 | enum OptionType { | 258 | 259 | kNoOp, | @@ -436,6 +437,7 @@ class OptionsParser { | 436 | 437 | friend class OptionsParser; | 437 | 438 |
| 438 | 439 | friend void GetOptions(const v8::FunctionCallbackInfo<v8::Value>& args); | | 440 | + friend std::string GetBashCompletion(); | 439 | 441 | }; | 440 | 442 |
| 441 | 443 | using StringVector = std::vector<std::string>; | |
Collapse file Copy file name to clipboardExpand all lines: test/parallel/test-bash-completion.js +16-6Lines changed: 16 additions & 6 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 2 | 2 | require('../common'); | 3 | 3 | const assert = require('assert'); | 4 | 4 | const child_process = require('child_process'); | | 5 | +const { inspect } = require('util'); | 5 | 6 |
| 6 | 7 | const p = child_process.spawnSync( | 7 | 8 | process.execPath, [ '--completion-bash' ]); | 8 | 9 | assert.ifError(p.error); | 9 | | -assert.ok(p.stdout.toString().includes( | 10 | | - `_node_complete() { | | 10 | + | | 11 | +const output = p.stdout.toString().trim().replace(/\r/g, ''); | | 12 | +console.log(output); | | 13 | + | | 14 | +const prefix = `_node_complete() { | 11 | 15 | local cur_word options | 12 | 16 | cur_word="\${COMP_WORDS[COMP_CWORD]}" | 13 | 17 | if [[ "\${cur_word}" == -* ]] ; then | 14 | | - COMPREPLY=( $(compgen -W '`)); | 15 | | -assert.ok(p.stdout.toString().includes( | 16 | | - `' -- "\${cur_word}") ) | | 18 | + COMPREPLY=( $(compgen -W '`.replace(/\r/g, ''); | | 19 | +const suffix = `' -- "\${cur_word}") ) | 17 | 20 | return 0 | 18 | 21 | else | 19 | 22 | COMPREPLY=( $(compgen -f "\${cur_word}") ) | 20 | 23 | return 0 | 21 | 24 | fi | 22 | 25 | } | 23 | | -complete -F _node_complete node node_g`)); | | 26 | +complete -F _node_complete node node_g`.replace(/\r/g, ''); | | 27 | + | | 28 | +assert.ok( | | 29 | + output.includes(prefix), | | 30 | + `Expect\n\n ${inspect(output)}\n\nto include\n\n${inspect(prefix)}`); | | 31 | +assert.ok( | | 32 | + output.includes(suffix), | | 33 | + `Expect\n\n ${inspect(output)}\n\nto include\n\n${inspect(suffix)}`); |
|