Goit

Simple and lightweight Git web server
git clone https://git.omkov.net/Goit
git clone [email protected]:Goit
Log | Tree | Refs | README | Download

AuthorJakob Wakeling <[email protected]>
Date2025-02-06 02:05:36
Commit113a52e48aefe1a15a501cea4de5dc6fa32f5024
Parent09af50073069a0bda6836ff09d867e96e453416f
Tag 0.2.2

Fix absent annotated tags on log and commit pages

Diffstat

M Makefile | 2 +-
M src/goit/git.go | 30 +++++++++++++++---------------
M src/repo/commit.go | 2 +-
M src/repo/log.go | 2 +-
M src/repo/refs.go | 35 +++++++----------------------------

5 files changed, 25 insertions, 46 deletions

diff --git a/Makefile b/Makefile
index a205aa4..1a234d4 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ all: help
 
 MODULE = "$(shell go list -m)"
 PROGRAM = "goit"
-VERSION ?= "dev"
+VERSION ?= "$(shell git describe --tags --always)"
 
 build: ## Build the project
 	@go build -ldflags "-X $(MODULE)/res.Version=$(VERSION)" -o ./bin/$(PROGRAM) ./src
diff --git a/src/goit/git.go b/src/goit/git.go
index 2b9fad6..242b06b 100644
--- a/src/goit/git.go
+++ b/src/goit/git.go
@@ -6,6 +6,7 @@ package goit
 import (
 	"bytes"
 	"compress/gzip"
+	"errors"
 	"io"
 	"log"
 	"net/http"
@@ -378,38 +379,37 @@ type RefCommit struct {
 
 /* Return an array of tag referenced commits for a repository. */
 func TaggedCommits(gr *git.Repository) ([]RefCommit, error) {
-	var taggedCommits []RefCommit
+	var tags []RefCommit
 
-	tags, err := gr.Tags()
-	if err != nil {
+	if iter, err := gr.Tags(); err != nil {
 		return nil, err
-	}
-
-	if err := tags.ForEach(func(ref *plumbing.Reference) error {
+	} else if err := iter.ForEach(func(ref *plumbing.Reference) error {
 		var commit *object.Commit
 
-		tag, err := gr.TagObject(ref.Hash())
-		switch err {
-		case nil:
-			if commit, err = gr.CommitObject(tag.Target); err != nil {
+		if tag, err := gr.TagObject(ref.Hash()); err != nil {
+			if !errors.Is(err, plumbing.ErrObjectNotFound) {
 				return err
 			}
-		case plumbing.ErrObjectNotFound:
+
+			/* Tag is not annotated. */
 			if commit, err = gr.CommitObject(ref.Hash()); err != nil {
 				return err
 			}
-		default:
-			return err
+		} else {
+			/* Tag is annotated. */
+			if commit, err = gr.CommitObject(tag.Target); err != nil {
+				return err
+			}
 		}
 
-		taggedCommits = append(taggedCommits, RefCommit{ref, commit})
+		tags = append(tags, RefCommit{ref, commit})
 
 		return nil
 	}); err != nil {
 		return nil, err
 	}
 
-	return taggedCommits, nil
+	return tags, nil
 }
 
 /* Return an array of branch referenced commits for a repository. */
diff --git a/src/repo/commit.go b/src/repo/commit.go
index e6b690b..441366c 100644
--- a/src/repo/commit.go
+++ b/src/repo/commit.go
@@ -119,7 +119,7 @@ func HandleCommit(w http.ResponseWriter, r *http.Request) {
 	}
 
 	for _, taggedCommit := range taggedCommits {
-		if taggedCommit.Ref.Hash().String() == commit.Hash.String() {
+		if taggedCommit.Commit.Hash.String() == commit.Hash.String() {
 			data.Tags = append(data.Tags, taggedCommit.Ref.Name().Short())
 		}
 	}
diff --git a/src/repo/log.go b/src/repo/log.go
index ddc1c1d..f6d50db 100644
--- a/src/repo/log.go
+++ b/src/repo/log.go
@@ -148,7 +148,7 @@ func HandleLog(w http.ResponseWriter, r *http.Request) {
 
 			var tags []string
 			for _, taggedCommit := range taggedCommits {
-				if taggedCommit.Ref.Hash().String() == c.Hash.String() {
+				if taggedCommit.Commit.Hash.String() == c.Hash.String() {
 					tags = append(tags, taggedCommit.Ref.Name().Short())
 				}
 			}
diff --git a/src/repo/refs.go b/src/repo/refs.go
index 73abad5..00fd0b5 100644
--- a/src/repo/refs.go
+++ b/src/repo/refs.go
@@ -16,7 +16,6 @@ import (
 	"github.com/go-chi/chi/v5"
 	"github.com/go-git/go-git/v5"
 	"github.com/go-git/go-git/v5/plumbing"
-	"github.com/go-git/go-git/v5/plumbing/object"
 )
 
 func HandleRefs(w http.ResponseWriter, r *http.Request) {
@@ -99,39 +98,19 @@ func HandleRefs(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	if iter, err := gr.Tags(); err != nil {
+	tags, err := goit.TaggedCommits(gr)
+	if err != nil {
 		util.PrintFuncError(err)
 		goit.HttpError(w, http.StatusInternalServerError)
 		return
-	} else if err := iter.ForEach(func(r *plumbing.Reference) error {
-		var c *object.Commit
-
-		if tag, err := gr.TagObject(r.Hash()); err != nil {
-			if !errors.Is(err, plumbing.ErrObjectNotFound) {
-				return err
-			}
-		} else {
-			if c, err = gr.CommitObject(tag.Target); err != nil {
-				return err
-			}
-		}
-
-		if c == nil {
-			if c, err = gr.CommitObject(r.Hash()); err != nil {
-				return err
-			}
-		}
+	}
 
+	for _, tag := range tags {
 		data.Tags = append(data.Tags, row{
-			Name: r.Name().Short(), Message: strings.SplitN(c.Message, "\n", 2)[0], Author: c.Author.Name,
-			LastCommit: c.Author.When.UTC().Format(time.DateTime), Hash: c.Hash.String(),
+			Name: tag.Ref.Name().Short(), Message: strings.SplitN(tag.Commit.Message, "\n", 2)[0],
+			Author: tag.Commit.Author.Name, LastCommit: tag.Commit.Author.When.UTC().Format(time.DateTime),
+			Hash: tag.Commit.Hash.String(),
 		})
-
-		return nil
-	}); err != nil {
-		util.PrintFuncError(err)
-		goit.HttpError(w, http.StatusInternalServerError)
-		return
 	}
 
 	slices.Reverse(data.Tags)