aboutsummaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2025-03-25 21:20:13 +0100
committerGabriel A. Giovanini <mail@gabrielgio.me>2025-03-25 21:20:13 +0100
commit6006194c072dba9f65aa08c6e3be06ea8ead8910 (patch)
treee647fd2063efce999ac97761f05aaf38fee135dd /pkg
parentc1247a52e92523be8d225d20dc9592f32dca5088 (diff)
downloadcerrado-6006194c072dba9f65aa08c6e3be06ea8ead8910.tar.gz
cerrado-6006194c072dba9f65aa08c6e3be06ea8ead8910.tar.bz2
cerrado-6006194c072dba9f65aa08c6e3be06ea8ead8910.zip
feat: Add ref page
Now there is page more tailored to a single ref.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/ext/router.go4
-rw-r--r--pkg/git/git.go49
-rw-r--r--pkg/handler/git/handler.go22
-rw-r--r--pkg/handler/router.go1
-rw-r--r--pkg/service/git.go19
5 files changed, 94 insertions, 1 deletions
diff --git a/pkg/ext/router.go b/pkg/ext/router.go
index e12a40c..ce4c126 100644
--- a/pkg/ext/router.go
+++ b/pkg/ext/router.go
@@ -8,6 +8,7 @@ import (
"git.gabrielgio.me/cerrado/pkg/service"
"git.gabrielgio.me/cerrado/templates"
+ "github.com/go-git/go-git/v5/plumbing"
)
type (
@@ -36,7 +37,8 @@ func (r *Router) AddMiddleware(middleware Middleware) {
func wrapError(next ErrorRequestHandler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if err := next(w, r); err != nil {
- if errors.Is(err, service.ErrRepositoryNotFound) {
+ if errors.Is(err, service.ErrRepositoryNotFound) ||
+ errors.Is(err, plumbing.ErrReferenceNotFound) {
NotFound(w, r)
} else {
slog.Error("Internal Server Error", "error", err)
diff --git a/pkg/git/git.go b/pkg/git/git.go
index d72e561..64c721a 100644
--- a/pkg/git/git.go
+++ b/pkg/git/git.go
@@ -19,6 +19,7 @@ import (
var (
MissingRefErr = errors.New("Reference not found")
TreeForFileErr = errors.New("Trying to get tree of a file")
+ eofIter = errors.New("End of a iterator")
)
type (
@@ -198,6 +199,54 @@ func (g *GitRepository) Head() (*plumbing.Reference, error) {
return g.repository.Head()
}
+func (g *GitRepository) Tag() (*object.Commit, *TagReference, error) {
+ err := g.validateRef()
+ if err != nil {
+ return nil, nil, err
+ }
+
+ c, err := g.repository.CommitObject(g.ref)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ var tagReference *TagReference
+
+ iter, err := g.repository.Tags()
+ if err != nil {
+ return nil, nil, err
+ }
+
+ if err := iter.ForEach(func(ref *plumbing.Reference) error {
+ obj, err := g.repository.TagObject(ref.Hash())
+ switch err {
+ case nil:
+ if obj.Target == c.Hash {
+ tagReference = &TagReference{
+ ref: ref,
+ tag: obj,
+ }
+ return eofIter
+ }
+ return nil
+ case plumbing.ErrObjectNotFound:
+ if c.Hash == ref.Hash() {
+ tagReference = &TagReference{
+ ref: ref,
+ }
+ return eofIter
+ }
+ return nil
+ default:
+ return err
+ }
+ }); err != nil && !errors.Is(eofIter, err) {
+ return nil, nil, err
+ }
+
+ return c, tagReference, nil
+}
+
func (g *GitRepository) Tags() ([]*TagReference, error) {
iter, err := g.repository.Tags()
if err != nil {
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
index 034d5c2..a9be54c 100644
--- a/pkg/handler/git/handler.go
+++ b/pkg/handler/git/handler.go
@@ -350,6 +350,28 @@ func (g *GitHandler) Log(w http.ResponseWriter, r *http.Request) error {
return nil
}
+func (g *GitHandler) Ref(w http.ResponseWriter, r *http.Request) error {
+ ext.SetHTML(w)
+ name := r.PathValue("name")
+ ref := r.PathValue("ref")
+
+ commit, tag, err := g.gitService.GetTag(ref, name)
+ if err != nil {
+ return err
+ }
+
+ gitList := &templates.GitItemPage{
+ Name: name,
+ Ref: ref,
+ GitItemBase: &templates.GitItemRefPage{
+ Commit: commit,
+ Reference: tag,
+ },
+ }
+ templates.WritePageTemplate(w, gitList, r.Context())
+ return nil
+}
+
func (g *GitHandler) Commit(w http.ResponseWriter, r *http.Request) error {
ext.SetHTML(w)
name := r.PathValue("name")
diff --git a/pkg/handler/router.go b/pkg/handler/router.go
index 8d27b74..e461922 100644
--- a/pkg/handler/router.go
+++ b/pkg/handler/router.go
@@ -52,6 +52,7 @@ func MountHandler(
mux.HandleFunc("/{name}/blob/{ref}/{rest...}", gitHandler.Blob)
mux.HandleFunc("/{name}/log/{ref}/", gitHandler.Log)
mux.HandleFunc("/{name}/commit/{ref}/", gitHandler.Commit)
+ mux.HandleFunc("/{name}/ref/{ref}/", gitHandler.Ref)
mux.HandleFunc("/{name}/archive/{file}", gitHandler.Archive)
mux.HandleFunc("/about", aboutHandler.About)
mux.HandleFunc("/", gitHandler.List)
diff --git a/pkg/service/git.go b/pkg/service/git.go
index 8642b5b..5410d7a 100644
--- a/pkg/service/git.go
+++ b/pkg/service/git.go
@@ -241,6 +241,25 @@ func (g *GitService) GetAbout(name string) ([]byte, error) {
return file, nil
}
+func (g *GitService) GetTag(ref, name string) (*object.Commit, *git.TagReference, error) {
+ r := g.configRepo.GetByName(name)
+ if r == nil {
+ return nil, nil, ErrRepositoryNotFound
+ }
+
+ repo, err := git.OpenRepository(r.Path)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ err = repo.SetRef(ref)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ return repo.Tag()
+}
+
func (g *GitService) ListTags(name string) ([]*git.TagReference, error) {
r := g.configRepo.GetByName(name)
if r == nil {