GitoxideLabs/gitoxide · error

configured

Error message

configured

What it means

Panic from `child.stdout.take().expect("configured")` (and the sibling `.expect("stdout configured")` branch) in the blocking file transport's `handshake`. Like the stderr case, it asserts that piped stdout was configured on the spawned child process; a `None` means the spawn setup is broken. This is unreachable in correct code and indicates an internal invariant violation.

Solutions

  1. Configure `.stdout(Stdio::piped())` before spawning the child process.
  2. Upgrade gix-transport if stock code panics here.
  3. Audit any local patches to the transport spawn logic for dropped pipe configuration.

Example fix

// before
let mut cmd = Command::new(prog);
let child = cmd.spawn()?;
// after
let child = cmd.stdout(Stdio::piped()).stderr(Stdio::piped()).stdin(Stdio::piped()).spawn()?;
Defensive patterns

Strategy: try-catch

Try / catch

std::panic::catch_unwind(AssertUnwindSafe(|| handshake(...)))
    .map_err(|_| anyhow::anyhow!("handshake panicked: child stdout not piped"))?

Prevention

When it happens

Trigger: Any handshake (SSH or plain spawned `git upload-pack`) where the child was spawned without `Stdio::piped()` on stdout.

Common situations: Forked builds or refactoring regressions in gix-transport's spawn code; local patches to process creation.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of GitoxideLabs/gitoxide@e73179060b (2026-09-08). Data as JSON: /api/errors/777add654a1f32f1. Report an issue: GitHub.

Appendix: source

Thrown at gix-transport/src/client/blocking_io/file.rs:312

                let mut cmd = into_std_command(cmd);
                gix_features::trace::debug!(command = ?cmd, "gix_transport::SpawnProcessOnDemand (fallback)");
                cmd.spawn().map_err(|err| client::Error::InvokeProgram {
                    source: err,
                    command: cmd_name,
                })?
            }
            Err(err) => {
                return Err(client::Error::InvokeProgram {
                    source: err,
                    command: cmd_name,
                });
            }
        };
        let stdout: Box<dyn std::io::Read + Send> = match ssh_kind {
            Some(ssh_kind) => Box::new(supervise_stderr(
                ssh_kind,
                child.stderr.take().expect("configured beforehand"),
                child.stdout.take().expect("configured"),
            )),
            None => Box::new(child.stdout.take().expect("stdout configured")),
        };
        self.connection = Some(Connection::new_for_spawned_process(
            stdout,
            child.stdin.take().expect("stdin configured"),
            self.desired_version,
            self.path.clone(),
            self.trace,
        ));
        self.child = Some(child);
        self.connection
            .as_mut()
            .expect("connection to be there right after setting it")
            .handshake(service, extra_parameters)
    }

    fn request(

View on GitHub (pinned to e73179060b)