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

  1. Verify by opening https://github.com/{owner}/{repo}/pull/{number} in a browser
  2. If the repo was renamed or transferred, update the owner/repo configuration
  3. 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

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


AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20). Data as JSON: /api/errors/90b878f7062708ea. Report an issue: GitHub.