gitbutlerapp/gitbutler · error · anyhow::Error
GitHub GraphQL pull request #{pr_number} not found for {owne
Error message
GitHub GraphQL pull request #{pr_number} not found for {owner}/{repo} What it means
The repository resolved, but pullRequest(number: N) inside it returned null: that repo has no pull request with the given number as far as the authenticated account can see.
Source
Thrown at crates/but-github/src/client.rs:1231
}
let data: QueryData = self
.graphql_query(
GQL_GET_PR_NODE_ID,
&Variables {
owner,
repo,
number: pr_number,
},
)
.await?;
let Some(repository) = data.repository else {
bail!("GitHub GraphQL repository not found for {owner}/{repo}");
};
let Some(pull_request) = repository.pull_request else {
bail!("GitHub GraphQL pull request #{pr_number} not found for {owner}/{repo}",);
};
if pull_request.id.is_empty() {
bail!(
"GitHub GraphQL pull request #{pr_number} in {owner}/{repo} returned an empty node id",
);
}
Ok(PullRequestNodeId::from_string(pull_request.id))
}
async fn graphql_query<T, V>(&self, query: &str, variables: &V) -> Result<T>
where
T: for<'de> Deserialize<'de>,
V: Serialize,
{
#[derive(Serialize)]
struct GraphQlRequest<'a, V> {View on GitHub (pinned to caf1f223d3)
Solutions
- Verify by opening https://github.com/{owner}/{repo}/pull/{number} in a browser
- If the repo was renamed or transferred, update the owner/repo configuration
- List the repo's open pull requests to find the correct number
Defensive patterns
Strategy: validation
Validate before calling
let prs = client.list_pull_requests(owner, repo, &Default::default()).await?;
let exists = prs.iter().any(|pr| pr.number == number);
if !exists { anyhow::bail!("PR #{number} does not exist in {owner}/{repo}"); } Try / catch
match client.get_pull_request_node_id(owner, repo, n).await {
Err(e) if e.to_string().contains("pull request #") && e.to_string().contains("not found") => {
refresh_pr_number_from_api()
}
other => other?,
} Prevention
- Get PR numbers from API responses, never from cached config
- Re-verify numbers after repo renames or transfers
- Remember GitHub shares one number space for issues and PRs
When it happens
Trigger: Passing a PR number from a different repository (stale remote or copied URL); a number that simply does not exist; repo ownership transferred so the numbering context changed; PRs on private forks the token cannot read.
Common situations: Hard-coded or cached PR numbers reused across repos; confusion between issue numbers and PR numbers; automation configs copied between projects.
Related errors
- GitHub GraphQL enablePullRequestAutoMerge returned an empty
- GitHub GraphQL disablePullRequestAutoMerge returned an empty
- GitHub GraphQL repository not found for {owner}/{repo}
- GitHub GraphQL pull request #{pr_number} in {owner}/{repo} r
- Could not restore all review targets after the push failed:
AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20).
Data as JSON: /api/errors/90b878f7062708ea.
Report an issue: GitHub.