forked from tangled.org/core
this repo has no description

add repo-tree template

Changed files
+116 -54
appview
pages
templates
state
knotserver
types
+10
appview/pages/pages.go
···
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)
+
}
+2 -2
appview/pages/templates/repo/index.html
···
-
{{define "title"}} {{ .RepoInfo.OwnerWithAt }} / {{ .RepoInfo.Name }} {{end}}
+
{{define "title"}} {{ .RepoInfo.FullName }} {{end}}
{{define "content"}}
<h1>
-
{{ .RepoInfo.OwnerWithAt }} / {{ .RepoInfo.Name }}
+
{{ .RepoInfo.FullName }}
</h1>
<main>
{{- if .IsEmpty }}
+21 -26
appview/pages/templates/repo/tree.html
···
-
<html>
+
{{define "title"}} {{ .RepoInfo.FullName }} {{end}}
-
{{ template "layouts/head" . }}
+
{{define "content"}}
-
{{ template "layouts/repo-header" . }}
-
<body>
-
{{ template "layouts/nav" . }}
+
<h1>
+
{{ .RepoInfo.FullName }}
+
</h1>
<main>
-
{{ $repo := .name }}
-
{{ $ref := .ref }}
-
{{ $parent := .parent }}
-
<div class="tree">
-
{{ if $parent }}
+
+
{{ if .Parent }}
<div></div>
<div></div>
-
<div><a href="/{{ $repo }}/tree/{{ $ref }}/{{ .dotdot }}">..</a></div>
+
<div><a href="/{{ .RepoInfo.FullName }}/tree/{{ .Ref }}/{{ .DotDot }}">..</a></div>
{{ end }}
-
{{ range .files }}
+
+
{{ range .Files }}
{{ if not .IsFile }}
<div class="mode">{{ .Mode }}</div>
<div class="size">{{ .Size }}</div>
<div>
-
{{ if $parent }}
-
<a href="/{{ $repo }}/tree/{{ $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}/</a>
+
{{ if $.Parent }}
+
<a href="/{{ .RepoInfo.FullName }}/tree/{{ $.Ref }}/{{ $.Parent }}/{{ .Name }}">{{ .Name }}/</a>
{{ else }}
-
<a href="/{{ $repo }}/tree/{{ $ref }}/{{ .Name }}">{{ .Name }}/</a>
+
<a href="/{{ .RepoInfo.FullName }}/tree/{{ $.Ref }}/{{ .Name }}">{{ .Name }}/</a>
{{ end }}
</div>
+
<hr />
{{ end }}
{{ end }}
-
{{ range .files }}
+
+
{{ range .Files }}
{{ if .IsFile }}
<div class="mode">{{ .Mode }}</div>
<div class="size">{{ .Size }}</div>
<div>
-
{{ if $parent }}
-
<a href="/{{ $repo }}/blob/{{ $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}</a>
+
{{ if $.Parent }}
+
<a href="/{{ $.RepoInfo.FullName }}/blob/{{ $.Ref }}/{{ $.Parent }}/{{ .Name }}">{{ .Name }}</a>
{{ else }}
-
<a href="/{{ $repo }}/blob/{{ $ref }}/{{ .Name }}">{{ .Name }}</a>
+
<a href="/{{ $.RepoInfo.FullName }}/blob/{{ $.Ref }}/{{ .Name }}">{{ .Name }}</a>
{{ end }}
</div>
+
<hr />
{{ end }}
{{ end }}
</div>
-
<article>
-
<pre>
-
{{- if .readme }}{{ .readme }}{{- end -}}
-
</pre>
-
</article>
</main>
-
</body>
-
</html>
+
{{end}}
+42
appview/state/repo.go
···
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)
+3
appview/state/state.go
···
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
+6 -14
knotserver/git/tree.go
···
"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)
···
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(),
+14 -6
knotserver/routes.go
···
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
}
+8 -6
types/repo.go
···
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"`
+
}
+10
types/tree.go
···
+
package types
+
+
// A nicer git tree representation.
+
type NiceTree struct {
+
Name string
+
Mode string
+
Size int64
+
IsFile bool
+
IsSubtree bool
+
}