all repos

mugit @ 5957dc0

🐮 git server that your cow will love

mugit/internal/handlers/feed.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
ui: fix feeds, include links protocol, 3 months ago
1
package handlers
2
3
import (
4
	"net/http"
5
	"net/url"
6
7
	"github.com/gorilla/feeds"
8
)
9
10
func (h *handlers) repoFeedHandler(w http.ResponseWriter, r *http.Request) {
11
	repo, err := h.openPublicRepo(r.PathValue("name"), "")
12
	if err != nil {
13
		h.write404(w, err)
14
		return
15
	}
16
17
	desc, err := repo.Description()
18
	if err != nil {
19
		h.write500(w, err)
20
		return
21
	}
22
23
	repoName := repo.Name()
24
25
	feedLink, err := url.JoinPath("http://", h.c.Meta.Host, repoName)
26
	if err != nil {
27
		h.write500(w, err)
28
		return
29
	}
30
31
	feed := &feeds.Feed{
32
		Title:       repoName,
33
		Link:        &feeds.Link{Href: feedLink},
34
		Description: desc,
35
	}
36
37
	// branches
38
	branches, err := repo.Branches()
39
	if err != nil {
40
		h.write500(w, err)
41
		return
42
	}
43
44
	for _, branch := range branches {
45
		href, _ := url.JoinPath("http://", h.c.Meta.Host, repoName, "tree", branch.Name)
46
		feed.Items = append(feed.Items, &feeds.Item{
47
			Id:      "b:" + branch.Name,
48
			Title:   "branch: " + branch.Name,
49
			Link:    &feeds.Link{Href: href},
50
			Updated: branch.LastUpdate,
51
		})
52
	}
53
54
	// tags
55
	tags, err := repo.Tags()
56
	if err != nil {
57
		h.write500(w, err)
58
	}
59
60
	for _, tag := range tags {
61
		href, _ := url.JoinPath("http://", h.c.Meta.Host, repoName, "tree", tag.Name())
62
		feed.Items = append(feed.Items, &feeds.Item{
63
			Id:          "t:" + tag.Name(),
64
			Title:       "tag: " + tag.Name(),
65
			Link:        &feeds.Link{Href: href},
66
			Description: desc,
67
			Updated:     tag.When(),
68
			Content:     tag.Message(),
69
		})
70
	}
71
72
	rss, err := feed.ToRss()
73
	if err != nil {
74
		h.write500(w, err)
75
		return
76
	}
77
78
	w.Header().Set("Content-Type", "application/rss+xml")
79
	w.Write([]byte(rss))
80
}
81
82
func (h *handlers) indexFeedHandler(w http.ResponseWriter, r *http.Request) {
83
	repos, err := h.listPublicRepos()
84
	if err != nil {
85
		h.write500(w, err)
86
		return
87
	}
88
89
	feedLink, err := url.JoinPath("http://", h.c.Meta.Host)
90
	if err != nil {
91
		h.write500(w, err)
92
		return
93
	}
94
95
	feed := &feeds.Feed{
96
		Title:       h.c.Meta.Host,
97
		Link:        &feeds.Link{Href: feedLink},
98
		Description: h.c.Meta.Description,
99
	}
100
101
	for _, repo := range repos {
102
		href, _ := url.JoinPath("http://", h.c.Meta.Host, repo.Name)
103
		feed.Items = append(feed.Items, &feeds.Item{
104
			Title:       repo.Name,
105
			Link:        &feeds.Link{Href: href},
106
			Description: repo.Desc,
107
			Id:          repo.Name,
108
			Updated:     repo.LastCommit,
109
			Content:     repo.Desc,
110
		})
111
	}
112
113
	rss, err := feed.ToRss()
114
	if err != nil {
115
		h.write500(w, err)
116
		return
117
	}
118
119
	w.Header().Set("Content-Type", "application/rss+xml")
120
	w.Write([]byte(rss))
121
}