branchList

tcmts.cli.changes.branchList · #yy5axaoo · term · runs anywhere

The codebase's branches, this one first.

import type { BranchItem } from "#codebase/tcmts/cli/changes";
import type { Codebase } from "#codebase/tcmts/cli/codebase";
import { stateOf } from "#codebase/tcmts/cli/diff";

export function branchList(cb: Codebase): BranchItem[] {
  const current = cb.store.branch().name;
  const now = stateOf(cb.store.names(undefined, true));
  const items = cb.store.branches().map((name): BranchItem => {
    const ts = cb.store.causalLog(1, name)[0]?.ts;
    if (name === current) return { name, current: true, differs: 0, ...(ts ? { ts } : {}) };
    const other = stateOf(cb.store.names(name, true));
    let differs = 0;
    for (const k of new Set([...now.keys(), ...other.keys()])) {
      const [a, b] = [now.get(k), other.get(k)];
      if (!a || !b || a.size !== b.size || [...a].some((h) => !b.has(h))) differs++;
    }
    return { name, current: false, differs, ...(ts ? { ts } : {}) };
  });
  return [...items.filter((b) => b.current), ...items.filter((b) => !b.current)];
}

uses

used by