aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan R Abrahams <ajordanr@google.com>2022-01-12 00:57:09 +0000
committerCommit Bot <commit-bot@chromium.org>2022-01-14 04:47:56 +0000
commit86739250cf453a73ff88b064c51a09b99c93b99f (patch)
treeb774741779fec9a624d657b566cf56e672f68448
parentd3fe9cbd37edaa1f6cda95e1866fa3bcf86c7eb2 (diff)
downloadtoolchain-utils-86739250cf453a73ff88b064c51a09b99c93b99f.tar.gz
patch_sync: Filter patches better
This commit introduces better patch filtering. Specifically, * it prevents patches from being reintroduced to repos which already have those patches in their own PATCHES.json. * it only applies android patches which are within the desired version range. BUG=b:209493133 TEST=patch_sync transpose --no-commit -s <...> Change-Id: I667a095395a36edf290e5e652ae40efaa2df7d57 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/3382194 Reviewed-by: George Burgess <gbiv@chromium.org> Tested-by: Jordan Abrahams-Whitehead <ajordanr@google.com> Commit-Queue: Jordan Abrahams-Whitehead <ajordanr@google.com>
-rw-r--r--llvm_tools/patch_sync/src/android_utils.rs33
-rw-r--r--llvm_tools/patch_sync/src/main.rs26
2 files changed, 59 insertions, 0 deletions
diff --git a/llvm_tools/patch_sync/src/android_utils.rs b/llvm_tools/patch_sync/src/android_utils.rs
new file mode 100644
index 00000000..c6c1cd50
--- /dev/null
+++ b/llvm_tools/patch_sync/src/android_utils.rs
@@ -0,0 +1,33 @@
+use std::path::Path;
+use std::process::Command;
+
+use anyhow::{bail, ensure, Result};
+
+/// Return the Android checkout's current llvm version.
+///
+/// This uses android_version.get_svn_revision_number, a python function
+/// that can't be executed directly. We spawn a Python3 program
+/// to run it and get the result from that.
+pub fn get_android_llvm_version(android_checkout: &Path) -> Result<String> {
+ let mut command = Command::new("python3");
+ let llvm_android_dir = android_checkout.join("toolchain/llvm_android");
+ ensure!(
+ llvm_android_dir.is_dir(),
+ "can't get android llvm version; {} is not a directory",
+ llvm_android_dir.display()
+ );
+ command.current_dir(llvm_android_dir);
+ command.args([
+ "-c",
+ "import android_version; print(android_version.get_svn_revision_number(), end='')",
+ ]);
+ let output = command.output()?;
+ if !output.status.success() {
+ bail!(
+ "could not get android llvm version: {}",
+ String::from_utf8_lossy(&output.stderr)
+ );
+ }
+ let out_string = String::from_utf8(output.stdout)?.trim().to_string();
+ Ok(out_string)
+}
diff --git a/llvm_tools/patch_sync/src/main.rs b/llvm_tools/patch_sync/src/main.rs
index bfcba584..9616716c 100644
--- a/llvm_tools/patch_sync/src/main.rs
+++ b/llvm_tools/patch_sync/src/main.rs
@@ -1,3 +1,4 @@
+mod android_utils;
mod patch_parsing;
mod version_control;
@@ -103,6 +104,31 @@ fn transpose_subcmd(args: TransposeOpt) -> Result<()> {
)
.context("finding new patches for android")?;
+ // Have to ignore patches that are already at the destination, even if
+ // the patches are new.
+ let new_cros_patches = new_cros_patches.subtract(&cur_android_collection)?;
+ let new_android_patches = new_android_patches.subtract(&cur_cros_collection)?;
+
+ // Need to do an extra filtering step for Android, as AOSP doesn't
+ // want patches outside of the start/end bounds.
+ let android_llvm_version: u64 = {
+ let android_llvm_version_str =
+ android_utils::get_android_llvm_version(&ctx.android_checkout)?;
+ android_llvm_version_str.parse::<u64>().with_context(|| {
+ format!(
+ "converting llvm version to u64: '{}'",
+ android_llvm_version_str
+ )
+ })?
+ };
+ let new_android_patches =
+ new_android_patches.filter_patches(|p| match (p.start_version, p.end_version) {
+ (Some(start), Some(end)) => start <= android_llvm_version && android_llvm_version < end,
+ (Some(start), None) => start <= android_llvm_version,
+ (None, Some(end)) => android_llvm_version < end,
+ (None, None) => true,
+ });
+
if args.verbose {
display_patches("New patches from Chromium OS", &new_cros_patches);
display_patches("New patches from Android", &new_android_patches);