@@ -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" ) ]
17911869impl 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