{"version":3,"file":"git.mjs","names":[],"sources":["../src/git.ts"],"sourcesContent":["import { execa } from \"execa\"\n\nimport type { ResolvedConfig } from \"./shared/types\"\n\nexport type GitRunner = (args: string[]) => Promise<string>\n\nexport type ReleaseContext = {\n  diffStat: string\n  commitList: string\n  changedFiles: string[]\n  patch: string\n}\n\nexport const runGit: GitRunner = async (args) => {\n  const { stdout } = await execa(\"git\", args, { stdio: \"pipe\" })\n  return (stdout ?? \"\").trim()\n}\n\nfunction excludeArgs(paths: string[]) {\n  return paths.map((path) => `:(exclude)${path}`)\n}\n\nfunction pathArgs(paths: string[]) {\n  return paths.length > 0 ? paths : [\".\"]\n}\n\nexport function isIncludedPath(\n  file: string,\n  config: Pick<ResolvedConfig, \"includePaths\" | \"excludePaths\">,\n) {\n  if (\n    config.includePaths.length > 0 &&\n    !config.includePaths.some((path) => file.startsWith(path))\n  ) {\n    return false\n  }\n\n  return !config.excludePaths.some((path) => {\n    if (path.includes(\"*\")) return false\n    return file === path || file.startsWith(path.replace(/\\/$/, \"\"))\n  })\n}\n\nexport async function collectReleaseContext({\n  from,\n  to,\n  config,\n  git = runGit,\n}: {\n  from: string\n  to: string\n  config: ResolvedConfig\n  git?: GitRunner\n}): Promise<ReleaseContext> {\n  const range = `${from}..${to}`\n  const diffArgs = [\n    \"diff\",\n    range,\n    \"--\",\n    ...pathArgs(config.includePaths),\n    ...excludeArgs(config.excludePaths),\n  ]\n\n  const [diffStat, commitList, changedFilesOutput, patch] = await Promise.all([\n    git([\"diff\", range, \"--stat\"]),\n    git([\"log\", range, \"--oneline\", \"--no-decorate\"]),\n    git([\n      \"diff\",\n      range,\n      \"--name-only\",\n      \"--\",\n      ...pathArgs(config.includePaths),\n      ...excludeArgs(config.excludePaths),\n    ]),\n    git([...diffArgs, \"--minimal\"]),\n  ])\n\n  return {\n    diffStat,\n    commitList,\n    changedFiles: changedFilesOutput\n      .split(\"\\n\")\n      .map((file) => file.trim())\n      .filter(Boolean)\n      .filter((file) => isIncludedPath(file, config)),\n    patch,\n  }\n}\n"],"mappings":";;AAaA,MAAa,SAAoB,OAAO,SAAS;CAC/C,MAAM,EAAE,WAAW,MAAM,MAAM,OAAO,MAAM,EAAE,OAAO,OAAO,CAAC;CAC7D,QAAQ,UAAU,GAAA,CAAI,KAAK;AAC7B;AAEA,SAAS,YAAY,OAAiB;CACpC,OAAO,MAAM,KAAK,SAAS,aAAa,MAAM;AAChD;AAEA,SAAS,SAAS,OAAiB;CACjC,OAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,GAAG;AACxC;AAEA,SAAgB,eACd,MACA,QACA;CACA,IACE,OAAO,aAAa,SAAS,KAC7B,CAAC,OAAO,aAAa,MAAM,SAAS,KAAK,WAAW,IAAI,CAAC,GAEzD,OAAO;CAGT,OAAO,CAAC,OAAO,aAAa,MAAM,SAAS;EACzC,IAAI,KAAK,SAAS,GAAG,GAAG,OAAO;EAC/B,OAAO,SAAS,QAAQ,KAAK,WAAW,KAAK,QAAQ,OAAO,EAAE,CAAC;CACjE,CAAC;AACH;AAEA,eAAsB,sBAAsB,EAC1C,MACA,IACA,QACA,MAAM,UAMoB;CAC1B,MAAM,QAAQ,GAAG,KAAK,IAAI;CAC1B,MAAM,WAAW;EACf;EACA;EACA;EACA,GAAG,SAAS,OAAO,YAAY;EAC/B,GAAG,YAAY,OAAO,YAAY;CACpC;CAEA,MAAM,CAAC,UAAU,YAAY,oBAAoB,SAAS,MAAM,QAAQ,IAAI;EAC1E,IAAI;GAAC;GAAQ;GAAO;EAAQ,CAAC;EAC7B,IAAI;GAAC;GAAO;GAAO;GAAa;EAAe,CAAC;EAChD,IAAI;GACF;GACA;GACA;GACA;GACA,GAAG,SAAS,OAAO,YAAY;GAC/B,GAAG,YAAY,OAAO,YAAY;EACpC,CAAC;EACD,IAAI,CAAC,GAAG,UAAU,WAAW,CAAC;CAChC,CAAC;CAED,OAAO;EACL;EACA;EACA,cAAc,mBACX,MAAM,IAAI,CAAC,CACX,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,CAAC,CACf,QAAQ,SAAS,eAAe,MAAM,MAAM,CAAC;EAChD;CACF;AACF"}