{"record":{"id":"b576b2a886730ea6","repo":"jdx/mise","slug":"conflicting-pypi-name-and-pipx-name-settings","errorCode":null,"errorMessage":"conflicting pypi.{name} and pipx.{name} settings","messagePattern":"conflicting pypi\\.(.+?) and pipx\\.(.+?) settings","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/config/settings.rs","lineNumber":1251,"sourceCode":"        warn_deprecated_env_settings();\n        for msg in pending_files {\n            warn_once!(\"{msg}\");\n        }\n        for key in pending {\n            warn_deprecated_now(key);\n        }\n    }\n\n    fn normalize_pypi_aliases(&mut self) -> Result<()> {\n        fn merge<T: PartialEq>(\n            preferred: &mut Option<T>,\n            legacy: &mut Option<T>,\n            name: &str,\n        ) -> Result<()> {\n            if let (Some(a), Some(b)) = (preferred.as_ref(), legacy.as_ref())\n                && a != b\n            {\n                eyre::bail!(\"conflicting pypi.{name} and pipx.{name} settings\");\n            }\n            if preferred.is_none() {\n                *preferred = legacy.take();\n            } else {\n                legacy.take();\n            }\n            Ok(())\n        }\n        merge(\n            &mut self.pypi.registry_url,\n            &mut self.pipx.registry_url,\n            \"registry_url\",\n        )?;\n        merge(&mut self.pypi.uvx, &mut self.pipx.uvx, \"uvx\")?;\n        self.pypi\n            .registry_url\n            .get_or_insert_with(|| \"https://pypi.org/pypi/{}/json\".to_owned());\n        Ok(())","sourceCodeStart":1233,"sourceCodeEnd":1269,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/config/settings.rs#L1233-L1269","documentation":"After layers are merged, mise collapses each legacy `pipx.{name}` setting into its preferred `pypi.{name}` counterpart. If both are set to different values it cannot pick one and bails with this message. If only one is set, that value is used and the legacy field is cleared.","triggerScenarios":"Both `pypi.<name>` and `pipx.<name>` (e.g. uvx or registry_url) are defined anywhere in the settings hierarchy with non-equal values when the merge/dedup helper runs.","commonSituations":"Global config sets the old `pipx.*` key while a project config sets the new `pypi.*` key to a different value; stale settings left after a mise upgrade that renamed pipx settings to pypi.","solutions":["Set the same value for both `pypi.{name}` and `pipx.{name}`, or","Delete the legacy `pipx.{name}` key and keep only `pypi.{name}`.","Check global (~/.config/mise/config.toml), project, and MISE_* environment overrides — the conflict may span files."],"exampleFix":"# before\n[settings]\npipx.uvx = \"uvx\"\npypi.uvx = \"/usr/local/bin/uvx\"\n\n# after\n[settings]\npypi.uvx = \"/usr/local/bin/uvx\"","handlingStrategy":"validation","validationCode":"# shell: find files that set both keys\ngrep -rl 'pipx\\.' ~/.config/mise $(mise cfg ls 2>/dev/null || true) 2>/dev/null | xargs -r grep -l 'pypi\\.'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat `pypi.*` as the canonical key and never set `pipx.*` in new configs.","Audit global and project configs after mise upgrades that renamed settings.","Set MISE_* env overrides in only one place to avoid layer conflicts."],"tags":["config","settings","conflict","migration"],"backgroundTag":"conflicting-config-options","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}