From 8144831bf7c25fff61ebe629fc16ee7ac3a711c4 Mon Sep 17 00:00:00 2001 From: felixlohmeier Date: Sat, 15 Oct 2022 20:57:07 +0000 Subject: [PATCH] support stdin --- orcli | 64 ++++++++++++++++++++----------------- src/bashly.yml | 7 ++-- src/batch_command.sh | 37 +++++++++++---------- src/import_csv_command.sh | 8 +++-- src/lib/send_completions.sh | 2 +- 5 files changed, 65 insertions(+), 53 deletions(-) diff --git a/orcli b/orcli index c248f14..ae6095a 100755 --- a/orcli +++ b/orcli @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# This script was generated by bashly 0.8.7 (https://bashly.dannyb.co) +# This script was generated by bashly 0.8.9 (https://bashly.dannyb.co) # Modifying it manually is not recommended # :wrapper.bash3_bouncer @@ -35,7 +35,7 @@ orcli_usage() { # :command.usage_commands printf "Commands:\n" echo " completions Generate bash completions" - echo " batch run tmp OpenRefine workspace and execute shell script" + echo " batch run tmp OpenRefine workspace and execute shell script(s)" echo " import import commands" echo " list list projects on OpenRefine server" echo " info show project metadata" @@ -121,11 +121,11 @@ orcli_completions_usage() { # :command.usage orcli_batch_usage() { if [[ -n $long_usage ]]; then - printf "orcli batch - run tmp OpenRefine workspace and execute shell script\n" + printf "orcli batch - run tmp OpenRefine workspace and execute shell script(s)\n" echo else - printf "orcli batch - run tmp OpenRefine workspace and execute shell script\n" + printf "orcli batch - run tmp OpenRefine workspace and execute shell script(s)\n" echo fi @@ -158,8 +158,8 @@ orcli_batch_usage() { echo # :flag.usage - echo " --interactive" - printf " provide interactive Bash shell for playground and debugging\n" + echo " --debug" + printf " do not exit on error and keep shell open\n" echo # :command.usage_args @@ -173,7 +173,6 @@ orcli_batch_usage() { # :command.usage_examples printf "Examples:\n" - printf " orcli batch --interactive\n" printf " orcli batch << EOF\n orcli import csv \"https://git.io/fj5hF\" --projectName \"duplicates\"\n orcli info \"duplicates\"\n orcli export tsv \"duplicates\"\n EOF\n" printf " orcli batch --memory \"2000M\" --port \"3334\" << EOF\n orcli import csv \"https://git.io/fj5hF\" --projectName \"duplicates\" &\n orcli import csv \"https://git.io/fj5hF\" --projectName \"copy\" &\n wait\n echo \"finished import\"\n orcli export csv \"duplicates\" --output duplicates.csv &\n orcli export tsv \"duplicates\" --output duplicates.tsv &\n wait\n wc duplicates*\n EOF\n" printf " orcli batch \"file1.sh\" \"file2.sh\" - << EOF\n echo \"finished in \$SECONDS seconds\"\n EOF\n" @@ -704,7 +703,7 @@ send_completions() { echo $' ;;' echo $'' echo $' \'batch\'*)' - echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_orcli_completions_filter "--help --interactive --memory --port -h")" -- "$cur" )' + echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_orcli_completions_filter "--debug --help --memory --port -h")" -- "$cur" )' echo $' ;;' echo $'' echo $' \'list\'*)' @@ -742,14 +741,6 @@ orcli_batch_command() { # src/batch_command.sh # shellcheck shell=bash disable=SC2154 source=/dev/null - # check if stdin is present if selected - if ! [[ ${args[--interactive]} ]]; then - if [[ ${args[file]} == '-' ]] || [[ ${args[file]} == '"-"' ]] && [ -t 0 ]; then - orcli_batch_usage - exit 1 - fi - fi - # catch args, convert the space delimited string to an array files=() eval "files=(${args[file]})" @@ -794,19 +785,32 @@ orcli_batch_command() { log "started OpenRefine" "port: ${args[--port]}" "memory: ${args[--memory]}" "tmpdir: ${tmpdir}" "pid: ${openrefine_pid}" fi - # execute shell script + # execute script(s) in subshell export orcli tmpdir OPENREFINE_URL openrefine_pid - if [[ ${args[--interactive]} ]]; then + # case 1: interactive mode if stdin is selected but not present + if [[ ${args[file]} == '-' || ${args[file]} == '"-"' ]]; then + if ! read -u 0 -t 0; then + bash --rcfile <( + cat ~/.bashrc + interactive + ) -i < /dev/tty + exit + fi + fi + # case 2: execute scripts and keep shell running + if [[ ${args[--debug]} ]]; then bash --rcfile <( cat ~/.bashrc + for i in "${!files[@]}"; do log "execute script ${files[$i]}"; awk 1 "${files[$i]}"; done interactive - if ! [[ ${args[file]} == '-' || ${args[file]} == '"-"' ]]; then - awk 1 "${files[@]}" - fi - ) -i - else - bash -e <(awk 1 "${files[@]}") + ) -i < /dev/tty + exit fi + # case 3: execute scripts + for i in "${!files[@]}"; do + log "execute script ${files[$i]}" + bash -e <(awk 1 "${files[$i]}") + done } @@ -819,9 +823,11 @@ orcli_import_csv_command() { init_import # check if stdin is present if selected - if [[ ${args[file]} == '-' ]] || [[ ${args[file]} == '"-"' ]] && [ -t 0 ]; then - orcli_import_csv_usage - exit 1 + if [[ ${args[file]} == '-' ]] || [[ ${args[file]} == '"-"' ]]; then + if ! read -u 0 -t 0; then + orcli_import_csv_usage + exit 1 + fi fi # assemble specific post data (some options require json format) @@ -1122,10 +1128,10 @@ orcli_batch_parse_requirements() { ;; # :flag.case - --interactive ) + --debug ) # :flag.case_no_arg - args[--interactive]=1 + args[--debug]=1 shift ;; diff --git a/src/bashly.yml b/src/bashly.yml index 357cecd..8f30e15 100644 --- a/src/bashly.yml +++ b/src/bashly.yml @@ -37,7 +37,7 @@ commands: Usage: eval "\$(orcli completions)" - name: batch - help: run tmp OpenRefine workspace and execute shell script + help: run tmp OpenRefine workspace and execute shell script(s) args: - name: file help: Path to one or more files. When FILE is -, read standard input. @@ -52,10 +52,9 @@ commands: help: PORT on which OpenRefine should listen arg: port default: "3333" - - long: --interactive - help: provide interactive Bash shell for playground and debugging + - long: --debug + help: do not exit on error and keep shell open examples: - - orcli batch --interactive - |- orcli batch << EOF orcli import csv "https://git.io/fj5hF" --projectName "duplicates" diff --git a/src/batch_command.sh b/src/batch_command.sh index e966f14..7be5651 100644 --- a/src/batch_command.sh +++ b/src/batch_command.sh @@ -1,13 +1,5 @@ # shellcheck shell=bash disable=SC2154 source=/dev/null -# check if stdin is present if selected -if ! [[ ${args[--interactive]} ]]; then - if [[ ${args[file]} == '-' ]] || [[ ${args[file]} == '"-"' ]] && [ -t 0 ]; then - orcli_batch_usage - exit 1 - fi -fi - # catch args, convert the space delimited string to an array files=() eval "files=(${args[file]})" @@ -52,16 +44,29 @@ else log "started OpenRefine" "port: ${args[--port]}" "memory: ${args[--memory]}" "tmpdir: ${tmpdir}" "pid: ${openrefine_pid}" fi -# execute shell script +# execute script(s) in subshell export orcli tmpdir OPENREFINE_URL openrefine_pid -if [[ ${args[--interactive]} ]]; then +# case 1: interactive mode if stdin is selected but not present +if [[ ${args[file]} == '-' || ${args[file]} == '"-"' ]]; then + if ! read -u 0 -t 0; then + bash --rcfile <( + cat ~/.bashrc + interactive + ) -i < /dev/tty + exit + fi +fi +# case 2: execute scripts and keep shell running +if [[ ${args[--debug]} ]]; then bash --rcfile <( cat ~/.bashrc + for i in "${!files[@]}"; do log "execute script ${files[$i]}"; awk 1 "${files[$i]}"; done interactive - if ! [[ ${args[file]} == '-' || ${args[file]} == '"-"' ]]; then - awk 1 "${files[@]}" - fi - ) -i -else - bash -e <(awk 1 "${files[@]}") + ) -i < /dev/tty + exit fi +# case 3: execute scripts +for i in "${!files[@]}"; do + log "execute script ${files[$i]}" + bash -e <(awk 1 "${files[$i]}") +done diff --git a/src/import_csv_command.sh b/src/import_csv_command.sh index 53fbc4a..a2bf97f 100644 --- a/src/import_csv_command.sh +++ b/src/import_csv_command.sh @@ -4,9 +4,11 @@ init_import # check if stdin is present if selected -if [[ ${args[file]} == '-' ]] || [[ ${args[file]} == '"-"' ]] && [ -t 0 ]; then - orcli_import_csv_usage - exit 1 +if [[ ${args[file]} == '-' ]] || [[ ${args[file]} == '"-"' ]]; then + if ! read -u 0 -t 0; then + orcli_import_csv_usage + exit 1 + fi fi # assemble specific post data (some options require json format) diff --git a/src/lib/send_completions.sh b/src/lib/send_completions.sh index 32485a5..eb72a5a 100644 --- a/src/lib/send_completions.sh +++ b/src/lib/send_completions.sh @@ -51,7 +51,7 @@ send_completions() { echo $' ;;' echo $'' echo $' \'batch\'*)' - echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_orcli_completions_filter "--help --interactive --memory --port -h")" -- "$cur" )' + echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_orcli_completions_filter "--debug --help --memory --port -h")" -- "$cur" )' echo $' ;;' echo $'' echo $' \'list\'*)'