diff --git a/.bazelversion b/.bazelversion index 56b6be4..c0f6746 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1,2 @@ 8.3.1 + diff --git a/MODULE.bazel b/MODULE.bazel index 2d90895..f9f0a44 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,7 +10,7 @@ module( bazel_dep(name = "rules_proto", version = "7.1.0") bazel_dep(name = "rules_go", version = "0.57.0") bazel_dep(name = "gazelle", version = "0.45.0") -bazel_dep(name = "build_stack_rules_proto", version = "4.1.0") +bazel_dep(name = "build_stack_rules_proto", version = "4.1.1") # ------------------------------------------------------------------- # Configuration: Go @@ -33,7 +33,7 @@ use_repo( # Configuration: Protobuf Deps # ------------------------------------------------------------------- -proto_repository = use_extension("@build_stack_rules_proto//extensions:proto_repository.bzl", "proto_repository", dev_dependency = True) +proto_repository = use_extension("@build_stack_rules_proto//extensions:proto_repository.bzl", "proto_repository") proto_repository.archive( name = "protobufapis", build_directives = [ @@ -51,7 +51,7 @@ proto_repository.archive( ], build_file_generation = "clean", build_file_proto_mode = "file", - cfgs = ["@//:rules_proto_config.yaml"], + cfgs = ["//:rules_proto_config.yaml"], deleted_files = [ "google/protobuf/*test*.proto", "google/protobuf/*unittest*.proto", diff --git a/README.md b/README.md index f1ef493..2d050fe 100644 --- a/README.md +++ b/README.md @@ -2,39 +2,212 @@ # bazel-aquery-differ -This is a port of - -to golang. +A tool to compare Bazel action query outputs with an interactive HTML report. +This is a re-imagination of the [Bazel +aquery_differ.py](https://github.com/bazelbuild/bazel/blob/master/tools/aquery_differ/aquery_differ.py) +in Go with enhanced visualization features. + +## Features + +- Compare Bazel action graphs between builds or git commits +- Interactive HTML reports with GitHub-style diff visualization +- Syntax-highlighted diffs (unified diff and go-cmp formats) +- Built-in web server with auto-open browser support +- Native Bazel rules for integration into your build ## Installation -Download and unzip a release artifact, or clone and `bazel build //cmd/aquerydiff`. +### As a Bazel Module -## Usage +Add to your `MODULE.bazel`: + +```starlark +bazel_dep(name = "bazel-aquery-differ", version = "0.0.0") +``` + +> **Note**: This module is not yet published to the Bazel Central Registry. For +> now, use an `archive_override` or `git_override` pointing to this repository. + +### As a Standalone Binary + +Download a release artifact, or build from source: ```bash -aquerydiff --before --after --report_dir +git clone https://github.com/stackb/bazel-aquery-differ.git +cd bazel-aquery-differ +bazel build //cmd/aquerydiff +``` + +## Usage + +### Using Bazel Rules + +Load the rules in your `BUILD.bazel` file: + +```starlark +load("@bazel-aquery-differ//rules:defs.bzl", "aquery_diff", "aquery_git_diff") ``` -You can generate the `` (and ``) using: +#### Rule: `aquery_diff` + +Compare two aquery output files: + +```starlark +aquery_diff( + name = "compare_actions", + before = "before.pb", + after = "after.pb", +) +``` + +**Attributes:** + +| Attribute | Type | Default | Description | +|-----------|----------|------------------|------------------------------------------------------------------------------| +| `before` | `label` | **required** | Baseline aquery file (`.pb`, `.proto`, `.textproto`, `.json`, `.jsonproto`) | +| `after` | `label` | **required** | Comparison aquery file (same format options) | +| `match` | `string` | `"output_files"` | Strategy to match before and after actions: `"output_files"` or `"mnemonic"` | +| `serve` | `bool` | `True` | Start web server to view report | +| `open` | `bool` | `True` | Automatically open browser to report | +| `unidiff` | `bool` | `False` | Generate unified diffs (can be slow for large actions) | +| `cmpdiff` | `bool` | `True` | Generate go-cmp diffs (fast, structural comparison) | + +Run the comparison: ```bash -bazel aquery //pkg:target-name --output jsonproto > before.json -bazel aquery //pkg:target-name --output textproto > before.textproto -bazel aquery //pkg:target-name --output proto > before.pb +bazel run //path/to:compare_actions +``` + +> **Performance Note**: The `unidiff` attribute defaults to `False` because generating unified diffs can be prohibitively slow for large actions with many inputs/outputs. The `cmpdiff` format (enabled by default) is much faster and provides good structural comparison for most use cases. Only enable `unidiff` if you need the traditional unified diff format and are willing to wait for the additional processing time. + +**Choosing a Match Strategy:** + +The `match` attribute determines how actions are paired between the before and +after builds: + +- **`output_files`** (default): Actions are matched by their output file paths. + Use this when comparing the same target across different commits or + configurations. This is the most common use case and ensures you're comparing + the exact same action that produces the same outputs. + +- **`mnemonic`**: Actions are matched by their mnemonic (action type, e.g., + "GoCompile", "CppCompile"). Use this when comparing different targets that use + similar build rules. For example, comparing `//old/pkg:binary` vs + `//new/pkg:binary` where both are `go_binary` targets but produce different + output paths. This helps identify how the same type of action differs between + targets. + +Example using mnemonic matching: + +```starlark +aquery_diff( + name = "compare_go_binaries", + before = "old_binary.pb", + after = "new_binary.pb", + match = "mnemonic", # Compare by action type instead of output path +) ``` -> The file extensions are relevant; the proto decoder will be `protojson` if -`.json`, `prototext` if `.textproto` and `proto` otherwise. +#### Rule: `aquery_git_diff` + +Compare aquery outputs between git commits: + +```starlark +aquery_git_diff( + name = "git_compare", + before = "main", + after = "feature-branch", + target = "//my/package:target", +) +``` + +**Attributes:** + +Same as `aquery_diff`, plus: + +| Attribute | Type | Default | Description | +|-----------|----------|--------------|------------------------------------------------------------| +| `target` | `string` | **required** | Bazel target to aquery (e.g., `//pkg:binary`, `deps(...)`) | +| `bazel` | `string` | `"bazel"` | Path to bazel executable | +| `before` | `string` | **required** | Git commit/branch/tag for baseline | +| `after` | `string` | **required** | Git commit/branch/tag for comparison | +This rule will: +1. Check for uncommitted changes (fails if found) +2. Checkout `before` commit and run `bazel aquery` +3. Checkout `after` commit and run `bazel aquery` +4. Restore original commit +5. Generate comparison report -An HTML report and accessory files will be written to the given `--report_dir`, -which you could serve as follows: +### Using the CLI +Generate aquery files using Bazel: + +```bash +# Binary proto format (recommended for large graphs) +bazel aquery //pkg:target --output=proto > before.pb + +# Text proto format (human-readable) +bazel aquery //pkg:target --output=textproto > before.textproto + +# JSON proto format +bazel aquery //pkg:target --output=jsonproto > before.json ``` -(cd && python3 -m http.server 8000) & + +> **Supported formats**: The tool automatically detects format based on file extension: +> - Binary: `.pb`, `.proto` +> - Text: `.textproto` +> - JSON: `.json`, `.jsonproto` + +Run the comparison: + +```bash +aquerydiff \ + --before before.pb \ + --after after.pb \ + --report_dir ./output \ + --serve \ + --open ``` -> Report will look something like: +**CLI Flags:** + +- `--before` - Path to baseline aquery file +- `--after` - Path to comparison aquery file +- `--report_dir` - Directory to write HTML report +- `--match` - Matching strategy: `output_files` (default) or `mnemonic` +- `--serve` - Start web server (default: true) +- `--open` - Open browser automatically (default: true) +- `--unidiff` - Generate unified diffs (default: false) +- `--cmpdiff` - Generate go-cmp diffs (default: true) + +> **Note**: The report title is automatically derived from the most common target in the action graph. + +### Report Output + +The HTML report shows: + +- **Actions only in before** - Removed actions +- **Actions only in after** - New actions +- **Non-equal actions** - Actions with changes +- **Equal actions** - Unchanged actions + +Each action displays: +- Mnemonic (action type) +- Output files +- Links to before/after JSON/textproto representations +- Colorized diffs (unified and/or go-cmp format) + +Example report showing action comparison + +## Example + +See the [examples/simple](examples/simple) directory for working examples using both rules. + +## Contributing + +Contributions welcome! Please open an issue or pull request. + +## License -image +Apache 2.0 diff --git a/cmd/aquerydiff/config.go b/cmd/aquerydiff/config.go index d5e37b8..60b2fbf 100644 --- a/cmd/aquerydiff/config.go +++ b/cmd/aquerydiff/config.go @@ -1,7 +1,13 @@ package main type config struct { - beforeFile string - afterFile string - reportDir string + beforeFile string + afterFile string + reportDir string + matchingStrategy string + port string + unidiff bool + cmpdiff bool + serve bool + open bool } diff --git a/cmd/aquerydiff/main.go b/cmd/aquerydiff/main.go index 0c8fea7..a274aaf 100644 --- a/cmd/aquerydiff/main.go +++ b/cmd/aquerydiff/main.go @@ -4,7 +4,10 @@ import ( "flag" "fmt" "log" + "net/http" "os" + "os/exec" + "runtime" anpb "github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2" "github.com/stackb/bazel-aquery-differ/pkg/action" @@ -26,8 +29,14 @@ func run(args []string) error { flags := flag.NewFlagSet("aquerydiff", flag.ExitOnError) flags.StringVar(&config.beforeFile, "before", "", "filepath to aquery file (before)") flags.StringVar(&config.afterFile, "after", "", "filepath to aquery file (after)") + flags.StringVar(&config.matchingStrategy, "match", "output_files", "method used to build mapping of before & after actions (output_files|mnemonic)") flags.StringVar(&config.reportDir, "report_dir", "", "path to directory where report files should be written") - if err := flags.Parse(os.Args[1:]); err != nil { + flags.StringVar(&config.port, "port", "8000", "port number to use when serving content") + flags.BoolVar(&config.unidiff, "unidiff", false, "compute unidiffs (can be slow)") + flags.BoolVar(&config.cmpdiff, "cmpdiff", true, "compute go-cmp diffs (usually fast)") + flags.BoolVar(&config.serve, "serve", false, "start webserver") + flags.BoolVar(&config.open, "open", false, "open browser to webserver URL") + if err := flags.Parse(args); err != nil { return err } @@ -64,7 +73,21 @@ func run(args []string) error { return err } - beforeOnly, afterOnly, both := action.Partition(beforeGraph.OutputMap, afterGraph.OutputMap) + var mapper action.ActionMapper + switch config.matchingStrategy { + case "output_files": + mapper = action.NewOutputFilesMap + case "mnemonic": + mapper = action.NewMnemonicFileMap + default: + return fmt.Errorf("unknown matching strategy '%s'", config.matchingStrategy) + } + + beforeOnly, afterOnly, both := action.Partition( + mapper(beforeGraph.Actions), + mapper(afterGraph.Actions), + ) + var equal action.OutputPairs var nonEqual action.OutputPairs @@ -80,7 +103,17 @@ func run(args []string) error { } } + // Derive target from the action graph (prefer before, fallback to after) + target := beforeGraph.GetPrimaryTarget() + if target == "" { + target = afterGraph.GetPrimaryTarget() + } + if target == "" { + target = "unknown" + } + r := report.Html{ + Target: target, BeforeFile: config.beforeFile, AfterFile: config.afterFile, Before: beforeGraph, @@ -89,6 +122,8 @@ func run(args []string) error { AfterOnly: afterOnly, Equal: equal, NonEqual: nonEqual, + Unidiff: config.unidiff, + Cmpdiff: config.cmpdiff, } log.Printf("Generating report in: %s", config.reportDir) @@ -99,5 +134,37 @@ func run(args []string) error { log.Printf("aquerydiff report available at <%s>", config.reportDir) + if config.serve { + log.Printf("Starting webserver on port %s, serving %s", config.port, config.reportDir) + http.Handle("/", http.FileServer(http.Dir(config.reportDir))) + + if config.open { + url := "http://localhost:" + config.port + log.Printf("Opening browser to %s", url) + if err := openBrowser(url); err != nil { + log.Printf("Failed to open browser: %v", err) + } + } + + return http.ListenAndServe(":"+config.port, nil) + } + return nil } + +func openBrowser(url string) error { + var cmd string + var args []string + + switch runtime.GOOS { + case "windows": + cmd = "cmd" + args = []string{"/c", "start"} + case "darwin": + cmd = "open" + default: // "linux", "freebsd", "openbsd", "netbsd" + cmd = "xdg-open" + } + args = append(args, url) + return exec.Command(cmd, args...).Start() +} diff --git a/examples/simple/BUILD.bazel b/examples/simple/BUILD.bazel new file mode 100644 index 0000000..28b136c --- /dev/null +++ b/examples/simple/BUILD.bazel @@ -0,0 +1,18 @@ +load("//rules:defs.bzl", "aquery_diff", "aquery_git_diff") + +aquery_git_diff( + name = "git_diff", + after = "f8ca179cddc6b11b430fa8d2fc02136b66f2f194", + before = "a771ee789340aa3164d86491728828afeb5973cb", + target = "deps(//cmd/aquerydiff)", +) + +aquery_diff( + name = "diff", + # bazel aquery //cmd/aquerydiff:aquerydiff_darwin_amd64 --output textproto > examples/simple/before.textproto + after = "after.textproto", + # bazel aquery //cmd/aquerydiff:aquerydiff_linux_amd64 --output textproto > examples/simple/after.textproto + before = "before.textproto", + match = "mnemonic", + unidiff = True, +) diff --git a/examples/simple/after.textproto b/examples/simple/after.textproto new file mode 100644 index 0000000..7049b8d --- /dev/null +++ b/examples/simple/after.textproto @@ -0,0 +1,1718 @@ +rule_classes { +id: 1 +name: "go_binary" +} +targets { +id: 1 +label: "//cmd/aquerydiff:aquerydiff_linux_amd64" +rule_class_id: 1 +} +configuration { +id: 1 +mnemonic: "darwin_arm64-fastbuild-ST-28c832439b7e" +platform_name: "darwin_arm64" +checksum: "2612556a17660b242edb7af5a57d19afb48547338430438ba8847dc2b6fa13be" +} +path_fragments { +id: 5 +label: "external" +} +path_fragments { +id: 4 +label: "rules_go++go_sdk+main___download_0" +parent_id: 5 +} +path_fragments { +id: 3 +label: "pkg" +parent_id: 4 +} +path_fragments { +id: 2 +label: "include" +parent_id: 3 +} +path_fragments { +id: 1 +label: "asm_amd64.h" +parent_id: 2 +} +artifacts { +id: 1 +path_fragment_id: 1 +} +path_fragments { +id: 6 +label: "asm_ppc64x.h" +parent_id: 2 +} +artifacts { +id: 2 +path_fragment_id: 6 +} +path_fragments { +id: 7 +label: "funcdata.h" +parent_id: 2 +} +artifacts { +id: 3 +path_fragment_id: 7 +} +path_fragments { +id: 8 +label: "textflag.h" +parent_id: 2 +} +artifacts { +id: 4 +path_fragment_id: 8 +} +dep_set_of_files { +id: 3 +direct_artifact_ids: 1 +direct_artifact_ids: 2 +direct_artifact_ids: 3 +direct_artifact_ids: 4 +} +path_fragments { +id: 10 +label: "bin" +parent_id: 4 +} +path_fragments { +id: 9 +label: "gofmt" +parent_id: 10 +} +artifacts { +id: 5 +path_fragment_id: 9 +} +path_fragments { +id: 13 +label: "tool" +parent_id: 3 +} +path_fragments { +id: 12 +label: "darwin_arm64" +parent_id: 13 +} +path_fragments { +id: 11 +label: "addr2line" +parent_id: 12 +} +artifacts { +id: 6 +path_fragment_id: 11 +} +path_fragments { +id: 14 +label: "asm" +parent_id: 12 +} +artifacts { +id: 7 +path_fragment_id: 14 +} +path_fragments { +id: 15 +label: "buildid" +parent_id: 12 +} +artifacts { +id: 8 +path_fragment_id: 15 +} +path_fragments { +id: 16 +label: "cgo" +parent_id: 12 +} +artifacts { +id: 9 +path_fragment_id: 16 +} +path_fragments { +id: 17 +label: "compile" +parent_id: 12 +} +artifacts { +id: 10 +path_fragment_id: 17 +} +path_fragments { +id: 18 +label: "covdata" +parent_id: 12 +} +artifacts { +id: 11 +path_fragment_id: 18 +} +path_fragments { +id: 19 +label: "cover" +parent_id: 12 +} +artifacts { +id: 12 +path_fragment_id: 19 +} +path_fragments { +id: 20 +label: "doc" +parent_id: 12 +} +artifacts { +id: 13 +path_fragment_id: 20 +} +path_fragments { +id: 21 +label: "fix" +parent_id: 12 +} +artifacts { +id: 14 +path_fragment_id: 21 +} +path_fragments { +id: 22 +label: "link" +parent_id: 12 +} +artifacts { +id: 15 +path_fragment_id: 22 +} +path_fragments { +id: 23 +label: "nm" +parent_id: 12 +} +artifacts { +id: 16 +path_fragment_id: 23 +} +path_fragments { +id: 24 +label: "objdump" +parent_id: 12 +} +artifacts { +id: 17 +path_fragment_id: 24 +} +path_fragments { +id: 25 +label: "pack" +parent_id: 12 +} +artifacts { +id: 18 +path_fragment_id: 25 +} +path_fragments { +id: 26 +label: "pprof" +parent_id: 12 +} +artifacts { +id: 19 +path_fragment_id: 26 +} +path_fragments { +id: 27 +label: "preprofile" +parent_id: 12 +} +artifacts { +id: 20 +path_fragment_id: 27 +} +path_fragments { +id: 28 +label: "test2json" +parent_id: 12 +} +artifacts { +id: 21 +path_fragment_id: 28 +} +path_fragments { +id: 29 +label: "trace" +parent_id: 12 +} +artifacts { +id: 22 +path_fragment_id: 29 +} +path_fragments { +id: 30 +label: "vet" +parent_id: 12 +} +artifacts { +id: 23 +path_fragment_id: 30 +} +path_fragments { +id: 31 +label: "go.env" +parent_id: 4 +} +artifacts { +id: 24 +path_fragment_id: 31 +} +dep_set_of_files { +id: 4 +direct_artifact_ids: 5 +direct_artifact_ids: 6 +direct_artifact_ids: 7 +direct_artifact_ids: 8 +direct_artifact_ids: 9 +direct_artifact_ids: 10 +direct_artifact_ids: 11 +direct_artifact_ids: 12 +direct_artifact_ids: 13 +direct_artifact_ids: 14 +direct_artifact_ids: 15 +direct_artifact_ids: 16 +direct_artifact_ids: 17 +direct_artifact_ids: 18 +direct_artifact_ids: 19 +direct_artifact_ids: 20 +direct_artifact_ids: 21 +direct_artifact_ids: 22 +direct_artifact_ids: 23 +direct_artifact_ids: 24 +} +path_fragments { +id: 38 +label: "bazel-out" +} +path_fragments { +id: 37 +label: "darwin_arm64-fastbuild-ST-0a57218378ec" +parent_id: 38 +} +path_fragments { +id: 36 +label: "bin" +parent_id: 37 +} +path_fragments { +id: 35 +label: "external" +parent_id: 36 +} +path_fragments { +id: 34 +label: "rules_go+" +parent_id: 35 +} +path_fragments { +id: 33 +label: "stdlib_" +parent_id: 34 +} +path_fragments { +id: 32 +label: "pkg" +parent_id: 33 +} +artifacts { +id: 25 +path_fragment_id: 32 +is_tree_artifact: true +} +path_fragments { +id: 41 +label: "cmd" +} +path_fragments { +id: 40 +label: "aquerydiff" +parent_id: 41 +} +path_fragments { +id: 39 +label: "config.go" +parent_id: 40 +} +artifacts { +id: 26 +path_fragment_id: 39 +} +path_fragments { +id: 42 +label: "main.go" +parent_id: 40 +} +artifacts { +id: 27 +path_fragment_id: 42 +} +path_fragments { +id: 47 +label: "darwin_arm64-opt-exec-ST-d6cc8b84a7bb" +parent_id: 38 +} +path_fragments { +id: 46 +label: "bin" +parent_id: 47 +} +path_fragments { +id: 45 +label: "external" +parent_id: 46 +} +path_fragments { +id: 44 +label: "rules_go++go_sdk+main___download_0" +parent_id: 45 +} +path_fragments { +id: 43 +label: "packages.txt" +parent_id: 44 +} +artifacts { +id: 28 +path_fragment_id: 43 +} +path_fragments { +id: 49 +label: "pack_reset" +parent_id: 44 +} +path_fragments { +id: 48 +label: "pack.exe" +parent_id: 49 +} +artifacts { +id: 29 +path_fragment_id: 48 +} +path_fragments { +id: 54 +label: "darwin_arm64-fastbuild-ST-28c832439b7e" +parent_id: 38 +} +path_fragments { +id: 53 +label: "bin" +parent_id: 54 +} +path_fragments { +id: 52 +label: "pkg" +parent_id: 53 +} +path_fragments { +id: 51 +label: "action" +parent_id: 52 +} +path_fragments { +id: 50 +label: "action.x" +parent_id: 51 +} +artifacts { +id: 30 +path_fragment_id: 50 +} +path_fragments { +id: 56 +label: "protobuf" +parent_id: 52 +} +path_fragments { +id: 55 +label: "protobuf.x" +parent_id: 56 +} +artifacts { +id: 31 +path_fragment_id: 55 +} +path_fragments { +id: 58 +label: "report" +parent_id: 52 +} +path_fragments { +id: 57 +label: "report.x" +parent_id: 58 +} +artifacts { +id: 32 +path_fragment_id: 57 +} +path_fragments { +id: 64 +label: "external" +parent_id: 53 +} +path_fragments { +id: 63 +label: "build_stack_rules_proto++proto_repository+bazelapis" +parent_id: 64 +} +path_fragments { +id: 62 +label: "src" +parent_id: 63 +} +path_fragments { +id: 61 +label: "main" +parent_id: 62 +} +path_fragments { +id: 60 +label: "protobuf" +parent_id: 61 +} +path_fragments { +id: 59 +label: "analysis_v2_go_proto.x" +parent_id: 60 +} +artifacts { +id: 33 +path_fragment_id: 59 +} +dep_set_of_files { +id: 2 +transitive_dep_set_ids: 3 +transitive_dep_set_ids: 4 +direct_artifact_ids: 25 +direct_artifact_ids: 26 +direct_artifact_ids: 27 +direct_artifact_ids: 28 +direct_artifact_ids: 29 +direct_artifact_ids: 30 +direct_artifact_ids: 31 +direct_artifact_ids: 32 +direct_artifact_ids: 33 +} +path_fragments { +id: 66 +label: "builder_reset" +parent_id: 44 +} +path_fragments { +id: 65 +label: "builder" +parent_id: 66 +} +artifacts { +id: 34 +path_fragment_id: 65 +} +dep_set_of_files { +id: 1 +transitive_dep_set_ids: 2 +direct_artifact_ids: 34 +} +path_fragments { +id: 69 +label: "cmd" +parent_id: 53 +} +path_fragments { +id: 68 +label: "aquerydiff" +parent_id: 69 +} +path_fragments { +id: 67 +label: "aquerydiff_linux_amd64.a" +parent_id: 68 +} +artifacts { +id: 35 +path_fragment_id: 67 +} +path_fragments { +id: 70 +label: "aquerydiff_linux_amd64.x" +parent_id: 68 +} +artifacts { +id: 36 +path_fragment_id: 70 +} +actions { +target_id: 1 +action_key: "4ebca3b43f2594f05cf5f615259fa91bb8bf517e79097308642dea529f9ba2f9" +mnemonic: "GoCompilePkg" +configuration_id: 1 +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/builder_reset/builder" +arguments: "compilepkg" +arguments: "-sdk" +arguments: "external/rules_go++go_sdk+main___download_0" +arguments: "-goroot" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-0a57218378ec/bin/external/rules_go+/stdlib_" +arguments: "-installsuffix" +arguments: "linux_amd64" +arguments: "-src" +arguments: "cmd/aquerydiff/config.go" +arguments: "-src" +arguments: "cmd/aquerydiff/main.go" +arguments: "-arc" +arguments: "github.com/stackb/bazel-aquery-differ/pkg/action=github.com/stackb/bazel-aquery-differ/pkg/action=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/action/action.x" +arguments: "-arc" +arguments: "github.com/stackb/bazel-aquery-differ/pkg/protobuf=github.com/stackb/bazel-aquery-differ/pkg/protobuf=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/protobuf/protobuf.x" +arguments: "-arc" +arguments: "github.com/stackb/bazel-aquery-differ/pkg/report=github.com/stackb/bazel-aquery-differ/pkg/report=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/report/report.x" +arguments: "-arc" +arguments: "github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2=github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/build_stack_rules_proto++proto_repository+bazelapis/src/main/protobuf/analysis_v2_go_proto.x" +arguments: "-importpath" +arguments: "github.com/stackb/bazel-aquery-differ/cmd/aquerydiff" +arguments: "-p" +arguments: "main" +arguments: "-package_list" +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/packages.txt" +arguments: "-pack" +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/pack_reset/pack.exe" +arguments: "-embedroot" +arguments: "" +arguments: "-embedroot" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin" +arguments: "-embedlookupdir" +arguments: "cmd/aquerydiff" +arguments: "-lo" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/cmd/aquerydiff/aquerydiff_linux_amd64.a" +arguments: "-o" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/cmd/aquerydiff/aquerydiff_linux_amd64.x" +arguments: "-gcflags" +arguments: "" +environment_variables { + key: "GOARCH" + value: "amd64" +} +environment_variables { + key: "GOOS" + value: "linux" +} +environment_variables { + key: "GOEXPERIMENT" +} +environment_variables { + key: "GOROOT_FINAL" + value: "GOROOT" +} +environment_variables { + key: "CGO_ENABLED" + value: "0" +} +environment_variables { + key: "GOPATH" +} +environment_variables { + key: "GOTOOLCHAIN" + value: "local" +} +environment_variables { + key: "GODEBUG" + value: "winsymlink=0" +} +input_dep_set_ids: 1 +output_ids: 35 +output_ids: 36 +execution_info { + key: "supports-path-mapping" + value: "1" +} +primary_output_id: 35 +execution_platform: "@@platforms//host:host" +} +path_fragments { +id: 74 +label: "gazelle++go_deps+org_golang_google_protobuf" +parent_id: 64 +} +path_fragments { +id: 73 +label: "internal" +parent_id: 74 +} +path_fragments { +id: 72 +label: "detrand" +parent_id: 73 +} +path_fragments { +id: 71 +label: "detrand.a" +parent_id: 72 +} +artifacts { +id: 37 +path_fragment_id: 71 +} +path_fragments { +id: 76 +label: "errors" +parent_id: 73 +} +path_fragments { +id: 75 +label: "errors.a" +parent_id: 76 +} +artifacts { +id: 38 +path_fragment_id: 75 +} +path_fragments { +id: 79 +label: "encoding" +parent_id: 74 +} +path_fragments { +id: 78 +label: "protowire" +parent_id: 79 +} +path_fragments { +id: 77 +label: "protowire.a" +parent_id: 78 +} +artifacts { +id: 39 +path_fragment_id: 77 +} +path_fragments { +id: 81 +label: "flags" +parent_id: 73 +} +path_fragments { +id: 80 +label: "flags.a" +parent_id: 81 +} +artifacts { +id: 40 +path_fragment_id: 80 +} +path_fragments { +id: 83 +label: "pragma" +parent_id: 73 +} +path_fragments { +id: 82 +label: "pragma.a" +parent_id: 83 +} +artifacts { +id: 41 +path_fragment_id: 82 +} +path_fragments { +id: 86 +label: "reflect" +parent_id: 74 +} +path_fragments { +id: 85 +label: "protoreflect" +parent_id: 86 +} +path_fragments { +id: 84 +label: "protoreflect.a" +parent_id: 85 +} +artifacts { +id: 42 +path_fragment_id: 84 +} +path_fragments { +id: 88 +label: "strs" +parent_id: 73 +} +path_fragments { +id: 87 +label: "strs.a" +parent_id: 88 +} +artifacts { +id: 43 +path_fragment_id: 87 +} +path_fragments { +id: 91 +label: "encoding" +parent_id: 73 +} +path_fragments { +id: 90 +label: "json" +parent_id: 91 +} +path_fragments { +id: 89 +label: "json.a" +parent_id: 90 +} +artifacts { +id: 44 +path_fragment_id: 89 +} +path_fragments { +id: 93 +label: "messageset" +parent_id: 91 +} +path_fragments { +id: 92 +label: "messageset.a" +parent_id: 93 +} +artifacts { +id: 45 +path_fragment_id: 92 +} +path_fragments { +id: 95 +label: "descfmt" +parent_id: 73 +} +path_fragments { +id: 94 +label: "descfmt.a" +parent_id: 95 +} +artifacts { +id: 46 +path_fragment_id: 94 +} +path_fragments { +id: 97 +label: "descopts" +parent_id: 73 +} +path_fragments { +id: 96 +label: "descopts.a" +parent_id: 97 +} +artifacts { +id: 47 +path_fragment_id: 96 +} +path_fragments { +id: 99 +label: "editiondefaults" +parent_id: 73 +} +path_fragments { +id: 98 +label: "editiondefaults.a" +parent_id: 99 +} +artifacts { +id: 48 +path_fragment_id: 98 +} +path_fragments { +id: 101 +label: "text" +parent_id: 91 +} +path_fragments { +id: 100 +label: "text.a" +parent_id: 101 +} +artifacts { +id: 49 +path_fragment_id: 100 +} +path_fragments { +id: 103 +label: "defval" +parent_id: 91 +} +path_fragments { +id: 102 +label: "defval.a" +parent_id: 103 +} +artifacts { +id: 50 +path_fragment_id: 102 +} +path_fragments { +id: 105 +label: "genid" +parent_id: 73 +} +path_fragments { +id: 104 +label: "genid.a" +parent_id: 105 +} +artifacts { +id: 51 +path_fragment_id: 104 +} +path_fragments { +id: 107 +label: "order" +parent_id: 73 +} +path_fragments { +id: 106 +label: "order.a" +parent_id: 107 +} +artifacts { +id: 52 +path_fragment_id: 106 +} +path_fragments { +id: 109 +label: "protoregistry" +parent_id: 86 +} +path_fragments { +id: 108 +label: "protoregistry.a" +parent_id: 109 +} +artifacts { +id: 53 +path_fragment_id: 108 +} +path_fragments { +id: 112 +label: "runtime" +parent_id: 74 +} +path_fragments { +id: 111 +label: "protoiface" +parent_id: 112 +} +path_fragments { +id: 110 +label: "protoiface.a" +parent_id: 111 +} +artifacts { +id: 54 +path_fragment_id: 110 +} +path_fragments { +id: 114 +label: "proto" +parent_id: 74 +} +path_fragments { +id: 113 +label: "proto.a" +parent_id: 114 +} +artifacts { +id: 55 +path_fragment_id: 113 +} +path_fragments { +id: 116 +label: "filedesc" +parent_id: 73 +} +path_fragments { +id: 115 +label: "filedesc.a" +parent_id: 116 +} +artifacts { +id: 56 +path_fragment_id: 115 +} +path_fragments { +id: 118 +label: "set" +parent_id: 73 +} +path_fragments { +id: 117 +label: "set.a" +parent_id: 118 +} +artifacts { +id: 57 +path_fragment_id: 117 +} +path_fragments { +id: 120 +label: "protojson" +parent_id: 79 +} +path_fragments { +id: 119 +label: "protojson.a" +parent_id: 120 +} +artifacts { +id: 58 +path_fragment_id: 119 +} +path_fragments { +id: 122 +label: "prototext" +parent_id: 79 +} +path_fragments { +id: 121 +label: "prototext.a" +parent_id: 122 +} +artifacts { +id: 59 +path_fragment_id: 121 +} +path_fragments { +id: 124 +label: "tag" +parent_id: 91 +} +path_fragments { +id: 123 +label: "tag.a" +parent_id: 124 +} +artifacts { +id: 60 +path_fragment_id: 123 +} +path_fragments { +id: 126 +label: "protolazy" +parent_id: 73 +} +path_fragments { +id: 125 +label: "protolazy.a" +parent_id: 126 +} +artifacts { +id: 61 +path_fragment_id: 125 +} +path_fragments { +id: 128 +label: "impl" +parent_id: 73 +} +path_fragments { +id: 127 +label: "impl.a" +parent_id: 128 +} +artifacts { +id: 62 +path_fragment_id: 127 +} +path_fragments { +id: 130 +label: "filetype" +parent_id: 73 +} +path_fragments { +id: 129 +label: "filetype.a" +parent_id: 130 +} +artifacts { +id: 63 +path_fragment_id: 129 +} +path_fragments { +id: 132 +label: "version" +parent_id: 73 +} +path_fragments { +id: 131 +label: "version.a" +parent_id: 132 +} +artifacts { +id: 64 +path_fragment_id: 131 +} +path_fragments { +id: 134 +label: "protoimpl" +parent_id: 112 +} +path_fragments { +id: 133 +label: "protoimpl.a" +parent_id: 134 +} +artifacts { +id: 65 +path_fragment_id: 133 +} +path_fragments { +id: 135 +label: "stardoc_output_go_proto.a" +parent_id: 60 +} +artifacts { +id: 66 +path_fragment_id: 135 +} +path_fragments { +id: 136 +label: "build_go_proto.a" +parent_id: 60 +} +artifacts { +id: 67 +path_fragment_id: 136 +} +path_fragments { +id: 137 +label: "analysis_v2_go_proto.a" +parent_id: 60 +} +artifacts { +id: 68 +path_fragment_id: 137 +} +path_fragments { +id: 143 +label: "build" +parent_id: 53 +} +path_fragments { +id: 142 +label: "stack" +parent_id: 143 +} +path_fragments { +id: 141 +label: "bazel" +parent_id: 142 +} +path_fragments { +id: 140 +label: "aquery" +parent_id: 141 +} +path_fragments { +id: 139 +label: "differ" +parent_id: 140 +} +path_fragments { +id: 138 +label: "differ.a" +parent_id: 139 +} +artifacts { +id: 69 +path_fragment_id: 138 +} +path_fragments { +id: 145 +label: "pathfragment" +parent_id: 52 +} +path_fragments { +id: 144 +label: "pathfragment.a" +parent_id: 145 +} +artifacts { +id: 70 +path_fragment_id: 144 +} +path_fragments { +id: 147 +label: "artifact" +parent_id: 52 +} +path_fragments { +id: 146 +label: "artifact.a" +parent_id: 147 +} +artifacts { +id: 71 +path_fragment_id: 146 +} +path_fragments { +id: 149 +label: "depset" +parent_id: 52 +} +path_fragments { +id: 148 +label: "depset.a" +parent_id: 149 +} +artifacts { +id: 72 +path_fragment_id: 148 +} +path_fragments { +id: 150 +label: "protobuf.a" +parent_id: 56 +} +artifacts { +id: 73 +path_fragment_id: 150 +} +path_fragments { +id: 152 +label: "target" +parent_id: 52 +} +path_fragments { +id: 151 +label: "target.a" +parent_id: 152 +} +artifacts { +id: 74 +path_fragment_id: 151 +} +path_fragments { +id: 157 +label: "gazelle++go_deps+com_github_google_go_cmp" +parent_id: 64 +} +path_fragments { +id: 156 +label: "cmp" +parent_id: 157 +} +path_fragments { +id: 155 +label: "internal" +parent_id: 156 +} +path_fragments { +id: 154 +label: "flags" +parent_id: 155 +} +path_fragments { +id: 153 +label: "flags.a" +parent_id: 154 +} +artifacts { +id: 75 +path_fragment_id: 153 +} +path_fragments { +id: 159 +label: "diff" +parent_id: 155 +} +path_fragments { +id: 158 +label: "diff.a" +parent_id: 159 +} +artifacts { +id: 76 +path_fragment_id: 158 +} +path_fragments { +id: 161 +label: "function" +parent_id: 155 +} +path_fragments { +id: 160 +label: "function.a" +parent_id: 161 +} +artifacts { +id: 77 +path_fragment_id: 160 +} +path_fragments { +id: 163 +label: "value" +parent_id: 155 +} +path_fragments { +id: 162 +label: "value.a" +parent_id: 163 +} +artifacts { +id: 78 +path_fragment_id: 162 +} +path_fragments { +id: 164 +label: "cmp.a" +parent_id: 156 +} +artifacts { +id: 79 +path_fragment_id: 164 +} +path_fragments { +id: 166 +label: "cmpopts" +parent_id: 156 +} +path_fragments { +id: 165 +label: "cmpopts.a" +parent_id: 166 +} +artifacts { +id: 80 +path_fragment_id: 165 +} +path_fragments { +id: 169 +label: "gazelle++go_deps+com_github_hexops_gotextdiff" +parent_id: 64 +} +path_fragments { +id: 168 +label: "span" +parent_id: 169 +} +path_fragments { +id: 167 +label: "span.a" +parent_id: 168 +} +artifacts { +id: 81 +path_fragment_id: 167 +} +path_fragments { +id: 170 +label: "gotextdiff.a" +parent_id: 169 +} +artifacts { +id: 82 +path_fragment_id: 170 +} +path_fragments { +id: 172 +label: "myers" +parent_id: 169 +} +path_fragments { +id: 171 +label: "myers.a" +parent_id: 172 +} +artifacts { +id: 83 +path_fragment_id: 171 +} +path_fragments { +id: 173 +label: "action.a" +parent_id: 51 +} +artifacts { +id: 84 +path_fragment_id: 173 +} +path_fragments { +id: 174 +label: "report.a" +parent_id: 58 +} +artifacts { +id: 85 +path_fragment_id: 174 +} +dep_set_of_files { +id: 6 +direct_artifact_ids: 37 +direct_artifact_ids: 38 +direct_artifact_ids: 39 +direct_artifact_ids: 40 +direct_artifact_ids: 41 +direct_artifact_ids: 42 +direct_artifact_ids: 43 +direct_artifact_ids: 44 +direct_artifact_ids: 45 +direct_artifact_ids: 46 +direct_artifact_ids: 47 +direct_artifact_ids: 48 +direct_artifact_ids: 49 +direct_artifact_ids: 50 +direct_artifact_ids: 51 +direct_artifact_ids: 52 +direct_artifact_ids: 53 +direct_artifact_ids: 54 +direct_artifact_ids: 55 +direct_artifact_ids: 56 +direct_artifact_ids: 57 +direct_artifact_ids: 58 +direct_artifact_ids: 59 +direct_artifact_ids: 60 +direct_artifact_ids: 61 +direct_artifact_ids: 62 +direct_artifact_ids: 63 +direct_artifact_ids: 64 +direct_artifact_ids: 65 +direct_artifact_ids: 66 +direct_artifact_ids: 67 +direct_artifact_ids: 68 +direct_artifact_ids: 69 +direct_artifact_ids: 70 +direct_artifact_ids: 71 +direct_artifact_ids: 72 +direct_artifact_ids: 73 +direct_artifact_ids: 74 +direct_artifact_ids: 75 +direct_artifact_ids: 76 +direct_artifact_ids: 77 +direct_artifact_ids: 78 +direct_artifact_ids: 79 +direct_artifact_ids: 80 +direct_artifact_ids: 81 +direct_artifact_ids: 82 +direct_artifact_ids: 83 +direct_artifact_ids: 84 +direct_artifact_ids: 85 +direct_artifact_ids: 35 +direct_artifact_ids: 5 +direct_artifact_ids: 6 +direct_artifact_ids: 7 +direct_artifact_ids: 8 +direct_artifact_ids: 9 +direct_artifact_ids: 10 +direct_artifact_ids: 11 +direct_artifact_ids: 12 +direct_artifact_ids: 13 +direct_artifact_ids: 14 +direct_artifact_ids: 15 +direct_artifact_ids: 16 +direct_artifact_ids: 17 +direct_artifact_ids: 18 +direct_artifact_ids: 19 +direct_artifact_ids: 20 +direct_artifact_ids: 21 +direct_artifact_ids: 22 +direct_artifact_ids: 23 +direct_artifact_ids: 24 +direct_artifact_ids: 25 +direct_artifact_ids: 28 +} +dep_set_of_files { +id: 5 +transitive_dep_set_ids: 6 +direct_artifact_ids: 34 +} +path_fragments { +id: 176 +label: "aquerydiff_linux_amd64_" +parent_id: 68 +} +path_fragments { +id: 175 +label: "aquerydiff_linux_amd64" +parent_id: 176 +} +artifacts { +id: 86 +path_fragment_id: 175 +} +actions { +target_id: 1 +action_key: "5801836c97e6927e0cadce2f1aa4d79379d971337e6f667b366f3d6580518d9e" +mnemonic: "GoLink" +configuration_id: 1 +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/builder_reset/builder" +arguments: "link" +arguments: "-sdk" +arguments: "external/rules_go++go_sdk+main___download_0" +arguments: "-goroot" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-0a57218378ec/bin/external/rules_go+/stdlib_" +arguments: "-installsuffix" +arguments: "linux_amd64" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/detrand:detrand=google.golang.org/protobuf/internal/detrand=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/detrand/detrand.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/errors:errors=google.golang.org/protobuf/internal/errors=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/errors/errors.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//encoding/protowire:protowire=google.golang.org/protobuf/encoding/protowire=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/encoding/protowire/protowire.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/flags:flags=google.golang.org/protobuf/internal/flags=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/flags/flags.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/pragma:pragma=google.golang.org/protobuf/internal/pragma=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/pragma/pragma.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//reflect/protoreflect:protoreflect=google.golang.org/protobuf/reflect/protoreflect=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/reflect/protoreflect/protoreflect.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/strs:strs=google.golang.org/protobuf/internal/strs=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/strs/strs.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/json:json=google.golang.org/protobuf/internal/encoding/json=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/json/json.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/messageset:messageset=google.golang.org/protobuf/internal/encoding/messageset=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/messageset/messageset.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/descfmt:descfmt=google.golang.org/protobuf/internal/descfmt=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/descfmt/descfmt.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/descopts:descopts=google.golang.org/protobuf/internal/descopts=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/descopts/descopts.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/editiondefaults:editiondefaults=google.golang.org/protobuf/internal/editiondefaults=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/editiondefaults/editiondefaults.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/text:text=google.golang.org/protobuf/internal/encoding/text=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/text/text.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/defval:defval=google.golang.org/protobuf/internal/encoding/defval=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/defval/defval.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/genid:genid=google.golang.org/protobuf/internal/genid=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/genid/genid.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/order:order=google.golang.org/protobuf/internal/order=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/order/order.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//reflect/protoregistry:protoregistry=google.golang.org/protobuf/reflect/protoregistry=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/reflect/protoregistry/protoregistry.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//runtime/protoiface:protoiface=google.golang.org/protobuf/runtime/protoiface=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/runtime/protoiface/protoiface.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//proto:proto=google.golang.org/protobuf/proto=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/proto/proto.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/filedesc:filedesc=google.golang.org/protobuf/internal/filedesc=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/filedesc/filedesc.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/set:set=google.golang.org/protobuf/internal/set=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/set/set.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//encoding/protojson:protojson=google.golang.org/protobuf/encoding/protojson=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/encoding/protojson/protojson.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//encoding/prototext:prototext=google.golang.org/protobuf/encoding/prototext=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/encoding/prototext/prototext.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/tag:tag=google.golang.org/protobuf/internal/encoding/tag=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/tag/tag.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/protolazy:protolazy=google.golang.org/protobuf/internal/protolazy=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/protolazy/protolazy.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/impl:impl=google.golang.org/protobuf/internal/impl=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/impl/impl.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/filetype:filetype=google.golang.org/protobuf/internal/filetype=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/filetype/filetype.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/version:version=google.golang.org/protobuf/internal/version=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/version/version.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//runtime/protoimpl:protoimpl=google.golang.org/protobuf/runtime/protoimpl=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+org_golang_google_protobuf/runtime/protoimpl/protoimpl.a" +arguments: "-arc" +arguments: "@@build_stack_rules_proto++proto_repository+bazelapis//src/main/protobuf:stardoc_output_go_proto=github.com/bazelbuild/bazel/src/main/protobuf/stardoc_output=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/build_stack_rules_proto++proto_repository+bazelapis/src/main/protobuf/stardoc_output_go_proto.a" +arguments: "-arc" +arguments: "@@build_stack_rules_proto++proto_repository+bazelapis//src/main/protobuf:build_go_proto=github.com/bazelbuild/bazelapis/src/main/protobuf/build=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/build_stack_rules_proto++proto_repository+bazelapis/src/main/protobuf/build_go_proto.a" +arguments: "-arc" +arguments: "@@build_stack_rules_proto++proto_repository+bazelapis//src/main/protobuf:analysis_v2_go_proto=github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/build_stack_rules_proto++proto_repository+bazelapis/src/main/protobuf/analysis_v2_go_proto.a" +arguments: "-arc" +arguments: "@@//build/stack/bazel/aquery/differ:differ=github.com/stackb/bazel-aquery-differ/build/stack/bazel/aquery/differ=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/build/stack/bazel/aquery/differ/differ.a" +arguments: "-arc" +arguments: "@@//pkg/pathfragment:pathfragment=github.com/stackb/bazel-aquery-differ/pkg/pathfragment=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/pathfragment/pathfragment.a" +arguments: "-arc" +arguments: "@@//pkg/artifact:artifact=github.com/stackb/bazel-aquery-differ/pkg/artifact=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/artifact/artifact.a" +arguments: "-arc" +arguments: "@@//pkg/depset:depset=github.com/stackb/bazel-aquery-differ/pkg/depset=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/depset/depset.a" +arguments: "-arc" +arguments: "@@//pkg/protobuf:protobuf=github.com/stackb/bazel-aquery-differ/pkg/protobuf=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/protobuf/protobuf.a" +arguments: "-arc" +arguments: "@@//pkg/target:target=github.com/stackb/bazel-aquery-differ/pkg/target=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/target/target.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/internal/flags:flags=github.com/google/go-cmp/cmp/internal/flags=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/internal/flags/flags.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/internal/diff:diff=github.com/google/go-cmp/cmp/internal/diff=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/internal/diff/diff.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/internal/function:function=github.com/google/go-cmp/cmp/internal/function=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/internal/function/function.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/internal/value:value=github.com/google/go-cmp/cmp/internal/value=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/internal/value/value.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp:cmp=github.com/google/go-cmp/cmp=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/cmp.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/cmpopts:cmpopts=github.com/google/go-cmp/cmp/cmpopts=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/cmpopts/cmpopts.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_hexops_gotextdiff//span:span=github.com/hexops/gotextdiff/span=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_hexops_gotextdiff/span/span.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_hexops_gotextdiff//:gotextdiff=github.com/hexops/gotextdiff=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_hexops_gotextdiff/gotextdiff.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_hexops_gotextdiff//myers:myers=github.com/hexops/gotextdiff/myers=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/external/gazelle++go_deps+com_github_hexops_gotextdiff/myers/myers.a" +arguments: "-arc" +arguments: "@@//pkg/action:action=github.com/stackb/bazel-aquery-differ/pkg/action=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/action/action.a" +arguments: "-arc" +arguments: "@@//pkg/report:report=github.com/stackb/bazel-aquery-differ/pkg/report=bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/pkg/report/report.a" +arguments: "-package_list" +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/packages.txt" +arguments: "-o" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/cmd/aquerydiff/aquerydiff_linux_amd64_/aquerydiff_linux_amd64" +arguments: "-main" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-28c832439b7e/bin/cmd/aquerydiff/aquerydiff_linux_amd64.a" +arguments: "-p" +arguments: "github.com/stackb/bazel-aquery-differ/cmd/aquerydiff" +arguments: "--" +arguments: "-linkmode" +arguments: "internal" +arguments: "-s" +arguments: "-w" +arguments: "-buildid=redacted" +arguments: "-s" +arguments: "-w" +arguments: "-extldflags" +arguments: "-static" +environment_variables { + key: "GOARCH" + value: "amd64" +} +environment_variables { + key: "GOOS" + value: "linux" +} +environment_variables { + key: "GOEXPERIMENT" +} +environment_variables { + key: "GOROOT" + value: "bazel-out/darwin_arm64-fastbuild-ST-0a57218378ec/bin/external/rules_go+/stdlib_" +} +environment_variables { + key: "GOROOT_FINAL" + value: "GOROOT" +} +environment_variables { + key: "CGO_ENABLED" + value: "0" +} +environment_variables { + key: "GOPATH" +} +environment_variables { + key: "GOTOOLCHAIN" + value: "local" +} +environment_variables { + key: "GODEBUG" + value: "winsymlink=0" +} +input_dep_set_ids: 5 +output_ids: 86 +primary_output_id: 86 +execution_platform: "@@platforms//host:host" +} +path_fragments { +id: 177 +label: "aquerydiff_linux_amd64.repo_mapping" +parent_id: 176 +} +artifacts { +id: 87 +path_fragment_id: 177 +} +actions { +target_id: 1 +action_key: "caeefa8c9a27b325f1a4db4b78f6bef9264fc95ae32cd3e023650443df340e2b" +mnemonic: "RepoMappingManifest" +configuration_id: 1 +output_ids: 87 +primary_output_id: 87 +execution_platform: "@@platforms//host:host" +} +path_fragments { +id: 178 +label: "aquerydiff_linux_amd64.runfiles_manifest" +parent_id: 176 +} +artifacts { +id: 88 +path_fragment_id: 178 +} +actions { +target_id: 1 +action_key: "2ed97eb6f2f7c5f3c7d6b7387ea5b31419eba46c0a432f2fb550c2f4c0b85911" +mnemonic: "SourceSymlinkManifest" +configuration_id: 1 +output_ids: 88 +primary_output_id: 88 +execution_platform: "@@platforms//host:host" +} +dep_set_of_files { +id: 7 +direct_artifact_ids: 88 +} +path_fragments { +id: 180 +label: "aquerydiff_linux_amd64.runfiles" +parent_id: 176 +} +path_fragments { +id: 179 +label: "MANIFEST" +parent_id: 180 +} +artifacts { +id: 89 +path_fragment_id: 179 +} +actions { +target_id: 1 +action_key: "2acfeafbe09d892a6494ee4e4cc8ff9cf87b5306645f0cfc937d1be7e4d5fda2" +mnemonic: "SymlinkTree" +configuration_id: 1 +input_dep_set_ids: 7 +output_ids: 89 +primary_output_id: 89 +execution_platform: "@@platforms//host:host" +} +dep_set_of_files { +id: 8 +direct_artifact_ids: 86 +direct_artifact_ids: 89 +direct_artifact_ids: 87 +} +path_fragments { +id: 183 +label: "internal" +parent_id: 54 +} +path_fragments { +id: 182 +label: "_middlemen" +parent_id: 183 +} +path_fragments { +id: 181 +label: "cmd_Saquerydiff_Saquerydiff_Ulinux_Uamd64_U_Saquerydiff_Ulinux_Uamd64-runfiles" +parent_id: 182 +} +artifacts { +id: 90 +path_fragment_id: 181 +} +actions { +target_id: 1 +action_key: "709e80c88487a2411e1ee4dfb9f22a861492d20c4765150c0c794abd70f8147c" +mnemonic: "Middleman" +configuration_id: 1 +input_dep_set_ids: 8 +output_ids: 90 +primary_output_id: 90 +execution_platform: "@@platforms//host:host" +} diff --git a/examples/simple/before.textproto b/examples/simple/before.textproto new file mode 100644 index 0000000..26f0ea5 --- /dev/null +++ b/examples/simple/before.textproto @@ -0,0 +1,1841 @@ +rule_classes { +id: 1 +name: "go_binary" +} +targets { +id: 1 +label: "//cmd/aquerydiff:aquerydiff_darwin_amd64" +rule_class_id: 1 +} +configuration { +id: 1 +mnemonic: "darwin_arm64-fastbuild-ST-429f90df6b5d" +platform_name: "darwin_arm64" +checksum: "cdd13c6e945e04345180e5e5a8032419badf8239189beb14506d151600426049" +} +path_fragments { +id: 5 +label: "external" +} +path_fragments { +id: 4 +label: "rules_go++go_sdk+main___download_0" +parent_id: 5 +} +path_fragments { +id: 3 +label: "pkg" +parent_id: 4 +} +path_fragments { +id: 2 +label: "include" +parent_id: 3 +} +path_fragments { +id: 1 +label: "asm_amd64.h" +parent_id: 2 +} +artifacts { +id: 1 +path_fragment_id: 1 +} +path_fragments { +id: 6 +label: "asm_ppc64x.h" +parent_id: 2 +} +artifacts { +id: 2 +path_fragment_id: 6 +} +path_fragments { +id: 7 +label: "funcdata.h" +parent_id: 2 +} +artifacts { +id: 3 +path_fragment_id: 7 +} +path_fragments { +id: 8 +label: "textflag.h" +parent_id: 2 +} +artifacts { +id: 4 +path_fragment_id: 8 +} +dep_set_of_files { +id: 3 +direct_artifact_ids: 1 +direct_artifact_ids: 2 +direct_artifact_ids: 3 +direct_artifact_ids: 4 +} +path_fragments { +id: 10 +label: "bin" +parent_id: 4 +} +path_fragments { +id: 9 +label: "gofmt" +parent_id: 10 +} +artifacts { +id: 5 +path_fragment_id: 9 +} +path_fragments { +id: 13 +label: "tool" +parent_id: 3 +} +path_fragments { +id: 12 +label: "darwin_arm64" +parent_id: 13 +} +path_fragments { +id: 11 +label: "addr2line" +parent_id: 12 +} +artifacts { +id: 6 +path_fragment_id: 11 +} +path_fragments { +id: 14 +label: "asm" +parent_id: 12 +} +artifacts { +id: 7 +path_fragment_id: 14 +} +path_fragments { +id: 15 +label: "buildid" +parent_id: 12 +} +artifacts { +id: 8 +path_fragment_id: 15 +} +path_fragments { +id: 16 +label: "cgo" +parent_id: 12 +} +artifacts { +id: 9 +path_fragment_id: 16 +} +path_fragments { +id: 17 +label: "compile" +parent_id: 12 +} +artifacts { +id: 10 +path_fragment_id: 17 +} +path_fragments { +id: 18 +label: "covdata" +parent_id: 12 +} +artifacts { +id: 11 +path_fragment_id: 18 +} +path_fragments { +id: 19 +label: "cover" +parent_id: 12 +} +artifacts { +id: 12 +path_fragment_id: 19 +} +path_fragments { +id: 20 +label: "doc" +parent_id: 12 +} +artifacts { +id: 13 +path_fragment_id: 20 +} +path_fragments { +id: 21 +label: "fix" +parent_id: 12 +} +artifacts { +id: 14 +path_fragment_id: 21 +} +path_fragments { +id: 22 +label: "link" +parent_id: 12 +} +artifacts { +id: 15 +path_fragment_id: 22 +} +path_fragments { +id: 23 +label: "nm" +parent_id: 12 +} +artifacts { +id: 16 +path_fragment_id: 23 +} +path_fragments { +id: 24 +label: "objdump" +parent_id: 12 +} +artifacts { +id: 17 +path_fragment_id: 24 +} +path_fragments { +id: 25 +label: "pack" +parent_id: 12 +} +artifacts { +id: 18 +path_fragment_id: 25 +} +path_fragments { +id: 26 +label: "pprof" +parent_id: 12 +} +artifacts { +id: 19 +path_fragment_id: 26 +} +path_fragments { +id: 27 +label: "preprofile" +parent_id: 12 +} +artifacts { +id: 20 +path_fragment_id: 27 +} +path_fragments { +id: 28 +label: "test2json" +parent_id: 12 +} +artifacts { +id: 21 +path_fragment_id: 28 +} +path_fragments { +id: 29 +label: "trace" +parent_id: 12 +} +artifacts { +id: 22 +path_fragment_id: 29 +} +path_fragments { +id: 30 +label: "vet" +parent_id: 12 +} +artifacts { +id: 23 +path_fragment_id: 30 +} +path_fragments { +id: 31 +label: "go.env" +parent_id: 4 +} +artifacts { +id: 24 +path_fragment_id: 31 +} +dep_set_of_files { +id: 4 +direct_artifact_ids: 5 +direct_artifact_ids: 6 +direct_artifact_ids: 7 +direct_artifact_ids: 8 +direct_artifact_ids: 9 +direct_artifact_ids: 10 +direct_artifact_ids: 11 +direct_artifact_ids: 12 +direct_artifact_ids: 13 +direct_artifact_ids: 14 +direct_artifact_ids: 15 +direct_artifact_ids: 16 +direct_artifact_ids: 17 +direct_artifact_ids: 18 +direct_artifact_ids: 19 +direct_artifact_ids: 20 +direct_artifact_ids: 21 +direct_artifact_ids: 22 +direct_artifact_ids: 23 +direct_artifact_ids: 24 +} +path_fragments { +id: 38 +label: "bazel-out" +} +path_fragments { +id: 37 +label: "darwin_arm64-fastbuild-ST-ad4c399ec9e6" +parent_id: 38 +} +path_fragments { +id: 36 +label: "bin" +parent_id: 37 +} +path_fragments { +id: 35 +label: "external" +parent_id: 36 +} +path_fragments { +id: 34 +label: "rules_go+" +parent_id: 35 +} +path_fragments { +id: 33 +label: "stdlib_" +parent_id: 34 +} +path_fragments { +id: 32 +label: "pkg" +parent_id: 33 +} +artifacts { +id: 25 +path_fragment_id: 32 +is_tree_artifact: true +} +path_fragments { +id: 41 +label: "cmd" +} +path_fragments { +id: 40 +label: "aquerydiff" +parent_id: 41 +} +path_fragments { +id: 39 +label: "config.go" +parent_id: 40 +} +artifacts { +id: 26 +path_fragment_id: 39 +} +path_fragments { +id: 42 +label: "main.go" +parent_id: 40 +} +artifacts { +id: 27 +path_fragment_id: 42 +} +path_fragments { +id: 47 +label: "darwin_arm64-opt-exec-ST-d6cc8b84a7bb" +parent_id: 38 +} +path_fragments { +id: 46 +label: "bin" +parent_id: 47 +} +path_fragments { +id: 45 +label: "external" +parent_id: 46 +} +path_fragments { +id: 44 +label: "rules_go++go_sdk+main___download_0" +parent_id: 45 +} +path_fragments { +id: 43 +label: "packages.txt" +parent_id: 44 +} +artifacts { +id: 28 +path_fragment_id: 43 +} +path_fragments { +id: 49 +label: "pack_reset" +parent_id: 44 +} +path_fragments { +id: 48 +label: "pack.exe" +parent_id: 49 +} +artifacts { +id: 29 +path_fragment_id: 48 +} +path_fragments { +id: 54 +label: "darwin_arm64-fastbuild-ST-429f90df6b5d" +parent_id: 38 +} +path_fragments { +id: 53 +label: "bin" +parent_id: 54 +} +path_fragments { +id: 52 +label: "pkg" +parent_id: 53 +} +path_fragments { +id: 51 +label: "action" +parent_id: 52 +} +path_fragments { +id: 50 +label: "action.x" +parent_id: 51 +} +artifacts { +id: 30 +path_fragment_id: 50 +} +path_fragments { +id: 56 +label: "protobuf" +parent_id: 52 +} +path_fragments { +id: 55 +label: "protobuf.x" +parent_id: 56 +} +artifacts { +id: 31 +path_fragment_id: 55 +} +path_fragments { +id: 58 +label: "report" +parent_id: 52 +} +path_fragments { +id: 57 +label: "report.x" +parent_id: 58 +} +artifacts { +id: 32 +path_fragment_id: 57 +} +path_fragments { +id: 64 +label: "external" +parent_id: 53 +} +path_fragments { +id: 63 +label: "build_stack_rules_proto++proto_repository+bazelapis" +parent_id: 64 +} +path_fragments { +id: 62 +label: "src" +parent_id: 63 +} +path_fragments { +id: 61 +label: "main" +parent_id: 62 +} +path_fragments { +id: 60 +label: "protobuf" +parent_id: 61 +} +path_fragments { +id: 59 +label: "analysis_v2_go_proto.x" +parent_id: 60 +} +artifacts { +id: 33 +path_fragment_id: 59 +} +dep_set_of_files { +id: 2 +transitive_dep_set_ids: 3 +transitive_dep_set_ids: 4 +direct_artifact_ids: 25 +direct_artifact_ids: 26 +direct_artifact_ids: 27 +direct_artifact_ids: 28 +direct_artifact_ids: 29 +direct_artifact_ids: 30 +direct_artifact_ids: 31 +direct_artifact_ids: 32 +direct_artifact_ids: 33 +} +path_fragments { +id: 66 +label: "builder_reset" +parent_id: 44 +} +path_fragments { +id: 65 +label: "builder" +parent_id: 66 +} +artifacts { +id: 34 +path_fragment_id: 65 +} +dep_set_of_files { +id: 1 +transitive_dep_set_ids: 2 +direct_artifact_ids: 34 +} +path_fragments { +id: 69 +label: "cmd" +parent_id: 53 +} +path_fragments { +id: 68 +label: "aquerydiff" +parent_id: 69 +} +path_fragments { +id: 67 +label: "aquerydiff_darwin_amd64.a" +parent_id: 68 +} +artifacts { +id: 35 +path_fragment_id: 67 +} +path_fragments { +id: 70 +label: "aquerydiff_darwin_amd64.x" +parent_id: 68 +} +artifacts { +id: 36 +path_fragment_id: 70 +} +actions { +target_id: 1 +action_key: "a978026c38e76634174cad8859c8753352b1b2718cc3beae838b7139d8d94818" +mnemonic: "GoCompilePkg" +configuration_id: 1 +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/builder_reset/builder" +arguments: "compilepkg" +arguments: "-sdk" +arguments: "external/rules_go++go_sdk+main___download_0" +arguments: "-goroot" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-ad4c399ec9e6/bin/external/rules_go+/stdlib_" +arguments: "-installsuffix" +arguments: "darwin_amd64" +arguments: "-src" +arguments: "cmd/aquerydiff/config.go" +arguments: "-src" +arguments: "cmd/aquerydiff/main.go" +arguments: "-arc" +arguments: "github.com/stackb/bazel-aquery-differ/pkg/action=github.com/stackb/bazel-aquery-differ/pkg/action=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/action/action.x" +arguments: "-arc" +arguments: "github.com/stackb/bazel-aquery-differ/pkg/protobuf=github.com/stackb/bazel-aquery-differ/pkg/protobuf=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/protobuf/protobuf.x" +arguments: "-arc" +arguments: "github.com/stackb/bazel-aquery-differ/pkg/report=github.com/stackb/bazel-aquery-differ/pkg/report=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/report/report.x" +arguments: "-arc" +arguments: "github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2=github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/build_stack_rules_proto++proto_repository+bazelapis/src/main/protobuf/analysis_v2_go_proto.x" +arguments: "-importpath" +arguments: "github.com/stackb/bazel-aquery-differ/cmd/aquerydiff" +arguments: "-p" +arguments: "main" +arguments: "-package_list" +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/packages.txt" +arguments: "-pack" +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/pack_reset/pack.exe" +arguments: "-embedroot" +arguments: "" +arguments: "-embedroot" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin" +arguments: "-embedlookupdir" +arguments: "cmd/aquerydiff" +arguments: "-lo" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/cmd/aquerydiff/aquerydiff_darwin_amd64.a" +arguments: "-o" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/cmd/aquerydiff/aquerydiff_darwin_amd64.x" +arguments: "-gcflags" +arguments: "" +environment_variables { + key: "GOARCH" + value: "amd64" +} +environment_variables { + key: "GOOS" + value: "darwin" +} +environment_variables { + key: "GOEXPERIMENT" +} +environment_variables { + key: "GOROOT_FINAL" + value: "GOROOT" +} +environment_variables { + key: "CGO_ENABLED" + value: "0" +} +environment_variables { + key: "GOPATH" +} +environment_variables { + key: "GOTOOLCHAIN" + value: "local" +} +environment_variables { + key: "GODEBUG" + value: "winsymlink=0" +} +environment_variables { + key: "XCODE_VERSION_OVERRIDE" + value: "26.0.0.17A324" +} +environment_variables { + key: "APPLE_SDK_VERSION_OVERRIDE" + value: "26.0" +} +environment_variables { + key: "APPLE_SDK_PLATFORM" + value: "MacOSX" +} +environment_variables { + key: "ZERO_AR_DATE" + value: "1" +} +environment_variables { + key: "RELATIVE_AST_PATH" + value: "true" +} +environment_variables { + key: "PATH" + value: "external/apple_support++apple_cc_configure_extension+local_config_apple_cc:/bin:/usr/bin" +} +input_dep_set_ids: 1 +output_ids: 35 +output_ids: 36 +execution_info { + key: "supports-path-mapping" + value: "1" +} +primary_output_id: 35 +execution_platform: "@@platforms//host:host" +} +path_fragments { +id: 74 +label: "gazelle++go_deps+org_golang_google_protobuf" +parent_id: 64 +} +path_fragments { +id: 73 +label: "internal" +parent_id: 74 +} +path_fragments { +id: 72 +label: "detrand" +parent_id: 73 +} +path_fragments { +id: 71 +label: "detrand.a" +parent_id: 72 +} +artifacts { +id: 37 +path_fragment_id: 71 +} +path_fragments { +id: 76 +label: "errors" +parent_id: 73 +} +path_fragments { +id: 75 +label: "errors.a" +parent_id: 76 +} +artifacts { +id: 38 +path_fragment_id: 75 +} +path_fragments { +id: 79 +label: "encoding" +parent_id: 74 +} +path_fragments { +id: 78 +label: "protowire" +parent_id: 79 +} +path_fragments { +id: 77 +label: "protowire.a" +parent_id: 78 +} +artifacts { +id: 39 +path_fragment_id: 77 +} +path_fragments { +id: 81 +label: "flags" +parent_id: 73 +} +path_fragments { +id: 80 +label: "flags.a" +parent_id: 81 +} +artifacts { +id: 40 +path_fragment_id: 80 +} +path_fragments { +id: 83 +label: "pragma" +parent_id: 73 +} +path_fragments { +id: 82 +label: "pragma.a" +parent_id: 83 +} +artifacts { +id: 41 +path_fragment_id: 82 +} +path_fragments { +id: 86 +label: "reflect" +parent_id: 74 +} +path_fragments { +id: 85 +label: "protoreflect" +parent_id: 86 +} +path_fragments { +id: 84 +label: "protoreflect.a" +parent_id: 85 +} +artifacts { +id: 42 +path_fragment_id: 84 +} +path_fragments { +id: 88 +label: "strs" +parent_id: 73 +} +path_fragments { +id: 87 +label: "strs.a" +parent_id: 88 +} +artifacts { +id: 43 +path_fragment_id: 87 +} +path_fragments { +id: 91 +label: "encoding" +parent_id: 73 +} +path_fragments { +id: 90 +label: "json" +parent_id: 91 +} +path_fragments { +id: 89 +label: "json.a" +parent_id: 90 +} +artifacts { +id: 44 +path_fragment_id: 89 +} +path_fragments { +id: 93 +label: "messageset" +parent_id: 91 +} +path_fragments { +id: 92 +label: "messageset.a" +parent_id: 93 +} +artifacts { +id: 45 +path_fragment_id: 92 +} +path_fragments { +id: 95 +label: "descfmt" +parent_id: 73 +} +path_fragments { +id: 94 +label: "descfmt.a" +parent_id: 95 +} +artifacts { +id: 46 +path_fragment_id: 94 +} +path_fragments { +id: 97 +label: "descopts" +parent_id: 73 +} +path_fragments { +id: 96 +label: "descopts.a" +parent_id: 97 +} +artifacts { +id: 47 +path_fragment_id: 96 +} +path_fragments { +id: 99 +label: "editiondefaults" +parent_id: 73 +} +path_fragments { +id: 98 +label: "editiondefaults.a" +parent_id: 99 +} +artifacts { +id: 48 +path_fragment_id: 98 +} +path_fragments { +id: 101 +label: "text" +parent_id: 91 +} +path_fragments { +id: 100 +label: "text.a" +parent_id: 101 +} +artifacts { +id: 49 +path_fragment_id: 100 +} +path_fragments { +id: 103 +label: "defval" +parent_id: 91 +} +path_fragments { +id: 102 +label: "defval.a" +parent_id: 103 +} +artifacts { +id: 50 +path_fragment_id: 102 +} +path_fragments { +id: 105 +label: "genid" +parent_id: 73 +} +path_fragments { +id: 104 +label: "genid.a" +parent_id: 105 +} +artifacts { +id: 51 +path_fragment_id: 104 +} +path_fragments { +id: 107 +label: "order" +parent_id: 73 +} +path_fragments { +id: 106 +label: "order.a" +parent_id: 107 +} +artifacts { +id: 52 +path_fragment_id: 106 +} +path_fragments { +id: 109 +label: "protoregistry" +parent_id: 86 +} +path_fragments { +id: 108 +label: "protoregistry.a" +parent_id: 109 +} +artifacts { +id: 53 +path_fragment_id: 108 +} +path_fragments { +id: 112 +label: "runtime" +parent_id: 74 +} +path_fragments { +id: 111 +label: "protoiface" +parent_id: 112 +} +path_fragments { +id: 110 +label: "protoiface.a" +parent_id: 111 +} +artifacts { +id: 54 +path_fragment_id: 110 +} +path_fragments { +id: 114 +label: "proto" +parent_id: 74 +} +path_fragments { +id: 113 +label: "proto.a" +parent_id: 114 +} +artifacts { +id: 55 +path_fragment_id: 113 +} +path_fragments { +id: 116 +label: "filedesc" +parent_id: 73 +} +path_fragments { +id: 115 +label: "filedesc.a" +parent_id: 116 +} +artifacts { +id: 56 +path_fragment_id: 115 +} +path_fragments { +id: 118 +label: "set" +parent_id: 73 +} +path_fragments { +id: 117 +label: "set.a" +parent_id: 118 +} +artifacts { +id: 57 +path_fragment_id: 117 +} +path_fragments { +id: 120 +label: "protojson" +parent_id: 79 +} +path_fragments { +id: 119 +label: "protojson.a" +parent_id: 120 +} +artifacts { +id: 58 +path_fragment_id: 119 +} +path_fragments { +id: 122 +label: "prototext" +parent_id: 79 +} +path_fragments { +id: 121 +label: "prototext.a" +parent_id: 122 +} +artifacts { +id: 59 +path_fragment_id: 121 +} +path_fragments { +id: 124 +label: "tag" +parent_id: 91 +} +path_fragments { +id: 123 +label: "tag.a" +parent_id: 124 +} +artifacts { +id: 60 +path_fragment_id: 123 +} +path_fragments { +id: 126 +label: "protolazy" +parent_id: 73 +} +path_fragments { +id: 125 +label: "protolazy.a" +parent_id: 126 +} +artifacts { +id: 61 +path_fragment_id: 125 +} +path_fragments { +id: 128 +label: "impl" +parent_id: 73 +} +path_fragments { +id: 127 +label: "impl.a" +parent_id: 128 +} +artifacts { +id: 62 +path_fragment_id: 127 +} +path_fragments { +id: 130 +label: "filetype" +parent_id: 73 +} +path_fragments { +id: 129 +label: "filetype.a" +parent_id: 130 +} +artifacts { +id: 63 +path_fragment_id: 129 +} +path_fragments { +id: 132 +label: "version" +parent_id: 73 +} +path_fragments { +id: 131 +label: "version.a" +parent_id: 132 +} +artifacts { +id: 64 +path_fragment_id: 131 +} +path_fragments { +id: 134 +label: "protoimpl" +parent_id: 112 +} +path_fragments { +id: 133 +label: "protoimpl.a" +parent_id: 134 +} +artifacts { +id: 65 +path_fragment_id: 133 +} +path_fragments { +id: 135 +label: "stardoc_output_go_proto.a" +parent_id: 60 +} +artifacts { +id: 66 +path_fragment_id: 135 +} +path_fragments { +id: 136 +label: "build_go_proto.a" +parent_id: 60 +} +artifacts { +id: 67 +path_fragment_id: 136 +} +path_fragments { +id: 137 +label: "analysis_v2_go_proto.a" +parent_id: 60 +} +artifacts { +id: 68 +path_fragment_id: 137 +} +path_fragments { +id: 143 +label: "build" +parent_id: 53 +} +path_fragments { +id: 142 +label: "stack" +parent_id: 143 +} +path_fragments { +id: 141 +label: "bazel" +parent_id: 142 +} +path_fragments { +id: 140 +label: "aquery" +parent_id: 141 +} +path_fragments { +id: 139 +label: "differ" +parent_id: 140 +} +path_fragments { +id: 138 +label: "differ.a" +parent_id: 139 +} +artifacts { +id: 69 +path_fragment_id: 138 +} +path_fragments { +id: 145 +label: "pathfragment" +parent_id: 52 +} +path_fragments { +id: 144 +label: "pathfragment.a" +parent_id: 145 +} +artifacts { +id: 70 +path_fragment_id: 144 +} +path_fragments { +id: 147 +label: "artifact" +parent_id: 52 +} +path_fragments { +id: 146 +label: "artifact.a" +parent_id: 147 +} +artifacts { +id: 71 +path_fragment_id: 146 +} +path_fragments { +id: 149 +label: "depset" +parent_id: 52 +} +path_fragments { +id: 148 +label: "depset.a" +parent_id: 149 +} +artifacts { +id: 72 +path_fragment_id: 148 +} +path_fragments { +id: 150 +label: "protobuf.a" +parent_id: 56 +} +artifacts { +id: 73 +path_fragment_id: 150 +} +path_fragments { +id: 152 +label: "target" +parent_id: 52 +} +path_fragments { +id: 151 +label: "target.a" +parent_id: 152 +} +artifacts { +id: 74 +path_fragment_id: 151 +} +path_fragments { +id: 157 +label: "gazelle++go_deps+com_github_google_go_cmp" +parent_id: 64 +} +path_fragments { +id: 156 +label: "cmp" +parent_id: 157 +} +path_fragments { +id: 155 +label: "internal" +parent_id: 156 +} +path_fragments { +id: 154 +label: "flags" +parent_id: 155 +} +path_fragments { +id: 153 +label: "flags.a" +parent_id: 154 +} +artifacts { +id: 75 +path_fragment_id: 153 +} +path_fragments { +id: 159 +label: "diff" +parent_id: 155 +} +path_fragments { +id: 158 +label: "diff.a" +parent_id: 159 +} +artifacts { +id: 76 +path_fragment_id: 158 +} +path_fragments { +id: 161 +label: "function" +parent_id: 155 +} +path_fragments { +id: 160 +label: "function.a" +parent_id: 161 +} +artifacts { +id: 77 +path_fragment_id: 160 +} +path_fragments { +id: 163 +label: "value" +parent_id: 155 +} +path_fragments { +id: 162 +label: "value.a" +parent_id: 163 +} +artifacts { +id: 78 +path_fragment_id: 162 +} +path_fragments { +id: 164 +label: "cmp.a" +parent_id: 156 +} +artifacts { +id: 79 +path_fragment_id: 164 +} +path_fragments { +id: 166 +label: "cmpopts" +parent_id: 156 +} +path_fragments { +id: 165 +label: "cmpopts.a" +parent_id: 166 +} +artifacts { +id: 80 +path_fragment_id: 165 +} +path_fragments { +id: 169 +label: "gazelle++go_deps+com_github_hexops_gotextdiff" +parent_id: 64 +} +path_fragments { +id: 168 +label: "span" +parent_id: 169 +} +path_fragments { +id: 167 +label: "span.a" +parent_id: 168 +} +artifacts { +id: 81 +path_fragment_id: 167 +} +path_fragments { +id: 170 +label: "gotextdiff.a" +parent_id: 169 +} +artifacts { +id: 82 +path_fragment_id: 170 +} +path_fragments { +id: 172 +label: "myers" +parent_id: 169 +} +path_fragments { +id: 171 +label: "myers.a" +parent_id: 172 +} +artifacts { +id: 83 +path_fragment_id: 171 +} +path_fragments { +id: 173 +label: "action.a" +parent_id: 51 +} +artifacts { +id: 84 +path_fragment_id: 173 +} +path_fragments { +id: 174 +label: "report.a" +parent_id: 58 +} +artifacts { +id: 85 +path_fragment_id: 174 +} +path_fragments { +id: 176 +label: "apple_support++apple_cc_configure_extension+local_config_apple_cc" +parent_id: 5 +} +path_fragments { +id: 175 +label: "cc_wrapper.sh" +parent_id: 176 +} +artifacts { +id: 86 +path_fragment_id: 175 +} +path_fragments { +id: 177 +label: "libtool" +parent_id: 176 +} +artifacts { +id: 87 +path_fragment_id: 177 +} +path_fragments { +id: 178 +label: "libtool_check_unique" +parent_id: 176 +} +artifacts { +id: 88 +path_fragment_id: 178 +} +path_fragments { +id: 179 +label: "make_hashed_objlist.py" +parent_id: 176 +} +artifacts { +id: 89 +path_fragment_id: 179 +} +path_fragments { +id: 180 +label: "wrapped_clang" +parent_id: 176 +} +artifacts { +id: 90 +path_fragment_id: 180 +} +path_fragments { +id: 181 +label: "wrapped_clang_pp" +parent_id: 176 +} +artifacts { +id: 91 +path_fragment_id: 181 +} +path_fragments { +id: 182 +label: "xcrunwrapper.sh" +parent_id: 176 +} +artifacts { +id: 92 +path_fragment_id: 182 +} +dep_set_of_files { +id: 6 +direct_artifact_ids: 37 +direct_artifact_ids: 38 +direct_artifact_ids: 39 +direct_artifact_ids: 40 +direct_artifact_ids: 41 +direct_artifact_ids: 42 +direct_artifact_ids: 43 +direct_artifact_ids: 44 +direct_artifact_ids: 45 +direct_artifact_ids: 46 +direct_artifact_ids: 47 +direct_artifact_ids: 48 +direct_artifact_ids: 49 +direct_artifact_ids: 50 +direct_artifact_ids: 51 +direct_artifact_ids: 52 +direct_artifact_ids: 53 +direct_artifact_ids: 54 +direct_artifact_ids: 55 +direct_artifact_ids: 56 +direct_artifact_ids: 57 +direct_artifact_ids: 58 +direct_artifact_ids: 59 +direct_artifact_ids: 60 +direct_artifact_ids: 61 +direct_artifact_ids: 62 +direct_artifact_ids: 63 +direct_artifact_ids: 64 +direct_artifact_ids: 65 +direct_artifact_ids: 66 +direct_artifact_ids: 67 +direct_artifact_ids: 68 +direct_artifact_ids: 69 +direct_artifact_ids: 70 +direct_artifact_ids: 71 +direct_artifact_ids: 72 +direct_artifact_ids: 73 +direct_artifact_ids: 74 +direct_artifact_ids: 75 +direct_artifact_ids: 76 +direct_artifact_ids: 77 +direct_artifact_ids: 78 +direct_artifact_ids: 79 +direct_artifact_ids: 80 +direct_artifact_ids: 81 +direct_artifact_ids: 82 +direct_artifact_ids: 83 +direct_artifact_ids: 84 +direct_artifact_ids: 85 +direct_artifact_ids: 35 +direct_artifact_ids: 86 +direct_artifact_ids: 87 +direct_artifact_ids: 88 +direct_artifact_ids: 89 +direct_artifact_ids: 90 +direct_artifact_ids: 91 +direct_artifact_ids: 92 +direct_artifact_ids: 5 +direct_artifact_ids: 6 +direct_artifact_ids: 7 +direct_artifact_ids: 8 +direct_artifact_ids: 9 +direct_artifact_ids: 10 +direct_artifact_ids: 11 +direct_artifact_ids: 12 +direct_artifact_ids: 13 +direct_artifact_ids: 14 +direct_artifact_ids: 15 +direct_artifact_ids: 16 +direct_artifact_ids: 17 +direct_artifact_ids: 18 +direct_artifact_ids: 19 +direct_artifact_ids: 20 +direct_artifact_ids: 21 +direct_artifact_ids: 22 +direct_artifact_ids: 23 +direct_artifact_ids: 24 +direct_artifact_ids: 25 +direct_artifact_ids: 28 +} +dep_set_of_files { +id: 5 +transitive_dep_set_ids: 6 +direct_artifact_ids: 34 +} +path_fragments { +id: 184 +label: "aquerydiff_darwin_amd64_" +parent_id: 68 +} +path_fragments { +id: 183 +label: "aquerydiff_darwin_amd64" +parent_id: 184 +} +artifacts { +id: 93 +path_fragment_id: 183 +} +actions { +target_id: 1 +action_key: "bcc99bb8a6a643ada581d0cbcf0d2aa2b38a93249c7637cd55418fcfe9001390" +mnemonic: "GoLink" +configuration_id: 1 +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/builder_reset/builder" +arguments: "link" +arguments: "-sdk" +arguments: "external/rules_go++go_sdk+main___download_0" +arguments: "-goroot" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-ad4c399ec9e6/bin/external/rules_go+/stdlib_" +arguments: "-installsuffix" +arguments: "darwin_amd64" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/detrand:detrand=google.golang.org/protobuf/internal/detrand=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/detrand/detrand.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/errors:errors=google.golang.org/protobuf/internal/errors=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/errors/errors.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//encoding/protowire:protowire=google.golang.org/protobuf/encoding/protowire=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/encoding/protowire/protowire.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/flags:flags=google.golang.org/protobuf/internal/flags=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/flags/flags.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/pragma:pragma=google.golang.org/protobuf/internal/pragma=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/pragma/pragma.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//reflect/protoreflect:protoreflect=google.golang.org/protobuf/reflect/protoreflect=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/reflect/protoreflect/protoreflect.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/strs:strs=google.golang.org/protobuf/internal/strs=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/strs/strs.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/json:json=google.golang.org/protobuf/internal/encoding/json=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/json/json.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/messageset:messageset=google.golang.org/protobuf/internal/encoding/messageset=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/messageset/messageset.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/descfmt:descfmt=google.golang.org/protobuf/internal/descfmt=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/descfmt/descfmt.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/descopts:descopts=google.golang.org/protobuf/internal/descopts=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/descopts/descopts.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/editiondefaults:editiondefaults=google.golang.org/protobuf/internal/editiondefaults=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/editiondefaults/editiondefaults.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/text:text=google.golang.org/protobuf/internal/encoding/text=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/text/text.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/defval:defval=google.golang.org/protobuf/internal/encoding/defval=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/defval/defval.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/genid:genid=google.golang.org/protobuf/internal/genid=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/genid/genid.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/order:order=google.golang.org/protobuf/internal/order=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/order/order.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//reflect/protoregistry:protoregistry=google.golang.org/protobuf/reflect/protoregistry=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/reflect/protoregistry/protoregistry.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//runtime/protoiface:protoiface=google.golang.org/protobuf/runtime/protoiface=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/runtime/protoiface/protoiface.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//proto:proto=google.golang.org/protobuf/proto=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/proto/proto.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/filedesc:filedesc=google.golang.org/protobuf/internal/filedesc=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/filedesc/filedesc.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/set:set=google.golang.org/protobuf/internal/set=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/set/set.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//encoding/protojson:protojson=google.golang.org/protobuf/encoding/protojson=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/encoding/protojson/protojson.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//encoding/prototext:prototext=google.golang.org/protobuf/encoding/prototext=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/encoding/prototext/prototext.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/encoding/tag:tag=google.golang.org/protobuf/internal/encoding/tag=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/encoding/tag/tag.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/protolazy:protolazy=google.golang.org/protobuf/internal/protolazy=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/protolazy/protolazy.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/impl:impl=google.golang.org/protobuf/internal/impl=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/impl/impl.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/filetype:filetype=google.golang.org/protobuf/internal/filetype=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/filetype/filetype.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//internal/version:version=google.golang.org/protobuf/internal/version=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/internal/version/version.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+org_golang_google_protobuf//runtime/protoimpl:protoimpl=google.golang.org/protobuf/runtime/protoimpl=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+org_golang_google_protobuf/runtime/protoimpl/protoimpl.a" +arguments: "-arc" +arguments: "@@build_stack_rules_proto++proto_repository+bazelapis//src/main/protobuf:stardoc_output_go_proto=github.com/bazelbuild/bazel/src/main/protobuf/stardoc_output=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/build_stack_rules_proto++proto_repository+bazelapis/src/main/protobuf/stardoc_output_go_proto.a" +arguments: "-arc" +arguments: "@@build_stack_rules_proto++proto_repository+bazelapis//src/main/protobuf:build_go_proto=github.com/bazelbuild/bazelapis/src/main/protobuf/build=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/build_stack_rules_proto++proto_repository+bazelapis/src/main/protobuf/build_go_proto.a" +arguments: "-arc" +arguments: "@@build_stack_rules_proto++proto_repository+bazelapis//src/main/protobuf:analysis_v2_go_proto=github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/build_stack_rules_proto++proto_repository+bazelapis/src/main/protobuf/analysis_v2_go_proto.a" +arguments: "-arc" +arguments: "@@//build/stack/bazel/aquery/differ:differ=github.com/stackb/bazel-aquery-differ/build/stack/bazel/aquery/differ=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/build/stack/bazel/aquery/differ/differ.a" +arguments: "-arc" +arguments: "@@//pkg/pathfragment:pathfragment=github.com/stackb/bazel-aquery-differ/pkg/pathfragment=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/pathfragment/pathfragment.a" +arguments: "-arc" +arguments: "@@//pkg/artifact:artifact=github.com/stackb/bazel-aquery-differ/pkg/artifact=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/artifact/artifact.a" +arguments: "-arc" +arguments: "@@//pkg/depset:depset=github.com/stackb/bazel-aquery-differ/pkg/depset=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/depset/depset.a" +arguments: "-arc" +arguments: "@@//pkg/protobuf:protobuf=github.com/stackb/bazel-aquery-differ/pkg/protobuf=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/protobuf/protobuf.a" +arguments: "-arc" +arguments: "@@//pkg/target:target=github.com/stackb/bazel-aquery-differ/pkg/target=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/target/target.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/internal/flags:flags=github.com/google/go-cmp/cmp/internal/flags=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/internal/flags/flags.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/internal/diff:diff=github.com/google/go-cmp/cmp/internal/diff=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/internal/diff/diff.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/internal/function:function=github.com/google/go-cmp/cmp/internal/function=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/internal/function/function.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/internal/value:value=github.com/google/go-cmp/cmp/internal/value=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/internal/value/value.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp:cmp=github.com/google/go-cmp/cmp=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/cmp.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_google_go_cmp//cmp/cmpopts:cmpopts=github.com/google/go-cmp/cmp/cmpopts=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_google_go_cmp/cmp/cmpopts/cmpopts.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_hexops_gotextdiff//span:span=github.com/hexops/gotextdiff/span=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_hexops_gotextdiff/span/span.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_hexops_gotextdiff//:gotextdiff=github.com/hexops/gotextdiff=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_hexops_gotextdiff/gotextdiff.a" +arguments: "-arc" +arguments: "@@gazelle++go_deps+com_github_hexops_gotextdiff//myers:myers=github.com/hexops/gotextdiff/myers=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/external/gazelle++go_deps+com_github_hexops_gotextdiff/myers/myers.a" +arguments: "-arc" +arguments: "@@//pkg/action:action=github.com/stackb/bazel-aquery-differ/pkg/action=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/action/action.a" +arguments: "-arc" +arguments: "@@//pkg/report:report=github.com/stackb/bazel-aquery-differ/pkg/report=bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/pkg/report/report.a" +arguments: "-package_list" +arguments: "bazel-out/darwin_arm64-opt-exec-ST-d6cc8b84a7bb/bin/external/rules_go++go_sdk+main___download_0/packages.txt" +arguments: "-o" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/cmd/aquerydiff/aquerydiff_darwin_amd64_/aquerydiff_darwin_amd64" +arguments: "-main" +arguments: "bazel-out/darwin_arm64-fastbuild-ST-429f90df6b5d/bin/cmd/aquerydiff/aquerydiff_darwin_amd64.a" +arguments: "-p" +arguments: "github.com/stackb/bazel-aquery-differ/cmd/aquerydiff" +arguments: "--" +arguments: "-linkmode" +arguments: "internal" +arguments: "-s" +arguments: "-w" +arguments: "-buildid=redacted" +arguments: "-s" +arguments: "-w" +arguments: "-extldflags" +arguments: "-Wl,-oso_prefix,__BAZEL_EXECUTION_ROOT_NO_SANDBOX__/ -headerpad_max_install_names -no-canonical-prefixes -target x86_64-apple-macosx26.0 -fobjc-link-runtime -Xlinker -no_deduplicate -framework Foundation -Wl,-no_warn_duplicate_libraries -static" +environment_variables { + key: "GOARCH" + value: "amd64" +} +environment_variables { + key: "GOOS" + value: "darwin" +} +environment_variables { + key: "GOEXPERIMENT" +} +environment_variables { + key: "GOROOT" + value: "bazel-out/darwin_arm64-fastbuild-ST-ad4c399ec9e6/bin/external/rules_go+/stdlib_" +} +environment_variables { + key: "GOROOT_FINAL" + value: "GOROOT" +} +environment_variables { + key: "CGO_ENABLED" + value: "0" +} +environment_variables { + key: "GOPATH" +} +environment_variables { + key: "GOTOOLCHAIN" + value: "local" +} +environment_variables { + key: "GODEBUG" + value: "winsymlink=0" +} +environment_variables { + key: "XCODE_VERSION_OVERRIDE" + value: "26.0.0.17A324" +} +environment_variables { + key: "APPLE_SDK_VERSION_OVERRIDE" + value: "26.0" +} +environment_variables { + key: "APPLE_SDK_PLATFORM" + value: "MacOSX" +} +environment_variables { + key: "ZERO_AR_DATE" + value: "1" +} +environment_variables { + key: "RELATIVE_AST_PATH" + value: "true" +} +environment_variables { + key: "PATH" + value: "external/apple_support++apple_cc_configure_extension+local_config_apple_cc:/bin:/usr/bin" +} +input_dep_set_ids: 5 +output_ids: 93 +primary_output_id: 93 +execution_platform: "@@platforms//host:host" +} +path_fragments { +id: 185 +label: "aquerydiff_darwin_amd64.repo_mapping" +parent_id: 184 +} +artifacts { +id: 94 +path_fragment_id: 185 +} +actions { +target_id: 1 +action_key: "5341c994bc161a38310a3e9f12d01ced4881371288a50e0cac0dfe45b048aa28" +mnemonic: "RepoMappingManifest" +configuration_id: 1 +output_ids: 94 +primary_output_id: 94 +execution_platform: "@@platforms//host:host" +} +path_fragments { +id: 186 +label: "aquerydiff_darwin_amd64.runfiles_manifest" +parent_id: 184 +} +artifacts { +id: 95 +path_fragment_id: 186 +} +actions { +target_id: 1 +action_key: "17035b7253a5f99714c64b54a6bad3920a7bb703d7c50fc640e281e12d47fa9b" +mnemonic: "SourceSymlinkManifest" +configuration_id: 1 +output_ids: 95 +primary_output_id: 95 +execution_platform: "@@platforms//host:host" +} +dep_set_of_files { +id: 7 +direct_artifact_ids: 95 +} +path_fragments { +id: 188 +label: "aquerydiff_darwin_amd64.runfiles" +parent_id: 184 +} +path_fragments { +id: 187 +label: "MANIFEST" +parent_id: 188 +} +artifacts { +id: 96 +path_fragment_id: 187 +} +actions { +target_id: 1 +action_key: "08f02e125d7ddecc99b26d8f93984d71fa1e16ac6c8d3a68195ad077fd92f124" +mnemonic: "SymlinkTree" +configuration_id: 1 +input_dep_set_ids: 7 +output_ids: 96 +primary_output_id: 96 +execution_platform: "@@platforms//host:host" +} +dep_set_of_files { +id: 8 +direct_artifact_ids: 93 +direct_artifact_ids: 96 +direct_artifact_ids: 94 +} +path_fragments { +id: 191 +label: "internal" +parent_id: 54 +} +path_fragments { +id: 190 +label: "_middlemen" +parent_id: 191 +} +path_fragments { +id: 189 +label: "cmd_Saquerydiff_Saquerydiff_Udarwin_Uamd64_U_Saquerydiff_Udarwin_Uamd64-runfiles" +parent_id: 190 +} +artifacts { +id: 97 +path_fragment_id: 189 +} +actions { +target_id: 1 +action_key: "709e80c88487a2411e1ee4dfb9f22a861492d20c4765150c0c794abd70f8147c" +mnemonic: "Middleman" +configuration_id: 1 +input_dep_set_ids: 8 +output_ids: 97 +primary_output_id: 97 +execution_platform: "@@platforms//host:host" +} diff --git a/pkg/action/BUILD.bazel b/pkg/action/BUILD.bazel index c5b0e44..8ce8b31 100644 --- a/pkg/action/BUILD.bazel +++ b/pkg/action/BUILD.bazel @@ -22,6 +22,7 @@ go_library( "@com_github_hexops_gotextdiff//:go_default_library", "@com_github_hexops_gotextdiff//myers:go_default_library", "@com_github_hexops_gotextdiff//span:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/pkg/action/action.go b/pkg/action/action.go index 4526fea..404366e 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -48,7 +48,6 @@ func NewAction(id string, in *anpb.Action, artifacts artifact.PathMap, targets t ExecutionPlatform: in.ExecutionPlatform, TemplateContent: in.TemplateContent, Substitutions: in.Substitutions, - // FileContents: in.FileContent, } return out, nil diff --git a/pkg/action/graph.go b/pkg/action/graph.go index afaf6ea..fd7d2ad 100644 --- a/pkg/action/graph.go +++ b/pkg/action/graph.go @@ -20,7 +20,6 @@ type Graph struct { DepSetOfFiles depset.Map DepSetResolver depset.Resolver Actions []*dipb.Action - OutputMap OutputMap } func NewGraph(name string, container *anpb.ActionGraphContainer) (*Graph, error) { @@ -50,11 +49,38 @@ func NewGraph(name string, container *anpb.ActionGraphContainer) (*Graph, error) DepSetOfFiles: depSetOfFiles, DepSetResolver: *depSetResolver, Actions: actions, - OutputMap: NewOutputMap(actions), }, nil } -func Partition(before, after OutputMap) (beforeOnly, afterOnly, both OutputPairs) { +// GetPrimaryTarget returns the most common target from the actions in the graph, +// or empty string if there are no actions. +func (g *Graph) GetPrimaryTarget() string { + if len(g.Actions) == 0 { + return "" + } + + // Count target occurrences + targetCounts := make(map[string]int) + for _, action := range g.Actions { + if action.Target != "" { + targetCounts[action.Target]++ + } + } + + // Find the most common target + var maxTarget string + var maxCount int + for target, count := range targetCounts { + if count > maxCount { + maxTarget = target + maxCount = count + } + } + + return maxTarget +} + +func Partition(before, after ActionMap) (beforeOnly, afterOnly, both OutputPairs) { a := make(map[string]bool) b := make(map[string]bool) for output := range before { diff --git a/pkg/action/output_map.go b/pkg/action/output_map.go index e6831b9..6e8544e 100644 --- a/pkg/action/output_map.go +++ b/pkg/action/output_map.go @@ -4,15 +4,28 @@ import ( dipb "github.com/stackb/bazel-aquery-differ/build/stack/bazel/aquery/differ" ) -// OutputMap is a map of string -> action were the key is the primary -// output file(s) of the action. -type OutputMap map[string]*dipb.Action +// ActionMap is a map of string -> action. +type ActionMap map[string]*dipb.Action + +// ActionMapper is a function that creates an ActionMap from a list of Actions. +type ActionMapper func([]*dipb.Action) ActionMap -// NewOutputMap creates a new actionOutputMap. -func NewOutputMap(actions []*dipb.Action) OutputMap { - result := make(OutputMap) +// NewOutputFilesMap creates a new actionOutputMap were the key is the primary +// output file(s) of the action. +func NewOutputFilesMap(actions []*dipb.Action) ActionMap { + result := make(ActionMap) for _, action := range actions { result[action.OutputFiles] = action } return result } + +// NewMnemonicFileMap creates a new actionOutputMap were the key is the primary +// output file(s) of the action. In the strategy, the last action having the mnemonic wins. +func NewMnemonicFileMap(actions []*dipb.Action) ActionMap { + result := make(ActionMap) + for _, action := range actions { + result[action.Mnemonic] = action + } + return result +} diff --git a/pkg/action/output_pair.go b/pkg/action/output_pair.go index d8119fe..ca93945 100644 --- a/pkg/action/output_pair.go +++ b/pkg/action/output_pair.go @@ -6,6 +6,7 @@ import ( "github.com/hexops/gotextdiff" "github.com/hexops/gotextdiff/myers" "github.com/hexops/gotextdiff/span" + "google.golang.org/protobuf/proto" anpb "github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2" dipb "github.com/stackb/bazel-aquery-differ/build/stack/bazel/aquery/differ" @@ -17,6 +18,11 @@ type OutputPair struct { Action *dipb.Action // representative of before/after Before *dipb.Action After *dipb.Action + + // Cached formatted text for unified diff (lazy initialized) + beforeText string + afterText string + textCached bool } func (p *OutputPair) Diff() string { @@ -28,17 +34,30 @@ func (p *OutputPair) Diff() string { ) } -func (p *OutputPair) UnifiedDiff() gotextdiff.Unified { - var a string - var b string +// formatTexts computes and caches the formatted text for before/after actions. +// This is done lazily and only once to avoid repeated proto cloning and formatting. +func (p *OutputPair) formatTexts() { + if p.textCached { + return + } + if p.Before != nil { - a = protobuf.FormatProtoText(p.Before) + beforeCopy := proto.Clone(p.Before).(*dipb.Action) + beforeCopy.Id = "" + p.beforeText = protobuf.FormatProtoText(beforeCopy) } if p.After != nil { - b = protobuf.FormatProtoText(p.After) + afterCopy := proto.Clone(p.After).(*dipb.Action) + afterCopy.Id = "" + p.afterText = protobuf.FormatProtoText(afterCopy) } - edits := myers.ComputeEdits(span.URI(p.Output), a, b) - return gotextdiff.ToUnified(p.Output, p.Output, a, edits) + p.textCached = true +} + +func (p *OutputPair) UnifiedDiff() gotextdiff.Unified { + p.formatTexts() + edits := myers.ComputeEdits(span.URI(p.Output), p.beforeText, p.afterText) + return gotextdiff.ToUnified(p.Output, p.Output, p.beforeText, edits) } type OutputPairs []*OutputPair diff --git a/pkg/depset/resolver.go b/pkg/depset/resolver.go index 2a54fc4..87859be 100644 --- a/pkg/depset/resolver.go +++ b/pkg/depset/resolver.go @@ -2,6 +2,7 @@ package depset import ( "fmt" + "sort" anpb "github.com/bazelbuild/bazelapis/src/main/protobuf/analysis_v2" "github.com/stackb/bazel-aquery-differ/pkg/artifact" @@ -33,7 +34,7 @@ func (r *Resolver) ResolveIds(depSetIds []uint32) (artifacts []string, err error } artifacts = append(artifacts, files...) } - return + return deduplicateAndSort(artifacts), err } func (r *Resolver) Resolve(in *anpb.DepSetOfFiles) ([]string, error) { @@ -62,8 +63,26 @@ func (r *Resolver) Resolve(in *anpb.DepSetOfFiles) ([]string, error) { } artifacts = append(artifacts, files...) } - - r.depSetArtifacts[in.Id] = artifacts + + r.depSetArtifacts[in.Id] = deduplicateAndSort(artifacts) return artifacts, nil } + + +// deduplicateAndSort removes duplicate entries and sorts the list +func deduplicateAndSort(in []string) (out []string) { + if len(in) == 0 { + return in + } + seen := make(map[string]bool) + for _, v := range in { + if seen[v] { + continue + } + seen[v] = true + out = append(out, v) + } + sort.Strings(out) + return +} \ No newline at end of file diff --git a/pkg/protobuf/io.go b/pkg/protobuf/io.go index 592c340..adfd6d2 100644 --- a/pkg/protobuf/io.go +++ b/pkg/protobuf/io.go @@ -15,23 +15,33 @@ type marshaler func(m protoreflect.ProtoMessage) ([]byte, error) type unmarshaler func(b []byte, m protoreflect.ProtoMessage) error func unmarshalerForFilename(filename string) (unmarshaler, string) { - if filepath.Ext(filename) == ".json" { + ext := filepath.Ext(filename) + switch ext { + case ".json", ".jsonproto": return protojson.Unmarshal, "json" - } - if filepath.Ext(filename) == ".text" { + case ".textproto": return prototext.Unmarshal, "text" + case ".proto", ".pb": + return proto.Unmarshal, "proto" + default: + // Default to binary proto for unknown extensions + return proto.Unmarshal, "proto" } - return proto.Unmarshal, "proto" } func marshalerForFilename(filename string) marshaler { - if filepath.Ext(filename) == ".json" { + ext := filepath.Ext(filename) + switch ext { + case ".json", ".jsonproto": return protojson.Marshal - } - if filepath.Ext(filename) == ".textproto" { + case ".textproto": return prototext.Marshal + case ".proto", ".pb": + return proto.Marshal + default: + // Default to binary proto for unknown extensions + return proto.Marshal } - return proto.Marshal } func ReadFile(filename string, message protoreflect.ProtoMessage) error { diff --git a/pkg/report/BUILD.bazel b/pkg/report/BUILD.bazel index 4d0d7f9..10c9ba3 100644 --- a/pkg/report/BUILD.bazel +++ b/pkg/report/BUILD.bazel @@ -9,6 +9,8 @@ go_library( ], embedsrcs = [ "index.html.tmpl", + "diff.html.tmpl", + "cmp.html.tmpl", "style.css", ], importpath = "github.com/stackb/bazel-aquery-differ/pkg/report", diff --git a/pkg/report/assets.go b/pkg/report/assets.go index 4bb5a36..b7b9110 100644 --- a/pkg/report/assets.go +++ b/pkg/report/assets.go @@ -7,5 +7,11 @@ import ( //go:embed index.html.tmpl var indexHtmlFs embed.FS +//go:embed diff.html.tmpl +var diffHtmlFs embed.FS + +//go:embed cmp.html.tmpl +var cmpHtmlFs embed.FS + //go:embed style.css var styleCss []byte diff --git a/pkg/report/cmp.html.tmpl b/pkg/report/cmp.html.tmpl new file mode 100644 index 0000000..0f66465 --- /dev/null +++ b/pkg/report/cmp.html.tmpl @@ -0,0 +1,75 @@ + + + + + + Cmp Diff - Aquerydiff + + + + + + + +
+

Diff (go-cmp)

+ ← Back to index +
+
+
{{.Content}}
+
+ + + + diff --git a/pkg/report/diff.html.tmpl b/pkg/report/diff.html.tmpl new file mode 100644 index 0000000..96d239c --- /dev/null +++ b/pkg/report/diff.html.tmpl @@ -0,0 +1,65 @@ + + + + + + Unidiff - Aquerydiff + + + + + + + +
+

Diff

+ ← Back to index +
+
+ + + + diff --git a/pkg/report/html.go b/pkg/report/html.go index d87b345..ac9c8ed 100644 --- a/pkg/report/html.go +++ b/pkg/report/html.go @@ -3,7 +3,6 @@ package report import ( "fmt" "io" - "io/fs" "io/ioutil" "log" "os" @@ -17,6 +16,7 @@ import ( ) type Html struct { + Target string BeforeFile string AfterFile string Before *action.Graph @@ -25,6 +25,8 @@ type Html struct { AfterOnly action.OutputPairs Equal action.OutputPairs NonEqual action.OutputPairs + Unidiff bool + Cmpdiff bool } func (r *Html) Emit(dir string) error { @@ -127,14 +129,25 @@ func (r *Html) emitOutputPairDiff(dir string, pair *action.OutputPair) error { return err } - log.Printf("Unified Diff %s", filename) - unifiedDiff := fmt.Sprint(pair.UnifiedDiff()) - if err := os.WriteFile(filename+".diff.txt", []byte(unifiedDiff), fs.ModePerm); err != nil { - return err + if r.Unidiff { + log.Printf("Unified Diff %s", filename) + unifiedDiff := fmt.Sprint(pair.UnifiedDiff()) + if unifiedDiff == "" { + unifiedDiff = "NONE" + } + if err := r.emitDiffHtml(filename+".diff.html", unifiedDiff); err != nil { + return err + } } - log.Printf("Cmp Diff %s", filename) - if err := os.WriteFile(filename+".cmp.txt", []byte(pair.Diff()), fs.ModePerm); err != nil { - return err + if r.Cmpdiff { + log.Printf("Cmp Diff %s", filename) + cmpDiff := pair.Diff() + if cmpDiff == "" { + cmpDiff = "NONE" + } + if err := r.emitCmpHtml(filename+".cmp.html", cmpDiff); err != nil { + return err + } } return nil } @@ -160,3 +173,37 @@ func (r *Html) renderIndexHtml(out io.Writer) error { tmpl := template.Must(template.New("index.html.tmpl").ParseFS(indexHtmlFs, "index.html.tmpl")) return tmpl.Execute(out, r) } + +type diffData struct { + Content string +} + +func (r *Html) emitDiffHtml(filename string, content string) error { + out, err := os.Create(filename) + if err != nil { + return err + } + defer out.Close() + + data := diffData{ + Content: content, + } + + tmpl := template.Must(template.New("diff.html.tmpl").ParseFS(diffHtmlFs, "diff.html.tmpl")) + return tmpl.Execute(out, data) +} + +func (r *Html) emitCmpHtml(filename string, content string) error { + out, err := os.Create(filename) + if err != nil { + return err + } + defer out.Close() + + data := diffData{ + Content: content, + } + + tmpl := template.Must(template.New("cmp.html.tmpl").ParseFS(cmpHtmlFs, "cmp.html.tmpl")) + return tmpl.Execute(out, data) +} diff --git a/pkg/report/index.html.tmpl b/pkg/report/index.html.tmpl index 22b2c04..d676efd 100644 --- a/pkg/report/index.html.tmpl +++ b/pkg/report/index.html.tmpl @@ -1,12 +1,12 @@ - Aquerydiff Report + Aquerydiff {{.Target}} -

aquerydiff report

+

aquerydiff {{.Target}}

  • --before {{.BeforeFile}}
  • --after {{.AfterFile}}
  • @@ -60,7 +60,7 @@ after: [json] [text] {{ end }} {{ if and .Before .After }} - diff: [unidiff] [go-cmp] + diff: [unidiff] [go-cmp] {{ end }} diff --git a/rules/BUILD.bazel b/rules/BUILD.bazel new file mode 100644 index 0000000..e69de29 diff --git a/rules/defs.bzl b/rules/defs.bzl new file mode 100644 index 0000000..504085a --- /dev/null +++ b/rules/defs.bzl @@ -0,0 +1,184 @@ +def _build_flags(ctx): + """Helper to build common CLI flags.""" + flags = [] + if ctx.attr.unidiff: + flags.append("--unidiff") + if ctx.attr.cmpdiff: + flags.append("--cmpdiff") + if ctx.attr.serve: + flags.append("--serve") + if ctx.attr.open: + flags.append("--open") + return " ".join(flags) + +_COMMON_TOOL_ATTRS = { + "match": attr.string( + doc = "strategy to compare before and after actions", + default = "output_files", + values = ["output_files", "mnemonic"], + ), + "serve": attr.bool( + doc = "start webserver", + default = True, + ), + "open": attr.bool( + doc = "open browser to webserver URL", + default = True, + ), + "unidiff": attr.bool( + doc = "whether to compute unidiffs (can be slow)", + default = False, + ), + "cmpdiff": attr.bool( + doc = "whether to compute go-cmp diff (typically fast)", + default = True, + ), + "_tool": attr.label( + doc = "the aquerydiff tool", + cfg = "exec", + default = "//cmd/aquerydiff", + executable = True, + ), +} + +def _aquery_git_diff_impl(ctx): + files = [ctx.outputs.executable] + runfiles = [ctx.executable._tool] + + ctx.actions.write( + ctx.outputs.executable, + """#!/bin/bash +set -euox pipefail + +# switch to WORKSPACE +cwd=$(PWD) +cd $BUILD_WORKING_DIRECTORY + +# ensure no uncommitted changes +git diff --exit-code --quiet && git diff --cached --exit-code --quiet || {{ + echo "Error: Uncommitted changes detected" + exit 1 +}} + +# create temporary directory for aquery files +tmpdir="${{TMPDIR:-/tmp}}/aquery_diff_$$" +mkdir -p "$tmpdir" +echo "Using temporary directory: $tmpdir" + +# store current git commit +original_commit=$(git rev-parse HEAD) +echo "Original commit: $original_commit" + +# checkout before commit and run aquery +echo "Checking out before commit: {before_commit}" +git checkout {before_commit} +{bazel} aquery --output=proto '{target}' > "$tmpdir/before.pb" + +# checkout after commit and run aquery +echo "Checking out after commit: {after_commit}" +git checkout {after_commit} +{bazel} aquery --output=proto '{target}' > "$tmpdir/after.pb" + +# restore original commit +echo "Restoring original commit: $original_commit" +git checkout $original_commit + +# run the tool +"$cwd/{tool}" {flags} --match '{match}' --before "$tmpdir/before.pb" --after "$tmpdir/after.pb" --report_dir=$cwd + +# cleanup temporary directory +rm -rf "$tmpdir" +""".format( + bazel = ctx.attr.bazel, + tool = ctx.executable._tool.short_path, + match = ctx.attr.match, + target = ctx.attr.target, + before_commit = ctx.attr.before, + after_commit = ctx.attr.after, + flags = _build_flags(ctx), + ), + is_executable = True, + ) + + return [ + DefaultInfo( + files = depset(files), + runfiles = ctx.runfiles(files = runfiles), + ), + ] + +aquery_git_diff = rule( + implementation = _aquery_git_diff_impl, + attrs = dict(_COMMON_TOOL_ATTRS, **{ + "target": attr.string( + doc = "bazel target to aquery", + mandatory = True, + ), + "bazel": attr.string( + doc = "the bazel executable", + default = "bazel", + ), + "before": attr.string( + doc = "the baseline git commit", + mandatory = True, + ), + "after": attr.string( + doc = "the after git commit", + mandatory = True, + ), + }), + executable = True, +) + +def _aquery_diff_impl(ctx): + files = [ctx.outputs.executable] + runfiles = [ctx.executable._tool, ctx.file.before, ctx.file.after] + + ctx.actions.write( + ctx.outputs.executable, + """#!/bin/bash +set -euox pipefail + +# switch to WORKSPACE +cwd=$(PWD) +before="$cwd/{before}" +after="$cwd/{after}" + +cd $BUILD_WORKING_DIRECTORY + +# run the tool +"$cwd/{tool}" {flags} --match '{match}' --before "$before" --after "$after" --report_dir=$cwd + +""".format( + tool = ctx.executable._tool.short_path, + match = ctx.attr.match, + before = ctx.file.before.short_path, + after = ctx.file.after.short_path, + flags = _build_flags(ctx), + ), + is_executable = True, + ) + + return [ + DefaultInfo( + files = depset(files), + runfiles = ctx.runfiles(files = runfiles), + ), + ] + +aquery_diff = rule( + implementation = _aquery_diff_impl, + attrs = dict(_COMMON_TOOL_ATTRS, **{ + "before": attr.label( + doc = "the baseline aquery file (proto, textproto, or jsonproto format)", + allow_single_file = [".pb", ".proto", ".textproto", ".json", ".jsonproto"], + mandatory = True, + ), + "after": attr.label( + doc = "the comparison aquery file (proto, textproto, or jsonproto format)", + allow_single_file = [".pb", ".proto", ".textproto", ".json", ".jsonproto"], + mandatory = True, + ), + }), + executable = True, +)