diff --git a/.gitignore b/.gitignore index d3c8156c672..c59f889c320 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ dockerize /cadence-cassandra-tool /cadence-sql-tool /cadence-releaser +/cadence-releasetagger # SQLite databases cadence.db* diff --git a/Makefile b/Makefile index 51bd35f16a6..b66ae1f7d41 100644 --- a/Makefile +++ b/Makefile @@ -538,6 +538,11 @@ cadence-releaser: $(BINS_DEPEND_ON) $Q echo "compiling cadence-releaser with OS: $(GOOS), ARCH: $(GOARCH)" $Q ./scripts/build-with-ldflags.sh -o $@ cmd/tools/releaser/releaser.go +BINS += cadence-releasetagger +cadence-releasetagger: $(BINS_DEPEND_ON) + $Q echo "compiling cadence-releasetagger with OS: $(GOOS), ARCH: $(GOARCH)" + $Q go build -o $@ cmd/tools/releasetagger/main.go + .PHONY: go-generate bins tools release clean bins: $(BINS) ## Build all binaries, and any fast codegen needed (does not refresh wrappers or mocks) @@ -556,6 +561,10 @@ release: ## Re-generate generated code and run tests $(MAKE) --no-print-directory go-generate $(MAKE) --no-print-directory test +tag-release: cadence-releasetagger ## Tag all submodules and print the push command + $(if $(VERSION),,$(error VERSION is not set)) + $Q ./cadence-releasetagger $(VERSION) + build: ## `go build` all packages and tests (a quick compile check only, skips all other steps) $Q echo 'Building all packages and submodules...' $Q go build ./... diff --git a/cmd/tools/releasetagger/main.go b/cmd/tools/releasetagger/main.go new file mode 100644 index 00000000000..6fd41f70390 --- /dev/null +++ b/cmd/tools/releasetagger/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" +) + +const mainModule = "github.com/uber/cadence" + +func generateTags(version string, goListOutput string, root string) (string, error) { + tags := []string{version} + + for _, line := range strings.Split(goListOutput, "\n") { + parts := strings.Split(line, "\t") + if len(parts) != 2 { + continue + } + modulePath, moduleDir := parts[0], parts[1] + + if strings.HasPrefix(modulePath, mainModule+"/") { + relPath, err := filepath.Rel(root, moduleDir) + if err != nil { + return "", fmt.Errorf("error getting relative path for %s: %v", moduleDir, err) + } + tags = append(tags, fmt.Sprintf("%s/%s", relPath, version)) + } + } + + if len(tags) == 0 { + return "", nil + } + tagsStr := strings.Join(tags, " ") + return fmt.Sprintf("git tag %s\ngit push origin %s\n", tagsStr, tagsStr), nil +} + +func main() { + if len(os.Args) < 2 { + fmt.Println("Usage: go run main.go ") + os.Exit(1) + } + version := os.Args[1] + + cmd := exec.Command("go", "list", "-m", "-f", "{{.Path}}\t{{.Dir}}", "all") + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + fmt.Printf("Error running 'go list': %v\n", err) + os.Exit(1) + } + + root, err := os.Getwd() + if err != nil { + fmt.Printf("Error getting current directory: %v\n", err) + os.Exit(1) + } + + output, err := generateTags(version, out.String(), root) + if err != nil { + fmt.Printf("Error generating tags: %v\n", err) + os.Exit(1) + } + fmt.Print(output) +}