phacility/phabricator · critical · Exception

This revision has no diffs. Something has gone quite wrong.

Error message

This revision has no diffs. Something has gone quite wrong.

What it means

A revision page requires at least one diff; the controller throws this invariant error when a DifferentialRevision row exists with zero attached diffs. Normal Phabricator flows always create revisions together with a first diff, so this error signals damaged or abnormal data.

Solutions

  1. Create revisions through the API or UI (differential.creatediff plus differential.updaterevision) so every revision gets at least one diff.
  2. Repair the data: attach a diff to the revision or remove the empty revision row.
  3. Restore from backups if the diffs were lost accidentally.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  // render or operate on the revision
} catch (Exception $ex) {
  if (preg_match('/has no diffs/', $ex->getMessage())) {
    // data integrity violation: quarantine the revision and alert the admin
  } else {
    throw $ex;
  }
}

Prevention

When it happens

Trigger: Opening a revision whose diffs were all deleted or never created: revisions inserted directly into the database, partial creation failures, or cleanup scripts that removed diffs without the revision.

Common situations: Rows created by migration or seeding scripts that bypass the API; broken imports; database-level deletion of diffs that left empty revisions behind.

Related errors


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

Appendix: source

Thrown at src/applications/differential/controller/DifferentialRevisionViewController.php:67

    $revision = id(new DifferentialRevisionQuery())
      ->withIDs(array($this->revisionID))
      ->setViewer($viewer)
      ->needReviewers(true)
      ->needReviewerAuthority(true)
      ->needCommitPHIDs(true)
      ->executeOne();
    if (!$revision) {
      return new Aphront404Response();
    }

    $diffs = id(new DifferentialDiffQuery())
      ->setViewer($viewer)
      ->withRevisionIDs(array($this->revisionID))
      ->execute();
    $diffs = array_reverse($diffs, $preserve_keys = true);

    if (!$diffs) {
      throw new Exception(
        pht('This revision has no diffs. Something has gone quite wrong.'));
    }

    $revision->attachActiveDiff(last($diffs));

    $diff_vs = $this->getOldDiffID($revision, $diffs);
    if ($diff_vs instanceof AphrontResponse) {
      return $diff_vs;
    }

    $target_id = $this->getNewDiffID($revision, $diffs);
    if ($target_id instanceof AphrontResponse) {
      return $target_id;
    }

    $target = $diffs[$target_id];

    $target_manual = $target;

View on GitHub (pinned to 5720a38cfe)