diff --git a/.dictionary b/.dictionary index 76529c0..908725c 100644 --- a/.dictionary +++ b/.dictionary @@ -13,3 +13,5 @@ ReleaseNoteSection Beatriz Vieira sv4git +multiarch +(P|p)rebuilt diff --git a/README.md b/README.md index ad2133c..48f2197 100644 --- a/README.md +++ b/README.md @@ -7,42 +7,33 @@ Semantic versioning tool for git based on conventional commits. [![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/git-sv)](https://github.com/thegeeklab/git-sv/graphs/contributors) [![License: MIT](https://img.shields.io/github/license/thegeeklab/git-sv)](https://github.com/thegeeklab/git-sv/blob/main/LICENSE) -## Getting Started - -### Requirements +## Requirements - Git 2.17+ -### Installing - -- Download the latest release and add the binary to your path. -- Optional: Set `GITSV_HOME` to define user configurations. Check the [Configuration](#configuration) topic for more information. +## Installation -If you want to install from source using `go install`, just run: +Prebuilt multiarch binaries are available for Linux only. ```Shell -# keep in mind that with this, it will compile from source and won't show the version on cli -h. -go install github.com/thegeeklab/git-sv/cmd/git-sv@latest - -# if you want to add the version on the binary, run this command instead. -GITSV_VERSION=$(go list -f '{{ .Version }}' -m github.com/thegeeklab/git-sv@latest | sed 's/v//') && go install --ldflags "-X main.Version=$SGITSV_VERSION" github.com/thegeeklab/git-sv/cmd/git-sv@v$GITSV_VERSION +curl -SsfL https://github.com/thegeeklab/git-sv/releases/latest/download/git-sv-linux-amd64 -o /usr/local/bin/git-sv +chmod +x /usr/local/bin/git-sv ``` -### Configuration - -#### YAML +## Build -There are 3 configuration levels when using git-sv: [default](#default), [repository](#repository). All of them are merged considering the follow priority: **repository > user > default**. - -To see the current configuration, run: +Build the binary from source with the following command: ```Shell -git sv cfg show +make build ``` -##### Configuration Types +## Configuration + +The configuration is loaded from a YAML file in the following order (last wins): -###### Default +- built-in default +- `.gitsv/config.yml` in repository root To check the default configuration, run: @@ -50,37 +41,22 @@ To check the default configuration, run: git sv cfg default ``` -###### Repository - -Create a `.gitsv/config.yml` file on the root of your repository, e.g. [.gitsv/config.yml](.gitsv/config.yml). - -##### Configuration format - ```Yaml -version: "1.1" #configuration version +version: "1.1" # Configuration version. -versioning: # versioning bump +versioning: update-major: [] # Commit types used to bump major. update-minor: [feat] # Commit types used to bump minor. update-patch: [build, ci, chore, fix, perf, refactor, test] # Commit types used to bump patch. # When type is not present on update rules and is unknown (not mapped on commit message types); - # if ignore-unknown=false bump patch, if ignore-unknown=true do not bump version + # if ignore-unknown=false bump patch, if ignore-unknown=true do not bump version. ignore-unknown: false tag: pattern: "%d.%d.%d" # Pattern used to create git tag. - filter: "" # Enables you to filter for considerable tags using git pattern syntax + filter: "" # Enables you to filter for considerable tags using git pattern syntax. release-notes: - # Deprecated!!! please use 'sections' instead! - # Headers names for release notes markdown. To disable a section just remove the header - # line. It's possible to add other commit types, the release note will be created - # respecting the following order: feat, fix, refactor, perf, test, build, ci, chore, docs, style, breaking-change. - headers: - breaking-change: Breaking Changes - feat: Features - fix: Bug Fixes - sections: # Array with each section of release note. Check template section for more information. - name: Features # Name used on section. section-type: commits # Type of the section, supported types: commits, breaking-changes. @@ -99,6 +75,7 @@ branches: # Git branches config. skip-detached: false # Set true if a detached branch should be ignored on commit message validation. commit-message: + # Supported commit types. types: [ build, ci, @@ -111,7 +88,7 @@ commit-message: revert, style, test, - ] # Supported commit types. + ] header-selector: "" # You can put in a regex here to select only a certain part of the commit message. Please define a regex group 'header'. scope: # Define supported scopes, if blank, scope will not be validated, if not, only scope listed will be valid. @@ -127,7 +104,7 @@ commit-message: regex: "[A-Z]+-[0-9]+" # Regex for issue id. ``` -#### Templates +### Templates **git-sv** uses _go templates_ to format the output for `release-notes` and `changelog`, to see how the default template is configured check [template directory](https://github.com/thegeeklab/git-sv/tree/main/templates/assets). It's possible to overwrite the default configuration by adding `.gitsv/templates` on your repository. @@ -140,7 +117,7 @@ commit-message: Everything inside `.gitsv/templates` will be loaded, so it's possible to add more files to be used as needed. -##### Variables +#### Variables To execute the template the `releasenotes-md.tpl` will receive a single `ReleaseNote` and `changelog-md.tpl` will receive a list of `ReleaseNote` as variables. @@ -153,25 +130,7 @@ Each `ReleaseNoteSection` will be configured according with `release-notes.secti > :warning: currently only `commits` and `breaking-changes` are supported as `section-types`, using a different value for this field will make the section to be removed from the template variables. -### Running - -Run `git-sv` to get the list of available parameters: - -```Shell -git-sv -``` - -#### Run as git command - -If `git-sv` is configured on your path, you can use it like a git command: - -```Shell -git sv -git sv current-version -git sv next-version -``` - -#### Usage +## Usage Use `--help` or `-h` to get usage information, don't forget that some commands have unique options too: @@ -204,7 +163,15 @@ GLOBAL OPTIONS: --version, -v print the version ``` -##### Use range +If `git-sv` is configured on your path, you can also use it like a git command. + +```Shell +git sv +git sv current-version +git sv next-version +``` + +### Ranges Commands like `commit-log` and `commit-notes` has a range option. Supported range types are: `tag`, `date` and `hash`. diff --git a/app/config.go b/app/config.go index 8327a78..8291eeb 100644 --- a/app/config.go +++ b/app/config.go @@ -74,10 +74,6 @@ func NewConfig(configDir, configFilename string) *Config { if merr := merge(cfg, migrate(repoCfg, repoCfgFilepath)); merr != nil { log.Fatal().Err(merr).Msg("failed to merge repo config") } - - if len(repoCfg.ReleaseNotes.Headers) > 0 { // mergo is merging maps, headers will be overwritten - cfg.ReleaseNotes.Headers = repoCfg.ReleaseNotes.Headers - } } return cfg @@ -143,14 +139,7 @@ func GetDefault() *Config { } func merge(dst *Config, src Config) error { - err := mergo.Merge(dst, src, mergo.WithOverride, mergo.WithTransformers(&mergeTransformer{})) - if err == nil { - if len(src.ReleaseNotes.Headers) > 0 { // mergo is merging maps, ReleaseNotes.Headers should be overwritten - dst.ReleaseNotes.Headers = src.ReleaseNotes.Headers - } - } - - return err + return mergo.Merge(dst, src, mergo.WithOverride, mergo.WithTransformers(&mergeTransformer{})) } type mergeTransformer struct{} @@ -179,50 +168,7 @@ func (t *mergeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.V return nil } +//nolint:revive func migrate(cfg Config, filename string) Config { - if cfg.ReleaseNotes.Headers == nil { - return cfg - } - - log.Warn().Msgf("config 'release-notes.headers' on %s is deprecated, please use 'sections' instead!", filename) - - return Config{ - Version: cfg.Version, - Versioning: cfg.Versioning, - Tag: cfg.Tag, - ReleaseNotes: sv.ReleaseNotesConfig{ - Sections: migrateReleaseNotes(cfg.ReleaseNotes.Headers), - }, - Branches: cfg.Branches, - CommitMessage: cfg.CommitMessage, - } -} - -func migrateReleaseNotes(headers map[string]string) []sv.ReleaseNotesSectionConfig { - order := []string{"feat", "fix", "refactor", "perf", "test", "build", "ci", "chore", "docs", "style"} - - var sections []sv.ReleaseNotesSectionConfig - - for _, key := range order { - if name, exists := headers[key]; exists { - sections = append( - sections, - sv.ReleaseNotesSectionConfig{ - Name: name, - SectionType: sv.ReleaseNotesSectionTypeCommits, - CommitTypes: []string{key}, - }) - } - } - - if name, exists := headers["breaking-change"]; exists { - sections = append( - sections, - sv.ReleaseNotesSectionConfig{ - Name: name, - SectionType: sv.ReleaseNotesSectionTypeBreakingChanges, - }) - } - - return sections + return cfg } diff --git a/app/config_test.go b/app/config_test.go index b899d8b..2fdfc62 100644 --- a/app/config_test.go +++ b/app/config_test.go @@ -117,13 +117,6 @@ func Test_merge(t *testing.T) { }}, false, }, - { - "overwrite release notes header", - Config{ReleaseNotes: sv.ReleaseNotesConfig{Headers: map[string]string{"a": "aa"}}}, - Config{ReleaseNotes: sv.ReleaseNotesConfig{Headers: map[string]string{"b": "bb"}}}, - Config{ReleaseNotes: sv.ReleaseNotesConfig{Headers: map[string]string{"b": "bb"}}}, - false, - }, { "overwrite tag config", Config{ diff --git a/sv/releasenotes.go b/sv/releasenotes.go index 62fd53d..6ca765a 100644 --- a/sv/releasenotes.go +++ b/sv/releasenotes.go @@ -8,7 +8,6 @@ import ( // ReleaseNotesConfig release notes preferences. type ReleaseNotesConfig struct { - Headers map[string]string `yaml:"headers,omitempty"` Sections []ReleaseNotesSectionConfig `yaml:"sections"` }