Skip to content

Commit

Permalink
fix: improves error trapping when there are no changes since start tag.
Browse files Browse the repository at this point in the history
  • Loading branch information
outofcoffee committed Apr 12, 2024
1 parent 406b7c9 commit 2060a15
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 4 deletions.
15 changes: 11 additions & 4 deletions changelog/changelog.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,13 @@ func GetUpdatedChangelog(
beforeTag string,
afterTag string,
unique bool,
) (metadata vcs.ReleaseMetadata, updatedChangelog string) {
) (metadata vcs.ReleaseMetadata, updatedChangelog string, err error) {
commits, err := vcs.FetchCommitsByTag(config, repoPath, beforeTag, afterTag, unique)
if err != nil {
panic(fmt.Errorf("failed to fetch commit messages from repo: %s: %v", repoPath, err))
return vcs.ReleaseMetadata{}, "", fmt.Errorf("failed to fetch commit messages from repo: %s: %v", repoPath, err)
}
if len(*commits) == 0 {
return vcs.ReleaseMetadata{}, "", fmt.Errorf("no changes since start tag")
}

currentVersion, vPrefix := semver.GetCurrentVersion(repoPath, orderBy)
Expand Down Expand Up @@ -229,7 +232,7 @@ func GetUpdatedChangelog(
Sha: sha,
VPrefix: vPrefix,
}
return metadata, output
return metadata, output, nil
}

// InitChangelog creates a new changelog file with a placeholder entry.
Expand All @@ -250,7 +253,11 @@ func InitChangelog(
return "", fmt.Errorf("failed to get latest tag: %v", err)
}

_, updated := GetUpdatedChangelog(config, changelogFile, orderBy, repoPath, latestTag, "", unique)
_, updated, err := GetUpdatedChangelog(config, changelogFile, orderBy, repoPath, latestTag, "", unique)
if err != nil {
return "", fmt.Errorf("failed to get updated changelog: %v", err)
}

err = WriteChangelog(changelogFile, updated)
if err != nil {
return "", fmt.Errorf("failed to write to initialised changelog: %s: %v", changelogFile, err)
Expand Down
134 changes: 134 additions & 0 deletions changelog/changelog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@ limitations under the License.
package changelog

import (
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing/object"
"github.com/release-tools/since/cfg"
"github.com/release-tools/since/vcs"
"os"
"path"
"reflect"
"testing"
"time"
Expand Down Expand Up @@ -153,3 +158,132 @@ func TestSplitIntoSections(t *testing.T) {
})
}
}

func TestGetUpdatedChangelog(t *testing.T) {
repoDir := createTestRepo(t)

type args struct {
config cfg.SinceConfig
changelogFile string
orderBy vcs.TagOrderBy
repoPath string
beforeTag string
afterTag string
unique bool
}
tests := []struct {
name string
args args
wantMetadata vcs.ReleaseMetadata
wantUpdatedChangelog string
wantErr bool
errMessage string
}{
{
name: "no changes",
args: args{
orderBy: vcs.TagOrderSemver,
repoPath: repoDir,
afterTag: "0.1.0",
},
wantMetadata: vcs.ReleaseMetadata{},
wantUpdatedChangelog: "",
wantErr: true,
errMessage: "no changes since start tag",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotMetadata, gotUpdatedChangelog, err := GetUpdatedChangelog(tt.args.config, tt.args.changelogFile, tt.args.orderBy, tt.args.repoPath, tt.args.beforeTag, tt.args.afterTag, tt.args.unique)
if (err != nil) != tt.wantErr {
t.Errorf("GetUpdatedChangelog() error = %v, wantErr %v", err, tt.wantErr)
return
}
if err != nil && tt.wantErr && tt.errMessage != err.Error() {
t.Errorf("GetUpdatedChangelog() error message = '%v', want '%v'", err.Error(), tt.errMessage)
return
}
if !reflect.DeepEqual(gotMetadata, tt.wantMetadata) {
t.Errorf("GetUpdatedChangelog() gotMetadata = %v, want %v", gotMetadata, tt.wantMetadata)
}
if gotUpdatedChangelog != tt.wantUpdatedChangelog {
t.Errorf("GetUpdatedChangelog() gotUpdatedChangelog = %v, want %v", gotUpdatedChangelog, tt.wantUpdatedChangelog)
}
})
}
}

// createTestRepo creates a test repo with two tags:
// 0.0.1 and 0.1.0
// The first tag is created 10 seconds before the second tag.
func createTestRepo(t *testing.T) string {
repoDir := t.TempDir()
t.Logf("created repo dir: %s", repoDir)

repoPathToReadme := path.Join(repoDir, "README.md")
readme, err := os.Create(repoPathToReadme)
if err != nil {
t.Fatal(err)
}

repo, err := git.PlainInit(repoDir, false)
if err != nil {
t.Fatal(err)
}
w, err := repo.Worktree()
if err != nil {
t.Fatal(err)
}

_, err = readme.WriteString("first update")
if err != nil {
t.Fatal(err)
}
_, err = w.Add("README.md")
if err != nil {
t.Fatal(err)
}
c1sig := &object.Signature{
Name: "user",
Email: "user@example.com",
When: time.UnixMilli(time.Now().UnixMilli() - 10000),
}
c1, err := w.Commit("first update", &git.CommitOptions{
Author: c1sig,
Committer: c1sig,
})
if err != nil {
t.Fatal(err)
}
_, err = repo.CreateTag("0.0.1", c1, nil)
if err != nil {
t.Fatal(err)
}

_, err = readme.WriteString("second update")
if err != nil {
t.Fatal(err)
}
_, err = w.Add("README.md")
if err != nil {
t.Fatal(err)
}
c2Sig := &object.Signature{
Name: "user",
Email: "user@example.com",
When: time.Now(),
}
c2, err := w.Commit("second update", &git.CommitOptions{
Author: c2Sig,
Committer: c2Sig,
})
if err != nil {
t.Fatal(err)
}
_, err = repo.CreateTag("0.1.0", c2, nil)
if err != nil {
t.Fatal(err)
}

return repoDir
}

0 comments on commit 2060a15

Please sign in to comment.