viewContribution

tcmts.cli.contributions.viewContribution · #6xkgmicc · term · runs on the server

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

used by