From 711c4fc128add87a92d0c0f49408e7588a039edb Mon Sep 17 00:00:00 2001 From: Anirudh Oppiliappan Date: Tue, 11 Feb 2025 07:17:29 +0200 Subject: [PATCH] appview: repo commit Moves the NiceDiff type to the shared types package. --- .zed/settings.json | 15 ++ appview/pages/pages.go | 10 ++ appview/pages/templates/repo/commit.html | 192 +++++++++++------------ appview/pages/templates/repo/empty.html | 2 +- appview/state/repo.go | 39 +++++ appview/state/state.go | 1 + knotserver/git/diff.go | 41 +---- knotserver/routes.go | 13 +- types/diff.go | 38 +++++ types/repo.go | 11 ++ 10 files changed, 221 insertions(+), 141 deletions(-) create mode 100644 .zed/settings.json create mode 100644 types/diff.go 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 -}}
-
- {{ .commit.Author.Name }} {{ .commit.Author.Email}} -
{{ .commit.Author.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}
-
+{{ define "content" }} -
- commit -

- {{ .commit.This }} - -

-
+{{ $repo := .RepoInfo.Name }} +{{ $commit := .Diff.Commit }} +{{ $stat := .Diff.Stat }} +{{ $diff := .Diff.Diff }} - {{ if .commit.Parent }} -
- parent -

- {{ .commit.Parent }} -

-
+
+
{{- $commit.Message -}}
+
+ {{ $commit.Author.Name }} {{ $commit.Author.Email}} +
{{ $commit.Author.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}
+
- {{ 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 +
+ commit +

+ {{ $commit.This }} + +

+
+ + {{ if $commit.Parent }} +
+ parent +

+ {{ $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"` +} -- 2.51.2