diff options
author | Runxi Yu <me@runxiyu.org> | 2025-04-05 17:21:14 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-04-05 17:21:14 +0800 |
commit | 9b17278aece47aca17d32a37f67b7078708e78be (patch) | |
tree | 8badae3ed3e9594fae3f9de6e23468165a69e5d4 /http_handle_repo_tree.go | |
parent | Remove the extra .gitignore in man/ (diff) | |
download | forge-9b17278aece47aca17d32a37f67b7078708e78be.tar.gz forge-9b17278aece47aca17d32a37f67b7078708e78be.tar.zst forge-9b17278aece47aca17d32a37f67b7078708e78be.zip |
Refactor git2d comms to ./git2c
Diffstat (limited to 'http_handle_repo_tree.go')
-rw-r--r-- | http_handle_repo_tree.go | 117 |
1 files changed, 17 insertions, 100 deletions
diff --git a/http_handle_repo_tree.go b/http_handle_repo_tree.go index 347026d..d577f48 100644 --- a/http_handle_repo_tree.go +++ b/http_handle_repo_tree.go @@ -4,15 +4,11 @@ package main import ( - "errors" - "fmt" "html/template" - "io" - "net" "net/http" "strings" - "git.sr.ht/~sircmpwn/go-bare" + "go.lindenii.runxiyu.org/forge/git2c" ) // httpHandleRepoTree provides a friendly, syntax-highlighted view of @@ -28,108 +24,29 @@ func httpHandleRepoTree(writer http.ResponseWriter, request *http.Request, param _, 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()) - return - } - - switch kind { - case 1: - // Tree - 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_tree_dir", params) - - case 2: - // Blob - content, err := brReader.ReadData() - if err != nil && !errors.Is(err, io.EOF) { - errorPage500(writer, params, "error reading file content: "+err.Error()) - return - } - rendered := renderHighlightedFile(pathSpec, bytesToString(content)) - params["file_contents"] = rendered - renderTemplate(writer, "repo_tree_file", params) - - default: - errorPage500(writer, params, fmt.Sprintf("unknown kind: %d", kind)) - return - } - - case 3: - errorPage500(writer, params, "path not found: "+pathSpec) - return - - default: - errorPage500(writer, params, fmt.Sprintf("unknown status code: %d", status)) + 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_tree_dir", params) + } else if content != "" { + rendered := renderHighlightedFile(pathSpec, content) + params["file_contents"] = rendered + renderTemplate(writer, "repo_tree_file", params) + } else { + errorPage500(writer, params, "Unknown object type, something is seriously wrong") } } |