From 23f33226a847ec8970632c12a09f03c82c226693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cerqueira?= Date: Wed, 6 Oct 2021 16:04:28 +0100 Subject: [PATCH 1/7] feat: update version files when bumping the version --- README.md | 2 +- cmd/git-semver/git-semver.go | 23 ++++++++++ internal/git-semver/mod.go | 87 ++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ffb661..5685242 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # git-semver -[![Build](https://github.com/crqra/git-semver/actions/workflows/build.yml/badge.svg)](https://github.com/crqra/git-semver/actions/workflows/build.yml) [![LoC](https://tokei.rs/b1/github/crqra/git-semver)](https://github.com/crqra/git-semver) +[![Build](https://github.com/carlsberg/git-semver/actions/workflows/build.yml/badge.svg)](https://github.com/carlsberg/git-semver/actions/workflows/build.yml) [![LoC](https://tokei.rs/b1/github/crqra/git-semver)](https://github.com/crqra/git-semver) > Git extension to easily manage your project's version based on [Semantic Versioning][semver] and [Conventional Commits][conventional-commits] diff --git a/cmd/git-semver/git-semver.go b/cmd/git-semver/git-semver.go index 55eaecc..5219a0c 100644 --- a/cmd/git-semver/git-semver.go +++ b/cmd/git-semver/git-semver.go @@ -3,6 +3,7 @@ package git_semver import ( "fmt" "log" + "strings" "github.com/Masterminds/semver" git_semver "github.com/crqra/git-semver/internal/git-semver" @@ -61,6 +62,26 @@ var bumpCmd = &cobra.Command{ nextVersion := git_semver.BumpVersion(*latestVersion, increment) + versionFiles := make([]git_semver.VersionFile, 0) + versionFilenamesAndKeys, err := cmd.Flags().GetStringArray("version-file") + if err != nil { + log.Fatal(err) + } + + for _, filenameAndKey := range versionFilenamesAndKeys { + slice := strings.Split(filenameAndKey, ":") + + if len(slice) != 2 { + log.Fatalf("%s is not correctly formatted. Should be `filename:key`", filenameAndKey) + } + + versionFiles = append(versionFiles, git_semver.VersionFile{Filename: slice[0], Key: slice[1]}) + } + + if err := git_semver.UpdateVersionFiles(repo, versionFiles, *latestVersion, nextVersion); err != nil { + log.Fatal(err) + } + if err := git_semver.TagVersion(repo, nextVersion); err != nil { log.Fatal(err) } @@ -148,4 +169,6 @@ func init() { rootCmd.AddCommand(bumpCmd) rootCmd.AddCommand(nextCmd) rootCmd.AddCommand(latestCmd) + + bumpCmd.Flags().StringArrayP("version-file", "f", make([]string, 0), "Specify version files to be updated with the new version in the format `filename:key` (i.e. `package.json:\"version\"`)") } diff --git a/internal/git-semver/mod.go b/internal/git-semver/mod.go index bcb07e1..d167e40 100644 --- a/internal/git-semver/mod.go +++ b/internal/git-semver/mod.go @@ -2,6 +2,8 @@ package git_semver import ( "fmt" + "io/fs" + "io/ioutil" "log" "regexp" "sort" @@ -13,6 +15,10 @@ import ( type Increment int64 type Change string +type VersionFile struct { + Filename string + Key string +} const ( Major Increment = 4 @@ -63,6 +69,54 @@ func ListVersions(repo *git.Repository) ([]*semver.Version, error) { return versions, nil } +func CreateCommit(repo *git.Repository, message string) error { + sig, err := repo.DefaultSignature() + if err != nil { + return err + } + + head, err := repo.Head() + if err != nil { + return err + } + + idx, err := repo.Index() + if err != nil { + return err + } + + idx.AddAll(make([]string, 0), git.IndexAddDefault, func(_, _ string) int { + return 0 + }) + + treeId, err := idx.WriteTree() + if err != nil { + return err + } + + err = idx.Write() + if err != nil { + return err + } + + tree, err := repo.LookupTree(treeId) + if err != nil { + return err + } + + commitTarget, err := repo.LookupCommit(head.Target()) + if err != nil { + return err + } + + _, err = repo.CreateCommit("refs/heads/main", sig, sig, message, tree, commitTarget) + if err != nil { + return err + } + + return nil +} + func ListCommits(repo *git.Repository) ([]*git.Commit, error) { revwalk, err := repo.Walk() if err != nil { @@ -195,3 +249,36 @@ func PushVersionTagToRemotes(repo *git.Repository, version semver.Version) error return nil } + +func UpdateVersionFiles(repo *git.Repository, versionFiles []VersionFile, currentVersion semver.Version, nextVersion semver.Version) error { + if len(versionFiles) == 0 { + return nil + } + + for _, versionFile := range versionFiles { + r, err := regexp.Compile(fmt.Sprintf("%s(.{1,})?%s", versionFile.Key, currentVersion.String())) + if err != nil { + return err + } + + contents, err := ioutil.ReadFile(versionFile.Filename) + if err != nil { + return err + } + + match := string(r.Find(contents)) + newContents := strings.Replace(string(contents), match, strings.Replace(match, currentVersion.String(), nextVersion.String(), 1), 1) + + err = ioutil.WriteFile(versionFile.Filename, []byte(newContents), fs.ModePerm) + if err != nil { + return err + } + } + + err := CreateCommit(repo, fmt.Sprintf("bump: %s -> %s", currentVersion.String(), nextVersion.String())) + if err != nil { + return err + } + + return nil +} From 2a2aa4350aab08b73609588ac2ffec0c7955299c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cerqueira?= Date: Wed, 6 Oct 2021 16:16:59 +0100 Subject: [PATCH 2/7] ci: deprecate go 1.15 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 62ab9e0..13bf88c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go: [ '1.17', '1.16', '1.15' ] + go: [ '1.17', '1.16' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 @@ -78,4 +78,4 @@ jobs: # export PATH="/c/msys64/:/c/msys64/usr/:/c/msys64/usr/bin:$PATH" # go get -v ./... # ./make.bat build - # - run: go build \ No newline at end of file + # - run: go build From 724fb77cecd363dcd3d657b06d1a811007ba1a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cerqueira?= Date: Mon, 11 Oct 2021 15:03:49 +0100 Subject: [PATCH 3/7] refactor: moved logic to update version file to smaller funcs --- internal/git-semver/mod.go | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/internal/git-semver/mod.go b/internal/git-semver/mod.go index d167e40..33f1639 100644 --- a/internal/git-semver/mod.go +++ b/internal/git-semver/mod.go @@ -256,26 +256,40 @@ func UpdateVersionFiles(repo *git.Repository, versionFiles []VersionFile, curren } for _, versionFile := range versionFiles { - r, err := regexp.Compile(fmt.Sprintf("%s(.{1,})?%s", versionFile.Key, currentVersion.String())) + err := updateVersionFileVersion(versionFile, currentVersion, nextVersion) if err != nil { return err } + } - contents, err := ioutil.ReadFile(versionFile.Filename) - if err != nil { - return err - } + err := CreateCommit(repo, fmt.Sprintf("bump: %s -> %s", currentVersion.String(), nextVersion.String())) + if err != nil { + return err + } - match := string(r.Find(contents)) - newContents := strings.Replace(string(contents), match, strings.Replace(match, currentVersion.String(), nextVersion.String(), 1), 1) + return nil +} - err = ioutil.WriteFile(versionFile.Filename, []byte(newContents), fs.ModePerm) - if err != nil { - return err - } +func regexForVersionFileKey(key string, currentVersion semver.Version) (*regexp.Regexp, error) { + return regexp.Compile(fmt.Sprintf("%s(.{1,})?%s", key, currentVersion.String())) +} + +func updateVersionFileVersion(versionFile VersionFile, currentVersion semver.Version, nextVersion semver.Version) error { + r, err := regexForVersionFileKey(versionFile.Key, currentVersion) + if err != nil { + return err } - err := CreateCommit(repo, fmt.Sprintf("bump: %s -> %s", currentVersion.String(), nextVersion.String())) + contents, err := ioutil.ReadFile(versionFile.Filename) + if err != nil { + return err + } + + match := string(r.Find(contents)) + newVersionString := strings.Replace(match, currentVersion.String(), nextVersion.String(), 1) + newContents := strings.Replace(string(contents), match, newVersionString, 1) + + err = ioutil.WriteFile(versionFile.Filename, []byte(newContents), fs.ModePerm) if err != nil { return err } From defe5e2cf4fd299d9e1428bee777e09cc69cd8d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cerqueira?= Date: Mon, 11 Oct 2021 15:09:34 +0100 Subject: [PATCH 4/7] ci: deprecate go 1.15 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 13bf88c..07c1844 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,7 +32,7 @@ jobs: runs-on: macos-latest strategy: matrix: - go: [ '1.17', '1.16', '1.15' ] + go: [ '1.17', '1.16' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 @@ -48,7 +48,7 @@ jobs: # runs-on: windows-latest # strategy: # matrix: - # go: [ '1.17', '1.16', '1.15' ] + # go: [ '1.17', '1.16' ] # steps: # - uses: actions/checkout@v2 # - uses: actions/setup-go@v2 From 741762c936fde1b94a7a9ce314615e74cdfad320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cerqueira?= Date: Mon, 11 Oct 2021 15:46:38 +0100 Subject: [PATCH 5/7] ci: fix libgit2 version to 1.1.0 --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 07c1844..fa31822 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,10 @@ jobs: - name: Install libgit2 run: | brew install libssh2 - brew install libgit2 + brew uninstall libgit2 + brew tap-new carlsberg/homebrew-tap + brew extract --version 1.1.0 composer carlsberg/homebrew-tap + brew install libgit2@1.1.0 - run: go build # build-windows: From 3f69f6eafe5f45435a4251143773a5f9990f7e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cerqueira?= Date: Mon, 11 Oct 2021 15:48:16 +0100 Subject: [PATCH 6/7] ci: fix libgit2 version to 1.1.0 --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fa31822..675126d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,6 @@ jobs: - name: Install libgit2 run: | brew install libssh2 - brew uninstall libgit2 brew tap-new carlsberg/homebrew-tap brew extract --version 1.1.0 composer carlsberg/homebrew-tap brew install libgit2@1.1.0 From 0a2ef37aba81b6b56d001c0d5fa27b3a2fe441fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cerqueira?= Date: Tue, 12 Oct 2021 08:44:51 +0100 Subject: [PATCH 7/7] ci: fix libgit2 version to 1.1.0 --- .github/workflows/build.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 675126d..3def256 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,9 +41,7 @@ jobs: - name: Install libgit2 run: | brew install libssh2 - brew tap-new carlsberg/homebrew-tap - brew extract --version 1.1.0 composer carlsberg/homebrew-tap - brew install libgit2@1.1.0 + brew install carlsberg/tap/libgit2@1.1.0 - run: go build # build-windows: