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
|
|