diff --git a/README.md b/README.md
index 7823d998c5e3dd740154138153142d5b21d54119..b526756dff25a1db2927a6e2ec653de0d97dcff9 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# ugit
-
+
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
}