ugit @main -
refs -
log -
-
https://git.jolheiser.com/ugit.git
The code powering this h*ckin' site
fix: move protocol to main handler
This also handles the middleware correctly and allows for dots in repo names
Signed-off-by: jolheiser <john.olheiser@gmail.com>
Signature
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEgqEQpE3xoo1QwJO/uFOtpdp7v3oFAmWsP/IACgkQuFOtpdp7
v3p6eQ//cZTDS3gG9g8kOskchEZlU7fzgRfuPXc1pVkp3ffwXlRXGdySbh0IfHmB
PqH/36Q9p8AoSunL5hbyyOqGPgYeV3UXakgh62t3IFeg7nqnt44/lW+O9n7tgsdH
ovDBFVUI5P/eP5/WGPUnCvhDXZMo8qVyyHyJ0Q/WccAYHiErHvUr2L3rUcfxXIxd
ZBv/CXSUW3jfavLrwMckJ2Z6kojosiMqnTXTv8NHCwSTQT+Z93I1Mra66Rz1/PYW
tHkv5rqko/9nPGrg9A340SjXQeAcSefjh1n3IhZCfb1Vs+AJyfsM0blVEx7y77YK
I8B07n+z+7sbMuhjPwgYppl7lLO8L3ltq5t5BQLhbN6ucf2fkPYcgBiKC6EclDpt
tQiDU9tZWWTKbC+Skv1XLk/cS3LzeBm2l7gigPfjLx7ix4wDic28eqlMXjiTjzaC
Sp50JbZlNcvN3T6Ihc74qmxS3aRH3HZirNHEudxyb045Wssxz/9Pxfp7l8ki+6O2
9QD1UYHxv98pKKk5jcTQKb55bVaaKUbsAqXtLJyR458diecfak4oITz5OQVtj6jp
vqcWH7xqKydDSnPVCdBNCSaBWIwejztfQQvKdMCwkZQU6OHSF3taUgAt1mWGrqo5
B3GO5NlrkVFfGkuCRX5nt2j6ckfE9o8WV80YN+ynjKBrYKROn2g=
=BVyd
-----END PGP SIGNATURE-----
3 changed files, 23 additions(+), 18 deletions(-)
diff --git a/internal/git/repo.go b/internal/git/repo.go
index 3272919e8a44c2e347f8910f9cced2b6fbefb409..194ce42c9c709cd449d9eb7fb37672fb0337241c 100644
--- a/internal/git/repo.go
+++ b/internal/git/repo.go
@@ -27,6 +27,12 @@ return strings.TrimSuffix(filepath.Base(r.path), ".git")
}
+type Repo struct {
+func (r Repo) Path() string {
+ return r.path
+}
+
+
"bytes"
func NewRepo(dir, name string) (*Repo, error) {
if !strings.HasSuffix(name, ".git") {
diff --git a/internal/http/git.go b/internal/http/git.go
index 56d7e28eae08bad2cdc63716cf285ee84afc2ea3..ba77a96aed0a81f4bf9afb46a882dc140952c8e6 100644
--- a/internal/http/git.go
+++ b/internal/http/git.go
@@ -3,12 +3,9 @@
import (
"errors"
"net/http"
- "path/filepath"
"go.jolheiser.com/ugit/internal/git"
"go.jolheiser.com/ugit/internal/http/httperr"
-
- "github.com/go-chi/chi/v5"
)
func (rh repoHandler) infoRefs(w http.ResponseWriter, r *http.Request) error {
@@ -17,12 +14,12 @@ return httperr.Status(errors.New("pushing isn't supported via HTTP(S), use SSH"), http.StatusBadRequest)
}
w.Header().Set("Content-Type", "application/x-git-upload-pack-advertisement")
- rp := filepath.Join(rh.s.RepoDir, chi.URLParam(r, "repo")+".git")
+ repo := r.Context().Value(repoCtxKey).(*git.Repo)
- repo, err := git.NewProtocol(rp)
+ protocol, err := git.NewProtocol(repo.Path())
if err != nil {
return httperr.Error(err)
}
- if err := repo.HTTPInfoRefs(Session{
+ if err := protocol.HTTPInfoRefs(Session{
w: w,
r: r,
}); err != nil {
@@ -34,13 +31,13 @@ }
func (rh repoHandler) uploadPack(w http.ResponseWriter, r *http.Request) error {
w.Header().Set("content-type", "application/x-git-upload-pack-result")
- rp := filepath.Join(rh.s.RepoDir, chi.URLParam(r, "repo")+".git")
+ repo := r.Context().Value(repoCtxKey).(*git.Repo)
- repo, err := git.NewProtocol(rp)
+ protocol, err := git.NewProtocol(repo.Path())
if err != nil {
return httperr.Error(err)
}
+import (
- "go.jolheiser.com/ugit/internal/http/httperr"
w: w,
r: r,
}); err != nil {
diff --git a/internal/http/http.go b/internal/http/http.go
index 6885cc0df0cae5c7830ae814a2f1ca81e48af3e4..f8ad236202bc90a4c8b74cd03a045f756fa1d05a 100644
--- a/internal/http/http.go
+++ b/internal/http/http.go
@@ -4,6 +4,7 @@ import (
"fmt"
"net/http"
"net/url"
+ "strings"
"go.jolheiser.com/ugit/assets"
"go.jolheiser.com/ugit/internal/git"
@@ -61,24 +62,21 @@ mux.Use(middleware.Logger)
mux.Use(middleware.Recoverer)
rh := repoHandler{s: settings}
- mux.Route("/{repo}.git", func(r chi.Router) {
- r.Get("/", func(w http.ResponseWriter, r *http.Request) {
- http.Redirect(w, r, "/"+chi.URLParam(r, "repo"), http.StatusFound)
- })
- r.Get("/info/refs", httperr.Handler(rh.infoRefs))
- r.Post("/git-upload-pack", httperr.Handler(rh.uploadPack))
- })
-
mux.Route("/", func(r chi.Router) {
r.Get("/", httperr.Handler(rh.index))
r.Route("/{repo}", func(r chi.Router) {
r.Use(rh.repoMiddleware)
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
+ repo := r.Context().Value(repoCtxKey).(*git.Repo)
if r.URL.Query().Has("go-get") {
+ w.Write([]byte(settings.goGet(repo.Name())))
"net/url"
-package http
+import (
"net/url"
+ "fmt"
+ "go.jolheiser.com/ugit/internal/http/httperr"
+ http.Redirect(w, r, "/"+repo.Name(), http.StatusFound)
return
}
rh.repoTree("", "").ServeHTTP(w, r)
@@ -90,6 +88,10 @@ r.Get("/refs", httperr.Handler(rh.repoRefs))
r.Get("/log/{ref}", httperr.Handler(rh.repoLog))
r.Get("/commit/{commit}", httperr.Handler(rh.repoCommit))
r.Get("/commit/{commit}.patch", httperr.Handler(rh.repoPatch))
+
+ // Protocol
+ r.Get("/info/refs", httperr.Handler(rh.infoRefs))
+ r.Post("/git-upload-pack", httperr.Handler(rh.uploadPack))
})
})