Merge "Try more versions of crate updates" into main
diff --git a/tools/crate-updater/src/main.rs b/tools/crate-updater/src/main.rs
index b5fe89b..a06bf00 100644
--- a/tools/crate-updater/src/main.rs
+++ b/tools/crate-updater/src/main.rs
@@ -147,22 +147,21 @@
 
 fn get_suggestions(monorepo_path: &Path) -> Result<Vec<(String, String)>> {
     // TODO: Improve update suggestion algorithm, and produce output in machine-readable format.
-    let output = Command::new(monorepo_path.join("crate_tool"))
-        .args(["suggest-updates", "--patches"])
-        .current_dir(monorepo_path)
-        .output()?
-        .success_or_error()?;
-    let mut suggestions = from_utf8(&output.stdout)?
-        .trim()
-        .lines()
-        .map(|suggestion| {
+    let mut suggestions = Vec::new();
+    for compatibility in ["ignore", "loose", "strict"] {
+        let output = Command::new(monorepo_path.join("crate_tool"))
+            .args(["suggest-updates", "--patches", "--semver-compatibility", compatibility])
+            .current_dir(monorepo_path)
+            .output()?
+            .success_or_error()?;
+        suggestions.extend(from_utf8(&output.stdout)?.trim().lines().map(|suggestion| {
             let words = suggestion.split_whitespace().collect::<Vec<_>>();
             if words.len() != 6 {
                 println!("Failed to parse suggestion {suggestion}");
             }
             (words[2].to_string(), words[5].to_string())
-        })
-        .collect::<Vec<_>>();
+        }));
+    }
 
     // Return suggestions in random order. This reduces merge conflicts and ensures
     // all crates eventually get tried, even if something goes wrong and the program