Skip to content

Commit cd2f137

Browse files
committedOct 24, 2021
update everything
1 parent 5bdc9bc commit cd2f137

File tree

5 files changed

+71
-43
lines changed

5 files changed

+71
-43
lines changed
 

‎auth.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (m *DefaultUser) GetField() interface{} {
7070
}
7171

7272
func (*DefaultUser) GetSelectQuery(cq *CtxQuery) *bun.SelectQuery {
73-
return cq.Q.Column("id", "username")
73+
return cq.Column("id", "username")
7474
}
7575

7676
func (b *DefaultUser) Insert(rc *ReqCtx) (m BaseFieldModel, err error) {

‎go.mod

+23-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
11
module github.com/yeemboi/bucko
22

3-
go 1.16
3+
go 1.17
44

55
require (
66
github.com/gobuffalo/nulls v0.4.0
7-
github.com/golang-jwt/jwt/v4 v4.0.0
8-
github.com/labstack/echo/v4 v4.5.0
9-
github.com/uptrace/bun v1.0.5
7+
github.com/golang-jwt/jwt/v4 v4.1.0
8+
github.com/labstack/echo/v4 v4.6.1
9+
github.com/uptrace/bun v1.0.13
10+
)
11+
12+
require (
13+
github.com/gofrs/uuid v3.2.0+incompatible // indirect
14+
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
15+
github.com/jinzhu/inflection v1.0.0 // indirect
16+
github.com/labstack/gommon v0.3.0 // indirect
17+
github.com/mattn/go-colorable v0.1.8 // indirect
18+
github.com/mattn/go-isatty v0.0.14 // indirect
19+
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
20+
github.com/valyala/bytebufferpool v1.0.0 // indirect
21+
github.com/valyala/fasttemplate v1.2.1 // indirect
22+
github.com/vmihailenco/msgpack/v5 v5.3.4 // indirect
23+
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
24+
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
25+
golang.org/x/net v0.0.0-20210913180222-943fd674d43e // indirect
26+
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac // indirect
27+
golang.org/x/text v0.3.7 // indirect
28+
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect
1029
)

‎go.sum

+20-16
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4
88
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
99
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
1010
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
11-
github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=
12-
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
11+
github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0=
12+
github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
1313
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
1414
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
1515
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
1616
github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
1717
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
18-
github.com/labstack/echo/v4 v4.5.0 h1:JXk6H5PAw9I3GwizqUHhYyS4f45iyGebR/c1xNCeOCY=
19-
github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y=
18+
github.com/labstack/echo/v4 v4.6.1 h1:OMVsrnNFzYlGSdaiYGHbgWQnr+JM7NG+B9suCPie14M=
19+
github.com/labstack/echo/v4 v4.6.1/go.mod h1:RnjgMWNDB9g/HucVWhQYNQP9PvbYf6adqftqryo7s9k=
2020
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
2121
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
2222
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -25,8 +25,9 @@ github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ
2525
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
2626
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
2727
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
28-
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
2928
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
29+
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
30+
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
3031
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
3132
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
3233
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@@ -40,8 +41,8 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
4041
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
4142
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo=
4243
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs=
43-
github.com/uptrace/bun v1.0.5 h1:bNhNhWt6XNwSWMEQUvYK7iJ3qHrMfeoKY3/w2jkqcBs=
44-
github.com/uptrace/bun v1.0.5/go.mod h1:aL6D9vPw8DXaTQTwGrEPtUderBYXx7ShUmPfnxnqscw=
44+
github.com/uptrace/bun v1.0.13 h1:yf980SQ9BdM3R4NKxO00sOJEJKDcVFKBD4msltFJ824=
45+
github.com/uptrace/bun v1.0.13/go.mod h1:rs7qARtH6aqLtcfmloWM6qn90iyY53N2ScLQssIrevw=
4546
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
4647
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
4748
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
@@ -52,28 +53,31 @@ github.com/vmihailenco/msgpack/v5 v5.3.4/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q
5253
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
5354
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
5455
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
55-
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
56-
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
56+
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
57+
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
5758
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
5859
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
59-
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
60-
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
60+
golang.org/x/net v0.0.0-20210913180222-943fd674d43e h1:+b/22bPvDYt4NPDcy4xAGCmON713ONAWFeY3Z7I3tR8=
61+
golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
6162
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6263
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6364
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6465
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6566
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6667
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
67-
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
68-
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
69-
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
70-
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
68+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
69+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
70+
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
71+
golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
72+
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw=
73+
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
7174
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
7275
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
7376
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
7477
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
75-
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
7678
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
79+
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
80+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
7781
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE=
7882
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
7983
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

‎query.go

+20-15
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@ import (
1111
)
1212

1313
type CtxQuery struct {
14+
*bun.SelectQuery
1415
R *ReqCtx
15-
Q *bun.SelectQuery
1616
M BaseFieldModel
1717
JoinPrefix string
1818
TableAlias bun.Safe
1919
}
2020

21+
// Q updates the query.
22+
func (cq *CtxQuery) Q(q *bun.SelectQuery) {
23+
cq.SelectQuery = q
24+
}
25+
2126
// SafeCol returns a query's column, safe to use in joins.
2227
func (cq *CtxQuery) SafeCol(column bun.Ident) bun.Safe {
2328
return bun.Safe(fmt.Sprintf("%s.`%s`", cq.TableAlias, column))
@@ -53,35 +58,35 @@ func (cq *CtxQuery) SetLimitOffset() {
5358
var limit, offset uint64
5459
limit, err := strconv.ParseUint(cq.R.Context.QueryParam("limit"), 10, 8)
5560
if err != nil {
56-
cq.Q = cq.Q.Limit(25)
61+
cq.Q(cq.Limit(25))
5762
} else {
5863
if limit > 100 {
59-
cq.Q = cq.Q.Limit(100)
64+
cq.Q(cq.Limit(100))
6065
} else {
61-
cq.Q = cq.Q.Limit(int(limit))
66+
cq.Q(cq.Limit(int(limit)))
6267
}
6368
}
6469
if offset, err = strconv.ParseUint(cq.R.Context.QueryParam("offset"), 10, 64); err == nil {
65-
cq.Q = cq.Q.Offset(int(offset))
70+
cq.Q(cq.Offset(int(offset)))
6671
}
6772
}
6873

6974
func (cq *CtxQuery) ApplySearch(searchCols bun.Safe) {
70-
cq.Q = cq.R.Search(cq.Q, searchCols)
75+
cq.Q(cq.R.Search(cq.SelectQuery, searchCols))
7176
}
7277

7378
func (cq *CtxQuery) WhereParamToCol() {
74-
cq.Q = cq.Q.Where("? = ?", cq.M.GetColumn(), cq.R.Context.Param(cq.M.GetParam())).Limit(1)
79+
cq.Q(cq.Where("? = ?", cq.M.GetColumn(), cq.R.Context.Param(cq.M.GetParam())).Limit(1))
7580
}
7681

7782
func (cq *CtxQuery) FromParam() (err error) {
7883
cq.Select()
79-
return cq.Q.Where("? = ?", cq.M.GetColumn(), cq.R.Context.Param(cq.M.GetParam())).Limit(1).Scan(cq.R.Ctx)
84+
return cq.Where("? = ?", cq.M.GetColumn(), cq.R.Context.Param(cq.M.GetParam())).Limit(1).Scan(cq.R.Ctx)
8085
}
8186

8287
func (cq *CtxQuery) FromField() (err error) {
8388
cq.Select()
84-
return cq.Q.Where("? = ?", cq.M.GetColumn(), cq.M.GetField()).Limit(1).Scan(cq.R.Ctx)
89+
return cq.Where("? = ?", cq.M.GetColumn(), cq.M.GetField()).Limit(1).Scan(cq.R.Ctx)
8590
}
8691

8792
func (cq *CtxQuery) FromPK() (err error) {
@@ -109,7 +114,7 @@ func (cq *CtxQuery) SetPK() (err error) {
109114

110115
// Select applies its model's GetSelectQuery and relations to itself.
111116
func (cq *CtxQuery) Select() {
112-
cq.Q = cq.M.GetSelectQuery(cq)
117+
cq.Q(cq.M.GetSelectQuery(cq))
113118
customs, _ := cq.M.(CustomRelI)
114119
for _, rel := range DB.Table(reflect.TypeOf(cq.M)).Relations {
115120
cq.selectRel(rel, customs, make([]string, 0), make([]string, 0))
@@ -153,18 +158,18 @@ func (cq *CtxQuery) selectRel(rel *schema.Relation, customs CustomRelI, oldNames
153158
if m != nil && applyFunc == nil {
154159
applyFunc = func(q *bun.SelectQuery) *bun.SelectQuery {
155160
return m.GetSelectQuery(&CtxQuery{
156-
R: cq.R,
157-
Q: q,
158-
JoinPrefix: fmt.Sprintf("%s__", strings.Join(newPrefixes, "__")),
159-
TableAlias: bun.Safe(fmt.Sprintf("`%s`", strings.Join(newPrefixes, "__"))),
161+
R: cq.R,
162+
SelectQuery: q,
163+
JoinPrefix: fmt.Sprintf("%s__", strings.Join(newPrefixes, "__")),
164+
TableAlias: bun.Safe(fmt.Sprintf("`%s`", strings.Join(newPrefixes, "__"))),
160165
})
161166
}
162167
} else if applyFunc == nil {
163168
return
164169
}
165170

166171
newCustoms, _ := rel.JoinTable.ZeroIface.(CustomRelI)
167-
cq.Q = cq.Q.Relation(strings.Join(newNames, "."), applyFunc)
172+
cq.Q(cq.Relation(strings.Join(newNames, "."), applyFunc))
168173
for _, rel := range rel.JoinTable.Relations {
169174
cq.selectRel(rel, newCustoms, newNames, newPrefixes)
170175
}

‎request.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ func NewCtx(c echo.Context, ctx context.Context) *ReqCtx {
2929
rc.Ctx = context.Background()
3030
}
3131

32-
if err := rc.SetUser(); err != nil {
32+
if err := rc.setUser(); err != nil {
3333
rc.UserId.Valid = false
3434
fmt.Println(err)
3535
}
3636

3737
return &rc
3838
}
3939

40-
func (rc *ReqCtx) SetUser() (err error) {
40+
func (rc *ReqCtx) setUser() (err error) {
4141
token, ok := rc.Get(jwtConfig.ContextKey).(*jwt.Token)
4242
if !ok {
4343
return errors.New("could not get token")
@@ -59,11 +59,11 @@ func (rc *ReqCtx) SetUser() (err error) {
5959
func (rc *ReqCtx) Query(m BaseFieldModel) *CtxQuery {
6060
fmt.Println(m)
6161
cq := CtxQuery{
62-
R: rc,
63-
M: m,
64-
JoinPrefix: "",
65-
TableAlias: DB.Table(reflect.TypeOf(m)).SQLAlias,
66-
Q: DB.NewSelect().Model(m),
62+
R: rc,
63+
M: m,
64+
JoinPrefix: "",
65+
TableAlias: DB.Table(reflect.TypeOf(m)).SQLAlias,
66+
SelectQuery: DB.NewSelect().Model(m),
6767
}
6868
return &cq
6969
}

0 commit comments

Comments
 (0)
Please sign in to comment.