phacility/phabricator · error · Exception

This repository is currently in read-only maintenance mode.

Error message

This repository is currently in read-only maintenance mode.

What it means

Thrown by DiffusionSSHWorkflow::requireWriteAccess() when an SSH user requests write access to a repository whose 'read-only' detail flag is set. The flag is written by PhabricatorRepositoryMaintenanceTransaction, i.e. an administrator enabled Maintenance Mode on the repository; getReadOnlyMessageForDisplay() prepends this fixed text to any admin-supplied maintenance message. No VCS write over SSH is served while the flag is on.

Source

Thrown at src/applications/diffusion/ssh/DiffusionSSHWorkflow.php:273

  protected function requireWriteAccess($protocol_command = null) {
    if ($this->hasWriteAccess === true) {
      return;
    }

    $repository = $this->getRepository();
    $viewer = $this->getSSHUser();

    if ($viewer->isOmnipotent()) {
      throw new Exception(
        pht(
          'This request is authenticated as a cluster device, but is '.
          'performing a write. Writes must be performed with a real '.
          'user account.'));
    }

    if ($repository->isReadOnly()) {
      throw new Exception($repository->getReadOnlyMessageForDisplay());
    }

    $protocol = PhabricatorRepositoryURI::BUILTIN_PROTOCOL_SSH;
    if ($repository->canServeProtocol($protocol, true)) {
      $can_push = PhabricatorPolicyFilter::hasCapability(
        $viewer,
        $repository,
        DiffusionPushCapability::CAPABILITY);
      if (!$can_push) {
        throw new Exception(
          pht('You do not have permission to push to this repository.'));
      }
    } else {
      if ($protocol_command !== null) {
        throw new Exception(
          pht(
            'This repository is read-only over SSH (tried to execute '.
            'protocol command "%s").',

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Open the repository in Diffusion, edit Maintenance, disable Maintenance Mode, then retry the push
  2. If maintenance is intentional, wait for the window to close and watch the repository timeline for the read-only flag clearing
  3. Confirm you are pushing the intended repository (callsign/URI) - the flag is per-repository, so sibling repositories still accept writes
Defensive patterns

Strategy: validation

Validate before calling

if ($repository->isReadOnly()) {
  // Surface the maintenance message instead of starting a push session.
  return $repository->getReadOnlyMessageForDisplay();
}

Prevention

When it happens

Trigger: Any SSH push path (git push over ssh://, hg push, or an svn+ssh session that begins writing) against a repository where the 'read-only' detail is true: an admin turned on Maintenance Mode from the repository edit page, or a maintenance script set it programmatically via setReadOnly(true).

Common situations: Admin enabled maintenance before an upgrade or storage migration and forgot to turn it off; maintenance window still open while users retry pushes; flag left set after a manual recovery operation on the repository.

Related errors


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