recordConflicts

tcmts.cli.merge.recordConflicts · #g7drxay2 · term · runs anywhere

Keep which side each definition of a merge's conflicts came from, and the merge base's (ConflictRecord), for what lists and settles conflicts afterwards (tcm todo, tcm edit, tcm resolve --ours).

import type { Codebase } from "#codebase/tcmts/cli/codebase";
import type { NameState } from "#codebase/tcmts/cli/diff";
import { conflictSetting } from "#codebase/tcmts/cli/merge";
import type { ConflictRecord, Settled } from "#codebase/tcmts/cli/merge";

export function recordConflicts(
  cb: Codebase,
  conflicts: Settled["conflicts"],
  base: NameState,
  labels: { ours: string; theirs: string },
): void {
  for (const c of conflicts) {
    const b = base.get(c.key);
    const of = (side: "ours" | "theirs") => ({
      label: labels[side],
      hashes: c.sides.filter((s) => s.side === side).map((s) => s.hash),
    });
    const rec: ConflictRecord = {
      ...(b?.size === 1 ? { base: [...b][0]! } : {}),
      ours: of("ours"),
      theirs: of("theirs"),
    };
    cb.store.setSetting(conflictSetting(cb, c.key), JSON.stringify(rec));
  }
}

uses

used by