repository: fix a todo in the gogit repo

Michael Muré created

Change summary

go.mod                     |  4 +++
go.sum                     | 16 ++++++++++-
repository/gogit_config.go | 51 ++++++++++++++++++++++++---------------
3 files changed, 49 insertions(+), 22 deletions(-)

Detailed changes

go.mod 🔗

@@ -32,3 +32,7 @@ require (
 	golang.org/x/sync v0.0.0-20190423024810-112230192c58
 	golang.org/x/text v0.3.3
 )
+
+// Use a forked go-git for now until https://github.com/go-git/go-git/pull/112 is merged
+// and released.
+replace github.com/go-git/go-git/v5 => github.com/MichaelMure/go-git/v5 v5.1.1-0.20200827115354-b40ca794fe33

go.sum 🔗

@@ -7,6 +7,17 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic=
 github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
 github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA=
+<<<<<<< HEAD
+=======
+github.com/MichaelMure/go-git/v5 v5.1.1-0.20200827115354-b40ca794fe33 h1:QFzkZPUMm0HRZ0dZ+GgDKHPUrgUrH3CbcyuzQlhBeww=
+github.com/MichaelMure/go-git/v5 v5.1.1-0.20200827115354-b40ca794fe33/go.mod h1:kh02eMX+wdqqxgNMEyq8YgwlIOsDOa9homkUq1PoTMs=
+github.com/MichaelMure/go-term-text v0.2.6 h1:dSmJSzk2iI5xWymSMrMbdVM1bxYWu3DjDFhdcJvAuqA=
+github.com/MichaelMure/go-term-text v0.2.6/go.mod h1:o2Z5T3b28F4kwAojGvvNdbzjHf9t18vbQ7E2pmTe2Ww=
+github.com/MichaelMure/go-term-text v0.2.7 h1:nSYvYGwXxJoiQu6kdGSErpxZ6ah/4WlJyp/niqQor6g=
+github.com/MichaelMure/go-term-text v0.2.7/go.mod h1:6z+q5b/nP1V8I9KkWQcUi5QpmF8DVrz9vLJ4hdoxHnM=
+github.com/MichaelMure/go-term-text v0.2.8 h1:daXIVPjPkAhcLhA+tfjQBHYjatb1D42/LY1Nw2PXYlU=
+github.com/MichaelMure/go-term-text v0.2.8/go.mod h1:6z+q5b/nP1V8I9KkWQcUi5QpmF8DVrz9vLJ4hdoxHnM=
+>>>>>>> d2f92f6... repository: fix a todo in the gogit repo
 github.com/MichaelMure/go-term-text v0.2.9 h1:jUxInT3rDhl4WoJgLnmMS3hR79zigyJS1TqKFDTI6xE=
 github.com/MichaelMure/go-term-text v0.2.9/go.mod h1:2QSU/Nn2u41Tqoar+90RlYuhjngJPYgod7evnsYwkWc=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
@@ -64,10 +75,10 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
-github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
 github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a h1:mq+R6XEM6lJX5VlLyZIrUSP8tSuJp82xTK89hvBwJbU=
 github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM=
+github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
+github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
 github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
@@ -85,6 +96,7 @@ github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agR
 github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
 github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc=
 github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
+github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
 github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk=
 github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=

repository/gogit_config.go 🔗

@@ -105,19 +105,40 @@ func (ggc *goGitConfig) ReadString(key string) (string, error) {
 
 	split := strings.Split(key, ".")
 
-	// TODO: return ErrNoConfigEntry and ErrMultipleConfigEntry
-	// Can use forked go-git: https://github.com/go-git/go-git/pull/112
+	if len(split) <= 1 {
+		return "", fmt.Errorf("invalid key")
+	}
+
+	sectionName := split[0]
+	if !cfg.Raw.HasSection(sectionName) {
+		return "", ErrNoConfigEntry
+	}
+	section := cfg.Raw.Section(sectionName)
 
 	switch {
-	case len(split) <= 1:
-		return "", fmt.Errorf("invalid key")
 	case len(split) == 2:
-		return cfg.Raw.Section(split[0]).Option(split[1]), nil
+		optionName := split[1]
+		if !section.HasOption(optionName) {
+			return "", ErrNoConfigEntry
+		}
+		if len(section.OptionAll(optionName)) > 1 {
+			return "", ErrMultipleConfigEntry
+		}
+		return section.Option(optionName), nil
 	default:
-		section := split[0]
-		subsection := strings.Join(split[1:len(split)-2], ".")
-		option := split[len(split)-1]
-		return cfg.Raw.Section(section).Subsection(subsection).Option(option), nil
+		subsectionName := strings.Join(split[1:len(split)-2], ".")
+		optionName := split[len(split)-1]
+		if !section.HasSubsection(subsectionName) {
+			return "", ErrNoConfigEntry
+		}
+		subsection := section.Subsection(subsectionName)
+		if !subsection.HasOption(optionName) {
+			return "", ErrNoConfigEntry
+		}
+		if len(subsection.OptionAll(optionName)) > 1 {
+			return "", ErrMultipleConfigEntry
+		}
+		return subsection.Option(optionName), nil
 	}
 }
 
@@ -137,16 +158,6 @@ func (ggc *goGitConfig) RemoveAll(keyPrefix string) error {
 
 	split := strings.Split(keyPrefix, ".")
 
-	// missing in go-git
-	hasOption := func(options config.Options, key string) bool {
-		for _, option := range options {
-			if option.IsKey(key) {
-				return true
-			}
-		}
-		return false
-	}
-
 	switch {
 	case len(split) < 1:
 		return fmt.Errorf("invalid key prefix")
@@ -163,7 +174,7 @@ func (ggc *goGitConfig) RemoveAll(keyPrefix string) error {
 		if cfg.Raw.Section(section).HasSubsection(rest) {
 			cfg.Raw.RemoveSubsection(section, rest)
 		} else {
-			if hasOption(cfg.Raw.Section(section).Options, rest) {
+			if cfg.Raw.Section(section).HasOption(rest) {
 				cfg.Raw.Section(section).RemoveOption(rest)
 			} else {
 				return fmt.Errorf("invalid key prefix")