export async function correlateRuns()

in eng/tools/lint-diff/src/correlateResults.ts [7:78]


export async function correlateRuns(
  beforePath: string,
  beforeChecks: AutorestRunResult[],
  afterChecks: AutorestRunResult[],
): Promise<Map<string, BeforeAfter>> {
  const runCorrelations = new Map<string, BeforeAfter>();
  console.log("\nCorrelating runs...");
  for (const results of afterChecks) {
    const { readme, tag } = results;
    const key = tag ? `${readme}#${tag}` : readme;
    if (runCorrelations.has(key)) {
      throw new Error(`Duplicate key found correlating autorest runs: ${key}`);
    }

    // Look for candidates matching readme and tag
    const beforeCandidates = beforeChecks.filter((r) => r.readme === readme && r.tag === tag);
    if (beforeCandidates.length === 1) {
      runCorrelations.set(key, {
        before: beforeCandidates[0],
        after: results,
      });
      continue;
    } else if (beforeCandidates.length > 1) {
      throw new Error(`Multiple before candidates found for key ${key}`);
    }

    // Look for candidates with a matching default tag from the baseline
    const beforeReadmePath = join(beforePath, readme);
    if (await pathExists(beforeReadmePath)) {
      const readmeContent = await readFile(beforeReadmePath, { encoding: "utf-8" });
      const defaultTag = getDefaultTag(readmeContent);
      if (!defaultTag) {
        throw new Error(`No default tag found for readme ${readme} in before state`);
      }
      const beforeDefaultTagCandidates = beforeChecks.filter(
        (r) => r.readme === readme && r.tag === defaultTag,
      );

      if (beforeDefaultTagCandidates.length === 1) {
        runCorrelations.set(key, {
          before: beforeDefaultTagCandidates[0],
          after: results,
        });
        continue;
      } else if (beforeDefaultTagCandidates.length > 1) {
        throw new Error(
          `Multiple before candidates found for key ${key} using default tag ${defaultTag}`,
        );
      }

      // Look for candidates matching just the readme file
      const beforeReadmeCandidate = beforeChecks.filter((r) => r.readme === readme);
      if (beforeReadmeCandidate.length === 1) {
        runCorrelations.set(key, {
          before: beforeReadmeCandidate[0],
          after: results,
        });
        continue;
      } else if (beforeReadmeCandidate.length > 1) {
        throw new Error(`Multiple before candidates found for key ${key} using readme ${readme}`);
      }
    }

    console.log(`No before candidates found for key ${key}, using no baseline`);
    runCorrelations.set(key, {
      before: null,
      after: results,
    });
  }

  return runCorrelations;
}