All files / scripts/package-release/lib github.js

0% Statements 0/44
0% Branches 0/40
0% Functions 0/4
0% Lines 0/37

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78                                                                                                                                                           
import { execFileSync } from 'child_process';
import { getRepoRoot } from './config.js';
import { dryRunAction, info, error as logError } from './log.js';
 
function gh(...args) {
  return execFileSync('gh', args, {
    cwd: getRepoRoot(),
    encoding: 'utf8',
  }).trim();
}
 
function ghQuiet(...args) {
  return execFileSync('gh', args, {
    cwd: getRepoRoot(),
    encoding: 'utf8',
    stdio: ['pipe', 'pipe', 'pipe'],
  }).trim();
}
 
export function createGithubRelease(
  tagName,
  { body, sha, draft = false, prerelease = false, force = false, skipExisting = false } = {},
) {
  const exists = releaseExists(tagName);
 
  if (exists && skipExisting && !force) {
    info(`Skipping ${tagName}: GitHub release already exists.`);
    return { skipped: true };
  }
 
  if (force && exists) {
    if (dryRunAction(`gh release edit ${tagName} (update existing)`)) {
      info(`Release body:\n${body || '(generated from commits)'}`);
      return { updated: true };
    }
    const args = ['release', 'edit', tagName];
    if (body) args.push('--notes', body);
    if (draft) args.push('--draft');
    if (prerelease) args.push('--prerelease');
    try {
      gh(...args);
    } catch (e) {
      logError(`Failed to update GitHub release "${tagName}": ${e.message}`);
      throw e;
    }
    return { updated: true };
  }
 
  if (dryRunAction(`gh release create ${tagName}${draft ? ' --draft' : ''}${prerelease ? ' --prerelease' : ''}`)) {
    info(`Release body:\n${body || '(generated from commits)'}`);
    return { created: true };
  }
 
  const args = ['release', 'create', tagName];
  if (body) args.push('--notes', body);
  if (draft) args.push('--draft');
  if (prerelease) args.push('--prerelease');
  if (sha) args.push('--target', sha);
  args.push('--title', tagName);
 
  try {
    gh(...args);
  } catch (e) {
    logError(`Failed to create GitHub release "${tagName}": ${e.message}`);
    throw e;
  }
  return { created: true };
}
 
export function releaseExists(tagName) {
  try {
    ghQuiet('release', 'view', tagName);
    return true;
  } catch {
    return false;
  }
}