From 2a475a03fbbaf89acfb015d4b3bf8a7f9081ec3c Mon Sep 17 00:00:00 2001 From: Alancere <804873052@qq.com> Date: Thu, 4 Jan 2024 15:36:28 +0800 Subject: [PATCH 1/4] fix generator tool --- .../generator/cmd/v2/common/fileProcessor.go | 68 +++++++++++++------ .../generator/cmd/v2/common/generation.go | 15 ++-- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/eng/tools/generator/cmd/v2/common/fileProcessor.go b/eng/tools/generator/cmd/v2/common/fileProcessor.go index 36b11832125a..584d9de677b4 100644 --- a/eng/tools/generator/cmd/v2/common/fileProcessor.go +++ b/eng/tools/generator/cmd/v2/common/fileProcessor.go @@ -5,7 +5,10 @@ package common import ( "bytes" + "errors" "fmt" + "go/parser" + "go/token" "io/fs" "io/ioutil" "log" @@ -510,35 +513,18 @@ func GetTag(path string) (string, error) { return "", nil } -func replaceModuleImport(path, rpName, namespaceName, previousVersion, currentVersion, subPath string, suffixes ...string) error { - previous, err := semver.NewVersion(previousVersion) - if err != nil { - return err - } - +func replaceModuleImport(path, rpName, namespaceName, currentVersion, subPath string, suffixes ...string) error { current, err := semver.NewVersion(currentVersion) if err != nil { return err } - if previous.Major() == current.Major() { - return nil - } - - oldModule := fmt.Sprintf("github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/%s/%s", rpName, namespaceName) - if previous.Major() > 1 { - oldModule = fmt.Sprintf("%s/v%d", oldModule, previous.Major()) - } - - newModule := fmt.Sprintf("github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/%s/%s", rpName, namespaceName) + module := fmt.Sprintf("github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/%s/%s", rpName, namespaceName) + newModule := module if current.Major() > 1 { newModule = fmt.Sprintf("%s/v%d", newModule, current.Major()) } - if oldModule == newModule { - return nil - } - return filepath.Walk(filepath.Join(path, subPath), func(path string, info fs.FileInfo, err error) error { if err != nil { return err @@ -554,12 +540,21 @@ func replaceModuleImport(path, rpName, namespaceName, previousVersion, currentVe } if suffix { + oldModule, err := getImportModule(path, module) + if err != nil { + return err + } + + if oldModule == "" || oldModule == fmt.Sprintf("\"%s\"", newModule) { + return nil + } + b, err := os.ReadFile(path) if err != nil { return err } - newFile := strings.ReplaceAll(string(b), fmt.Sprintf("\"%s\"", oldModule), fmt.Sprintf("\"%s\"", newModule)) + newFile := strings.ReplaceAll(string(b), oldModule, fmt.Sprintf("\"%s\"", newModule)) if newFile != string(b) { if err = os.WriteFile(path, []byte(newFile), 0666); err != nil { return err @@ -571,6 +566,37 @@ func replaceModuleImport(path, rpName, namespaceName, previousVersion, currentVe }) } +func getImportModule(filePath, modulePrefix string) (string, error) { + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, filePath, nil, parser.ImportsOnly) + if err != nil { + return "", err + } + + for _, i := range f.Imports { + if strings.Contains(i.Path.Value, modulePrefix) { + return i.Path.Value, nil + } + } + + return "", nil +} + +func getModuleVersion(autorestPath string) (*semver.Version, error) { + data, err := os.ReadFile(autorestPath) + if err != nil { + return nil, err + } + + for _, line := range strings.Split(string(data), "\n") { + if strings.HasPrefix(line, autorest_md_module_version_prefix) { + return semver.NewVersion(strings.TrimSpace(line[len(autorest_md_module_version_prefix):])) + } + } + + return nil, errors.New("module-version does not exist in autorest.md") +} + func existSuffixFile(path, suffix string) bool { existed := false diff --git a/eng/tools/generator/cmd/v2/common/generation.go b/eng/tools/generator/cmd/v2/common/generation.go index fed4c0eeb4ff..396f59fb0cf1 100644 --- a/eng/tools/generator/cmd/v2/common/generation.go +++ b/eng/tools/generator/cmd/v2/common/generation.go @@ -306,23 +306,28 @@ func (ctx *GenerateContext) GenerateForSingleRPNamespace(generateParam *Generate return nil, err } + oldModuleVersion, err := getModuleVersion(filepath.Join(packagePath, "autorest.md")) + if err != nil { + return nil, err + } + log.Printf("Replace version in autorest.md and constants...") if err = ReplaceVersion(packagePath, version.String()); err != nil { return nil, err } - - if _, err := os.Stat(filepath.Join(packagePath, "fake")); !os.IsNotExist(err) && changelog.HasBreakingChanges() { + + if _, err := os.Stat(filepath.Join(packagePath, "fake")); !os.IsNotExist(err) && oldModuleVersion.Major() != version.Major() { log.Printf("Replace fake module v2+...") - if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, previousVersion, version.String(), + if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, version.String(), "fake", ".go"); err != nil { return nil, err } } // When sdk has major version bump, the live test needs to update the module referenced in the code. - if changelog.HasBreakingChanges() && existSuffixFile(packagePath, "_live_test.go") { + if oldModuleVersion.Major() != version.Major() && existSuffixFile(packagePath, "_live_test.go") { log.Printf("Replace live test module v2+...") - if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, previousVersion, version.String(), + if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, version.String(), "", "_live_test.go"); err != nil { return nil, err } From ba98334925000112d9a3471727bf0aef8278bfc1 Mon Sep 17 00:00:00 2001 From: Alancere <804873052@qq.com> Date: Thu, 4 Jan 2024 15:45:39 +0800 Subject: [PATCH 2/4] gofmt --- eng/tools/generator/cmd/v2/common/generation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/tools/generator/cmd/v2/common/generation.go b/eng/tools/generator/cmd/v2/common/generation.go index 396f59fb0cf1..c71a60e9ea32 100644 --- a/eng/tools/generator/cmd/v2/common/generation.go +++ b/eng/tools/generator/cmd/v2/common/generation.go @@ -315,7 +315,7 @@ func (ctx *GenerateContext) GenerateForSingleRPNamespace(generateParam *Generate if err = ReplaceVersion(packagePath, version.String()); err != nil { return nil, err } - + if _, err := os.Stat(filepath.Join(packagePath, "fake")); !os.IsNotExist(err) && oldModuleVersion.Major() != version.Major() { log.Printf("Replace fake module v2+...") if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, version.String(), From 4726cf73289934339b55d96a136101da8b70ab9e Mon Sep 17 00:00:00 2001 From: Alancere <804873052@qq.com> Date: Thu, 4 Jan 2024 16:29:14 +0800 Subject: [PATCH 3/4] fix --- .../generator/cmd/v2/common/fileProcessor.go | 53 ++++++++----------- .../generator/cmd/v2/common/generation.go | 4 +- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/eng/tools/generator/cmd/v2/common/fileProcessor.go b/eng/tools/generator/cmd/v2/common/fileProcessor.go index 584d9de677b4..b0c96cb75ac0 100644 --- a/eng/tools/generator/cmd/v2/common/fileProcessor.go +++ b/eng/tools/generator/cmd/v2/common/fileProcessor.go @@ -513,75 +513,64 @@ func GetTag(path string) (string, error) { return "", nil } -func replaceModuleImport(path, rpName, namespaceName, currentVersion, subPath string, suffixes ...string) error { +func replaceModuleImport(path, rpName, namespaceName, previousVersion, currentVersion, subPath string, suffixes ...string) error { + previous, err := semver.NewVersion(previousVersion) + if err != nil { + return err + } + current, err := semver.NewVersion(currentVersion) if err != nil { return err } - module := fmt.Sprintf("github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/%s/%s", rpName, namespaceName) - newModule := module + if previous.Major() == current.Major() { + return nil + } + + oldModule := fmt.Sprintf("github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/%s/%s", rpName, namespaceName) + if previous.Major() > 1 { + oldModule = fmt.Sprintf("%s/v%d", oldModule, previous.Major()) + } + + newModule := fmt.Sprintf("github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/%s/%s", rpName, namespaceName) if current.Major() > 1 { newModule = fmt.Sprintf("%s/v%d", newModule, current.Major()) } + if oldModule == newModule { + return nil + } + return filepath.Walk(filepath.Join(path, subPath), func(path string, info fs.FileInfo, err error) error { if err != nil { return err } - if info.IsDir() { return nil } - suffix := false for i := 0; i < len(suffixes) && !suffix; i++ { suffix = strings.HasSuffix(info.Name(), suffixes[i]) } if suffix { - oldModule, err := getImportModule(path, module) - if err != nil { - return err - } - - if oldModule == "" || oldModule == fmt.Sprintf("\"%s\"", newModule) { - return nil - } - b, err := os.ReadFile(path) if err != nil { return err } - newFile := strings.ReplaceAll(string(b), oldModule, fmt.Sprintf("\"%s\"", newModule)) + newFile := strings.ReplaceAll(string(b), fmt.Sprintf("\"%s\"", oldModule), fmt.Sprintf("\"%s\"", newModule)) if newFile != string(b) { if err = os.WriteFile(path, []byte(newFile), 0666); err != nil { return err } } } - return nil }) } -func getImportModule(filePath, modulePrefix string) (string, error) { - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, filePath, nil, parser.ImportsOnly) - if err != nil { - return "", err - } - - for _, i := range f.Imports { - if strings.Contains(i.Path.Value, modulePrefix) { - return i.Path.Value, nil - } - } - - return "", nil -} - func getModuleVersion(autorestPath string) (*semver.Version, error) { data, err := os.ReadFile(autorestPath) if err != nil { diff --git a/eng/tools/generator/cmd/v2/common/generation.go b/eng/tools/generator/cmd/v2/common/generation.go index c71a60e9ea32..ac4ecee01d0f 100644 --- a/eng/tools/generator/cmd/v2/common/generation.go +++ b/eng/tools/generator/cmd/v2/common/generation.go @@ -318,7 +318,7 @@ func (ctx *GenerateContext) GenerateForSingleRPNamespace(generateParam *Generate if _, err := os.Stat(filepath.Join(packagePath, "fake")); !os.IsNotExist(err) && oldModuleVersion.Major() != version.Major() { log.Printf("Replace fake module v2+...") - if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, version.String(), + if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, oldModuleVersion.String(), version.String(), "fake", ".go"); err != nil { return nil, err } @@ -327,7 +327,7 @@ func (ctx *GenerateContext) GenerateForSingleRPNamespace(generateParam *Generate // When sdk has major version bump, the live test needs to update the module referenced in the code. if oldModuleVersion.Major() != version.Major() && existSuffixFile(packagePath, "_live_test.go") { log.Printf("Replace live test module v2+...") - if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, version.String(), + if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, oldModuleVersion.String(), version.String(), "", "_live_test.go"); err != nil { return nil, err } From 2e90301163fb5a23157826c7aac1837137aa29f8 Mon Sep 17 00:00:00 2001 From: Alancere <804873052@qq.com> Date: Thu, 4 Jan 2024 17:09:20 +0800 Subject: [PATCH 4/4] goimports --- eng/tools/generator/cmd/v2/common/fileProcessor.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/eng/tools/generator/cmd/v2/common/fileProcessor.go b/eng/tools/generator/cmd/v2/common/fileProcessor.go index b0c96cb75ac0..a97df16f2a61 100644 --- a/eng/tools/generator/cmd/v2/common/fileProcessor.go +++ b/eng/tools/generator/cmd/v2/common/fileProcessor.go @@ -7,8 +7,6 @@ import ( "bytes" "errors" "fmt" - "go/parser" - "go/token" "io/fs" "io/ioutil" "log"