]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/api: handle contexts re-converging
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Oct 2012 12:12:59 +0000 (13:12 +0100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Oct 2012 12:12:59 +0000 (13:12 +0100)
Fixes #4303

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/6816058

src/cmd/api/goapi.go
src/cmd/api/goapi_test.go

index d6ca892103cc291c6c7cef4cc65ca7137bb313d2..26b34824098c5c6bad0fbbf8573dc5788c1bd6e0 100644 (file)
@@ -29,6 +29,7 @@ import (
        "os/exec"
        "path"
        "path/filepath"
+       "regexp"
        "runtime"
        "sort"
        "strconv"
@@ -192,17 +193,29 @@ func main() {
        fail = !compareAPI(bw, features, required, optional, exception)
 }
 
+func set(items []string) map[string]bool {
+       s := make(map[string]bool)
+       for _, v := range items {
+               s[v] = true
+       }
+       return s
+}
+
+var spaceParensRx = regexp.MustCompile(` \(\S+?\)`)
+
+func featureWithoutContext(f string) string {
+       if !strings.Contains(f, "(") {
+               return f
+       }
+       return spaceParensRx.ReplaceAllString(f, "")
+}
+
 func compareAPI(w io.Writer, features, required, optional, exception []string) (ok bool) {
        ok = true
 
-       var optionalSet = make(map[string]bool)  // feature => true
-       var exceptionSet = make(map[string]bool) // exception => true
-       for _, f := range optional {
-               optionalSet[f] = true
-       }
-       for _, f := range exception {
-               exceptionSet[f] = true
-       }
+       optionalSet := set(optional)
+       exceptionSet := set(exception)
+       featureSet := set(features)
 
        sort.Strings(features)
        sort.Strings(required)
@@ -215,15 +228,17 @@ func compareAPI(w io.Writer, features, required, optional, exception []string) (
 
        for len(required) > 0 || len(features) > 0 {
                switch {
-               case len(features) == 0 || required[0] < features[0]:
+               case len(features) == 0 || (len(required) > 0 && required[0] < features[0]):
                        feature := take(&required)
                        if exceptionSet[feature] {
                                fmt.Fprintf(w, "~%s\n", feature)
+                       } else if featureSet[featureWithoutContext(feature)] {
+                               // okay.
                        } else {
                                fmt.Fprintf(w, "-%s\n", feature)
                                ok = false // broke compatibility
                        }
-               case len(required) == 0 || required[0] > features[0]:
+               case len(required) == 0 || (len(features) > 0 && required[0] > features[0]):
                        newFeature := take(&features)
                        if optionalSet[newFeature] {
                                // Known added feature to the upcoming release.
index b4fccdfd4ea1390ad12ba5fbd46ab4aca57ca2ac..1a86c0ec70c5e5a0de19041224728568fe65f3bc 100644 (file)
@@ -84,10 +84,10 @@ func TestCompareAPI(t *testing.T) {
        }{
                {
                        name:     "feature added",
-                       features: []string{"C", "A", "B"},
-                       required: []string{"A", "C"},
+                       features: []string{"A", "B", "C", "D", "E", "F"},
+                       required: []string{"B", "D"},
                        ok:       true,
-                       out:      "+B\n",
+                       out:      "+A\n+C\n+E\n+F\n",
                },
                {
                        name:     "feature removed",
@@ -112,6 +112,21 @@ func TestCompareAPI(t *testing.T) {
                        ok:        true,
                        out:       "~B\n",
                },
+               {
+                       // http://golang.org/issue/4303
+                       name: "contexts reconverging",
+                       required: []string{
+                               "A",
+                               "pkg syscall (darwin-386), type RawSockaddrInet6 struct",
+                               "pkg syscall (darwin-amd64), type RawSockaddrInet6 struct",
+                       },
+                       features: []string{
+                               "A",
+                               "pkg syscall, type RawSockaddrInet6 struct",
+                       },
+                       ok:  true,
+                       out: "+pkg syscall, type RawSockaddrInet6 struct\n",
+               },
        }
        for _, tt := range tests {
                buf := new(bytes.Buffer)