Goit

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

Goit/src/repo/tag.go (119 lines, 2.9 KiB) -rw-r--r-- file download

c850c86 Jakob Wakeling 2025-01-11 15:40:24
0
// Copyright (C) 2025, Jakob Wakeling
c850c86 Jakob Wakeling 2025-01-11 15:40:24
1
// All rights reserved.
c850c86 Jakob Wakeling 2025-01-11 15:40:24
2
c850c86 Jakob Wakeling 2025-01-11 15:40:24
3
package repo
c850c86 Jakob Wakeling 2025-01-11 15:40:24
4
c850c86 Jakob Wakeling 2025-01-11 15:40:24
5
import (
c850c86 Jakob Wakeling 2025-01-11 15:40:24
6
	"errors"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
7
	"net/http"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
8
	"path/filepath"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
9
	"time"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
10
c850c86 Jakob Wakeling 2025-01-11 15:40:24
11
	"github.com/Jamozed/Goit/src/goit"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
12
	"github.com/Jamozed/Goit/src/util"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
13
	"github.com/go-chi/chi/v5"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
14
	"github.com/go-git/go-git/v5"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
15
	"github.com/go-git/go-git/v5/plumbing"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
16
	"github.com/go-git/go-git/v5/plumbing/object"
c850c86 Jakob Wakeling 2025-01-11 15:40:24
17
)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
18
c850c86 Jakob Wakeling 2025-01-11 15:40:24
19
func HandleTag(w http.ResponseWriter, r *http.Request) {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
20
	auth, user, err := goit.Auth(w, r, true)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
21
	if err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
22
		util.PrintFuncError(err)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
23
		goit.HttpError(w, http.StatusInternalServerError)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
24
		return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
25
	}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
26
c850c86 Jakob Wakeling 2025-01-11 15:40:24
27
	repo, err := goit.GetRepoByName(chi.URLParam(r, "repo"))
c850c86 Jakob Wakeling 2025-01-11 15:40:24
28
	if err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
29
		goit.HttpError(w, http.StatusInternalServerError)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
30
		return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
31
	} else if repo == nil || !goit.IsVisible(repo, auth, user) {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
32
		goit.HttpError(w, http.StatusNotFound)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
33
		return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
34
	}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
35
c850c86 Jakob Wakeling 2025-01-11 15:40:24
36
	data := struct {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
37
		HeaderFields
c850c86 Jakob Wakeling 2025-01-11 15:40:24
38
		Title                     string
c850c86 Jakob Wakeling 2025-01-11 15:40:24
39
		Tag, Author, Date, Commit string
c850c86 Jakob Wakeling 2025-01-11 15:40:24
40
		Parents                   []string
c850c86 Jakob Wakeling 2025-01-11 15:40:24
41
		Message                   string
c850c86 Jakob Wakeling 2025-01-11 15:40:24
42
	}{
c850c86 Jakob Wakeling 2025-01-11 15:40:24
43
		HeaderFields: GetHeaderFields(auth, user, repo, r.Host),
c850c86 Jakob Wakeling 2025-01-11 15:40:24
44
		Title:        repo.Name + " - Tags",
c850c86 Jakob Wakeling 2025-01-11 15:40:24
45
	}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
46
c850c86 Jakob Wakeling 2025-01-11 15:40:24
47
	gr, err := git.PlainOpen(goit.RepoPath(repo.Name, true))
c850c86 Jakob Wakeling 2025-01-11 15:40:24
48
	if err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
49
		util.PrintFuncError(err)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
50
		goit.HttpError(w, http.StatusInternalServerError)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
51
		return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
52
	}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
53
c850c86 Jakob Wakeling 2025-01-11 15:40:24
54
	head, err := gr.Head()
c850c86 Jakob Wakeling 2025-01-11 15:40:24
55
	if err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
56
		if !errors.Is(err, plumbing.ErrReferenceNotFound) {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
57
			util.PrintFuncError(err)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
58
			goit.HttpError(w, http.StatusInternalServerError)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
59
			return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
60
		}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
61
	} else {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
62
		if readme, _ := findPattern(gr, head, readmePattern); readme != "" {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
63
			data.Readme = filepath.Join("/", repo.Name, "file", readme)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
64
		}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
65
		if licence, _ := findPattern(gr, head, licencePattern); licence != "" {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
66
			data.Licence = filepath.Join("/", repo.Name, "file", licence)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
67
		}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
68
	}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
69
c850c86 Jakob Wakeling 2025-01-11 15:40:24
70
	ref, err := gr.Tag(chi.URLParam(r, "tag"))
c850c86 Jakob Wakeling 2025-01-11 15:40:24
71
	if errors.Is(err, plumbing.ErrReferenceNotFound) {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
72
		goit.HttpError(w, http.StatusNotFound)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
73
		return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
74
	} else if err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
75
		util.PrintFuncError(err)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
76
		goit.HttpError(w, http.StatusInternalServerError)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
77
		return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
78
	}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
79
c850c86 Jakob Wakeling 2025-01-11 15:40:24
80
	data.Tag = ref.Name().Short()
c850c86 Jakob Wakeling 2025-01-11 15:40:24
81
c850c86 Jakob Wakeling 2025-01-11 15:40:24
82
	var commit *object.Commit
c850c86 Jakob Wakeling 2025-01-11 15:40:24
83
	if tag, err := gr.TagObject(ref.Hash()); err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
84
		if !errors.Is(err, plumbing.ErrObjectNotFound) {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
85
			util.PrintFuncError(err)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
86
			goit.HttpError(w, http.StatusInternalServerError)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
87
			return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
88
		}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
89
c850c86 Jakob Wakeling 2025-01-11 15:40:24
90
		/* Tag is not annotated. */
c850c86 Jakob Wakeling 2025-01-11 15:40:24
91
		if commit, err = gr.CommitObject(ref.Hash()); err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
92
			util.PrintFuncError(err)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
93
			goit.HttpError(w, http.StatusInternalServerError)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
94
			return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
95
		}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
96
c850c86 Jakob Wakeling 2025-01-11 15:40:24
97
		data.Author = commit.Author.String()
c850c86 Jakob Wakeling 2025-01-11 15:40:24
98
		data.Message = commit.Message
c850c86 Jakob Wakeling 2025-01-11 15:40:24
99
	} else {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
100
		/* Tag is annotated. */
c850c86 Jakob Wakeling 2025-01-11 15:40:24
101
		if commit, err = gr.CommitObject(tag.Target); err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
102
			util.PrintFuncError(err)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
103
			goit.HttpError(w, http.StatusInternalServerError)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
104
			return
c850c86 Jakob Wakeling 2025-01-11 15:40:24
105
		}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
106
c850c86 Jakob Wakeling 2025-01-11 15:40:24
107
		data.Author = tag.Tagger.String()
c850c86 Jakob Wakeling 2025-01-11 15:40:24
108
		data.Message = tag.Message
c850c86 Jakob Wakeling 2025-01-11 15:40:24
109
	}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
110
c850c86 Jakob Wakeling 2025-01-11 15:40:24
111
	data.Date = commit.Author.When.UTC().Format(time.DateTime)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
112
	data.Commit = commit.Hash.String()
c850c86 Jakob Wakeling 2025-01-11 15:40:24
113
c850c86 Jakob Wakeling 2025-01-11 15:40:24
114
	if err := goit.Tmpl.ExecuteTemplate(w, "repo/tag", data); err != nil {
c850c86 Jakob Wakeling 2025-01-11 15:40:24
115
		util.PrintFuncError(err)
c850c86 Jakob Wakeling 2025-01-11 15:40:24
116
	}
c850c86 Jakob Wakeling 2025-01-11 15:40:24
117
}
118