diff --git a/appview/pages/pages.go b/appview/pages/pages.go index a5b2b94e..5b9fe993 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -175,3 +175,13 @@ type RepoCommitParams struct { func (p *Pages) RepoCommit(w io.Writer, params RepoCommitParams) error { return p.execute("repo/commit", w, params) } + +type RepoTreeParams struct { + LoggedInUser *auth.User + RepoInfo RepoInfo + types.RepoTreeResponse +} + +func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { + return p.execute("repo/tree", w, params) +} diff --git a/appview/pages/templates/repo/index.html b/appview/pages/templates/repo/index.html index 537a3f80..644f2ed1 100644 --- a/appview/pages/templates/repo/index.html +++ b/appview/pages/templates/repo/index.html @@ -1,9 +1,9 @@ -{{define "title"}} {{ .RepoInfo.OwnerWithAt }} / {{ .RepoInfo.Name }} {{end}} +{{define "title"}} {{ .RepoInfo.FullName }} {{end}} {{define "content"}}

-{{ .RepoInfo.OwnerWithAt }} / {{ .RepoInfo.Name }} +{{ .RepoInfo.FullName }}

{{- if .IsEmpty }} diff --git a/appview/pages/templates/repo/tree.html b/appview/pages/templates/repo/tree.html index 3f425245..d5bf89fd 100644 --- a/appview/pages/templates/repo/tree.html +++ b/appview/pages/templates/repo/tree.html @@ -1,53 +1,48 @@ - +{{define "title"}} {{ .RepoInfo.FullName }} {{end}} -{{ template "layouts/head" . }} +{{define "content"}} - {{ template "layouts/repo-header" . }} - - {{ template "layouts/nav" . }} +

+{{ .RepoInfo.FullName }} +

- {{ $repo := .name }} - {{ $ref := .ref }} - {{ $parent := .parent }} -
- {{ if $parent }} + + {{ if .Parent }}
-
..
+
..
{{ end }} - {{ range .files }} + + {{ range .Files }} {{ if not .IsFile }}
{{ .Mode }}
{{ .Size }}
- {{ if $parent }} - {{ .Name }}/ + {{ if $.Parent }} + {{ .Name }}/ {{ else }} - {{ .Name }}/ + {{ .Name }}/ {{ end }}
+
{{ end }} {{ end }} - {{ range .files }} + + {{ range .Files }} {{ if .IsFile }}
{{ .Mode }}
{{ .Size }}
- {{ if $parent }} - {{ .Name }} + {{ if $.Parent }} + {{ .Name }} {{ else }} - {{ .Name }} + {{ .Name }} {{ end }}
+
{{ end }} {{ end }}
-
-
-          {{- if .readme }}{{ .readme }}{{- end -}}
-        
-
- - \ No newline at end of file + {{end}} diff --git a/appview/state/repo.go b/appview/state/repo.go index dc652451..9d8458f5 100644 --- a/appview/state/repo.go +++ b/appview/state/repo.go @@ -133,6 +133,48 @@ func (s *State) RepoCommit(w http.ResponseWriter, r *http.Request) { return } +func (s *State) RepoTree(w http.ResponseWriter, r *http.Request) { + repoName, knot, id, err := repoKnotAndId(r) + if err != nil { + log.Println("failed to get repo and knot", err) + return + } + + ref := chi.URLParam(r, "ref") + treePath := chi.URLParam(r, "*") + resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/tree/%s/%s", knot, id.DID.String(), repoName, ref, treePath)) + if err != nil { + log.Println("failed to reach knotserver", err) + return + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatalf("Error reading response body: %v", err) + return + } + + var result types.RepoTreeResponse + err = json.Unmarshal(body, &result) + if err != nil { + log.Println("failed to parse response:", err) + return + } + + log.Println(result) + + s.pages.RepoTree(w, pages.RepoTreeParams{ + LoggedInUser: s.auth.GetUser(r), + RepoInfo: pages.RepoInfo{ + OwnerDid: id.DID.String(), + OwnerHandle: id.Handle.String(), + Name: repoName, + }, + RepoTreeResponse: result, + }) + return +} + func repoKnotAndId(r *http.Request) (string, string, identity.Identity, error) { repoName := chi.URLParam(r, "repo") knot, ok := r.Context().Value("knot").(string) diff --git a/appview/state/state.go b/appview/state/state.go index cc9e9f02..e10d11b5 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -602,6 +602,9 @@ func (s *State) UserRouter() http.Handler { r.With(ResolveRepoKnot(s)).Route("/{repo}", func(r chi.Router) { r.Get("/", s.RepoIndex) r.Get("/log/{ref}", s.RepoLog) + r.Route("/tree/{ref}", func(r chi.Router) { + r.Get("/*", s.RepoTree) + }) r.Get("/commit/{ref}", s.RepoCommit) // These routes get proxied to the knot diff --git a/knotserver/git/tree.go b/knotserver/git/tree.go index 88ad1c10..a567b6dc 100644 --- a/knotserver/git/tree.go +++ b/knotserver/git/tree.go @@ -4,15 +4,16 @@ import ( "fmt" "github.com/go-git/go-git/v5/plumbing/object" + "github.com/sotangled/tangled/types" ) -func (g *GitRepo) FileTree(path string) ([]NiceTree, error) { +func (g *GitRepo) FileTree(path string) ([]types.NiceTree, error) { c, err := g.r.CommitObject(g.h) if err != nil { return nil, fmt.Errorf("commit object: %w", err) } - files := []NiceTree{} + files := []types.NiceTree{} tree, err := c.Tree() if err != nil { return nil, fmt.Errorf("file tree: %w", err) @@ -39,22 +40,13 @@ func (g *GitRepo) FileTree(path string) ([]NiceTree, error) { return files, nil } -// A nicer git tree representation. -type NiceTree struct { - Name string - Mode string - Size int64 - IsFile bool - IsSubtree bool -} - -func makeNiceTree(t *object.Tree) []NiceTree { - nts := []NiceTree{} +func makeNiceTree(t *object.Tree) []types.NiceTree { + nts := []types.NiceTree{} for _, e := range t.Entries { mode, _ := e.Mode.ToOSFileMode() sz, _ := t.Size(e.Name) - nts = append(nts, NiceTree{ + nts = append(nts, types.NiceTree{ Name: e.Name, Mode: mode.String(), IsFile: e.Mode.IsFile(), diff --git a/knotserver/routes.go b/knotserver/routes.go index 55e865da..a6612ab9 100644 --- a/knotserver/routes.go +++ b/knotserver/routes.go @@ -122,13 +122,21 @@ func (h *Handle) RepoTree(w http.ResponseWriter, r *http.Request) { return } - data := make(map[string]any) - data["ref"] = ref - data["parent"] = treePath - data["desc"] = getDescription(path) - data["dotdot"] = filepath.Dir(treePath) + resp := types.RepoTreeResponse{ + Ref: ref, + Parent: treePath, + Description: getDescription(path), + DotDot: filepath.Dir(treePath), + Files: files, + } + // data := make(map[string]any) + // data["ref"] = ref + // data["parent"] = treePath + // data["desc"] = getDescription(path) + // data["dotdot"] = filepath.Dir(treePath) - h.listFiles(files, data, w) + writeJSON(w, resp) + // h.listFiles(files, data, w) return } diff --git a/types/repo.go b/types/repo.go index 092826d1..e2fccf63 100644 --- a/types/repo.go +++ b/types/repo.go @@ -24,13 +24,15 @@ type RepoLogResponse struct { PerPage int `json:"per_page,omitempty"` } -// data["commit"] = diff.Commit -// -// data["stat"] = diff.Stat -// data["diff"] = diff.Diff -// data["ref"] = ref -// data["desc"] = getDescription(path) type RepoCommitResponse struct { Ref string `json:"ref,omitempty"` Diff *NiceDiff `json:"diff,omitempty"` } + +type RepoTreeResponse struct { + Ref string `json:"ref,omitempty"` + Parent string `json:"parent,omitempty"` + Description string `json:"description,omitempty"` + DotDot string `json:"dotdot,omitempty"` + Files []NiceTree `json:"files,omitempty"` +} diff --git a/types/tree.go b/types/tree.go new file mode 100644 index 00000000..5b0063fb --- /dev/null +++ b/types/tree.go @@ -0,0 +1,10 @@ +package types + +// A nicer git tree representation. +type NiceTree struct { + Name string + Mode string + Size int64 + IsFile bool + IsSubtree bool +}