From d2f6cc5a5f5dc9a4b7c72cce15e9bdfe468c8602 Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Mon, 21 Sep 2026 11:02:38 +0100 Subject: [PATCH] web/pulls: rework the compose page into source, changes and diff sheets Signed-off-by: oppiliappan --- web/src/lib/api/pullCompose.ts | 24 +- web/src/lib/components/repo/DiffView.svelte | 8 +- .../repo/pulls/PullCompose.stories.svelte | 1 + .../components/repo/pulls/PullCompose.svelte | 521 +++++++++--------- .../[handle]/[repo]/pulls/new/+page.svelte | 49 +- 5 files changed, 297 insertions(+), 306 deletions(-) diff --git a/web/src/lib/api/pullCompose.ts b/web/src/lib/api/pullCompose.ts index 36e6b1be5..bc9223a4f 100644 --- a/web/src/lib/api/pullCompose.ts +++ b/web/src/lib/api/pullCompose.ts @@ -4,6 +4,7 @@ import type { RepoInfo } from "$lib/components/repo/types"; import { createBobbinClient } from "$lib/api/client"; import { branches as listBranches, gitTarget, type GitServiceConfig } from "$lib/api/gitclient"; import { listCommits, toMirrorCommitSummary } from "$lib/api/gitmirror"; +import { getMergeBase } from "$lib/api/knotmirror"; import { listRepos } from "$lib/api/records"; import { repoNameOf, @@ -96,6 +97,7 @@ export interface ForkOption { export interface ComposeData { commits: CommitSummary[]; commitsError: string; + mergeBase: string; // `owner/repo` of the source repo, for the browse-at-commit links sourceRepoPath: string; branches: BranchSummary[]; @@ -187,14 +189,25 @@ export const loadCompose = async (args: { let commits: CommitSummary[] = []; let commitsError = ""; + let mergeBase = ""; if (hasComparison && source !== "patch") { + const mirror = createBobbinClient({ serviceUrl: config.knotMirrorUrl, fetch: fetchFn }); try { - const page = await listCommits(ctx, { - repo: sourceRepoDid as Did, - ranges: [`${targetBranch}..${sourceBranch}`], - limit: COMMIT_LIMIT - }); + const [page, base] = await Promise.all([ + listCommits(ctx, { + repo: sourceRepoDid as Did, + ranges: [`${targetBranch}..${sourceBranch}`], + limit: COMMIT_LIMIT, + includeStats: true + }), + getMergeBase(mirror, { + repo: sourceRepoDid, + base: targetBranch, + head: sourceBranch + }) + ]); commits = page.commits.map(toMirrorCommitSummary); + mergeBase = base.commit; } catch (cause) { commitsError = cause instanceof Error ? cause.message : String(cause); } @@ -203,6 +216,7 @@ export const loadCompose = async (args: { return { commits, commitsError, + mergeBase, sourceRepoPath: forkRepo ? `${viewer?.handle ?? repo.ownerHandle}/${forkRepo.name}` : `${repo.ownerHandle}/${repo.name}`, diff --git a/web/src/lib/components/repo/DiffView.svelte b/web/src/lib/components/repo/DiffView.svelte index eed9bd33d..0b7ac6bf8 100644 --- a/web/src/lib/components/repo/DiffView.svelte +++ b/web/src/lib/components/repo/DiffView.svelte @@ -27,7 +27,7 @@ import Bones from "$lib/components/ui/Bones.svelte"; import ResizeHandle from "$lib/components/ui/ResizeHandle.svelte"; import { browser } from "$app/environment"; - import { tick } from "svelte"; + import { tick, untrack } from "svelte"; interface Props { deps: RepoDiffDeps; @@ -48,6 +48,7 @@ /** a patch already streaming in parallel with the file list */ patch?: PatchStream; stickyOffset?: number; + treeCollapsed?: boolean; } let { @@ -62,11 +63,12 @@ downloadUrls, patchUrl, patch, - stickyOffset = 0 + stickyOffset = 0, + treeCollapsed = false }: Props = $props(); const SM = 640; - let treeToggled = $state(null); + let treeToggled = $state(untrack(() => (treeCollapsed ? false : null))); const TREE_WIDTH = 250; const TREE_MIN_WIDTH = 200; const TREE_MAX_WIDTH = 560; diff --git a/web/src/lib/components/repo/pulls/PullCompose.stories.svelte b/web/src/lib/components/repo/pulls/PullCompose.stories.svelte index 79494364b..3f835cd6b 100644 --- a/web/src/lib/components/repo/pulls/PullCompose.stories.svelte +++ b/web/src/lib/components/repo/pulls/PullCompose.stories.svelte @@ -25,6 +25,7 @@ } ], commitsError: "", + mergeBase: "abc123abc123abc123abc123abc123abc123abc1", sourceRepoPath: "alice.pds.tngl.boltless.dev/core", branches: [{ name: "main", hash: "abc123", isDefault: true }], sourceBranches: [branch("feature/compose-selector")], diff --git a/web/src/lib/components/repo/pulls/PullCompose.svelte b/web/src/lib/components/repo/pulls/PullCompose.svelte index e74aa7d77..5918bfcff 100644 --- a/web/src/lib/components/repo/pulls/PullCompose.svelte +++ b/web/src/lib/components/repo/pulls/PullCompose.svelte @@ -15,18 +15,18 @@ -{#snippet stepNumber(n: number)} - {n} -{/snippet} - {#snippet notice(message: string, danger = false)}
- {#if view.prefillError} -
-
- {/if} +
+ + {#if view.prefillError} +
+
+ {/if} -
-
-
-
-
{@render stepNumber(1)}
-

+ +
+ 1 +

Source

- acting?.did ?? "", (did) => (picked = did)} - label="Open as" - disabled={save.loading} - group="pull-compose" - class="ml-auto" - /> -

-
-
- {@render tab("branch", "Compare branches", "Select a source branch")} - {@render tab("fork", "Compare forks", "Select a fork and branch as the source")} - {@render tab( - "patch", - "Paste patch", - "Paste a git diff or git format-patch", - true - )} -
- - {#if view.source === "patch"} - - {#snippet children({ id })} -