Skip to content

Commit cfa27f2

Browse files
authored
upgrade gix to the latest release 0.69. (#14975)
The main benefit is that it won't facilitate hangs due to attempts to read from untrackable directory entries, like names pipes or sockets. Related to GitoxideLabs/gitoxide#1629 ### Tasks * [x] upgrade * [x] incorporate updated `gix` [once everything is fixed](GitoxideLabs/gitoxide#1740). * [x] assure tests work ### Postponed It turns out that the new `gix` version doesn't magically fix the FIFO issue, so the following test still fails. It's not super-trivial to fix apparently (I tried), so let's do it in a separate PR. Here is the patch I have so far in case anyone is interested to fix it earlier or wants to share insights :). ```patch commit dfef545eae215f0b9da9f3d4424b52cba7edaec3 Author: Sebastian Thiel <[email protected]> Date: Sun Dec 22 19:05:40 2024 +0100 fix: assure possibly blocking non-files (like FIFOs) won't be picked up for publishing. This would otherwise cause the publish to hang. diff --git a/src/cargo/sources/path.rs b/src/cargo/sources/path.rs index 776590697..c78463a32 100644 --- a/src/cargo/sources/path.rs +++ b/src/cargo/sources/path.rs @@ -626,8 +626,11 @@ fn list_files_gix( .filter(|res| { // Don't include Cargo.lock if it is untracked. Packaging will // generate a new one as needed. + // Also don't include untrackable directory entries, like FIFOs. res.as_ref().map_or(true, |item| { - !(item.entry.status == Status::Untracked && item.entry.rela_path == "Cargo.lock") + item.entry.disk_kind != Some(gix::dir::entry::Kind::Untrackable) + && !(item.entry.status == Status::Untracked + && item.entry.rela_path == "Cargo.lock") }) }) .map(|res| res.map(|item| (item.entry.rela_path, item.entry.disk_kind))) diff --git a/tests/testsuite/package.rs b/tests/testsuite/package.rs index 1740de4ac..1c6b3db89 100644 --- a/tests/testsuite/package.rs +++ b/tests/testsuite/package.rs @@ -6873,3 +6873,29 @@ See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for "#]]) .run(); } + +#[cargo_test] +#[cfg(unix)] +fn simple_with_fifo() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.1.0" + edition = "2015" + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + std::process::Command::new("mkfifo") + .current_dir(p.root()) + .arg(p.root().join("blocks-when-read")) + .status() + .expect("a FIFO can be created"); + + // If this hangs, Cargo tried to package a FIFO and is reading it forever. + p.cargo("package").run(); +} ```
2 parents 652623b + 3a18044 commit cfa27f2

File tree

4 files changed

+66
-41
lines changed

4 files changed

+66
-41
lines changed

Cargo.lock

+61-38
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ filetime = "0.2.23"
4949
flate2 = { version = "1.0.30", default-features = false, features = ["zlib"] }
5050
git2 = "0.19.0"
5151
git2-curl = "0.20.0"
52-
gix = { version = "0.68.0", default-features = false, features = ["blocking-http-transport-curl", "progress-tree", "parallel", "dirwalk"] }
52+
gix = { version = "0.69.1", default-features = false, features = ["blocking-http-transport-curl", "progress-tree", "parallel", "dirwalk"] }
5353
glob = "0.3.1"
5454
handlebars = { version = "6.0.0", features = ["dir_source"] }
5555
hex = "0.4.3"

src/cargo/sources/git/oxide.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ pub fn cargo_config_to_gitoxide_overrides(gctx: &GlobalContext) -> CargoResult<V
352352
}
353353

354354
/// Reinitializes a given Git repository. This is useful when a Git repository
355-
/// seems corrupted and we want to start over.
355+
/// seems corrupted, and we want to start over.
356356
pub fn reinitialize(git_dir: &Path) -> CargoResult<()> {
357357
fn init(path: &Path, bare: bool) -> CargoResult<()> {
358358
let mut opts = git2::RepositoryInitOptions::new();

src/cargo/sources/git/utils.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1057,7 +1057,9 @@ pub fn fetch(
10571057
fn has_shallow_lock_file(err: &crate::sources::git::fetch::Error) -> bool {
10581058
matches!(
10591059
err,
1060-
gix::env::collate::fetch::Error::Fetch(gix::remote::fetch::Error::LockShallowFile(_))
1060+
gix::env::collate::fetch::Error::Fetch(gix::remote::fetch::Error::Fetch(
1061+
gix::protocol::fetch::Error::LockShallowFile(_)
1062+
))
10611063
)
10621064
}
10631065

0 commit comments

Comments
 (0)