Skip to content

Commit

Permalink
Merge pull request #127 from grafana/bugfix/124-fix-joinschema-go-cod…
Browse files Browse the repository at this point in the history
…egen

[bugfix] Fork deepmap/oapi-codegen to fix joinSchema empty interface codegen bug
  • Loading branch information
sam boyer committed Apr 14, 2023
2 parents 6952e4a + d2f8de9 commit 080555d
Show file tree
Hide file tree
Showing 64 changed files with 10,843 additions and 10 deletions.
2 changes: 1 addition & 1 deletion encoding/gocode/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ import (
"github.com/dave/dst"
"github.com/dave/dst/decorator"
"github.com/dave/dst/dstutil"
"github.com/deepmap/oapi-codegen/pkg/codegen"
"github.com/getkin/kin-openapi/openapi3"
"github.com/grafana/thema"
"github.com/grafana/thema/encoding/openapi"
"github.com/grafana/thema/internal/deepmap/oapi-codegen/pkg/codegen"
"golang.org/x/tools/imports"
)

Expand Down
76 changes: 76 additions & 0 deletions encoding/gocode/testdata/joinschema.txtar
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
-- in.cue --
package generate

import "github.com/grafana/thema"

thema.#Lineage
name: "joined"
joinSchema: {
joinedField1: string
joinedField2: int32
}
seqs: [
{
schemas: [
{
normalField1: bool
normalField2: [...string]
}
]
}
]

-- out/generate/0.0/depointerized.go --
package defaultchange

// Joined defines model for joined.
type Joined struct {
JoinedField1 string `json:"joinedField1"`
JoinedField2 int32 `json:"joinedField2"`
NormalField1 bool `json:"normalField1"`
NormalField2 []string `json:"normalField2"`
}
-- out/generate/0.0/expandref.go --
package defaultchange

// Joined defines model for joined.
type Joined struct {
JoinedField1 string `json:"joinedField1"`
JoinedField2 int32 `json:"joinedField2"`
NormalField1 bool `json:"normalField1"`
NormalField2 []string `json:"normalField2"`
}
-- out/generate/0.0/godeclincomments.go --
package defaultchange

// Joined defines model for joined.
type Joined struct {
JoinedField1 string `json:"joinedField1"`
JoinedField2 int32 `json:"joinedField2"`
NormalField1 bool `json:"normalField1"`
NormalField2 []string `json:"normalField2"`
}
-- out/generate/0.0/group.go --
package defaultchange

// JoinedField1 defines model for joinedField1.
type JoinedField1 = string

// JoinedField2 defines model for joinedField2.
type JoinedField2 = int32

// NormalField1 defines model for normalField1.
type NormalField1 = bool

// NormalField2 defines model for normalField2.
type NormalField2 = []string
-- out/generate/0.0/nil.go --
package joined

// Joined defines model for joined.
type Joined struct {
JoinedField1 string `json:"joinedField1"`
JoinedField2 int32 `json:"joinedField2"`
NormalField1 bool `json:"normalField1"`
NormalField2 []string `json:"normalField2"`
}
10 changes: 6 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,18 @@ go 1.19
require (
cuelang.org/go v0.5.0-beta.2
github.com/dave/dst v0.27.2
github.com/deepmap/oapi-codegen v1.12.4
github.com/getkin/kin-openapi v0.112.0
github.com/getkin/kin-openapi v0.115.0
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219
github.com/google/go-cmp v0.5.8
github.com/grafana/cuetsy v0.1.6
github.com/labstack/echo/v4 v4.9.1
github.com/matryer/moq v0.2.7
github.com/spf13/cobra v1.4.0
github.com/stretchr/testify v1.8.1
github.com/xeipuuv/gojsonschema v1.2.0
github.com/yalue/merged_fs v1.2.2
golang.org/x/mod v0.7.0
golang.org/x/text v0.4.0
golang.org/x/tools v0.3.0
)

Expand All @@ -34,14 +37,14 @@ require (
github.com/invopop/yaml v0.1.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/labstack/echo/v4 v4.9.1 // indirect
github.com/labstack/gommon v0.4.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de // indirect
github.com/perimeterx/marshmallow v1.1.4 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b // indirect
Expand All @@ -54,7 +57,6 @@ require (
golang.org/x/crypto v0.1.0 // indirect
golang.org/x/net v0.2.0 // indirect
golang.org/x/sys v0.2.0 // indirect
golang.org/x/text v0.4.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
18 changes: 13 additions & 5 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ cuelang.org/go v0.5.0-beta.2 h1:am5M7jGvNTJ0rnjrFNyvE7fucL/wRqb0emK4XxdThQI=
cuelang.org/go v0.5.0-beta.2/go.mod h1:okjJBHFQFer+a41sAe2SaGm1glWS8oEb6CmJvn5Zdws=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/cockroachdb/apd/v2 v2.0.1/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw=
github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E=
Expand All @@ -16,22 +15,23 @@ github.com/dave/jennifer v1.5.0 h1:HmgPN93bVDpkQyYbqhCHj5QlgvUkvEOzMyEvKLgCRrg=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s=
github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas=
github.com/emicklei/proto v1.6.15/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/emicklei/proto v1.10.0 h1:pDGyFRVV5RvV+nkBK9iy3q67FBy9Xa7vwrOTE+g5aGw=
github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/getkin/kin-openapi v0.112.0 h1:lnLXx3bAG53EJVI4E/w0N8i1Y/vUZUEsnrXkgnfn7/Y=
github.com/getkin/kin-openapi v0.112.0/go.mod h1:QtwUNt0PAAgIIBEvFWYfB7dfngxtAaqCX1zYHMZDeK8=
github.com/getkin/kin-openapi v0.115.0 h1:c8WHRLVY3G8m9jQTy0/DnIuljgRwTCB5twZytQS4JyU=
github.com/getkin/kin-openapi v0.115.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU=
github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4=
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
Expand Down Expand Up @@ -71,6 +71,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/matryer/moq v0.2.7 h1:RtpiPUM8L7ZSCbSwK+QcZH/E9tgqAkFjKQxsRs25b4w=
github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk=
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
Expand All @@ -85,6 +87,8 @@ github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9
github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/perimeterx/marshmallow v1.1.4 h1:pZLDH9RjlLGGorbXhcaQLhfuV0pFMNfPO55FuFkxqLw=
github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
Expand Down Expand Up @@ -114,6 +118,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
Expand Down
17 changes: 17 additions & 0 deletions internal/deepmap/UPDATING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Updating this fork of deepmap/oapi-codegen

The contents of the `oapi-codegen` are copied from the latest `deepmap/oapi-codegen`, with the following changes:
* All packages except `pkg/codegen` and `pkg/util` have been removed, as they are not needed for thema.
* Package refs have been changed from `github.com/deepmap/oapi-codegen` to `github.com/grafana/thema/internal/deepmap/oapi-codegen`
* `TestExamplePetStoreCodeGeneration` and `TestExamplePetStoreCodeGenerationWithUserTemplates` have been removed from `pkg/codegen/codegen_test.go`
* (this is to remove any need to reference the swagger packages, and said tests do not impact the code being used by thema)
* The contents of [this PR](https://github.com/deepmap/oapi-codegen/pull/717) in deepmap/oapi-codegen have been played onto this fork

A full diff of changes can be found at [diff.txt].

When updating this fork, please add whatever changes you make (if different from the main oapi-codegen branch) to the above list and update [diff.txt] accordingly.
This can be done with:
```shell
$ diff <path_to_deepmap>/oapi-codegen/pkg/codegen <path_to_grafana>/thema/internal/deepmap/oapi-codegen/pkg/codegen > <path_to_grafana>/thema/internal/deepmap/diff.txt
```
If you make changes to other packages, please also include them in the diff.
165 changes: 165 additions & 0 deletions internal/deepmap/diff.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
diff oapi-codegen/pkg/codegen/codegen_test.go thema/internal/deepmap/oapi-codegen/pkg/codegen/codegen_test.go
4d3
< "bytes"
7,8d5
< "io"
< "net/http"
11,13d7
< examplePetstoreClient "github.com/deepmap/oapi-codegen/examples/petstore-expanded"
< examplePetstore "github.com/deepmap/oapi-codegen/examples/petstore-expanded/echo/api"
< "github.com/deepmap/oapi-codegen/pkg/util"
15a10
> "github.com/grafana/thema/internal/deepmap/oapi-codegen/pkg/util"
31,131d25
< }
<
< func TestExamplePetStoreCodeGeneration(t *testing.T) {
<
< // Input vars for code generation:
< packageName := "api"
< opts := Configuration{
< PackageName: packageName,
< Generate: GenerateOptions{
< EchoServer: true,
< Client: true,
< Models: true,
< EmbeddedSpec: true,
< },
< }
<
< // Get a spec from the example PetStore definition:
< swagger, err := examplePetstore.GetSwagger()
< assert.NoError(t, err)
<
< // Run our code generation:
< code, err := Generate(swagger, opts)
< assert.NoError(t, err)
< assert.NotEmpty(t, code)
<
< // Check that we have valid (formattable) code:
< _, err = format.Source([]byte(code))
< assert.NoError(t, err)
<
< // Check that we have a package:
< assert.Contains(t, code, "package api")
<
< // Check that the client method signatures return response structs:
< assert.Contains(t, code, "func (c *Client) FindPetByID(ctx context.Context, id int64, reqEditors ...RequestEditorFn) (*http.Response, error) {")
<
< // Check that the property comments were generated
< assert.Contains(t, code, "// Id Unique id of the pet")
<
< // Check that the summary comment contains newlines
< assert.Contains(t, code, `// Deletes a pet by ID
< // (DELETE /pets/{id})
< `)
<
< // Make sure the generated code is valid:
< checkLint(t, "test.gen.go", []byte(code))
< }
<
< func TestExamplePetStoreCodeGenerationWithUserTemplates(t *testing.T) {
<
< userTemplates := map[string]string{"typedef.tmpl": "//blah"}
<
< // Input vars for code generation:
< packageName := "api"
< opts := Configuration{
< PackageName: packageName,
< Generate: GenerateOptions{
< Models: true,
< },
< OutputOptions: OutputOptions{
< UserTemplates: userTemplates,
< },
< }
<
< // Get a spec from the example PetStore definition:
< swagger, err := examplePetstore.GetSwagger()
< assert.NoError(t, err)
<
< // Run our code generation:
< code, err := Generate(swagger, opts)
< assert.NoError(t, err)
< assert.NotEmpty(t, code)
<
< // Check that we have valid (formattable) code:
< _, err = format.Source([]byte(code))
< assert.NoError(t, err)
<
< // Check that we have a package:
< assert.Contains(t, code, "package api")
<
< // Check that the built-in template has been overriden
< assert.Contains(t, code, "//blah")
< }
<
< func TestExamplePetStoreParseFunction(t *testing.T) {
<
< bodyBytes := []byte(`{"id": 5, "name": "testpet", "tag": "cat"}`)
<
< cannedResponse := &http.Response{
< StatusCode: 200,
< Body: io.NopCloser(bytes.NewReader(bodyBytes)),
< Header: http.Header{},
< }
< cannedResponse.Header.Add("Content-type", "application/json")
<
< findPetByIDResponse, err := examplePetstoreClient.ParseFindPetByIDResponse(cannedResponse)
< assert.NoError(t, err)
< assert.NotNil(t, findPetByIDResponse.JSON200)
< assert.Equal(t, int64(5), findPetByIDResponse.JSON200.Id)
< assert.Equal(t, "testpet", findPetByIDResponse.JSON200.Name)
< assert.NotNil(t, findPetByIDResponse.JSON200.Tag)
< assert.Equal(t, "cat", *findPetByIDResponse.JSON200.Tag)
diff oapi-codegen/pkg/codegen/merge_schemas.go thema/internal/deepmap/oapi-codegen/pkg/codegen/merge_schemas.go
13c13
< func MergeSchemas(allOf []*openapi3.SchemaRef, path []string) (Schema, error) {
---
> func MergeSchemas(schema *openapi3.Schema, path []string) (Schema, error) {
17c17
< return mergeSchemasV1(allOf, path)
---
> return mergeSchemasV1(schema.AllOf, path)
19c19
< return mergeSchemas(allOf, path)
---
> return mergeSchemas(schema, path)
22c22,23
< func mergeSchemas(allOf []*openapi3.SchemaRef, path []string) (Schema, error) {
---
> func mergeSchemas(baseSchema *openapi3.Schema, path []string) (Schema, error) {
> allOf := baseSchema.AllOf
25,27c26,27
< if n == 1 {
< return GenerateGoSchema(allOf[0], path)
< }
---
> schema := *baseSchema
> schema.AllOf = nil
29,34c29
< schema, err := valueWithPropagatedRef(allOf[0])
< if err != nil {
< return Schema{}, err
< }
<
< for i := 1; i < n; i++ {
---
> for i := 0; i < n; i++ {
diff oapi-codegen/pkg/codegen/operations.go thema/internal/deepmap/oapi-codegen/pkg/codegen/operations.go
26d25
< "github.com/deepmap/oapi-codegen/pkg/util"
27a27
> "github.com/grafana/thema/internal/deepmap/oapi-codegen/pkg/util"
diff oapi-codegen/pkg/codegen/schema.go thema/internal/deepmap/oapi-codegen/pkg/codegen/schema.go
257c257
< mergedSchema, err := MergeSchemas(schema.AllOf, path)
---
> mergedSchema, err := MergeSchemas(schema, path)
diff oapi-codegen/pkg/codegen/template_helpers.go thema/internal/deepmap/oapi-codegen/pkg/codegen/template_helpers.go
23c23
< "github.com/deepmap/oapi-codegen/pkg/util"
---
> "github.com/grafana/thema/internal/deepmap/oapi-codegen/pkg/util"
Common subdirectories: oapi-codegen/pkg/codegen/templates and thema/internal/deepmap/oapi-codegen/pkg/codegen/templates
Common subdirectories: oapi-codegen/pkg/codegen/test_specs and thema/internal/deepmap/oapi-codegen/pkg/codegen/test_specs
Loading

0 comments on commit 080555d

Please sign in to comment.