fetchPrStatus function

Future<PrStatus?> fetchPrStatus({
  1. String? cwd,
})

Fetch PR status for the current branch using gh pr view.

Implementation

Future<PrStatus?> fetchPrStatus({String? cwd}) async {
  if (!await getIsGit(cwd: cwd)) return null;

  final branch = await getBranch(cwd: cwd);
  final defaultBranch = await getDefaultBranch(cwd: cwd);
  if (branch == defaultBranch) return null;

  try {
    final result = await Process.run(
      'gh',
      [
        'pr',
        'view',
        '--json',
        'number,url,reviewDecision,isDraft,headRefName,state',
      ],
      workingDirectory: cwd,
    ).timeout(const Duration(milliseconds: _ghTimeoutMs));

    if (result.exitCode != 0) return null;
    final stdout = (result.stdout as String).trim();
    if (stdout.isEmpty) return null;

    final data = json.decode(stdout) as Map<String, dynamic>;
    final headRefName = data['headRefName'] as String? ?? '';
    final state = data['state'] as String? ?? '';

    if (headRefName == defaultBranch ||
        headRefName == 'main' ||
        headRefName == 'master') {
      return null;
    }

    if (state == 'MERGED' || state == 'CLOSED') return null;

    return PrStatus(
      number: data['number'] as int,
      url: data['url'] as String,
      reviewState: deriveReviewState(
        isDraft: data['isDraft'] as bool? ?? false,
        reviewDecision: data['reviewDecision'] as String? ?? '',
      ),
    );
  } catch (_) {
    return null;
  }
}