diff options
Diffstat (limited to 'forged/templates')
25 files changed, 1322 insertions, 0 deletions
diff --git a/forged/templates/400.tmpl b/forged/templates/400.tmpl new file mode 100644 index 0000000..58ce768 --- /dev/null +++ b/forged/templates/400.tmpl @@ -0,0 +1,25 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "400" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>400 Bad Request – {{ .global.forge_title }}</title> + </head> + <body class="400"> + {{- template "header" . -}} + <div class="padding-wrapper complete-error-page"> + <h1>400 Bad Request</h1> + <p>{{- .complete_error_msg -}}</p> + <hr /> + <address>Lindenii Forge</address> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/400_colon.tmpl b/forged/templates/400_colon.tmpl new file mode 100644 index 0000000..470a685 --- /dev/null +++ b/forged/templates/400_colon.tmpl @@ -0,0 +1,26 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "400_colon" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>400 Bad Request – {{ .global.forge_title }}</title> + </head> + <body class="400-colon"> + {{- template "header" . -}} + <div class="padding-wrapper complete-error-page"> + <h1>400 Bad Request</h1> + <p>We recently switched URL schemes. Previously “<code>:</code>” was used as our URL group separator, but because OpenSMTPD does not implement local-part address quoting properly, we’re unable to include “<code>:</code>” in URLs properly, hence we use “<code>-</code>” now.</p> + <p>As a precaution in case visitors get confused, this page was set up. <strong>You should probably replace the “<code>:</code>”s with “<code>-</code>”s in the URL bar.</strong> If there are colons in the URL that <em>is not</em> the group separator—that’s an edge case that we’ll fix later.</p> + <hr /> + <address>Lindenii Forge</address> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/403.tmpl b/forged/templates/403.tmpl new file mode 100644 index 0000000..86d5518 --- /dev/null +++ b/forged/templates/403.tmpl @@ -0,0 +1,25 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "403" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>403 Forbidden – {{ .global.forge_title }}</title> + </head> + <body class="403"> + {{- template "header" . -}} + <div class="padding-wrapper complete-error-page"> + <h1>403 Forbidden</h1> + <p>{{- .complete_error_msg -}}</p> + <hr /> + <address>Lindenii Forge</address> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/404.tmpl b/forged/templates/404.tmpl new file mode 100644 index 0000000..2eabb06 --- /dev/null +++ b/forged/templates/404.tmpl @@ -0,0 +1,24 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "404" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>404 Not Found – {{ .global.forge_title }}</title> + </head> + <body class="404"> + {{- template "header" . -}} + <div class="padding-wrapper complete-error-page"> + <h1>404 Not Found</h1> + <hr /> + <address>Lindenii Forge</address> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/451.tmpl b/forged/templates/451.tmpl new file mode 100644 index 0000000..ed6343c --- /dev/null +++ b/forged/templates/451.tmpl @@ -0,0 +1,25 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "451" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>451 Unavailable For Legal Reasons – {{ .global.forge_title }}</title> + </head> + <body class="451"> + {{- template "header" . -}} + <div class="padding-wrapper complete-error-page"> + <h1>451 Unavailable For Legal Reasons</h1> + <p>{{- .complete_error_msg -}}</p> + <hr /> + <address>Lindenii Forge</address> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/500.tmpl b/forged/templates/500.tmpl new file mode 100644 index 0000000..3a540e6 --- /dev/null +++ b/forged/templates/500.tmpl @@ -0,0 +1,25 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "500" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>500 Internal Server Error – {{ .global.forge_title }}</title> + </head> + <body class="500"> + {{- template "header" . -}} + <div class="padding-wrapper complete-error-page"> + <h1>500 Internal Server Error</h1> + <p>{{- .complete_error_msg -}}</p> + <hr /> + <address>Lindenii Forge</address> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/501.tmpl b/forged/templates/501.tmpl new file mode 100644 index 0000000..b6ab2f0 --- /dev/null +++ b/forged/templates/501.tmpl @@ -0,0 +1,24 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "501" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>501 Not Implemented – {{ .global.forge_title }}</title> + </head> + <body class="501"> + {{- template "header" . -}} + <div class="padding-wrapper complete-error-page"> + <h1>501 Not Implemented</h1> + <hr /> + <address>Lindenii Forge</address> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/_footer.tmpl b/forged/templates/_footer.tmpl new file mode 100644 index 0000000..f71ea3e --- /dev/null +++ b/forged/templates/_footer.tmpl @@ -0,0 +1,12 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "footer" -}} +<a href="https://lindenii.runxiyu.org/forge/">Lindenii Forge</a> +{{ .global.forge_version }} +(<a href="/-/source/source.tar.gz">source</a>, +<a href="https://forge.lindenii.runxiyu.org/forge/-/repos/server/">upstream</a>, +<a href="/-/source/LICENSE">license</a>, +<a href="https://webirc.runxiyu.org/kiwiirc/#lindenii">support</a>) +{{- end -}} diff --git a/forged/templates/_group_path.tmpl b/forged/templates/_group_path.tmpl new file mode 100644 index 0000000..f5d3bf8 --- /dev/null +++ b/forged/templates/_group_path.tmpl @@ -0,0 +1,8 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "group_path_plain" -}} +{{- $p := . -}} +{{- range $i, $s := . -}}{{- $s -}}{{- if ne $i (minus (len $p) 1) -}}/{{- end -}}{{- end -}} +{{- end -}} diff --git a/forged/templates/_group_view.tmpl b/forged/templates/_group_view.tmpl new file mode 100644 index 0000000..92b6639 --- /dev/null +++ b/forged/templates/_group_view.tmpl @@ -0,0 +1,56 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "group_view" -}} +{{- if .subgroups -}} + <table class="wide"> + <thead> + <tr> + <th colspan="2" class="title-row">Subgroups</th> + </tr> + <tr> + <th scope="col">Name</th> + <th scope="col">Description</th> + </tr> + </thead> + <tbody> + {{- range .subgroups -}} + <tr> + <td> + <a href="{{- .Name | path_escape -}}/">{{- .Name -}}</a> + </td> + <td> + {{- .Description -}} + </td> + </tr> + {{- end -}} + </tbody> + </table> +{{- end -}} +{{- if .repos -}} +<table class="wide"> + <thead> + <tr> + <th colspan="2" class="title-row">Repos</th> + <tr> + <th scope="col">Name</th> + <th scope="col">Description</th> + </tr> + </tr> + </thead> + <tbody> + {{- range .repos -}} + <tr> + <td> + <a href="-/repos/{{- .Name | path_escape -}}/">{{- .Name -}}</a> + </td> + <td> + {{- .Description -}} + </td> + </tr> + {{- end -}} + </tbody> +</table> +{{- end -}} +{{- end -}} diff --git a/forged/templates/_head.tmpl b/forged/templates/_head.tmpl new file mode 100644 index 0000000..d6d6571 --- /dev/null +++ b/forged/templates/_head.tmpl @@ -0,0 +1,9 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "head_common" -}} +<meta charset="utf-8" /> +<meta name="viewport" content="width=device-width, initial-scale=1" /> +<link rel="stylesheet" href="/-/static/style.css" /> +{{- end -}} diff --git a/forged/templates/_header.tmpl b/forged/templates/_header.tmpl new file mode 100644 index 0000000..340a2ac --- /dev/null +++ b/forged/templates/_header.tmpl @@ -0,0 +1,35 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "header" -}} +<header id="main-header"> + <div id="main-header-forge-title"> + <a href="/">{{- .global.forge_title -}}</a> + </div> + <nav id="breadcrumb-nav"> + {{- $path := "" -}} + {{- $url_segments := .url_segments -}} + {{- $dir_mode := .dir_mode -}} + {{- $ref_type := .ref_type -}} + {{- $ref := .ref_name -}} + {{- $separator_index := .separator_index -}} + {{- if eq $separator_index -1 -}} + {{- $separator_index = len $url_segments -}} + {{- end -}} + {{- range $i := $separator_index -}} + {{- $segment := index $url_segments $i -}} + {{- $path = printf "%s/%s" $path $segment -}} + <span class="breadcrumb-separator">/</span> + <a href="{{ $path }}{{ if or (ne $i (minus (len $url_segments) 1)) $dir_mode }}/{{ end }}{{- if $ref_type -}}?{{- $ref_type -}}={{- $ref -}}{{- end -}}">{{ $segment }}</a> + {{- end -}} + </nav> + <div id="main-header-user"> + {{- if ne .user_id_string "" -}} + <a href="/-/users/{{- .user_id_string -}}">{{- .username -}}</a> + {{- else -}} + <a href="/-/login/">Login</a> + {{- end -}} + </div> +</header> +{{- end -}} diff --git a/forged/templates/_ref_query.tmpl b/forged/templates/_ref_query.tmpl new file mode 100644 index 0000000..2f78955 --- /dev/null +++ b/forged/templates/_ref_query.tmpl @@ -0,0 +1,3 @@ +{{- define "ref_query" -}} +{{- if .ref_type -}}?{{- .ref_type -}}={{- .ref_name -}}{{- end -}} +{{- end -}} diff --git a/forged/templates/group.tmpl b/forged/templates/group.tmpl new file mode 100644 index 0000000..b15c316 --- /dev/null +++ b/forged/templates/group.tmpl @@ -0,0 +1,80 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "group" -}} +{{- $group_path := .group_path -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>{{- range $i, $s := .group_path -}}{{- $s -}}{{- if ne $i (len $group_path) -}}/{{- end -}}{{- end }} – {{ .global.forge_title -}}</title> + </head> + <body class="group"> + {{- template "header" . -}} + <div class="padding-wrapper"> + {{- if .description -}} + <p>{{- .description -}}</p> + {{- end -}} + {{- template "group_view" . -}} + </div> + {{- if .direct_access -}} + <div class="padding-wrapper"> + <form method="POST" enctype="application/x-www-form-urlencoded"> + <table> + <thead> + <tr> + <th class="title-row" colspan="2"> + Create repo + </th> + </tr> + </thead> + <tbody> + <tr> + <th scope="row">Name</th> + <td class="tdinput"> + <input id="repo-name-input" name="repo_name" type="text" /> + </td> + </tr> + <tr> + <th scope="row">Description</th> + <td class="tdinput"> + <input id="repo-desc-input" name="repo_desc" type="text" /> + </td> + </tr> + <tr> + <th scope="row">Contrib</th> + <td class="tdinput"> + <select id="repo-contrib-input" name="repo_contrib"> + <option value="public">Public</option> + <option value="ssh_pubkey">SSH public key</option> + <option value="federated">Federated service</option> + <option value="registered_user">Registered user</option> + <option value="closed">Closed</option> + </select> + </td> + </tr> + </tbody> + <tfoot> + <tr> + <td class="th-like" colspan="2"> + <div class="flex-justify"> + <div class="left"> + </div> + <div class="right"> + <input class="btn-primary" type="submit" value="Create" /> + </div> + </div> + </td> + </tr> + </tfoot> + </table> + </form> + </div> + {{- end -}} + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/index.tmpl b/forged/templates/index.tmpl new file mode 100644 index 0000000..ff7c127 --- /dev/null +++ b/forged/templates/index.tmpl @@ -0,0 +1,63 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "index" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>Index – {{ .global.forge_title -}}</title> + </head> + <body class="index"> + {{- template "header" . -}} + <div class="padding-wrapper"> + <table class="wide"> + <thead> + <tr> + <th colspan="2" class="title-row">Groups</th> + </tr> + <tr> + <th scope="col">Name</th> + <th scope="col">Description</th> + </tr> + </thead> + <tbody> + {{- range .groups -}} + <tr> + <td> + <a href="{{- .Name | path_escape -}}/">{{- .Name -}}</a> + </td> + <td> + {{- .Description -}} + </td> + </tr> + {{- end -}} + </tbody> + </table> + <table class="wide"> + <thead> + <tr> + <th colspan="2" class="title-row"> + Info + </th> + </tr> + </thead> + <tbody> + <tr> + <th scope="row">SSH public key</th> + <td><code>{{- .global.server_public_key_string -}}</code></td> + </tr> + <tr> + <th scope="row">SSH fingerprint</th> + <td><code>{{- .global.server_public_key_fingerprint -}}</code></td> + </tr> + </tbody> + </table> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/login.tmpl b/forged/templates/login.tmpl new file mode 100644 index 0000000..1e26c82 --- /dev/null +++ b/forged/templates/login.tmpl @@ -0,0 +1,59 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "login" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>Login – {{ .global.forge_title -}}</title> + </head> + <body class="index"> + {{- .login_error -}} + <div class="padding-wrapper"> + <form method="POST" enctype="application/x-www-form-urlencoded"> + <table> + <thead> + <tr> + <th class="title-row" colspan="2"> + Password authentication + </th> + </tr> + </thead> + <tbody> + <tr> + <th scope="row">Username</th> + <td class="tdinput"> + <input id="usernameinput" name="username" type="text" /> + </td> + </tr> + <tr> + <th scope="row">Password</th> + <td class="tdinput"> + <input id="passwordinput" name="password" type="password" /> + </td> + </tr> + </tbody> + <tfoot> + <tr> + <td class="th-like" colspan="2"> + <div class="flex-justify"> + <div class="left"> + </div> + <div class="right"> + <input class="btn-primary" type="submit" value="Submit" /> + </div> + </div> + </td> + </tr> + </tfoot> + </table> + </form> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_branches.tmpl b/forged/templates/repo_branches.tmpl new file mode 100644 index 0000000..55ea0a6 --- /dev/null +++ b/forged/templates/repo_branches.tmpl @@ -0,0 +1,71 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_branches" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>{{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-branches"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link" href="../{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="../branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + <div class="padding-wrapper"> + <p> + <strong> + Warning: Due to various recent migrations, viewing non-HEAD refs may be broken. + </strong> + </p> + <table id="branches"> + <thead> + <tr class="title-row"> + <th colspan="1">Branches</th> + </tr> + </thead> + <tbody> + {{- range .branches -}} + <tr> + <td> + <a href="../?branch={{ . }}">{{ . }}</a> + </td> + </tr> + {{- end -}} + </tbody> + </table> + </div> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_commit.tmpl b/forged/templates/repo_commit.tmpl new file mode 100644 index 0000000..470bba9 --- /dev/null +++ b/forged/templates/repo_commit.tmpl @@ -0,0 +1,117 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_commit" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>Commit {{ .commit_id }} – {{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-commit"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link" href="../{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + <div class="padding-wrapper scroll"> + <div class="key-val-grid-wrapper"> + <section id="commit-info" class="key-val-grid"> + <div class="title-row">Commit info</div> + <div class="row-label">ID</div> + <div class="row-value">{{- .commit_id -}}</div> + <div class="row-label">Author</div> + <div class="row-value"> + <span>{{- .commit_object.Author.Name -}}</span> <span><<a href="mailto:{{- .commit_object.Author.Email -}}">{{- .commit_object.Author.Email -}}</a>></span> + </div> + <div class="row-label">Author date</div> + <div class="row-value">{{- .commit_object.Author.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" -}}</div> + <div class="row-label">Committer</div> + <div class="row-value"> + <span>{{- .commit_object.Committer.Name -}}</span> <span><<a href="mailto:{{- .commit_object.Committer.Email -}}">{{- .commit_object.Committer.Email -}}</a>></span> + </div> + <div class="row-label">Committer date</div> + <div class="row-value">{{- .commit_object.Committer.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" -}}</div> + <div class="row-label">Actions</div> + <div class="row-value"> + <a href="{{- .commit_object.Hash -}}.patch">Get patch</a> + </div> + </section> + </div> + </div> + + <div class="padding-wrapper scroll" id="this-commit-message"> + <pre>{{- .commit_object.Message -}}</pre> + </div> + <div class="padding-wrapper"> + {{- $parent_commit_hash := .parent_commit_hash -}} + {{- $commit_object := .commit_object -}} + {{- range .file_patches -}} + <div class="file-patch toggle-on-wrapper"> + <input type="checkbox" id="toggle-{{- .From.Hash -}}{{- .To.Hash -}}" class="file-toggle toggle-on-toggle"> + <label for="toggle-{{- .From.Hash -}}{{- .To.Hash -}}" class="file-header toggle-on-header"> + <div> + {{- if eq .From.Path "" -}} + --- /dev/null + {{- else -}} + --- a/<a href="../tree/{{- .From.Path -}}?commit={{- $parent_commit_hash -}}">{{- .From.Path -}}</a> {{ .From.Mode -}} + {{- end -}} + <br /> + {{- if eq .To.Path "" -}} + +++ /dev/null + {{- else -}} + +++ b/<a href="../tree/{{- .To.Path -}}?commit={{- $commit_object.Hash -}}">{{- .To.Path -}}</a> {{ .To.Mode -}} + {{- end -}} + </div> + </label> + <div class="file-content toggle-on-content scroll"> + {{- range .Chunks -}} + {{- if eq .Operation 0 -}} + <pre class="chunk chunk-unchanged">{{ .Content }}</pre> + {{- else if eq .Operation 1 -}} + <pre class="chunk chunk-addition">{{ .Content }}</pre> + {{- else if eq .Operation 2 -}} + <pre class="chunk chunk-deletion">{{ .Content }}</pre> + {{- else -}} + <pre class="chunk chunk-unknown">{{ .Content }}</pre> + {{- end -}} + {{- end -}} + </div> + </div> + {{- end -}} + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_contrib_index.tmpl b/forged/templates/repo_contrib_index.tmpl new file mode 100644 index 0000000..172a079 --- /dev/null +++ b/forged/templates/repo_contrib_index.tmpl @@ -0,0 +1,82 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_contrib_index" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>Merge requests – {{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-contrib-index"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link" href="../{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="../contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + <div class="padding-wrapper"> + <h2>How to submit a merge request</h2> + <pre>git clone {{ .ssh_clone_url }} +cd {{ .repo_name }} +git checkout -b contrib/name_of_your_contribution +# edit and commit stuff +git push -u origin HEAD</pre> + <p>Pushes that update branches in other namespaces, or pushes to existing contribution branches belonging to other SSH keys, will be automatically +rejected, unless you are an authenticated maintainer. Otherwise, a merge request is automatically opened, and the maintainers are notified via IRC.</p> + <p>Alternatively, you may <a href="https://git-send-email.io">email patches</a> to <a href="mailto:{{ .repo_patch_mailing_list }}">{{ .repo_patch_mailing_list }}</a>.</p> + </div> + <div class="padding-wrapper"> + <table id="recent-merge_requests" class="wide"> + <thead> + <tr> + <th scope="col">ID</th> + <th scope="col">Title</th> + <th scope="col">Status</th> + </tr> + </thead> + <tbody> + {{- range .merge_requests -}} + <tr> + <td class="merge_request-id">{{- .ID -}}</td> + <td class="merge_request-title"><a href="{{- .ID -}}/">{{- .Title -}}</a></td> + <td class="merge_request-status">{{- .Status -}}</td> + </tr> + {{- end -}} + </tbody> + </table> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_contrib_one.tmpl b/forged/templates/repo_contrib_one.tmpl new file mode 100644 index 0000000..a5f35d3 --- /dev/null +++ b/forged/templates/repo_contrib_one.tmpl @@ -0,0 +1,123 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_contrib_one" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>Merge requests – {{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-contrib-one"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link" href="../{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="../contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + <div class="padding-wrapper"> + <table id="mr-info-table"> + <thead> + <tr class="title-row"> + <th colspan="2">Merge request info</th> + </tr> + </thead> + <tbody> + <tr> + <th scope="row">ID</th> + <td>{{- .mr_id -}}</td> + </tr> + <tr> + <th scope="row">Status</th> + <td>{{- .mr_status -}}</td> + </tr> + <tr> + <th scope="row">Title</th> + <td>{{- .mr_title -}}</td> + </tr> + <tr> + <th scope="row">Source ref</th> + <td>{{- .mr_source_ref -}}</td> + </tr> + <tr> + <th scope="row">Destination branch</th> + <td>{{- .mr_destination_branch -}}</td> + </tr> + <tr> + <th scope="row">Merge base</th> + <td>{{- .merge_base.Hash.String -}}</td> + </tr> + </tbody> + </table> + </div> + <div class="padding-wrapper"> + {{- $merge_base := .merge_base -}} + {{- $source_commit := .source_commit -}} + {{- range .file_patches -}} + <div class="file-patch toggle-on-wrapper"> + <input type="checkbox" id="toggle-{{- .From.Hash -}}{{- .To.Hash -}}" class="file-toggle toggle-on-toggle"> + <label for="toggle-{{- .From.Hash -}}{{- .To.Hash -}}" class="file-header toggle-on-header"> + <div> + {{- if eq .From.Path "" -}} + --- /dev/null + {{- else -}} + --- a/<a href="../../tree/{{- .From.Path -}}?commit={{- $merge_base.Hash -}}">{{- .From.Path -}}</a> {{ .From.Mode -}} + {{- end -}} + <br /> + {{- if eq .To.Path "" -}} + +++ /dev/null + {{- else -}} + +++ b/<a href="../../tree/{{- .To.Path -}}?commit={{- $source_commit.Hash -}}">{{- .To.Path -}}</a> {{ .To.Mode -}} + {{- end -}} + </div> + </label> + <div class="file-content toggle-on-content scroll"> + {{- range .Chunks -}} + {{- if eq .Operation 0 -}} + <pre class="chunk chunk-unchanged">{{ .Content }}</pre> + {{- else if eq .Operation 1 -}} + <pre class="chunk chunk-addition">{{ .Content }}</pre> + {{- else if eq .Operation 2 -}} + <pre class="chunk chunk-deletion">{{ .Content }}</pre> + {{- else -}} + <pre class="chunk chunk-unknown">{{ .Content }}</pre> + {{- end -}} + {{- end -}} + </div> + </div> + {{- end -}} + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_index.tmpl b/forged/templates/repo_index.tmpl new file mode 100644 index 0000000..d040f3a --- /dev/null +++ b/forged/templates/repo_index.tmpl @@ -0,0 +1,94 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_index" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>{{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-index"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link active" href="./{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + {{- if .notes -}} + <div id="notes">Notes</div> + <ul> + {{- range .notes -}}<li>{{- . -}}</li>{{- end -}} + </ul> + </div> + {{- end -}} + <p class="readingwidth"><code>{{- .ssh_clone_url -}}</code></p> + {{- if .ref_name -}} + <p class="readingwidth"> + <strong> + Warning: Due to various recent migrations, viewing non-HEAD refs may be broken. + </strong> + </p> + {{- end -}} + {{- if .commits -}} + <div class="commit-list-small"> + {{- range .commits -}} + <div class="event"> + <div> + <a href="commit/{{- .Hash -}}" title="{{- .Hash -}}" rel="nofollow"> + {{- .Hash | printf "%.8s" -}} + </a> + — <a href="mailto:{{- .Email -}}">{{- .Author -}}</a> + <small class="pull-right"> + <span title="{{- .Date -}}">{{- .Date -}}</span> + </small> + </div> + <pre class="commit">{{- .Message | first_line -}}</pre> + </div> + {{- end -}} + {{- if dereference_error .commits_err -}} + <div class="commit-error"> + Error while obtaining commit log: {{ .commits_err }} + </div> + {{- end -}} + </div> + {{- end -}} + {{- if .readme -}} + <div class="padding-wrapper" id="readme"> + {{- .readme -}} + </div> + {{- end -}} + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_log.tmpl b/forged/templates/repo_log.tmpl new file mode 100644 index 0000000..2262902 --- /dev/null +++ b/forged/templates/repo_log.tmpl @@ -0,0 +1,90 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_log" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>Log – {{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-log"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link" href="../{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="../log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + <div class="scroll"> + {{- if .ref_name -}} + <p> + <strong> + Warning: Due to various recent migrations, viewing non-HEAD refs may be broken. + </strong> + </p> + {{- end -}} + <table id="commits" class="wide"> + <thead> + <tr class="title-row"> + <th colspan="4">Commits {{ if .ref_name }} on {{ .ref_name }}{{ end -}}</th> + </tr> + <tr> + <th scope="col">ID</th> + <th scope="col">Title</th> + <th scope="col">Author</th> + <th scope="col">Author date</th> + </tr> + </thead> + <tbody> + {{- range .commits -}} + <tr> + <td class="commit-id"><a href="../commit/{{- .Hash -}}">{{- .Hash -}}</a></td> + <td class="commit-title">{{- .Message | first_line -}}</td> + <td class="commit-author"> + <a class="email-name" href="mailto:{{- .Author.Email -}}">{{- .Author.Name -}}</a> + </td> + <td class="commit-time"> + {{- .Author.When.Format "2006-01-02 15:04:05 -0700" -}} + </td> + </tr> + {{- end -}} + {{- if dereference_error .commits_err -}} + Error while obtaining commit log: {{ .commits_err }} + {{- end -}} + </tbody> + </table> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_raw_dir.tmpl b/forged/templates/repo_raw_dir.tmpl new file mode 100644 index 0000000..a33da4a --- /dev/null +++ b/forged/templates/repo_raw_dir.tmpl @@ -0,0 +1,88 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_raw_dir" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>/{{ .path_spec }}{{ if ne .path_spec "" }}/{{ end }} – {{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-raw-dir"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="{{- .repo_url_root -}}tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + <div class="padding-wrapper scroll"> + {{- if .ref_name -}} + <p> + <strong> + Warning: Due to various recent migrations, viewing non-HEAD refs may be broken. + </strong> + </p> + {{- end -}} + <table id="file-tree" class="wide"> + <thead> + <tr class="title-row"> + <th colspan="3"> + (Raw) /{{ .path_spec }}{{ if ne .path_spec "" }}/{{ end }}{{ if .ref_name }} on {{ .ref_name }}{{ end -}} + </th> + </tr> + <tr> + <th scope="col">Mode</th> + <th scope="col">Filename</th> + <th scope="col">Size</th> + </tr> + </thead> + <tbody> + {{- $path_spec := .path_spec -}} + {{- range .files -}} + <tr> + <td class="file-mode">{{- .Mode -}}</td> + <td class="file-name"><a href="{{- .Name -}}{{- if not .IsFile -}}/{{- end -}}{{- template "ref_query" $root -}}">{{- .Name -}}</a>{{- if not .IsFile -}}/{{- end -}}</td> + <td class="file-size">{{- .Size -}}</td> + </tr> + {{- end -}} + </tbody> + </table> + </div> + <div class="padding-wrapper"> + <div id="refs"> + </div> + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_tree_dir.tmpl b/forged/templates/repo_tree_dir.tmpl new file mode 100644 index 0000000..fc06646 --- /dev/null +++ b/forged/templates/repo_tree_dir.tmpl @@ -0,0 +1,93 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_tree_dir" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <title>/{{ .path_spec }}{{ if ne .path_spec "" }}/{{ end }} – {{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-tree-dir"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="{{- .repo_url_root -}}tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + <div class="padding-wrapper scroll"> + {{- if .ref_name -}} + <p> + <strong> + Warning: Due to various recent migrations, viewing non-HEAD refs may be broken. + </strong> + </p> + {{- end -}} + <table id="file-tree" class="wide"> + <thead> + <tr class="title-row"> + <th colspan="3"> + /{{ .path_spec }}{{ if ne .path_spec "" }}/{{ end }}{{ if .ref_name }} on {{ .ref_name }}{{ end -}} + </th> + <tr> + <th scope="col">Mode</th> + <th scope="col">Filename</th> + <th scope="col">Size</th> + </tr> + </tr> + </thead> + <tbody> + {{- $path_spec := .path_spec -}} + {{- range .files -}} + <tr> + <td class="file-mode">{{- .Mode -}}</td> + <td class="file-name"><a href="{{- .Name -}}{{- if not .IsFile -}}/{{- end -}}{{- template "ref_query" $root -}}">{{- .Name -}}</a>{{- if not .IsFile -}}/{{- end -}}</td> + <td class="file-size">{{- .Size -}}</td> + </tr> + {{- end -}} + </tbody> + </table> + </div> + <div class="padding-wrapper"> + <div id="refs"> + </div> + </div> + {{- if .readme -}} + <div class="padding-wrapper" id="readme"> + {{- .readme -}} + </div> + {{- end -}} + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} diff --git a/forged/templates/repo_tree_file.tmpl b/forged/templates/repo_tree_file.tmpl new file mode 100644 index 0000000..76404a9 --- /dev/null +++ b/forged/templates/repo_tree_file.tmpl @@ -0,0 +1,65 @@ +{{/* + SPDX-License-Identifier: AGPL-3.0-only + SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> +*/}} +{{- define "repo_tree_file" -}} +{{- $root := . -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{- template "head_common" . -}} + <link rel="stylesheet" href="/-/static/chroma.css" /> + <title>/{{ .path_spec }} – {{ .repo_name }} – {{ template "group_path_plain" .group_path }} – {{ .global.forge_title -}}</title> + </head> + <body class="repo-tree-file"> + {{- template "header" . -}} + <div class="repo-header"> + <h2>{{- .repo_name -}}</h2> + <ul class="nav-tabs-standalone"> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}{{- template "ref_query" $root -}}">Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="{{- .repo_url_root -}}tree/{{- template "ref_query" $root -}}">Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}log/{{- template "ref_query" $root -}}">Log</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}branches/">Branches</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}tags/">Tags</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}contrib/">Merge requests</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="{{- .repo_url_root -}}settings/">Settings</a> + </li> + </ul> + </div> + <div class="repo-header-extension"> + <div class="repo-header-extension-content"> + {{- .repo_description -}} + </div> + </div> + <div class="padding"> + {{- if .ref_name -}} + <p> + <strong> + Warning: Due to various recent migrations, viewing non-HEAD refs may be broken. + </strong> + </p> + {{- end -}} + <p> + /{{ .path_spec }} (<a href="/{{ template "group_path_plain" .group_path }}/-/repos/{{ .repo_name }}/raw/{{ .path_spec }}{{- template "ref_query" $root -}}">raw</a>) + </p> + {{- .file_contents -}} + </div> + <footer> + {{- template "footer" . -}} + </footer> + </body> +</html> +{{- end -}} |