@@ -2,19 +2,20 @@ package main
22
33import (
44 "context"
5- "encoding/json"
65 "errors"
7- "flag"
86 "fmt"
97 "github.com/go-semantic-release/semantic-release/pkg/condition"
8+ "github.com/go-semantic-release/semantic-release/pkg/config"
109 "github.com/go-semantic-release/semantic-release/pkg/semrel"
1110 "github.com/go-semantic-release/semantic-release/pkg/update"
11+ "github.com/urfave/cli/v2"
1212 "io/ioutil"
1313 "log"
1414 "os"
1515 "strings"
1616)
1717
18+ // SRVERSION is the semantic-release version (added at compile time)
1819var SRVERSION string
1920
2021func errorHandler (logger * log.Logger ) func (error , ... int ) {
@@ -30,60 +31,30 @@ func errorHandler(logger *log.Logger) func(error, ...int) {
3031 }
3132}
3233
33- type SemRelConfig struct {
34- MaintainedVersion string `json:"maintainedVersion"`
35- }
36-
37- func loadConfig () * SemRelConfig {
38- f , err := os .OpenFile (".semrelrc" , os .O_RDONLY , 0 )
34+ func main () {
35+ app := cli .NewApp ()
36+ app .Name = "semantic-release"
37+ app .Usage = "automates the package release workflow including: determining the next version number and generating the change log"
38+ app .Version = SRVERSION
39+ app .Flags = config .CliFlags
40+ app .Action = cliHandler
41+
42+ err := app .Run (os .Args )
3943 if err != nil {
40- return & SemRelConfig {}
44+ log . Fatal ( err )
4145 }
42- src := & SemRelConfig {}
43- json .NewDecoder (f ).Decode (src )
44- f .Close ()
45- return src
4646}
4747
48- func main () {
49- token := flag .String ("token" , os .Getenv ("GITHUB_TOKEN" ), "github token" )
50- slug := flag .String ("slug" , condition .GetDefaultRepoSlug (), "slug of the repository" )
51- changelogFile := flag .String ("changelog" , "" , "creates a changelog file" )
52- ghr := flag .Bool ("ghr" , false , "create a .ghr file with the parameters for ghr" )
53- noci := flag .Bool ("noci" , false , "run semantic-release locally" )
54- dry := flag .Bool ("dry" , false , "do not create release" )
55- vFile := flag .Bool ("vf" , false , "create a .version file" )
56- showVersion := flag .Bool ("version" , false , "outputs the semantic-release version" )
57- updateFile := flag .String ("update" , "" , "updates the version of a certain file" )
58- gheHost := flag .String ("ghe-host" , os .Getenv ("GITHUB_ENTERPRISE_HOST" ), "github enterprise host" )
59- isPrerelease := flag .Bool ("prerelease" , false , "flags the release as a prerelease" )
60- isTravisCom := flag .Bool ("travis-com" , false , "force semantic-release to use the travis-ci.com API endpoint" )
61- flag .Parse ()
62-
63- if * showVersion {
64- fmt .Printf ("semantic-release v%s" , SRVERSION )
65- return
66- }
48+ func cliHandler (c * cli.Context ) error {
49+ conf := config .NewConfig (c )
6750
6851 logger := log .New (os .Stderr , "[semantic-release]: " , 0 )
6952 exitIfError := errorHandler (logger )
7053
71- if val , ok := os .LookupEnv ("GH_TOKEN" ); * token == "" && ok {
72- * token = val
73- }
74-
75- if * token == "" {
76- exitIfError (errors .New ("github token missing" ))
77- }
78-
7954 ci := condition .NewCI ()
8055 logger .Printf ("detected CI: %s\n " , ci .Name ())
8156
82- if * slug == "" {
83- exitIfError (errors .New ("slug missing" ))
84- }
85-
86- repo , err := semrel .NewRepository (context .TODO (), * gheHost , * slug , * token )
57+ repo , err := semrel .NewRepository (context .TODO (), conf .GheHost , conf .Slug , conf .Token )
8758 exitIfError (err )
8859
8960 logger .Println ("getting default branch..." )
@@ -100,35 +71,34 @@ func main() {
10071 }
10172 logger .Println ("found current branch: " + currentBranch )
10273
103- config := loadConfig ()
104- if config .MaintainedVersion != "" && currentBranch == defaultBranch {
74+ if conf .BetaRelease .MaintainedVersion != "" && currentBranch == defaultBranch {
10575 exitIfError (fmt .Errorf ("maintained version not allowed on default branch" ))
10676 }
10777
108- if config .MaintainedVersion != "" {
109- logger .Println ("found maintained version: " + config .MaintainedVersion )
78+ if conf . BetaRelease .MaintainedVersion != "" {
79+ logger .Println ("found maintained version: " + conf . BetaRelease .MaintainedVersion )
11080 defaultBranch = "*"
11181 }
11282
11383 currentSha := ci .GetCurrentSHA ()
11484 logger .Println ("found current sha: " + currentSha )
11585
116- if ! * noci {
86+ if ! conf . Noci {
11787 logger .Println ("running CI condition..." )
11888 config := condition.CIConfig {
119- "token" : * token ,
89+ "token" : conf . Token ,
12090 "defaultBranch" : defaultBranch ,
121- "private" : isPrivate || * isTravisCom ,
91+ "private" : isPrivate || conf . TravisCom ,
12292 }
12393 exitIfError (ci .RunCondition (config ), 66 )
12494 }
12595
12696 logger .Println ("getting latest release..." )
127- release , err := repo .GetLatestRelease (config .MaintainedVersion )
97+ release , err := repo .GetLatestRelease (conf . BetaRelease .MaintainedVersion )
12898 exitIfError (err )
12999 logger .Println ("found version: " + release .Version .String ())
130100
131- if strings .Contains (config .MaintainedVersion , "-" ) && release .Version .Prerelease () == "" {
101+ if strings .Contains (conf . BetaRelease .MaintainedVersion , "-" ) && release .Version .Prerelease () == "" {
132102 exitIfError (fmt .Errorf ("no pre-release for this version possible" ))
133103 }
134104
@@ -143,30 +113,31 @@ func main() {
143113 }
144114 logger .Println ("new version: " + newVer .String ())
145115
146- if * dry {
116+ if conf . Dry {
147117 exitIfError (errors .New ("DRY RUN: no release was created" ), 65 )
148118 }
149119
150120 logger .Println ("generating changelog..." )
151121 changelog := semrel .GetChangelog (commits , release , newVer )
152- if * changelogFile != "" {
153- exitIfError (ioutil .WriteFile (* changelogFile , []byte (changelog ), 0644 ))
122+ if conf . Changelog != "" {
123+ exitIfError (ioutil .WriteFile (conf . Changelog , []byte (changelog ), 0644 ))
154124 }
155125
156126 logger .Println ("creating release..." )
157- exitIfError (repo .CreateRelease (changelog , newVer , * isPrerelease , currentBranch , currentSha ))
127+ exitIfError (repo .CreateRelease (changelog , newVer , conf . Prerelease , currentBranch , currentSha ))
158128
159- if * ghr {
129+ if conf . Ghr {
160130 exitIfError (ioutil .WriteFile (".ghr" , []byte (fmt .Sprintf ("-u %s -r %s v%s" , repo .Owner , repo .Repo , newVer .String ())), 0644 ))
161131 }
162132
163- if * vFile {
133+ if conf . Vf {
164134 exitIfError (ioutil .WriteFile (".version" , []byte (newVer .String ()), 0644 ))
165135 }
166136
167- if * updateFile != "" {
168- exitIfError (update .Apply (* updateFile , newVer .String ()))
137+ if conf . Update != "" {
138+ exitIfError (update .Apply (conf . Update , newVer .String ()))
169139 }
170140
171141 logger .Println ("done." )
142+ return nil
172143}
0 commit comments