aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2024-06-15 19:07:14 +0200
committerGabriel A. Giovanini <mail@gabrielgio.me>2024-06-15 19:07:14 +0200
commitce5185f551b707fe8dd8db8b5cbffd46e96cacc0 (patch)
treeb4b83a117a7c479589cfce022011e725e24529e8
parentb71c6c0e5b8dd00d44e40ac0551902a23cbe19d5 (diff)
downloadcerrado-ce5185f551b707fe8dd8db8b5cbffd46e96cacc0.tar.gz
cerrado-ce5185f551b707fe8dd8db8b5cbffd46e96cacc0.tar.bz2
cerrado-ce5185f551b707fe8dd8db8b5cbffd46e96cacc0.zip
feat: Add per repository about page
-rw-r--r--pkg/config/config.go6
-rw-r--r--pkg/config/config_test.go6
-rw-r--r--pkg/handler/git/handler.go25
-rw-r--r--pkg/service/git.go18
-rw-r--r--scss/main.scss11
-rw-r--r--templates/gititemabout.qtpl5
-rw-r--r--templates/gititemabout.qtpl.go69
-rw-r--r--templates/gititemlog.qtpl1
-rw-r--r--templates/gititemlog.qtpl.go47
9 files changed, 130 insertions, 58 deletions
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 6ac6d05..3759b7c 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -42,6 +42,7 @@ type (
Path string
Description string
Public bool
+ About string
}
// ConfigurationRepository represents the configuration repository (as in
@@ -214,6 +215,10 @@ func setRepositories(block scfg.Block, repositories *[]*GitRepositoryConfigurati
if err := setBool(d, &repository.Public); err != nil {
return err
}
+ case "about":
+ if err := setString(d, &repository.About); err != nil {
+ return err
+ }
}
}
@@ -249,6 +254,7 @@ func defaultRepisotryConfiguration(path string) *GitRepositoryConfiguration {
Name: filepath.Base(path),
Description: "",
Public: false,
+ About: "README.md",
}
}
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index 2d779c5..8c1d27e 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -53,6 +53,7 @@ scan "/srv/git" {
Path: "/srv/git/cerrado.git",
Description: "",
Public: false,
+ About: "README.md",
},
},
},
@@ -64,6 +65,7 @@ repository /srv/git/cerrado.git {
name cerrado
description "Single person forge"
public true
+ about readme.txt
}`,
expectedConfig: &configuration{
Scan: defaultScan(),
@@ -74,6 +76,7 @@ repository /srv/git/cerrado.git {
Path: "/srv/git/cerrado.git",
Description: "Single person forge",
Public: true,
+ About: "readme.txt",
},
},
},
@@ -111,6 +114,7 @@ repository /srv/git/cerrado.git {
name cerrado
description "Single person forge"
public true
+ about readme.txt
}`,
expectedConfig: &configuration{
Scan: &scan{
@@ -124,12 +128,14 @@ repository /srv/git/cerrado.git {
Path: "/srv/git/linux.git",
Description: "",
Public: false,
+ About: "README.md",
},
{
Name: "cerrado",
Path: "/srv/git/cerrado.git",
Description: "Single person forge",
Public: true,
+ About: "readme.txt",
},
},
},
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
index 899f61e..25505ba 100644
--- a/pkg/handler/git/handler.go
+++ b/pkg/handler/git/handler.go
@@ -33,6 +33,7 @@ type (
GetHead(name string) (*plumbing.Reference, error)
GetTree(name, ref, path string) (*object.Tree, error)
GetFileContent(name, ref, path string) (string, error)
+ GetAbout(name string) (string, error)
ListTags(name string) ([]*plumbing.Reference, error)
ListBranches(name string) ([]*plumbing.Reference, error)
}
@@ -126,10 +127,28 @@ func (g *GitHandler) About(w http.ResponseWriter, r *http.Request) error {
if err != nil {
return err
}
+
+ file, err := g.gitService.GetAbout(name)
+ if err != nil {
+ return err
+ }
+
+ extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock
+ p := parser.NewWithExtensions(extensions)
+ doc := p.Parse([]byte(file))
+
+ htmlFlag := markdownhtml.CommonFlags | markdownhtml.HrefTargetBlank
+ opts := markdownhtml.RendererOptions{Flags: htmlFlag}
+ renderer := markdownhtml.NewRenderer(opts)
+
+ bs := markdown.Render(doc, renderer)
+
gitList := &templates.GitItemPage{
- Name: name,
- Ref: ref.Name().Short(),
- GitItemBase: &templates.GitItemAboutPage{},
+ Name: name,
+ Ref: ref.Name().Short(),
+ GitItemBase: &templates.GitItemAboutPage{
+ About: bs,
+ },
}
templates.WritePageTemplate(w, gitList)
return nil
diff --git a/pkg/service/git.go b/pkg/service/git.go
index 2165abe..6bb6e9e 100644
--- a/pkg/service/git.go
+++ b/pkg/service/git.go
@@ -128,6 +128,24 @@ func (g *GitService) GetFileContent(name, ref, path string) (string, error) {
return repo.FileContent(path)
}
+func (g *GitService) GetAbout(name string) (string, error) {
+ r := g.configRepo.GetByName(name)
+ if r == nil {
+ return "", RepositoryNotFoundErr
+ }
+
+ repo, err := git.OpenRepository(r.Path)
+ if err != nil {
+ return "", err
+ }
+ err = repo.SetRef("")
+ if err != nil {
+ return "", err
+ }
+
+ return repo.FileContent(r.About)
+}
+
func (g *GitService) ListTags(name string) ([]*plumbing.Reference, error) {
r := g.configRepo.GetByName(name)
if r == nil {
diff --git a/scss/main.scss b/scss/main.scss
index 107a4c8..c438a90 100644
--- a/scss/main.scss
+++ b/scss/main.scss
@@ -60,6 +60,12 @@ $utilities: (
center: center,
)
),
+ "margin": (
+ responsive: true,
+ property: margin,
+ class: m,
+ values: map-merge($spacers, (auto: auto))
+ ),
"margin-end": (
responsive: true,
property: margin-right,
@@ -114,6 +120,11 @@ body {
overflow-x: auto;
}
+pre {
+ display: grid;
+ overflow-x: auto;
+}
+
#about {
padding: 0 $spacer $spacer $spacer;
> p:first-child {
diff --git a/templates/gititemabout.qtpl b/templates/gititemabout.qtpl
index abda2fb..da9c2e9 100644
--- a/templates/gititemabout.qtpl
+++ b/templates/gititemabout.qtpl
@@ -1,10 +1,13 @@
{% code
type GitItemAboutPage struct {
+ About []byte
}
%}
{% func (g *GitItemAboutPage) Nav(name, ref string) %}{%= GitItemNav(name, ref, Readme) %}{% endfunc %}
{% func (g *GitItemAboutPage) GitContent(name, ref string) %}
-<h4>About</h4>
+<div class="m-2">
+{%z= g.About %}
+</div>
{% endfunc %}
diff --git a/templates/gititemabout.qtpl.go b/templates/gititemabout.qtpl.go
index cd49d2f..e1c1db4 100644
--- a/templates/gititemabout.qtpl.go
+++ b/templates/gititemabout.qtpl.go
@@ -19,72 +19,79 @@ var (
//line gititemabout.qtpl:2
type GitItemAboutPage struct {
+ About []byte
}
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
func (g *GitItemAboutPage) StreamNav(qw422016 *qt422016.Writer, name, ref string) {
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
StreamGitItemNav(qw422016, name, ref, Readme)
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
}
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
func (g *GitItemAboutPage) WriteNav(qq422016 qtio422016.Writer, name, ref string) {
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
qw422016 := qt422016.AcquireWriter(qq422016)
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
g.StreamNav(qw422016, name, ref)
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
qt422016.ReleaseWriter(qw422016)
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
}
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
func (g *GitItemAboutPage) Nav(name, ref string) string {
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
qb422016 := qt422016.AcquireByteBuffer()
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
g.WriteNav(qb422016, name, ref)
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
qs422016 := string(qb422016.B)
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
qt422016.ReleaseByteBuffer(qb422016)
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
return qs422016
-//line gititemabout.qtpl:6
+//line gititemabout.qtpl:7
}
-//line gititemabout.qtpl:8
+//line gititemabout.qtpl:9
func (g *GitItemAboutPage) StreamGitContent(qw422016 *qt422016.Writer, name, ref string) {
-//line gititemabout.qtpl:8
+//line gititemabout.qtpl:9
qw422016.N().S(`
-<h4>About</h4>
+<div class="m-2">
`)
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:11
+ qw422016.N().Z(g.About)
+//line gititemabout.qtpl:11
+ qw422016.N().S(`
+</div>
+`)
+//line gititemabout.qtpl:13
}
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
func (g *GitItemAboutPage) WriteGitContent(qq422016 qtio422016.Writer, name, ref string) {
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
qw422016 := qt422016.AcquireWriter(qq422016)
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
g.StreamGitContent(qw422016, name, ref)
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
qt422016.ReleaseWriter(qw422016)
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
}
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
func (g *GitItemAboutPage) GitContent(name, ref string) string {
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
qb422016 := qt422016.AcquireByteBuffer()
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
g.WriteGitContent(qb422016, name, ref)
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
qs422016 := string(qb422016.B)
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
qt422016.ReleaseByteBuffer(qb422016)
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
return qs422016
-//line gititemabout.qtpl:10
+//line gititemabout.qtpl:13
}
diff --git a/templates/gititemlog.qtpl b/templates/gititemlog.qtpl
index a28e7ad..3588d32 100644
--- a/templates/gititemlog.qtpl
+++ b/templates/gititemlog.qtpl
@@ -12,6 +12,7 @@ type GitItemLogPage struct {
<div class="event-list">
{% for _, c := range g.Commits %}
<div class="row event">
+
<div class="col-xxl-2">
{%s TimeFormat(c.Committer.When) %}
</div>
diff --git a/templates/gititemlog.qtpl.go b/templates/gititemlog.qtpl.go
index 76c2432..b950d15 100644
--- a/templates/gititemlog.qtpl.go
+++ b/templates/gititemlog.qtpl.go
@@ -69,64 +69,65 @@ func (g *GitItemLogPage) StreamGitContent(qw422016 *qt422016.Writer, name, ref s
//line gititemlog.qtpl:13
qw422016.N().S(`
<div class="row event">
+
<div class="col-xxl-2">
`)
-//line gititemlog.qtpl:16
+//line gititemlog.qtpl:17
qw422016.E().S(TimeFormat(c.Committer.When))
-//line gititemlog.qtpl:16
+//line gititemlog.qtpl:17
qw422016.N().S(`
</div>
<div class="col-xxl-7 code-view">
<pre>`)
-//line gititemlog.qtpl:19
+//line gititemlog.qtpl:20
qw422016.E().S(c.Message)
-//line gititemlog.qtpl:19
+//line gititemlog.qtpl:20
qw422016.N().S(`</pre>
</div>
<div class="col-xxl-3">
<small>`)
-//line gititemlog.qtpl:22
+//line gititemlog.qtpl:23
qw422016.E().S(c.Committer.Name)
-//line gititemlog.qtpl:22
+//line gititemlog.qtpl:23
qw422016.N().S(` &lt;`)
-//line gititemlog.qtpl:22
+//line gititemlog.qtpl:23
qw422016.E().S(c.Committer.Email)
-//line gititemlog.qtpl:22
+//line gititemlog.qtpl:23
qw422016.N().S(`&gt;</small>
</div>
</div>
`)
-//line gititemlog.qtpl:25
+//line gititemlog.qtpl:26
}
-//line gititemlog.qtpl:25
+//line gititemlog.qtpl:26
qw422016.N().S(`
</div>
`)
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
}
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
func (g *GitItemLogPage) WriteGitContent(qq422016 qtio422016.Writer, name, ref string) {
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
qw422016 := qt422016.AcquireWriter(qq422016)
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
g.StreamGitContent(qw422016, name, ref)
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
qt422016.ReleaseWriter(qw422016)
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
}
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
func (g *GitItemLogPage) GitContent(name, ref string) string {
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
qb422016 := qt422016.AcquireByteBuffer()
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
g.WriteGitContent(qb422016, name, ref)
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
qs422016 := string(qb422016.B)
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
qt422016.ReleaseByteBuffer(qb422016)
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
return qs422016
-//line gititemlog.qtpl:27
+//line gititemlog.qtpl:28
}