neosourceDocs
Search docs

Diff two branches the way a pull request would

GET/api/repos/{owner}/{repo}/compare

compareBranches

Returns the diff a pull request from `head` into `base` would contain: computed from the two branches' merge base rather than between their tips. Use this to preview a pull request before opening it. For a raw tree-to-tree diff between commit OIDs, use `/diff` instead. An unknown branch on either side, or a head already contained in the base, returns the empty diff rather than an error.

Authentication is not described for this operation in the spec — that does not mean it is public. Check tokens and scopes.

curl

curl -X GET 'https://neosource.dev/api/repos/OWNER/REPO/compare?base=BASE&head=HEAD'

fetch

fetch("https://neosource.dev/api/repos/OWNER/REPO/compare?base=BASE&head=HEAD", {
  method: "GET",
});

Path parameters

ownerrequired

Repository owner or organization slug.

string

reporequired

Repository name.

string

Query parameters

baserequired

Branch the change would merge INTO (the "before" side).

string

headrequired

Branch carrying the change (the "after" side).

string

Responses

200Diff result

application/json

DiffResponse

object

base_commitrequired

string

filesrequired

array

items

DiffFileResponse

object

additions

integer | null

Added lines in this file, or `null` when the file was never line-counted: it is binary, or one side exceeds the per-file byte ceiling. `null` and `0` mean different things and must not be conflated — `0` is "changed, but no lines changed" (an empty file added or deleted, a mode-only change), which is a fact about the file, while `null` is a fact about the diff. Uncounted files contribute nothing to `DiffStatsResponse`, so the per-file counts sum to the aggregate over exactly the counted ones.

deletions

integer | null

Removed lines in this file. See [`DiffFileResponse::additions`].

is_binaryrequired

boolean

new_oid

string | null

old_oid

string | null

patch

string | null

Unified diff text for this file. Omitted for binary files.

pathrequired

string

statusrequired
DiffFileStatus
head_commitrequired

string

statsrequired

DiffStatsResponse

object

additionsrequired

integer

deletionsrequired

integer

files_changedrequired

integer

truncatedrequired

boolean

`true` when the file list was capped by a response-size guard (total patch bytes or file count). `stats` still reflects the full diff; `files` carries only the retained prefix. Mirrors `BlobResponse.truncated` — honest truncation over a silent partial diff.

Standard errors

Bodies documented once for the whole API — see standard errors.

  • 400Bad Request — one of: invalid_input
  • 403Forbidden — one of: forbidden
  • 404Not Found — one of: not_found
  • 423Locked — one of: busy
  • 429Rate limited — retry after the interval in the `Retry-After` header
  • 500Internal server error
  • 503Service temporarily unavailable / at capacity — retry after the `Retry-After` header
  • 504Gateway timeout — the request exceeded the server's handling budget

Schemas

Referenced above. Listed here rather than expanded inline, so the same definition is not repeated at every level.

DiffFileStatus

string

"added""modified""deleted"