+35
-20
appview/db/issues.go
+35
-20
appview/db/issues.go
······+func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) ([]Issue, error) {···
+12
appview/db/pulls.go
+12
appview/db/pulls.go
···
+62
appview/filetree/filetree.go
+62
appview/filetree/filetree.go
···
+126
appview/middleware/middleware.go
+126
appview/middleware/middleware.go
···
+2
appview/pages/funcmap.go
+2
appview/pages/funcmap.go
······
+136
-45
appview/pages/pages.go
+136
-45
appview/pages/pages.go
··················+err := filepath.WalkDir(filepath.Join(p.templateDir, "templates"), func(path string, d fs.DirEntry, err error) error {+func (p *Pages) executeOrReload(templateName string, w io.Writer, base string, params any) error {···············
+4
-17
appview/pages/templates/repo/fragments/diff.html
+4
-17
appview/pages/templates/repo/fragments/diff.html
·········<div id="diff-file-header" class="rounded cursor-pointer bg-white dark:bg-gray-800 flex justify-between"><span class="bg-green-100 text-green-700 dark:bg-green-800/50 dark:text-green-400 {{ $markerstyle }}">ADDED</span>···<a class="dark:text-white whitespace-nowrap overflow-x-auto" {{if $this }}href="/{{ $repo }}/blob/{{ $this }}/{{ .Name.Old }}"{{end}}>···
+27
appview/pages/templates/repo/fragments/filetree.html
+27
appview/pages/templates/repo/fragments/filetree.html
···+<a href="#file-{{ .Path }}" class="text-black dark:text-white no-underline hover:underline">{{ .Name }}</a>
+2
-7
appview/pages/templates/repo/fragments/interdiff.html
+2
-7
appview/pages/templates/repo/fragments/interdiff.html
···<section class="mt-6 p-6 border border-gray-200 dark:border-gray-700 w-full mx-auto rounded bg-white dark:bg-gray-800 drop-shadow-sm">···
+38
appview/pages/templates/repo/issues/issues.html
+38
appview/pages/templates/repo/issues/issues.html
···+class="btn flex items-center gap-2 no-underline hover:no-underline dark:text-white dark:hover:bg-gray-700"+href = "/{{ $.RepoInfo.FullName }}/issues?state={{ $currentState }}&offset={{ $prev.Offset }}&limit={{ $prev.Limit }}"+class="btn flex items-center gap-2 no-underline hover:no-underline dark:text-white dark:hover:bg-gray-700"+href = "/{{ $.RepoInfo.FullName }}/issues?state={{ $currentState }}&offset={{ $next.Offset }}&limit={{ $next.Limit }}"
+8
-8
appview/pages/templates/repo/pulls/fragments/pullHeader.html
+8
-8
appview/pages/templates/repo/pulls/fragments/pullHeader.html
···-<a href="/{{ $owner }}/{{ .PullSourceRepo.Name }}" class="no-underline hover:underline">{{ $owner }}/{{ .PullSourceRepo.Name }}</a>+<a href="/{{ $owner }}/{{ .Pull.PullSource.Repo.Name }}" class="no-underline hover:underline">{{ $owner }}/{{ .Pull.PullSource.Repo.Name }}</a><span class="text-xs rounded bg-gray-100 dark:bg-gray-700 text-black dark:text-white font-mono px-2 mx-1/2 inline-flex items-center">-<a href="/{{ $fullRepo }}/tree/{{ .Pull.PullSource.Branch }}" class="no-underline hover:underline">{{ .Pull.PullSource.Branch }}</a>···
+7
-3
appview/pages/templates/repo/pulls/pull.html
+7
-3
appview/pages/templates/repo/pulls/pull.html
···+<a href="/{{ $fullRepo }}/commit/{{ .SHA }}" class="font-mono text-gray-500 dark:text-gray-400">{{ slice .SHA 0 8 }}</a>-<a href="/{{ $fullRepo }}/commit/{{ .SHA }}" class="font-mono text-gray-500 dark:text-gray-400">{{ slice .SHA 0 8 }}</a>
+1
-1
appview/pages/templates/user/profile.html
+1
-1
appview/pages/templates/user/profile.html
···-<span class="px-2 py-1/2 text-sm rounded text-black dark:text-white bg-gray-50 dark:bg-gray-700 ">
+31
appview/pagination/page.go
+31
appview/pagination/page.go
···
+451
appview/settings/settings.go
+451
appview/settings/settings.go
···+Text: `Click the link below (or copy and paste it into your browser) to verify your email address.+Html: `<p>Click the link (or copy and paste it into your browser) to verify your email address.</p>+func (s *Settings) sendVerificationEmail(w http.ResponseWriter, did, emailAddr, code string, errorContext string) error {+s.Pages.Notice(w, "settings-emails-error", fmt.Sprintf("Unable to send verification email at this moment, try again later. %s", errorContext))+s.Pages.Notice(w, "settings-emails-error", "Unable to add email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-error", "This email is already added but not verified. Check your inbox for the verification link.")+s.Pages.Notice(w, "settings-emails-error", "Unable to add email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-error", "Unable to add email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-error", "Unable to add email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-success", "Click the link in the email we sent you to verify your email address.")+s.Pages.Notice(w, "settings-emails-error", "Unable to delete email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-error", "Unable to delete email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-error", "Unable to delete email at this moment, try again later.")+return fmt.Sprintf("%s/settings/emails/verify?did=%s&email=%s&code=%s", appUrl, url.QueryEscape(did), url.QueryEscape(email), url.QueryEscape(code))+s.Pages.Notice(w, "settings-emails-error", "Invalid verification code. Please request a new verification email.")+s.Pages.Notice(w, "settings-emails-error", "Error updating email verification status. Please try again later.")+s.Pages.Notice(w, "settings-emails-error", "Unable to resend verification email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-error", fmt.Sprintf("Please wait %d minutes before requesting another verification email.", int(waitTime.Minutes()+1)))+s.Pages.Notice(w, "settings-emails-error", "Unable to resend verification email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-error", "Unable to resend verification email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-error", "Unable to resend verification email at this moment, try again later.")+s.Pages.Notice(w, "settings-emails-success", "Verification email resent. Click the link in the email we sent you to verify your email address.")+s.Pages.Notice(w, "settings-emails-error", "Error setting primary email. Please try again later.")+s.Pages.Notice(w, "settings-keys", "That doesn't look like a valid public key. Make sure it's a <strong>public</strong> key.")+s.Pages.Notice(w, "settings-keys", "Unable to add public key at this moment, try again later.")+s.Pages.Notice(w, "settings-keys", "Unable to add public key at this moment, try again later.")+_, err := comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
+2
-1
appview/state/follow.go
+2
-1
appview/state/follow.go
······
+7
-92
appview/state/middleware.go
+7
-92
appview/state/middleware.go
···············
+18
-22
appview/state/pull.go
+18
-22
appview/state/pull.go
···············atResp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{···+s.pages.Notice(w, "pull", "This knot doesn't support format-patch. Unfortunately, there is no fallback for now.")······
+14
-5
appview/state/repo.go
+14
-5
appview/state/repo.go
·····················resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{···
+26
-23
appview/state/router.go
+26
-23
appview/state/router.go
··················r.With(RepoPermissionMiddleware(s, "repo:owner")).Route("/description", func(r chi.Router) {············
-416
appview/state/settings.go
-416
appview/state/settings.go
···-Text: `Click the link below (or copy and paste it into your browser) to verify your email address.-Html: `<p>Click the link (or copy and paste it into your browser) to verify your email address.</p>-func (s *State) sendVerificationEmail(w http.ResponseWriter, did, emailAddr, code string, errorContext string) error {-s.pages.Notice(w, "settings-emails-error", fmt.Sprintf("Unable to send verification email at this moment, try again later. %s", errorContext))-s.pages.Notice(w, "settings-emails-error", "Unable to add email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-error", "This email is already added but not verified. Check your inbox for the verification link.")-s.pages.Notice(w, "settings-emails-error", "Unable to add email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-error", "Unable to add email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-error", "Unable to add email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-success", "Click the link in the email we sent you to verify your email address.")-s.pages.Notice(w, "settings-emails-error", "Unable to delete email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-error", "Unable to delete email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-error", "Unable to delete email at this moment, try again later.")-return fmt.Sprintf("%s/settings/emails/verify?did=%s&email=%s&code=%s", appUrl, url.QueryEscape(did), url.QueryEscape(email), url.QueryEscape(code))-s.pages.Notice(w, "settings-emails-error", "Invalid verification code. Please request a new verification email.")-s.pages.Notice(w, "settings-emails-error", "Error updating email verification status. Please try again later.")-s.pages.Notice(w, "settings-emails-error", "Unable to resend verification email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-error", fmt.Sprintf("Please wait %d minutes before requesting another verification email.", int(waitTime.Minutes()+1)))-s.pages.Notice(w, "settings-emails-error", "Unable to resend verification email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-error", "Unable to resend verification email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-error", "Unable to resend verification email at this moment, try again later.")-s.pages.Notice(w, "settings-emails-success", "Verification email resent. Click the link in the email we sent you to verify your email address.")-s.pages.Notice(w, "settings-emails-error", "Error setting primary email. Please try again later.")-s.pages.Notice(w, "settings-keys", "That doesn't look like a valid public key. Make sure it's a <strong>public</strong> key.")-s.pages.Notice(w, "settings-keys", "Unable to add public key at this moment, try again later.")-s.pages.Notice(w, "settings-keys", "Unable to add public key at this moment, try again later.")-_, err := comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
+2
-1
appview/state/star.go
+2
-1
appview/state/star.go
······
+5
-5
appview/state/state.go
+5
-5
appview/state/state.go
············
+11
appview/tid.go
+11
appview/tid.go
+9
-7
docs/contributing.md
+9
-7
docs/contributing.md
······
+82
docs/knot-hosting.md
+82
docs/knot-hosting.md
···You should now have a running knot server! You can finalize your registration by hitting the
+3
-3
flake.lock
+3
-3
flake.lock
···
+10
-1
flake.nix
+10
-1
flake.nix
···-build.cmd "${pkgs.tailwindcss}/bin/tailwindcss -i input.css -o ./appview/pages/static/tw.css && ${pkgs.go}/bin/go build -o ./out/${name}.out ./cmd/${name}/main.go" \···
+4
-4
input.css
+4
-4
input.css
···/* CommentPreprocFile */ .chroma .cpf { color: #9ca0b0; font-weight: bold; font-style: italic }+/* GenericDeleted */ .chroma .gd { color: #d20f39; background-color: oklch(93.6% 0.032 17.717) }+/* GenericInserted */ .chroma .gi { color: #40a02b; background-color: oklch(96.2% 0.044 156.743) }···/* CommentPreprocFile */ .chroma .cpf { color: #6e738d; font-weight: bold; font-style: italic }+/* GenericDeleted */ .chroma .gd { color: #ed8796; background-color: oklch(44.4% 0.177 26.899 / 0.5) }+/* GenericInserted */ .chroma .gi { color: #a6da95; background-color: oklch(44.8% 0.119 151.328 / 0.5) }
+1
knotserver/routes.go
+1
knotserver/routes.go
+8
patchutil/interdiff.go
+8
patchutil/interdiff.go
···
+1
types/capabilities.go
+1
types/capabilities.go
+14
types/diff.go
+14
types/diff.go
···