web frontend for git (tangled's grandpa)
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

templates: repo and log

+168 -61
+26 -9
routes/routes.go
··· 45 45 return 46 46 } 47 47 48 - var desc string 49 - db, err := os.ReadFile(filepath.Join(path, "description")) 50 - if err == nil { 51 - desc = string(db) 52 - } else { 53 - desc = "" 54 - } 48 + desc := getDescription(path) 55 49 56 50 infos = append(infos, info{ 57 51 Name: dir.Name(), ··· 83 77 return 84 78 } 85 79 86 - files, err := gr.FileTree("") 80 + commits, err := gr.Commits() 87 81 if err != nil { 88 82 d.Write500(w) 89 83 log.Println(err) ··· 109 103 return 110 104 } 111 105 106 + tpath := filepath.Join(d.c.Dirs.Templates, "*") 107 + t := template.Must(template.ParseGlob(tpath)) 108 + 109 + if len(commits) >= 5 { 110 + commits = commits[:5] 111 + } 112 + 112 113 data := make(map[string]any) 113 114 data["name"] = name 114 115 data["ref"] = mainBranch 115 116 data["readme"] = readmeContent 117 + data["commits"] = commits 118 + data["desc"] = getDescription(path) 116 119 117 - d.listFiles(files, data, w) 120 + if err := t.ExecuteTemplate(w, "repo", data); err != nil { 121 + log.Println(err) 122 + return 123 + } 124 + 118 125 return 119 126 } 120 127 ··· 283 290 284 291 http.ServeFile(w, r, f) 285 292 } 293 + 294 + func getDescription(path string) (desc string) { 295 + db, err := os.ReadFile(filepath.Join(path, "description")) 296 + if err == nil { 297 + desc = string(db) 298 + } else { 299 + desc = "" 300 + } 301 + return 302 + }
+1 -1
routes/template.go
··· 37 37 data["files"] = files 38 38 data["meta"] = d.c.Meta 39 39 40 - if err := t.ExecuteTemplate(w, "repo", data); err != nil { 40 + if err := t.ExecuteTemplate(w, "tree", data); err != nil { 41 41 log.Println(err) 42 42 return 43 43 }
+55 -5
static/style.css
··· 6 6 --gray: #6a6a6a; 7 7 --dark: #444; 8 8 --darker: #222; 9 + 10 + --sans-font: "InterVar", -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", sans-serif; 11 + --display-font: "InterDisplay", -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", sans-serif; 12 + --mono-font: monospace; 9 13 } 10 14 11 15 html { 12 16 background: var(--light); 13 17 -webkit-text-size-adjust: none; 14 - font-family: "InterVar", -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", sans-serif; 18 + font-family: var(--sans-font); 15 19 } 16 20 17 21 ::selection { ··· 38 42 } 39 43 40 44 main h1, h2, h3, .small-heading { 41 - font-family: "InterDisplay", -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", sans-serif; 45 + font-family: var(--display-font); 42 46 font-weight: 500; 43 47 } 44 48 ··· 94 98 95 99 .index { 96 100 display: grid; 97 - grid-template-columns: 6em 1fr 7em; 101 + grid-template-columns: 6em 1fr minmax(0, 7em); 98 102 grid-row-gap: 0.5em; 103 + min-width: 0; 99 104 } 100 105 101 106 .index-headings { 102 107 display: grid; 103 - grid-template-columns: 6em 1fr 7em; 108 + grid-template-columns: 6em 1fr minmax(0, 7em); 104 109 padding-bottom: 1.2em; 105 110 padding-top: 1.2em; 111 + min-width: 0; 106 112 } 107 113 108 - @media (max-width: 385px) { 114 + .desc { 115 + color: var(--gray); 116 + font-style: italic; 117 + } 118 + 119 + .tree { 120 + display: grid; 121 + grid-template-columns: 8em minmax(0, 1fr); 122 + grid-row-gap: 0.5em; 123 + grid-column-gap: 1em; 124 + min-width: 0; 125 + } 126 + 127 + .log { 128 + display: grid; 129 + grid-template-columns: 20rem minmax(0, 1fr); 130 + grid-row-gap: 0.8em; 131 + grid-column-gap: 8rem; 132 + margin-bottom: 2em; 133 + padding-bottom: 1em; 134 + border-bottom: 1.5px solid var(--medium-gray); 135 + } 136 + 137 + .log pre { 138 + white-space: pre-wrap; 139 + } 140 + 141 + .mode { 142 + font-family: var(--mono-font); 143 + } 144 + 145 + .readme pre { 146 + white-space: pre-wrap; 147 + } 148 + 149 + @media (max-width: 600px) { 109 150 .index { 110 151 grid-row-gap: 0.8em; 152 + } 153 + 154 + .log { 155 + grid-template-columns: 1fr; 156 + grid-row-gap: 0em; 157 + } 158 + 159 + .commit-info:not(:last-child) { 160 + padding-bottom: 1.5rem; 111 161 } 112 162 }
+1 -1
templates/index.html
··· 16 16 <div class="index"> 17 17 {{ range .info }} 18 18 <div><a href="/{{ .Name }}">{{ .Name }}</a></div> 19 - <div>{{ .Desc }}</div> 19 + <div class="desc">{{ .Desc }}</div> 20 20 <div>{{ .Idle }}</div> 21 21 {{ end }} 22 22 </div>
+11 -7
templates/log.html
··· 9 9 <body> 10 10 {{ template "nav" . }} 11 11 <main> 12 - {{ $repo := .name }} 13 - {{ range .commits }} 14 - <p><a href="/{{ $repo }}/commit/{{ .Hash.String }}">{{ slice .Hash.String 0 8 }}<a> 15 - &mdash; {{ .Author.Name }} 16 - <span title="{{ .Author.When }}">{{ .Author.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}</span></p> 17 - <p><pre>{{ .Message }}</pre></p> 18 - {{ end }} 12 + {{ $repo := .repo }} 13 + <div class="log"> 14 + {{ range .commits }} 15 + <div> 16 + <div><a href="/{{ $repo }}/commit/{{ .Hash.String }}">{{ slice .Hash.String 0 8 }}</a></div> 17 + <div>{{ .Author.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}</div> 18 + <pre>{{ .Message }}</pre> 19 + </div> 20 + <div class="commit-info">{{ .Author.Name }} <span style="color: var(--gray);">{{ .Author.Email }}</span></div> 21 + {{ end }} 22 + </div> 19 23 </main> 20 24 </body> 21 25 </html>
+1 -2
templates/nav.html
··· 1 1 {{ define "nav" }} 2 2 <nav> 3 3 <ul> 4 - <li><a href="/">all repos</a> 5 4 {{ if .name }} 6 - <li><a href="/{{ .name }}">{{ .name }}</a> 5 + <li><a href="/{{ .name }}">summary</a> 7 6 <li><a href="/{{ .name }}/refs">refs</a> 8 7 {{ if .ref }} 9 8 <li><a href="/{{ .name }}/tree/{{ .ref }}/">tree</a>
+20 -36
templates/repo.html
··· 1 1 {{ define "repo" }} 2 2 <html> 3 + <title>{{ .name }} 4 + {{ if .parent }} 5 + &mdash; {{ .parent }} 6 + {{ end }} 7 + </title> 3 8 {{ template "head" . }} 4 9 5 10 <header> 6 - <h1>{{ .meta.Title }}</h1> 7 - <h2>{{ .meta.Description }}</h2> 11 + <h2> 12 + <a href="/">all repos</a> 13 + &mdash; {{ .name }} 14 + </h2> 15 + <h3 class="desc">{{ .desc }}</h3> 8 16 </header> 9 17 <body> 10 18 {{ template "nav" . }} 11 19 <main> 12 20 {{ $repo := .name }} 13 - {{ $ref := .ref }} 14 - {{ $parent := .parent }} 15 - 16 - <table> 17 - <tr> 18 - <td></td> 19 - <td><a href="../">..</a> 20 - </tr> 21 - {{ range .files }} 22 - {{ if .IsFile }} 23 - <tr> 24 - <td><code>{{ .Mode }}</code></td> 25 - <td> 26 - {{ if $parent }} 27 - <a href="/{{ $repo }}/blob/{{ $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}</a> 28 - {{ else }} 29 - <a href="/{{ $repo }}/blob/{{ $ref }}/{{ .Name }}">{{ .Name }}</a> 30 - {{ end }} 31 - </td> 32 - </tr> 33 - {{ else }} 34 - <tr> 35 - <td><code>{{ .Mode }}</code></td> 36 - <td> 37 - {{ if $parent }} 38 - <a href="/{{ $repo }}/tree/{{ $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}/</a> 39 - {{ else }} 40 - <a href="/{{ $repo }}/tree/{{ $ref }}/{{ .Name }}">{{ .Name }}/</a> 41 - {{ end }} 42 - </td> 43 - </tr> 21 + <div class="log"> 22 + {{ range .commits }} 23 + <div> 24 + <div><a href="/{{ $repo }}/commit/{{ .Hash.String }}">{{ slice .Hash.String 0 8 }}</a></div> 25 + <div>{{ .Author.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}</div> 26 + <pre>{{ .Message }}</pre> 27 + </div> 28 + <div class="commit-info">{{ .Author.Name }} <span style="color: var(--gray);">{{ .Author.Email }}</span></div> 44 29 {{ end }} 45 - {{ end }} 46 - </table> 47 - <article> 30 + </div> 31 + <article class="readme"> 48 32 <pre> 49 33 {{- if .readme }}{{ .readme }}{{- end -}} 50 34 </pre>
+53
templates/tree.html
··· 1 + {{ define "tree" }} 2 + <html> 3 + <title>{{ .name }} 4 + {{ if .parent }} 5 + &mdash; {{ .parent }} 6 + {{ end }} 7 + </title> 8 + {{ template "head" . }} 9 + 10 + <header> 11 + <h1>{{ .meta.Title }}</h1> 12 + <h2>{{ .meta.Description }}</h2> 13 + </header> 14 + <body> 15 + {{ template "nav" . }} 16 + <main> 17 + {{ $repo := .name }} 18 + {{ $ref := .ref }} 19 + {{ $parent := .parent }} 20 + 21 + <div class="tree"> 22 + {{ if $parent }} 23 + <div></div> 24 + <div><a href="../">..</a></div> 25 + {{ end }} 26 + {{ range .files }} 27 + <div class="mode">{{ .Mode }}</div> 28 + <div> 29 + {{ if .IsFile }} 30 + {{ if $parent }} 31 + <a href="/{{ $repo }}/blob/{{ $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}</a> 32 + {{ else }} 33 + <a href="/{{ $repo }}/blob/{{ $ref }}/{{ .Name }}">{{ .Name }}</a> 34 + {{ end }} 35 + {{ else }} 36 + {{ if $parent }} 37 + <a href="/{{ $repo }}/tree/{{ $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}/</a> 38 + {{ else }} 39 + <a href="/{{ $repo }}/tree/{{ $ref }}/{{ .Name }}">{{ .Name }}/</a> 40 + {{ end }} 41 + {{ end }} 42 + </div> 43 + {{ end }} 44 + </div> 45 + <article> 46 + <pre> 47 + {{- if .readme }}{{ .readme }}{{- end -}} 48 + </pre> 49 + </article> 50 + </main> 51 + </body> 52 + </html> 53 + {{ end }}