Skip to content

Commit b97668c

Browse files
authored
changelog sort (Azure#19578)
* changelog sort * add changelog sort test * gofmt * Licensed * add sortFuncItem func
1 parent 11713e1 commit b97668c

File tree

2 files changed

+133
-17
lines changed

2 files changed

+133
-17
lines changed

eng/tools/generator/autorest/model/changelog.go

Lines changed: 86 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ package model
55

66
import (
77
"fmt"
8+
"sort"
89
"strings"
910

1011
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/delta"
12+
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/exports"
1113
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/markdown"
1214
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/report"
1315
)
@@ -124,19 +126,20 @@ func getNewContents(c *delta.Content) []string {
124126
var items []string
125127

126128
if len(c.Consts) > 0 {
127-
for k := range c.Consts {
129+
for _, k := range sortChangeItem(c.Consts) {
128130
line := fmt.Sprintf("New const `%s`", k)
129131
items = append(items, line)
130132
}
131133
}
132134
if len(c.TypeAliases) > 0 {
133-
for k := range c.TypeAliases {
135+
for _, k := range sortChangeItem(c.TypeAliases) {
134136
line := fmt.Sprintf("New type alias `%s`", k)
135137
items = append(items, line)
136138
}
137139
}
138140
if len(c.Funcs) > 0 {
139-
for k, v := range c.Funcs {
141+
for _, k := range sortFuncItem(c.Funcs) {
142+
v := c.Funcs[k]
140143
params := ""
141144
if v.Params != nil {
142145
params = *v.Params
@@ -160,13 +163,14 @@ func getNewContents(c *delta.Content) []string {
160163
}
161164
if len(c.Structs) > 0 {
162165
modified := c.GetModifiedStructs()
163-
for s, f := range modified {
166+
for _, s := range sortChangeItem(modified) {
167+
f := modified[s]
164168
for _, af := range f.AnonymousFields {
165169
line := fmt.Sprintf("New anonymous field `%s` in struct `%s`", af, s)
166170
items = append(items, line)
167171
}
168-
for f := range f.Fields {
169-
line := fmt.Sprintf("New field `%s` in struct `%s`", f, s)
172+
for _, field := range sortChangeItem(f.Fields) {
173+
line := fmt.Sprintf("New field `%s` in struct `%s`", field, s)
170174
items = append(items, line)
171175
}
172176
}
@@ -199,22 +203,24 @@ func getSignatureChangeItems(b *report.BreakingChanges) []string {
199203

200204
// write const changes
201205
if len(b.Consts) > 0 {
202-
for k, v := range b.Consts {
206+
for _, k := range sortChangeItem(b.Consts) {
207+
v := b.Consts[k]
203208
line := fmt.Sprintf("Const `%s` type has been changed from `%s` to `%s`", k, v.From, v.To)
204209
items = append(items, line)
205210
}
206-
// TODO -- sort?
207211
}
208212
// write type alias changes
209213
if len(b.TypeAliases) > 0 {
210-
for k, v := range b.TypeAliases {
214+
for _, k := range sortChangeItem(b.TypeAliases) {
215+
v := b.TypeAliases[k]
211216
line := fmt.Sprintf("Type alias `%s` type has been changed from `%s` to `%s`", k, v.From, v.To)
212217
items = append(items, line)
213218
}
214219
}
215220
// write function changes
216221
if len(b.Funcs) > 0 {
217-
for k, v := range b.Funcs {
222+
for _, k := range sortFuncItem(b.Funcs) {
223+
v := b.Funcs[k]
218224
if v.Params != nil {
219225
line := fmt.Sprintf("Function `%s` parameter(s) have been changed from `(%s)` to `(%s)`", k, v.Params.From, v.Params.To)
220226
items = append(items, line)
@@ -227,7 +233,8 @@ func getSignatureChangeItems(b *report.BreakingChanges) []string {
227233
}
228234
// write struct changes
229235
if len(b.Structs) > 0 {
230-
for k, v := range b.Structs {
236+
for _, k := range sortChangeItem(b.Structs) {
237+
v := b.Structs[k]
231238
for f, d := range v.Fields {
232239
line := fmt.Sprintf("Type of `%s.%s` has been changed from `%s` to `%s`", k, f, d.From, d.To)
233240
items = append(items, line)
@@ -247,21 +254,21 @@ func getRemovedContent(removed *delta.Content) []string {
247254
var items []string
248255
// write constants
249256
if len(removed.Consts) > 0 {
250-
for k := range removed.Consts {
257+
for _, k := range sortChangeItem(removed.Consts) {
251258
line := fmt.Sprintf("Const `%s` has been removed", k)
252259
items = append(items, line)
253260
}
254261
}
255262
// write type alias
256263
if len(removed.TypeAliases) > 0 {
257-
for k := range removed.TypeAliases {
264+
for _, k := range sortChangeItem(removed.TypeAliases) {
258265
line := fmt.Sprintf("Type alias `%s` has been removed", k)
259266
items = append(items, line)
260267
}
261268
}
262269
// write functions
263270
if len(removed.Funcs) > 0 {
264-
for k := range removed.Funcs {
271+
for _, k := range sortFuncItem(removed.Funcs) {
265272
line := fmt.Sprintf("Function `%s` has been removed", k)
266273
items = append(items, line)
267274
}
@@ -276,17 +283,79 @@ func getRemovedContent(removed *delta.Content) []string {
276283
// write struct modification (some fields are removed)
277284
modified := removed.GetModifiedStructs()
278285
if len(modified) > 0 {
279-
for s, f := range modified {
286+
for _, s := range sortChangeItem(modified) {
287+
f := modified[s]
280288
for _, af := range f.AnonymousFields {
281289
line := fmt.Sprintf("Field `%s` of struct `%s` has been removed", af, s)
282290
items = append(items, line)
283291
}
284-
for f := range f.Fields {
285-
line := fmt.Sprintf("Field `%s` of struct `%s` has been removed", f, s)
292+
for _, field := range sortChangeItem(f.Fields) {
293+
line := fmt.Sprintf("Field `%s` of struct `%s` has been removed", field, s)
286294
items = append(items, line)
287295
}
288296
}
289297
}
290298

291299
return items
292300
}
301+
302+
type sortItem interface {
303+
delta.Signature | delta.StructDef | exports.Const | exports.TypeAlias | exports.Struct | string
304+
}
305+
306+
func sortChangeItem[T sortItem](change map[string]T) []string {
307+
s := make([]string, 0, len(change))
308+
for k := range change {
309+
s = append(s, k)
310+
}
311+
312+
sort.Strings(s)
313+
return s
314+
}
315+
316+
func sortFuncItem[T delta.FuncSig | exports.Func](change map[string]T) []string {
317+
s := make([]string, 0, len(change))
318+
for k := range change {
319+
s = append(s, k)
320+
}
321+
322+
sort.Slice(s, func(i, j int) bool {
323+
si := removePattern(s[i], getReturnValue(change[s[i]]))
324+
sj := removePattern(s[j], getReturnValue(change[s[j]]))
325+
return si < sj
326+
})
327+
328+
return s
329+
}
330+
331+
func getReturnValue(t interface{}) string {
332+
switch value := t.(type) {
333+
case delta.FuncSig:
334+
if value.Returns == nil {
335+
return ""
336+
}
337+
return value.Returns.To
338+
case exports.Func:
339+
if value.Returns == nil {
340+
return ""
341+
}
342+
return *value.Returns
343+
}
344+
return ""
345+
}
346+
347+
func removePattern(funcName string, returnValue string) string {
348+
funcName = strings.TrimLeft(strings.TrimLeft(funcName, "*"), "New")
349+
before, after, b := strings.Cut(funcName, ".")
350+
if !b {
351+
return funcName
352+
}
353+
354+
if strings.Contains(returnValue, "runtime.Poller") {
355+
after = strings.TrimLeft(after, "Begin")
356+
} else if strings.Contains(returnValue, "runtime.Pager") {
357+
after = strings.TrimLeft(after, "New")
358+
}
359+
360+
return fmt.Sprintf("%s.%s", before, after)
361+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
package model
5+
6+
import (
7+
"testing"
8+
9+
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/exports"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestSortFuncItem(t *testing.T) {
14+
get := "PrivateEndpointConnectionsClientGetResponse, error"
15+
beginDelete := "*runtime.Poller[PrivateEndpointConnectionsClientDeleteResponse], error"
16+
beginCreate := "*runtime.Poller[PrivateEndpointConnectionsClientCreateResponse], error"
17+
newListPager := "*runtime.Pager[PrivateEndpointConnectionsClientListResponse]"
18+
newClient := "*PrivateEndpointConnectionsClient, error"
19+
20+
s := map[string]exports.Func{
21+
"*PrivateEndpointConnectionsClient.Get": {
22+
Returns: &get,
23+
},
24+
"*PrivateEndpointConnectionsClient.BeginDelete": {
25+
Returns: &beginDelete,
26+
},
27+
"*PrivateEndpointConnectionsClient.BeginCreate": {
28+
Returns: &beginCreate,
29+
},
30+
"*PrivateEndpointConnectionsClient.NewListPager": {
31+
Returns: &newListPager,
32+
},
33+
"NewPrivateEndpointConnectionsClient": {
34+
Returns: &newClient,
35+
},
36+
}
37+
38+
sortResult := sortFuncItem(s)
39+
expcted := []string{
40+
"NewPrivateEndpointConnectionsClient",
41+
"*PrivateEndpointConnectionsClient.BeginCreate",
42+
"*PrivateEndpointConnectionsClient.BeginDelete",
43+
"*PrivateEndpointConnectionsClient.Get",
44+
"*PrivateEndpointConnectionsClient.NewListPager",
45+
}
46+
assert.Equal(t, expcted, sortResult)
47+
}

0 commit comments

Comments
 (0)