diff --git a/.zed/settings.json b/.zed/settings.json
new file mode 100644
index 00000000..70482e69
--- /dev/null
+++ b/.zed/settings.json
@@ -0,0 +1,15 @@
+// Folder-specific settings
+//
+// For a full list of overridable settings, and general information on folder-specific settings,
+// see the documentation: https://zed.dev/docs/configuring-zed#settings-files
+{
+ "languages": {
+ "HTML": {
+ "prettier": {
+ "allowed": true,
+ "parser": "go-template",
+ "plugins": ["prettier-plugin-go-template"]
+ }
+ }
+ }
+}
diff --git a/appview/pages/pages.go b/appview/pages/pages.go
index 5df08347..f844fc19 100644
--- a/appview/pages/pages.go
+++ b/appview/pages/pages.go
@@ -160,3 +160,13 @@ type RepoLogParams struct {
func (p *Pages) RepoLog(w io.Writer, params RepoLogParams) error {
return p.execute("repo/log", w, params)
}
+
+type RepoCommitParams struct {
+ LoggedInUser *auth.User
+ RepoInfo RepoInfo
+ types.RepoCommitResponse
+}
+
+func (p *Pages) RepoCommit(w io.Writer, params RepoCommitParams) error {
+ return p.execute("repo/commit", w, params)
+}
diff --git a/appview/pages/templates/repo/commit.html b/appview/pages/templates/repo/commit.html
index 83a6e5c0..57db6615 100644
--- a/appview/pages/templates/repo/commit.html
+++ b/appview/pages/templates/repo/commit.html
@@ -1,100 +1,100 @@
-
-{{ template "layouts/head" . }}
+{{ define "title" }} commit {{ .Diff.Commit.This }} {{ end }}
- {{ template "layouts/repo-header" . }}
-
- {{ template "layouts/nav" . }}
-
-
- {{- .commit.Message -}}
-
+{{ define "content" }}
-
+{{ $repo := .RepoInfo.Name }}
+{{ $commit := .Diff.Commit }}
+{{ $stat := .Diff.Stat }}
+{{ $diff := .Diff.Diff }}
- {{ if .commit.Parent }}
-
+
+ {{- $commit.Message -}}
+
- {{ end }}
-
-
- {{ .stat.FilesChanged }} files changed,
- {{ .stat.Insertions }} insertions(+),
- {{ .stat.Deletions }} deletions(-)
-
-
-
-
jump to
- {{ range .diff }}
-
- {{ end }}
-
-
-
-
- {{ $repo := .name }}
- {{ $this := .commit.This }}
- {{ $parent := .commit.Parent }}
- {{ range .diff }}
-
-
- {{ if .IsNew }}
-
A
- {{ end }}
- {{ if .IsDelete }}
-
D
- {{ end }}
- {{ if not (or .IsNew .IsDelete) }}
-
M
- {{ end }}
- {{ if .Name.Old }}
-
{{ .Name.Old }}
- {{ if .Name.New }}
- →
-
{{ .Name.New }}
- {{ end }}
- {{ else }}
-
{{ .Name.New }}
- {{- end -}}
- {{ if .IsBinary }}
-
Not showing binary file.
- {{ else }}
-
- {{- range .TextFragments -}}
- {{- .Header -}}
- {{- range .Lines -}}
- {{- if eq .Op.String "+" -}}
- {{ .String }}
- {{- end -}}
- {{- if eq .Op.String "-" -}}
- {{ .String }}
- {{- end -}}
- {{- if eq .Op.String " " -}}
- {{ .String }}
- {{- end -}}
- {{- end -}}
- {{- end -}}
- {{- end -}}
-
-
-
- {{ end }}
-
-
-
-
\ No newline at end of file
+
+
+ {{ if $commit.Parent }}
+
+
+ {{ end }}
+
+
+ {{ $stat.FilesChanged }} files changed,
+ {{ $stat.Insertions }} insertions(+),
+ {{ $stat.Deletions }} deletions(-)
+
+
+
+
jump to
+ {{ range $diff }}
+
+ {{ end }}
+
+
+
+
+ {{ $this := $commit.This }}
+ {{ $parent := $commit.Parent }}
+ {{ range $diff }}
+
+
+ {{ if .IsNew }}
+
A
+ {{ end }}
+ {{ if .IsDelete }}
+
D
+ {{ end }}
+ {{ if not (or .IsNew .IsDelete) }}
+
M
+ {{ end }}
+ {{ if .Name.Old }}
+
{{ .Name.Old }}
+ {{ if .Name.New }}
+ →
+
{{ .Name.New }}
+ {{ end }}
+ {{ else }}
+
{{ .Name.New }}
+ {{- end -}}
+ {{ if .IsBinary }}
+
Not showing binary file.
+ {{ else }}
+
+ {{- range .TextFragments -}}
+ {{- .Header -}}
+ {{- range .Lines -}}
+ {{- if eq .Op.String "+" -}}
+ {{ .String }}
+ {{- end -}}
+ {{- if eq .Op.String "-" -}}
+ {{ .String }}
+ {{- end -}}
+ {{- if eq .Op.String " " -}}
+ {{ .String }}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+
+
+
+ {{ end }}
+
+
+{{end}}
diff --git a/appview/pages/templates/repo/empty.html b/appview/pages/templates/repo/empty.html
index da899787..27332203 100644
--- a/appview/pages/templates/repo/empty.html
+++ b/appview/pages/templates/repo/empty.html
@@ -2,7 +2,7 @@
{{ template "layouts/head" . }}
-
+
This is an empty Git repository. Push some commits here.
diff --git a/appview/state/repo.go b/appview/state/repo.go
index c48b9990..dc652451 100644
--- a/appview/state/repo.go
+++ b/appview/state/repo.go
@@ -94,6 +94,45 @@ func (s *State) RepoLog(w http.ResponseWriter, r *http.Request) {
return
}
+func (s *State) RepoCommit(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")
+ resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/commit/%s", knot, id.DID.String(), repoName, ref))
+ 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.RepoCommitResponse
+ err = json.Unmarshal(body, &result)
+ if err != nil {
+ log.Println("failed to parse response:", err)
+ return
+ }
+
+ s.pages.RepoCommit(w, pages.RepoCommitParams{
+ LoggedInUser: s.auth.GetUser(r),
+ RepoInfo: pages.RepoInfo{
+ OwnerDid: id.DID.String(),
+ OwnerHandle: id.Handle.String(),
+ Name: repoName,
+ },
+ RepoCommitResponse: 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 0ec9eeec..cc9e9f02 100644
--- a/appview/state/state.go
+++ b/appview/state/state.go
@@ -602,6 +602,7 @@ 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.Get("/commit/{ref}", s.RepoCommit)
// These routes get proxied to the knot
r.Get("/info/refs", s.InfoRefs)
diff --git a/knotserver/git/diff.go b/knotserver/git/diff.go
index 93c823ac..415c771f 100644
--- a/knotserver/git/diff.go
+++ b/knotserver/git/diff.go
@@ -7,41 +7,10 @@ import (
"github.com/bluekeyes/go-gitdiff/gitdiff"
"github.com/go-git/go-git/v5/plumbing/object"
+ "github.com/sotangled/tangled/types"
)
-type TextFragment struct {
- Header string
- Lines []gitdiff.Line
-}
-
-type Diff struct {
- Name struct {
- Old string
- New string
- }
- TextFragments []TextFragment
- IsBinary bool
- IsNew bool
- IsDelete bool
-}
-
-// A nicer git diff representation.
-type NiceDiff struct {
- Commit struct {
- Message string
- Author object.Signature
- This string
- Parent string
- }
- Stat struct {
- FilesChanged int
- Insertions int
- Deletions int
- }
- Diff []Diff
-}
-
-func (g *GitRepo) Diff() (*NiceDiff, error) {
+func (g *GitRepo) Diff() (*types.NiceDiff, error) {
c, err := g.r.CommitObject(g.h)
if err != nil {
return nil, fmt.Errorf("commit object: %w", err)
@@ -76,7 +45,7 @@ func (g *GitRepo) Diff() (*NiceDiff, error) {
log.Println(err)
}
- nd := NiceDiff{}
+ nd := types.NiceDiff{}
nd.Commit.This = c.Hash.String()
if parent.Hash.IsZero() {
@@ -88,7 +57,7 @@ func (g *GitRepo) Diff() (*NiceDiff, error) {
nd.Commit.Message = c.Message
for _, d := range diffs {
- ndiff := Diff{}
+ ndiff := types.Diff{}
ndiff.Name.New = d.NewName
ndiff.Name.Old = d.OldName
ndiff.IsBinary = d.IsBinary
@@ -96,7 +65,7 @@ func (g *GitRepo) Diff() (*NiceDiff, error) {
ndiff.IsDelete = d.IsDelete
for _, tf := range d.TextFragments {
- ndiff.TextFragments = append(ndiff.TextFragments, TextFragment{
+ ndiff.TextFragments = append(ndiff.TextFragments, types.TextFragment{
Header: tf.Header(),
Lines: tf.Lines,
})
diff --git a/knotserver/routes.go b/knotserver/routes.go
index db039538..55e865da 100644
--- a/knotserver/routes.go
+++ b/knotserver/routes.go
@@ -299,15 +299,12 @@ func (h *Handle) Diff(w http.ResponseWriter, r *http.Request) {
return
}
- data := make(map[string]interface{})
-
- data["commit"] = diff.Commit
- data["stat"] = diff.Stat
- data["diff"] = diff.Diff
- data["ref"] = ref
- data["desc"] = getDescription(path)
+ resp := types.RepoCommitResponse{
+ Ref: ref,
+ Diff: diff,
+ }
- writeJSON(w, data)
+ writeJSON(w, resp)
return
}
diff --git a/types/diff.go b/types/diff.go
new file mode 100644
index 00000000..6df1340a
--- /dev/null
+++ b/types/diff.go
@@ -0,0 +1,38 @@
+package types
+
+import (
+ "github.com/bluekeyes/go-gitdiff/gitdiff"
+ "github.com/go-git/go-git/v5/plumbing/object"
+)
+
+type TextFragment struct {
+ Header string `json:"header"`
+ Lines []gitdiff.Line `json:"lines"`
+}
+
+type Diff struct {
+ Name struct {
+ Old string `json:"old"`
+ New string `json:"new"`
+ } `json:"name"`
+ TextFragments []TextFragment `json:"text_fragments"`
+ IsBinary bool `json:"is_binary"`
+ IsNew bool `json:"is_new"`
+ IsDelete bool `json:"is_delete"`
+}
+
+// A nicer git diff representation.
+type NiceDiff struct {
+ Commit struct {
+ Message string `json:"message"`
+ Author object.Signature `json:"author"`
+ This string `json:"this"`
+ Parent string `json:"parent"`
+ } `json:"commit"`
+ Stat struct {
+ FilesChanged int `json:"files_changed"`
+ Insertions int `json:"insertions"`
+ Deletions int `json:"deletions"`
+ } `json:"stat"`
+ Diff []Diff `json:"diff"`
+}
diff --git a/types/repo.go b/types/repo.go
index 78d6293f..092826d1 100644
--- a/types/repo.go
+++ b/types/repo.go
@@ -23,3 +23,14 @@ type RepoLogResponse struct {
Page int `json:"page,omitempty"`
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"`
+}