Lindenii Project Forge
Commit info | |
---|---|
ID | 0adba4532cb15fe139378c574473fae888cded09 |
Author | Runxi Yu<me@runxiyu.org> |
Author date | Tue, 11 Feb 2025 12:36:50 +0800 |
Committer | Runxi Yu<me@runxiyu.org> |
Committer date | Tue, 11 Feb 2025 12:36:50 +0800 |
Actions | Get patch |
repo_raw: Serve raw files
package main import ( "net/http" "path" "strings" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" ) func handle_repo_raw(w http.ResponseWriter, r *http.Request) { data := make(map[string]any) // TODO: Sanitize path values raw_path_spec := r.PathValue("rest") ref_name, group_name, repo_name, path_spec := r.PathValue("ref"), r.PathValue("group_name"), r.PathValue("repo_name"), strings.TrimSuffix(raw_path_spec, "/") data["ref"], data["group_name"], data["repo_name"], data["path_spec"] = ref_name, group_name, repo_name, path_spec repo, err := open_git_repo(group_name, repo_name) if err != nil { _, _ = w.Write([]byte("Error opening repo: " + err.Error())) return } ref, err := repo.Reference(plumbing.NewBranchReferenceName(ref_name), true) if err != nil { _, _ = w.Write([]byte("Error getting repo reference: " + err.Error())) return } ref_hash := ref.Hash() commit_object, err := repo.CommitObject(ref_hash) if err != nil { _, _ = w.Write([]byte("Error getting commit object: " + err.Error())) return } tree, err := commit_object.Tree() if err != nil { _, _ = w.Write([]byte("Error getting file tree: " + err.Error())) return } var target *object.Tree if path_spec == "" { target = tree } else { target, err = tree.Tree(path_spec) if err != nil { file, err := tree.File(path_spec) if err != nil { _, _ = w.Write([]byte("Error retrieving path: " + err.Error())) return } file_contents, err := file.Contents() if err != nil { _, _ = w.Write([]byte("Error reading file: " + err.Error())) return } _, _ = w.Write([]byte(file_contents)) return } } if len(raw_path_spec) != 0 && raw_path_spec[len(raw_path_spec)-1] != '/' { http.Redirect(w, r, path.Base(path_spec)+"/", http.StatusSeeOther) return } data["files"] = build_display_git_tree(target) err = templates.ExecuteTemplate(w, "repo_raw_dir", data) if err != nil { _, _ = w.Write([]byte("Error rendering template: " + err.Error())) return } }
package main import ( "flag" "net" "net/http" "go.lindenii.runxiyu.org/lindenii-common/clog" ) func main() { config_path := flag.String( "config", "/etc/lindenii/forge.scfg", "path to configuration file", ) flag.Parse() err := load_config(*config_path) if err != nil { clog.Fatal(1, "Loading configuration: "+err.Error()) } err = load_templates() if err != nil { clog.Fatal(1, "Loading templates: "+err.Error()) } err = serve_static() if err != nil { clog.Fatal(1, "Serving static: "+err.Error()) } serve_source() http.HandleFunc("/{$}", handle_index) http.HandleFunc("/g/{group_name}/repos/{$}", handle_group_repos) http.HandleFunc("/g/{group_name}/repos/{repo_name}/{$}", handle_repo_index) http.HandleFunc("/g/{group_name}/repos/{repo_name}/tree/{ref}/{rest...}", handle_repo_tree)
http.HandleFunc("/g/{group_name}/repos/{repo_name}/raw/{ref}/{rest...}", handle_repo_raw)
listener, err := net.Listen(config.HTTP.Net, config.HTTP.Addr) if err != nil { clog.Fatal(1, "Listening: "+err.Error()) } err = http.Serve(listener, nil) if err != nil { clog.Fatal(1, "Serving: "+err.Error()) } }
{{- define "repo_raw_dir" -}} <!DOCTYPE html> <html lang="en"> <head> {{ template "head_common" . }} <title>{{ .group_name }}/repos/{{ .repo_name }}/{{ .path_spec }}{{ if ne .path_spec "" }}/{{ end }} – Lindenii Forge</title> </head> <body class="repo-tree-dir"> <div class="padding-wrapper"> <table id="file-tree"> <thead> <tr class="title-row"> <th colspan="3"> (Raw) /{{ .path_spec }}{{ if ne .path_spec "" }}/{{ end }} on {{ .ref }} </th> </tr> <tr> <th scope="col">Mode</th> <th scope="col">Name</th> <th scope="col">Size</th> </tr> </thead> <tbody> {{- $path_spec := .path_spec }} {{- range .files }} <tr> <td class="file-mode">{{ .Mode }}</td> <td class="file-name"><a href="{{ .Name }}{{ if not .Is_file }}/{{ end }}">{{ .Name }}</a>{{ if not .Is_file }}/{{ end }}</td> <td class="file-size">{{ .Size }}</td> </tr> {{- end }} </tbody> </table> </div> <div class="padding-wrapper"> <div id="refs"> </div> </div> <footer> {{ template "footer" . }} </footer> </body> </html> {{- end -}}