You've already forked go-semantic-release
Merge pull request #1 from Nightapes/cleanup
refactor(*): clean up code
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -6,6 +6,7 @@
|
|||||||
*.dylib
|
*.dylib
|
||||||
go-semantic-release
|
go-semantic-release
|
||||||
|
|
||||||
|
!cmd/go-semantic-release
|
||||||
# Test binary, build with `go test -c`
|
# Test binary, build with `go test -c`
|
||||||
*.test
|
*.test
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ linters-settings:
|
|||||||
golint:
|
golint:
|
||||||
min-confidence: 0
|
min-confidence: 0
|
||||||
issues:
|
issues:
|
||||||
exclude-use-default: false
|
exclude-use-default: true
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
- golint
|
- golint
|
||||||
10
.release.yml
10
.release.yml
@@ -5,6 +5,7 @@ branch:
|
|||||||
rc: rc
|
rc: rc
|
||||||
beta: beta
|
beta: beta
|
||||||
alpha: alpha
|
alpha: alpha
|
||||||
|
add_git_releases: alpha
|
||||||
changelog:
|
changelog:
|
||||||
printAll: false
|
printAll: false
|
||||||
template: ''
|
template: ''
|
||||||
@@ -13,8 +14,7 @@ release: 'github'
|
|||||||
assets:
|
assets:
|
||||||
- name:
|
- name:
|
||||||
compress:
|
compress:
|
||||||
provider:
|
github:
|
||||||
name: "GitHub"
|
repo: "go-semantic-release"
|
||||||
repo: ""
|
user: "nightapes"
|
||||||
user: ""
|
customUrl: ""
|
||||||
customURL: ""
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ dist: xenial
|
|||||||
language: go
|
language: go
|
||||||
go:
|
go:
|
||||||
- 1.12.x
|
- 1.12.x
|
||||||
|
go_import_path: github.com/nightapes/go-semantic-release
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
- $HOME/.cache/go-build
|
- $HOME/.cache/go-build
|
||||||
|
|||||||
59
cmd/go-semantic-release/commands/changelog.go
Normal file
59
cmd/go-semantic-release/commands/changelog.go
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Nightapes/go-semantic-release/pkg/semanticrelease"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
changelogCmd.Flags().StringP("out", "o", "CHANGELOG.md", "Name of the file")
|
||||||
|
rootCmd.AddCommand(changelogCmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
var changelogCmd = &cobra.Command{
|
||||||
|
Use: "changelog",
|
||||||
|
Short: "Generate changelog and save to file",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
config, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
repository, err := cmd.Flags().GetString("repository")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
force, err := cmd.Flags().GetBool("no-cache")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := cmd.Flags().GetString("out")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
s, err := semanticrelease.New(readConfig(config), repository)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
releaseVersion, err := s.GetNextVersion(force)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
generatedChangelog, err := s.GetChangelog(releaseVersion)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = s.WriteChangeLog(generatedChangelog.Content, file); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
45
cmd/go-semantic-release/commands/next.go
Normal file
45
cmd/go-semantic-release/commands/next.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/Nightapes/go-semantic-release/pkg/semanticrelease"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
rootCmd.AddCommand(nextCmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
var nextCmd = &cobra.Command{
|
||||||
|
Use: "next",
|
||||||
|
Short: "Get next release version",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
config, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
repository, err := cmd.Flags().GetString("repository")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
force, err := cmd.Flags().GetBool("no-cache")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
s, err := semanticrelease.New(readConfig(config), repository)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
releaseVersion, err := s.GetNextVersion(force)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println(releaseVersion.Next.Version.String())
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
37
cmd/go-semantic-release/commands/release.go
Normal file
37
cmd/go-semantic-release/commands/release.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Nightapes/go-semantic-release/pkg/semanticrelease"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
rootCmd.AddCommand(releaseCmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
var releaseCmd = &cobra.Command{
|
||||||
|
Use: "release",
|
||||||
|
Short: "Make a release",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
config, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
repository, err := cmd.Flags().GetString("repository")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
force, err := cmd.Flags().GetBool("force")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
s, err := semanticrelease.New(readConfig(config), repository)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return s.Release(force)
|
||||||
|
},
|
||||||
|
}
|
||||||
56
cmd/go-semantic-release/commands/root.go
Normal file
56
cmd/go-semantic-release/commands/root.go
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
var rootCmd = &cobra.Command{
|
||||||
|
Use: "go-semantic-release",
|
||||||
|
Short: "Make simple releases",
|
||||||
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
level, err := cmd.Flags().GetString("loglevel")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
setLoglevel(level)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
//Execute rootCmd
|
||||||
|
func Execute() {
|
||||||
|
if err := rootCmd.Execute(); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
rootCmd.PersistentFlags().StringP("repository", "r", "", "Path to repository")
|
||||||
|
rootCmd.PersistentFlags().StringP("loglevel", "l", "error", "Set loglevel")
|
||||||
|
rootCmd.PersistentFlags().StringP("config", "c", ".release.yml", "Path to config file")
|
||||||
|
rootCmd.PersistentFlags().Bool("no-cache", false, "Ignore cache, don't use in ci build")
|
||||||
|
}
|
||||||
|
|
||||||
|
func readConfig(file string) *config.ReleaseConfig {
|
||||||
|
releaseConfig, err := config.Read(file)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
return releaseConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func setLoglevel(level string) {
|
||||||
|
parsed, err := log.ParseLevel(level)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Invalid loglevel %s", level)
|
||||||
|
} else {
|
||||||
|
log.SetLevel(parsed)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
36
cmd/go-semantic-release/commands/set.go
Normal file
36
cmd/go-semantic-release/commands/set.go
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Nightapes/go-semantic-release/pkg/semanticrelease"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
rootCmd.AddCommand(setCmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
var setCmd = &cobra.Command{
|
||||||
|
Use: "set [version]",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Short: "Set next release version",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
config, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
repository, err := cmd.Flags().GetString("repository")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
s, err := semanticrelease.New(readConfig(config), repository)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.SetVersion(args[0])
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -1,91 +1,9 @@
|
|||||||
// Package main as start point for go build
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"github.com/Nightapes/go-semantic-release/cmd/go-semantic-release/commands"
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/Nightapes/go-semantic-release/pkg/config"
|
|
||||||
"github.com/Nightapes/go-semantic-release/pkg/semanticrelease"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
"gopkg.in/alecthomas/kingpin.v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
app = kingpin.New("go-semantic-release", "A command-line for releasing software")
|
|
||||||
loglevel = app.Flag("loglevel", "Set loglevel.").Default("error").HintOptions("error", "warning", "info", "debug").Short('l').String()
|
|
||||||
|
|
||||||
nextCommand = app.Command("next", "Print next version")
|
|
||||||
nextRepository = nextCommand.Flag("repository", "Path to repository").String()
|
|
||||||
nextConfigPath = nextCommand.Flag("config", "Path to config file").Default(".release.yml").String()
|
|
||||||
nextForce = nextCommand.Flag("force", "Ignore cache, don't use in ci build").Bool()
|
|
||||||
|
|
||||||
setCommand = app.Command("set", "Set version for current build.")
|
|
||||||
setRepository = setCommand.Flag("repository", "Path to repository").String()
|
|
||||||
setConfigPath = setCommand.Flag("config", "Path to config file").Default(".release.yml").String()
|
|
||||||
setVersion = setCommand.Arg("version", "semver version").Required().String()
|
|
||||||
|
|
||||||
getChangelog = app.Command("changelog", "Print changelog.")
|
|
||||||
getChangelogRepository = getChangelog.Flag("repository", "Path to repository").String()
|
|
||||||
getChangelogConfigPath = getChangelog.Flag("config", "Path to config file").Default(".release.yml").String()
|
|
||||||
getChangelogFile = getChangelog.Flag("file", "save changelog to file").Default("CHANGELOG.md").String()
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
commands.Execute()
|
||||||
switch kingpin.MustParse(app.Parse(os.Args[1:])) {
|
|
||||||
case nextCommand.FullCommand():
|
|
||||||
setLoglevel(*loglevel)
|
|
||||||
s := semanticrelease.New(readConfig(nextConfigPath))
|
|
||||||
version, err := s.GetNextVersion(*nextRepository, *nextForce)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Println(version)
|
|
||||||
if err = s.Release(*nextRepository); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
case setCommand.FullCommand():
|
|
||||||
setLoglevel(*loglevel)
|
|
||||||
log.Infof("Version %s", *setVersion)
|
|
||||||
s := semanticrelease.New(readConfig(setConfigPath))
|
|
||||||
err := s.SetVersion(*setVersion, *setRepository)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if err = s.Release(*setRepository); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
case getChangelog.FullCommand():
|
|
||||||
setLoglevel(*loglevel)
|
|
||||||
s := semanticrelease.New(readConfig(getChangelogConfigPath))
|
|
||||||
changelog, err := s.GetChangelog(*getChangelogRepository)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if err = s.WriteChangeLog(changelog, *getChangelogFile); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func readConfig(path *string) *config.ReleaseConfig {
|
|
||||||
releaseConfig, err := config.Read(*path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
return releaseConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
func setLoglevel(level string) {
|
|
||||||
parsed, err := log.ParseLevel(level)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Invalid loglevel %s", level)
|
|
||||||
} else {
|
|
||||||
log.SetLevel(parsed)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
16
go.mod
16
go.mod
@@ -4,12 +4,18 @@ go 1.12
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Masterminds/semver v1.4.2
|
github.com/Masterminds/semver v1.4.2
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc // indirect
|
github.com/google/go-cmp v0.3.0 // indirect
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf // indirect
|
|
||||||
github.com/google/go-github/v25 v25.1.1
|
github.com/google/go-github/v25 v25.1.1
|
||||||
github.com/sirupsen/logrus v1.4.1
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
|
github.com/pkg/errors v0.8.1 // indirect
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6
|
github.com/sirupsen/logrus v1.4.2
|
||||||
|
github.com/spf13/cobra v0.0.5
|
||||||
|
github.com/stretchr/testify v1.3.0 // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 // indirect
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
|
||||||
|
golang.org/x/sys v0.0.0-20190614160838-b47fdc937951 // indirect
|
||||||
|
google.golang.org/appengine v1.6.1 // indirect
|
||||||
gopkg.in/src-d/go-git.v4 v4.11.0
|
gopkg.in/src-d/go-git.v4 v4.11.0
|
||||||
gopkg.in/yaml.v2 v2.2.2
|
gopkg.in/yaml.v2 v2.2.2
|
||||||
)
|
)
|
||||||
|
|||||||
81
go.sum
81
go.sum
@@ -1,29 +1,43 @@
|
|||||||
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc=
|
github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc=
|
||||||
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||||
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
|
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
|
||||||
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
|
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
|
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
|
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||||
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
|
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||||
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
|
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/emirpasic/gods v1.9.0 h1:rUF4PuzEjMChMiNsVjdI+SyLu7rEqpQ5reNFnhC7oFo=
|
github.com/emirpasic/gods v1.9.0 h1:rUF4PuzEjMChMiNsVjdI+SyLu7rEqpQ5reNFnhC7oFo=
|
||||||
github.com/emirpasic/gods v1.9.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
github.com/emirpasic/gods v1.9.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
|
||||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/gliderlabs/ssh v0.1.1 h1:j3L6gSLQalDETeEg/Jg0mGY0/y/N6zI2xX1978P0Uqw=
|
github.com/gliderlabs/ssh v0.1.1 h1:j3L6gSLQalDETeEg/Jg0mGY0/y/N6zI2xX1978P0Uqw=
|
||||||
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-github/v25 v25.1.1 h1:6eW++i/CXcR5GKfYaaJT7oJJtHNU+/iiw55noEPNVao=
|
github.com/google/go-github/v25 v25.1.1 h1:6eW++i/CXcR5GKfYaaJT7oJJtHNU+/iiw55noEPNVao=
|
||||||
github.com/google/go-github/v25 v25.1.1/go.mod h1:6z5pC69qHtrPJ0sXPsj4BLnd82b+r6sLB7qcBoRZqpw=
|
github.com/google/go-github/v25 v25.1.1/go.mod h1:6z5pC69qHtrPJ0sXPsj4BLnd82b+r6sLB7qcBoRZqpw=
|
||||||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
||||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||||
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
@@ -31,53 +45,102 @@ github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e h1:RgQk53JHp
|
|||||||
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0=
|
github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0=
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA=
|
github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA=
|
||||||
github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
|
github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
|
||||||
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||||
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
|
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||||
|
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
||||||
|
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
|
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
|
||||||
|
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||||
|
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||||
|
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
||||||
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||||
github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4=
|
github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4=
|
||||||
github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
|
github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||||
github.com/xanzy/ssh-agent v0.2.0 h1:Adglfbi5p9Z0BmK2oKU9nTG+zKfniSfnaMYB+ULd+Ro=
|
github.com/xanzy/ssh-agent v0.2.0 h1:Adglfbi5p9Z0BmK2oKU9nTG+zKfniSfnaMYB+ULd+Ro=
|
||||||
github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8=
|
github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8=
|
||||||
|
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU=
|
||||||
|
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9 h1:lkiLiLBHGoH3XnqSLUIaBsilGMUjI+Uy2Xu2JLUtTas=
|
golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9 h1:lkiLiLBHGoH3XnqSLUIaBsilGMUjI+Uy2Xu2JLUtTas=
|
||||||
golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190614160838-b47fdc937951 h1:ZUgGZ7PSkne6oY+VgAvayrB16owfm9/DKAtgWubzgzU=
|
||||||
|
golang.org/x/sys v0.0.0-20190614160838-b47fdc937951/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs=
|
google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
|
||||||
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ func New(format string, config config.ChangelogConfig) (*Analyzer, error) {
|
|||||||
log.Debugf("Commit format set to angular")
|
log.Debugf("Commit format set to angular")
|
||||||
analyzer.analyzeCommit = newAngular()
|
analyzer.analyzeCommit = newAngular()
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("Invalid commit format: %s", format)
|
return nil, fmt.Errorf("invalid commit format: %s", format)
|
||||||
}
|
}
|
||||||
return analyzer, nil
|
return analyzer, nil
|
||||||
|
|
||||||
|
|||||||
@@ -107,6 +107,6 @@ func (a *angular) analyze(commit gitutil.Commit, rule Rule) (AnalyzedCommit, boo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Tracef("%s does not match %s, skip", commit.Message, rule.Tag)
|
log.Tracef("%s does not match %s, skip", commit.Message, rule.Tag)
|
||||||
return analyzed, false, fmt.Errorf("Not found")
|
return analyzed, false, fmt.Errorf("not found")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
35
internal/cache/cache.go
vendored
35
internal/cache/cache.go
vendored
@@ -3,40 +3,49 @@ package cache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"path"
|
||||||
|
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// VersionFileContent struct
|
// ReleaseVersion struct
|
||||||
type VersionFileContent struct {
|
type ReleaseVersion struct {
|
||||||
Version string `yaml:"version"`
|
Last ReleaseVersionEntry `yaml:"last"`
|
||||||
NextVersion string `yaml:"nextVersion"`
|
Next ReleaseVersionEntry `yaml:"next"`
|
||||||
Commit string `yaml:"commit"`
|
Branch string `yaml:"branch"`
|
||||||
Branch string `yaml:"branch"`
|
}
|
||||||
|
|
||||||
|
//ReleaseVersionEntry struct
|
||||||
|
type ReleaseVersionEntry struct {
|
||||||
|
Commit string `yaml:"commit"`
|
||||||
|
Version string `yaml:"version"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write version into .version
|
// Write version into .version
|
||||||
func Write(versionFileContent VersionFileContent) error {
|
func Write(repository string, versionFileContent ReleaseVersion) error {
|
||||||
|
completePath := path.Join(path.Dir(repository), ".version")
|
||||||
|
|
||||||
data, err := yaml.Marshal(&versionFileContent)
|
data, err := yaml.Marshal(&versionFileContent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return ioutil.WriteFile(".version", data, 0644)
|
return ioutil.WriteFile(completePath, data, 0644)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read version into .version
|
// Read version into .version
|
||||||
func Read() (*VersionFileContent, error) {
|
func Read(repository string) (*ReleaseVersion, error) {
|
||||||
|
completePath := path.Join(path.Dir(repository), ".version")
|
||||||
|
|
||||||
content, err := ioutil.ReadFile(".version")
|
content, err := ioutil.ReadFile(completePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &VersionFileContent{}, err
|
return &ReleaseVersion{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var versionFileContent VersionFileContent
|
var versionFileContent ReleaseVersion
|
||||||
err = yaml.Unmarshal(content, &versionFileContent)
|
err = yaml.Unmarshal(content, &versionFileContent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &VersionFileContent{}, err
|
return &ReleaseVersion{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &versionFileContent, nil
|
return &versionFileContent, nil
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Nightapes/go-semantic-release/internal/analyzer"
|
"github.com/Nightapes/go-semantic-release/internal/analyzer"
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||||
"github.com/Nightapes/go-semantic-release/pkg/config"
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
@@ -49,7 +50,7 @@ func New(config *config.ReleaseConfig, rules []analyzer.Rule) *Changelog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GenerateChanglog from given commits
|
// GenerateChanglog from given commits
|
||||||
func (c *Changelog) GenerateChanglog(version, url string, analyzedCommits map[string][]analyzer.AnalyzedCommit) (string, string, error) {
|
func (c *Changelog) GenerateChanglog(templateConfig shared.ChangelogTemplateConfig, analyzedCommits map[string][]analyzer.AnalyzedCommit) (*shared.GeneratedChangelog, error) {
|
||||||
|
|
||||||
commitsPerScope := map[string][]analyzer.AnalyzedCommit{}
|
commitsPerScope := map[string][]analyzer.AnalyzedCommit{}
|
||||||
order := make([]string, 0)
|
order := make([]string, 0)
|
||||||
@@ -73,22 +74,22 @@ func (c *Changelog) GenerateChanglog(version, url string, analyzedCommits map[st
|
|||||||
}
|
}
|
||||||
|
|
||||||
changelogContent := changelogContent{
|
changelogContent := changelogContent{
|
||||||
Version: version,
|
Version: templateConfig.Version,
|
||||||
Commits: commitsPerScope,
|
Commits: commitsPerScope,
|
||||||
Now: time.Now(),
|
Now: time.Now(),
|
||||||
Backtick: "`",
|
Backtick: "`",
|
||||||
Order: order,
|
Order: order,
|
||||||
HasURL: url != "",
|
HasURL: templateConfig.CommitURL != "",
|
||||||
URL: url,
|
URL: templateConfig.CommitURL,
|
||||||
}
|
}
|
||||||
|
|
||||||
title, err := generateTemplate(defaultChangelogTitle, changelogContent)
|
title, err := generateTemplate(defaultChangelogTitle, changelogContent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return nil, err
|
||||||
}
|
}
|
||||||
content, err := generateTemplate(defaultChangelog, changelogContent)
|
content, err := generateTemplate(defaultChangelog, changelogContent)
|
||||||
|
|
||||||
return title, content, err
|
return &shared.GeneratedChangelog{Title: title, Content: content}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateTemplate(text string, values changelogContent) (string, error) {
|
func generateTemplate(text string, values changelogContent) (string, error) {
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ func (g *GitUtil) GetCommits(lastTagHash string) ([]Commit, error) {
|
|||||||
log.Debugf("Found commit with hash %s, will stop here", c.Hash.String())
|
log.Debugf("Found commit with hash %s, will stop here", c.Hash.String())
|
||||||
foundEnd = true
|
foundEnd = true
|
||||||
}
|
}
|
||||||
|
log.Tracef("Found commit with hash %s", c.Hash.String())
|
||||||
if !foundEnd {
|
if !foundEnd {
|
||||||
commit := Commit{
|
commit := Commit{
|
||||||
Message: c.Message,
|
Message: c.Message,
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
package releaser
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"github.com/Nightapes/go-semantic-release/pkg/config"
|
|
||||||
"github.com/google/go-github/v25/github"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GITHUB identifer for github interface
|
|
||||||
const GITHUB = "GitHub"
|
|
||||||
|
|
||||||
// GitHubReleaser type struct
|
|
||||||
type GitHubReleaser struct {
|
|
||||||
config *config.ReleaseConfig
|
|
||||||
client *github.Client
|
|
||||||
context context.Context
|
|
||||||
release *github.RepositoryRelease
|
|
||||||
}
|
|
||||||
|
|
||||||
type gitHubCreateReleaseResponse struct {
|
|
||||||
ReleaseURL string `json:url`
|
|
||||||
AssetUploadURL string `json:upload_url`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewGitHubReleaser initialize a new GitHubRelease
|
|
||||||
func NewGitHubReleaser(c *config.ReleaseConfig) *GitHubReleaser {
|
|
||||||
ctx := context.Background()
|
|
||||||
httpClient := createHTTPClient(ctx, c.GitProvider.AccessToken)
|
|
||||||
|
|
||||||
return &GitHubReleaser{
|
|
||||||
config: c,
|
|
||||||
client: github.NewClient(httpClient),
|
|
||||||
context: ctx,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateRelease creates release on remote
|
|
||||||
func (g GitHubReleaser) CreateRelease(tag, releaseName, releaseMessage, targetBranch string) error {
|
|
||||||
|
|
||||||
release, resp, err := g.client.Repositories.CreateRelease(g.context, g.config.GitProvider.User, g.config.GitProvider.Repo, &github.RepositoryRelease{
|
|
||||||
TagName: &tag,
|
|
||||||
TargetCommitish: &targetBranch,
|
|
||||||
Name: &releaseName,
|
|
||||||
Body: &releaseMessage,
|
|
||||||
Draft: &g.config.IsDraft,
|
|
||||||
Prerelease: &g.config.IsPreRelease,
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("releaser: github: Could not create release: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp.StatusCode >= http.StatusBadRequest {
|
|
||||||
return fmt.Errorf("releaser: github: Could not create release: response statuscode: %s", resp.Status)
|
|
||||||
}
|
|
||||||
|
|
||||||
g.release = release
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// UploadAssets uploads specified assets
|
|
||||||
func (g GitHubReleaser) UploadAssets(assets []config.Asset) error {
|
|
||||||
for _, asset := range assets {
|
|
||||||
file, err := os.Open(asset.Name)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, resp, err := g.client.Repositories.UploadReleaseAsset(g.context, g.config.GitProvider.User, g.config.GitProvider.Repo, *g.release.ID, &github.UploadOptions{Name: asset.Name}, file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp.StatusCode >= http.StatusBadRequest {
|
|
||||||
return fmt.Errorf("releaser: github: Could not create release: response statuscode: %s", resp.Status)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
128
internal/releaser/github/github.go
Normal file
128
internal/releaser/github/github.go
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
package github
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/releaser/util"
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||||
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
||||||
|
|
||||||
|
"github.com/google/go-github/v25/github"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GITHUB identifer for github interface
|
||||||
|
const GITHUB = "github"
|
||||||
|
|
||||||
|
// Client type struct
|
||||||
|
type Client struct {
|
||||||
|
config *config.GitHubProvider
|
||||||
|
client *github.Client
|
||||||
|
context context.Context
|
||||||
|
release *github.RepositoryRelease
|
||||||
|
baseURL string
|
||||||
|
token string
|
||||||
|
}
|
||||||
|
|
||||||
|
// New initialize a new GitHubRelease
|
||||||
|
func New(c *config.GitHubProvider) (*Client, error) {
|
||||||
|
ctx := context.Background()
|
||||||
|
httpClient := util.CreateBearerHTTPClient(ctx, c.AccessToken)
|
||||||
|
|
||||||
|
var client *github.Client
|
||||||
|
var err error
|
||||||
|
baseURL := "https://github.com"
|
||||||
|
if c.CustomURL == "" {
|
||||||
|
client = github.NewClient(httpClient)
|
||||||
|
} else {
|
||||||
|
client, err = github.NewEnterpriseClient(c.CustomURL, c.CustomURL+"/api/v3/", httpClient)
|
||||||
|
baseURL = c.CustomURL
|
||||||
|
}
|
||||||
|
return &Client{
|
||||||
|
config: c,
|
||||||
|
client: client,
|
||||||
|
context: ctx,
|
||||||
|
baseURL: baseURL,
|
||||||
|
}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
//GetCommitURL for github
|
||||||
|
func (g Client) GetCommitURL() string {
|
||||||
|
return fmt.Sprintf("%s/%s/%s/commit/{{hash}}", g.baseURL, g.config.User, g.config.Repo)
|
||||||
|
}
|
||||||
|
|
||||||
|
//GetCompareURL for github
|
||||||
|
func (g Client) GetCompareURL(oldVersion, newVersion string) string {
|
||||||
|
return fmt.Sprintf("%s/%s/%s/compare/%s...%s", g.baseURL, g.config.User, g.config.Repo, oldVersion, newVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
//ValidateConfig for github
|
||||||
|
func (g Client) ValidateConfig() error {
|
||||||
|
|
||||||
|
if g.config.Repo == "" {
|
||||||
|
return fmt.Errorf("github Repro is not set")
|
||||||
|
}
|
||||||
|
|
||||||
|
if g.config.User == "" {
|
||||||
|
return fmt.Errorf("github User is not set")
|
||||||
|
}
|
||||||
|
|
||||||
|
envName := fmt.Sprintf("%s_ACCESS_TOKEN", strings.ToUpper(GITHUB))
|
||||||
|
token, isSet := os.LookupEnv(envName)
|
||||||
|
if !isSet {
|
||||||
|
return fmt.Errorf("can not find environment variable %s", envName)
|
||||||
|
}
|
||||||
|
g.token = token
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateRelease creates release on remote
|
||||||
|
func (g Client) CreateRelease(releaseVersion *shared.ReleaseVersion, generatedChangelog *shared.GeneratedChangelog) error {
|
||||||
|
|
||||||
|
tag := releaseVersion.Next.Version.String()
|
||||||
|
prerelease := releaseVersion.Next.Version.Prerelease() != ""
|
||||||
|
release, resp, err := g.client.Repositories.CreateRelease(g.context, g.config.User, g.config.Repo, &github.RepositoryRelease{
|
||||||
|
TagName: &tag,
|
||||||
|
TargetCommitish: &releaseVersion.Branch,
|
||||||
|
Name: &generatedChangelog.Title,
|
||||||
|
Body: &generatedChangelog.Content,
|
||||||
|
Draft: &prerelease,
|
||||||
|
Prerelease: &prerelease,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not create release: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode >= http.StatusBadRequest {
|
||||||
|
return fmt.Errorf("could not create release: response statuscode: %s", resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
g.release = release
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// UploadAssets uploads specified assets
|
||||||
|
func (g Client) UploadAssets(assets []config.Asset) error {
|
||||||
|
for _, asset := range assets {
|
||||||
|
file, err := os.Open(asset.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, resp, err := g.client.Repositories.UploadReleaseAsset(g.context, g.config.User, g.config.Repo, *g.release.ID, &github.UploadOptions{Name: asset.Name}, file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode >= http.StatusBadRequest {
|
||||||
|
return fmt.Errorf("releaser: github: Could not create release: response statuscode: %s", resp.Status)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
package releaser
|
package releaser
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/releaser/github"
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||||
|
|
||||||
"github.com/Nightapes/go-semantic-release/pkg/config"
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
||||||
"golang.org/x/oauth2"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Releasers struct type
|
// Releasers struct type
|
||||||
@@ -16,8 +16,11 @@ type Releasers struct {
|
|||||||
|
|
||||||
// Releaser interface for providers
|
// Releaser interface for providers
|
||||||
type Releaser interface {
|
type Releaser interface {
|
||||||
CreateRelease(tag, releaseName, releaseMessage, targetBranch string) error
|
ValidateConfig() error
|
||||||
|
CreateRelease(*shared.ReleaseVersion, *shared.GeneratedChangelog) error
|
||||||
UploadAssets(assets []config.Asset) error
|
UploadAssets(assets []config.Asset) error
|
||||||
|
GetCommitURL() string
|
||||||
|
GetCompareURL(oldVersion, newVersion string) string
|
||||||
}
|
}
|
||||||
|
|
||||||
// New initialize a Relerser
|
// New initialize a Relerser
|
||||||
@@ -29,38 +32,26 @@ func New(c *config.ReleaseConfig) *Releasers {
|
|||||||
|
|
||||||
//GetReleaser returns an initialized releaser
|
//GetReleaser returns an initialized releaser
|
||||||
func (r *Releasers) GetReleaser() (Releaser, error) {
|
func (r *Releasers) GetReleaser() (Releaser, error) {
|
||||||
switch r.config.GitProvider.Name {
|
switch r.config.Release {
|
||||||
case GITHUB:
|
case github.GITHUB:
|
||||||
return NewGitHubReleaser(r.config), nil
|
return github.New(&r.config.GitHubProvider)
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("Could not initialize a releaser from this type: %s", r.config.GitProvider.Name)
|
return nil, fmt.Errorf("could not initialize a releaser from this type: %s", r.config.Release)
|
||||||
}
|
}
|
||||||
|
|
||||||
// tbd. http helper function
|
// func checkIfAssetsExists(assets []config.Asset) error {
|
||||||
|
// var missingAssets []string
|
||||||
|
// for _, asset := range assets {
|
||||||
|
|
||||||
func createHTTPClient(ctx context.Context, token string) *http.Client {
|
// if _, err := os.Stat(asset.Name); err != nil {
|
||||||
tokenSource := oauth2.StaticTokenSource(&oauth2.Token{
|
// missingAssets = append(missingAssets, asset.Name)
|
||||||
AccessToken: token},
|
// }
|
||||||
)
|
// }
|
||||||
|
|
||||||
client := oauth2.NewClient(ctx, tokenSource)
|
// if len(missingAssets) != 0 {
|
||||||
|
// return fmt.Errorf("could not find specified Asset: %+v ", assets)
|
||||||
|
// }
|
||||||
|
|
||||||
return client
|
// return nil
|
||||||
}
|
|
||||||
|
|
||||||
func checkIfAssetsExists(assets []config.Asset) error {
|
// }
|
||||||
var missingAssets []string
|
|
||||||
for _, asset := range assets {
|
|
||||||
|
|
||||||
if _, err := os.Stat(asset.Name); err != nil {
|
|
||||||
missingAssets = append(missingAssets, asset.Name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(missingAssets) != 0 {
|
|
||||||
return fmt.Errorf("Could not find specified Asset: %+v ", assets)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|||||||
19
internal/releaser/util/util.go
Normal file
19
internal/releaser/util/util.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"golang.org/x/oauth2"
|
||||||
|
)
|
||||||
|
|
||||||
|
//CreateBearerHTTPClient with given token
|
||||||
|
func CreateBearerHTTPClient(ctx context.Context, token string) *http.Client {
|
||||||
|
tokenSource := oauth2.StaticTokenSource(&oauth2.Token{
|
||||||
|
AccessToken: token},
|
||||||
|
)
|
||||||
|
|
||||||
|
client := oauth2.NewClient(ctx, tokenSource)
|
||||||
|
|
||||||
|
return client
|
||||||
|
}
|
||||||
32
internal/shared/shared.go
Normal file
32
internal/shared/shared.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package shared
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Masterminds/semver"
|
||||||
|
)
|
||||||
|
|
||||||
|
//ReleaseVersion struct
|
||||||
|
type ReleaseVersion struct {
|
||||||
|
Last ReleaseVersionEntry
|
||||||
|
Next ReleaseVersionEntry
|
||||||
|
Branch string
|
||||||
|
}
|
||||||
|
|
||||||
|
//ReleaseVersionEntry struct
|
||||||
|
type ReleaseVersionEntry struct {
|
||||||
|
Commit string
|
||||||
|
Version *semver.Version
|
||||||
|
}
|
||||||
|
|
||||||
|
//GeneratedChangelog struct
|
||||||
|
type GeneratedChangelog struct {
|
||||||
|
Title string
|
||||||
|
Content string
|
||||||
|
}
|
||||||
|
|
||||||
|
//GenerateChangelogConfig struct
|
||||||
|
type ChangelogTemplateConfig struct {
|
||||||
|
CommitURL string
|
||||||
|
CompareURL string
|
||||||
|
Hash string
|
||||||
|
Version string
|
||||||
|
}
|
||||||
@@ -2,18 +2,12 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// List of all supported git providers
|
|
||||||
var gitProviders = map[string]string{"GitHub": "https://github.com/", "GitLab": "https://gitlab.com/"}
|
|
||||||
|
|
||||||
// ChangelogConfig struct
|
// ChangelogConfig struct
|
||||||
type ChangelogConfig struct {
|
type ChangelogConfig struct {
|
||||||
PrintAll bool `yaml:"printAll,omitempty"`
|
PrintAll bool `yaml:"printAll,omitempty"`
|
||||||
@@ -21,28 +15,27 @@ type ChangelogConfig struct {
|
|||||||
TemplatePath string `yaml:"templatePath,omitempty"`
|
TemplatePath string `yaml:"templatePath,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GitProvider struct
|
|
||||||
type GitProvider struct {
|
|
||||||
Name string `yaml:"name"`
|
|
||||||
Repo string `yaml:"repo"`
|
|
||||||
User string `yaml:"user"`
|
|
||||||
customProviderURL string `yaml:"customURL"`
|
|
||||||
AccessToken string
|
|
||||||
}
|
|
||||||
|
|
||||||
//Asset type struct
|
//Asset type struct
|
||||||
type Asset struct {
|
type Asset struct {
|
||||||
Name string `yaml:"name"`
|
Name string `yaml:"name"`
|
||||||
Compress bool `yaml:"compress"`
|
Compress bool `yaml:"compress"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GitHubProvider struct
|
||||||
|
type GitHubProvider struct {
|
||||||
|
Repo string `yaml:"repo"`
|
||||||
|
User string `yaml:"user"`
|
||||||
|
CustomURL string `yaml:"customUrl,omitempty"`
|
||||||
|
AccessToken string
|
||||||
|
}
|
||||||
|
|
||||||
// ReleaseConfig struct
|
// ReleaseConfig struct
|
||||||
type ReleaseConfig struct {
|
type ReleaseConfig struct {
|
||||||
CommitFormat string `yaml:"commitFormat"`
|
CommitFormat string `yaml:"commitFormat"`
|
||||||
Branch map[string]string `yaml:"branch"`
|
Branch map[string]string `yaml:"branch"`
|
||||||
Changelog ChangelogConfig `yaml:"changelog,omitempty"`
|
Changelog ChangelogConfig `yaml:"changelog,omitempty"`
|
||||||
Release string `yaml:"release,omitempty"`
|
Release string `yaml:"release,omitempty"`
|
||||||
GitProvider GitProvider `yaml:"provider,omitempty"`
|
GitHubProvider GitHubProvider `yaml:"github,omitempty"`
|
||||||
Assets []Asset `yaml:"assets"`
|
Assets []Asset `yaml:"assets"`
|
||||||
ReleaseTitle string `yaml:"title"`
|
ReleaseTitle string `yaml:"title"`
|
||||||
IsPreRelease, IsDraft bool
|
IsPreRelease, IsDraft bool
|
||||||
@@ -64,36 +57,5 @@ func Read(configPath string) (*ReleaseConfig, error) {
|
|||||||
|
|
||||||
log.Debugf("Found config %+v", releaseConfig)
|
log.Debugf("Found config %+v", releaseConfig)
|
||||||
|
|
||||||
releaseConfig, err = checkProvider(releaseConfig)
|
|
||||||
if err != nil {
|
|
||||||
return &ReleaseConfig{}, err
|
|
||||||
}
|
|
||||||
return &releaseConfig, nil
|
return &releaseConfig, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkProvider(config ReleaseConfig) (ReleaseConfig, error) {
|
|
||||||
if config.GitProvider != (GitProvider{}) {
|
|
||||||
if _, ok := gitProviders[config.GitProvider.Name]; !ok {
|
|
||||||
return ReleaseConfig{}, fmt.Errorf("config: provider: configured provider %s is not supported", config.GitProvider.Name)
|
|
||||||
}
|
|
||||||
envName := fmt.Sprintf("%s_ACCESS_TOKEN", strings.ToUpper(config.GitProvider.Name))
|
|
||||||
|
|
||||||
token, isSet := os.LookupEnv(envName)
|
|
||||||
if !isSet {
|
|
||||||
return ReleaseConfig{}, fmt.Errorf("config: Can not find environment variable %s", envName)
|
|
||||||
}
|
|
||||||
config.GitProvider.AccessToken = token
|
|
||||||
} else {
|
|
||||||
log.Debugln("No provider is set, will continue")
|
|
||||||
}
|
|
||||||
return config, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRepositoryURL returns the repo FQDN
|
|
||||||
func (c *ReleaseConfig) GetRepositoryURL() string {
|
|
||||||
if c.GitProvider.customProviderURL != "" {
|
|
||||||
return fmt.Sprintf("%s/%s/%s/", c.GitProvider.customProviderURL, c.GitProvider.User, c.GitProvider.Repo)
|
|
||||||
} else {
|
|
||||||
return fmt.Sprintf("%s/%s/%s/", gitProviders[c.GitProvider.Name], c.GitProvider.User, c.GitProvider.Repo)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
87
pkg/semanticrelease/helper.go
Normal file
87
pkg/semanticrelease/helper.go
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
package semanticrelease
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/Masterminds/semver"
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/cache"
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *SemanticRelease) incPrerelease(preReleaseType string, version semver.Version) semver.Version {
|
||||||
|
defaultPrerelease := preReleaseType + ".0"
|
||||||
|
if version.Prerelease() == "" || !strings.HasPrefix(version.Prerelease(), preReleaseType) {
|
||||||
|
version, _ = version.SetPrerelease(defaultPrerelease)
|
||||||
|
} else {
|
||||||
|
parts := strings.Split(version.Prerelease(), ".")
|
||||||
|
if len(parts) == 2 {
|
||||||
|
i, err := strconv.Atoi(parts[1])
|
||||||
|
if err != nil {
|
||||||
|
version, _ = version.SetPrerelease(defaultPrerelease)
|
||||||
|
log.Warnf("Could not parse release tag %s, use version %s", version.Prerelease(), version.String())
|
||||||
|
} else {
|
||||||
|
version, _ = version.SetPrerelease(preReleaseType + "." + strconv.Itoa((i + 1)))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
version, _ = version.SetPrerelease(defaultPrerelease)
|
||||||
|
log.Warnf("Could not parse release tag %s, use version %s", version.Prerelease(), version.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return version
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SemanticRelease) saveToCache(releaseVersion shared.ReleaseVersion) error {
|
||||||
|
|
||||||
|
toCache := cache.ReleaseVersion{
|
||||||
|
Next: cache.ReleaseVersionEntry{
|
||||||
|
Commit: releaseVersion.Next.Commit,
|
||||||
|
Version: releaseVersion.Next.Version.String(),
|
||||||
|
},
|
||||||
|
Last: cache.ReleaseVersionEntry{
|
||||||
|
Commit: releaseVersion.Last.Commit,
|
||||||
|
Version: releaseVersion.Last.Version.String(),
|
||||||
|
},
|
||||||
|
Branch: releaseVersion.Branch,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Save %s with hash %s to cache", releaseVersion.Next.Version.String(), releaseVersion.Next.Commit)
|
||||||
|
return cache.Write(s.repository, toCache)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SemanticRelease) readFromCache(currentHash string) (*shared.ReleaseVersion, error) {
|
||||||
|
content, err := cache.Read(s.repository)
|
||||||
|
|
||||||
|
if err == nil && content.Next.Commit == currentHash {
|
||||||
|
|
||||||
|
nextVersion, err := semver.NewVersion(content.Next.Version)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
lastVersion, err := semver.NewVersion(content.Last.Version)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
releaseVersion := &shared.ReleaseVersion{
|
||||||
|
Next: shared.ReleaseVersionEntry{
|
||||||
|
Commit: content.Next.Commit,
|
||||||
|
Version: nextVersion,
|
||||||
|
},
|
||||||
|
Last: shared.ReleaseVersionEntry{
|
||||||
|
Commit: content.Last.Commit,
|
||||||
|
Version: lastVersion,
|
||||||
|
},
|
||||||
|
Branch: content.Branch,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("Found cache, will return cached version %s", content.Next.Version)
|
||||||
|
return releaseVersion, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
log.Debugf("Mismatch git and version file %s - %s", content.Next.Commit, currentHash)
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
@@ -1,61 +1,83 @@
|
|||||||
// Package semanticrelease provides public methods to include in own code
|
|
||||||
package semanticrelease
|
package semanticrelease
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Masterminds/semver"
|
"github.com/Masterminds/semver"
|
||||||
"github.com/Nightapes/go-semantic-release/internal/analyzer"
|
"github.com/Nightapes/go-semantic-release/internal/analyzer"
|
||||||
"github.com/Nightapes/go-semantic-release/internal/cache"
|
|
||||||
"github.com/Nightapes/go-semantic-release/internal/changelog"
|
"github.com/Nightapes/go-semantic-release/internal/changelog"
|
||||||
"github.com/Nightapes/go-semantic-release/internal/gitutil"
|
"github.com/Nightapes/go-semantic-release/internal/gitutil"
|
||||||
"github.com/Nightapes/go-semantic-release/internal/releaser"
|
"github.com/Nightapes/go-semantic-release/internal/releaser"
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||||
"github.com/Nightapes/go-semantic-release/pkg/config"
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SemanticRelease struct
|
// SemanticRelease struct
|
||||||
type SemanticRelease struct {
|
type SemanticRelease struct {
|
||||||
config *config.ReleaseConfig
|
config *config.ReleaseConfig
|
||||||
|
gitutil *gitutil.GitUtil
|
||||||
|
analyzer *analyzer.Analyzer
|
||||||
|
releaser releaser.Releaser
|
||||||
|
repository string
|
||||||
}
|
}
|
||||||
|
|
||||||
// New SemanticRelease struct
|
// New SemanticRelease struct
|
||||||
func New(c *config.ReleaseConfig) *SemanticRelease {
|
func New(c *config.ReleaseConfig, repository string) (*SemanticRelease, error) {
|
||||||
return &SemanticRelease{
|
util, err := gitutil.New(repository)
|
||||||
config: c,
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
analyzer, err := analyzer.New(c.CommitFormat, c.Changelog)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
releaser, err := releaser.New(c).GetReleaser()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &SemanticRelease{
|
||||||
|
config: c,
|
||||||
|
gitutil: util,
|
||||||
|
releaser: releaser,
|
||||||
|
analyzer: analyzer,
|
||||||
|
repository: repository,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNextVersion from .version or calculate new from commits
|
// GetNextVersion from .version or calculate new from commits
|
||||||
func (s *SemanticRelease) GetNextVersion(repo string, force bool) (string, error) {
|
func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, error) {
|
||||||
util, err := gitutil.New(repo)
|
hash, err := s.gitutil.GetHash()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return nil, err
|
||||||
}
|
|
||||||
|
|
||||||
hash, err := util.GetHash()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("Ignore .version file if exits, %t", force)
|
log.Debugf("Ignore .version file if exits, %t", force)
|
||||||
if !force {
|
if !force {
|
||||||
content, err := cache.Read()
|
releaseVersion, err := s.readFromCache(hash)
|
||||||
|
if err != nil {
|
||||||
if err == nil && content.Commit == hash {
|
return nil, err
|
||||||
log.Infof("Found cache, will return cached version %s", content.NextVersion)
|
}
|
||||||
return content.NextVersion, err
|
|
||||||
|
if releaseVersion != nil {
|
||||||
|
return releaseVersion, nil
|
||||||
}
|
}
|
||||||
log.Debugf("Mismatch git and version file %s - %s", content.Commit, hash)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lastVersion, lastVersionHash, err := util.GetLastVersion()
|
currentBranch, err := s.gitutil.GetBranch()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var newVersion semver.Version
|
var newVersion semver.Version
|
||||||
|
|
||||||
if lastVersion == nil {
|
if lastVersion == nil {
|
||||||
@@ -66,30 +88,25 @@ func (s *SemanticRelease) GetNextVersion(repo string, force bool) (string, error
|
|||||||
newVersion = *lastVersion
|
newVersion = *lastVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
commits, err := util.GetCommits(lastVersionHash)
|
commits, err := s.gitutil.GetCommits(lastVersionHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return 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)
|
a, err := analyzer.New(s.config.CommitFormat, s.config.Changelog)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return nil, err
|
||||||
}
|
}
|
||||||
result := a.Analyze(commits)
|
result := a.Analyze(commits)
|
||||||
|
|
||||||
currentBranch, err := util.GetBranch()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
for branch, releaseType := range s.config.Branch {
|
for branch, releaseType := range s.config.Branch {
|
||||||
if currentBranch == branch || strings.HasPrefix(currentBranch, branch) {
|
if currentBranch == branch || strings.HasPrefix(currentBranch, branch) {
|
||||||
log.Debugf("Found branch config for branch %s with release type %s", currentBranch, releaseType)
|
log.Debugf("Found branch config for branch %s with release type %s", currentBranch, releaseType)
|
||||||
switch releaseType {
|
switch releaseType {
|
||||||
case "rc", "beta", "alpha":
|
case "rc", "beta", "alpha":
|
||||||
newVersion = incPrerelease(releaseType, newVersion)
|
newVersion = s.incPrerelease(releaseType, newVersion)
|
||||||
case "release":
|
case "release":
|
||||||
if len(result["major"]) > 0 {
|
if len(result["major"]) > 0 {
|
||||||
newVersion = newVersion.IncMajor()
|
newVersion = newVersion.IncMajor()
|
||||||
@@ -102,121 +119,83 @@ func (s *SemanticRelease) GetNextVersion(repo string, force bool) (string, error
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("New version %s -> %s", lastVersion.String(), newVersion.String())
|
releaseVersion := shared.ReleaseVersion{
|
||||||
err = saveToCache(util, lastVersion, &newVersion)
|
Next: shared.ReleaseVersionEntry{
|
||||||
if err != nil {
|
Commit: hash,
|
||||||
return "", err
|
Version: &newVersion,
|
||||||
|
},
|
||||||
|
Last: shared.ReleaseVersionEntry{
|
||||||
|
Commit: lastVersionHash,
|
||||||
|
Version: lastVersion,
|
||||||
|
},
|
||||||
|
Branch: currentBranch,
|
||||||
}
|
}
|
||||||
return newVersion.String(), err
|
|
||||||
|
log.Infof("New version %s -> %s", lastVersion.String(), newVersion.String())
|
||||||
|
err = s.saveToCache(releaseVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &releaseVersion, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//SetVersion for git repository
|
//SetVersion for git repository
|
||||||
func (s *SemanticRelease) SetVersion(version string, repo string) error {
|
func (s *SemanticRelease) SetVersion(version string) error {
|
||||||
|
|
||||||
util, err := gitutil.New(repo)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
newVersion, err := semver.NewVersion(version)
|
newVersion, err := semver.NewVersion(version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
lastVersion, _, err := util.GetLastVersion()
|
lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if lastVersion == nil {
|
||||||
|
lastVersion, _ = semver.NewVersion("1.0.0")
|
||||||
|
}
|
||||||
|
|
||||||
|
hash, err := s.gitutil.GetHash()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return saveToCache(util, lastVersion, newVersion)
|
currentBranch, err := s.gitutil.GetBranch()
|
||||||
}
|
|
||||||
|
|
||||||
func saveToCache(util *gitutil.GitUtil, lastVersion *semver.Version, nextVersion *semver.Version) error {
|
|
||||||
|
|
||||||
hash, err := util.GetHash()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
branch, err := util.GetBranch()
|
return s.saveToCache(shared.ReleaseVersion{
|
||||||
if err != nil {
|
Next: shared.ReleaseVersionEntry{
|
||||||
return err
|
Commit: hash,
|
||||||
}
|
Version: newVersion,
|
||||||
|
},
|
||||||
newVersionContent := cache.VersionFileContent{
|
Last: shared.ReleaseVersionEntry{
|
||||||
Commit: hash,
|
Commit: lastVersionHash,
|
||||||
NextVersion: nextVersion.String(),
|
Version: lastVersion,
|
||||||
Branch: branch,
|
},
|
||||||
}
|
Branch: currentBranch,
|
||||||
|
})
|
||||||
if lastVersion != nil {
|
|
||||||
newVersionContent.Version = lastVersion.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("Save %s with hash %s to cache", nextVersion.String(), hash)
|
|
||||||
return cache.Write(newVersionContent)
|
|
||||||
}
|
|
||||||
|
|
||||||
func incPrerelease(preReleaseType string, version semver.Version) semver.Version {
|
|
||||||
defaultPrerelease := preReleaseType + ".0"
|
|
||||||
if version.Prerelease() == "" || !strings.HasPrefix(version.Prerelease(), preReleaseType) {
|
|
||||||
version, _ = version.SetPrerelease(defaultPrerelease)
|
|
||||||
} else {
|
|
||||||
parts := strings.Split(version.Prerelease(), ".")
|
|
||||||
if len(parts) == 2 {
|
|
||||||
i, err := strconv.Atoi(parts[1])
|
|
||||||
if err != nil {
|
|
||||||
version, _ = version.SetPrerelease(defaultPrerelease)
|
|
||||||
log.Warnf("Could not parse release tag %s, use version %s", version.Prerelease(), version.String())
|
|
||||||
} else {
|
|
||||||
version, _ = version.SetPrerelease(preReleaseType + "." + strconv.Itoa((i + 1)))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
version, _ = version.SetPrerelease(defaultPrerelease)
|
|
||||||
log.Warnf("Could not parse release tag %s, use version %s", version.Prerelease(), version.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return version
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetChangelog from last version till now
|
// GetChangelog from last version till now
|
||||||
func (s *SemanticRelease) GetChangelog(repo string) (string, error) {
|
func (s *SemanticRelease) GetChangelog(releaseVersion *shared.ReleaseVersion) (*shared.GeneratedChangelog, error) {
|
||||||
nextVersion, err := s.GetNextVersion(repo, false)
|
commits, err := s.gitutil.GetCommits(releaseVersion.Last.Commit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf("Could not get next version")
|
return nil, err
|
||||||
return "", err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
util, err := gitutil.New(repo)
|
result := s.analyzer.Analyze(commits)
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, lastVersionHash, err := util.GetLastVersion()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
commits, err := util.GetCommits(lastVersionHash)
|
|
||||||
if err != nil {
|
|
||||||
return "", 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)
|
c := changelog.New(s.config, s.analyzer.GetRules())
|
||||||
if err != nil {
|
return c.GenerateChanglog(shared.ChangelogTemplateConfig{
|
||||||
return "", err
|
Version: releaseVersion.Next.Version.String(),
|
||||||
}
|
Hash: releaseVersion.Last.Commit,
|
||||||
result := a.Analyze(commits)
|
CommitURL: s.releaser.GetCommitURL(),
|
||||||
|
CompareURL: s.releaser.GetCompareURL(releaseVersion.Last.Version.String(), releaseVersion.Next.Version.String()),
|
||||||
c := changelog.New(s.config, a.GetRules())
|
}, result)
|
||||||
_, content, err := c.GenerateChanglog(nextVersion, s.config.GetRepositoryURL()+"/commit/{{hash}}", result)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return content, nil
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,38 +205,40 @@ func (s *SemanticRelease) WriteChangeLog(changelogContent, file string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Release pusblish release to provider
|
// Release pusblish release to provider
|
||||||
func (s *SemanticRelease) Release(repo string) error {
|
func (s *SemanticRelease) Release(force bool) error {
|
||||||
util, err := gitutil.New(repo)
|
currentBranch, err := s.gitutil.GetBranch()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
currentBranch, err := util.GetBranch()
|
|
||||||
|
|
||||||
if _, ok := s.config.Branch[currentBranch]; !ok {
|
if _, ok := s.config.Branch[currentBranch]; !ok {
|
||||||
log.Debugf("Will not perform a new release. Current %s branch is not configured in release config", currentBranch)
|
log.Debugf("Will not perform a new release. Current %s branch is not configured in release config", currentBranch)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
nextVersion, err := s.GetNextVersion(repo, false)
|
releaseVersion, err := s.GetNextVersion(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
|
||||||
}
|
}
|
||||||
|
|
||||||
changelog, err := s.GetChangelog(repo)
|
generatedChanglog, err := s.GetChangelog(releaseVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf("Could not get changelog")
|
log.Debugf("Could not get changelog")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
releaseTitle := fmt.Sprintf("%s v%s", s.config.ReleaseTitle, nextVersion)
|
|
||||||
|
|
||||||
releaser, err := releaser.New(s.config).GetReleaser()
|
releaser, err := releaser.New(s.config).GetReleaser()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = releaser.CreateRelease(nextVersion, releaseTitle, changelog, "master"); err != nil {
|
err = releaser.ValidateConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = releaser.CreateRelease(releaseVersion, generatedChanglog); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user