From f5d8dfdad082a07f5dc5608eb5d3315c1444ee28 Mon Sep 17 00:00:00 2001 From: James Hilliard Date: Thu, 25 Jul 2024 10:58:38 -0600 Subject: [PATCH] Don't check .gitignore files outside of projet directory When building inside a .gitignore'd output directory as part of another build system maturin may accidentially pick up the parent .gitignore. Lets just disable searching for parent .gitignore files since this functionality is broken anyways as the logic does not match git's .gitignore logic anyways. For example in buildroot we have an output directory that has its contents gitignored in which maturin will build packages, changing some minor implementation details in how we ignore this directory triggered this bug. https://github.com/buildroot/buildroot/commit/a14c862c08865e053d5fce90a0d0323b8f9e4bc0 As the output dir files are supposed to be ignored both before and after this change this indicates that ignore::WalkBuilder parent matching is fundamentally broken and can not be used reliably in the first place as it does not match git's ignore logic. Also disable git exclude and git global excludes which may cause problems. Signed-off-by: James Hilliard --- src/build_options.rs | 1 + src/lib.rs | 8 ++++---- src/module_writer.rs | 12 +++++++++++- src/project_layout.rs | 4 ++++ src/source_distribution.rs | 1 + test-crates/pyo3-mixed-implicit/.gitignore | 1 + test-crates/pyo3-mixed-include-exclude/.gitignore | 1 + test-crates/pyo3-mixed-py-subdir/.gitignore | 1 + test-crates/pyo3-mixed-src/.gitignore | 1 + test-crates/pyo3-mixed/.gitignore | 1 + tests/run.rs | 2 ++ 11 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 test-crates/pyo3-mixed-implicit/.gitignore create mode 100644 test-crates/pyo3-mixed-include-exclude/.gitignore create mode 100644 test-crates/pyo3-mixed-py-subdir/.gitignore create mode 100644 test-crates/pyo3-mixed-src/.gitignore create mode 100644 test-crates/pyo3-mixed/.gitignore diff --git a/src/build_options.rs b/src/build_options.rs index 878681fa2..c163eb4f2 100644 --- a/src/build_options.rs +++ b/src/build_options.rs @@ -1,3 +1,4 @@ +#![allow(clippy::needless_borrows_for_generic_args)] use crate::auditwheel::PlatformTag; use crate::build_context::BridgeModel; use crate::compile::{CompileTarget, LIB_CRATE_TYPES}; diff --git a/src/lib.rs b/src/lib.rs index 0145753d0..176d3006b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,14 +12,14 @@ //! - upload: Uses ureq to add the upload command. //! //! - rustls: Makes ureq use the rustls stack so that we can build maturin in a CentOS 6 -//! docker container and which maturin itself manylinux compliant. +//! docker container and which maturin itself manylinux compliant. //! //! - native-tls: Makes ureq use the platform native tls stack //! //! - password-storage (off by default): Uses the keyring package to store the password. keyring -//! pulls in a lot of shared libraries and outdated dependencies, so this is off by default, except -//! for the build on the github releases page. -//! (https://github.com/hwchen/secret-service-rs/issues/9) +//! pulls in a lot of shared libraries and outdated dependencies, so this is off by default, except +//! for the build on the github releases page. +//! (https://github.com/hwchen/secret-service-rs/issues/9) #![deny(missing_docs)] diff --git a/src/module_writer.rs b/src/module_writer.rs index 309d0890b..f99daf695 100644 --- a/src/module_writer.rs +++ b/src/module_writer.rs @@ -1,4 +1,5 @@ //! The wheel format is (mostly) specified in PEP 427 +#![allow(clippy::needless_borrows_for_generic_args)] use crate::project_layout::ProjectLayout; use crate::target::Os; use crate::{ @@ -1286,8 +1287,17 @@ pub fn write_python_part( } for package in python_packages { - for absolute in WalkBuilder::new(package).hidden(false).build() { + for absolute in WalkBuilder::new(&project_layout.project_root) + .hidden(false) + .parents(false) + .git_global(false) + .git_exclude(false) + .build() + { let absolute = absolute?.into_path(); + if !absolute.starts_with(package.as_path()) { + continue; + } let relative = absolute.strip_prefix(python_dir).unwrap(); if absolute.is_dir() { writer.add_directory(relative)?; diff --git a/src/project_layout.rs b/src/project_layout.rs index 1714530ba..fe53fd5f8 100644 --- a/src/project_layout.rs +++ b/src/project_layout.rs @@ -14,6 +14,8 @@ const PYPROJECT_TOML: &str = "pyproject.toml"; /// Whether this project is pure rust or rust mixed with python and whether it has wheel data #[derive(Clone, Debug, PartialEq, Eq)] pub struct ProjectLayout { + /// Contains the absolute path to the project root directory + pub project_root: PathBuf, /// Contains the absolute path to the python source directory pub python_dir: PathBuf, /// Contains the canonicalized (i.e. absolute) path to the python part of the project @@ -397,6 +399,7 @@ impl ProjectLayout { eprintln!("🍹 Building a mixed python/rust project"); Ok(ProjectLayout { + project_root: project_root.to_path_buf(), python_dir: python_root, python_packages, python_module: Some(python_module), @@ -415,6 +418,7 @@ impl ProjectLayout { } Ok(ProjectLayout { + project_root: project_root.to_path_buf(), python_dir: python_root, python_packages, python_module: None, diff --git a/src/source_distribution.rs b/src/source_distribution.rs index 8502e00ca..6afcf7ca4 100644 --- a/src/source_distribution.rs +++ b/src/source_distribution.rs @@ -1,3 +1,4 @@ +#![allow(clippy::needless_borrows_for_generic_args)] use crate::module_writer::{add_data, ModuleWriter}; use crate::pyproject_toml::SdistGenerator; use crate::{pyproject_toml::Format, BuildContext, PyProjectToml, SDistWriter}; diff --git a/test-crates/pyo3-mixed-implicit/.gitignore b/test-crates/pyo3-mixed-implicit/.gitignore new file mode 100644 index 000000000..18880a5ac --- /dev/null +++ b/test-crates/pyo3-mixed-implicit/.gitignore @@ -0,0 +1 @@ +*.py[cdo] diff --git a/test-crates/pyo3-mixed-include-exclude/.gitignore b/test-crates/pyo3-mixed-include-exclude/.gitignore new file mode 100644 index 000000000..18880a5ac --- /dev/null +++ b/test-crates/pyo3-mixed-include-exclude/.gitignore @@ -0,0 +1 @@ +*.py[cdo] diff --git a/test-crates/pyo3-mixed-py-subdir/.gitignore b/test-crates/pyo3-mixed-py-subdir/.gitignore new file mode 100644 index 000000000..18880a5ac --- /dev/null +++ b/test-crates/pyo3-mixed-py-subdir/.gitignore @@ -0,0 +1 @@ +*.py[cdo] diff --git a/test-crates/pyo3-mixed-src/.gitignore b/test-crates/pyo3-mixed-src/.gitignore new file mode 100644 index 000000000..18880a5ac --- /dev/null +++ b/test-crates/pyo3-mixed-src/.gitignore @@ -0,0 +1 @@ +*.py[cdo] diff --git a/test-crates/pyo3-mixed/.gitignore b/test-crates/pyo3-mixed/.gitignore new file mode 100644 index 000000000..18880a5ac --- /dev/null +++ b/test-crates/pyo3-mixed/.gitignore @@ -0,0 +1 @@ +*.py[cdo] diff --git a/tests/run.rs b/tests/run.rs index d5383563c..7455faabb 100644 --- a/tests/run.rs +++ b/tests/run.rs @@ -730,6 +730,7 @@ fn pyo3_mixed_include_exclude_sdist() { SdistGenerator::Cargo, expect![[r#" { + "pyo3_mixed_include_exclude-2.1.3/.gitignore", "pyo3_mixed_include_exclude-2.1.3/Cargo.lock", "pyo3_mixed_include_exclude-2.1.3/Cargo.toml", "pyo3_mixed_include_exclude-2.1.3/PKG-INFO", @@ -759,6 +760,7 @@ fn pyo3_mixed_include_exclude_git_sdist_generator() { SdistGenerator::Git, expect![[r#" { + "pyo3_mixed_include_exclude-2.1.3/.gitignore", "pyo3_mixed_include_exclude-2.1.3/Cargo.lock", "pyo3_mixed_include_exclude-2.1.3/Cargo.toml", "pyo3_mixed_include_exclude-2.1.3/PKG-INFO",