diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-05-14 23:22:45 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-05-14 23:22:45 +0000 |
commit | b93eda458186c6380bccb4d154bae52a3d05e9ce (patch) | |
tree | 5d2c48dcd2e226218365d164e7cf3fb6d82c2ad9 | |
parent | 6715b43048ea9ef5e4ed0c6dc39c5f3ef6d4f7b2 (diff) | |
parent | 47d955bca0a9076a9715f2b1a41156a3e0334abd (diff) | |
download | development-b93eda458186c6380bccb4d154bae52a3d05e9ce.tar.gz |
Merge "Snap for 11841552 from 4e208a021add39094b6d913a55dd583b434f92c2 to sdk-release" into sdk-release
-rw-r--r-- | tools/cargo_embargo/src/cargo/cargo_out.rs | 4 | ||||
-rw-r--r-- | tools/cargo_embargo/src/cargo/metadata.rs | 168 | ||||
-rw-r--r-- | tools/cargo_embargo/src/main.rs | 2 | ||||
-rwxr-xr-x | tools/repo_pull/gerrit.py | 26 | ||||
-rw-r--r-- | tools/winscope/OWNERS | 1 |
5 files changed, 174 insertions, 27 deletions
diff --git a/tools/cargo_embargo/src/cargo/cargo_out.rs b/tools/cargo_embargo/src/cargo/cargo_out.rs index 01ca55c95..fb2f00f64 100644 --- a/tools/cargo_embargo/src/cargo/cargo_out.rs +++ b/tools/cargo_embargo/src/cargo/cargo_out.rs @@ -410,9 +410,9 @@ impl Crate { manifest_path, ) })?; - out.package_name = package_metadata.name.clone(); + out.package_name.clone_from(&package_metadata.name); out.version = Some(package_metadata.version.clone()); - out.edition = package_metadata.edition.clone(); + out.edition.clone_from(&package_metadata.edition); let output_filename = out.name.clone() + &extra_filename; if let Some(test_contents) = tests.get(&output_filename).and_then(|m| m.get(&out.main_src)) diff --git a/tools/cargo_embargo/src/cargo/metadata.rs b/tools/cargo_embargo/src/cargo/metadata.rs index 2958a0117..127c81630 100644 --- a/tools/cargo_embargo/src/cargo/metadata.rs +++ b/tools/cargo_embargo/src/cargo/metadata.rs @@ -24,12 +24,12 @@ use std::path::{Path, PathBuf}; /// `cfg` strings for dependencies which should be considered enabled. It would be better to parse /// them properly, but this is good enough in practice so far. const ENABLED_CFGS: [&str; 6] = [ - r#"cfg(unix)"#, - r#"cfg(not(windows))"#, - r#"cfg(any(unix, target_os = "wasi"))"#, - r#"cfg(not(all(target_family = "wasm", target_os = "unknown")))"#, - r#"cfg(not(target_family = "wasm"))"#, - r#"cfg(any(target_os = "linux", target_os = "android"))"#, + r#"unix"#, + r#"not(windows)"#, + r#"any(unix, target_os = "wasi")"#, + r#"not(all(target_family = "wasm", target_os = "unknown"))"#, + r#"not(target_family = "wasm")"#, + r#"any(target_os = "linux", target_os = "android")"#, ]; /// `cargo metadata` output. @@ -39,7 +39,7 @@ pub struct WorkspaceMetadata { pub workspace_members: Vec<String>, } -#[derive(Clone, Debug, Deserialize, Eq, PartialEq)] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] pub struct PackageMetadata { pub name: String, pub version: String, @@ -62,17 +62,20 @@ pub struct DependencyMetadata { impl DependencyMetadata { /// Returns whether the dependency should be included when the given features are enabled. - fn enabled(&self, features: &[String]) -> bool { + fn enabled(&self, features: &[String], cfgs: &[String]) -> bool { if let Some(target) = &self.target { - if !ENABLED_CFGS.contains(&target.as_str()) { - return false; + if target.starts_with("cfg(") && target.ends_with(')') { + let target_cfg = &target[4..target.len() - 1]; + if !ENABLED_CFGS.contains(&target_cfg) && !cfgs.contains(&target_cfg.to_string()) { + return false; + } } } !self.optional || features.contains(&format!("dep:{}", self.name)) } } -#[derive(Clone, Debug, Deserialize, Eq, PartialEq)] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] #[allow(dead_code)] pub struct TargetMetadata { pub crate_types: Vec<CrateType>, @@ -103,12 +106,13 @@ pub enum TargetKind { pub fn parse_cargo_metadata_str(cargo_metadata: &str, cfg: &VariantConfig) -> Result<Vec<Crate>> { let metadata = serde_json::from_str(cargo_metadata).context("failed to parse cargo metadata")?; - parse_cargo_metadata(&metadata, &cfg.features, cfg.tests) + parse_cargo_metadata(&metadata, &cfg.features, &cfg.extra_cfg, cfg.tests) } fn parse_cargo_metadata( metadata: &WorkspaceMetadata, features: &Option<Vec<String>>, + cfgs: &[String], include_tests: bool, ) -> Result<Vec<Crate>> { let mut crates = Vec::new(); @@ -171,9 +175,11 @@ fn parse_cargo_metadata( package, &metadata.packages, &features, + cfgs, &target_kinds, false, )?, + cfgs: cfgs.to_owned(), ..Default::default() }); } @@ -193,9 +199,11 @@ fn parse_cargo_metadata( package, &metadata.packages, &features, + cfgs, &target_kinds, true, )?, + cfgs: cfgs.to_owned(), ..Default::default() }); } @@ -208,6 +216,7 @@ fn get_externs( package: &PackageMetadata, packages: &[PackageMetadata], features: &[String], + cfgs: &[String], target_kinds: &[TargetKind], test: bool, ) -> Result<Vec<Extern>> { @@ -216,7 +225,7 @@ fn get_externs( .iter() .filter_map(|dependency| { // Kind is None for normal dependencies, as opposed to dev dependencies. - if dependency.enabled(features) + if dependency.enabled(features, cfgs) && dependency.kind.as_deref() != Some("build") && (dependency.kind.is_none() || test) { @@ -440,6 +449,139 @@ mod tests { } #[test] + fn get_externs_cfg() { + let package = PackageMetadata { + name: "test_package".to_string(), + dependencies: vec![ + DependencyMetadata { + name: "alwayslib".to_string(), + kind: None, + optional: false, + target: None, + rename: None, + }, + DependencyMetadata { + name: "unixlib".to_string(), + kind: None, + optional: false, + target: Some("cfg(unix)".to_string()), + rename: None, + }, + DependencyMetadata { + name: "windowslib".to_string(), + kind: None, + optional: false, + target: Some("cfg(windows)".to_string()), + rename: None, + }, + ], + features: [].into_iter().collect(), + targets: vec![], + ..Default::default() + }; + let packages = vec![ + package.clone(), + PackageMetadata { + name: "alwayslib".to_string(), + targets: vec![TargetMetadata { + name: "alwayslib".to_string(), + kind: vec![TargetKind::Lib], + ..Default::default() + }], + ..Default::default() + }, + PackageMetadata { + name: "unixlib".to_string(), + targets: vec![TargetMetadata { + name: "unixlib".to_string(), + kind: vec![TargetKind::Lib], + ..Default::default() + }], + ..Default::default() + }, + PackageMetadata { + name: "windowslib".to_string(), + targets: vec![TargetMetadata { + name: "windowslib".to_string(), + kind: vec![TargetKind::Lib], + ..Default::default() + }], + ..Default::default() + }, + ]; + assert_eq!( + get_externs(&package, &packages, &[], &[], &[], false).unwrap(), + vec![ + Extern { + name: "alwayslib".to_string(), + lib_name: "alwayslib".to_string(), + extern_type: ExternType::Rust + }, + Extern { + name: "unixlib".to_string(), + lib_name: "unixlib".to_string(), + extern_type: ExternType::Rust + }, + ] + ); + } + + #[test] + fn get_externs_extra_cfg() { + let package = PackageMetadata { + name: "test_package".to_string(), + dependencies: vec![ + DependencyMetadata { + name: "foolib".to_string(), + kind: None, + optional: false, + target: Some("cfg(foo)".to_string()), + rename: None, + }, + DependencyMetadata { + name: "barlib".to_string(), + kind: None, + optional: false, + target: Some("cfg(bar)".to_string()), + rename: None, + }, + ], + features: [].into_iter().collect(), + targets: vec![], + ..Default::default() + }; + let packages = vec![ + package.clone(), + PackageMetadata { + name: "foolib".to_string(), + targets: vec![TargetMetadata { + name: "foolib".to_string(), + kind: vec![TargetKind::Lib], + ..Default::default() + }], + ..Default::default() + }, + PackageMetadata { + name: "barlib".to_string(), + targets: vec![TargetMetadata { + name: "barlib".to_string(), + kind: vec![TargetKind::Lib], + ..Default::default() + }], + ..Default::default() + }, + ]; + assert_eq!( + get_externs(&package, &packages, &[], &["foo".to_string()], &[], false).unwrap(), + vec![Extern { + name: "foolib".to_string(), + lib_name: "foolib".to_string(), + extern_type: ExternType::Rust + },] + ); + } + + #[test] fn parse_metadata() { /// Remove anything before "external/rust/crates/" from the /// `package_dir` field. This makes the test robust since you diff --git a/tools/cargo_embargo/src/main.rs b/tools/cargo_embargo/src/main.rs index 2f9ea44c2..425d19a69 100644 --- a/tools/cargo_embargo/src/main.rs +++ b/tools/cargo_embargo/src/main.rs @@ -929,7 +929,6 @@ fn crate_to_bp_modules( .clone() .into_iter() .filter(|crate_cfg| !cfg.cfg_blocklist.contains(crate_cfg)) - .chain(cfg.extra_cfg.clone().into_iter()) .collect(), ); @@ -1109,7 +1108,6 @@ fn crate_to_rulesmk( .cfgs .iter() .filter(|crate_cfg| !cfg.cfg_blocklist.contains(crate_cfg)) - .chain(cfg.extra_cfg.iter()) .map(|cfg| format!("--cfg '{cfg}'")), ); if !flags.is_empty() { diff --git a/tools/repo_pull/gerrit.py b/tools/repo_pull/gerrit.py index c93461d25..601c3ff5c 100755 --- a/tools/repo_pull/gerrit.py +++ b/tools/repo_pull/gerrit.py @@ -608,7 +608,7 @@ def _parse_args(): parser = argparse.ArgumentParser() add_common_parse_args(parser) parser.add_argument('--format', default='json', - choices=['json', 'oneline'], + choices=['json', 'oneline', 'porcelain'], help='Print format') return parser.parse_args() @@ -635,16 +635,22 @@ def main(): if args.format == 'json': json.dump(change_lists, sys.stdout, indent=4, separators=(', ', ': ')) print() # Print the end-of-line - elif args.format == 'oneline': + else: + if args.format == 'oneline': + format_str = ('{i:<8} {number:<16} {status:<20} ' + '{change_id:<60} {project:<120} ' + '{subject}') + else: + format_str = ('{i}\t{number}\t{status}\t' + '{change_id}\t{project}\t{subject}') + for i, change in enumerate(change_lists): - print('{i:<8} {number:<16} {status:<20} ' \ - '{change_id:<60} {project:<120} ' \ - '{subject}'.format(i=i, - project=change['project'], - change_id=change['change_id'], - status=change['status'], - number=change['_number'], - subject=change['subject'])) + print(format_str.format(i=i, + project=change['project'], + change_id=change['change_id'], + status=change['status'], + number=change['_number'], + subject=change['subject'])) if __name__ == '__main__': diff --git a/tools/winscope/OWNERS b/tools/winscope/OWNERS index 9cb826f69..820c48a4c 100644 --- a/tools/winscope/OWNERS +++ b/tools/winscope/OWNERS @@ -3,3 +3,4 @@ pablogamito@google.com keanmariotti@google.com jjaggi@google.com roosa@google.com +priyankaspatel@google.com |