Skip to content

Commit 3056a7b

Browse files
author
Alexandre Lissy
committed
Bug 1774585 - Collect required files to perform a build
1 parent c6bc422 commit 3056a7b

1 file changed

Lines changed: 89 additions & 0 deletions

File tree

src/compiler/rust.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1787,6 +1787,84 @@ fn test_can_trim_this() {
17871787
assert!(!can_trim_this(&rlib_file));
17881788
}
17891789

1790+
fn extract_env_var_value(
1791+
env_vars: &[(OsString, OsString)],
1792+
name: &str) -> OsString {
1793+
env_vars
1794+
.iter()
1795+
.filter(|(k, _)| k == name)
1796+
.cloned()
1797+
.collect::<Vec<(OsString, OsString)>>()[0].1.clone()
1798+
}
1799+
1800+
#[cfg(feature = "dist-client")]
1801+
fn cargo_package_files(
1802+
env_vars: &[(OsString, OsString)],
1803+
) -> Result<Vec<String>> {
1804+
let cargo_pkg_name = extract_env_var_value(&env_vars, "CARGO_PKG_NAME");
1805+
trace!("Discovering package deps: {:?}", cargo_pkg_name);
1806+
1807+
let cargo_bin = extract_env_var_value(&env_vars, "CARGO");
1808+
let manifest_dir = PathBuf::from(extract_env_var_value(&env_vars, "CARGO_MANIFEST_DIR"));
1809+
let cargo_toml = manifest_dir.join("Cargo.toml");
1810+
1811+
let mut cmd = process::Command::new(PathBuf::from(cargo_bin));
1812+
cmd.args(&["package", "--list", "--offline", "--frozen", "--manifest-path", cargo_toml.as_os_str().to_str().unwrap()])
1813+
.env_clear()
1814+
.envs(ref_env(env_vars));
1815+
1816+
trace!("[{:?}] cmd={:?}", cargo_pkg_name, cmd);
1817+
1818+
let process::Output {
1819+
status,
1820+
stdout,
1821+
stderr,
1822+
} = cmd.output()?;
1823+
1824+
if !status.success() {
1825+
bail!(format!("Failed to list package deps"))
1826+
}
1827+
if !stderr.is_empty() {
1828+
bail!(
1829+
"cargo package --list stderr non-empty: {:?}",
1830+
String::from_utf8_lossy(&stderr)
1831+
)
1832+
}
1833+
1834+
let stdout = String::from_utf8(stdout).context("Error parsing cargo package --list output")?;
1835+
let pkgs: Vec<_> = parse_cargo_package_list(&stdout)
1836+
.map(|pkgs| pkgs
1837+
.into_iter()
1838+
.map(|pkg| pkg
1839+
.to_owned())
1840+
.map(|pkg| manifest_dir.clone().join(pkg).into_os_string().into_string().unwrap())
1841+
.collect()
1842+
)?;
1843+
trace!("[{:?}] pkgs={:?}", cargo_pkg_name, pkgs);
1844+
Ok(pkgs)
1845+
}
1846+
1847+
#[cfg(feature = "dist-client")]
1848+
fn parse_cargo_package_list(stdout: &str) -> Result<Vec<&str>> {
1849+
let mut dep_names = vec![];
1850+
let mut lines = stdout.lines();
1851+
loop {
1852+
match lines.next() {
1853+
Some(s) => {
1854+
match s {
1855+
"Cargo.lock" => {}
1856+
"Cargo.toml" => {}
1857+
"Cargo.toml.orig" => {}
1858+
d => dep_names.push(d)
1859+
}
1860+
},
1861+
None => break,
1862+
}
1863+
}
1864+
trace!("parse_cargo_package_list: dep_names={:?}", dep_names);
1865+
Ok(dep_names)
1866+
}
1867+
17901868
#[cfg(feature = "dist-client")]
17911869
impl pkg::InputsPackager for RustInputsPackager {
17921870
#[allow(clippy::cognitive_complexity)] // TODO simplify this method.
@@ -1842,6 +1920,17 @@ impl pkg::InputsPackager for RustInputsPackager {
18421920
tar_inputs.push((input_path, dist_input_path))
18431921
}
18441922

1923+
if is_cargo {
1924+
let pkgs = cargo_package_files(&env_vars);
1925+
for path in pkgs.unwrap().into_iter() {
1926+
let input_path = pkg::simplify_path(Path::new(&path))?;
1927+
let dist_input_path = path_transformer.as_dist(&input_path).with_context(|| {
1928+
format!("unable to transform input path {}", input_path.display())
1929+
})?;
1930+
tar_inputs.push((input_path, dist_input_path))
1931+
}
1932+
}
1933+
18451934
if log_enabled!(Trace) {
18461935
if let Some((_, ref dep_crate_names)) = rlib_dep_reader_and_names {
18471936
trace!("Identified dependency crate names: {:?}", dep_crate_names)

0 commit comments

Comments
 (0)