From ca29f89e0250a5a90feb7ce8e213cdfb1dec3f69 Mon Sep 17 00:00:00 2001 From: Silberengel Date: Fri, 27 Feb 2026 12:51:44 +0100 Subject: [PATCH] bug-fixes Nostr-Signature: 02dcdcda1083cffd91dbf8906716c2ae09f06f77ef8590802afecd85f0b3108a 573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc 13d2b30ed37af03fd47dc09536058babb4dc63d1cfc55b8f38651ffd6342abcddc840b543c085b047721e9102b2d07e3dae78ff31d5990c92c04410ef1efcd5b --- nostr/commit-signatures.jsonl | 1 + src/app.css | 15 +- src/lib/components/RepoHeaderEnhanced.svelte | 64 +++-- src/lib/services/git/announcement-manager.ts | 219 ++++++++++++++++-- .../git/file-manager/commit-operations.ts | 7 +- src/lib/services/git/repo-manager.ts | 20 +- src/lib/services/nostr/nostr-client.ts | 22 +- src/lib/services/nostr/relay-write-proof.ts | 48 +++- src/lib/services/nostr/repo-polling.ts | 6 + src/lib/styles/repo.css | 1 + src/lib/utils/api-context.ts | 10 +- .../repos/[npub]/[repo]/branches/+server.ts | 6 +- .../api/repos/[npub]/[repo]/clone/+server.ts | 39 +++- .../repos/[npub]/[repo]/commits/+server.ts | 9 +- .../api/repos/[npub]/[repo]/fork/+server.ts | 205 +++++++++------- .../api/repos/[npub]/[repo]/tree/+server.ts | 6 +- .../api/repos/[npub]/[repo]/verify/+server.ts | 91 +++++--- src/routes/repos/+page.svelte | 161 ++++++------- src/routes/repos/[npub]/[repo]/+page.svelte | 27 ++- .../[npub]/[repo]/services/repo-operations.ts | 18 +- static/icons/git-fork.svg | 10 + static/icons/hard-drive.svg | 7 + 22 files changed, 692 insertions(+), 300 deletions(-) create mode 100644 static/icons/git-fork.svg create mode 100644 static/icons/hard-drive.svg diff --git a/nostr/commit-signatures.jsonl b/nostr/commit-signatures.jsonl index 249d993..a43ff10 100644 --- a/nostr/commit-signatures.jsonl +++ b/nostr/commit-signatures.jsonl @@ -108,3 +108,4 @@ {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1772142448,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","refactor 11"]],"content":"Signed commit: refactor 11","id":"bb9d5c56a291e48221df96868fb925e309cb560aa350c2cf5f9c4ddd5e5c4a6b","sig":"75662c916bf4d8bb3d70cdae4e4882382692c6f1ca67598a69abe3dc96069ef6f2bda5a1b8f91b724aa43b3cb3c6b8ad6cbce286b5d165377a34a881e7275d2a"} {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1772142558,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","remove redundancy"]],"content":"Signed commit: remove redundancy","id":"11ac91151bebd4dd49b91bcdef7b0b7157f0afd8ce710f7231be4860fb073d08","sig":"a7efcafa5ea83a0c37eae4562a84a7581c3d5c5dd1416f8f3e2bd2633d8523ae0eb7cc56dc4292c127ea16fb2dd5bc639483cb096263a850956b47312ed7ff6f"} {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1772182112,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","refactor 12"]],"content":"Signed commit: refactor 12","id":"73671ae6535309f9eae164f7a3ec403b1bc818ef811b9692fd0122d0b72c2774","sig":"0df56b009f5afb77de334225ab30cff55586ac0cf48f5ee435428201a1e72dc357a0fb5e80ef196f5bd76d6d448056d25f0feab0b1bcbe45f9af1a2a0d5453ca"} +{"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1772188835,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","refactor 13"]],"content":"Signed commit: refactor 13","id":"f41c8662dcbf1be408c560d11eda0890c40582a8ea8bb3220116e645cc6a2bb5","sig":"2b7b70089cecfa4652fe236fa586a6fe1b05c1c95434a160717cbf5ee2f37382cdd8e8f31d7b3a7576ee5264e9e70c7a8651591caaea0cd311d1be4c561d282f"} diff --git a/src/app.css b/src/app.css index e19172c..6baadb6 100644 --- a/src/app.css +++ b/src/app.css @@ -938,11 +938,22 @@ button.theme-option.active img.theme-icon-option, [data-theme="dark"] .verification-badge.unverified .icon-inline img, [data-theme="black"] .verification-badge.unverified .icon-inline img { - filter: brightness(0) saturate(100%) invert(0.5) sepia(1) saturate(3) hue-rotate(0deg); + filter: brightness(0) saturate(100%) invert(1) sepia(1) saturate(5) hue-rotate(0deg); } [data-theme="light"] .verification-badge.unverified .icon-inline img { - filter: brightness(0) saturate(100%) invert(0.3) sepia(1) saturate(3) hue-rotate(0deg); + filter: brightness(0) saturate(100%) invert(0.2) sepia(1) saturate(3) hue-rotate(0deg); +} + +/* Alert triangle icons in verification badges - ensure visibility on dark backgrounds */ +.verification-badge.unverified img[src*="alert-triangle.svg"].icon-inline, +.verification-badge.unverified .icon-inline img[src*="alert-triangle.svg"] { + filter: brightness(0) saturate(100%) invert(1) sepia(1) saturate(5) hue-rotate(0deg); +} + +[data-theme="light"] .verification-badge.unverified img[src*="alert-triangle.svg"].icon-inline, +[data-theme="light"] .verification-badge.unverified .icon-inline img[src*="alert-triangle.svg"] { + filter: brightness(0) saturate(100%) invert(0.2) sepia(1) saturate(3) hue-rotate(0deg); } .clear-lookup-button img, diff --git a/src/lib/components/RepoHeaderEnhanced.svelte b/src/lib/components/RepoHeaderEnhanced.svelte index 63f46af..efb6186 100644 --- a/src/lib/components/RepoHeaderEnhanced.svelte +++ b/src/lib/components/RepoHeaderEnhanced.svelte @@ -89,6 +89,28 @@ topics = [] }: Props = $props(); + // Check if user is the repo owner + // userPubkey can be in npub format, so we need to decode it if needed + const userPubkeyHex = $derived.by(() => { + if (!userPubkey) return null; + // If it's already hex (64 chars), return as-is + if (/^[0-9a-f]{64}$/i.test(userPubkey)) { + return userPubkey.toLowerCase(); + } + // Try to decode as npub + try { + const decoded = nip19.decode(userPubkey); + if (decoded.type === 'npub') { + return decoded.data as string; + } + } catch { + // Not an npub, assume it's hex + } + return userPubkey.toLowerCase(); + }); + + const isOwner = $derived(userPubkeyHex && ownerPubkey && userPubkeyHex === ownerPubkey.toLowerCase()); + let showMoreMenu = $state(false); let showBranchMenu = $state(false); let showOwnerMenu = $state(false); @@ -208,20 +230,34 @@ Create Patch {/if} - {#if (isRepoCloned === false || isRepoCloned === null) && onCloneToServer} - + {#if (isRepoCloned === false || isRepoCloned === null)} + {#if isOwner && onCloneToServer} + + {:else if !isOwner && onFork && hasUnlimitedAccess} + + {/if} {/if} {#if isMaintainer && onSettings}