From 6c58d51c11e0d66c91f459e2b2c8aa2ef02d4139 Mon Sep 17 00:00:00 2001 From: Arcturus Date: Fri, 18 Oct 2019 17:06:54 +0800 Subject: [PATCH] Module releaser tool (#1470) * Ensures go.mod exists before doing actual work * Fix wrong module name * Add a new test scenario * Some refinement on testcases for versioner * Update version in version.go * Only keep one line of tag in version.go * Minor fix * No need to print tag to stdout * New test scenario * Fix linter problem * Return error from filepath.Abs * Add test for update version.go file * Remove method that ensures existence of go.mod file, and some redaudent test cases * Formatting code after versioning done * Refine tests * Fix a bug that when update applied to v2, the go.mod file does not update as v2 * Clean up * Purely file rename, nothing else changed * Add functionality for run tool in root folder * Add root command again * Fix format * Typo fix * Add test for list all stage folders * Add two functions for programmatically call * Fix CI failure * Add a new test case for more realistic * Fix errors in the new test case * Fix gofmt issues * Add a new struct to cover this scenario * Add test for go vet * Add new test case for one line import * Format stage folder first to avoid un-expected changes in code * Fix a bug in regex used for multiline import statement * Move getPkgs method to an internal package and exported * Fix broken tests * Add comment to silence golint error * Init command * Format change * More minor tweak to satisfy golint * Refine * Initial commit of tool moduler * Add copyright info in front of every new file * Add profile building * Fix CI failure * Fix dry-run * Do not need to update repo * Refine * Refine and add tests for moduler * Update tests * Remove profile related functionalities --- tools/moduler/cmd/root_test.go | 21 ----- tools/testdata/README.md | 8 +- .../scenariog/foo/mgmt/2019-10-11/foo/go.mod | 2 +- .../foo/mgmt/2019-10-11/foo/stage/go.mod | 2 +- .../scenarioh/foo/mgmt/2019-10-11/foo/go.mod | 2 +- .../foo/mgmt/2019-10-11/foo/stage/go.mod | 2 +- tools/versioner/cmd/root_test.go | 2 - tools/versioner/cmd/unstage.go | 25 ++--- tools/versioner/cmd/unstage_test.go | 92 ++----------------- 9 files changed, 19 insertions(+), 137 deletions(-) diff --git a/tools/moduler/cmd/root_test.go b/tools/moduler/cmd/root_test.go index 6e7b42967ce9..84deddae4398 100644 --- a/tools/moduler/cmd/root_test.go +++ b/tools/moduler/cmd/root_test.go @@ -41,21 +41,6 @@ var ( "tools/testdata/scenarioe/foo/v1.1.0", "tools/testdata/scenarioe/foo/v2.0.0", "tools/testdata/scenarioe/foo/v2.1.0", - "tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/v1.0.0", - "tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.0.0", - "tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.1.0", - "tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.2.0", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.0.0", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.0.1", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.1.0", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.1.1", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.1.2", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.0.0", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.0.1", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.1.0", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.1.1", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.1.2", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2.0.0", } ) @@ -100,9 +85,6 @@ func Test_findAllVersionFiles(t *testing.T) { "../../testdata/scenariog/foo/mgmt/2019-10-11/foo/v2/version.go", "../../testdata/scenarioh/foo/mgmt/2019-10-11/foo/version.go", "../../testdata/scenarioh/foo/mgmt/2019-10-11/foo/v2/version.go", - "../../testdata/scenarioi/foo/mgmt/2019-10-23/foo/version.go", - "../../testdata/scenarioj/foo/mgmt/2019-10-23/foo/version.go", - "../../testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2/version.go", } root, err := filepath.Abs("../../testdata") if err != nil { @@ -182,9 +164,6 @@ func Test_readNewTags(t *testing.T) { "tools/testdata/scenariof/foo/v1.0.0", "tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/v2.0.0", "tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v2.0.0", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.1.2", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.1.2", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2.0.0", } root, err := filepath.Abs("../../testdata") if err != nil { diff --git a/tools/testdata/README.md b/tools/testdata/README.md index 69cf4900d3a6..7f2ecab23088 100644 --- a/tools/testdata/README.md +++ b/tools/testdata/README.md @@ -8,10 +8,4 @@ | d | Yes | Yes | v1, v2 | Yes | | e | Yes | No | v1, v2 | Yes | | f | Yes | No | None | Yes | -| g | Yes | Yes | v1 | Yes | -| h | Yes | Yes | v1 | Yes | -| i | No | No | v1 | Yes | -| j | No | No | v1, v2 | Yes | - -* For i, all files in v1 and stage are identical with each other. In this case, no version should be bumped. -* For j, all files in v2 and stage are identical with each other. In this case, no version should be bumped. \ No newline at end of file +| g | Yes | Yes | v1 | Yes | \ No newline at end of file diff --git a/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/go.mod b/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/go.mod index 82d6f4eca2e2..9ded283f48b3 100644 --- a/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/go.mod +++ b/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/go.mod @@ -1,3 +1,3 @@ -module github.com/Azure/azure-sdk-for-go/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo +module github.com/Azure/azure-sdk-for-go/tools/testdata/scenariog/foo go 1.12 diff --git a/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/stage/go.mod b/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/stage/go.mod index 82d6f4eca2e2..9ded283f48b3 100644 --- a/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/stage/go.mod +++ b/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/stage/go.mod @@ -1,3 +1,3 @@ -module github.com/Azure/azure-sdk-for-go/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo +module github.com/Azure/azure-sdk-for-go/tools/testdata/scenariog/foo go 1.12 diff --git a/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/go.mod b/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/go.mod index a4f9958840c9..4f5aef0031ea 100644 --- a/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/go.mod +++ b/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/go.mod @@ -1,3 +1,3 @@ -module github.com/Azure/azure-sdk-for-go/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo +module github.com/Azure/azure-sdk-for-go/tools/testdata/scenarioh/foo go 1.12 diff --git a/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/stage/go.mod b/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/stage/go.mod index a4f9958840c9..4f5aef0031ea 100644 --- a/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/stage/go.mod +++ b/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/stage/go.mod @@ -1,3 +1,3 @@ -module github.com/Azure/azure-sdk-for-go/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo +module github.com/Azure/azure-sdk-for-go/tools/testdata/scenarioh/foo go 1.12 diff --git a/tools/versioner/cmd/root_test.go b/tools/versioner/cmd/root_test.go index f8d9b8cc9ea4..a524ad98c580 100644 --- a/tools/versioner/cmd/root_test.go +++ b/tools/versioner/cmd/root_test.go @@ -46,8 +46,6 @@ func Test_findAllSubDirectories(t *testing.T) { "../../testdata/scenariof/foo/stage", "../../testdata/scenariog/foo/mgmt/2019-10-11/foo/stage", "../../testdata/scenarioh/foo/mgmt/2019-10-11/foo/stage", - "../../testdata/scenarioi/foo/mgmt/2019-10-23/foo/stage", - "../../testdata/scenarioj/foo/mgmt/2019-10-23/foo/stage", } root, err := filepath.Abs("../../testdata") if err != nil { diff --git a/tools/versioner/cmd/unstage.go b/tools/versioner/cmd/unstage.go index 233282570f07..43dc027e5e5e 100644 --- a/tools/versioner/cmd/unstage.go +++ b/tools/versioner/cmd/unstage.go @@ -101,6 +101,9 @@ func theUnstageCommand(args []string) (string, error) { if err != nil { return "", fmt.Errorf("failed to create module info: %v", err) } + if err := writeChangelog(stage, mod); err != nil { + return "", fmt.Errorf("failed to write changelog: %v", err) + } var tag string if mod.BreakingChanges() { tag, err = forSideBySideRelease(stage, mod) @@ -140,10 +143,6 @@ func forSideBySideRelease(stage string, mod modinfo.Provider) (string, error) { if err := updateVersion(stage, tag); err != nil { return "", fmt.Errorf("failed to update version.go: %v", err) } - // write change log - if err := writeChangelog(stage, mod); err != nil { - return "", fmt.Errorf("failed to write changelog: %v", err) - } // move staging to new LMV directory if err = os.Rename(stage, mod.DestDir()); err != nil { return "", fmt.Errorf("failed to rename '%s' to '%s': %v", stage, mod.DestDir(), err) @@ -181,14 +180,6 @@ func forInplaceUpdate(lmv, stage string, mod modinfo.Provider) (string, error) { if err := updateVersion(stage, tag); err != nil { return "", fmt.Errorf("failed to update version.go: %v", err) } - // write changelog - if hasChange, err := mod.HasChanges(); err != nil { - return "", fmt.Errorf("failed to check changes: %v", err) - } else if hasChange { - if err := writeChangelog(stage, mod); err != nil { - return "", fmt.Errorf("failed to write changelog: %v", err) - } - } // move staging directory over the LMV by first deleting LMV then renaming stage if modinfo.HasVersionSuffix(lmv) { if err := os.RemoveAll(lmv); err != nil { @@ -494,13 +485,9 @@ func calculateModuleTag(tags []string, mod modinfo.Provider) (string, error) { n := sv.IncMinor() sv = &n } else { - // no new exports and has changes, this is a patch update - if hasChange, err := mod.HasChanges(); err != nil { - return "", err - } else if hasChange { - n := sv.IncPatch() - sv = &n - } + // no new exports, this is a patch update + n := sv.IncPatch() + sv = &n } return strings.Replace(tag, v, "v"+sv.String(), 1), nil } diff --git a/tools/versioner/cmd/unstage_test.go b/tools/versioner/cmd/unstage_test.go index 6dcf1f170e9e..5a364001e073 100644 --- a/tools/versioner/cmd/unstage_test.go +++ b/tools/versioner/cmd/unstage_test.go @@ -137,11 +137,6 @@ func (mock mockModInfo) GenerateReport() report.Package { return report.Package{} } -func (mock mockModInfo) HasChanges() (bool, error) { - // not needed by tests - return true, nil -} - func Test_calculateModuleTagMajorV1(t *testing.T) { pkg := mockModInfo{ dir: filepath.Join("work", "src", "github.com", "Azure", "azure-sdk-for-go", "services", "foo"), @@ -583,11 +578,11 @@ func Test_theCommandNewMgmtMajorV2(t *testing.T) { cleanTestData() defer cleanTestData() getTagsHook = func(root string, prefix string) ([]string, error) { - if !strings.HasSuffix(prefix, "testdata/scenariog/foo/mgmt/2019-10-11/foo") { + if !strings.HasPrefix(prefix, "/testdata/scenariog/foo") { return nil, fmt.Errorf("bad prefix '%s'", prefix) } return []string{ - "tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/v1.0.0", + "/testdata/scenariog/foo/mgmt/2019-10-11/foo/v1.0.0", }, nil } stage, err := filepath.Abs("../../testdata/scenariog/foo/mgmt/2019-10-11/foo/stage") @@ -602,7 +597,7 @@ func Test_theCommandNewMgmtMajorV2(t *testing.T) { if tag != expectedTag { t.Fatalf("bad tag, expected '%s' got '%s'", expectedTag, tag) } - expectedMod := fmt.Sprintf("module github.com/Azure/azure-sdk-for-go/tools/testdata/scenariog/foo/mgmt/2019-10-11/foo/v2\n\n%s\n", goVersion) + expectedMod := fmt.Sprintf("module github.com/Azure/azure-sdk-for-go/tools/testdata/scenariog/foo/v2\n\n%s\n", goVersion) verifyGoMod(t, "../../testdata/scenariog/foo/mgmt/2019-10-11/foo/v2", expectedMod) verifyVersion(t, "../../testdata/scenariog/foo/mgmt/2019-10-11/foo/v2", "2.0.0", tag) verifyChangelog(t, "../../testdata/scenariog/foo/mgmt/2019-10-11/foo/v2") @@ -614,13 +609,13 @@ func Test_theCommandNewMgmtMajorV2WithOneLineImport(t *testing.T) { cleanTestData() defer cleanTestData() getTagsHook = func(root string, prefix string) ([]string, error) { - if !strings.HasSuffix(prefix, "testdata/scenarioh/foo/mgmt/2019-10-11/foo") { + if !strings.HasPrefix(prefix, "/testdata/scenarioh/foo") { return nil, fmt.Errorf("bad prefix '%s'", prefix) } return []string{ - "tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.0.0", - "tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.1.0", - "tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.2.0", + "/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.0.0", + "/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.1.0", + "/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v1.2.0", }, nil } stage, err := filepath.Abs("../../testdata/scenarioh/foo/mgmt/2019-10-11/foo/stage") @@ -635,80 +630,9 @@ func Test_theCommandNewMgmtMajorV2WithOneLineImport(t *testing.T) { if tag != expectedTag { t.Fatalf("bad tag, expected '%s' got '%s'", expectedTag, tag) } - expectedMod := fmt.Sprintf("module github.com/Azure/azure-sdk-for-go/tools/testdata/scenarioh/foo/mgmt/2019-10-11/foo/v2\n\n%s\n", goVersion) + expectedMod := fmt.Sprintf("module github.com/Azure/azure-sdk-for-go/tools/testdata/scenarioh/foo/v2\n\n%s\n", goVersion) verifyGoMod(t, "../../testdata/scenarioh/foo/mgmt/2019-10-11/foo/v2", expectedMod) verifyVersion(t, "../../testdata/scenarioh/foo/mgmt/2019-10-11/foo/v2", "2.0.0", tag) verifyChangelog(t, "../../testdata/scenarioh/foo/mgmt/2019-10-11/foo/v2") verifyGoVet(t, "../../testdata/scenarioh/foo/mgmt/2019-10-11/foo") } - -// scenarioi -func Test_theCommandNoAnyChange(t *testing.T) { - cleanTestData() - defer cleanTestData() - getTagsHook = func(root string, prefix string) ([]string, error) { - if !strings.HasSuffix(prefix, "testdata/scenarioi/foo/mgmt/2019-10-23/foo") { - return nil, fmt.Errorf("bad prefix '%s'", prefix) - } - return []string{ - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.0.0", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.0.1", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.1.0", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.1.1", - "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.1.2", - }, nil - } - stage, err := filepath.Abs("../../testdata/scenarioi/foo/mgmt/2019-10-23/foo/stage") - if err != nil { - t.Fatalf("failed: %v", err) - } - tag, err := theUnstageCommand([]string{stage}) - if err != nil { - t.Fatalf("failed: %v", err) - } - const expectedTag = "tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo/v1.1.2" - if tag != expectedTag { - t.Fatalf("bad tag, expected '%s' got '%s'", expectedTag, tag) - } - expectedMod := fmt.Sprintf("module github.com/Azure/azure-sdk-for-go/tools/testdata/scenarioi/foo/mgmt/2019-10-23/foo\n\n%s\n", goVersion) - verifyGoMod(t, "../../testdata/scenarioi/foo/mgmt/2019-10-23/foo", expectedMod) - verifyVersion(t, "../../testdata/scenarioi/foo/mgmt/2019-10-23/foo", "1.1.2", tag) - verifyNoChangelog(t, "../../testdata/scenarioi/foo/mgmt/2019-10-23/foo") - verifyGoVet(t, "../../testdata/scenarioi/foo/mgmt/2019-10-23/foo") -} - -// scenarioj -func Test_theCommandNoAnyChangeV2(t *testing.T) { - cleanTestData() - defer cleanTestData() - getTagsHook = func(root string, prefix string) ([]string, error) { - if !strings.HasSuffix(prefix, "testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2") { - return nil, fmt.Errorf("bad prefix '%s'", prefix) - } - return []string{ - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.0.0", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.0.1", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.1.0", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.1.1", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v1.1.2", - "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2.0.0", - }, nil - } - stage, err := filepath.Abs("../../testdata/scenarioj/foo/mgmt/2019-10-23/foo/stage") - if err != nil { - t.Fatalf("failed: %v", err) - } - tag, err := theUnstageCommand([]string{stage}) - if err != nil { - t.Fatalf("failed: %v", err) - } - const expectedTag = "tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2.0.0" - if tag != expectedTag { - t.Fatalf("bad tag, expected '%s' got '%s'", expectedTag, tag) - } - expectedMod := fmt.Sprintf("module github.com/Azure/azure-sdk-for-go/tools/testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2\n\n%s\n", goVersion) - verifyGoMod(t, "../../testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2", expectedMod) - verifyVersion(t, "../../testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2", "2.0.0", tag) - verifyNoChangelog(t, "../../testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2") - verifyGoVet(t, "../../testdata/scenarioj/foo/mgmt/2019-10-23/foo/v2") -}