{"record":{"id":"e109eb48a7d45ab9","repo":"GitoxideLabs/gitoxide","slug":"we-prohibit-this","errorCode":null,"errorMessage":"we prohibit this","messagePattern":"we prohibit this","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gix-merge/src/blob/pipeline.rs","lineNumber":308,"sourceCode":"                                )?;\n\n                                match res {\n                                    ToWorktreeOutcome::Unchanged(_) => {}\n                                    ToWorktreeOutcome::Buffer(src) => {\n                                        out.clear();\n                                        out.try_reserve(src.len())?;\n                                        out.extend_from_slice(src);\n                                    }\n                                    ToWorktreeOutcome::Process(MaybeDelayed::Immediate(mut stream)) => {\n                                        std::io::copy(&mut stream, out).map_err(|err| {\n                                            convert_to_mergeable::Error::StreamCopy {\n                                                rela_path: rela_path.to_owned(),\n                                                source: err,\n                                            }\n                                        })?;\n                                    }\n                                    ToWorktreeOutcome::Process(MaybeDelayed::Delayed(_)) => {\n                                        unreachable!(\"we prohibit this\")\n                                    }\n                                }\n                            }\n\n                            let res = self.filter.convert_to_git(\n                                &**out,\n                                &gix_path::from_bstr(rela_path),\n                                attributes,\n                                &mut |_buf| Ok(None),\n                            )?;\n\n                            match res {\n                                ToGitOutcome::Unchanged(_) => {}\n                                ToGitOutcome::Process(mut stream) => {\n                                    stream\n                                        .read_to_end(out)\n                                        .map_err(|err| convert_to_mergeable::Error::OpenOrRead {\n                                            rela_path: rela_path.to_owned(),","sourceCodeStart":290,"sourceCodeEnd":326,"githubUrl":"https://github.com/GitoxideLabs/gitoxide/blob/e73179060badf27222d790981fac3f84c1830a7e/gix-merge/src/blob/pipeline.rs#L290-L326","documentation":"`gix_merge::blob::Pipeline::convert_to_mergeable()` applies worktree filters (e.g. CRLF conversion, clean filters) to make a blob mergeable. The library panics if the filter machinery returns `ToWorktreeOutcome::Process(MaybeDelayed::Delayed(_))`, i.e. a deferred/delayed processing result, because the pipeline's configuration prohibits delayed processing in this path. Hitting it means the delayed-pipeline prohibition was violated.","triggerScenarios":"Calling `convert_to_mergeable` (directly or via `without_transformation`/`binary_below_large_file_threshold`/`non_existing`) while the underlying `gix_filter` pipeline was built with a delayed process (e.g. a long-running filter process supporting delayed responses), so `convert_to_worktree` yields a `Delayed` outcome.","commonSituations":"Configuring the filter pipeline with driver processes that advertise delayed operation (multiple-driver setups with `gix_filter::driver::Process` supporting delays) and then running blob merges; usually arises after enabling process-based filters in `.gitattributes`/driver configuration.","solutions":["Build the `gix_filter` pipeline (or `gix::filter::Pipeline`) without delayed process support so filters return immediate results during merge.","Remove or reconfigure `filter.<driver>.process` entries in git config that enable delayed processing for the involved drivers.","Use a merge path where worktree filters are disabled, or convert blobs explicitly with a non-delayed pipeline before merging.","If it occurs with default configuration, report upstream with the `.gitattributes` and filter config used."],"exampleFix":"// before\nlet pipeline = gix::filter::Pipeline::new(repo)?; // may use delayed process drivers\nlet blob = pipeline.convert_to_mergeable(blob, rela_path)?;\n\n// after\nlet pipeline = gix::filter::Pipeline::new(repo)?\n    .with_driver_process_handling(gix::filter::driver::process::Handling::Error); // disable delayed handling\nlet blob = pipeline.convert_to_mergeable(blob, rela_path)?;","handlingStrategy":"validation","validationCode":"// Ensure the filter pipeline is not configured for delayed processing before merging\nif pipeline.supports_delayed_process() {\n    return Err(anyhow::anyhow!(\"merge path prohibits delayed filter processes; disable process filters for this driver\"));\n}","typeGuard":"fn is_immediate(outcome: &ToWorktreeOutcome) -> bool {\n    matches!(outcome, ToWorktreeOutcome::Process(MaybeDelayed::Immediate(_)) | ToWorktreeOutcome::Buffer(_))\n}","tryCatchPattern":"// Guard the filter result before the pipeline asserts:\nmatch filter_outcome {\n    ToWorktreeOutcome::Process(MaybeDelayed::Delayed(_)) => {\n        return Err(anyhow::anyhow!(\"delayed filter processing not allowed during merge\"));\n    }\n    other => { /* proceed */ }\n}","preventionTips":["Do not enable `filter.<name>.process` (delayed) drivers when blobs will be run through the merge pipeline.","Configure `gix::filter::Pipeline` to error on delayed handling rather than returning delayed results.","Test merges in repos that use CRLF/eol and custom clean/smudge filters."],"tags":["panic","git","merge","filter","configuration"],"backgroundTag":"unsupported-operation","analyzedSha":"e73179060badf27222d790981fac3f84c1830a7e","analyzedAt":"2026-09-08T11:26:50.865Z","contentChangedAt":"2026-09-08T11:26:50.865Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}