NewWe open-sourced 50+ Laravel packages
Custom AI apps, agents and automation — Roundly ConsultingRoundly
All packages
Git for Laravel

Errors & exceptions

The package’s own exceptions live in RoundlyConsulting\Git\Exceptions; everything else is Laravel’s own:

ExceptionThrown when
InvalidCredentialsExceptionA 401 (no credential, or the forge rejected it) — also while minting an installation token or refreshing an OAuth token; an OAuth refresh answered 400 invalid_grant (refreshTokenRejected() — reconnect required); an unsupported or wrong credential type; a missing app/OAuth config key; a non-numeric app, installation or repository id; an empty installation scope; an installation that can’t mint (404/422); a missing app permission on repository creation.
FeatureNotSupportedExceptionYou call something the provider doesn’t support — check supports() first. Also a Bitbucket commit query filtered by author(), since() or until(), and activity() or any actions() call on GitLab and Bitbucket.
RateLimitExceededExceptionThe client-side limiter would have to wait longer than max_wait; carries retryAfterSeconds() via HasRetryAfter.
BatchRequestExceptionthrowOnError() on a BatchResult with failed keys; ->errors holds each BatchError.
OutOfScopeExceptionAn argument could leave its scope — a path with ., .. or empty segments, \ or a NUL byte (also once percent-decoded), a ? or # in a repository path or a ? in a ref, a pull request number below 1, a webhook id not in the forge’s shape, a workflow that isn’t a numeric id or one .yml / .yaml file name, a workflow run id that isn’t digits, a repository from another provider — and nothing is sent. Thrown by handles, flat driver methods and batch() alike. Also GitHub’s contents() on a directory path (notAFile(), naming the path). Extends InvalidArgumentException.
Illuminate\Http\Client\RequestExceptionEvery other refusal — 403, 404, 405, 409, 422, 429, 5xx — with the status on $e->response.
InvalidArgumentExceptionAn input DTO fails validation, a page size is below 1, a batch()->pullRequest() reference isn’t path#number, a webhook URL can’t be derived, webhooks()->register() would point the package route at a hook it can’t verify or finds a hook at the URL with other events, a GitLab comment has no target, GitLab gets a webhook event it has no flag for, a GitLab owner isn’t a numeric namespace id, a workflow dispatch input isn’t a named string, number or boolean, a run query is filtered by an Unknown status or conclusion, a job query asks for allAttempts() and attempt() together or for an attempt below 1, or a workflow run or job payload carries no usable id.
UnexpectedValueExceptionbranch() got an answer that isn’t exactly that branch’s head — on GitHub anything but refs/heads/<name> pointing at a commit with a 40-character sha; on GitLab and Bitbucket an answer with no commit.
RoundlyConsulting\PackageToolkit\Exceptions\InvalidConfigurationExceptionA config value is present but unusable — an integer outside its range, a boolean outside 1/true/on/yes and 0/false/off/no, an unknown timespan, a non-string string setting, a non-string app id. The message names the key; only a key that is not set — absent, null or blank — takes its default.

HTTP statuses

  • 401 — InvalidCredentialsException: “requires authentication” with no credential, “rejected the credential” when the forge refused it. The forge’s RequestException is getPrevious().
  • 403, 404, 405, 409, 422, 429, 5xx — RequestException with the status on $e->response. A private repository is a 404 to a caller without access; a throttled 403 or 429 stays retryable.
  • GitHub App mints and OAuth refreshes — a 401 (a revoked or wrong app key, a refused refresh) becomes InvalidCredentialsException, as does a 404 or 422 while minting an installation token, and an OAuth refresh answered 400 invalid_grant becomes refreshTokenRejected() (any other 400 stays a RequestException); a 403 stays a RequestException so a throttled minute never marks a working connection as broken.

Show your open-source love

This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.

More ways to support, including crypto

By donating, you agree to our donation terms.

Want this built into your product?

We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.