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 }}
+
{{ end }}
{{ end }}
- {{ range .files }}
+
+ {{ range .Files }}
{{ if .IsFile }}
{{ .Mode }}
{{ .Size }}
+
{{ 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
+}