Browse code

enable docker run -it

Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)

Victor Vieux authored on 2014/02/19 09:24:32
Showing 2 changed files
... ...
@@ -27,4 +27,5 @@ func main() {
27 27
 	fmt.Printf("b: %b\n", b)
28 28
 	fmt.Printf("-bool: %b\n", b2)
29 29
 	fmt.Printf("s/#hidden/-string(via lookup): %s\n", flag.Lookup("s").Value.String())
30
+	fmt.Printf("ARGS: %v\n", flag.Args())
30 31
 }
... ...
@@ -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