refactor(pkg): clean up semantic release interface

This commit is contained in:
Nightapes
2019-07-24 22:14:03 +02:00
parent e222734a1a
commit 1daff2bc8a
9 changed files with 171 additions and 63 deletions

View File

@@ -40,12 +40,18 @@ var changelogCmd = &cobra.Command{
return err return err
} }
releaseVersion, err := s.GetNextVersion(force) provider, err := s.GetCIProvider()
if err != nil { if err != nil {
return err return err
} }
generatedChangelog, err := s.GetChangelog(releaseVersion) releaseVersion, commits, err := s.GetNextVersion(provider, force)
if err != nil {
return err
}
log.Debugf("Found %d commits till last release", len(commits))
generatedChangelog, err := s.GetChangelog(commits, releaseVersion)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -2,8 +2,8 @@ package commands
import ( import (
"fmt" "fmt"
"github.com/Nightapes/go-semantic-release/pkg/semanticrelease" "github.com/Nightapes/go-semantic-release/pkg/semanticrelease"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@@ -35,7 +35,15 @@ var nextCmd = &cobra.Command{
return err return err
} }
releaseVersion, err := s.GetNextVersion(force) provider, err := s.GetCIProvider()
if err != nil {
log.Infof("Will not calculate version, set fake version. Could not find CI Provider, if running locally, set env CI=true")
fmt.Println("0.0.0-fake.0")
return nil
}
releaseVersion, _, err := s.GetNextVersion(provider, force)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -32,6 +32,12 @@ var releaseCmd = &cobra.Command{
if err != nil { if err != nil {
return err return err
} }
return s.Release(force)
provider, err := s.GetCIProvider()
if err != nil {
return err
}
return s.Release(provider, force)
}, },
} }

View File

@@ -31,6 +31,11 @@ var setCmd = &cobra.Command{
return err return err
} }
return s.SetVersion(args[0]) provider, err := s.GetCIProvider()
if err != nil {
return err
}
return s.SetVersion(provider, args[0])
}, },
} }

View File

@@ -47,7 +47,7 @@ func Write(repository string, releaseVersion shared.ReleaseVersion) error {
return err return err
} }
log.Debugf("Save %s with hash %s to cache", releaseVersion.Next.Version.String(), releaseVersion.Next.Commit) log.Infof("Save %s with hash %s to cache", releaseVersion.Next.Version.String(), releaseVersion.Next.Commit)
return ioutil.WriteFile(completePath, data, 0644) return ioutil.WriteFile(completePath, data, 0644)
} }

View File

@@ -51,7 +51,7 @@ func GetCIProvider(gitUtil *gitutil.GitUtil, envs map[string]string) (*ProviderC
log.Infof("Found CI: %s", config.Name) log.Infof("Found CI: %s", config.Name)
return config, nil return config, nil
} }
log.Infof("%s", err.Error()) log.Debugf("%s", err.Error())
} }
return nil, fmt.Errorf("could not find any CI, if running locally set env CI=true") return nil, fmt.Errorf("could not find any CI, if running locally set env CI=true")
} }

View File

@@ -55,7 +55,7 @@ func Read(configPath string) (*ReleaseConfig, error) {
return &ReleaseConfig{}, err return &ReleaseConfig{}, err
} }
log.Debugf("Found config %+v", releaseConfig) log.Tracef("Found config %+v", releaseConfig)
return &releaseConfig, nil return &releaseConfig, nil
} }

112
pkg/config/config_test.go Normal file
View File

@@ -0,0 +1,112 @@
package config_test
import (
"testing"
"github.com/Nightapes/go-semantic-release/pkg/config"
"github.com/stretchr/testify/assert"
"io/ioutil"
"os"
"path"
)
func TestReadCacheNotFound(t *testing.T) {
_, err := config.Read("notfound/dir")
assert.Errorf(t, err, "Read non exsiting file")
}
func TestReadCacheInvalidContent(t *testing.T) {
dir, err := ioutil.TempDir("", "prefix")
assert.NoError(t, err)
defer os.RemoveAll(dir)
completePath := path.Join(path.Dir(dir), ".release.yml")
brokenContent := []byte("hello broken\ngo: lang\n")
err = ioutil.WriteFile(completePath, brokenContent, 0644)
assert.NoError(t, err)
_, readError := config.Read(completePath)
assert.Errorf(t, readError, "Should give error, when broken content")
}
func TestWriteAndReadCache(t *testing.T) {
dir, err := ioutil.TempDir("", "prefix")
assert.NoError(t, err)
defer os.RemoveAll(dir)
completePath := path.Join(path.Dir(dir), ".release.yml")
content := []byte(`
commitFormat: angular
title: "go-semantic-release release"
branch:
master: release
rc: rc
beta: beta
alpha: alpha
add_git_releases: alpha
changelog:
printAll: false
template: ''
templatePath: ''
release: 'github'
assets:
- name: ./build/go-semantic-release
compress: false
github:
repo: "go-semantic-release"
user: "nightapes"
customUrl: ""
`)
err = ioutil.WriteFile(completePath, content, 0644)
assert.NoError(t, err)
result, readError := config.Read(completePath)
assert.NoErrorf(t, readError, "Should read file")
assert.EqualValues(t, &config.ReleaseConfig{
CommitFormat: "angular",
Branch: map[string]string{"add_git_releases": "alpha", "alpha": "alpha", "beta": "beta", "master": "release", "rc": "rc"},
Changelog: config.ChangelogConfig{
PrintAll: false,
Template: "",
TemplatePath: ""},
Release: "github",
GitHubProvider: config.GitHubProvider{
Repo: "go-semantic-release",
User: "nightapes",
CustomURL: "",
AccessToken: ""},
Assets: []config.Asset{
config.Asset{
Name: "./build/go-semantic-release",
Compress: false}},
ReleaseTitle: "go-semantic-release release",
IsPreRelease: false,
IsDraft: false,
}, result)
}
// func TestWriteNotFound(t *testing.T) {
// err := cache.Write("notfound/dir", shared.ReleaseVersion{
// Last: shared.ReleaseVersionEntry{
// Commit: "12345",
// Version: createVersion("1.0.0"),
// },
// Next: shared.ReleaseVersionEntry{
// Commit: "12346",
// Version: createVersion("1.1.0"),
// },
// Branch: "master",
// Draft: true,
// })
// assert.Errorf(t, err, "Write non exsiting file")
// }

View File

@@ -1,7 +1,6 @@
package semanticrelease package semanticrelease
import ( import (
"fmt"
"io/ioutil" "io/ioutil"
"strings" "strings"
"time" "time"
@@ -57,36 +56,28 @@ func New(c *config.ReleaseConfig, repository string) (*SemanticRelease, error) {
}, nil }, nil
} }
//GetCIProvider result with ci config
func (s *SemanticRelease) GetCIProvider() (*ci.ProviderConfig, error) {
return ci.GetCIProvider(s.gitutil, ci.ReadAllEnvs())
}
// GetNextVersion from .version or calculate new from commits // GetNextVersion from .version or calculate new from commits
func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, error) { func (s *SemanticRelease) GetNextVersion(provider *ci.ProviderConfig, force bool) (*shared.ReleaseVersion, map[analyzer.Release][]analyzer.AnalyzedCommit, error) {
provider, err := ci.GetCIProvider(s.gitutil, ci.ReadAllEnvs())
if err != nil {
fakeVersion, _ := semver.NewVersion("0.0.0-fake.0")
log.Warnf("Will not calculate version, set fake version. Could not find CI Provider, if running locally, set env CI=true")
return &shared.ReleaseVersion{
Next: shared.ReleaseVersionEntry{
Commit: "",
Version: fakeVersion,
},
}, nil
}
log.Debugf("Ignore .version file if exits, %t", force) log.Debugf("Ignore .version file if exits, %t", force)
if !force { if !force {
releaseVersion, err := cache.Read(s.repository) releaseVersion, err := cache.Read(s.repository)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
if releaseVersion.Next.Commit == provider.Commit && releaseVersion != nil { if releaseVersion.Next.Commit == provider.Commit && releaseVersion != nil {
return releaseVersion, nil return releaseVersion, nil, nil
} }
} }
lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion() lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion()
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
firstRelease := false firstRelease := false
@@ -99,22 +90,19 @@ func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, er
commits, err := s.gitutil.GetCommits(lastVersionHash) commits, err := s.gitutil.GetCommits(lastVersionHash)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
log.Debugf("Found %d commits till last release", len(commits)) log.Debugf("Found %d commits till last release", len(commits))
a, err := analyzer.New(s.config.CommitFormat, s.config.Changelog) analyzedCommits := s.analyzer.Analyze(commits)
if err != nil {
return nil, err
}
isDraft := false isDraft := false
var newVersion semver.Version var newVersion semver.Version
for branch, releaseType := range s.config.Branch { for branch, releaseType := range s.config.Branch {
if provider.Branch == branch || strings.HasPrefix(provider.Branch, branch) { if provider.Branch == branch || strings.HasPrefix(provider.Branch, branch) {
log.Debugf("Found branch config for branch %s with release type %s", provider.Branch, releaseType) log.Debugf("Found branch config for branch %s with release type %s", provider.Branch, releaseType)
newVersion, isDraft = s.calculator.CalculateNewVersion(a.Analyze(commits), lastVersion, releaseType, firstRelease) newVersion, isDraft = s.calculator.CalculateNewVersion(analyzedCommits, lastVersion, releaseType, firstRelease)
break break
} }
} }
@@ -135,25 +123,19 @@ func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, er
log.Infof("New version %s -> %s", lastVersion.String(), newVersion.String()) log.Infof("New version %s -> %s", lastVersion.String(), newVersion.String())
err = cache.Write(s.repository, releaseVersion) err = cache.Write(s.repository, releaseVersion)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
return &releaseVersion, err return &releaseVersion, analyzedCommits, err
} }
//SetVersion for git repository //SetVersion for git repository
func (s *SemanticRelease) SetVersion(version string) error { func (s *SemanticRelease) SetVersion(provider *ci.ProviderConfig, version string) error {
newVersion, err := semver.NewVersion(version) newVersion, err := semver.NewVersion(version)
if err != nil { if err != nil {
return err return err
} }
provider, err := ci.GetCIProvider(s.gitutil, ci.ReadAllEnvs())
if err != nil {
return fmt.Errorf("will not set version. Could not find CI Provider, if running locally, set env CI=true")
}
lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion() lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion()
if err != nil { if err != nil {
return err return err
@@ -176,23 +158,14 @@ func (s *SemanticRelease) SetVersion(version string) error {
} }
// GetChangelog from last version till now // GetChangelog from last version till now
func (s *SemanticRelease) GetChangelog(releaseVersion *shared.ReleaseVersion) (*shared.GeneratedChangelog, error) { func (s *SemanticRelease) GetChangelog(analyzedCommits map[analyzer.Release][]analyzer.AnalyzedCommit, releaseVersion *shared.ReleaseVersion) (*shared.GeneratedChangelog, error) {
commits, err := s.gitutil.GetCommits(releaseVersion.Last.Commit)
if err != nil {
return nil, err
}
result := s.analyzer.Analyze(commits)
log.Debugf("Found %d commits till last release", len(commits))
c := changelog.New(s.config, s.analyzer.GetRules(), time.Now()) c := changelog.New(s.config, s.analyzer.GetRules(), time.Now())
return c.GenerateChanglog(shared.ChangelogTemplateConfig{ return c.GenerateChanglog(shared.ChangelogTemplateConfig{
Version: releaseVersion.Next.Version.String(), Version: releaseVersion.Next.Version.String(),
Hash: releaseVersion.Last.Commit, Hash: releaseVersion.Last.Commit,
CommitURL: s.releaser.GetCommitURL(), CommitURL: s.releaser.GetCommitURL(),
CompareURL: s.releaser.GetCompareURL(releaseVersion.Last.Version.String(), releaseVersion.Next.Version.String()), CompareURL: s.releaser.GetCompareURL(releaseVersion.Last.Version.String(), releaseVersion.Next.Version.String()),
}, result) }, analyzedCommits)
} }
@@ -202,14 +175,7 @@ func (s *SemanticRelease) WriteChangeLog(changelogContent, file string) error {
} }
// Release pusblish release to provider // Release pusblish release to provider
func (s *SemanticRelease) Release(force bool) error { func (s *SemanticRelease) Release(provider *ci.ProviderConfig, force bool) error {
provider, err := ci.GetCIProvider(s.gitutil, ci.ReadAllEnvs())
if err != nil {
log.Debugf("Will not perform a new release. Could not find CI Provider")
return nil
}
if provider.IsPR { if provider.IsPR {
log.Debugf("Will not perform a new release. This is a pull request") log.Debugf("Will not perform a new release. This is a pull request")
@@ -221,13 +187,18 @@ func (s *SemanticRelease) Release(force bool) error {
return nil return nil
} }
releaseVersion, err := s.GetNextVersion(force) releaseVersion, analyzedCommits, err := s.GetNextVersion(provider, force)
if err != nil { if err != nil {
log.Debugf("Could not get next version") log.Debugf("Could not get next version")
return err return err
} }
generatedChanglog, err := s.GetChangelog(releaseVersion) if releaseVersion.Next.Version.Equal(releaseVersion.Next.Version) {
log.Infof("No new version, no release needed")
return nil
}
generatedChanglog, err := s.GetChangelog(analyzedCommits, releaseVersion)
if err != nil { if err != nil {
log.Debugf("Could not get changelog") log.Debugf("Could not get changelog")
return err return err