diff --git a/crates/pep508-rs/src/verbatim_url.rs b/crates/pep508-rs/src/verbatim_url.rs index 6547ddee028d..876f6b0cdbcc 100644 --- a/crates/pep508-rs/src/verbatim_url.rs +++ b/crates/pep508-rs/src/verbatim_url.rs @@ -155,6 +155,13 @@ impl VerbatimUrl { pub fn to_url(&self) -> Url { self.url.clone() } + + /// Return the underlying [`Path`], if the URL is a file URL. + pub fn as_path(&self) -> Result { + self.url + .to_file_path() + .map_err(|_| VerbatimUrlError::UrlConversion(self.url.to_file_path().unwrap())) + } } // This impl is written out because the `derive` doesn't seem to get it right. diff --git a/crates/pypi-types/src/parsed_url.rs b/crates/pypi-types/src/parsed_url.rs index dcec32bfb58f..f24b2316eaff 100644 --- a/crates/pypi-types/src/parsed_url.rs +++ b/crates/pypi-types/src/parsed_url.rs @@ -59,8 +59,8 @@ impl UnnamedRequirementUrl for VerbatimParsedUrl { ) -> Result { let verbatim = VerbatimUrl::parse_path(&path, &working_dir)?; let parsed_path_url = ParsedPathUrl { + path: verbatim.as_path()?, url: verbatim.to_url(), - path: working_dir.as_ref().join(path), editable: false, }; Ok(Self { @@ -72,8 +72,8 @@ impl UnnamedRequirementUrl for VerbatimParsedUrl { fn parse_absolute_path(path: impl AsRef) -> Result { let verbatim = VerbatimUrl::parse_absolute_path(&path)?; let parsed_path_url = ParsedPathUrl { + path: verbatim.as_path()?, url: verbatim.to_url(), - path: path.as_ref().to_path_buf(), editable: false, }; Ok(Self { diff --git a/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-unix-bare-url.txt.snap b/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-unix-bare-url.txt.snap index d81533195800..9cb5dd264621 100644 --- a/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-unix-bare-url.txt.snap +++ b/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-unix-bare-url.txt.snap @@ -21,7 +21,7 @@ RequirementsTxt { query: None, fragment: None, }, - path: "/./scripts/packages/black_editable", + path: "/scripts/packages/black_editable", editable: false, }, ), @@ -70,7 +70,7 @@ RequirementsTxt { query: None, fragment: None, }, - path: "/./scripts/packages/black_editable", + path: "/scripts/packages/black_editable", editable: false, }, ), diff --git a/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-windows-bare-url.txt.snap b/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-windows-bare-url.txt.snap index 7c18a8c5f1e1..9050369c1794 100644 --- a/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-windows-bare-url.txt.snap +++ b/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-windows-bare-url.txt.snap @@ -21,7 +21,7 @@ RequirementsTxt { query: None, fragment: None, }, - path: "/./scripts/packages/black_editable", + path: "/scripts/packages/black_editable", editable: false, }, ), @@ -70,7 +70,7 @@ RequirementsTxt { query: None, fragment: None, }, - path: "/./scripts/packages/black_editable", + path: "/scripts/packages/black_editable", editable: false, }, ), diff --git a/crates/uv/tests/pip_compile.rs b/crates/uv/tests/pip_compile.rs index 1d2a455dab9a..4b1c144c99b4 100644 --- a/crates/uv/tests/pip_compile.rs +++ b/crates/uv/tests/pip_compile.rs @@ -3442,6 +3442,60 @@ fn deduplicate_editable() -> Result<()> { Ok(()) } +#[test] +fn strip_fragment_unnamed() -> Result<()> { + let context = TestContext::new("3.12"); + let requirements_in = context.temp_dir.child("requirements.in"); + requirements_in.write_str(indoc! {r" + ../../scripts/packages/black_editable#egg=black + " + })?; + + uv_snapshot!(context.filters(), context.compile() + .arg(requirements_in.path()) + .current_dir(current_dir()?), @r###" + success: true + exit_code: 0 + ----- stdout ----- + # This file was autogenerated by uv via the following command: + # uv pip compile --cache-dir [CACHE_DIR] --exclude-newer 2024-03-25T00:00:00Z [TEMP_DIR]/requirements.in + ../../scripts/packages/black_editable#egg=black + # via -r [TEMP_DIR]/requirements.in + + ----- stderr ----- + Resolved 1 package in [TIME] + "###); + + Ok(()) +} + +#[test] +fn strip_fragment_named() -> Result<()> { + let context = TestContext::new("3.12"); + let requirements_in = context.temp_dir.child("requirements.in"); + requirements_in.write_str(indoc! {r" + black @ ../../scripts/packages/black_editable#egg=black + " + })?; + + uv_snapshot!(context.filters(), context.compile() + .arg(requirements_in.path()) + .current_dir(current_dir()?), @r###" + success: true + exit_code: 0 + ----- stdout ----- + # This file was autogenerated by uv via the following command: + # uv pip compile --cache-dir [CACHE_DIR] --exclude-newer 2024-03-25T00:00:00Z [TEMP_DIR]/requirements.in + ../../scripts/packages/black_editable#egg=black + # via -r [TEMP_DIR]/requirements.in + + ----- stderr ----- + Resolved 1 package in [TIME] + "###); + + Ok(()) +} + #[test] fn recursive_extras_direct_url() -> Result<()> { let context = TestContext::new("3.12");