mirror of
https://github.com/astral-sh/uv.git
synced 2025-11-16 02:27:29 +00:00
Support relative file: paths for --find-links (#1147)
Just for consistency.
This commit is contained in:
parent
4e19e6846d
commit
15ca17a68d
2 changed files with 51 additions and 19 deletions
|
|
@ -7,6 +7,8 @@ use once_cell::sync::Lazy;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
|
use pep508_rs::split_scheme;
|
||||||
|
|
||||||
static PYPI_URL: Lazy<Url> = Lazy::new(|| Url::parse("https://pypi.org/simple").unwrap());
|
static PYPI_URL: Lazy<Url> = Lazy::new(|| Url::parse("https://pypi.org/simple").unwrap());
|
||||||
|
|
||||||
/// The url of an index, newtype'd to avoid mixing it with file urls.
|
/// The url of an index, newtype'd to avoid mixing it with file urls.
|
||||||
|
|
@ -73,34 +75,35 @@ pub enum FlatIndexLocation {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FromStr for FlatIndexLocation {
|
impl FromStr for FlatIndexLocation {
|
||||||
type Err = FlatIndexError;
|
type Err = url::ParseError;
|
||||||
|
|
||||||
fn from_str(location: &str) -> Result<Self, Self::Err> {
|
/// Parse a raw string for a `--find-links` entry, which could be a URL or a local path.
|
||||||
if location.contains("://") {
|
///
|
||||||
let url =
|
/// For example:
|
||||||
Url::parse(location).map_err(|err| FlatIndexError::Url(location.into(), err))?;
|
/// - `file:///home/ferris/project/scripts/...`
|
||||||
if url.scheme() == "file" {
|
/// - `file:../ferris/`
|
||||||
match url.to_file_path() {
|
/// - `../ferris/`
|
||||||
Ok(path_buf) => Ok(Self::Path(path_buf)),
|
/// - `https://download.pytorch.org/whl/torch_stable.html`
|
||||||
Err(()) => Err(FlatIndexError::FilePath(url)),
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
}
|
if let Some((scheme, path)) = split_scheme(s) {
|
||||||
|
if scheme == "file" {
|
||||||
|
// Ex) `file:///home/ferris/project/scripts/...` or `file:../ferris/`
|
||||||
|
let path = path.strip_prefix("//").unwrap_or(path);
|
||||||
|
let path = PathBuf::from(path);
|
||||||
|
Ok(Self::Path(path))
|
||||||
} else {
|
} else {
|
||||||
|
// Ex) `https://download.pytorch.org/whl/torch_stable.html`
|
||||||
|
let url = Url::parse(s)?;
|
||||||
Ok(Self::Url(url))
|
Ok(Self::Url(url))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Ok(Self::Path(PathBuf::from(location)))
|
// Ex) `../ferris/`
|
||||||
|
let path = PathBuf::from(s);
|
||||||
|
Ok(Self::Path(path))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
|
||||||
pub enum FlatIndexError {
|
|
||||||
#[error("Invalid file location URL: {0}")]
|
|
||||||
Url(String, #[source] url::ParseError),
|
|
||||||
#[error("Invalid `file://` path in URL: {0}")]
|
|
||||||
FilePath(Url),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Display for FlatIndexLocation {
|
impl Display for FlatIndexLocation {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
|
|
@ -230,3 +233,31 @@ impl From<IndexLocations> for IndexUrls {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_find_links() {
|
||||||
|
assert_eq!(
|
||||||
|
FlatIndexLocation::from_str("file:///home/ferris/project/scripts/...").unwrap(),
|
||||||
|
FlatIndexLocation::Path(PathBuf::from("/home/ferris/project/scripts/..."))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
FlatIndexLocation::from_str("file:../ferris/").unwrap(),
|
||||||
|
FlatIndexLocation::Path(PathBuf::from("../ferris/"))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
FlatIndexLocation::from_str("../ferris/").unwrap(),
|
||||||
|
FlatIndexLocation::Path(PathBuf::from("../ferris/"))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
FlatIndexLocation::from_str("https://download.pytorch.org/whl/torch_stable.html")
|
||||||
|
.unwrap(),
|
||||||
|
FlatIndexLocation::Url(
|
||||||
|
Url::parse("https://download.pytorch.org/whl/torch_stable.html").unwrap()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -714,6 +714,7 @@ fn parse_extras(cursor: &mut Cursor) -> Result<Vec<ExtraName>, Pep508Error> {
|
||||||
/// - `file:///home/ferris/project/scripts/...`
|
/// - `file:///home/ferris/project/scripts/...`
|
||||||
/// - `file:../editable/`
|
/// - `file:../editable/`
|
||||||
/// - `../editable/`
|
/// - `../editable/`
|
||||||
|
/// - `https://download.pytorch.org/whl/torch_stable.html`
|
||||||
fn parse_url(cursor: &mut Cursor, working_dir: Option<&Path>) -> Result<VerbatimUrl, Pep508Error> {
|
fn parse_url(cursor: &mut Cursor, working_dir: Option<&Path>) -> Result<VerbatimUrl, Pep508Error> {
|
||||||
// wsp*
|
// wsp*
|
||||||
cursor.eat_whitespace();
|
cursor.eat_whitespace();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue