viewContribution
uses tcmts.cli.diff.diffReport, which uses tcmts.cli.files.fileContent, which uses Buffer
import type { Codebase } from "#codebase/tcmts/cli/codebase"; import { find, mergeable } from "#codebase/tcmts/cli/contributions"; import type { ContributionView } from "#codebase/tcmts/cli/contributions"; import { diffNamespaces, diffReport, stateOf } from "#codebase/tcmts/cli/diff"; import { shortHash } from "#codebase/tcmts/core/hash"; export function viewContribution(cb: Codebase, id: number): ContributionView { const c = find(cb, id); const stateAt = (causal: string) => stateOf(cb.store.namespaceRows(cb.store.causal(causal)!.namespace)); const irOf = (h: string) => cb.store.getDef(h)!.ir; let from: string; let to: string; if (c.status === "merged" && c.mergedFrom && c.mergedAs) [from, to] = [c.mergedFrom, c.mergedAs]; else if (cb.store.hasBranch(c.source) && cb.store.hasBranch(c.target)) { to = cb.store.head(c.source); from = cb.store.mergeBase(cb.store.head(c.target), to); } else return { contribution: c, comments: cb.store.comments(id), report: [[["dim", " its branches are gone"]]], changed: [], mergeable: null, }; const [before, after] = [stateAt(from), stateAt(to)]; const d = diffNamespaces(before, after, irOf); const title = c.status === "merged" ? `merged into ${c.target} as ${shortHash(to)}` : `changes on ${c.source} since it left ${c.target} (${shortHash(from)})`; const changed = [ ...new Set( [...d.edited, ...d.propagated, ...d.added, ...d.removed, ...d.conflicted] .map((x) => x.path) .concat(d.renamed.map((r) => r.to)), ), ].sort(); return { contribution: c, comments: cb.store.comments(id), report: diffReport(cb, d, before, after, title), changed, mergeable: c.status === "open" ? mergeable(cb, c) : null, }; }
uses
- tcmts.cli.codebase.Codebase
- tcmts.cli.contributions.ContributionView
- tcmts.cli.contributions.find
- tcmts.cli.contributions.mergeable
- tcmts.cli.diff.diffNamespaces
- tcmts.cli.diff.diffReport
- tcmts.cli.diff.stateOf
- tcmts.core.hash.shortHash