contributionChanges

tcmts.share.contributionChanges · #45zo475j · term · runs on the server

uses tcmts.share.reviewItems, which uses tcmts.share.definitionLines, which uses tcmts.cli.files.fileContent, which uses Buffer

A contribution's changes, in review order; undefined if its branches are gone.

import type { Codebase } from "#codebase/tcmts/cli/codebase";
import { diffNamespaces, keyPath, namesIn, stateOf } from "#codebase/tcmts/cli/diff";
import { isTestPath } from "#codebase/tcmts/cli/testing";
import { shortHash } from "#codebase/tcmts/core/hash";
import { reviewItems, reviewOrder } from "#codebase/tcmts/share";
import type { ContributionChanges } from "#codebase/tcmts/share";
import type { Contribution } from "#codebase/tcmts/store";

export function contributionChanges(
  cb: Codebase,
  c: Contribution,
): ContributionChanges | undefined {
  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 undefined;
  const stateAt = (causal: string) =>
    stateOf(cb.store.namespaceRows(cb.store.causal(causal)!.namespace));
  const [before, after] = [stateAt(from), stateAt(to)];
  const d = diffNamespaces(before, after, (h) => cb.store.getDef(h)!.ir);
  const [oldNames, newNames] = [namesIn(before), namesIn(after)];
  const items = reviewItems(cb, d, oldNames, newNames);
  const usesOf = (h: string) =>
    (cb.store.getDef(h)?.deps ?? [])
      .filter((x) => x.ref.startsWith("#"))
      .map((x) => x.ref.slice(1));
  const name = (h: string) => newNames(h) ?? shortHash(h);
  return {
    from,
    to,
    items: reviewOrder(items, usesOf),
    propagated: d.propagated
      .map((x) => ({
        path: keyPath(x.path),
        because: x.because.map(name),
        test: isTestPath(keyPath(x.path)),
      }))
      .sort((a, b) => (a.path < b.path ? -1 : 1)),
  };
}

uses

used by