Compare commits
4 Commits
cdb9739442
...
6c0cb265e3
Author | SHA1 | Date |
---|---|---|
sudo pacman -Syu | 6c0cb265e3 | |
sudo pacman -Syu | 4e793364bd | |
sudo pacman -Syu | 2690142440 | |
sudo pacman -Syu | dc351c9a22 |
18
CHANGELOG.md
18
CHANGELOG.md
|
@ -1,5 +1,23 @@
|
|||
# CHANGELOG
|
||||
|
||||
## v1.20.0 (2023-07-16)
|
||||
|
||||
### Added
|
||||
|
||||
- feat: log from to (2023-07-16)
|
||||
|
||||
- feat: auto get latest tags in interactive mode (2023-07-16)
|
||||
|
||||
- feat: list semver tags (2023-07-16)
|
||||
|
||||
### Others
|
||||
|
||||
- build(deps): bump golang.org/x/mod from 0.11.0 to 0.12.0 (2023-07-05)
|
||||
|
||||
- chore: generic gitignore (2023-06-29)
|
||||
|
||||
- chore(changelog): generate v1.19.0 (2023-06-29)
|
||||
|
||||
## v1.19.0 (2023-06-29)
|
||||
|
||||
### Added
|
||||
|
|
1
go.mod
1
go.mod
|
@ -3,6 +3,7 @@ module github.com/haunt98/changeloguru
|
|||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/Masterminds/semver/v3 v3.2.1
|
||||
github.com/go-git/go-git/v5 v5.7.0
|
||||
github.com/make-go-great/color-go v0.4.1
|
||||
github.com/make-go-great/date-go v0.5.0
|
||||
|
|
2
go.sum
2
go.sum
|
@ -1,3 +1,5 @@
|
|||
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
|
||||
github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
|
||||
github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA=
|
||||
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
|
||||
github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 h1:ZK3C5DtzV2nVAQTx5S5jQvMeDqWtD1By5mOoyY/xJek=
|
||||
|
|
|
@ -31,6 +31,7 @@ type action struct {
|
|||
dryRun bool
|
||||
interactive bool
|
||||
interactiveFrom bool
|
||||
interactiveTo bool
|
||||
autoGitCommit bool
|
||||
autoGitTag bool
|
||||
autoGitPush bool
|
||||
|
@ -79,6 +80,7 @@ func (a *action) getFlags(c *cli.Context) {
|
|||
a.flags.dryRun = c.Bool(flagDryRunName)
|
||||
a.flags.interactive = c.Bool(flagInteractiveName)
|
||||
a.flags.interactiveFrom = c.Bool(flagInteractiveFromName)
|
||||
a.flags.interactiveTo = c.Bool(flagInteractiveToName)
|
||||
a.flags.autoGitCommit = c.Bool(flagAutoGitCommitName)
|
||||
a.flags.autoGitTag = c.Bool(flagAutoGitTagName)
|
||||
a.flags.autoGitPush = c.Bool(flagAutoGitPushName)
|
||||
|
|
|
@ -14,6 +14,7 @@ import (
|
|||
"github.com/urfave/cli/v2"
|
||||
"golang.org/x/mod/semver"
|
||||
|
||||
"github.com/make-go-great/color-go"
|
||||
"github.com/make-go-great/ioe-go"
|
||||
"github.com/make-go-great/markdown-go"
|
||||
"github.com/make-go-great/rst-go"
|
||||
|
@ -38,6 +39,7 @@ func (a *action) RunGenerate(c *cli.Context) error {
|
|||
return cli.ShowCommandHelp(c, commandGenerateName)
|
||||
}
|
||||
|
||||
useLatestTag := false
|
||||
if a.flags.interactive {
|
||||
fmt.Printf("Input version (%s):\n", flagVersionUsage)
|
||||
a.flags.version = ioe.ReadInput()
|
||||
|
@ -47,8 +49,12 @@ func (a *action) RunGenerate(c *cli.Context) error {
|
|||
a.flags.from = ioe.ReadInputEmpty()
|
||||
}
|
||||
|
||||
fmt.Printf("Input to (%s):\n", flagToUsage)
|
||||
a.flags.to = ioe.ReadInputEmpty()
|
||||
if a.flags.interactiveTo {
|
||||
fmt.Printf("Input to (%s):\n", flagToUsage)
|
||||
a.flags.to = ioe.ReadInputEmpty()
|
||||
} else {
|
||||
useLatestTag = true
|
||||
}
|
||||
}
|
||||
|
||||
repo, err := git.NewRepository(a.flags.repository)
|
||||
|
@ -56,6 +62,25 @@ func (a *action) RunGenerate(c *cli.Context) error {
|
|||
return err
|
||||
}
|
||||
|
||||
if useLatestTag {
|
||||
tags, err := repo.SemVerTags()
|
||||
if err == nil {
|
||||
a.flags.to = tags[len(tags)-1].Version.Original()
|
||||
}
|
||||
}
|
||||
|
||||
aliasFrom := a.flags.from
|
||||
if aliasFrom == "" {
|
||||
aliasFrom = "latest"
|
||||
}
|
||||
|
||||
aliasTo := a.flags.to
|
||||
if aliasTo == "" {
|
||||
aliasTo = "earliest"
|
||||
}
|
||||
|
||||
color.PrintAppOK(name, fmt.Sprintf("Generate changelog from [%s] to [%s]", aliasFrom, aliasTo))
|
||||
|
||||
commits, err := repo.Log(a.flags.from, a.flags.to)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
@ -22,10 +22,10 @@ const (
|
|||
flagVersionUsage = "`VERSION` to generate, follow Semantic Versioning"
|
||||
|
||||
flagFromName = "from"
|
||||
flagFromUsage = "from `COMMIT`, which is kinda new commit, default is latest commit"
|
||||
flagFromUsage = "`FROM COMMIT`, which is kinda new commit, default is latest commit"
|
||||
|
||||
flagToName = "to"
|
||||
flagToUsage = "to `COMMIT`, which is kinda old commit, default is oldest commit"
|
||||
flagToUsage = "`TO COMMIT`, which is kinda old commit, default is oldest commit"
|
||||
|
||||
flagScopeName = "scope"
|
||||
flagScopeUsage = "scope to generate"
|
||||
|
@ -49,7 +49,10 @@ const (
|
|||
flagInteractiveUsage = "interactive mode"
|
||||
|
||||
flagInteractiveFromName = "interactive-from"
|
||||
flagInteractiveFromUsage = "enable ask from in interactive mode"
|
||||
flagInteractiveFromUsage = "enable ask `FROM COMMIT` in interactive mode"
|
||||
|
||||
flagInteractiveToName = "interactive-to"
|
||||
flagInteractiveToUsage = "enable ask `TO COMMIT` in interactive mode, otherwise use latest SemVer tag"
|
||||
|
||||
flagAutoGitCommitName = "auto-commit"
|
||||
flagAutoGitCommitUsage = "enable auto git commit after generating changelog"
|
||||
|
@ -133,6 +136,10 @@ func NewApp() *App {
|
|||
Name: flagInteractiveFromName,
|
||||
Usage: flagInteractiveFromUsage,
|
||||
},
|
||||
&cli.BoolFlag{
|
||||
Name: flagInteractiveToName,
|
||||
Usage: flagInteractiveToUsage,
|
||||
},
|
||||
&cli.BoolFlag{
|
||||
Name: flagAutoGitCommitName,
|
||||
Usage: flagAutoGitCommitUsage,
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
package git
|
||||
|
||||
import (
|
||||
"github.com/go-git/go-git/v5/plumbing/object"
|
||||
)
|
||||
|
||||
// Commit stores all git-commit information
|
||||
type Commit struct {
|
||||
Author Author
|
||||
Message string
|
||||
}
|
||||
|
||||
// Convert from git-commit
|
||||
func newCommit(commit *object.Commit) Commit {
|
||||
return Commit{
|
||||
Message: commit.Message,
|
||||
Author: Author{
|
||||
Name: commit.Author.Name,
|
||||
Email: commit.Author.Email,
|
||||
When: commit.Author.When,
|
||||
},
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/haunt98/changeloguru/internal/git"
|
||||
)
|
||||
|
||||
func main() {
|
||||
r, err := git.NewRepository(".")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
commits, err := r.Log("", "")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Println("Commits: ", commits)
|
||||
|
||||
tags, err := r.SemVerTags()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Println("Tags: ", tags)
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package git
|
||||
|
||||
import (
|
||||
"github.com/Masterminds/semver/v3"
|
||||
"github.com/go-git/go-git/v5/plumbing/object"
|
||||
)
|
||||
|
||||
// Commit stores all git-commit information
|
||||
type Commit struct {
|
||||
Author Author
|
||||
Message string
|
||||
}
|
||||
|
||||
// Convert from go-git
|
||||
func newCommit(c *object.Commit) Commit {
|
||||
return Commit{
|
||||
Message: c.Message,
|
||||
Author: Author{
|
||||
Name: c.Author.Name,
|
||||
Email: c.Author.Email,
|
||||
When: c.Author.When,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type SemVerTag struct {
|
||||
Version *semver.Version
|
||||
}
|
|
@ -2,7 +2,9 @@ package git
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
"github.com/go-git/go-git/v5"
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/go-git/go-git/v5/plumbing/object"
|
||||
|
@ -12,13 +14,15 @@ import (
|
|||
const (
|
||||
head = "HEAD"
|
||||
|
||||
defaultCommitCount = 10
|
||||
defaultCommitCount = 128
|
||||
defaultTagCount = 32
|
||||
)
|
||||
|
||||
// Repository is an abstraction for git-repository
|
||||
type Repository interface {
|
||||
Log(fromRev, toRev string) ([]Commit, error)
|
||||
Commit(commitMessage string, paths ...string) error
|
||||
SemVerTags() ([]SemVerTag, error)
|
||||
}
|
||||
|
||||
type repo struct {
|
||||
|
@ -161,3 +165,38 @@ func newIterFn(commits *[]Commit, beginFn, endFn stopFn) func(c *object.Commit)
|
|||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// Return SemVer tags from earliest to latest
|
||||
func (r *repo) SemVerTags() ([]SemVerTag, error) {
|
||||
iter, err := r.gitRepo.Tags()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
versions := make([]*semver.Version, 0, defaultTagCount)
|
||||
|
||||
if err := iter.ForEach(func(r *plumbing.Reference) error {
|
||||
version, err := semver.NewVersion(r.Name().Short())
|
||||
if err != nil {
|
||||
// Ignore bad tag
|
||||
return nil
|
||||
}
|
||||
|
||||
versions = append(versions, version)
|
||||
|
||||
return nil
|
||||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sort.Sort(semver.Collection(versions))
|
||||
|
||||
tags := make([]SemVerTag, 0, len(versions))
|
||||
for _, version := range versions {
|
||||
tags = append(tags, SemVerTag{
|
||||
Version: version,
|
||||
})
|
||||
}
|
||||
|
||||
return tags, nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue