Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Support terminated options like find -exec #395

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

rebornplusplus
Copy link

@rebornplusplus rebornplusplus commented Feb 1, 2023

feat: Support terminated options like find -exec

Enable option to receive arguments until specified terminator
is reached or EOL has been found. This is inspired from
find -exec [commands..] ; where commands.. is treated as
arguments to -exec.

If for an option opt, terminator is specified to be
; (semi-colon), in the following

$ program [options] --opt v --w=x -- "y z" \; [more-options]

--opt will receive {"v", "--w=x", "--", "y z"} as its
argument. Note that, the -- inside will also be passed to
--opt regardless PassDoubleDash is set or not. However,
once the scope of --opt is finished, i.e. terminator ;
is reached, -- will act as before if PassDoubleDash is set.

Use tag terminator to specify the terminator for
the option related to that field.

Please note that, the specified terminator should be a
separate token, instead of being jotted with other characters.
For example,

--opt [arguments..] ; [options..]

will be correctly parsed with terminator: ";". However,

--opt [arguments..] arg; [options..]

will not be correctly parsed. The parser will pass "arg;",
and continue to look for the terminator in [options..].

rebornplusplus added a commit to rebornplusplus/pebble that referenced this pull request Feb 8, 2023
The upstream go-flags project do not support terminated options
like ``find -exec``. The repo was forked and the feature was
introduced in [0].

Until the PR [1] is merged in the upstream repo, we need to
maintain and point to a fork with the features there.

Refs:
- [0] rebornplusplus/go-flags@1dbaf44
- [1] jessevdk/go-flags#395
Copy link

@benhoyt benhoyt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The overall idea looks reasonable to me, but I have a few comments related to making it more general and cleaning it up a bit.

group.go Outdated Show resolved Hide resolved
group.go Outdated Show resolved Hide resolved
group.go Show resolved Hide resolved
option.go Outdated Show resolved Hide resolved
option.go Outdated Show resolved Hide resolved
options_test.go Outdated Show resolved Hide resolved
options_test.go Show resolved Hide resolved
options_test.go Outdated Show resolved Hide resolved
parser.go Outdated Show resolved Hide resolved
options_test.go Show resolved Hide resolved
@rebornplusplus rebornplusplus force-pushed the terminated-options branch 2 times, most recently from df1e3bf to 92578f9 Compare February 22, 2023 08:53
@rebornplusplus
Copy link
Author

Hi @benhoyt, thanks for your comments and suggestions! I have updated the PR. Could you please take another look?

Copy link

@benhoyt benhoyt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work! Just a couple of minor nits comments (and I kinda disagree --term \; that should be disallowed).

option.go Outdated Show resolved Hide resolved
option.go Outdated Show resolved Hide resolved
option.go Outdated Show resolved Hide resolved
option.go Outdated Show resolved Hide resolved
option.go Outdated Show resolved Hide resolved
option.go Outdated Show resolved Hide resolved
options_test.go Outdated Show resolved Hide resolved
parser.go Outdated Show resolved Hide resolved
Enable option to receive arguments until specified terminator
is reached or EOL has been found. This is inspired from
``find -exec [commands..] ;`` where commands.. is treated as
arguments to -exec.

If for an option ``opt``, ``terminator`` is specified to be
; (semi-colon), in the following

    $ program [options] --opt v --w=x -- "y z" \; [more-options]

--opt will receive {"v", "--w=x", "--", "y z"} as its
argument. Note that, the -- inside will also be passed to
--opt regardless PassDoubleDash is set or not. However,
once the scope of --opt is finished, i.e. terminator ;
is reached, -- will act as before if PassDoubleDash is set.

Use tag ``terminator`` to specify the terminator for
the option related to that field.

Please note that, the specified terminator should be a
separate token, instead of being jotted with other characters.
For example,

    --opt [arguments..] ; [options..]

will be correctly parsed with terminator: ";". However,

    --opt [arguments..] arg; [options..]

will not be correctly parsed. The parser will pass "arg;",
and continue to look for the terminator in [options..].
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants