phacility/phabricator · error · Exception

The raw diff you have submitted is too large to parse (it af

Error message

The raw diff you have submitted is too large to parse (it affects more than %s paths and hunks).

What it means

differential.createrawdiff bounds the work needed to persist a raw diff: it sums 1 + hunk count over every changeset in the parsed diff and rejects the call with a plain Exception when that total exceeds a hard-coded limit of 10000. The message reads 'The raw diff you have submitted is too large to parse (it affects more than %s paths and hunks).'.

Source

Thrown at src/applications/differential/conduit/DifferentialCreateRawDiffConduitAPIMethod.php:59

          pht('No such repository "%s"!', $repository_phid));
      }
    }

    $parser = new ArcanistDiffParser();
    $changes = $parser->parseDiff($raw_diff);
    $diff = DifferentialDiff::newFromRawChanges($viewer, $changes);

    // We're bounded by doing INSERTs for all the hunks and changesets, so
    // estimate the number of inserts we'll require.
    $size = 0;
    foreach ($diff->getChangesets() as $changeset) {
      $hunks = $changeset->getHunks();
      $size += 1 + count($hunks);
    }

    $raw_limit = 10000;
    if ($size > $raw_limit) {
      throw new Exception(
        pht(
          'The raw diff you have submitted is too large to parse (it affects '.
          'more than %s paths and hunks).',
          new PhutilNumber($raw_limit)));
    }

    $diff_data_dict = array(
      'creationMethod' => 'web',
      'authorPHID' => $viewer->getPHID(),
      'repositoryPHID' => $repository_phid,
      'lintStatus' => DifferentialLintStatus::LINT_SKIP,
      'unitStatus' => DifferentialUnitStatus::UNIT_SKIP,
    );

    $xactions = array(
      id(new DifferentialDiffTransaction())
        ->setTransactionType(DifferentialDiffTransaction::TYPE_DIFF_CREATE)
        ->setNewValue($diff_data_dict),

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Narrow the diff to the paths that matter: git diff -- <paths>, and exclude vendored/generated files
  2. Split the change into several smaller diffs/revisions if the work is genuinely that large
  3. Pre-compute the same size metric client-side (sum of 1 + hunks per path) and refuse to submit past 10000
  4. Note the limit is hard-coded server-side; there is no configuration to raise it - reduce the diff instead

Example fix

# before
git diff master...feature | head -c 100M > /tmp/huge.diff
# then submit /tmp/huge.diff -> rejected

# after
git diff master...feature -- ':!vendor' ':!*.min.js' > /tmp/d.diff
# submit /tmp/d.diff
Defensive patterns

Strategy: validation

Validate before calling

// Mirror the server metric: 1 + hunks per path, limit 10000.
$size = 0;
foreach ($parsed_changes as $change) {
  $size += 1 + count(idx($change, 'hunks', array()));
}
if ($size > 10000) {
  throw new RuntimeException('Diff too large: '.$size.' paths+hunks; narrow it');
}

Try / catch

try {
  $client->callMethodSynchronous('differential.createrawdiff', $params);
} catch (ConduitClientException $ex) {
  if (strpos($ex->getMessage(), 'too large to parse') !== false) {
    // reduce scope (exclude paths) and resubmit once
  } else {
    throw $ex;
  }
}

Prevention

When it happens

Trigger: Submitting a raw diff that touches more than 10000 combined paths and hunks - whole-tree or monorepo diffs, vendored/generated code included, or a diff of many files each with several hunks.

Common situations: Developers running tools like 'git diff HEAD~50' on huge trees; CI jobs diffing with vendored dependencies not excluded; diffs containing minimized or lock-generated files with many hunks.

Related errors


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/6e3cf4fd6d7ad7d8. Report an issue: GitHub.