Skip to content

Commit 5b954c1

Browse files
authored
feat: change logic of fetching previous version's exports (Azure#17691)
1 parent adc4536 commit 5b954c1

File tree

7 files changed

+368
-410
lines changed

7 files changed

+368
-410
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
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 common
5+
6+
import (
7+
"encoding/json"
8+
"fmt"
9+
"io/ioutil"
10+
"log"
11+
"net/http"
12+
"path"
13+
"sort"
14+
"strings"
15+
16+
"github.com/Azure/azure-sdk-for-go/eng/tools/generator/repo"
17+
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/exports"
18+
"github.com/go-git/go-git/v5/plumbing"
19+
)
20+
21+
const (
22+
sdk_tag_fetch_url = "https://api.github.com/repos/Azure/azure-sdk-for-go/git/refs/tags"
23+
)
24+
25+
func GetAllVersionTags(rpName, namespaceName string) ([]string, error) {
26+
log.Printf("Fetching all release tags from GitHub for RP: '%s' Package: '%s' ...", rpName, namespaceName)
27+
client := http.Client{}
28+
res, err := client.Get(sdk_tag_fetch_url)
29+
if err != nil {
30+
return nil, err
31+
}
32+
body, err := ioutil.ReadAll(res.Body)
33+
if err != nil {
34+
return nil, err
35+
}
36+
result := []map[string]interface{}{}
37+
err = json.Unmarshal(body, &result)
38+
if err != nil {
39+
return nil, err
40+
}
41+
var tags []string
42+
for _, tag := range result {
43+
tagName := tag["ref"].(string)
44+
if strings.Contains(tagName, "sdk/resourcemanager/"+rpName+"/"+namespaceName) {
45+
tags = append(tags, tag["ref"].(string))
46+
}
47+
}
48+
sort.Sort(sort.Reverse(sort.StringSlice(tags)))
49+
50+
return tags, nil
51+
}
52+
53+
func GetCurrentAPIVersion(packagePath string) (string, error) {
54+
log.Printf("Get current release API version from '%s' ...", packagePath)
55+
56+
files, err := ioutil.ReadDir(packagePath)
57+
if err != nil {
58+
return "", err
59+
}
60+
61+
for _, file := range files {
62+
if strings.HasSuffix(file.Name(), ".go") {
63+
b, err := ioutil.ReadFile(path.Join(packagePath, file.Name()))
64+
if err != nil {
65+
return "", err
66+
}
67+
68+
lines := strings.Split(string(b), "\n")
69+
for _, line := range lines {
70+
if strings.Contains(line, "api-version") {
71+
return strings.Split(line, "\"")[3], nil
72+
}
73+
}
74+
}
75+
}
76+
77+
return "", fmt.Errorf("Cannot find API version for current release")
78+
}
79+
80+
func GetPreviousVersionTag(apiVersion string, allReleases []string) string {
81+
if strings.Contains(apiVersion, "preview") {
82+
// for preview api, always compare with latest release
83+
return allReleases[0]
84+
} else {
85+
// for stable api, always compare with previous stable, if no stable, then latest release
86+
for _, release := range allReleases {
87+
if !strings.Contains(release, "beta") {
88+
return release
89+
}
90+
}
91+
return allReleases[0]
92+
}
93+
}
94+
95+
func GetExportsFromTag(sdkRepo repo.SDKRepository, packagePath, tag string) (*exports.Content, error) {
96+
log.Printf("Get exports from specific tag '%s' ...", tag)
97+
98+
// get current head branch name
99+
currentRef, err := sdkRepo.Head()
100+
if err != nil {
101+
return nil, err
102+
}
103+
104+
// stash current change
105+
err = sdkRepo.Stash()
106+
if err != nil {
107+
return nil, err
108+
}
109+
110+
// checkout to the specific tag
111+
err = sdkRepo.CheckoutTag(strings.TrimPrefix(tag, "ref/tags/"))
112+
if err != nil {
113+
return nil, err
114+
}
115+
116+
// get exports
117+
result, err := exports.Get(packagePath)
118+
if err != nil {
119+
return nil, err
120+
}
121+
122+
// checkout back to head branch
123+
err = sdkRepo.Checkout(&repo.CheckoutOptions{
124+
Branch: plumbing.ReferenceName(currentRef.Name()),
125+
})
126+
if err != nil {
127+
return nil, err
128+
}
129+
130+
// restore current change
131+
err = sdkRepo.StashPop()
132+
if err != nil {
133+
return nil, err
134+
}
135+
136+
return &result, nil
137+
}

eng/tools/generator/cmd/v2/common/fileProcessor.go

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"path"
1212
"path/filepath"
1313
"regexp"
14+
"strconv"
1415
"strings"
1516
"time"
1617

@@ -239,8 +240,8 @@ func ReplaceVersion(packageRootPath string, newVersion string) error {
239240
}
240241

241242
// calculate new version by changelog using semver package
242-
func CalculateNewVersion(changelog *model.Changelog, packageRootPath string) (*semver.Version, error) {
243-
version, err := GetLatestVersion(packageRootPath)
243+
func CalculateNewVersion(changelog *model.Changelog, previousVersion string, isCurrentPreview bool) (*semver.Version, error) {
244+
version, err := semver.NewVersion(previousVersion)
244245
if err != nil {
245246
return nil, err
246247
}
@@ -255,13 +256,41 @@ func CalculateNewVersion(changelog *model.Changelog, packageRootPath string) (*s
255256
newVersion = version.IncPatch()
256257
}
257258
} else {
258-
// release version calculation
259-
if changelog.HasBreakingChanges() {
260-
newVersion = version.IncMajor()
261-
} else if changelog.Modified.HasAdditiveChanges() {
262-
newVersion = version.IncMinor()
259+
if isCurrentPreview {
260+
if strings.Contains(previousVersion, "beta") {
261+
betaNumber, err := strconv.Atoi(strings.Split(version.Prerelease(), "beta.")[1])
262+
if err != nil {
263+
return nil, err
264+
}
265+
newVersion, err = version.SetPrerelease("beta." + strconv.Itoa(betaNumber+1))
266+
if err != nil {
267+
return nil, err
268+
}
269+
} else {
270+
if changelog.HasBreakingChanges() {
271+
newVersion = version.IncMajor()
272+
} else if changelog.Modified.HasAdditiveChanges() {
273+
newVersion = version.IncMinor()
274+
} else {
275+
newVersion = version.IncPatch()
276+
}
277+
newVersion, err = newVersion.SetPrerelease("beta.1")
278+
if err != nil {
279+
return nil, err
280+
}
281+
}
263282
} else {
264-
newVersion = version.IncPatch()
283+
if strings.Contains(previousVersion, "beta") {
284+
return nil, fmt.Errorf("must have stable previous version")
285+
}
286+
// release version calculation
287+
if changelog.HasBreakingChanges() {
288+
newVersion = version.IncMajor()
289+
} else if changelog.Modified.HasAdditiveChanges() {
290+
newVersion = version.IncMinor()
291+
} else {
292+
newVersion = version.IncPatch()
293+
}
265294
}
266295
}
267296

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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 common
5+
6+
import (
7+
"testing"
8+
9+
"github.com/Azure/azure-sdk-for-go/eng/tools/generator/autorest/model"
10+
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/delta"
11+
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/exports"
12+
"github.com/Azure/azure-sdk-for-go/eng/tools/internal/report"
13+
"github.com/stretchr/testify/assert"
14+
)
15+
16+
func TestCalculateNewVersion(t *testing.T) {
17+
fixChange := &model.Changelog{Modified: &report.Package{}}
18+
breakingChange := &model.Changelog{RemovedPackage: true, Modified: &report.Package{}}
19+
additiveChange := &model.Changelog{Modified: &report.Package{AdditiveChanges: &delta.Content{Content: exports.Content{Consts: map[string]exports.Const{"test": {}}}}}}
20+
21+
// previous 0.x.x
22+
// fix with stable
23+
newVersion, err := CalculateNewVersion(fixChange, "0.5.0", false)
24+
assert.NoError(t, err)
25+
assert.Equal(t, newVersion.String(), "0.5.1")
26+
27+
// fix with beat
28+
newVersion, err = CalculateNewVersion(fixChange, "0.5.0", true)
29+
assert.NoError(t, err)
30+
assert.Equal(t, newVersion.String(), "0.5.1")
31+
32+
// breaking with stable
33+
newVersion, err = CalculateNewVersion(breakingChange, "0.5.0", false)
34+
assert.NoError(t, err)
35+
assert.Equal(t, newVersion.String(), "0.6.0")
36+
37+
// breaking with beta
38+
newVersion, err = CalculateNewVersion(breakingChange, "0.5.0", true)
39+
assert.NoError(t, err)
40+
assert.Equal(t, newVersion.String(), "0.6.0")
41+
42+
// additive with stable
43+
newVersion, err = CalculateNewVersion(additiveChange, "0.5.0", false)
44+
assert.NoError(t, err)
45+
assert.Equal(t, newVersion.String(), "0.6.0")
46+
47+
// additive with beta
48+
newVersion, err = CalculateNewVersion(additiveChange, "0.5.0", true)
49+
assert.NoError(t, err)
50+
assert.Equal(t, newVersion.String(), "0.6.0")
51+
52+
// previous 1.2.0
53+
// fix with stable
54+
newVersion, err = CalculateNewVersion(fixChange, "1.2.0", false)
55+
assert.NoError(t, err)
56+
assert.Equal(t, newVersion.String(), "1.2.1")
57+
58+
// fix with beat
59+
newVersion, err = CalculateNewVersion(fixChange, "1.2.0", true)
60+
assert.NoError(t, err)
61+
assert.Equal(t, newVersion.String(), "1.2.1-beta.1")
62+
63+
// breaking with stable
64+
newVersion, err = CalculateNewVersion(breakingChange, "1.2.0", false)
65+
assert.NoError(t, err)
66+
assert.Equal(t, newVersion.String(), "2.0.0")
67+
68+
// breaking with beta
69+
newVersion, err = CalculateNewVersion(breakingChange, "1.2.0", true)
70+
assert.NoError(t, err)
71+
assert.Equal(t, newVersion.String(), "2.0.0-beta.1")
72+
73+
// additive with stable
74+
newVersion, err = CalculateNewVersion(additiveChange, "1.2.0", false)
75+
assert.NoError(t, err)
76+
assert.Equal(t, newVersion.String(), "1.3.0")
77+
78+
// additive with beta
79+
newVersion, err = CalculateNewVersion(additiveChange, "1.2.0", true)
80+
assert.NoError(t, err)
81+
assert.Equal(t, newVersion.String(), "1.3.0-beta.1")
82+
83+
// previous 1.2.0-beta.1
84+
// fix with stable
85+
newVersion, err = CalculateNewVersion(fixChange, "1.2.0-beta.1", false)
86+
assert.NotEmpty(t, err)
87+
88+
// fix with beat
89+
newVersion, err = CalculateNewVersion(fixChange, "1.2.0-beta.1", true)
90+
assert.NoError(t, err)
91+
assert.Equal(t, newVersion.String(), "1.2.0-beta.2")
92+
93+
// breaking with stable
94+
newVersion, err = CalculateNewVersion(breakingChange, "1.2.0-beta.1", false)
95+
assert.NotEmpty(t, err)
96+
97+
// breaking with beta
98+
newVersion, err = CalculateNewVersion(breakingChange, "1.2.0-beta.1", true)
99+
assert.NoError(t, err)
100+
assert.Equal(t, newVersion.String(), "1.2.0-beta.2")
101+
102+
// additive with stable
103+
newVersion, err = CalculateNewVersion(additiveChange, "1.2.0-beta.1", false)
104+
assert.NotEmpty(t, err)
105+
106+
// additive with beta
107+
newVersion, err = CalculateNewVersion(additiveChange, "1.2.0-beta.1", true)
108+
assert.NoError(t, err)
109+
assert.Equal(t, newVersion.String(), "1.2.0-beta.2")
110+
}

0 commit comments

Comments
 (0)