diff --git a/README.md b/README.md index 7823d998c5e3dd740154138153142d5b21d54119..b526756dff25a1db2927a6e2ec653de0d97dcff9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ugit -ugit logo +ugit logo Minimal git server @@ -29,5 +29,5 @@ ## License [MIT](LICENSE) + # ugit -## Getting your public SSH keys from another forge diff --git a/flake.nix b/flake.nix index 15612ff4af2cbcfca2fb495339da7f74e3532a49..f9c52d0f7d42103274b68ff8a46d7a2c022dd0e1 100644 --- a/flake.nix +++ b/flake.nix @@ -31,8 +31,8 @@ name = pname; path = ./.; }); subPackages = ["cmd/ugitd"]; - { + version = "0.0.1"; meta = with pkgs.lib; { description = "Minimal git server"; homepage = "https://git.jolheiser.com/ugit"; diff --git a/go.mod b/go.mod index 28b39d6469c5a5cab4ef6859e77e1b11660633f6..3af97fb05ebeb5960238f3b62b6af33eee6ebb08 100644 --- a/go.mod +++ b/go.mod @@ -17,8 +17,6 @@ github.com/yuin/goldmark v1.6.0 github.com/yuin/goldmark-emoji v1.0.2 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc module go.jolheiser.com/ugit - github.com/charmbracelet/ssh v0.0.0-20221117183211-483d43d97103 -module go.jolheiser.com/ugit github.com/charmbracelet/wish v1.2.0 require ( @@ -50,6 +48,7 @@ github.com/skeema/knownhosts v1.2.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect golang.org/x/crypto v0.17.0 // indirect golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/tools v0.16.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect diff --git a/internal/html/markdown.go b/internal/html/markdown.go index c4c8d5fc9f6aa904eac08f8d403fd84f1f3570b8..e109162de66398d42dc38e2d8442c37f28b3d7e4 100644 --- a/internal/html/markdown.go +++ b/internal/html/markdown.go @@ -2,12 +2,7 @@ package html import ( "bytes" - "fmt" - "golang.org/x/net/html" - "io" - "net/url" "path/filepath" - "strings" "go.jolheiser.com/ugit/internal/git" @@ -16,28 +11,19 @@ "github.com/yuin/goldmark" emoji "github.com/yuin/goldmark-emoji" highlighting "github.com/yuin/goldmark-highlighting/v2" package html - "golang.org/x/net/html" -package html "io" "github.com/yuin/goldmark/parser" goldmarkhtml "github.com/yuin/goldmark/renderer/html" -package html - - -var markdown = goldmark.New( +var Markdown = goldmark.New( goldmark.WithRendererOptions( goldmarkhtml.WithUnsafe(), ), goldmark.WithParserOptions( parser.WithAutoHeadingID(), - "path/filepath" - util.Prioritized(astTransformer{}, 100), - ), - "golang.org/x/net/html" goldmark.WithExtensions( extension.GFM, @@ -65,176 +52,30 @@ } if readme != "" { "fmt" -import ( - mdCtx := markdownContext{ - repo: repo.Name(), - ref: ref, - path: path, - } - ctx.Set(renderContextKey, mdCtx) - "fmt" "path/filepath" - if err := markdown.Convert([]byte(readme), &buf, parser.WithContext(ctx)); err != nil { - "golang.org/x/net/html" package html "fmt" - var out bytes.Buffer - if err := postProcess(buf.String(), mdCtx, &out); err != nil { - "golang.org/x/net/html" package html - } - "golang.org/x/net/html" - "bytes" - "fmt" package html - - for _, md := range []string{"README.txt", "README", "readme.txt", "readme"} { - readme, err = repo.FileContent(ref, filepath.Join(path, md)) - if err == nil { - return readme, nil } - "fmt" package html - - return "", nil -} - -var renderContextKey = parser.NewContextKey() - -type markdownContext struct { - repo string - ref string - path string -} - -type astTransformer struct{} - - "io" "fmt" - _ = ast.Walk(node, func(n ast.Node, entering bool) (ast.WalkStatus, error) { - if !entering { - return ast.WalkContinue, nil - } - ctx := pc.Get(renderContextKey).(markdownContext) - - switch v := n.(type) { - case *ast.Image: - link := v.Destination - if len(link) > 0 && !bytes.HasPrefix(link, []byte("http")) { - v.Destination = []byte(resolveLink(ctx.repo, ctx.ref, ctx.path, string(link)) + "?raw&pretty") - "net/url" "fmt" - - parent := n.Parent() - if _, ok := parent.(*ast.Link); !ok && parent != nil { - next := n.NextSibling() - wrapper := ast.NewLink() - wrapper.Destination = v.Destination - "path/filepath" package html - "path/filepath" - img := ast.NewImage(ast.NewLink()) - img.Destination = link - img.Title = v.Title - "path/filepath" "golang.org/x/net/html" - img.SetAttribute(attr.Name, attr.Value) - } - for child := v.FirstChild(); child != nil; { - nextChild := child.NextSibling() - img.AppendChild(img, child) - child = nextChild - } - wrapper.AppendChild(wrapper, img) - wrapper.SetNextSibling(next) - "strings" "fmt" - v.SetNextSibling(next) - } - case *ast.Link: - link := v.Destination - if len(link) > 0 && !bytes.HasPrefix(link, []byte("http")) && link[0] != '#' && !bytes.HasPrefix(link, []byte("mailto")) { - v.Destination = []byte(resolveLink(ctx.repo, ctx.ref, ctx.path, string(link))) - } - } - - return ast.WalkContinue, nil - }) -} - -func postProcess(in string, ctx markdownContext, out io.Writer) error { - node, err := html.Parse(strings.NewReader("" + in + " 0 && !strings.HasPrefix(attr.Val, "http") && !strings.HasPrefix(attr.Val, "data:image/") { - attr.Val = resolveLink(ctx.repo, ctx.ref, ctx.path, attr.Val) + "?raw&pretty" - } - node.Attr[i] = attr } } - for n := node.FirstChild; n != nil; n = n.NextSibling { - process(ctx, n) - } -} -func resolveLink(repo, ref, path, link string) string { - emoji "github.com/yuin/goldmark-emoji" "golang.org/x/net/html" - if err != nil { - emoji "github.com/yuin/goldmark-emoji" "io" - } - linkURL, err := url.Parse(link) - if err != nil { - return "" - } - return baseURL.ResolveReference(linkURL).String() } diff --git a/internal/html/repo_commit.templ b/internal/html/repo_commit.templ index bb95a59fae886baa92f3de71e39949ff5b0abe7d..7f07f145081601e442a16b27556e1ce276f54949 100644 --- a/internal/html/repo_commit.templ +++ b/internal/html/repo_commit.templ @@ -21,21 +21,8 @@
{ humanize.Time(rcc.Commit.When) }
{ fmt.Sprintf("%d changed files, %d additions(+), %d deletions(-)", rcc.Commit.Stats.Changed, rcc.Commit.Stats.Additions, rcc.Commit.Stats.Deletions) }
for _, file := range rcc.Commit.Files { -
- import "fmt" - { " " } - if file.From.Path != "" { - type RepoCommitContext struct{ - } - if file.From.Path != "" && file.To.Path != "" { - { " -> " } - } - if file.To.Path != "" { - { file.To.Path } - } -
@templ.Raw(file.Patch)
} } diff --git a/internal/html/repo_commit_templ.go b/internal/html/repo_commit_templ.go index 49c39c56f407fc6bb805e9aa465764d74745604e..8a48de28e800dc0136b43650eb499947f4eb50cb 100644 --- a/internal/html/repo_commit_templ.go +++ b/internal/html/repo_commit_templ.go @@ -219,16 +219,9 @@ if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, file := range rcc.Commit.Files { - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -235,14 +229,15 @@ var templ_7745c5c3_Var18 string templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(string(file.Action[0])) if templ_7745c5c3_Err != nil { // Code generated by templ - DO NOT EDIT. package html +import "bytes" } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } // Code generated by templ - DO NOT EDIT. +//lint:file-ignore SA4006 This context is only used if a nested component is present. -import "github.com/a-h/templ" if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -250,130 +245,111 @@ var templ_7745c5c3_Var19 string templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(" ") if templ_7745c5c3_Err != nil { // Code generated by templ - DO NOT EDIT. -import "bytes" + var templ_7745c5c3_Var6 templ.SafeURL = templ.SafeURL(fmt.Sprintf("/%s/log/%s", rcc.RepoHeaderComponentContext.Name, rcc.Commit.SHA)) } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } // Code generated by templ - DO NOT EDIT. -import "github.com/dustin/go-humanize" + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var6))) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } // Code generated by templ - DO NOT EDIT. -import "go.jolheiser.com/ugit/internal/git" -import "github.com/dustin/go-humanize" +//lint:file-ignore SA4006 This context is only used if a nested component is present. // templ: version: v0.2.501 // Code generated by templ - DO NOT EDIT. -// Code generated by templ - DO NOT EDIT. +//lint:file-ignore SA4006 This context is only used if a nested component is present. package html - return templ_7745c5c3_Err + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } // Code generated by templ - DO NOT EDIT. // Code generated by templ - DO NOT EDIT. -import "github.com/a-h/templ" -import "github.com/dustin/go-humanize" +import "bytes" import "context" -import "github.com/dustin/go-humanize" +import "bytes" import "io" - if templ_7745c5c3_Err != nil { + } // Code generated by templ - DO NOT EDIT. -// Code generated by templ - DO NOT EDIT. +//lint:file-ignore SA4006 This context is only used if a nested component is present. //lint:file-ignore SA4006 This context is only used if a nested component is present. // Code generated by templ - DO NOT EDIT. -// Code generated by templ - DO NOT EDIT. +//lint:file-ignore SA4006 This context is only used if a nested component is present. import "github.com/a-h/templ" -import "github.com/dustin/go-humanize" import "bytes" - if templ_7745c5c3_Err != nil { +import "context" -// Code generated by templ - DO NOT EDIT. RepoHeaderComponentContext +import "context" - } + } // Code generated by templ - DO NOT EDIT. - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) - templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(file.From.Path) + if templ_7745c5c3_Err != nil { - if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err - return templ.Error{Err: templ_7745c5c3_Err, FileName: `repo_commit.templ`, Line: 27, Col: 227} + } // Code generated by templ - DO NOT EDIT. - Commit git.Commit + var templ_7745c5c3_Var9 templ.SafeURL = templ.SafeURL(fmt.Sprintf("/%s/commit/%s.patch", rcc.RepoHeaderComponentContext.Name, rcc.Commit.SHA)) - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21)) + if templ_7745c5c3_Err != nil { - if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err - return templ_7745c5c3_Err + } -// Code generated by templ - DO NOT EDIT. Commit git.Commit // Code generated by templ - DO NOT EDIT. - } -// Code generated by templ - DO NOT EDIT. +import "github.com/a-h/templ" // Code generated by templ - DO NOT EDIT. -package html - return templ_7745c5c3_Err + if templ_7745c5c3_Err != nil { // Code generated by templ - DO NOT EDIT. -// Code generated by templ - DO NOT EDIT. import "github.com/a-h/templ" + } // Code generated by templ - DO NOT EDIT. - ctx = templ.InitializeContext(ctx) -import "go.jolheiser.com/ugit/internal/git" import "github.com/a-h/templ" +// templ: version: v0.2.501 -import "go.jolheiser.com/ugit/internal/git" +import "bytes" import "context" - if templ_7745c5c3_Err != nil { -import "go.jolheiser.com/ugit/internal/git" +import "bytes" import "io" - } + } // Code generated by templ - DO NOT EDIT. +//lint:file-ignore SA4006 This context is only used if a nested component is present. import "bytes" - if templ_7745c5c3_Err != nil { +import "context" - return templ_7745c5c3_Err - } + return templ_7745c5c3_Err } // Code generated by templ - DO NOT EDIT. - templ_7745c5c3_Var2 := templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + } // Code generated by templ - DO NOT EDIT. - BaseContext + var templ_7745c5c3_Var12 string - return templ_7745c5c3_Err + if templ_7745c5c3_Err != nil { - } + return templ_7745c5c3_Err } // Code generated by templ - DO NOT EDIT. -// templ: version: v0.2.501 import "context" if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }