runResolve

tcmts.cli.run.runResolve · #gnneqodo · term · runs on the server

uses tcmts.cli.main.execute, which uses tcmts.cli.help.usageError, which uses tcmts.cli.help.usageOf, which uses tcmts.cli.style.bold, which uses node:util

Runs tcm resolve.

import { routeResolve } from "#codebase/tcmts/cli/commands";
import { execute, resolveConflict } from "#codebase/tcmts/cli/main";
import { conflictAt, sideHash } from "#codebase/tcmts/cli/merge";
import type { Context } from "#codebase/tcmts/cli/run";
import { choose, UsageError } from "#codebase/tcmts/cli/ui";
import { shortHash } from "#codebase/tcmts/core/hash";
import { parse } from "@bomb.sh/router";

export async function runResolve({ cb, cmd, rest }: Context): Promise<number> {
  const { model } = execute(cmd, parse(routeResolve(), { argv: rest }));
  const conflicted = [...new Set(cb.store.names().map((n) => n.path))].filter(
    (p) => cb.store.hashesAt(p).length > 1,
  );
  const name =
    model.name ??
    (await choose(
      "resolve <name> <#hash>",
      "Which conflict?",
      conflicted.map((p) => ({
        value: p,
        label: p,
        hint: `${cb.store.hashesAt(p).length} definitions`,
      })),
    ));
  if (model.ours && model.theirs) throw new UsageError("--ours or --theirs: keep one side");
  const side = model.ours ? "ours" : model.theirs ? "theirs" : undefined;
  const sides = conflictAt(cb, name)?.sides ?? [];
  const keep =
    model.hash ??
    (side
      ? sideHash(cb, name, side)
      : await choose(
          "resolve <name> <#hash>",
          `Keep which ${name}?`,
          cb.store.hashesAt(name).map((h) => {
            const s = sides.find((x) => x.hash === h);
            const rec = cb.store.getDef(h);
            return {
              value: `#${h}`,
              label: `#${shortHash(h)}${s?.side ? ` (${s.side}: ${s.label})` : ""}`,
              hint: rec && cb.store.shownSignature(rec),
            };
          }),
          false,
        ));
  resolveConflict(cb, name, keep);
  return 0;
}

uses

used by