Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)
| ... | ... |
@@ -77,6 +77,9 @@ import ( |
| 77 | 77 |
// ErrHelp is the error returned if the flag -help is invoked but no such flag is defined. |
| 78 | 78 |
var ErrHelp = errors.New("flag: help requested")
|
| 79 | 79 |
|
| 80 |
+// ErrRetry is the error returned if you need to try letter by letter |
|
| 81 |
+var ErrRetry = errors.New("flag: retry")
|
|
| 82 |
+ |
|
| 80 | 83 |
// -- bool Value |
| 81 | 84 |
type boolValue bool |
| 82 | 85 |
|
| ... | ... |
@@ -733,21 +736,21 @@ func (f *FlagSet) usage() {
|
| 733 | 733 |
} |
| 734 | 734 |
|
| 735 | 735 |
// parseOne parses one flag. It reports whether a flag was seen. |
| 736 |
-func (f *FlagSet) parseOne() (bool, error) {
|
|
| 736 |
+func (f *FlagSet) parseOne() (bool, string, error) {
|
|
| 737 | 737 |
if len(f.args) == 0 {
|
| 738 |
- return false, nil |
|
| 738 |
+ return false, "", nil |
|
| 739 | 739 |
} |
| 740 | 740 |
s := f.args[0] |
| 741 | 741 |
if len(s) == 0 || s[0] != '-' || len(s) == 1 {
|
| 742 |
- return false, nil |
|
| 742 |
+ return false, "", nil |
|
| 743 | 743 |
} |
| 744 | 744 |
if s[1] == '-' && len(s) == 2 { // "--" terminates the flags
|
| 745 | 745 |
f.args = f.args[1:] |
| 746 |
- return false, nil |
|
| 746 |
+ return false, "", nil |
|
| 747 | 747 |
} |
| 748 | 748 |
name := s[1:] |
| 749 | 749 |
if len(name) == 0 || name[0] == '=' {
|
| 750 |
- return false, f.failf("bad flag syntax: %s", s)
|
|
| 750 |
+ return false, "", f.failf("bad flag syntax: %s", s)
|
|
| 751 | 751 |
} |
| 752 | 752 |
|
| 753 | 753 |
// it's a flag. does it have an argument? |
| ... | ... |
@@ -767,14 +770,14 @@ func (f *FlagSet) parseOne() (bool, error) {
|
| 767 | 767 |
if !alreadythere {
|
| 768 | 768 |
if name == "-help" || name == "help" || name == "h" { // special case for nice help message.
|
| 769 | 769 |
f.usage() |
| 770 |
- return false, ErrHelp |
|
| 770 |
+ return false, "", ErrHelp |
|
| 771 | 771 |
} |
| 772 |
- return false, f.failf("flag provided but not defined: -%s", name)
|
|
| 772 |
+ return false, name, ErrRetry |
|
| 773 | 773 |
} |
| 774 | 774 |
if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
|
| 775 | 775 |
if has_value {
|
| 776 | 776 |
if err := fv.Set(value); err != nil {
|
| 777 |
- return false, f.failf("invalid boolean value %q for -%s: %v", value, name, err)
|
|
| 777 |
+ return false, "", f.failf("invalid boolean value %q for -%s: %v", value, name, err)
|
|
| 778 | 778 |
} |
| 779 | 779 |
} else {
|
| 780 | 780 |
fv.Set("true")
|
| ... | ... |
@@ -787,17 +790,17 @@ func (f *FlagSet) parseOne() (bool, error) {
|
| 787 | 787 |
value, f.args = f.args[0], f.args[1:] |
| 788 | 788 |
} |
| 789 | 789 |
if !has_value {
|
| 790 |
- return false, f.failf("flag needs an argument: -%s", name)
|
|
| 790 |
+ return false, "", f.failf("flag needs an argument: -%s", name)
|
|
| 791 | 791 |
} |
| 792 | 792 |
if err := flag.Value.Set(value); err != nil {
|
| 793 |
- return false, f.failf("invalid value %q for flag -%s: %v", value, name, err)
|
|
| 793 |
+ return false, "", f.failf("invalid value %q for flag -%s: %v", value, name, err)
|
|
| 794 | 794 |
} |
| 795 | 795 |
} |
| 796 | 796 |
if f.actual == nil {
|
| 797 | 797 |
f.actual = make(map[string]*Flag) |
| 798 | 798 |
} |
| 799 | 799 |
f.actual[name] = flag |
| 800 |
- return true, nil |
|
| 800 |
+ return true, "", nil |
|
| 801 | 801 |
} |
| 802 | 802 |
|
| 803 | 803 |
// Parse parses flag definitions from the argument list, which should not |
| ... | ... |
@@ -808,13 +811,34 @@ func (f *FlagSet) Parse(arguments []string) error {
|
| 808 | 808 |
f.parsed = true |
| 809 | 809 |
f.args = arguments |
| 810 | 810 |
for {
|
| 811 |
- seen, err := f.parseOne() |
|
| 811 |
+ seen, name, err := f.parseOne() |
|
| 812 | 812 |
if seen {
|
| 813 | 813 |
continue |
| 814 | 814 |
} |
| 815 | 815 |
if err == nil {
|
| 816 | 816 |
break |
| 817 | 817 |
} |
| 818 |
+ if err == ErrRetry {
|
|
| 819 |
+ if len(name) > 1 {
|
|
| 820 |
+ err = nil |
|
| 821 |
+ for _, letter := range strings.Split(name, "") {
|
|
| 822 |
+ f.args = append([]string{"-" + letter}, f.args...)
|
|
| 823 |
+ seen2, _, err2 := f.parseOne() |
|
| 824 |
+ if seen2 {
|
|
| 825 |
+ continue |
|
| 826 |
+ } |
|
| 827 |
+ if err2 != nil {
|
|
| 828 |
+ err = f.failf("flag provided but not defined: -%s", name)
|
|
| 829 |
+ break |
|
| 830 |
+ } |
|
| 831 |
+ } |
|
| 832 |
+ if err == nil {
|
|
| 833 |
+ continue |
|
| 834 |
+ } |
|
| 835 |
+ } else {
|
|
| 836 |
+ err = f.failf("flag provided but not defined: -%s", name)
|
|
| 837 |
+ } |
|
| 838 |
+ } |
|
| 818 | 839 |
switch f.errorHandling {
|
| 819 | 840 |
case ContinueOnError: |
| 820 | 841 |
return err |