bashly 0.9.0 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -4
- data/lib/bashly/commands/add.rb +5 -2
- data/lib/bashly/commands/generate.rb +2 -1
- data/lib/bashly/config_validator.rb +7 -5
- data/lib/bashly/libraries/completions_function.rb +1 -1
- data/lib/bashly/libraries/help.rb +1 -1
- data/lib/bashly/libraries.yml +8 -8
- data/lib/bashly/library.rb +1 -0
- data/lib/bashly/script/command.rb +2 -2
- data/lib/bashly/script/wrapper.rb +1 -1
- data/lib/bashly/settings.rb +26 -22
- data/lib/bashly/templates/settings.yml +3 -0
- data/lib/bashly/version.rb +1 -1
- data/lib/bashly/views/command/command_fallback.gtx +10 -5
- data/lib/bashly/views/command/command_filter.gtx +1 -2
- data/lib/bashly/views/command/default_assignments.gtx +2 -2
- data/lib/bashly/views/command/dependencies_filter.gtx +1 -2
- data/lib/bashly/views/command/fixed_flags_filter.gtx +2 -2
- data/lib/bashly/views/command/parse_requirements_case_catch_all.gtx +2 -2
- data/lib/bashly/views/command/parse_requirements_case_repeatable.gtx +5 -6
- data/lib/bashly/views/command/parse_requirements_case_simple.gtx +2 -2
- data/lib/bashly/views/command/required_args_filter.gtx +1 -1
- data/lib/bashly/views/command/required_flags_filter.gtx +1 -1
- data/lib/bashly/views/command/run.gtx +6 -4
- data/lib/bashly/views/command/whitelist_filter.gtx +2 -2
- data/lib/bashly/views/flag/case_arg.gtx +4 -4
- data/lib/bashly/views/flag/case_no_arg.gtx +2 -2
- data/lib/bashly/views/flag/conflicts.gtx +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebf951958bb0478fb95b88273b87ccb2f297d36b655996b79d16c2ffdb32e773
|
4
|
+
data.tar.gz: aa3a9c218e9876fea287f141191baa4d95b40ae8b5569a7418c40911373e43ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 468d632281f56529a13770dce48d3bfbfc19433f2d32f52c0741b0d3c3ff80b15ad78b1936897e451d341f74b0d68ed6e5dd753ed4ed155984890b97ef8fbcf9
|
7
|
+
data.tar.gz: 4af3052a3d4b66b647bb461b6300eae17f72cfa61ef419f917fc6a23b881cb0af11dfb37d04628b2afedbf99f080ab04e2a5104d90d4ce148a01ceda1c2c2816
|
data/README.md
CHANGED
@@ -27,7 +27,6 @@ usually handled by a framework in any other programming language.
|
|
27
27
|
It is available both as a [ruby gem](https://rubygems.org/gems/bashly) and as
|
28
28
|
a [docker image](https://hub.docker.com/r/dannyben/bashly).
|
29
29
|
|
30
|
-
|
31
30
|
## Documentation
|
32
31
|
|
33
32
|
- [Bashly Homepage][docs]
|
@@ -49,6 +48,7 @@ a [docker image](https://hub.docker.com/r/dannyben/bashly).
|
|
49
48
|
Bashly is responsible for:
|
50
49
|
|
51
50
|
- Generating a **single, standalone bash script**.
|
51
|
+
- Generating a **human readable, shellcheck-compliant and shfmt-compliant script**.
|
52
52
|
- Generating **usage texts** and help screens, showing your tool's arguments, flags and commands (works for sub-commands also).
|
53
53
|
- Parsing the user's command line and extracting:
|
54
54
|
- Optional or required **positional arguments**.
|
@@ -72,15 +72,12 @@ to contribute, feel free to [open an issue][issues] or
|
|
72
72
|
|
73
73
|
Visit the *[How to contribute][contributing]* page for more information.
|
74
74
|
|
75
|
-
|
76
75
|
## Stargazers and Forkers
|
77
76
|
|
78
77
|
[![Stargazers repo roster for @DannyBen/bashly](https://reporoster.com/stars/DannyBen/bashly)](https://github.com/DannyBen/bashly/stargazers)
|
79
78
|
|
80
79
|
[![Forkers repo roster for @DannyBen/bashly](https://reporoster.com/forks/DannyBen/bashly)](https://github.com/DannyBen/bashly/network/members)
|
81
80
|
|
82
|
-
|
83
|
-
|
84
81
|
[issues]: https://github.com/DannyBen/bashly/issues
|
85
82
|
[discussions]: https://github.com/DannyBen/bashly/discussions
|
86
83
|
[docs]: https://bashly.dannyb.co/
|
data/lib/bashly/commands/add.rb
CHANGED
@@ -34,8 +34,11 @@ module Bashly
|
|
34
34
|
command 'comp', 'Generate a bash completions script or function.'
|
35
35
|
command 'config', 'Add standard functions for handling INI files to the lib directory.'
|
36
36
|
command 'help', 'Add a help command, in addition to the standard --help flag.'
|
37
|
-
command 'lib',
|
38
|
-
|
37
|
+
command 'lib', <<~USAGE
|
38
|
+
Create the lib directory for any additional user scripts.
|
39
|
+
All *.sh scripts in this directory will be included in the final bash script.
|
40
|
+
Note that if you configured a different partials_extension, then the extensions of the files in this directory need to match.
|
41
|
+
USAGE
|
39
42
|
|
40
43
|
command 'settings', 'Copy a sample settings.yml file to your project, allowing you to customize some ' \
|
41
44
|
'bashly options.'
|
@@ -130,7 +130,8 @@ module Bashly
|
|
130
130
|
def create_user_files
|
131
131
|
quiet_say "creating user files in !txtgrn!#{Settings.source_dir}"
|
132
132
|
|
133
|
-
create_file "#{Settings.source_dir}/initialize.
|
133
|
+
create_file "#{Settings.source_dir}/initialize.#{Settings.partials_extension}",
|
134
|
+
command.render(:default_initialize_script)
|
134
135
|
|
135
136
|
if command.commands.empty?
|
136
137
|
create_root_command_file
|
@@ -37,6 +37,12 @@ module Bashly
|
|
37
37
|
assert_boolean "#{key}.required", value['required']
|
38
38
|
end
|
39
39
|
|
40
|
+
def assert_default_command(key, value)
|
41
|
+
return unless value
|
42
|
+
|
43
|
+
assert [true, false, nil, 'force'].include?(value), "#{key} must be a boolean, or the string 'force'"
|
44
|
+
end
|
45
|
+
|
40
46
|
def assert_dependencies(key, value)
|
41
47
|
return unless value
|
42
48
|
|
@@ -145,7 +151,7 @@ module Bashly
|
|
145
151
|
assert_optional_string "#{key}.function", value['function']
|
146
152
|
|
147
153
|
assert_boolean "#{key}.private", value['private']
|
148
|
-
|
154
|
+
assert_default_command "#{key}.default", value['default']
|
149
155
|
assert_expose "#{key}.expose", value['expose']
|
150
156
|
assert_version "#{key}.version", value['version']
|
151
157
|
assert_catch_all "#{key}.catch_all", value['catch_all']
|
@@ -171,10 +177,6 @@ module Bashly
|
|
171
177
|
"#{key}.function must contain lowercase alphanumeric characters and underscores only"
|
172
178
|
end
|
173
179
|
|
174
|
-
if value['default']
|
175
|
-
assert value['args'], "#{key}.default makes no sense without args"
|
176
|
-
end
|
177
|
-
|
178
180
|
if value['catch_all'] && value['args']
|
179
181
|
repeatable_arg = value['args'].find { |a| a['repeatable'] }&.dig 'name'
|
180
182
|
refute repeatable_arg, "#{key}.catch_all makes no sense with repeatable arg (#{repeatable_arg})"
|
data/lib/bashly/libraries.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
colors:
|
2
2
|
files:
|
3
3
|
- source: "templates/lib/colors.sh"
|
4
|
-
target: "%{user_lib_dir}/colors
|
4
|
+
target: "%{user_lib_dir}/colors.%{user_ext}"
|
5
5
|
|
6
6
|
completions: :CompletionsFunction
|
7
7
|
completions_script: :CompletionsScript
|
@@ -10,14 +10,14 @@ completions_yaml: :CompletionsYAML
|
|
10
10
|
config:
|
11
11
|
files:
|
12
12
|
- source: "templates/lib/config.sh"
|
13
|
-
target: "%{user_lib_dir}/config
|
13
|
+
target: "%{user_lib_dir}/config.%{user_ext}"
|
14
14
|
|
15
15
|
help: :Help
|
16
16
|
|
17
17
|
lib:
|
18
18
|
files:
|
19
19
|
- source: "templates/lib/sample_function.sh"
|
20
|
-
target: "%{user_lib_dir}/sample_function
|
20
|
+
target: "%{user_lib_dir}/sample_function.%{user_ext}"
|
21
21
|
|
22
22
|
settings:
|
23
23
|
files:
|
@@ -46,15 +46,15 @@ test:
|
|
46
46
|
validations:
|
47
47
|
files:
|
48
48
|
- source: "templates/lib/validations/validate_dir_exists.sh"
|
49
|
-
target: "%{user_lib_dir}/validations/validate_dir_exists
|
49
|
+
target: "%{user_lib_dir}/validations/validate_dir_exists.%{user_ext}"
|
50
50
|
- source: "templates/lib/validations/validate_file_exists.sh"
|
51
|
-
target: "%{user_lib_dir}/validations/validate_file_exists
|
51
|
+
target: "%{user_lib_dir}/validations/validate_file_exists.%{user_ext}"
|
52
52
|
- source: "templates/lib/validations/validate_integer.sh"
|
53
|
-
target: "%{user_lib_dir}/validations/validate_integer
|
53
|
+
target: "%{user_lib_dir}/validations/validate_integer.%{user_ext}"
|
54
54
|
- source: "templates/lib/validations/validate_not_empty.sh"
|
55
|
-
target: "%{user_lib_dir}/validations/validate_not_empty
|
55
|
+
target: "%{user_lib_dir}/validations/validate_not_empty.%{user_ext}"
|
56
56
|
|
57
57
|
yaml:
|
58
58
|
files:
|
59
59
|
- source: "templates/lib/yaml.sh"
|
60
|
-
target: "%{user_lib_dir}/yaml
|
60
|
+
target: "%{user_lib_dir}/yaml.%{user_ext}"
|
data/lib/bashly/library.rb
CHANGED
@@ -156,7 +156,7 @@ module Bashly
|
|
156
156
|
# Returns the bash filename that is expected to hold the user code
|
157
157
|
# for this command
|
158
158
|
def filename
|
159
|
-
options['filename'] || "#{action_name.to_underscore}_command.
|
159
|
+
options['filename'] || "#{action_name.to_underscore}_command.#{Settings.partials_extension}"
|
160
160
|
end
|
161
161
|
|
162
162
|
# Returns an array of Flags
|
@@ -281,7 +281,7 @@ module Bashly
|
|
281
281
|
# This is meant to provide the user with the ability to add custom
|
282
282
|
# functions
|
283
283
|
def user_lib
|
284
|
-
@user_lib ||= Dir["#{Settings.full_lib_dir}
|
284
|
+
@user_lib ||= Dir["#{Settings.full_lib_dir}/**/*.#{Settings.partials_extension}"].sort
|
285
285
|
end
|
286
286
|
|
287
287
|
# Returns an array of all the args with a whitelist
|
data/lib/bashly/settings.rb
CHANGED
@@ -3,47 +3,51 @@ module Bashly
|
|
3
3
|
class << self
|
4
4
|
include AssetHelper
|
5
5
|
|
6
|
-
attr_writer :compact_short_flags, :
|
7
|
-
:
|
6
|
+
attr_writer :compact_short_flags, :lib_dir, :partials_extension,
|
7
|
+
:source_dir, :strict, :tab_indent, :target_dir
|
8
8
|
|
9
|
-
def
|
10
|
-
@
|
9
|
+
def compact_short_flags
|
10
|
+
@compact_short_flags ||= get :compact_short_flags
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
@
|
13
|
+
def env
|
14
|
+
@env ||= get(:env)&.to_sym
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
@
|
17
|
+
def env=(value)
|
18
|
+
@env = value&.to_sym
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
21
|
+
def full_lib_dir
|
22
|
+
"#{source_dir}/#{lib_dir}"
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
26
|
-
@
|
25
|
+
def lib_dir
|
26
|
+
@lib_dir ||= get :lib_dir
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
@
|
29
|
+
def partials_extension
|
30
|
+
@partials_extension ||= get :partials_extension
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
34
|
-
|
33
|
+
def production?
|
34
|
+
env == :production
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
38
|
-
@
|
37
|
+
def source_dir
|
38
|
+
@source_dir ||= get :source_dir
|
39
39
|
end
|
40
40
|
|
41
|
-
def
|
42
|
-
|
41
|
+
def strict
|
42
|
+
@strict ||= get :strict
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
46
|
-
|
45
|
+
def tab_indent
|
46
|
+
@tab_indent ||= get :tab_indent
|
47
|
+
end
|
48
|
+
|
49
|
+
def target_dir
|
50
|
+
@target_dir ||= get :target_dir
|
47
51
|
end
|
48
52
|
|
49
53
|
private
|
data/lib/bashly/version.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
= view_marker
|
2
2
|
|
3
|
-
|
4
|
-
>
|
5
|
-
>
|
6
|
-
>
|
7
|
-
>
|
3
|
+
if !default_command || default_command.default != 'force'
|
4
|
+
> "")
|
5
|
+
> {{ function_name }}_usage >&2
|
6
|
+
> exit 1
|
7
|
+
> ;;
|
8
|
+
>
|
9
|
+
end
|
10
|
+
|
8
11
|
> *)
|
9
12
|
|
10
13
|
if default_command
|
@@ -21,6 +24,7 @@ elsif extensible.is_a? String
|
|
21
24
|
> printf "{{ strings[:invalid_command] }}\n" "$action" >&2
|
22
25
|
> exit 1
|
23
26
|
> fi
|
27
|
+
> ;;
|
24
28
|
>
|
25
29
|
|
26
30
|
elsif extensible
|
@@ -31,6 +35,7 @@ elsif extensible
|
|
31
35
|
> printf "{{ strings[:invalid_command] }}\n" "$action" >&2
|
32
36
|
> exit 1
|
33
37
|
> fi
|
38
|
+
> ;;
|
34
39
|
>
|
35
40
|
|
36
41
|
else
|
@@ -2,11 +2,11 @@ if default_args.any? or default_flags.any?
|
|
2
2
|
= view_marker
|
3
3
|
|
4
4
|
default_args.each do |arg|
|
5
|
-
> [[ -n ${args[{{ arg.name }}]:-} ]] || args[{{ arg.name }}]="{{ arg.default }}"
|
5
|
+
> [[ -n ${args['{{ arg.name }}']:-} ]] || args['{{ arg.name }}']="{{ arg.default }}"
|
6
6
|
end
|
7
7
|
|
8
8
|
default_flags.each do |flag|
|
9
|
-
> [[ -n ${args[{{ flag.long }}]:-} ]] || args[{{ flag.long }}]="{{ flag.default }}"
|
9
|
+
> [[ -n ${args['{{ flag.long }}']:-} ]] || args['{{ flag.long }}']="{{ flag.default }}"
|
10
10
|
end
|
11
11
|
|
12
12
|
>
|
@@ -5,8 +5,7 @@ if dependencies
|
|
5
5
|
> if ! command -v {{ dependency }} >/dev/null 2>&1; then
|
6
6
|
> printf "{{ strings[:missing_dependency] % { dependency: dependency } }}\n" >&2
|
7
7
|
if message and !message.empty?
|
8
|
-
>
|
9
|
-
> printf "{{ message }}\n" >&2
|
8
|
+
> printf "%s\n" "{{ message }}" >&2
|
10
9
|
end
|
11
10
|
> exit 1
|
12
11
|
> fi
|
@@ -4,14 +4,14 @@
|
|
4
4
|
> case "${1:-}" in
|
5
5
|
|
6
6
|
if root_command?
|
7
|
-
= short_flag_exist?("-v") ? "--version)" : "--version | -v)".indent(4)
|
7
|
+
= (short_flag_exist?("-v") ? "--version)" : "--version | -v)").indent(4)
|
8
8
|
> version_command
|
9
9
|
> exit
|
10
10
|
> ;;
|
11
11
|
>
|
12
12
|
end
|
13
13
|
|
14
|
-
= short_flag_exist?("-h") ? "--help)" : "--help | -h)".indent(4)
|
14
|
+
= (short_flag_exist?("-h") ? "--help)" : "--help | -h)").indent(4)
|
15
15
|
> long_usage=yes
|
16
16
|
> <%= function_name %>_usage
|
17
17
|
> exit
|
@@ -3,9 +3,9 @@
|
|
3
3
|
if args.any?
|
4
4
|
condition = "if"
|
5
5
|
args.each do |arg|
|
6
|
-
> {{ condition }} [[ -z ${args[{{ arg.name }}]+x} ]]; then
|
6
|
+
> {{ condition }} [[ -z ${args['{{ arg.name }}']+x} ]]; then
|
7
7
|
= arg.render(:validations).indent 2
|
8
|
-
> args[{{ arg.name }}]=$1
|
8
|
+
> args['{{ arg.name }}']=$1
|
9
9
|
> shift
|
10
10
|
|
11
11
|
condition = "elif"
|
@@ -2,18 +2,17 @@
|
|
2
2
|
|
3
3
|
condition = "if"
|
4
4
|
args.each do |arg|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
= arg.render(:validations)
|
6
|
+
> {{ condition }} [[ -z ${args['{{ arg.name }}']+x} ]]; then
|
8
7
|
if arg.repeatable
|
9
|
-
> args[{{ arg.name }}]="\"$1\""
|
8
|
+
> args['{{ arg.name }}']="\"$1\""
|
10
9
|
> shift
|
11
10
|
> else
|
12
|
-
> args[{{ arg.name }}]="${args[{{ arg.name }}]} \"$1\""
|
11
|
+
> args['{{ arg.name }}']="${args[{{ arg.name }}]} \"$1\""
|
13
12
|
> shift
|
14
13
|
|
15
14
|
else
|
16
|
-
> args[{{ arg.name }}]=$1
|
15
|
+
> args['{{ arg.name }}']=$1
|
17
16
|
> shift
|
18
17
|
|
19
18
|
end
|
@@ -3,9 +3,9 @@
|
|
3
3
|
if args.any?
|
4
4
|
condition = "if"
|
5
5
|
args.each do |arg|
|
6
|
-
> {{ condition }} [[ -z ${args[{{ arg.name }}]+x} ]]; then
|
6
|
+
> {{ condition }} [[ -z ${args['{{ arg.name }}']+x} ]]; then
|
7
7
|
> {{ arg.render(:validations).indent 2 }}
|
8
|
-
> args[{{ arg.name }}]=$1
|
8
|
+
> args['{{ arg.name }}']=$1
|
9
9
|
> shift
|
10
10
|
|
11
11
|
condition = "elif"
|
@@ -2,7 +2,7 @@ if required_args.any?
|
|
2
2
|
= view_marker
|
3
3
|
|
4
4
|
required_args.each do |arg|
|
5
|
-
> if [[ -z ${args[{{ arg.name }}]+x} ]]; then
|
5
|
+
> if [[ -z ${args['{{ arg.name }}']+x} ]]; then
|
6
6
|
> printf "{{ strings[:missing_required_argument] % { arg: arg.name.upcase, usage: usage_string } }}\n" >&2
|
7
7
|
> exit 1
|
8
8
|
> fi
|
@@ -2,7 +2,7 @@ if required_flags.any?
|
|
2
2
|
= view_marker
|
3
3
|
|
4
4
|
required_flags.each do |flag|
|
5
|
-
> if [[ -z ${args[{{ flag.long }}]+x} ]]; then
|
5
|
+
> if [[ -z ${args['{{ flag.long }}']+x} ]]; then
|
6
6
|
> printf "{{ strings[:missing_required_flag] % { usage: flag.usage_string } }}\n" >&2
|
7
7
|
> exit 1
|
8
8
|
> fi
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
deep_commands.each do |command|
|
13
13
|
> "{{ command.action_name }}")
|
14
|
-
> if [[ ${args[--help]:-} ]]; then
|
14
|
+
> if [[ ${args['--help']:-} ]]; then
|
15
15
|
> long_usage=yes
|
16
16
|
> {{ command.function_name }}_usage
|
17
17
|
> else
|
@@ -21,9 +21,11 @@ deep_commands.each do |command|
|
|
21
21
|
>
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
>
|
26
|
-
>
|
24
|
+
if commands.empty?
|
25
|
+
> "root")
|
26
|
+
> root_command
|
27
|
+
> ;;
|
28
|
+
end
|
27
29
|
>
|
28
30
|
> esac
|
29
31
|
> }
|
@@ -12,7 +12,7 @@ if whitelisted_args.any? or whitelisted_flags.any?
|
|
12
12
|
> done
|
13
13
|
|
14
14
|
else
|
15
|
-
> if [[ ! ${args[{{ arg.name }}]} =~ ^({{ arg.allowed.join '|' }})$ ]]; then
|
15
|
+
> if [[ ! ${args['{{ arg.name }}']} =~ ^({{ arg.allowed.join '|' }})$ ]]; then
|
16
16
|
> printf "%s\n" "{{ strings[:disallowed_argument] % { name: arg.name, allowed: arg.allowed.join(', ') } }}" >&2
|
17
17
|
> exit 1
|
18
18
|
> fi
|
@@ -31,7 +31,7 @@ if whitelisted_args.any? or whitelisted_flags.any?
|
|
31
31
|
> done
|
32
32
|
|
33
33
|
else
|
34
|
-
> if [[ ! ${args[{{ flag.name }}]} =~ ^({{ flag.allowed.join '|' }})$ ]]; then
|
34
|
+
> if [[ ! ${args['{{ flag.name }}']} =~ ^({{ flag.allowed.join '|' }})$ ]]; then
|
35
35
|
> printf "%s\n" "{{ strings[:disallowed_flag] % { name: flag.name, allowed: flag.allowed.join(', ') } }}" >&2
|
36
36
|
> exit 1
|
37
37
|
> fi
|
@@ -4,14 +4,14 @@
|
|
4
4
|
= render(:validations).indent 2
|
5
5
|
|
6
6
|
if repeatable
|
7
|
-
> if [[ -z ${args[{{ name }}]+x} ]]; then
|
8
|
-
> args[{{ name }}]="\"$2\""
|
7
|
+
> if [[ -z ${args['{{ name }}']+x} ]]; then
|
8
|
+
> args['{{ name }}']="\"$2\""
|
9
9
|
> else
|
10
|
-
> args[{{ name }}]="${args[{{ name }}]} \"$2\""
|
10
|
+
> args['{{ name }}']="${args[{{ name }}]} \"$2\""
|
11
11
|
> fi
|
12
12
|
|
13
13
|
else
|
14
|
-
> args[{{ name }}]="$2"
|
14
|
+
> args['{{ name }}']="$2"
|
15
15
|
|
16
16
|
end
|
17
17
|
|
@@ -3,7 +3,7 @@ if conflicts
|
|
3
3
|
= view_marker
|
4
4
|
|
5
5
|
if conflicts.count == 1
|
6
|
-
> if [[ -n "${args[{{ conflicts.first }}]:-}" ]]; then
|
6
|
+
> if [[ -n "${args['{{ conflicts.first }}']:-}" ]]; then
|
7
7
|
> printf "{{ strings[:conflicting_flags] }}\n" "$key" "{{ conflicts.first }}" >&2
|
8
8
|
> exit 1
|
9
9
|
> fi
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bashly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: completely
|