From e5d117b91b4da78dcb87ae6d38b66b88e67cb852 Mon Sep 17 00:00:00 2001
From: Christoph Witzko <github@christophwitzko.com>
Date: Sun, 21 Nov 2021 15:36:29 +0100
Subject: [PATCH] fix(create-release): try to resolve branch name if invalid
 sha is provided

fixes #4
---
 pkg/provider/git.go      | 11 ++++++++++-
 pkg/provider/git_test.go | 39 ++++++++++++++++++++++++++++-----------
 2 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/pkg/provider/git.go b/pkg/provider/git.go
index de8e6c5..9eea764 100644
--- a/pkg/provider/git.go
+++ b/pkg/provider/git.go
@@ -164,8 +164,17 @@ func (repo *Repository) GetReleases(rawRe string) ([]*semrel.Release, error) {
 }
 
 func (repo *Repository) CreateRelease(release *provider.CreateReleaseConfig) error {
+	hash := plumbing.NewHash(release.SHA)
+	if hash.IsZero() {
+		// hash is not valid, let's assume it is a branch name
+		resolvedRef, err := repo.repo.Reference(plumbing.NewBranchReferenceName(release.SHA), true)
+		if err != nil {
+			return err
+		}
+		hash = resolvedRef.Hash()
+	}
 	tag := fmt.Sprintf("v%s", release.NewVersion)
-	_, err := repo.repo.CreateTag(tag, plumbing.NewHash(release.SHA), &git.CreateTagOptions{
+	_, err := repo.repo.CreateTag(tag, hash, &git.CreateTagOptions{
 		Message: release.Changelog,
 		Tagger: &object.Signature{
 			Name:  repo.taggerName,
diff --git a/pkg/provider/git_test.go b/pkg/provider/git_test.go
index 5aa188e..c60ae50 100644
--- a/pkg/provider/git_test.go
+++ b/pkg/provider/git_test.go
@@ -181,20 +181,37 @@ func createRelease(t *testing.T) {
 	head, err := gRepo.Head()
 	require.NoError(err)
 
-	err = repo.CreateRelease(&provider.CreateReleaseConfig{
-		NewVersion: "2.0.0",
-		SHA:        head.Hash().String(),
-		Changelog:  "new feature",
-	})
-	require.NoError(err)
+	testCases := []struct {
+		version, sha, changelog string
+	}{
+		{
+			version:   "2.0.0",
+			sha:       head.Hash().String(),
+			changelog: "new feature",
+		},
+		{
+			version:   "3.0.0",
+			sha:       "master",
+			changelog: "breaking change",
+		},
+	}
 
-	tagRef, err := gRepo.Tag("v2.0.0")
-	require.NoError(err)
+	for _, testCase := range testCases {
+		err = repo.CreateRelease(&provider.CreateReleaseConfig{
+			NewVersion: testCase.version,
+			SHA:        testCase.sha,
+			Changelog:  testCase.changelog,
+		})
+		require.NoError(err)
 
-	tagObj, err := gRepo.TagObject(tagRef.Hash())
-	require.NoError(err)
+		tagRef, err := gRepo.Tag("v" + testCase.version)
+		require.NoError(err)
 
-	require.Equal("new feature\n", tagObj.Message)
+		tagObj, err := gRepo.TagObject(tagRef.Hash())
+		require.NoError(err)
+
+		require.Equal(testCase.changelog+"\n", tagObj.Message)
+	}
 }
 
 func getReleases(t *testing.T) {
-- 
GitLab