Skip to content

Commit

Permalink
Fix non-directory in workspace on Windows (#11833)
Browse files Browse the repository at this point in the history
Fixes #11793

On Windows, trying to read a file inside what is not a directory but
another file results in a not found error, while on Unix we get a not a
directory error. We check explicitly if something included in a
workspace glob is a non-directory to fix the behavior on Windows.
  • Loading branch information
konstin authored Feb 28, 2025
1 parent 2e7ae19 commit dc39d66
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 21 deletions.
46 changes: 25 additions & 21 deletions crates/uv-workspace/src/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -762,34 +762,38 @@ impl Workspace {
let pyproject_path = member_root.join("pyproject.toml");
let contents = match fs_err::tokio::read_to_string(&pyproject_path).await {
Ok(contents) => contents,
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
// If the directory is hidden, skip it.
if member_root
.file_name()
.map(|name| name.as_encoded_bytes().starts_with(b"."))
.unwrap_or(false)
{
debug!(
"Ignoring hidden workspace member: `{}`",
Err(err) => {
if !fs_err::metadata(&member_root)?.is_dir() {
warn!(
"Ignoring non-directory workspace member: `{}`",
member_root.simplified_display()
);
continue;
}

return Err(WorkspaceError::MissingPyprojectTomlMember(
member_root,
member_glob.to_string(),
));
}
Err(err) if err.kind() == std::io::ErrorKind::NotADirectory => {
warn!(
"Ignoring non-directory workspace member: `{}`",
member_root.simplified_display()
);
// A directory exists, but it doesn't contain a `pyproject.toml`.
if err.kind() == std::io::ErrorKind::NotFound {
// If the directory is hidden, skip it.
if member_root
.file_name()
.map(|name| name.as_encoded_bytes().starts_with(b"."))
.unwrap_or(false)
{
debug!(
"Ignoring hidden workspace member: `{}`",
member_root.simplified_display()
);
continue;
}

return Err(WorkspaceError::MissingPyprojectTomlMember(
member_root,
member_glob.to_string(),
));
}

continue;
return Err(err.into());
}
Err(err) => return Err(err.into()),
};
let pyproject_toml = PyProjectToml::from_string(contents)
.map_err(|err| WorkspaceError::Toml(pyproject_path.clone(), Box::new(err)))?;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
This file is included in `packages/*`, but it is not a directory (it can't contain a package), so we
have to ignore it.

0 comments on commit dc39d66

Please sign in to comment.