ci: Parse Cargo.toml and Cargo.lock with Python script to determine affected packages (#48389)
Closes #ISSUE Release Notes: - N/A
This commit is contained in:
1 parent
9ec35ae904
commit
31f8249b38
6 files changed
+108
-16
No files matched your search
@@ -65,17 +65,15 @@ jobs:
|
||||
FILE_CHANGED_PKGS=$(printf '%s\n%s\n%s\n%s' "$FILE_CHANGED_PKGS" "settings" "storybook" "assets" | sort -u)
|
||||
fi
|
||||
|
||||
# Parse Cargo.lock diff for added/changed crates
|
||||
LOCK_CHANGED_PKGS=""
|
||||
if echo "$CHANGED_FILES" | grep -qP '^Cargo\.lock$'; then
|
||||
echo "Cargo.lock changed, analyzing diff..."
|
||||
LOCK_CHANGED_PKGS=$(git diff "$COMPARE_REV" "${{ github.sha }}" -- Cargo.lock | \
|
||||
grep -oP '^[+-]name = "\K[^"]+' | \
|
||||
sort -u || true)
|
||||
# Parse Cargo.toml and Cargo.lock for changed dependencies
|
||||
CARGO_CHANGED_DEPS=""
|
||||
if echo "$CHANGED_FILES" | grep -qP '^Cargo\.(toml|lock)$'; then
|
||||
echo "Cargo files changed, analyzing..."
|
||||
CARGO_CHANGED_DEPS=$(./script/diff-cargo-deps "$COMPARE_REV" || true)
|
||||
fi
|
||||
|
||||
# Combine all changed packages
|
||||
ALL_CHANGED_PKGS=$(printf '%s\n%s' "$FILE_CHANGED_PKGS" "$LOCK_CHANGED_PKGS" | sort -u | grep -v '^$' || true)
|
||||
ALL_CHANGED_PKGS=$(printf '%s\n%s' "$FILE_CHANGED_PKGS" "$CARGO_CHANGED_DEPS" | sort -u | grep -v '^$' || true)
|
||||
|
||||
if [ -z "$ALL_CHANGED_PKGS" ]; then
|
||||
echo "No package changes detected, will run all tests"
|
||||
|
||||
@@ -25,6 +25,7 @@ mod ui;
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
// Another comment
|
||||
use agent_settings::{AgentProfileId, AgentSettings};
|
||||
use assistant_slash_command::SlashCommandRegistry;
|
||||
use client::Client;
|
||||
|
||||
@@ -16,6 +16,7 @@ use release_channel::ReleaseChannel;
|
||||
use ui::px;
|
||||
use workspace::AppState;
|
||||
|
||||
// Another comment, nice.
|
||||
pub fn init(app_state: &Arc<AppState>, cx: &mut App) {
|
||||
channel_view::init(cx);
|
||||
collab_panel::init(cx);
|
||||
|
||||
@@ -29,6 +29,7 @@ mod stack_trace_view;
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
pub mod tests;
|
||||
|
||||
// Let's see the diff-test in action.
|
||||
actions!(
|
||||
debugger,
|
||||
[
|
||||
|
||||
Executable
+93
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Diff workspace dependencies between two git revisions.
|
||||
|
||||
Compares both Cargo.toml [workspace.dependencies] and Cargo.lock [[package]]
|
||||
entries to find which dependencies have changed.
|
||||
|
||||
Usage: diff-cargo-deps <old-git-ref>
|
||||
|
||||
Outputs one dependency name per line for any deps that were added, removed,
|
||||
or modified (version, features, checksum, etc).
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
import tomllib
|
||||
|
||||
|
||||
def get_file_at_ref(ref: str, path: str) -> str:
|
||||
"""Get file contents at a specific git ref."""
|
||||
result = subprocess.run(
|
||||
["git", "show", f"{ref}:{path}"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
)
|
||||
return result.stdout if result.returncode == 0 else ""
|
||||
|
||||
|
||||
def get_workspace_deps(toml_content: str) -> dict:
|
||||
"""Extract [workspace.dependencies] from Cargo.toml content."""
|
||||
if not toml_content:
|
||||
return {}
|
||||
try:
|
||||
data = tomllib.loads(toml_content)
|
||||
return data.get("workspace", {}).get("dependencies", {})
|
||||
except Exception:
|
||||
return {}
|
||||
|
||||
|
||||
def get_lock_packages(lock_content: str) -> dict[str, dict]:
|
||||
"""Extract [[package]] entries from Cargo.lock as {name: full_entry}."""
|
||||
if not lock_content:
|
||||
return {}
|
||||
try:
|
||||
data = tomllib.loads(lock_content)
|
||||
return {pkg["name"]: pkg for pkg in data.get("package", [])}
|
||||
except Exception:
|
||||
return {}
|
||||
|
||||
|
||||
def diff_dicts(old: dict, new: dict) -> set[str]:
|
||||
"""Find keys that were added, removed, or whose values changed."""
|
||||
changed = set()
|
||||
|
||||
for name, value in new.items():
|
||||
if name not in old or old[name] != value:
|
||||
changed.add(name)
|
||||
|
||||
for name in old:
|
||||
if name not in new:
|
||||
changed.add(name)
|
||||
|
||||
return changed
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: diff-cargo-deps <old-git-ref>", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
old_ref = sys.argv[1]
|
||||
changed = set()
|
||||
|
||||
# Diff Cargo.toml workspace dependencies
|
||||
old_toml = get_file_at_ref(old_ref, "Cargo.toml")
|
||||
new_toml = open("Cargo.toml").read()
|
||||
old_deps = get_workspace_deps(old_toml)
|
||||
new_deps = get_workspace_deps(new_toml)
|
||||
changed |= diff_dicts(old_deps, new_deps)
|
||||
|
||||
# Diff Cargo.lock packages
|
||||
old_lock = get_file_at_ref(old_ref, "Cargo.lock")
|
||||
new_lock = open("Cargo.lock").read()
|
||||
old_pkgs = get_lock_packages(old_lock)
|
||||
new_pkgs = get_lock_packages(new_lock)
|
||||
changed |= diff_dicts(old_pkgs, new_pkgs)
|
||||
|
||||
for name in sorted(changed):
|
||||
print(name)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -173,17 +173,15 @@ fn orchestrate_impl(rules: &[&PathCondition], include_package_filter: bool) -> N
|
||||
FILE_CHANGED_PKGS=$(printf '%s\n%s\n%s\n%s' "$FILE_CHANGED_PKGS" "settings" "storybook" "assets" | sort -u)
|
||||
fi
|
||||
|
||||
# Parse Cargo.lock diff for added/changed crates
|
||||
LOCK_CHANGED_PKGS=""
|
||||
if echo "$CHANGED_FILES" | grep -qP '^Cargo\.lock$'; then
|
||||
echo "Cargo.lock changed, analyzing diff..."
|
||||
LOCK_CHANGED_PKGS=$(git diff "$COMPARE_REV" "${{ github.sha }}" -- Cargo.lock | \
|
||||
grep -oP '^[+-]name = "\K[^"]+' | \
|
||||
sort -u || true)
|
||||
# Parse Cargo.toml and Cargo.lock for changed dependencies
|
||||
CARGO_CHANGED_DEPS=""
|
||||
if echo "$CHANGED_FILES" | grep -qP '^Cargo\.(toml|lock)$'; then
|
||||
echo "Cargo files changed, analyzing..."
|
||||
CARGO_CHANGED_DEPS=$(./script/diff-cargo-deps "$COMPARE_REV" || true)
|
||||
fi
|
||||
|
||||
# Combine all changed packages
|
||||
ALL_CHANGED_PKGS=$(printf '%s\n%s' "$FILE_CHANGED_PKGS" "$LOCK_CHANGED_PKGS" | sort -u | grep -v '^$' || true)
|
||||
ALL_CHANGED_PKGS=$(printf '%s\n%s' "$FILE_CHANGED_PKGS" "$CARGO_CHANGED_DEPS" | sort -u | grep -v '^$' || true)
|
||||
|
||||
if [ -z "$ALL_CHANGED_PKGS" ]; then
|
||||
echo "No package changes detected, will run all tests"
|
||||
|
||||
Reference in new issue
Block a user