+3
appview/pages/funcmap.go
+3
appview/pages/funcmap.go
+19
appview/repo/repo.go
+19
appview/repo/repo.go
···
81
81
}
82
82
}
83
83
84
+
func (rp *Repo) DownloadArchive(w http.ResponseWriter, r *http.Request) {
85
+
refParam := chi.URLParam(r, "ref")
86
+
f, err := rp.repoResolver.Resolve(r)
87
+
if err != nil {
88
+
log.Println("failed to get repo and knot", err)
89
+
return
90
+
}
91
+
92
+
var uri string
93
+
if rp.config.Core.Dev {
94
+
uri = "http"
95
+
} else {
96
+
uri = "https"
97
+
}
98
+
url := fmt.Sprintf("%s://%s/%s/%s/archive/%s.tar.gz", uri, f.Knot, f.OwnerDid(), f.RepoName, url.PathEscape(refParam))
99
+
100
+
http.Redirect(w, r, url, http.StatusFound)
101
+
}
102
+
84
103
func (rp *Repo) RepoLog(w http.ResponseWriter, r *http.Request) {
85
104
f, err := rp.repoResolver.Resolve(r)
86
105
if err != nil {
+4
appview/repo/router.go
+4
appview/repo/router.go
···
38
38
r.Get("/blob/{ref}/*", rp.RepoBlob)
39
39
r.Get("/raw/{ref}/*", rp.RepoBlobRaw)
40
40
41
+
// intentionally doesn't use /* as this isn't
42
+
// a file path
43
+
r.Get("/archive/{ref}", rp.DownloadArchive)
44
+
41
45
r.Route("/fork", func(r chi.Router) {
42
46
r.Use(middleware.AuthMiddleware(rp.oauth))
43
47
r.Get("/", rp.ForkRepo)