aboutsummaryrefslogtreecommitdiff
path: root/http_handle_repo_raw.go
diff options
context:
space:
mode:
Diffstat (limited to 'http_handle_repo_raw.go')
-rw-r--r--http_handle_repo_raw.go119
1 files changed, 17 insertions, 102 deletions
diff --git a/http_handle_repo_raw.go b/http_handle_repo_raw.go
index d12fa39..54ca931 100644
--- a/http_handle_repo_raw.go
+++ b/http_handle_repo_raw.go
@@ -4,15 +4,12 @@
package main
import (
- "errors"
"fmt"
"html/template"
- "io"
- "net"
"net/http"
"strings"
- "git.sr.ht/~sircmpwn/go-bare"
+ "go.lindenii.runxiyu.org/forge/git2c"
)
// httpHandleRepoRaw serves raw files, or directory listings that point to raw
@@ -26,113 +23,31 @@ func httpHandleRepoRaw(writer http.ResponseWriter, request *http.Request, params
_, repoPath, _, _, _, _, _ := getRepoInfo(request.Context(), groupPath, repoName, "")
- conn, err := net.Dial("unix", config.Git.Socket)
+ client, err := git2c.NewClient(config.Git.Socket)
if err != nil {
- errorPage500(writer, params, "git2d connection failed: "+err.Error())
+ errorPage500(writer, params, err.Error())
return
}
- defer conn.Close()
+ defer client.Close()
- brWriter := bare.NewWriter(conn)
- brReader := bare.NewReader(conn)
-
- if err := brWriter.WriteData(stringToBytes(repoPath)); err != nil {
- errorPage500(writer, params, "sending repo path failed: "+err.Error())
- return
- }
- if err := brWriter.WriteUint(2); err != nil {
- errorPage500(writer, params, "sending command failed: "+err.Error())
- return
- }
- if err := brWriter.WriteData(stringToBytes(pathSpec)); err != nil {
- errorPage500(writer, params, "sending path failed: "+err.Error())
- return
- }
-
- status, err := brReader.ReadUint()
+ files, content, err := client.Cmd2(repoPath, pathSpec)
if err != nil {
- errorPage500(writer, params, "reading status failed: "+err.Error())
+ errorPage500(writer, params, err.Error())
return
}
- switch status {
- case 0:
- kind, err := brReader.ReadUint()
- if err != nil {
- errorPage500(writer, params, "reading object kind failed: "+err.Error())
+ if files != nil {
+ params["files"] = files
+ params["readme_filename"] = "README.md"
+ params["readme"] = template.HTML("<p>README rendering here is WIP again</p>") // TODO
+ renderTemplate(writer, "repo_raw_dir", params)
+ } else if content != "" {
+ if redirectNoDir(writer, request) {
return
}
-
- switch kind {
- case 1:
- // Tree
- if redirectDir(writer, request) {
- return
- }
- count, err := brReader.ReadUint()
- if err != nil {
- errorPage500(writer, params, "reading entry count failed: "+err.Error())
- return
- }
-
- files := make([]displayTreeEntry, 0, count)
- for range count {
- typeCode, err := brReader.ReadUint()
- if err != nil {
- errorPage500(writer, params, "error reading entry type: "+err.Error())
- return
- }
- mode, err := brReader.ReadUint()
- if err != nil {
- errorPage500(writer, params, "error reading entry mode: "+err.Error())
- return
- }
- size, err := brReader.ReadUint()
- if err != nil {
- errorPage500(writer, params, "error reading entry size: "+err.Error())
- return
- }
- name, err := brReader.ReadData()
- if err != nil {
- errorPage500(writer, params, "error reading entry name: "+err.Error())
- return
- }
- files = append(files, displayTreeEntry{
- Name: bytesToString(name),
- Mode: fmt.Sprintf("%06o", mode),
- Size: size,
- IsFile: typeCode == 2,
- IsSubtree: typeCode == 1,
- })
- }
-
- params["files"] = files
- params["readme_filename"] = "README.md"
- params["readme"] = template.HTML("<p>README rendering here is WIP again</p>") // TODO
-
- renderTemplate(writer, "repo_raw_dir", params)
-
- case 2:
- // Blob
- if redirectNoDir(writer, request) {
- return
- }
- content, err := brReader.ReadData()
- if err != nil && !errors.Is(err, io.EOF) {
- errorPage500(writer, params, "error reading blob content: "+err.Error())
- return
- }
- writer.Header().Set("Content-Type", "application/octet-stream")
- fmt.Fprint(writer, bytesToString(content))
-
- default:
- errorPage500(writer, params, fmt.Sprintf("unknown object kind: %d", kind))
- }
-
- case 3:
- errorPage500(writer, params, "path not found: "+pathSpec)
-
- default:
- errorPage500(writer, params, fmt.Sprintf("unknown status code: %d", status))
+ writer.Header().Set("Content-Type", "application/octet-stream")
+ fmt.Fprint(writer, content)
+ } else {
+ errorPage500(writer, params, "Unknown error fetching repo raw data")
}
}