Skip to content

Commit

Permalink
reproduce failure when packaging a path-dependency inside a symlinked…
Browse files Browse the repository at this point in the history
… git repository (#13773)
  • Loading branch information
Byron committed Apr 18, 2024
1 parent 39b8f17 commit 5cfd783
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 3 deletions.
9 changes: 8 additions & 1 deletion crates/cargo-test-support/src/git.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ use some of the helper functions in this file to interact with the repository.
*/

use crate::{path2url, project, Project, ProjectBuilder};
use crate::{path2url, project, Project, ProjectBuilder, SymlinkBuilder};
use std::fs;
use std::path::{Path, PathBuf};
use std::sync::Once;
Expand Down Expand Up @@ -76,6 +76,13 @@ impl RepoBuilder {
me
}

/// Create a symlink to a directory
pub fn nocommit_symlink_dir<T: AsRef<Path>>(self, dst: T, src: T) -> Self {
let workdir = self.repo.workdir().unwrap();
SymlinkBuilder::new_dir(workdir.join(dst), workdir.join(src)).mk();
self
}

/// Add a file that will be left in the working directory, but not added
/// to the repository.
pub fn nocommit_file(self, path: &str, contents: &str) -> RepoBuilder {
Expand Down
57 changes: 55 additions & 2 deletions tests/testsuite/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ use cargo::{
ops::CompileOptions,
GlobalContext,
};
use cargo_test_support::compare;
use cargo_test_support::paths::{root, CargoPathExt};
use cargo_test_support::registry::Package;
use cargo_test_support::tools;
use cargo_test_support::{
basic_bin_manifest, basic_lib_manifest, basic_manifest, cargo_exe, git, is_nightly, main_file,
paths, process, project, rustc_host, sleep_ms, symlink_supported, t, Execs, ProjectBuilder,
};
use cargo_test_support::{cargo_process, compare};
use cargo_test_support::{git_process, tools};
use cargo_util::paths::dylib_path_envvar;
use std::env;
use std::fs;
Expand All @@ -33,6 +33,59 @@ fn cargo_compile_simple() {
p.process(&p.bin("foo")).with_stdout("i am foo\n").run();
}

#[cargo_test]
/// Tests if a symlink to a path-dependency to a crate in the workspace is included.
fn build_with_symlink_to_path_dependency_with_build_script() {
if !symlink_supported() {
return;
}

let root = paths::root();
git::repo(&root)
.nocommit_file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.1.0"
edition = "2021"
[dependencies]
# the path leads through a symlink, 'symlink-to-original' is a worktree root,
# and symlink-to-dir/ is a symlink within th working tree.
lib = { version = "0.1.0", path = "symlink-to-original/symlink-to-dir/lib" }
"#,
)
.nocommit_file("src/main.rs", "fn main() { }")
.nocommit_file("original/dir/lib/build.rs", "fn main() {}")
.nocommit_file(
"original/dir/lib/Cargo.toml",
r#"
[package]
name = "lib"
version = "0.1.0"
edition = "2021"
"#,
)
.nocommit_file("original/dir/lib/src/lib.rs", "")
.nocommit_symlink_dir("original", "symlink-to-original")
.nocommit_symlink_dir("original/dir", "original/symlink-to-dir")
.build();

// It is necessary to have a sub-reposiory and to add files so there is an index.
git_process("init")
.cwd(root.join("original"))
.build_command()
.status()
.unwrap();
git_process("add .")
.cwd(root.join("original"))
.build_command()
.status()
.unwrap();
cargo_process("build").run()
}

#[cargo_test]
fn cargo_fail_with_no_stderr() {
let p = project()
Expand Down

0 comments on commit 5cfd783

Please sign in to comment.