Merge "Fix label migration for branch patterns in submit requirements"
diff --git a/.agents/rules.json b/.agents/rules.json
index d8db5f0..bcd4b27 100644
--- a/.agents/rules.json
+++ b/.agents/rules.json
@@ -1,7 +1,7 @@
{
"entries": [
{
- "path": "/google/src/files/head/depot/google3/learning/gemini/agents/skills/gerrit/references/rules/upload_rationale.md"
+ "path": ".agents/rules/upload_rationale.md"
}
]
}
diff --git a/.agents/rules/upload_rationale.md b/.agents/rules/upload_rationale.md
new file mode 100644
index 0000000..f7a13a4
--- /dev/null
+++ b/.agents/rules/upload_rationale.md
@@ -0,0 +1,18 @@
+---
+trigger: always_on
+description: Mandate uploading agent rationale for Gerrit changes
+---
+
+## Gerrit Rationale Upload Policy
+
+Whenever you create a new Gerrit change or upload a patchset (via `git push`,
+`hg upload`, `g4 upload`, or any other VCS command), you **MUST** immediately
+upload AI rationales for that patchset.
+
+Follow this two-step workflow:
+
+1. **Push Code**: Execute your VCS push/upload command so the new patchset is
+ created on Gerrit.
+2. **Upload Rationale**: Read the `gerrit` skill (specifically the
+ `upload-rationale` section) and follow its instructions to construct and
+ upload the complete set of rationales for the patchset.
diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU= b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
new file mode 100755
index 0000000..b1e9051
--- /dev/null
+++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
@@ -0,0 +1,7 @@
+# @generated
+# Input hashes for repository rule npm_translate_lock(name = "npm", pnpm_lock = "@@//:pnpm-lock.yaml").
+# This file should be checked into version control along with the pnpm-lock.yaml file.
+package.json=259674664
+pnpm-lock.yaml=640391753
+pnpm-workspace.yaml=-408937369
+yarn.lock=742513459
diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_NDEzOTg2ODE= b/.aspect/rules/external_repository_action_cache/npm_translate_lock_NDEzOTg2ODE=
new file mode 100755
index 0000000..51238c9
--- /dev/null
+++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_NDEzOTg2ODE=
@@ -0,0 +1,7 @@
+# @generated
+# Input hashes for repository rule npm_translate_lock(name = "tools_npm", pnpm_lock = "@@//tools/node_tools:pnpm-lock.yaml").
+# This file should be checked into version control along with the pnpm-lock.yaml file.
+tools/node_tools/package.json=899646160
+tools/node_tools/pnpm-lock.yaml=-1121876554
+tools/node_tools/pnpm-workspace.yaml=-408937369
+tools/node_tools/yarn.lock=1865795164
diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODE4NDE3MDEy b/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODE4NDE3MDEy
new file mode 100755
index 0000000..3612935
--- /dev/null
+++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODE4NDE3MDEy
@@ -0,0 +1,7 @@
+# @generated
+# Input hashes for repository rule npm_translate_lock(name = "ui_npm", pnpm_lock = "@@//polygerrit-ui/app:pnpm-lock.yaml").
+# This file should be checked into version control along with the pnpm-lock.yaml file.
+polygerrit-ui/app/package.json=-844837576
+polygerrit-ui/app/pnpm-lock.yaml=1583889522
+polygerrit-ui/app/pnpm-workspace.yaml=1396467527
+polygerrit-ui/app/yarn.lock=-909422203
diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODE4OTg1MjQ0 b/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODE4OTg1MjQ0
new file mode 100755
index 0000000..33edcc5
--- /dev/null
+++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODE4OTg1MjQ0
@@ -0,0 +1,7 @@
+# @generated
+# Input hashes for repository rule npm_translate_lock(name = "ui_dev_npm", pnpm_lock = "@@//polygerrit-ui:pnpm-lock.yaml").
+# This file should be checked into version control along with the pnpm-lock.yaml file.
+polygerrit-ui/package.json=-860495337
+polygerrit-ui/pnpm-lock.yaml=201412925
+polygerrit-ui/pnpm-workspace.yaml=-408937369
+polygerrit-ui/yarn.lock=1276229348
diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODUwOTM3NTg= b/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODUwOTM3NTg=
new file mode 100755
index 0000000..23457d5
--- /dev/null
+++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_ODUwOTM3NTg=
@@ -0,0 +1,7 @@
+# @generated
+# Input hashes for repository rule npm_translate_lock(name = "plugins_npm", pnpm_lock = "@@//plugins:pnpm-lock.yaml").
+# This file should be checked into version control along with the pnpm-lock.yaml file.
+plugins/package.json=1633560207
+plugins/pnpm-lock.yaml=-77521523
+plugins/pnpm-workspace.yaml=-408937369
+plugins/yarn.lock=-2081175573
diff --git a/.bazelrc b/.bazelrc
index b864a3b..1181b4b 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -3,7 +3,13 @@
common --@com_googlesource_gerrit_bazlets//flags:in_gerrit_tree=true
common --incompatible_disallow_struct_provider_syntax=false
common --incompatible_disallow_empty_glob=false
+# Suppress the rules_python implicit-__init__.py deprecation warning emitted
+# for @bazel_tools//tools/jdk:proguard_allowlister (Bazel's own py_binary; the
+# Gerrit tree has no Python targets). This is the upcoming default anyway, see
+# https://github.com/bazel-contrib/rules_python/issues/2945.
+common --@rules_python//python/config_settings:incompatible_default_to_explicit_init_py=true
common --@aspect_rules_ts//ts:default_to_tsc_transpiler
+common --repo_env=ASPECT_TOOLS_TELEMETRY=-all
build --workspace_status_command="python3 ./tools/workspace_status.py"
build --repository_cache=~/.gerritcodereview/bazel-cache/repository
diff --git a/.gitignore b/.gitignore
index 2d146c8..f42cfc0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,9 +10,9 @@
.DS_Store
CLAUDE.md
js-to-ts.sh
-/.aspect/
/.apt_generated
/.apt_generated_tests
+/.eslintcache
/.bazel_path
/.classpath
/.factorypath
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000..ca5c350
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+24.18.0
diff --git a/Documentation/BUILD b/Documentation/BUILD
index 9a8451b..5c4d423 100644
--- a/Documentation/BUILD
+++ b/Documentation/BUILD
@@ -6,6 +6,7 @@
package(default_visibility = ["//visibility:public"])
exports_files([
+ "licenses.txt",
"replace_macros.py",
])
diff --git a/Documentation/cmd-show-caches.txt b/Documentation/cmd-show-caches.txt
index 92e8963..ceca34b 100644
--- a/Documentation/cmd-show-caches.txt
+++ b/Documentation/cmd-show-caches.txt
@@ -8,6 +8,7 @@
--
_ssh_ -p <port> <host> _gerrit show-caches_
[--show-jvm]
+ [--include-diskstats]
[--cache <NAME> ...]
--
@@ -25,6 +26,9 @@
operating system, and other details about the environment
that Gerrit Code Review is running in.
+--include-diskstats::
+ Include disk stat collection for persistent caches.
+
--show-threads::
Show detailed counts for Gerrit specific threads.
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index 42edd90..b7bb053 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -56,6 +56,14 @@
url = jdbc:postgresql://<host>:<port>/<db_name>?user=<user>&password=<password>
----
+Use the following format to create a h2 file at a different path than default
+
+---
+[accountPatchReviewDb]
+ url = jdbc:h2:file:/path/to/db
+---
+
+
[[accountPatchReviewDb.poolLimit]]accountPatchReviewDb.poolLimit::
+
Maximum number of open database connections. If the server needs
@@ -101,6 +109,43 @@
If a unit suffix is not specified, `milliseconds` is assumed.
Default is `30 seconds`.
+[[accountPatchReviewDb.h2LockType]]accountPatchReviewDb.h2LockType::
++
+Selects the locking mechanism used to serialise access to the H2 database file,
+replacing H2's built-in file locking.
++
+When set, no connection pool is maintained. Each operation opens a fresh
+connection, holds the lock for the duration of that operation, and closes the
+connection immediately on completion.
++
+Supported values:
++
+--
+`jgit`:::
+Uses jgit-style lock files for inter-process mutual exclusion. H2 is opened with
+`FILE_LOCK=NO`; a `.lock` sidecar file is atomically created before opening each
+connection and deleted when the connection is closed. The maximum time to spend
+retrying the lock before failing is controlled by
+<<accountPatchReviewDb.h2LockTimeout, accountPatchReviewDb.h2LockTimeout>>.
+When using this option dont specify any custom options to the
+<<accountPatchReviewDb.url, accountPatchReviewDb.url>>.
++
+For this locking to work correctly across multiple Gerrit primaries, the db and
+`.lock` file must reside on a shared filesystem (e.g. NFS) accessible to all
+primaries. The lock file is placed next to the H2 database file (derived from
+`accountPatchReviewDb.url`, or `<site>/db/account_patch_reviews.lock` by default).
+--
++
+Default is unset (H2's built-in file locking is used).
+
+[[accountPatchReviewDb.h2LockTimeout]]accountPatchReviewDb.h2LockTimeout::
++
+Maximum time to spend retrying the external lock before giving up with an error.
+Only applies when `accountPatchReviewDb.h2LockType` is set. Retries use
+exponential backoff starting at 1 ms, capped at 500 ms per sleep.
++
+Default is `30 seconds`.
+
[[accounts]]
=== Section accounts
@@ -945,6 +990,19 @@
+
Default is 1.
+[[cache.preWarmForBloomFilter]]cache.preWarmForBloomFilter::
++
+When enabled, each persistent cache reads its H2 database file into the OS
+page cache before building its BloomFilter. The BloomFilter build requires
+a full table scan of all keys which involves reading close to the entire file
+in a scattered fashion. Doing such a read tends to not perform well I/O wise as
+it generally cannot take advantage of operating system level file system
+readahead. Reading the file sequentially up front tends to take advantage of
+readahead to fully populate the file system caches which then can make scattered
+reads much faster.
++
+Default is true.
+
[[cache.openFiles]]cache.openFiles::
+
The number of file descriptors to add to the limit set by the Gerrit daemon.
diff --git a/Documentation/metrics.txt b/Documentation/metrics.txt
index 7da1c18..5c13aef 100644
--- a/Documentation/metrics.txt
+++ b/Documentation/metrics.txt
@@ -208,12 +208,20 @@
* `caches/memory_eviction_count`: Memory eviction count.
** `cache_name`:
The name of the cache.
+* `caches/memory_request_count`: Total number of lookups (hits + misses) against
+ the in-memory cache.
+** `cache_name`:
+ The name of the cache.
* `caches/disk_cached`: Disk entries used by persistent cache.
** `cache_name`:
The name of the cache.
* `caches/disk_hit_ratio`: Disk hit ratio for persistent cache.
** `cache_name`:
The name of the cache.
+* `caches/disk_request_count`: Total number of lookups (hits + misses) against
+ the persistent disk cache.
+** `cache_name`:
+ The name of the cache.
* `caches/refresh_count`: The number of refreshes per cache with an indicator if
a reload was necessary.
** `cache`:
diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt
index b86d732..f7e477d 100644
--- a/Documentation/rest-api-config.txt
+++ b/Documentation/rest-api-config.txt
@@ -330,11 +330,25 @@
The entries in the map are sorted by cache name.
+.Query Options
+[options="header",cols="1,3"]
+|===
+|Field Name |Description
+|`include-diskstats` |If `true`, disk stat collection is included for persistent caches.
+|===
+
.Request
----
GET /config/server/caches/ HTTP/1.0
----
+To include disk stats for persistent caches:
+
+.Request
+----
+ GET /config/server/caches/?include-diskstats=true HTTP/1.0
+----
+
.Response
----
HTTP/1.1 200 OK
diff --git a/Documentation/user-search.txt b/Documentation/user-search.txt
index 8197a96..5d40e2d 100644
--- a/Documentation/user-search.txt
+++ b/Documentation/user-search.txt
@@ -498,6 +498,10 @@
+
True if the change has attention by the current user.
+has:hashtag::
++
+True if the change has at least one hashtag.
+
[[is]]
[[is-starred]]
diff --git a/Documentation/user-upload.txt b/Documentation/user-upload.txt
index 02ee785..cb42dc6 100644
--- a/Documentation/user-upload.txt
+++ b/Documentation/user-upload.txt
@@ -638,9 +638,25 @@
This requires the caller to have link:access-control.html#category_submit[Submit]
permission on `refs/for/<ref>` (e.g. on `refs/for/refs/heads/master`).
-Note how this is different from the `Submit` permission on `refs/heads/<ref>`,
-and in particular you typically do not want to apply the `Submit` permission
-on `refs/*` (unless you are ok with bypassing submit rules).
+
+[NOTE]
+Granting `Submit` permission to `refs/for/<ref>` is very different from
+granting it on `refs/heads/<ref>`.
+Most importantly, the `Submit` to `refs/for/<ref>` permission does not
+refer to submitting changes according to the regular submit
+requirements, but rather creating a new change and merging it immediately
+bypassing the entire code-review process and its associated security gates.
+Never grant `Submit` permission on `refs/*` or `refs/for/*` as it would
+automatically provide the ability to push a new change and merge it
+immediately to any refs without review gates, and therefore may bypass
+the company's security and compliance checks.
+Never ever grant `Submit` permissions to `refs/*` or `refs/for/*` to the
+on the `All-Projects` repository, as it would automatically involve also the
+ability to create and submit any change to `/refs/meta/config`
+by any regular users, allowing any user to change the common configuration
+of all projects hosted on Gerrit, including the ability to self-assign
+the server administration role, and being able to upload and load any
+custom code through the plugin administration APIs.
[[base]]
=== Selecting Merge Base
diff --git a/MODULE.bazel b/MODULE.bazel
index 037a989..a8e239c 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -1,20 +1,20 @@
module(name = "gerrit")
# Core Bazel deps.
-bazel_dep(name = "bazel_features", version = "1.45.0")
-bazel_dep(name = "platforms", version = "1.0.0")
-bazel_dep(name = "rules_jvm_external", version = "7.0")
+bazel_dep(name = "bazel_features", version = "1.51.0")
+bazel_dep(name = "platforms", version = "1.1.0")
+bazel_dep(name = "rules_jvm_external", version = "7.1")
# Language rules.
bazel_dep(name = "aspect_bazel_lib", version = "2.22.5")
-bazel_dep(name = "aspect_rules_js", version = "3.1.2")
+bazel_dep(name = "aspect_rules_js", version = "3.2.3")
bazel_dep(name = "aspect_rules_rollup", version = "2.0.1")
-bazel_dep(name = "aspect_rules_ts", version = "3.8.8")
-bazel_dep(name = "rules_android", version = "0.7.2")
-bazel_dep(name = "rules_go", version = "0.60.0")
-bazel_dep(name = "rules_java", version = "9.3.0")
-bazel_dep(name = "rules_nodejs", version = "6.7.4")
-bazel_dep(name = "rules_python", version = "2.0.2")
+bazel_dep(name = "aspect_rules_ts", version = "3.9.2")
+bazel_dep(name = "rules_android", version = "0.7.3")
+bazel_dep(name = "rules_go", version = "0.62.0")
+bazel_dep(name = "rules_java", version = "9.5.0")
+bazel_dep(name = "rules_nodejs", version = "6.7.5")
+bazel_dep(name = "rules_python", version = "2.2.0")
bazel_dep(name = "rules_shell", version = "0.8.0")
# Pin rules_java to Gerrit's chosen version. Transitive bzlmod modules can
@@ -23,11 +23,11 @@
# but update the version to the target branch's chosen rules_java version.
single_version_override(
module_name = "rules_java",
- version = "9.3.0",
+ version = "9.5.0",
)
# Libraries / toolchains.
-bazel_dep(name = "protobuf", version = "35.0")
+bazel_dep(name = "protobuf", version = "35.1")
# In-tree modules.
bazel_dep(name = "jgit")
@@ -60,4 +60,3 @@
# Wiring for external dependencies contributed by in-tree plugins.
include("//plugins:external_plugin_deps.MODULE.bazel")
-
diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock
index 7ea3e69..dfd2e59 100644
--- a/MODULE.bazel.lock
+++ b/MODULE.bazel.lock
@@ -33,14 +33,14 @@
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.7/MODULE.bazel": "491f8681205e31bb57892d67442ce448cda4f472a8e6b3dc062865e29a64f89c",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838",
"https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/MODULE.bazel": "b45b507574aa60a92796e3e13c195cd5744b3b8aff516a9c0cb5ae6a048161c5",
- "https://bcr.bazel.build/modules/aspect_rules_js/3.1.2/MODULE.bazel": "e3685502155d3cc65f3bf98e714f7435de67d7f8f355d63478a80197310311fc",
- "https://bcr.bazel.build/modules/aspect_rules_js/3.1.2/source.json": "a32ab71831452b945f3f83a1b1feb9402007e600bce55ac76e15ef0c1e08b520",
+ "https://bcr.bazel.build/modules/aspect_rules_js/3.2.3/MODULE.bazel": "3a0363a5b8ec4931488dc327c577a78c1f5a725293ebffaa5d2613283701aa8a",
+ "https://bcr.bazel.build/modules/aspect_rules_js/3.2.3/source.json": "fa3187962f5fdeee0c6226792904aaafb2cf585717a264fa4393a767bffb99fe",
"https://bcr.bazel.build/modules/aspect_rules_rollup/2.0.1/MODULE.bazel": "296e3a053658c2af989ba9bd62a205e6d1fa84bdd6dd5249196546e6b84770ec",
"https://bcr.bazel.build/modules/aspect_rules_rollup/2.0.1/source.json": "2fe8ac1ccb4de74bf884761e070010280b272d94e3997205b361b91c75409726",
- "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.8/MODULE.bazel": "b52b929a948438665809d49af610f58d1b14f63d6d21ab748f47b6050be4c1f6",
- "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.8/source.json": "5414530b761a45ab7ca6c49f0a2a9cf8dc0da772f5037cf05ca18aaa64bb1b19",
- "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183",
- "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348",
+ "https://bcr.bazel.build/modules/aspect_rules_ts/3.9.2/MODULE.bazel": "feeb6c45b69c995eca3e5ca5872658c80df658022e01044eca00cf472bb89142",
+ "https://bcr.bazel.build/modules/aspect_rules_ts/3.9.2/source.json": "cf3075502f798f71a9c5707a7684eaf0b86da11ed440fd90ea34385dc297676a",
+ "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.4.2/MODULE.bazel": "f31aa84151d31e98cffd43eb7217ccff5ec52bdd5f2d10db8f053aeb23342eca",
+ "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.4.2/source.json": "d027d264e6b6e7fc421e38189f4374fcd14a67e0bd6e0e705de8c2185c3787e1",
"https://bcr.bazel.build/modules/bazel_features/1.1.0/MODULE.bazel": "cfd42ff3b815a5f39554d97182657f8c4b9719568eb7fded2b9135f084bf760b",
"https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd",
"https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101",
@@ -65,8 +65,8 @@
"https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7",
"https://bcr.bazel.build/modules/bazel_features/1.41.0/MODULE.bazel": "6e0f87fafed801273c371d41e22a15a6f8abf83fdd7f87d5e44ad317b94433d0",
"https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080",
- "https://bcr.bazel.build/modules/bazel_features/1.45.0/MODULE.bazel": "7daec6d87ab0703417486d4cb948af0b06f55d4d7c08cbb5978c80e79b538edf",
- "https://bcr.bazel.build/modules/bazel_features/1.45.0/source.json": "635e4536e09ff125b8972e0fa239c135fde5f18701f7d5115680560651dfb41d",
+ "https://bcr.bazel.build/modules/bazel_features/1.51.0/MODULE.bazel": "8e1310d09db6ee2e4f19f9994e360aca941ddc32083edc8d9bdc19c83c94cee4",
+ "https://bcr.bazel.build/modules/bazel_features/1.51.0/source.json": "d5af1f1748d2b4ace5f04087030c0a1cfd93f5be6bdf0b5c1beb24ed0fd24955",
"https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b",
"https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a",
"https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18",
@@ -90,12 +90,12 @@
"https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7",
"https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0",
"https://bcr.bazel.build/modules/bazel_worker_api/0.0.1/MODULE.bazel": "02a13b77321773b2042e70ee5e4c5e099c8ddee4cf2da9cd420442c36938d4bd",
- "https://bcr.bazel.build/modules/bazel_worker_api/0.0.10/MODULE.bazel": "a426df551b40c3997c351d05f00f0d1f86b618ddb646012f1e9c72efce8ed939",
- "https://bcr.bazel.build/modules/bazel_worker_api/0.0.10/source.json": "7f220d3edfeba5d1f61535fd8400338df74f8bdeb241ebe660534c6926a5a645",
+ "https://bcr.bazel.build/modules/bazel_worker_api/0.0.11/MODULE.bazel": "fe09a8d3fb25c95414249f72cb0936201bf7e3c3f0e302175b2fc81e68bc6069",
+ "https://bcr.bazel.build/modules/bazel_worker_api/0.0.11/source.json": "7867c70965fccd202c57796de69fcbdf0555da34e3b09a14b06d74afb0f2f26d",
"https://bcr.bazel.build/modules/bazel_worker_api/0.0.4/MODULE.bazel": "460aa12d01231a80cce03c548287b433b321d205b0028ae596728c35e5ee442e",
"https://bcr.bazel.build/modules/bazel_worker_api/0.0.8/MODULE.bazel": "396c1ef53835aafe3d42ce6619080531ee770648303731f16cfaa33fa056bf0c",
- "https://bcr.bazel.build/modules/bazel_worker_java/0.0.10/MODULE.bazel": "538f21f715cab81c4a43f73e1a91a0c1f8accd9b263dd2a831952805fcfc1a62",
- "https://bcr.bazel.build/modules/bazel_worker_java/0.0.10/source.json": "1646d3aaf5a4bc0d587ecb33d81e93ea9284ff96f5ef579006a9c054945bbe7a",
+ "https://bcr.bazel.build/modules/bazel_worker_java/0.0.11/MODULE.bazel": "1ee9e4c28ce455dbacdff8e007e133ea209e6f673a9e97cf20e99b161bc17548",
+ "https://bcr.bazel.build/modules/bazel_worker_java/0.0.11/source.json": "48b9b9c55f69cc360a54a712f47b889dd3d367ce2d45c3ccec242e9af86fe9cd",
"https://bcr.bazel.build/modules/bazel_worker_java/0.0.4/MODULE.bazel": "82494a01018bb7ef06d4a17ec4cd7a758721f10eb8b6c820a818e70d669500db",
"https://bcr.bazel.build/modules/bazel_worker_java/0.0.8/MODULE.bazel": "e76479eae70bd4e8f5f4c2dfc5d03ab971cfb18750246c7b3f3454c5c2ee6629",
"https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f",
@@ -109,7 +109,8 @@
"https://bcr.bazel.build/modules/gazelle/0.36.0/MODULE.bazel": "e375d5d6e9a6ca59b0cb38b0540bc9a05b6aa926d322f2de268ad267a2ee74c0",
"https://bcr.bazel.build/modules/gazelle/0.40.0/MODULE.bazel": "42ba5378ebe845fca43989a53186ab436d956db498acde790685fe0e8f9c6146",
"https://bcr.bazel.build/modules/gazelle/0.47.0/MODULE.bazel": "b61bb007c4efad134aa30ee7f4a8e2a39b22aa5685f005edaa022fbd1de43ebc",
- "https://bcr.bazel.build/modules/gazelle/0.47.0/source.json": "aeb2e5df14b7fb298625d75d08b9c65bdb0b56014c5eb89da9e5dd0572280ae6",
+ "https://bcr.bazel.build/modules/gazelle/0.51.3/MODULE.bazel": "618a729142f66de1e2cb776d026413763be5b80d5e3d29ffb9d3d90c5defde90",
+ "https://bcr.bazel.build/modules/gazelle/0.51.3/source.json": "fbe5312a01fb4a2a58caff4a0d40dcf384b6f0bda75e85546663360da1d7538a",
"https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb",
"https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4",
"https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6",
@@ -140,7 +141,8 @@
"https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d",
"https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc",
"https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580",
- "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96",
+ "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2",
+ "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344",
"https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7",
"https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a",
"https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12",
@@ -160,21 +162,23 @@
"https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d",
"https://bcr.bazel.build/modules/protobuf/33.1/MODULE.bazel": "982c8a0cceab4d790076f72b7677faf836b0dfadc2b66a34aab7232116c4ae39",
"https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42",
- "https://bcr.bazel.build/modules/protobuf/35.0/MODULE.bazel": "ee97170c013d94c366bbb5fe8a97b0650477cbc00e5e0f6a2c297484bc34d81b",
- "https://bcr.bazel.build/modules/protobuf/35.0/source.json": "2162e80adef862606ba85ae42e0df85eb519376fd6ab49caddee6fb776a1281e",
+ "https://bcr.bazel.build/modules/protobuf/35.1/MODULE.bazel": "9f25044d646c9c1b1e03b25aa3818bf5250078eabadbd213ea940262dba99471",
+ "https://bcr.bazel.build/modules/protobuf/35.1/source.json": "5e256f85483431bd96fc9a6ae468e420326673e9d9f250d313725875597bf1ba",
"https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e",
"https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34",
- "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680",
+ "https://bcr.bazel.build/modules/pybind11_bazel/3.0.0/MODULE.bazel": "a2bfa6020ed603a00d944161c63173c7f109774e99bee0c2cd8dbf24159f8134",
+ "https://bcr.bazel.build/modules/pybind11_bazel/3.0.0/source.json": "d8f5104d4c21d272bf327ebe44366fb0b4c036cdaa1f5cceb21a408ca4ef2ef8",
"https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206",
"https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a",
- "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4",
"https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa",
+ "https://bcr.bazel.build/modules/re2/2025-11-05.bcr.1/MODULE.bazel": "3d9d4995833fc0334fc5c88b56a05288dd25d651544cd7b2233bbd6357bbeba0",
+ "https://bcr.bazel.build/modules/re2/2025-11-05.bcr.1/source.json": "7df1394aabda1c9bc188a302f5d54b1c657924edd04ebc57d2be29dbd7efd141",
"https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8",
"https://bcr.bazel.build/modules/rules_android/0.6.4/MODULE.bazel": "b4cde12d506dd65d82b2be39761f49f5797303343a3d5b4ee191c0cdf9ef387c",
"https://bcr.bazel.build/modules/rules_android/0.6.6/MODULE.bazel": "b0fb569752aab65ab1a9db0a8f6cfaf5aa1754965e17e95dcf0e4d88e192a68d",
"https://bcr.bazel.build/modules/rules_android/0.7.1/MODULE.bazel": "a806fc382a774252f228a40e3b11b9fcc6276f8778c7fb33e9f72937c6258363",
- "https://bcr.bazel.build/modules/rules_android/0.7.2/MODULE.bazel": "0862d727582c8d117ac09cd3451b5e93d8b91033f0f13bb61a4a10334958130d",
- "https://bcr.bazel.build/modules/rules_android/0.7.2/source.json": "bf2dfc8dc72ffd2b58643c9d547f1b7faea4de65aa28ac4894687fa6afa09861",
+ "https://bcr.bazel.build/modules/rules_android/0.7.3/MODULE.bazel": "1fbc49fb397d31d74be83fe63eb0a5dc1a79df172ca90772166c35ab4cd67e7b",
+ "https://bcr.bazel.build/modules/rules_android/0.7.3/source.json": "80ffccd224a7f9b665f32360a64ba4228ba85c75fd0f6af43e290660147bb151",
"https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a",
"https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68",
"https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647",
@@ -198,6 +202,7 @@
"https://bcr.bazel.build/modules/rules_cc/0.2.17/source.json": "3832f45d145354049137c0090df04629d9c2b5493dc5c2bf46f1834040133a07",
"https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc",
"https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642",
+ "https://bcr.bazel.build/modules/rules_cc/0.2.9/MODULE.bazel": "34263f1dca62ea664265438cef714d7db124c03e1ed55ebb4f1dc860164308d1",
"https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6",
"https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8",
"https://bcr.bazel.build/modules/rules_go/0.41.0/MODULE.bazel": "55861d8e8bb0e62cbd2896f60ff303f62ffcb0eddb74ecb0e5c0cbe36fc292c8",
@@ -208,9 +213,10 @@
"https://bcr.bazel.build/modules/rules_go/0.53.0/MODULE.bazel": "a4ed760d3ac0dbc0d7b967631a9a3fd9100d28f7d9fcf214b4df87d4bfff5f9a",
"https://bcr.bazel.build/modules/rules_go/0.59.0/MODULE.bazel": "b7e43e7414a3139a7547d1b4909b29085fbe5182b6c58cbe1ed4c6272815aeae",
"https://bcr.bazel.build/modules/rules_go/0.60.0/MODULE.bazel": "4a57ff2ffc2a3570e3c5646575c5a4b07287e91bcdac5d1f72383d51502b48cb",
- "https://bcr.bazel.build/modules/rules_go/0.60.0/source.json": "1e21368c5e0c3013a110bd79a8fcff8ca46b5bcb2b561713a7273cbfcff7c464",
- "https://bcr.bazel.build/modules/rules_java/9.3.0/MODULE.bazel": "f657c72d65ac449caae9abf2e68e66c0d36f9416848c4c4903d0b3234229e7f2",
- "https://bcr.bazel.build/modules/rules_java/9.3.0/source.json": "59ae7e662c3c7042b88bbb42ad12483523e234c65ebe4c51611baa43e85cb248",
+ "https://bcr.bazel.build/modules/rules_go/0.62.0/MODULE.bazel": "8ee616065c3d2b2f7ac0880108316ce8d0c332b3a30aad24e95c0bc124ec853e",
+ "https://bcr.bazel.build/modules/rules_go/0.62.0/source.json": "36d781c558eb7d3bd49dc5e190455714f174232372f15207ab200b4348bda3e6",
+ "https://bcr.bazel.build/modules/rules_java/9.5.0/MODULE.bazel": "1c2f1c9e2fc75db13164da56012ff626cfb525c1a3de04329286c46829f2d6d9",
+ "https://bcr.bazel.build/modules/rules_java/9.5.0/source.json": "ba5c06fe7b6a31922e8b9c11947177ebed8fa46b45b70a5f810d97ac74bf888b",
"https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7",
"https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909",
"https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036",
@@ -223,7 +229,8 @@
"https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd",
"https://bcr.bazel.build/modules/rules_jvm_external/6.9/MODULE.bazel": "07c5db05527db7744a54fcffd653e1550d40e0540207a7f7e6d0a4de5bef8274",
"https://bcr.bazel.build/modules/rules_jvm_external/7.0/MODULE.bazel": "421482bdbcf05709f933c96b867a599deb517f2804ceb3e74511880610cfbf71",
- "https://bcr.bazel.build/modules/rules_jvm_external/7.0/source.json": "714cd003eadf5be5c83268311fe8e951db39f802babeaddc536b3560dc8f6faf",
+ "https://bcr.bazel.build/modules/rules_jvm_external/7.1/MODULE.bazel": "e151b1beaa45bfc9e5de4df637d980e27039eb2b1092a95972bf2adbf99ac1a0",
+ "https://bcr.bazel.build/modules/rules_jvm_external/7.1/source.json": "8cb571a9631c39bf29c1842958542f14bba1c704fe2bcde4fa54679b2a6b3d6f",
"https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59",
"https://bcr.bazel.build/modules/rules_kotlin/1.9.5/MODULE.bazel": "043a16a572f610558ec2030db3ff0c9938574e7dd9f58bded1bb07c0192ef025",
"https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3",
@@ -237,8 +244,8 @@
"https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb",
"https://bcr.bazel.build/modules/rules_nodejs/6.2.0/MODULE.bazel": "ec27907f55eb34705adb4e8257952162a2d4c3ed0f0b3b4c3c1aad1fac7be35e",
"https://bcr.bazel.build/modules/rules_nodejs/6.7.3/MODULE.bazel": "c22a48b2a0dbf05a9dc5f83837bbc24c226c1f6e618de3c3a610044c9f336056",
- "https://bcr.bazel.build/modules/rules_nodejs/6.7.4/MODULE.bazel": "e6a241a55c82e999145553d2e00a08fc6ebadf62b63d108fb5e984696ffd0bd2",
- "https://bcr.bazel.build/modules/rules_nodejs/6.7.4/source.json": "34e7a8a3b4c8d630ac0e0492b3fed9dba41fe008a0edf220b7d88fa38ac53698",
+ "https://bcr.bazel.build/modules/rules_nodejs/6.7.5/MODULE.bazel": "97e6794043821d23c013baa4a50fd1c599f2e6ae92b06e2c5f1cd7074fd83e7c",
+ "https://bcr.bazel.build/modules/rules_nodejs/6.7.5/source.json": "d60ee5a76258b1c8f99545ed24172b44d43ba64ca1a2dfc04371ef203df19fdf",
"https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc",
"https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff",
"https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a",
@@ -263,9 +270,11 @@
"https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13",
"https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6",
"https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8",
+ "https://bcr.bazel.build/modules/rules_python/1.6.3/MODULE.bazel": "a7b80c42cb3de5ee2a5fa1abc119684593704fcd2fec83165ebe615dec76574f",
"https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8",
"https://bcr.bazel.build/modules/rules_python/2.0.2/MODULE.bazel": "9d26ecb43f248c2663fb29f3c9b833aa86c31e736096e58c7077f80038f8d32f",
- "https://bcr.bazel.build/modules/rules_python/2.0.2/source.json": "36a74dedc1498bfbf72855568a24e6aa30c70b5ac7e114bc244c62b3a58b47fc",
+ "https://bcr.bazel.build/modules/rules_python/2.2.0/MODULE.bazel": "9ce85518b14625a3abec3c95e3fa739ab0578e58240ef829af20efebcdebc41a",
+ "https://bcr.bazel.build/modules/rules_python/2.2.0/source.json": "274b1ca2363520292527f21b8237aa0f562003ea5912ad07d96d98e87738f618",
"https://bcr.bazel.build/modules/rules_robolectric/4.14.1.2/MODULE.bazel": "d44fec647d0aeb67b9f3b980cf68ba634976f3ae7ccd6c07d790b59b87a4f251",
"https://bcr.bazel.build/modules/rules_robolectric/4.14.1.2/source.json": "37c10335f2361c337c5c1f34ed36d2da70534c23088062b33a8bdaab68aa9dea",
"https://bcr.bazel.build/modules/rules_rust/0.69.0/MODULE.bazel": "4326fec48f2fef0d514de46346f7f77e200c82936dd08b91c9ef039fbdad5c10",
@@ -297,7 +306,8 @@
"https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468",
"https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351",
"https://bcr.bazel.build/modules/toml.bzl/0.3.0/MODULE.bazel": "5016e5dd1ad2200e119a4b28b2b3935e276c4b480f2fe3e952bea7eeba88f578",
- "https://bcr.bazel.build/modules/toml.bzl/0.3.0/source.json": "0cf7c878c419b37ddb55f3dd93dd7c0c409bd7c4efacb3da504e0748780b2fa9",
+ "https://bcr.bazel.build/modules/toml.bzl/0.4.1/MODULE.bazel": "6bc0b938f03ade8d58c2fca0ad5c3fa12b4764e1e1927ad50b0c860286db2167",
+ "https://bcr.bazel.build/modules/toml.bzl/0.4.1/source.json": "86a90afd8b43c9b69ad31f5c03998c3adcf4b08175e621addb93e3a38eec538b",
"https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43",
"https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9",
"https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072",
@@ -311,56 +321,38 @@
},
"selectedYankedVersions": {},
"moduleExtensions": {
- "@@aspect_rules_ts+//ts:extensions.bzl%ext": {
- "general": {
- "bzlTransitiveDigest": "znGIWhsWB2BLftYOmjVGiqrZuccFABBogiS+i4Kg3tU=",
- "usagesDigest": "wmTY4QJrwyD3VUSOHaA0OPkvX0ywR/XPM2EecaJ8yGk=",
- "recordedInputs": [
- "REPO_MAPPING:aspect_rules_ts+,aspect_rules_ts aspect_rules_ts+",
- "REPO_MAPPING:aspect_rules_ts+,bazel_tools bazel_tools",
- "FILE:@@//package.json f230bdb8c76c59a925ec0727a1decc727388d47d4b20d95b4e5bcf328edc0c79"
- ],
- "generatedRepoSpecs": {
- "npm_typescript": {
- "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version",
- "attributes": {
- "version": "",
- "version_from": "@@//:package.json",
- "integrity": "",
- "urls": [
- "https://registry.npmjs.org/typescript/-/typescript-{}.tgz"
- ]
- }
- }
- }
- }
- },
"@@aspect_tools_telemetry+//:extension.bzl%telemetry": {
"general": {
- "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=",
- "usagesDigest": "VyFtm1DFYJGrU6mU+xj6UF6QCpzpFzBONF0/8BC6ZC8=",
+ "bzlTransitiveDigest": "4w9RM0xjdKo1crk5zL20a/TuhqO0P1z1LsuXDneBXD4=",
+ "usagesDigest": "VuWbxUOa4PEE7KktNjLNLRMFWZRv30gglkSl7mxZj9w=",
"recordedInputs": [
"REPO_MAPPING:aspect_tools_telemetry+,bazel_lib bazel_lib+",
- "REPO_MAPPING:aspect_tools_telemetry+,bazel_skylib bazel_skylib+"
+ "REPO_MAPPING:aspect_tools_telemetry+,bazel_skylib bazel_skylib+",
+ "ENV:ASPECT_TOOLS_TELEMETRY_TEST \\0"
],
"generatedRepoSpecs": {
"aspect_tools_telemetry_report": {
"repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository",
"attributes": {
"deps": {
- "aspect_rules_js": "3.1.2",
- "aspect_rules_ts": "3.8.8",
- "aspect_tools_telemetry": "0.3.3"
- }
+ "aspect_rules_js": "3.2.3",
+ "aspect_rules_ts": "3.9.2",
+ "aspect_tools_telemetry": "0.4.2"
+ },
+ "last_notice": 1
}
}
+ },
+ "moduleExtensionMetadata": {
+ "useAllRepos": "NO",
+ "reproducible": false
}
}
},
"@@protobuf+//python/dist:system_python.bzl%system_python_extension": {
"general": {
"bzlTransitiveDigest": "qh0n9IrXU/xS94wxKQrG1J63zrLkA1Wy2Y3BQxptPcI=",
- "usagesDigest": "tCi55FyqtOJ2jXh9vcjrHCl4ov3kpWiwKl103nA9BOI=",
+ "usagesDigest": "gM2v8KEcm9rpUrlYSngytVomDKFCsh+Qb9pL3rcZurY=",
"recordedInputs": [],
"generatedRepoSpecs": {
"system_python": {
@@ -372,32 +364,10 @@
}
}
},
- "@@pybind11_bazel+//:internal_configure.bzl%internal_configure_extension": {
- "general": {
- "bzlTransitiveDigest": "b+RP7Sgl8KN0VHamrgTqzGLuYPcQ/Mo4ptNkkHUIIlA=",
- "usagesDigest": "D1r3lfzMuUBFxgG8V6o0bQTLMk3GkaGOaPzw53wrwyw=",
- "recordedInputs": [
- "REPO_MAPPING:pybind11_bazel+,bazel_tools bazel_tools",
- "FILE:@@pybind11_bazel+//MODULE.bazel e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34"
- ],
- "generatedRepoSpecs": {
- "pybind11": {
- "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
- "attributes": {
- "build_file": "@@pybind11_bazel+//:pybind11-BUILD.bazel",
- "strip_prefix": "pybind11-2.12.0",
- "urls": [
- "https://github.com/pybind/pybind11/archive/v2.12.0.zip"
- ]
- }
- }
- }
- }
- },
"@@rules_android+//bzlmod_extensions:apksig.bzl%apksig_extension": {
"general": {
"bzlTransitiveDigest": "O/gCjP4/VVnaP+zTRGN3DFrkkxLE5GMbE4M1HG3noGQ=",
- "usagesDigest": "S8lLnnZxdeYUYq3kIGhVMk0wQ9Fd6elmCskvn+SL6iw=",
+ "usagesDigest": "wLrLUdBOQnztFcFQraEsWu+M4xtuF82/ZGmnhyxO5/Q=",
"recordedInputs": [
"REPO_MAPPING:rules_android+,bazel_tools bazel_tools"
],
@@ -418,7 +388,7 @@
"@@rules_android+//bzlmod_extensions:com_android_dex.bzl%com_android_dex_extension": {
"general": {
"bzlTransitiveDigest": "fVTI/3B6KjJ93jRf+pOa6ExSALb1hgRndpTPBrJKoZQ=",
- "usagesDigest": "0hluQmaWiWak6sVMP5L4wXhNyIwv9fw0y5JJ8lnPb1c=",
+ "usagesDigest": "QffKrRLRrfyxMU5u/o3mDLJNoWRk/D5i2SIumoSgm3M=",
"recordedInputs": [
"REPO_MAPPING:rules_android+,bazel_tools bazel_tools"
],
@@ -439,7 +409,7 @@
"@@rules_android+//rules/android_sdk_repository:rule.bzl%android_sdk_repository_extension": {
"general": {
"bzlTransitiveDigest": "qHbR00gVzVzkxX+PRtv4UGcUFMtBz7TK9CNYUWH8nIE=",
- "usagesDigest": "tTIw/WMyb1t/LzacDY8lDjUznzxQ3MyXW6474WIS3WQ=",
+ "usagesDigest": "x1HLqlqAwv0KTxojlsMXLqzK2rEGmh0n16qUmbSgEak=",
"recordedInputs": [],
"generatedRepoSpecs": {
"androidsdk": {
@@ -449,429 +419,10 @@
}
}
},
- "@@rules_nodejs+//nodejs:extensions.bzl%node": {
- "general": {
- "bzlTransitiveDigest": "oZFClfRhTTwsYzpxVPkOpOt/r0+OzEfEV37au0jFZ0s=",
- "usagesDigest": "rmuj3zuYtKpBbldwwQvwLpB0VwZVHNwpx5rco2PvuLY=",
- "recordedInputs": [],
- "generatedRepoSpecs": {
- "nodejs_linux_amd64": {
- "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
- "attributes": {
- "node_download_auth": {},
- "node_repositories": {
- "24.14.1-darwin_arm64": [
- "node-v24.14.1-darwin-arm64.tar.gz",
- "node-v24.14.1-darwin-arm64",
- "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"
- ],
- "24.14.1-darwin_amd64": [
- "node-v24.14.1-darwin-x64.tar.gz",
- "node-v24.14.1-darwin-x64",
- "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"
- ],
- "24.14.1-linux_arm64": [
- "node-v24.14.1-linux-arm64.tar.xz",
- "node-v24.14.1-linux-arm64",
- "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"
- ],
- "24.14.1-linux_ppc64le": [
- "node-v24.14.1-linux-ppc64le.tar.xz",
- "node-v24.14.1-linux-ppc64le",
- "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"
- ],
- "24.14.1-linux_s390x": [
- "node-v24.14.1-linux-s390x.tar.xz",
- "node-v24.14.1-linux-s390x",
- "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"
- ],
- "24.14.1-linux_amd64": [
- "node-v24.14.1-linux-x64.tar.xz",
- "node-v24.14.1-linux-x64",
- "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"
- ],
- "24.14.1-windows_amd64": [
- "node-v24.14.1-win-x64.zip",
- "node-v24.14.1-win-x64",
- "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"
- ]
- },
- "node_urls": [
- "https://nodejs.org/dist/v{version}/{filename}"
- ],
- "node_version": "24.14.1",
- "include_headers": false,
- "platform": "linux_amd64"
- }
- },
- "nodejs_linux_arm64": {
- "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
- "attributes": {
- "node_download_auth": {},
- "node_repositories": {
- "24.14.1-darwin_arm64": [
- "node-v24.14.1-darwin-arm64.tar.gz",
- "node-v24.14.1-darwin-arm64",
- "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"
- ],
- "24.14.1-darwin_amd64": [
- "node-v24.14.1-darwin-x64.tar.gz",
- "node-v24.14.1-darwin-x64",
- "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"
- ],
- "24.14.1-linux_arm64": [
- "node-v24.14.1-linux-arm64.tar.xz",
- "node-v24.14.1-linux-arm64",
- "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"
- ],
- "24.14.1-linux_ppc64le": [
- "node-v24.14.1-linux-ppc64le.tar.xz",
- "node-v24.14.1-linux-ppc64le",
- "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"
- ],
- "24.14.1-linux_s390x": [
- "node-v24.14.1-linux-s390x.tar.xz",
- "node-v24.14.1-linux-s390x",
- "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"
- ],
- "24.14.1-linux_amd64": [
- "node-v24.14.1-linux-x64.tar.xz",
- "node-v24.14.1-linux-x64",
- "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"
- ],
- "24.14.1-windows_amd64": [
- "node-v24.14.1-win-x64.zip",
- "node-v24.14.1-win-x64",
- "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"
- ]
- },
- "node_urls": [
- "https://nodejs.org/dist/v{version}/{filename}"
- ],
- "node_version": "24.14.1",
- "include_headers": false,
- "platform": "linux_arm64"
- }
- },
- "nodejs_linux_s390x": {
- "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
- "attributes": {
- "node_download_auth": {},
- "node_repositories": {
- "24.14.1-darwin_arm64": [
- "node-v24.14.1-darwin-arm64.tar.gz",
- "node-v24.14.1-darwin-arm64",
- "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"
- ],
- "24.14.1-darwin_amd64": [
- "node-v24.14.1-darwin-x64.tar.gz",
- "node-v24.14.1-darwin-x64",
- "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"
- ],
- "24.14.1-linux_arm64": [
- "node-v24.14.1-linux-arm64.tar.xz",
- "node-v24.14.1-linux-arm64",
- "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"
- ],
- "24.14.1-linux_ppc64le": [
- "node-v24.14.1-linux-ppc64le.tar.xz",
- "node-v24.14.1-linux-ppc64le",
- "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"
- ],
- "24.14.1-linux_s390x": [
- "node-v24.14.1-linux-s390x.tar.xz",
- "node-v24.14.1-linux-s390x",
- "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"
- ],
- "24.14.1-linux_amd64": [
- "node-v24.14.1-linux-x64.tar.xz",
- "node-v24.14.1-linux-x64",
- "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"
- ],
- "24.14.1-windows_amd64": [
- "node-v24.14.1-win-x64.zip",
- "node-v24.14.1-win-x64",
- "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"
- ]
- },
- "node_urls": [
- "https://nodejs.org/dist/v{version}/{filename}"
- ],
- "node_version": "24.14.1",
- "include_headers": false,
- "platform": "linux_s390x"
- }
- },
- "nodejs_linux_ppc64le": {
- "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
- "attributes": {
- "node_download_auth": {},
- "node_repositories": {
- "24.14.1-darwin_arm64": [
- "node-v24.14.1-darwin-arm64.tar.gz",
- "node-v24.14.1-darwin-arm64",
- "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"
- ],
- "24.14.1-darwin_amd64": [
- "node-v24.14.1-darwin-x64.tar.gz",
- "node-v24.14.1-darwin-x64",
- "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"
- ],
- "24.14.1-linux_arm64": [
- "node-v24.14.1-linux-arm64.tar.xz",
- "node-v24.14.1-linux-arm64",
- "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"
- ],
- "24.14.1-linux_ppc64le": [
- "node-v24.14.1-linux-ppc64le.tar.xz",
- "node-v24.14.1-linux-ppc64le",
- "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"
- ],
- "24.14.1-linux_s390x": [
- "node-v24.14.1-linux-s390x.tar.xz",
- "node-v24.14.1-linux-s390x",
- "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"
- ],
- "24.14.1-linux_amd64": [
- "node-v24.14.1-linux-x64.tar.xz",
- "node-v24.14.1-linux-x64",
- "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"
- ],
- "24.14.1-windows_amd64": [
- "node-v24.14.1-win-x64.zip",
- "node-v24.14.1-win-x64",
- "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"
- ]
- },
- "node_urls": [
- "https://nodejs.org/dist/v{version}/{filename}"
- ],
- "node_version": "24.14.1",
- "include_headers": false,
- "platform": "linux_ppc64le"
- }
- },
- "nodejs_darwin_amd64": {
- "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
- "attributes": {
- "node_download_auth": {},
- "node_repositories": {
- "24.14.1-darwin_arm64": [
- "node-v24.14.1-darwin-arm64.tar.gz",
- "node-v24.14.1-darwin-arm64",
- "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"
- ],
- "24.14.1-darwin_amd64": [
- "node-v24.14.1-darwin-x64.tar.gz",
- "node-v24.14.1-darwin-x64",
- "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"
- ],
- "24.14.1-linux_arm64": [
- "node-v24.14.1-linux-arm64.tar.xz",
- "node-v24.14.1-linux-arm64",
- "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"
- ],
- "24.14.1-linux_ppc64le": [
- "node-v24.14.1-linux-ppc64le.tar.xz",
- "node-v24.14.1-linux-ppc64le",
- "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"
- ],
- "24.14.1-linux_s390x": [
- "node-v24.14.1-linux-s390x.tar.xz",
- "node-v24.14.1-linux-s390x",
- "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"
- ],
- "24.14.1-linux_amd64": [
- "node-v24.14.1-linux-x64.tar.xz",
- "node-v24.14.1-linux-x64",
- "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"
- ],
- "24.14.1-windows_amd64": [
- "node-v24.14.1-win-x64.zip",
- "node-v24.14.1-win-x64",
- "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"
- ]
- },
- "node_urls": [
- "https://nodejs.org/dist/v{version}/{filename}"
- ],
- "node_version": "24.14.1",
- "include_headers": false,
- "platform": "darwin_amd64"
- }
- },
- "nodejs_darwin_arm64": {
- "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
- "attributes": {
- "node_download_auth": {},
- "node_repositories": {
- "24.14.1-darwin_arm64": [
- "node-v24.14.1-darwin-arm64.tar.gz",
- "node-v24.14.1-darwin-arm64",
- "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"
- ],
- "24.14.1-darwin_amd64": [
- "node-v24.14.1-darwin-x64.tar.gz",
- "node-v24.14.1-darwin-x64",
- "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"
- ],
- "24.14.1-linux_arm64": [
- "node-v24.14.1-linux-arm64.tar.xz",
- "node-v24.14.1-linux-arm64",
- "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"
- ],
- "24.14.1-linux_ppc64le": [
- "node-v24.14.1-linux-ppc64le.tar.xz",
- "node-v24.14.1-linux-ppc64le",
- "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"
- ],
- "24.14.1-linux_s390x": [
- "node-v24.14.1-linux-s390x.tar.xz",
- "node-v24.14.1-linux-s390x",
- "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"
- ],
- "24.14.1-linux_amd64": [
- "node-v24.14.1-linux-x64.tar.xz",
- "node-v24.14.1-linux-x64",
- "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"
- ],
- "24.14.1-windows_amd64": [
- "node-v24.14.1-win-x64.zip",
- "node-v24.14.1-win-x64",
- "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"
- ]
- },
- "node_urls": [
- "https://nodejs.org/dist/v{version}/{filename}"
- ],
- "node_version": "24.14.1",
- "include_headers": false,
- "platform": "darwin_arm64"
- }
- },
- "nodejs_windows_amd64": {
- "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
- "attributes": {
- "node_download_auth": {},
- "node_repositories": {
- "24.14.1-darwin_arm64": [
- "node-v24.14.1-darwin-arm64.tar.gz",
- "node-v24.14.1-darwin-arm64",
- "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"
- ],
- "24.14.1-darwin_amd64": [
- "node-v24.14.1-darwin-x64.tar.gz",
- "node-v24.14.1-darwin-x64",
- "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"
- ],
- "24.14.1-linux_arm64": [
- "node-v24.14.1-linux-arm64.tar.xz",
- "node-v24.14.1-linux-arm64",
- "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"
- ],
- "24.14.1-linux_ppc64le": [
- "node-v24.14.1-linux-ppc64le.tar.xz",
- "node-v24.14.1-linux-ppc64le",
- "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"
- ],
- "24.14.1-linux_s390x": [
- "node-v24.14.1-linux-s390x.tar.xz",
- "node-v24.14.1-linux-s390x",
- "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"
- ],
- "24.14.1-linux_amd64": [
- "node-v24.14.1-linux-x64.tar.xz",
- "node-v24.14.1-linux-x64",
- "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"
- ],
- "24.14.1-windows_amd64": [
- "node-v24.14.1-win-x64.zip",
- "node-v24.14.1-win-x64",
- "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"
- ]
- },
- "node_urls": [
- "https://nodejs.org/dist/v{version}/{filename}"
- ],
- "node_version": "24.14.1",
- "include_headers": false,
- "platform": "windows_amd64"
- }
- },
- "nodejs_windows_arm64": {
- "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
- "attributes": {
- "node_download_auth": {},
- "node_repositories": {
- "24.14.1-darwin_arm64": [
- "node-v24.14.1-darwin-arm64.tar.gz",
- "node-v24.14.1-darwin-arm64",
- "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"
- ],
- "24.14.1-darwin_amd64": [
- "node-v24.14.1-darwin-x64.tar.gz",
- "node-v24.14.1-darwin-x64",
- "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"
- ],
- "24.14.1-linux_arm64": [
- "node-v24.14.1-linux-arm64.tar.xz",
- "node-v24.14.1-linux-arm64",
- "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"
- ],
- "24.14.1-linux_ppc64le": [
- "node-v24.14.1-linux-ppc64le.tar.xz",
- "node-v24.14.1-linux-ppc64le",
- "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"
- ],
- "24.14.1-linux_s390x": [
- "node-v24.14.1-linux-s390x.tar.xz",
- "node-v24.14.1-linux-s390x",
- "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"
- ],
- "24.14.1-linux_amd64": [
- "node-v24.14.1-linux-x64.tar.xz",
- "node-v24.14.1-linux-x64",
- "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"
- ],
- "24.14.1-windows_amd64": [
- "node-v24.14.1-win-x64.zip",
- "node-v24.14.1-win-x64",
- "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"
- ]
- },
- "node_urls": [
- "https://nodejs.org/dist/v{version}/{filename}"
- ],
- "node_version": "24.14.1",
- "include_headers": false,
- "platform": "windows_arm64"
- }
- },
- "nodejs": {
- "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias",
- "attributes": {
- "user_node_repository_name": "nodejs"
- }
- },
- "nodejs_host": {
- "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias",
- "attributes": {
- "user_node_repository_name": "nodejs"
- }
- },
- "nodejs_toolchains": {
- "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo",
- "attributes": {
- "user_node_repository_name": "nodejs"
- }
- }
- }
- }
- },
"@@rules_python+//python/uv:uv.bzl%uv": {
"general": {
- "bzlTransitiveDigest": "I8FPZMevE2oI/peSpMBRVIN++WOtfjtJVjbPsBZQ87A=",
- "usagesDigest": "R0pij/Kri0Z/7GcM2UBot6XmOqgduje0j8y9wNMWjLA=",
+ "bzlTransitiveDigest": "ELjwPp2kLku5M3S/gpjjVjy3TwT760/zVEQ70nJreHU=",
+ "usagesDigest": "LCPgc6OYAryd0HQJS9CtnCxvca1YfrjIZ67iPax2aRs=",
"recordedInputs": [
"REPO_MAPPING:rules_python+,bazel_tools bazel_tools",
"REPO_MAPPING:rules_python+,platforms platforms"
@@ -900,8 +451,8 @@
},
"@@rules_rust+//crate_universe:extension.bzl%crate": {
"general": {
- "bzlTransitiveDigest": "4ZxdDHM5dGVbcpGNyPxSWkXiz1DTw/ldJgFC1a5SPOI=",
- "usagesDigest": "EuFUqVKVHF263jHTWOHXs4tFACdRNVOhwpoytdk19bs=",
+ "bzlTransitiveDigest": "K+bEGGE6qig9d3u/VfssYviFnqPTY/UqNwih5xbf3iI=",
+ "usagesDigest": "3M03XhIi/1oRPtWHXCs5R9YQ+nQb9Yb2k0xdzczdmnk=",
"recordedInputs": [
"ENV:CARGO_BAZEL_DEBUG \\0",
"ENV:CARGO_BAZEL_GENERATOR_SHA256 \\0",
@@ -930,9 +481,9 @@
"repoRuleId": "@@rules_rust+//crate_universe:extensions.bzl%_generate_repo",
"attributes": {
"contents": {
- "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"googletest-0.14.2\",\n actual = \"@crates__googletest-0.14.2//:googletest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"googletest\",\n actual = \"@crates__googletest-0.14.2//:googletest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"linkme-0.3.36\",\n actual = \"@crates__linkme-0.3.36//:linkme\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"linkme\",\n actual = \"@crates__linkme-0.3.36//:linkme\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"paste-1.0.15\",\n actual = \"@crates__paste-1.0.15//:paste\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"paste\",\n actual = \"@crates__paste-1.0.15//:paste\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"quote-1.0.45\",\n actual = \"@crates__quote-1.0.45//:quote\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"quote\",\n actual = \"@crates__quote-1.0.45//:quote\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syn-2.0.117\",\n actual = \"@crates__syn-2.0.117//:syn\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syn\",\n actual = \"@crates__syn-2.0.117//:syn\",\n tags = [\"manual\"],\n)\n",
+ "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"googletest-0.14.3\",\n actual = \"@crates__googletest-0.14.3//:googletest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"googletest\",\n actual = \"@crates__googletest-0.14.3//:googletest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"linkme-0.3.37\",\n actual = \"@crates__linkme-0.3.37//:linkme\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"linkme\",\n actual = \"@crates__linkme-0.3.37//:linkme\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"paste-1.0.15\",\n actual = \"@crates__paste-1.0.15//:paste\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"paste\",\n actual = \"@crates__paste-1.0.15//:paste\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"quote-1.0.47\",\n actual = \"@crates__quote-1.0.47//:quote\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"quote\",\n actual = \"@crates__quote-1.0.47//:quote\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syn-3.0.3\",\n actual = \"@crates__syn-3.0.3//:syn\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syn\",\n actual = \"@crates__syn-3.0.3//:syn\",\n tags = [\"manual\"],\n)\n",
"alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n",
- "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"googletest\": Label(\"@crates//:googletest-0.14.2\"),\n \"linkme\": Label(\"@crates//:linkme-0.3.36\"),\n \"quote\": Label(\"@crates//:quote-1.0.45\"),\n \"syn\": Label(\"@crates//:syn-2.0.117\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"paste\": Label(\"@crates//:paste-1.0.15\"),\n },\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.4\",\n sha256 = \"ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.4/download\"],\n strip_prefix = \"aho-corasick-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.1\",\n sha256 = \"f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.1/download\"],\n strip_prefix = \"autocfg-1.5.1\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__googletest-0.14.2\",\n sha256 = \"06597b7d02ee58b9a37f522785ac15b9e18c6b178747c4439a6c03fbb35ea753\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/googletest/0.14.2/download\"],\n strip_prefix = \"googletest-0.14.2\",\n build_file = Label(\"@crates//crates:BUILD.googletest-0.14.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__googletest_macro-0.14.2\",\n sha256 = \"c31d9f07c9c19b855faebf71637be3b43f8e13a518aece5d61a3beee7710b4ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/googletest_macro/0.14.2/download\"],\n strip_prefix = \"googletest_macro-0.14.2\",\n build_file = Label(\"@crates//crates:BUILD.googletest_macro-0.14.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linkme-0.3.36\",\n sha256 = \"e83272d46373fb8decca684579ac3e7c8f3d71d4cc3aa693df8759e260ae41cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linkme/0.3.36/download\"],\n strip_prefix = \"linkme-0.3.36\",\n build_file = Label(\"@crates//crates:BUILD.linkme-0.3.36.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linkme-impl-0.3.36\",\n sha256 = \"32d59e20403c7d08fe62b4376edfe5c7fb2ef1e6b1465379686d0f21c8df444b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linkme-impl/0.3.36/download\"],\n strip_prefix = \"linkme-impl-0.3.36\",\n build_file = Label(\"@crates//crates:BUILD.linkme-impl-0.3.36.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.8.1\",\n sha256 = \"6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.1/download\"],\n strip_prefix = \"memchr-2.8.1\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__paste-1.0.15\",\n sha256 = \"57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/paste/1.0.15/download\"],\n strip_prefix = \"paste-1.0.15\",\n build_file = Label(\"@crates//crates:BUILD.paste-1.0.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.106\",\n sha256 = \"8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.106/download\"],\n strip_prefix = \"proc-macro2-1.0.106\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.106.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.45\",\n sha256 = \"41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.45/download\"],\n strip_prefix = \"quote-1.0.45\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.12.3\",\n sha256 = \"e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.12.3/download\"],\n strip_prefix = \"regex-1.12.3\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.12.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.14\",\n sha256 = \"6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.14/download\"],\n strip_prefix = \"regex-automata-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.10\",\n sha256 = \"dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.10/download\"],\n strip_prefix = \"regex-syntax-0.8.10\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.22\",\n sha256 = \"b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.22/download\"],\n strip_prefix = \"rustversion-1.0.22\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.117\",\n sha256 = \"e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.117/download\"],\n strip_prefix = \"syn-2.0.117\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.117.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n return [\n struct(repo=\"crates__googletest-0.14.2\", is_dev_dep = False),\n struct(repo=\"crates__linkme-0.3.36\", is_dev_dep = False),\n struct(repo=\"crates__paste-1.0.15\", is_dev_dep = False),\n struct(repo=\"crates__quote-1.0.45\", is_dev_dep = False),\n struct(repo=\"crates__syn-2.0.117\", is_dev_dep = False),\n ]\n"
+ "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"googletest\": Label(\"@crates//:googletest-0.14.3\"),\n \"linkme\": Label(\"@crates//:linkme-0.3.37\"),\n \"quote\": Label(\"@crates//:quote-1.0.47\"),\n \"syn\": Label(\"@crates//:syn-3.0.3\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"paste\": Label(\"@crates//:paste-1.0.15\"),\n },\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.4\",\n sha256 = \"ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.4/download\"],\n strip_prefix = \"aho-corasick-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.1\",\n sha256 = \"f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.1/download\"],\n strip_prefix = \"autocfg-1.5.1\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__googletest-0.14.3\",\n sha256 = \"f6b5e2f2b556b7b90297a5a35c8267dd43a537923d2b329beefdba2b4ec19d94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/googletest/0.14.3/download\"],\n strip_prefix = \"googletest-0.14.3\",\n build_file = Label(\"@crates//crates:BUILD.googletest-0.14.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__googletest_macro-0.14.3\",\n sha256 = \"2ae6abc96141edd26bf5aeec0f119c129c44de3ced09e5073711a02cb74725d0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/googletest_macro/0.14.3/download\"],\n strip_prefix = \"googletest_macro-0.14.3\",\n build_file = Label(\"@crates//crates:BUILD.googletest_macro-0.14.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linkme-0.3.37\",\n sha256 = \"3045e122bd98aef8ec3ad58ce84f0791f64e70163d1a02710af4aa11a4d54cc5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linkme/0.3.37/download\"],\n strip_prefix = \"linkme-0.3.37\",\n build_file = Label(\"@crates//crates:BUILD.linkme-0.3.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linkme-impl-0.3.37\",\n sha256 = \"77060ebe535362c3da75682cd17b0431017b6e7c5661e714fc69a7ad017d1301\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linkme-impl/0.3.37/download\"],\n strip_prefix = \"linkme-impl-0.3.37\",\n build_file = Label(\"@crates//crates:BUILD.linkme-impl-0.3.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.8.3\",\n sha256 = \"cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.3/download\"],\n strip_prefix = \"memchr-2.8.3\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__paste-1.0.15\",\n sha256 = \"57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/paste/1.0.15/download\"],\n strip_prefix = \"paste-1.0.15\",\n build_file = Label(\"@crates//crates:BUILD.paste-1.0.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.107\",\n sha256 = \"985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.107/download\"],\n strip_prefix = \"proc-macro2-1.0.107\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.107.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.47\",\n sha256 = \"1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.47/download\"],\n strip_prefix = \"quote-1.0.47\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.47.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.13.1\",\n sha256 = \"f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.13.1/download\"],\n strip_prefix = \"regex-1.13.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.16\",\n sha256 = \"8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.16/download\"],\n strip_prefix = \"regex-automata-0.4.16\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.11\",\n sha256 = \"d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.11/download\"],\n strip_prefix = \"regex-syntax-0.8.11\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.23\",\n sha256 = \"cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.23/download\"],\n strip_prefix = \"rustversion-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.119\",\n sha256 = \"872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.119/download\"],\n strip_prefix = \"syn-2.0.119\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.119.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-3.0.3\",\n sha256 = \"53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/3.0.3/download\"],\n strip_prefix = \"syn-3.0.3\",\n build_file = Label(\"@crates//crates:BUILD.syn-3.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n return [\n struct(repo=\"crates__googletest-0.14.3\", is_dev_dep = False),\n struct(repo=\"crates__linkme-0.3.37\", is_dev_dep = False),\n struct(repo=\"crates__paste-1.0.15\", is_dev_dep = False),\n struct(repo=\"crates__quote-1.0.47\", is_dev_dep = False),\n struct(repo=\"crates__syn-3.0.3\", is_dev_dep = False),\n ]\n"
}
}
},
@@ -946,7 +497,7 @@
"https://static.crates.io/crates/aho-corasick/1.1.4/download"
],
"strip_prefix": "aho-corasick-1.1.4",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"aho_corasick\",\n deps = [\n \"@crates__memchr-2.8.1//:memchr\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"perf-literal\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=aho-corasick\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.4\",\n)\n"
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"aho_corasick\",\n deps = [\n \"@crates__memchr-2.8.3//:memchr\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"perf-literal\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=aho-corasick\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.4\",\n)\n"
}
},
"crates__autocfg-1.5.1": {
@@ -962,69 +513,69 @@
"build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"autocfg\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2015\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=autocfg\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.5.1\",\n)\n"
}
},
- "crates__googletest-0.14.2": {
+ "crates__googletest-0.14.3": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "06597b7d02ee58b9a37f522785ac15b9e18c6b178747c4439a6c03fbb35ea753",
+ "sha256": "f6b5e2f2b556b7b90297a5a35c8267dd43a537923d2b329beefdba2b4ec19d94",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/googletest/0.14.2/download"
+ "https://static.crates.io/crates/googletest/0.14.3/download"
],
- "strip_prefix": "googletest-0.14.2",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"googletest\",\n deps = [\n \"@crates__num-traits-0.2.19//:num_traits\",\n \"@crates__regex-1.12.3//:regex\",\n ],\n proc_macro_deps = [\n \"@crates__googletest_macro-0.14.2//:googletest_macro\",\n \"@crates__rustversion-1.0.22//:rustversion\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=googletest\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.14.2\",\n)\n"
+ "strip_prefix": "googletest-0.14.3",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"googletest\",\n deps = [\n \"@crates__num-traits-0.2.19//:num_traits\",\n \"@crates__regex-1.13.1//:regex\",\n ],\n proc_macro_deps = [\n \"@crates__googletest_macro-0.14.3//:googletest_macro\",\n \"@crates__rustversion-1.0.23//:rustversion\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=googletest\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.14.3\",\n)\n"
}
},
- "crates__googletest_macro-0.14.2": {
+ "crates__googletest_macro-0.14.3": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "c31d9f07c9c19b855faebf71637be3b43f8e13a518aece5d61a3beee7710b4ef",
+ "sha256": "2ae6abc96141edd26bf5aeec0f119c129c44de3ced09e5073711a02cb74725d0",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/googletest_macro/0.14.2/download"
+ "https://static.crates.io/crates/googletest_macro/0.14.3/download"
],
- "strip_prefix": "googletest_macro-0.14.2",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"googletest_macro\",\n deps = [\n \"@crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@crates__quote-1.0.45//:quote\",\n \"@crates__syn-2.0.117//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=googletest_macro\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.14.2\",\n)\n"
+ "strip_prefix": "googletest_macro-0.14.3",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"googletest_macro\",\n deps = [\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__syn-2.0.119//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=googletest_macro\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.14.3\",\n)\n"
}
},
- "crates__linkme-0.3.36": {
+ "crates__linkme-0.3.37": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "e83272d46373fb8decca684579ac3e7c8f3d71d4cc3aa693df8759e260ae41cf",
+ "sha256": "3045e122bd98aef8ec3ad58ce84f0791f64e70163d1a02710af4aa11a4d54cc5",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/linkme/0.3.36/download"
+ "https://static.crates.io/crates/linkme/0.3.37/download"
],
- "strip_prefix": "linkme-0.3.36",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"linkme\",\n deps = [\n \"@crates__linkme-0.3.36//:build_script_build\",\n ],\n proc_macro_deps = [\n \"@crates__linkme-impl-0.3.36//:linkme_impl\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=linkme\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.36\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"linkme\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=linkme\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.3.36\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
+ "strip_prefix": "linkme-0.3.37",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"linkme\",\n deps = [\n \"@crates__linkme-0.3.37//:build_script_build\",\n ],\n proc_macro_deps = [\n \"@crates__linkme-impl-0.3.37//:linkme_impl\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=linkme\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.37\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"linkme\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=linkme\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.3.37\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
}
},
- "crates__linkme-impl-0.3.36": {
+ "crates__linkme-impl-0.3.37": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "32d59e20403c7d08fe62b4376edfe5c7fb2ef1e6b1465379686d0f21c8df444b",
+ "sha256": "77060ebe535362c3da75682cd17b0431017b6e7c5661e714fc69a7ad017d1301",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/linkme-impl/0.3.36/download"
+ "https://static.crates.io/crates/linkme-impl/0.3.37/download"
],
- "strip_prefix": "linkme-impl-0.3.36",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"linkme_impl\",\n deps = [\n \"@crates__linkme-impl-0.3.36//:build_script_build\",\n \"@crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@crates__quote-1.0.45//:quote\",\n \"@crates__syn-2.0.117//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=linkme-impl\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.36\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"linkme-impl\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=linkme-impl\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.3.36\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
+ "strip_prefix": "linkme-impl-0.3.37",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"linkme_impl\",\n deps = [\n \"@crates__linkme-impl-0.3.37//:build_script_build\",\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__syn-3.0.3//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=linkme-impl\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.37\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"linkme-impl\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=linkme-impl\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.3.37\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
}
},
- "crates__memchr-2.8.1": {
+ "crates__memchr-2.8.3": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8",
+ "sha256": "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/memchr/2.8.1/download"
+ "https://static.crates.io/crates/memchr/2.8.3/download"
],
- "strip_prefix": "memchr-2.8.1",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"memchr\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=memchr\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.8.1\",\n)\n"
+ "strip_prefix": "memchr-2.8.3",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"memchr\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=memchr\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.8.3\",\n)\n"
}
},
"crates__num-traits-0.2.19": {
@@ -1053,95 +604,108 @@
"build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"paste\",\n deps = [\n \"@crates__paste-1.0.15//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=paste\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.15\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"paste\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=paste\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.15\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
}
},
- "crates__proc-macro2-1.0.106": {
+ "crates__proc-macro2-1.0.107": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934",
+ "sha256": "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/proc-macro2/1.0.106/download"
+ "https://static.crates.io/crates/proc-macro2/1.0.107/download"
],
- "strip_prefix": "proc-macro2-1.0.106",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"proc_macro2\",\n deps = [\n \"@crates__proc-macro2-1.0.106//:build_script_build\",\n \"@crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"proc-macro\",\n ] + select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n \"default\", # aarch64-apple-darwin\n ],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n \"default\", # aarch64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [\n \"default\", # x86_64-pc-windows-msvc\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [\n \"default\", # x86_64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [\n \"default\", # x86_64-unknown-nixos-gnu\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=proc-macro2\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.106\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"proc-macro\",\n ] + select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n \"default\", # aarch64-apple-darwin\n ],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n \"default\", # aarch64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [\n \"default\", # x86_64-pc-windows-msvc\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [\n \"default\", # x86_64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [\n \"default\", # x86_64-unknown-nixos-gnu\n ],\n \"//conditions:default\": [],\n }),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"proc-macro2\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=proc-macro2\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.106\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
+ "strip_prefix": "proc-macro2-1.0.107",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"proc_macro2\",\n deps = [\n \"@crates__proc-macro2-1.0.107//:build_script_build\",\n \"@crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"proc-macro\",\n ] + select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n \"default\", # aarch64-apple-darwin\n ],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n \"default\", # aarch64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [\n \"default\", # x86_64-pc-windows-msvc\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [\n \"default\", # x86_64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [\n \"default\", # x86_64-unknown-nixos-gnu\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=proc-macro2\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.107\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"proc-macro\",\n ] + select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n \"default\", # aarch64-apple-darwin\n ],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n \"default\", # aarch64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [\n \"default\", # x86_64-pc-windows-msvc\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [\n \"default\", # x86_64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [\n \"default\", # x86_64-unknown-nixos-gnu\n ],\n \"//conditions:default\": [],\n }),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"proc-macro2\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=proc-macro2\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.107\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
}
},
- "crates__quote-1.0.45": {
+ "crates__quote-1.0.47": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924",
+ "sha256": "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/quote/1.0.45/download"
+ "https://static.crates.io/crates/quote/1.0.47/download"
],
- "strip_prefix": "quote-1.0.45",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"quote\",\n deps = [\n \"@crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@crates__quote-1.0.45//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"proc-macro\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=quote\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.45\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"proc-macro\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"quote\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=quote\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.45\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
+ "strip_prefix": "quote-1.0.47",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"quote\",\n deps = [\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"proc-macro\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=quote\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.47\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"proc-macro\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"quote\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=quote\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.47\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
}
},
- "crates__regex-1.12.3": {
+ "crates__regex-1.13.1": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276",
+ "sha256": "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/regex/1.12.3/download"
+ "https://static.crates.io/crates/regex/1.13.1/download"
],
- "strip_prefix": "regex-1.12.3",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"regex\",\n deps = [\n \"@crates__aho-corasick-1.1.4//:aho_corasick\",\n \"@crates__memchr-2.8.1//:memchr\",\n \"@crates__regex-automata-0.4.14//:regex_automata\",\n \"@crates__regex-syntax-0.8.10//:regex_syntax\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"perf\",\n \"perf-backtrack\",\n \"perf-cache\",\n \"perf-dfa\",\n \"perf-inline\",\n \"perf-literal\",\n \"perf-onepass\",\n \"std\",\n \"unicode\",\n \"unicode-age\",\n \"unicode-bool\",\n \"unicode-case\",\n \"unicode-gencat\",\n \"unicode-perl\",\n \"unicode-script\",\n \"unicode-segment\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=regex\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.12.3\",\n)\n"
+ "strip_prefix": "regex-1.13.1",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"regex\",\n deps = [\n \"@crates__aho-corasick-1.1.4//:aho_corasick\",\n \"@crates__memchr-2.8.3//:memchr\",\n \"@crates__regex-automata-0.4.16//:regex_automata\",\n \"@crates__regex-syntax-0.8.11//:regex_syntax\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"perf\",\n \"perf-backtrack\",\n \"perf-cache\",\n \"perf-dfa\",\n \"perf-inline\",\n \"perf-literal\",\n \"perf-onepass\",\n \"std\",\n \"unicode\",\n \"unicode-age\",\n \"unicode-bool\",\n \"unicode-case\",\n \"unicode-gencat\",\n \"unicode-perl\",\n \"unicode-script\",\n \"unicode-segment\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=regex\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.13.1\",\n)\n"
}
},
- "crates__regex-automata-0.4.14": {
+ "crates__regex-automata-0.4.16": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f",
+ "sha256": "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/regex-automata/0.4.14/download"
+ "https://static.crates.io/crates/regex-automata/0.4.16/download"
],
- "strip_prefix": "regex-automata-0.4.14",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"regex_automata\",\n deps = [\n \"@crates__aho-corasick-1.1.4//:aho_corasick\",\n \"@crates__memchr-2.8.1//:memchr\",\n \"@crates__regex-syntax-0.8.10//:regex_syntax\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"dfa-onepass\",\n \"hybrid\",\n \"meta\",\n \"nfa-backtrack\",\n \"nfa-pikevm\",\n \"nfa-thompson\",\n \"perf-inline\",\n \"perf-literal\",\n \"perf-literal-multisubstring\",\n \"perf-literal-substring\",\n \"std\",\n \"syntax\",\n \"unicode\",\n \"unicode-age\",\n \"unicode-bool\",\n \"unicode-case\",\n \"unicode-gencat\",\n \"unicode-perl\",\n \"unicode-script\",\n \"unicode-segment\",\n \"unicode-word-boundary\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=regex-automata\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.4.14\",\n)\n"
+ "strip_prefix": "regex-automata-0.4.16",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"regex_automata\",\n deps = [\n \"@crates__aho-corasick-1.1.4//:aho_corasick\",\n \"@crates__memchr-2.8.3//:memchr\",\n \"@crates__regex-syntax-0.8.11//:regex_syntax\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"dfa-onepass\",\n \"hybrid\",\n \"meta\",\n \"nfa-backtrack\",\n \"nfa-pikevm\",\n \"nfa-thompson\",\n \"perf-inline\",\n \"perf-literal\",\n \"perf-literal-multisubstring\",\n \"perf-literal-substring\",\n \"std\",\n \"syntax\",\n \"unicode\",\n \"unicode-age\",\n \"unicode-bool\",\n \"unicode-case\",\n \"unicode-gencat\",\n \"unicode-perl\",\n \"unicode-script\",\n \"unicode-segment\",\n \"unicode-word-boundary\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=regex-automata\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.4.16\",\n)\n"
}
},
- "crates__regex-syntax-0.8.10": {
+ "crates__regex-syntax-0.8.11": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a",
+ "sha256": "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/regex-syntax/0.8.10/download"
+ "https://static.crates.io/crates/regex-syntax/0.8.11/download"
],
- "strip_prefix": "regex-syntax-0.8.10",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"regex_syntax\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n \"unicode\",\n \"unicode-age\",\n \"unicode-bool\",\n \"unicode-case\",\n \"unicode-gencat\",\n \"unicode-perl\",\n \"unicode-script\",\n \"unicode-segment\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=regex-syntax\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.10\",\n)\n"
+ "strip_prefix": "regex-syntax-0.8.11",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"regex_syntax\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n \"unicode\",\n \"unicode-age\",\n \"unicode-bool\",\n \"unicode-case\",\n \"unicode-gencat\",\n \"unicode-perl\",\n \"unicode-script\",\n \"unicode-segment\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=regex-syntax\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.11\",\n)\n"
}
},
- "crates__rustversion-1.0.22": {
+ "crates__rustversion-1.0.23": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d",
+ "sha256": "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/rustversion/1.0.22/download"
+ "https://static.crates.io/crates/rustversion/1.0.23/download"
],
- "strip_prefix": "rustversion-1.0.22",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"rustversion\",\n deps = [\n \"@crates__rustversion-1.0.22//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustversion\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.22\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build/build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"rustversion\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustversion\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.22\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
+ "strip_prefix": "rustversion-1.0.23",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"rustversion\",\n deps = [\n \"@crates__rustversion-1.0.23//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustversion\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.23\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build/build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"rustversion\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustversion\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.23\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n"
}
},
- "crates__syn-2.0.117": {
+ "crates__syn-2.0.119": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
"remote_patch_strip": 1,
- "sha256": "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99",
+ "sha256": "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297",
"type": "tar.gz",
"urls": [
- "https://static.crates.io/crates/syn/2.0.117/download"
+ "https://static.crates.io/crates/syn/2.0.119/download"
],
- "strip_prefix": "syn-2.0.117",
- "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"syn\",\n deps = [\n \"@crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@crates__quote-1.0.45//:quote\",\n \"@crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"clone-impls\",\n \"default\",\n \"derive\",\n \"parsing\",\n \"printing\",\n \"proc-macro\",\n ] + select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n \"extra-traits\", # aarch64-apple-darwin\n \"full\", # aarch64-apple-darwin\n ],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n \"extra-traits\", # aarch64-unknown-linux-gnu\n \"full\", # aarch64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [\n \"extra-traits\", # x86_64-pc-windows-msvc\n \"full\", # x86_64-pc-windows-msvc\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [\n \"extra-traits\", # x86_64-unknown-linux-gnu\n \"full\", # x86_64-unknown-linux-gnu\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [\n \"extra-traits\", # x86_64-unknown-nixos-gnu\n \"full\", # x86_64-unknown-nixos-gnu\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=syn\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.0.117\",\n)\n"
+ "strip_prefix": "syn-2.0.119",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"syn\",\n deps = [\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"clone-impls\",\n \"default\",\n \"derive\",\n \"extra-traits\",\n \"full\",\n \"parsing\",\n \"printing\",\n \"proc-macro\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=syn\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.0.119\",\n)\n"
+ }
+ },
+ "crates__syn-3.0.3": {
+ "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+ "attributes": {
+ "remote_patch_strip": 1,
+ "sha256": "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3",
+ "type": "tar.gz",
+ "urls": [
+ "https://static.crates.io/crates/syn/3.0.3/download"
+ ],
+ "strip_prefix": "syn-3.0.3",
+ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'protobuf'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"syn\",\n deps = [\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"clone-impls\",\n \"default\",\n \"derive\",\n \"parsing\",\n \"printing\",\n \"proc-macro\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=syn\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.0.3\",\n)\n"
}
},
"crates__unicode-ident-1.0.24": {
@@ -1162,7 +726,7 @@
},
"@@rules_rust+//crate_universe/private:internal_extensions.bzl%cu_nr": {
"general": {
- "bzlTransitiveDigest": "2RrHa9GqLSgJmFPwKD1wONow/2x/PGTGakiYDTBQJ88=",
+ "bzlTransitiveDigest": "Mh1KhjCK1wknt8FkwvmldZKr3vKn/LcenTGUTVneC2U=",
"usagesDigest": "tG3p3Nb5XxC7vWY/bcKdb//g0HoAxpxxH3F5/jBVlk4=",
"recordedInputs": [
"REPO_MAPPING:bazel_features+,bazel_features_globals bazel_features++version_extension+bazel_features_globals",
@@ -1262,7 +826,7 @@
"@@yq.bzl+//yq:extensions.bzl%yq": {
"general": {
"bzlTransitiveDigest": "tDqk+ntWTdxNAWPDjRY1uITgHbti2jcXR5ZdinltBs0=",
- "usagesDigest": "Pz33iK5QtkPFivaljfReN4KzpAqM2DgY4vwgyZSNoAM=",
+ "usagesDigest": "XGLRpNcVs4WD/zog6U0sXbBo2OlR5O4mc58OU1L3EVc=",
"recordedInputs": [],
"generatedRepoSpecs": {
"yq_darwin_amd64": {
@@ -1339,6 +903,9 @@
}
},
"facts": {
+ "@@aspect_tools_telemetry+//:extension.bzl%telemetry": {
+ "notice_version": "1"
+ },
"@@rules_go+//go:extensions.bzl%go_sdk": {
"1.22.4": {
"aix_ppc64": [
@@ -1844,55 +1411,55 @@
"https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"
},
"cryptography": {
- "https://files.pythonhosted.org/packages/01/41/3a578f7fd5c70611c0aacba52cd13cb364a5dee895a5c1d467208a9380b0/cryptography-46.0.6-cp314-cp314t-macosx_10_9_universal2.whl": "2ef9e69886cbb137c2aef9772c2e7138dc581fad4fcbcf13cc181eb5a3ab6275",
- "https://files.pythonhosted.org/packages/01/59/562be1e653accee4fdad92c7a2e88fced26b3fdfce144047519bbebc299e/cryptography-46.0.6-cp311-abi3-manylinux_2_31_armv7l.whl": "760997a4b950ff00d418398ad73fbc91aa2894b5c1db7ccb45b4f68b42a63b3c",
- "https://files.pythonhosted.org/packages/01/b3/0796998056a66d1973fd52ee89dc1bb3b6581960a91ad4ac705f182d398f/cryptography-46.0.6-cp38-abi3-manylinux_2_31_armv7l.whl": "02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70",
- "https://files.pythonhosted.org/packages/09/0a/4fe7a8d25fed74419f91835cf5829ade6408fd1963c9eae9c4bce390ecbb/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_aarch64.whl": "8e7304c4f4e9490e11efe56af6713983460ee0780f16c63f219984dab3af9d2d",
- "https://files.pythonhosted.org/packages/0a/09/ddc5f630cc32287d2c953fc5d32705e63ec73e37308e5120955316f53827/cryptography-46.0.6-cp38-abi3-win32.whl": "7f6690b6c55e9c5332c0b59b9c8a3fb232ebf059094c17f9019a51e9827df91c",
- "https://files.pythonhosted.org/packages/0f/a8/976acdd4f0f30df7b25605f4b9d3d89295351665c2091d18224f7ad5cdbf/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_ppc64le.whl": "3c21d92ed15e9cfc6eb64c1f5a0326db22ca9c2566ca46d845119b45b4400361",
- "https://files.pythonhosted.org/packages/10/38/cd7864d79aa1d92ef6f1a584281433419b955ad5a5ba8d1eb6c872165bcb/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_x86_64.whl": "69cf0056d6947edc6e6760e5f17afe4bea06b56a9ac8a06de9d2bd6b532d4f3a",
- "https://files.pythonhosted.org/packages/16/0b/b239701eb946523e4e9f329336e4ff32b1247e109cbab32d1a7b61da8ed7/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_aarch64.whl": "aad75154a7ac9039936d50cf431719a2f8d4ed3d3c277ac03f3339ded1a5e707",
- "https://files.pythonhosted.org/packages/19/69/732a736d12c2631e140be2348b4ad3d226302df63ef64d30dfdb8db7ad1c/cryptography-46.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "9a693028b9cbe51b5a1136232ee8f2bc242e4e19d456ded3fa7c86e43c713b4a",
- "https://files.pythonhosted.org/packages/1a/89/843b53614b47f97fe1abc13f9a86efa5ec9e275292c457af1d4a60dc80e0/cryptography-46.0.6-pp311-pypy311_pp73-win_amd64.whl": "6728c49e3b2c180ef26f8e9f0a883a2c585638db64cf265b49c9ba10652d430e",
- "https://files.pythonhosted.org/packages/1b/82/ca4893968aeb2709aacfb57a30dec6fa2ab25b10fa9f064b8882ce33f599/cryptography-46.0.6-cp38-abi3-win_amd64.whl": "79e865c642cfc5c0b3eb12af83c35c5aeff4fa5c672dc28c43721c2c9fdd2f0f",
- "https://files.pythonhosted.org/packages/1d/5c/f6c3596a1430cec6f949085f0e1a970638d76f81c3ea56d93d564d04c340/cryptography-46.0.6-cp311-abi3-musllinux_1_2_aarch64.whl": "2b417edbe8877cda9022dde3a008e2deb50be9c407eef034aeeb3a8b11d9db3c",
- "https://files.pythonhosted.org/packages/21/5e/19f3260ed1e95bced52ace7501fabcd266df67077eeb382b79c81729d2d3/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_ppc64le.whl": "ed418c37d095aeddf5336898a132fba01091f0ac5844e3e8018506f014b6d2c4",
- "https://files.pythonhosted.org/packages/2e/84/7ccff00ced5bac74b775ce0beb7d1be4e8637536b522b5df9b73ada42da2/cryptography-46.0.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl": "2ea0f37e9a9cf0df2952893ad145fd9627d326a59daec9b0802480fa3bcd2ead",
- "https://files.pythonhosted.org/packages/2f/97/daba0f5d2dc6d855e2dcb70733c812558a7977a55dd4a6722756628c44d1/cryptography-46.0.6-cp38-abi3-manylinux_2_28_aarch64.whl": "8927ccfbe967c7df312ade694f987e7e9e22b2425976ddbf28271d7e58845290",
- "https://files.pythonhosted.org/packages/34/71/1ea5a7352ae516d5512d17babe7e1b87d9db5150b21f794b1377eac1edc0/cryptography-46.0.6-cp311-abi3-manylinux_2_28_x86_64.whl": "22259338084d6ae497a19bae5d4c66b7ca1387d3264d1c2c0e72d9e9b6a77b97",
- "https://files.pythonhosted.org/packages/44/46/466269e833f1c4718d6cd496ffe20c56c9c8d013486ff66b4f69c302a68d/cryptography-46.0.6-cp38-abi3-musllinux_1_2_x86_64.whl": "6617f67b1606dfd9fe4dbfa354a9508d4a6d37afe30306fe6c101b7ce3274b72",
- "https://files.pythonhosted.org/packages/47/23/9285e15e3bc57325b0a72e592921983a701efc1ee8f91c06c5f0235d86d9/cryptography-46.0.6-cp311-abi3-macosx_10_9_universal2.whl": "64235194bad039a10bb6d2d930ab3323baaec67e2ce36215fd0952fad0930ca8",
- "https://files.pythonhosted.org/packages/49/b3/dc27efd8dcc4bff583b3f01d4a3943cd8b5821777a58b3a6a5f054d61b79/cryptography-46.0.6-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "639301950939d844a9e1c4464d7e07f902fe9a7f6b215bb0d4f28584729935d8",
- "https://files.pythonhosted.org/packages/5b/ba/d5e27f8d68c24951b0a484924a84c7cdaed7502bac9f18601cd357f8b1d2/cryptography-46.0.6-cp311-abi3-manylinux_2_28_ppc64le.whl": "d9528b535a6c4f8ff37847144b8986a9a143585f0540fbcb1a98115b543aa463",
- "https://files.pythonhosted.org/packages/5f/a0/7d738944eac6513cd60a8da98b65951f4a3b279b93479a7e8926d9cd730b/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_x86_64.whl": "b928a3ca837c77a10e81a814a693f2295200adb3352395fad024559b7be7a736",
- "https://files.pythonhosted.org/packages/60/f8/e61f8f13950ab6195b31913b42d39f0f9afc7d93f76710f299b5ec286ae6/cryptography-46.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "26031f1e5ca62fcb9d1fcb34b2b60b390d1aacaa15dc8b895a9ed00968b97b30",
- "https://files.pythonhosted.org/packages/7e/c9/9f9cea13ee2dbde070424e0c4f621c091a91ffcc504ffea5e74f0e1daeff/cryptography-46.0.6-cp311-abi3-musllinux_1_2_x86_64.whl": "380343e0653b1c9d7e1f55b52aaa2dbb2fdf2730088d48c43ca1c7c0abb7cc2f",
- "https://files.pythonhosted.org/packages/89/06/fe1fce39a37ac452e58d04b43b0855261dac320a2ebf8f5260dd55b201a9/cryptography-46.0.6-cp38-abi3-manylinux_2_28_ppc64le.whl": "b12c6b1e1651e42ab5de8b1e00dc3b6354fdfd778e7fa60541ddacc27cd21410",
- "https://files.pythonhosted.org/packages/8b/65/5bf43286d566f8171917cae23ac6add941654ccf085d739195a4eacf1674/cryptography-46.0.6-cp38-abi3-manylinux_2_34_x86_64.whl": "341359d6c9e68834e204ceaf25936dffeafea3829ab80e9503860dcc4f4dac58",
- "https://files.pythonhosted.org/packages/91/e0/207fb177c3a9ef6a8108f234208c3e9e76a6aa8cf20d51932916bd43bda0/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_aarch64.whl": "c89eb37fae9216985d8734c1afd172ba4927f5a05cfd9bf0e4863c6d5465b013",
- "https://files.pythonhosted.org/packages/9e/c5/e1594c4eec66a567c3ac4400008108a415808be2ce13dcb9a9045c92f1a0/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl": "90e5f0a7b3be5f40c3a0a0eafb32c681d8d2c181fc2a1bdabe9b3f611d9f6b1a",
- "https://files.pythonhosted.org/packages/a4/ba/04b1bd4218cbc58dc90ce967106d51582371b898690f3ae0402876cc4f34/cryptography-46.0.6.tar.gz": "27550628a518c5c6c903d84f637fbecf287f6cb9ced3804838a1295dc1fd0759",
- "https://files.pythonhosted.org/packages/aa/a8/0a90c4f0b0871e0e3d1ed126aed101328a8a57fd9fd17f00fb67e82a51ca/cryptography-46.0.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "d24c13369e856b94892a89ddf70b332e0b70ad4a5c43cf3e9cb71d6d7ffa1f7b",
- "https://files.pythonhosted.org/packages/ad/b5/1895bc0821226f129bc74d00eccfc6a5969e2028f8617c09790bf89c185e/cryptography-46.0.6-cp311-abi3-win32.whl": "bcb87663e1f7b075e48c3be3ecb5f0b46c8fc50b50a97cf264e7f60242dca3f2",
- "https://files.pythonhosted.org/packages/b1/1b/bf0e01a88efd0e59679b69f42d4afd5bced8700bb5e80617b2d63a3741af/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_x86_64.whl": "4668298aef7cddeaf5c6ecc244c2302a2b8e40f384255505c22875eebb47888b",
- "https://files.pythonhosted.org/packages/bb/8b/11df86de2ea389c65aa1806f331cae145f2ed18011f30234cc10ca253de8/cryptography-46.0.6-cp314-cp314t-manylinux_2_31_armv7l.whl": "8ce35b77aaf02f3b59c90b2c8a05c73bac12cea5b4e8f3fbece1f5fddea5f0ca",
- "https://files.pythonhosted.org/packages/bc/1f/4c926f50df7749f000f20eede0c896769509895e2648db5da0ed55db711d/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl": "a3e84d5ec9ba01f8fd03802b2147ba77f0c8f2617b2aff254cedd551844209c8",
- "https://files.pythonhosted.org/packages/c3/f8/c9bcbf0d3e6ad288b9d9aa0b1dee04b063d19e8c4f871855a03ab3a297ab/cryptography-46.0.6-cp311-abi3-win_amd64.whl": "6739d56300662c468fddb0e5e291f9b4d084bead381667b9e654c7dd81705124",
- "https://files.pythonhosted.org/packages/c4/cc/f330e982852403da79008552de9906804568ae9230da8432f7496ce02b71/cryptography-46.0.6-cp38-abi3-macosx_10_9_universal2.whl": "12cae594e9473bca1a7aceb90536060643128bb274fcea0fc459ab90f7d1ae7a",
- "https://files.pythonhosted.org/packages/c5/3d/db200af5a4ffd08918cd55c08399dc6c9c50b0bc72c00a3246e099d3a849/cryptography-46.0.6-cp38-abi3-manylinux_2_34_aarch64.whl": "7e6142674f2a9291463e5e150090b95a8519b2fb6e6aaec8917dd8d094ce750d",
- "https://files.pythonhosted.org/packages/c6/65/707be3ffbd5f786028665c3223e86e11c4cda86023adbc56bd72b1b6bab5/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl": "12f0fa16cc247b13c43d56d7b35287ff1569b5b1f4c5e87e92cc4fcc00cd10c0",
- "https://files.pythonhosted.org/packages/c9/57/fe4a23eb549ac9d903bd4698ffda13383808ef0876cc912bcb2838799ece/cryptography-46.0.6-cp314-cp314t-win_amd64.whl": "c797e2517cb7880f8297e2c0f43bb910e91381339336f75d2c1c2cbf811b70b4",
- "https://files.pythonhosted.org/packages/cb/f1/c2326781ca05208845efca38bf714f76939ae446cd492d7613808badedf1/cryptography-46.0.6-cp314-cp314t-win32.whl": "97c8115b27e19e592a05c45d0dd89c57f81f841cc9880e353e0d3bf25b2139ed",
- "https://files.pythonhosted.org/packages/d4/12/123be7292674abf76b21ac1fc0e1af50661f0e5b8f0ec8285faac18eb99e/cryptography-46.0.6-cp311-abi3-manylinux_2_28_aarch64.whl": "67177e8a9f421aa2d3a170c3e56eca4e0128883cf52a071a7cbf53297f18b175",
- "https://files.pythonhosted.org/packages/d6/8b/b1ebfeb788bf4624d36e45ed2662b8bd43a05ff62157093c1539c1288a18/cryptography-46.0.6-cp311-abi3-manylinux_2_34_aarch64.whl": "3dfa6567f2e9e4c5dceb8ccb5a708158a2a871052fa75c8b78cb0977063f1507",
- "https://files.pythonhosted.org/packages/d7/18/61acfd5b414309d74ee838be321c636fe71815436f53c9f0334bf19064fa/cryptography-46.0.6-cp38-abi3-manylinux_2_34_ppc64le.whl": "456b3215172aeefb9284550b162801d62f5f264a081049a3e94307fe20792cfa",
- "https://files.pythonhosted.org/packages/dd/52/a005f8eabdb28df57c20f84c44d397a755782d6ff6d455f05baa2785bd91/cryptography-46.0.6-cp311-abi3-manylinux_2_34_ppc64le.whl": "cdcd3edcbc5d55757e5f5f3d330dd00007ae463a7e7aa5bf132d1f22a4b62b19",
- "https://files.pythonhosted.org/packages/e0/25/7e49c0fa7205cf3597e525d156a6bce5b5c9de1fd7e8cb01120e459f205a/cryptography-46.0.6-cp38-abi3-musllinux_1_2_aarch64.whl": "9a9c42a2723999a710445bc0d974e345c32adfd8d2fac6d8a251fa829ad31cfb",
- "https://files.pythonhosted.org/packages/e6/05/e8d0e6eb4f0d83365b3cb0e00eb3c484f7348db0266652ccd84632a3d58d/cryptography-46.0.6-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "ed3775295fb91f70b4027aeba878d79b3e55c0b3e97eaa4de71f8f23a9f2eb77",
- "https://files.pythonhosted.org/packages/ec/4d/8e7d7245c79c617d08724e2efa397737715ca0ec830ecb3c91e547302555/cryptography-46.0.6-cp311-abi3-manylinux_2_34_x86_64.whl": "d4e4aadb7fc1f88687f47ca20bb7227981b03afaae69287029da08096853b738",
- "https://files.pythonhosted.org/packages/f3/6d/73557ed0ef7d73d04d9aba745d2c8e95218213687ee5e76b7d236a5030fc/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl": "50575a76e2951fe7dbd1f56d181f8c5ceeeb075e9ff88e7ad997d2f42af06e7b",
- "https://files.pythonhosted.org/packages/fa/87/887f35a6fca9dde90cad08e0de0c89263a8e59b2d2ff904fd9fcd8025b6f/cryptography-46.0.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "7f417f034f91dcec1cb6c5c35b07cdbb2ef262557f701b4ecd803ee8cefed4f4",
- "https://files.pythonhosted.org/packages/ff/8a/b14f3101fe9c3592603339eb5d94046c3ce5f7fc76d6512a2d40efd9724e/cryptography-46.0.6-cp38-abi3-manylinux_2_28_x86_64.whl": "063b67749f338ca9c5a0b7fe438a52c25f9526b851e24e6c9310e7195aad3b4d"
+ "https://files.pythonhosted.org/packages/03/11/5e395f961d6868269835dee1bafec6a1ac176505a167f68b7d8818431068/cryptography-46.0.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "ebd6daf519b9f189f85c479427bbd6e9c9037862cf8fe89ee35503bd209ed902",
+ "https://files.pythonhosted.org/packages/0b/5d/4a8f770695d73be252331e60e526291e3df0c9b27556a90a6b47bccca4c2/cryptography-46.0.7-cp311-abi3-macosx_10_9_universal2.whl": "ea42cbe97209df307fdc3b155f1b6fa2577c0defa8f1f7d3be7d31d189108ad4",
+ "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl": "cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1",
+ "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl": "5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e",
+ "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl": "cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0",
+ "https://files.pythonhosted.org/packages/1a/bb/a5c213c19ee94b15dfccc48f363738633a493812687f5567addbcbba9f6f/cryptography-46.0.7-cp311-abi3-win32.whl": "d23c8ca48e44ee015cd0a54aeccdf9f09004eba9fc96f38c911011d9ff1bd457",
+ "https://files.pythonhosted.org/packages/20/2a/1b016902351a523aa2bd446b50a5bc1175d7a7d1cf90fe2ef904f9b84ebc/cryptography-46.0.7-pp311-pypy311_pp73-win_amd64.whl": "258514877e15963bd43b558917bc9f54cf7cf866c38aa576ebf47a77ddbc43a4",
+ "https://files.pythonhosted.org/packages/28/17/b59a741645822ec6d04732b43c5d35e4ef58be7bfa84a81e5ae6f05a1d33/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_aarch64.whl": "fcd8eac50d9138c1d7fc53a653ba60a2bee81a505f9f8850b6b2888555a45d0e",
+ "https://files.pythonhosted.org/packages/2b/02/7788f9fefa1d060ca68717c3901ae7fffa21ee087a90b7f23c7a603c32ae/cryptography-46.0.7-cp311-abi3-win_amd64.whl": "397655da831414d165029da9bc483bed2fe0e75dde6a1523ec2fe63f3c46046b",
+ "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl": "420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef",
+ "https://files.pythonhosted.org/packages/32/a8/9f0e4ed57ec9cebe506e58db11ae472972ecb0c659e4d52bbaee80ca340a/cryptography-46.0.7-cp314-cp314t-win_amd64.whl": "e06acf3c99be55aa3b516397fe42f5855597f430add9c17fa46bf2e0fb34c9bb",
+ "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl": "8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83",
+ "https://files.pythonhosted.org/packages/3a/ea/075aac6a84b7c271578d81a2f9968acb6e273002408729f2ddff517fed4a/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl": "d3b99c535a9de0adced13d159c5a9cf65c325601aa30f4be08afd680643e9c15",
+ "https://files.pythonhosted.org/packages/3d/4c/7d258f169ae71230f25d9f3d06caabcff8c3baf0978e2b7d65e0acac3827/cryptography-46.0.7-cp314-cp314t-manylinux_2_31_armv7l.whl": "60627cf07e0d9274338521205899337c5d18249db56865f943cbe753aa96f40f",
+ "https://files.pythonhosted.org/packages/40/53/8ed1cf4c3b9c8e611e7122fb56f1c32d09e1fff0f1d77e78d9ff7c82653e/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_aarch64.whl": "b7b412817be92117ec5ed95f880defe9cf18a832e8cafacf0a22337dc1981b4d",
+ "https://files.pythonhosted.org/packages/41/3d/fe14df95a83319af25717677e956567a105bb6ab25641acaa093db79975d/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_ppc64le.whl": "c5b1ccd1239f48b7151a65bc6dd54bcfcc15e028c8ac126d3fada09db0e07ef1",
+ "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl": "a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e",
+ "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz": "e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5",
+ "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308",
+ "https://files.pythonhosted.org/packages/4b/fa/f0ab06238e899cc3fb332623f337a7364f36f4bb3f2534c2bb95a35b132c/cryptography-46.0.7-cp38-abi3-win32.whl": "f247c8c1a1fb45e12586afbb436ef21ff1e80670b2861a90353d9b025583d246",
+ "https://files.pythonhosted.org/packages/50/46/cf71e26025c2e767c5609162c866a78e8a2915bbcfa408b7ca495c6140c4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_ppc64le.whl": "fbfd0e5f273877695cb93baf14b185f4878128b250cc9f8e617ea0c025dfb022",
+ "https://files.pythonhosted.org/packages/59/6a/bb2e166d6d0e0955f1e9ff70f10ec4b2824c9cfcdb4da772c7dd69cc7d80/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_x86_64.whl": "65814c60f8cc400c63131584e3e1fad01235edba2614b61fbfbfa954082db0ee",
+ "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325",
+ "https://files.pythonhosted.org/packages/63/0c/dca8abb64e7ca4f6b2978769f6fea5ad06686a190cec381f0a796fdcaaba/cryptography-46.0.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl": "fc9ab8856ae6cf7c9358430e49b368f3108f050031442eaeb6b9d87e4dcf4e4f",
+ "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl": "9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb",
+ "https://files.pythonhosted.org/packages/6c/7b/1c55db7242b5e5612b29fc7a630e91ee7a6e3c8e7bf5406d22e206875fbd/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl": "d02c738dacda7dc2a74d1b2b3177042009d5cab7c7079db74afc19e56ca1b455",
+ "https://files.pythonhosted.org/packages/74/66/e3ce040721b0b5599e175ba91ab08884c75928fbeb74597dd10ef13505d2/cryptography-46.0.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "db0f493b9181c7820c8134437eb8b0b4792085d37dbb24da050476ccb664e59c",
+ "https://files.pythonhosted.org/packages/7b/56/15619b210e689c5403bb0540e4cb7dbf11a6bf42e483b7644e471a2812b3/cryptography-46.0.7-cp314-cp314t-macosx_10_9_universal2.whl": "d151173275e1728cf7839aaa80c34fe550c04ddb27b34f48c232193df8db5842",
+ "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl": "935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006",
+ "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832",
+ "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl": "73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77",
+ "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl": "abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba",
+ "https://files.pythonhosted.org/packages/95/b6/3da51d48415bcb63b00dc17c2eff3a651b7c4fed484308d0f19b30e8cb2c/cryptography-46.0.7-cp314-cp314t-win32.whl": "fdd1736fed309b4300346f88f74cd120c27c56852c3838cab416e7a166f67298",
+ "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl": "5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163",
+ "https://files.pythonhosted.org/packages/9c/59/4a479e0f36f8f378d397f4eab4c850b4ffb79a2f0d58704b8fa0703ddc11/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_x86_64.whl": "d5f7520159cd9c2154eb61eb67548ca05c5774d39e9c2c4339fd793fe7d097b2",
+ "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7",
+ "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl": "7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85",
+ "https://files.pythonhosted.org/packages/a7/7f/cd42fc3614386bc0c12f0cb3c4ae1fc2bbca5c9662dfed031514911d513d/cryptography-46.0.7-cp38-abi3-macosx_10_9_universal2.whl": "462ad5cb1c148a22b2e3bcc5ad52504dff325d17daf5df8d88c17dda1f75f2a4",
+ "https://files.pythonhosted.org/packages/b5/2a/2ea0767cad19e71b3530e4cad9605d0b5e338b6a1e72c37c9c1ceb86c333/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_aarch64.whl": "80406c3065e2c55d7f49a9550fe0c49b3f12e5bfff5dedb727e319e1afb9bf99",
+ "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl": "cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2",
+ "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl": "35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0",
+ "https://files.pythonhosted.org/packages/c0/ea/01276740375bac6249d0a971ebdf6b4dc9ead0ee0a34ef3b5a88c1a9b0d4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_x86_64.whl": "ffca7aa1d00cf7d6469b988c581598f2259e46215e0140af408966a24cf086ce",
+ "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl": "1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067",
+ "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl": "42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b",
+ "https://files.pythonhosted.org/packages/cb/da/9870eec4b69c63ef5925bf7d8342b7e13bc2ee3d47791461c4e49ca212f4/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl": "04959522f938493042d595a736e7dbdff6eb6cc2339c11465b3ff89343b65f65",
+ "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl": "91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85",
+ "https://files.pythonhosted.org/packages/d2/f1/00ce3bde3ca542d1acd8f8cfa38e446840945aa6363f9b74746394b14127/cryptography-46.0.7-cp38-abi3-win_amd64.whl": "506c4ff91eff4f82bdac7633318a526b1d1309fc07ca76a3ad182cb5b686d6d3",
+ "https://files.pythonhosted.org/packages/f4/72/05aa5832b82dd341969e9a734d1812a6aadb088d9eb6f0430fc337cc5a8f/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl": "3986ac1dee6def53797289999eabe84798ad7817f3e97779b5061a95b0ee4968",
+ "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl": "24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de"
},
"docutils": {
"https://files.pythonhosted.org/packages/4a/c0/89fe6215b443b919cb98a5002e107cb5026854ed1ccb6b5833e0768419d1/docutils-0.22.2.tar.gz": "9fdb771707c8784c8f2728b67cb2c691305933d68137ef95a75db5f4dfbc213d",
@@ -2020,41 +1587,7 @@
}
}
},
- "fact_version": "v1",
- "index_urls": {
- "https://pypi.org/simple/": {
- "backports_tarfile": "/simple/backports-tarfile/",
- "certifi": "/simple/certifi/",
- "cffi": "/simple/cffi/",
- "charset_normalizer": "/simple/charset-normalizer/",
- "cryptography": "/simple/cryptography/",
- "docutils": "/simple/docutils/",
- "idna": "/simple/idna/",
- "importlib_metadata": "/simple/importlib-metadata/",
- "jaraco_classes": "/simple/jaraco-classes/",
- "jaraco_context": "/simple/jaraco-context/",
- "jaraco_functools": "/simple/jaraco-functools/",
- "jeepney": "/simple/jeepney/",
- "keyring": "/simple/keyring/",
- "markdown_it_py": "/simple/markdown-it-py/",
- "mdurl": "/simple/mdurl/",
- "more_itertools": "/simple/more-itertools/",
- "nh3": "/simple/nh3/",
- "pkginfo": "/simple/pkginfo/",
- "pycparser": "/simple/pycparser/",
- "pygments": "/simple/pygments/",
- "pywin32_ctypes": "/simple/pywin32-ctypes/",
- "readme_renderer": "/simple/readme-renderer/",
- "requests": "/simple/requests/",
- "requests_toolbelt": "/simple/requests-toolbelt/",
- "rfc3986": "/simple/rfc3986/",
- "rich": "/simple/rich/",
- "secretstorage": "/simple/secretstorage/",
- "twine": "/simple/twine/",
- "urllib3": "/simple/urllib3/",
- "zipp": "/simple/zipp/"
- }
- }
+ "fact_version": "v1"
}
}
}
diff --git a/contrib/maintenance/gerrit/site.py b/contrib/maintenance/gerrit/site.py
index faf6c02..450acaa 100644
--- a/contrib/maintenance/gerrit/site.py
+++ b/contrib/maintenance/gerrit/site.py
@@ -37,11 +37,11 @@
) as cfg:
config_base_path = cfg.get("gerrit", None, "basePath", "git")
if os.path.isabs(config_base_path):
- self.basePath = config_base_path
+ self.base_path = config_base_path
else:
- self.basePath = os.path.join(self.path, config_base_path)
+ self.base_path = os.path.join(self.path, config_base_path)
- return self.basePath
+ return self.base_path
def get_projects(self, excludes=None):
for current, dirs, _ in os.walk(self.get_base_path(), topdown=True):
diff --git a/external_deps.lock.json b/external_deps.lock.json
index e96ecab..0c46d68 100644
--- a/external_deps.lock.json
+++ b/external_deps.lock.json
@@ -33,7 +33,7 @@
"com.google.inject:guice": 2106361664,
"com.google.j2objc:j2objc-annotations": -727464895,
"com.google.jimfs:jimfs": -1004381565,
- "com.google.protobuf:protobuf-java": 1247529435,
+ "com.google.protobuf:protobuf-java": -559925028,
"com.google.template:soy": -843524660,
"com.google.truth.extensions:truth-java8-extension": -129319374,
"com.google.truth.extensions:truth-liteproto-extension": 1463279446,
@@ -126,8 +126,8 @@
"javax.servlet:javax.servlet-api": 669233360,
"junit:junit": -744267592,
"log4j:log4j": 182326902,
- "net.bytebuddy:byte-buddy": -67913315,
- "net.bytebuddy:byte-buddy-agent": -728183915,
+ "net.bytebuddy:byte-buddy": -1875367778,
+ "net.bytebuddy:byte-buddy-agent": 1759328918,
"net.java.dev.jna:jna": -867910362,
"net.java.dev.jna:jna-platform": -561312286,
"net.minidev:json-smart": -1043043954,
@@ -156,9 +156,9 @@
"org.apache.mina:mina-core": -1403307213,
"org.apache.sshd:sshd-common": 1844247612,
"org.apache.sshd:sshd-core": 602454664,
- "org.apache.sshd:sshd-mina": -1915268089,
- "org.apache.sshd:sshd-osgi": 1681538032,
- "org.apache.sshd:sshd-sftp": 2089761863,
+ "org.apache.sshd:sshd-mina": 582747848,
+ "org.apache.sshd:sshd-osgi": -115413327,
+ "org.apache.sshd:sshd-sftp": 292810504,
"org.asciidoctor:asciidoctorj": -457860213,
"org.assertj:assertj-core": -1145412507,
"org.bouncycastle:bcpg-jdk18on": -1572213535,
@@ -169,18 +169,18 @@
"org.commonmark:commonmark-ext-autolink": -1853742120,
"org.commonmark:commonmark-ext-gfm-strikethrough": 350394231,
"org.commonmark:commonmark-ext-gfm-tables": 1881582931,
- "org.eclipse.jetty.ee10:jetty-ee10-servlet": 835495267,
- "org.eclipse.jetty.ee8:jetty-ee8-nested": -1627496831,
- "org.eclipse.jetty.ee8:jetty-ee8-security": 1632270986,
- "org.eclipse.jetty.ee8:jetty-ee8-servlet": -1338697711,
- "org.eclipse.jetty:jetty-http": -235909997,
- "org.eclipse.jetty:jetty-io": -44878927,
- "org.eclipse.jetty:jetty-jmx": 1781043564,
- "org.eclipse.jetty:jetty-security": -1819173301,
- "org.eclipse.jetty:jetty-server": -130172210,
- "org.eclipse.jetty:jetty-session": -1378386067,
- "org.eclipse.jetty:jetty-util": -444622835,
- "org.eclipse.jetty:jetty-util-ajax": -622085534,
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet": -562048764,
+ "org.eclipse.jetty.ee8:jetty-ee8-nested": 860016002,
+ "org.eclipse.jetty.ee8:jetty-ee8-security": -175183477,
+ "org.eclipse.jetty.ee8:jetty-ee8-servlet": 1148815122,
+ "org.eclipse.jetty:jetty-http": -2043364460,
+ "org.eclipse.jetty:jetty-io": -1852333390,
+ "org.eclipse.jetty:jetty-jmx": -26410899,
+ "org.eclipse.jetty:jetty-security": 668339532,
+ "org.eclipse.jetty:jetty-server": -1937626673,
+ "org.eclipse.jetty:jetty-session": 1109126766,
+ "org.eclipse.jetty:jetty-util": 2042889998,
+ "org.eclipse.jetty:jetty-util-ajax": 1865427299,
"org.hamcrest:hamcrest": 1547523135,
"org.jruby:jruby-complete": -2103568068,
"org.json:json": -811907600,
@@ -239,7 +239,7 @@
"com.google.code.findbugs:jsr305:jar:sources": -640520676,
"com.google.code.gson:gson": -2014404431,
"com.google.code.gson:gson:jar:sources": 935710753,
- "com.google.common.html.types:types": 1171780099,
+ "com.google.common.html.types:types": -1433655673,
"com.google.common.html.types:types:jar:sources": -1323749402,
"com.google.errorprone:error_prone_annotations": 804114225,
"com.google.errorprone:error_prone_annotations:jar:sources": -2115535816,
@@ -274,15 +274,15 @@
"com.google.jimfs:jimfs:jar:sources": -555304721,
"com.google.jsinterop:jsinterop-annotations": 1636460091,
"com.google.jsinterop:jsinterop-annotations:jar:sources": 694679492,
- "com.google.protobuf:protobuf-java": 1331070778,
- "com.google.protobuf:protobuf-java:jar:sources": 133270104,
- "com.google.template:soy": 1170788493,
+ "com.google.protobuf:protobuf-java": 911577887,
+ "com.google.protobuf:protobuf-java:jar:sources": 773608461,
+ "com.google.template:soy": -1107126680,
"com.google.template:soy:jar:sources": 895044971,
"com.google.truth.extensions:truth-java8-extension": 766384514,
"com.google.truth.extensions:truth-java8-extension:jar:sources": 1257445795,
"com.google.truth.extensions:truth-liteproto-extension": -1774954418,
"com.google.truth.extensions:truth-liteproto-extension:jar:sources": -754757455,
- "com.google.truth.extensions:truth-proto-extension": -180673672,
+ "com.google.truth.extensions:truth-proto-extension": 1860309564,
"com.google.truth.extensions:truth-proto-extension:jar:sources": -171856482,
"com.google.truth:truth": 2133252626,
"com.google.truth:truth:jar:sources": 494258718,
@@ -350,10 +350,10 @@
"javax.servlet:javax.servlet-api:jar:sources": -2015355058,
"junit:junit": -1256429642,
"junit:junit:jar:sources": 940567721,
- "net.bytebuddy:byte-buddy": -645553046,
- "net.bytebuddy:byte-buddy-agent": 567350281,
- "net.bytebuddy:byte-buddy-agent:jar:sources": 467108684,
- "net.bytebuddy:byte-buddy:jar:sources": -315779909,
+ "net.bytebuddy:byte-buddy": -2144538556,
+ "net.bytebuddy:byte-buddy-agent": -1307562154,
+ "net.bytebuddy:byte-buddy-agent:jar:sources": 2038081020,
+ "net.bytebuddy:byte-buddy:jar:sources": 1602176187,
"net.java.dev.jna:jna": 1622514527,
"net.java.dev.jna:jna-platform": 1756885266,
"net.java.dev.jna:jna-platform:jar:sources": -507721531,
@@ -402,15 +402,15 @@
"org.apache.lucene:lucene-queryparser:jar:sources": 1992621418,
"org.apache.mina:mina-core": -584591076,
"org.apache.mina:mina-core:jar:sources": 71382131,
- "org.apache.sshd:sshd-mina": 1147629185,
- "org.apache.sshd:sshd-mina:jar:sources": -506380854,
- "org.apache.sshd:sshd-osgi": 1092773821,
- "org.apache.sshd:sshd-osgi:jar:sources": -2061003935,
- "org.apache.sshd:sshd-sftp": -70173235,
- "org.apache.sshd:sshd-sftp:jar:sources": 1034555480,
+ "org.apache.sshd:sshd-mina": -36716477,
+ "org.apache.sshd:sshd-mina:jar:sources": 97528844,
+ "org.apache.sshd:sshd-osgi": 1810958617,
+ "org.apache.sshd:sshd-osgi:jar:sources": 710209222,
+ "org.apache.sshd:sshd-sftp": -320832840,
+ "org.apache.sshd:sshd-sftp:jar:sources": -1268961386,
"org.asciidoctor:asciidoctorj": 1685789893,
"org.asciidoctor:asciidoctorj:jar:sources": 2091708864,
- "org.assertj:assertj-core": -923964809,
+ "org.assertj:assertj-core": -59722598,
"org.assertj:assertj-core:jar:sources": -697161745,
"org.bouncycastle:bcpg-jdk18on": -1258294405,
"org.bouncycastle:bcpg-jdk18on:jar:sources": -1733408473,
@@ -432,32 +432,32 @@
"org.commonmark:commonmark-ext-gfm-tables": -1205584749,
"org.commonmark:commonmark-ext-gfm-tables:jar:sources": 1341057091,
"org.commonmark:commonmark:jar:sources": -1511261547,
- "org.eclipse.jetty.ee10:jetty-ee10-servlet": -117453373,
- "org.eclipse.jetty.ee10:jetty-ee10-servlet:jar:sources": 501419503,
- "org.eclipse.jetty.ee8:jetty-ee8-nested": -1480285467,
- "org.eclipse.jetty.ee8:jetty-ee8-nested:jar:sources": -2141029892,
- "org.eclipse.jetty.ee8:jetty-ee8-security": -1089777429,
- "org.eclipse.jetty.ee8:jetty-ee8-security:jar:sources": -374234244,
- "org.eclipse.jetty.ee8:jetty-ee8-servlet": 709534403,
- "org.eclipse.jetty.ee8:jetty-ee8-servlet:jar:sources": 1796299448,
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet": -2443254,
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet:jar:sources": -1546113901,
+ "org.eclipse.jetty.ee8:jetty-ee8-nested": -1915352225,
+ "org.eclipse.jetty.ee8:jetty-ee8-nested:jar:sources": 673934800,
+ "org.eclipse.jetty.ee8:jetty-ee8-security": -1918552702,
+ "org.eclipse.jetty.ee8:jetty-ee8-security:jar:sources": 114520187,
+ "org.eclipse.jetty.ee8:jetty-ee8-servlet": 57123647,
+ "org.eclipse.jetty.ee8:jetty-ee8-servlet:jar:sources": 500172952,
"org.eclipse.jetty.toolchain:jetty-servlet-api": 1364182673,
"org.eclipse.jetty.toolchain:jetty-servlet-api:jar:sources": 736604807,
- "org.eclipse.jetty:jetty-http": -1578822522,
- "org.eclipse.jetty:jetty-http:jar:sources": -1317713476,
- "org.eclipse.jetty:jetty-io": -225847225,
- "org.eclipse.jetty:jetty-io:jar:sources": 116677681,
- "org.eclipse.jetty:jetty-jmx": 1202016563,
- "org.eclipse.jetty:jetty-jmx:jar:sources": -1552312519,
- "org.eclipse.jetty:jetty-security": 501899561,
- "org.eclipse.jetty:jetty-security:jar:sources": 1985223928,
- "org.eclipse.jetty:jetty-server": -963731471,
- "org.eclipse.jetty:jetty-server:jar:sources": -466994191,
- "org.eclipse.jetty:jetty-session": 1869188771,
- "org.eclipse.jetty:jetty-session:jar:sources": -1630590830,
- "org.eclipse.jetty:jetty-util": -1027747345,
- "org.eclipse.jetty:jetty-util-ajax": 573093314,
- "org.eclipse.jetty:jetty-util-ajax:jar:sources": 455294676,
- "org.eclipse.jetty:jetty-util:jar:sources": -280937557,
+ "org.eclipse.jetty:jetty-http": -2005285297,
+ "org.eclipse.jetty:jetty-http:jar:sources": 1510111824,
+ "org.eclipse.jetty:jetty-io": 1963881320,
+ "org.eclipse.jetty:jetty-io:jar:sources": -219635344,
+ "org.eclipse.jetty:jetty-jmx": 974624101,
+ "org.eclipse.jetty:jetty-jmx:jar:sources": -733987429,
+ "org.eclipse.jetty:jetty-security": -628512589,
+ "org.eclipse.jetty:jetty-security:jar:sources": 730204298,
+ "org.eclipse.jetty:jetty-server": -1113673878,
+ "org.eclipse.jetty:jetty-server:jar:sources": -1325429404,
+ "org.eclipse.jetty:jetty-session": -240475595,
+ "org.eclipse.jetty:jetty-session:jar:sources": -407525695,
+ "org.eclipse.jetty:jetty-util": 1729944958,
+ "org.eclipse.jetty:jetty-util-ajax": 1312600683,
+ "org.eclipse.jetty:jetty-util-ajax:jar:sources": -2027361402,
+ "org.eclipse.jetty:jetty-util:jar:sources": -1809018264,
"org.hamcrest:hamcrest": 1282317766,
"org.hamcrest:hamcrest-core": 649657847,
"org.hamcrest:hamcrest-core:jar:sources": -1646511374,
@@ -468,7 +468,7 @@
"org.jsoup:jsoup:jar:sources": -2058254438,
"org.jspecify:jspecify": 117231129,
"org.jspecify:jspecify:jar:sources": -2134060298,
- "org.mockito:mockito-core": -287830973,
+ "org.mockito:mockito-core": 493796464,
"org.mockito:mockito-core:jar:sources": 1900207417,
"org.nibor.autolink:autolink": -443901116,
"org.nibor.autolink:autolink:jar:sources": -1863403724,
@@ -741,10 +741,10 @@
},
"com.google.protobuf:protobuf-java": {
"shasums": {
- "jar": "400621a8f0aac52fab7ec88f492edd356f5a4355caa8f92028f217a8b5e4ac3b",
- "sources": "63798a62a5f62575c814b92b1b951252bfd379ebe8207610db41622e03b007dc"
+ "jar": "a4345ba2aa009912ff6f90467fea2d104605256b72c50840d75f13256638a472",
+ "sources": "83b680c10572c930de7631cd3376ead12fc11387d3515d8cfb15bd5a381dea1a"
},
- "version": "4.35.0"
+ "version": "4.35.1"
},
"com.google.template:soy": {
"shasums": {
@@ -1012,17 +1012,17 @@
},
"net.bytebuddy:byte-buddy": {
"shasums": {
- "jar": "8b31f4ea806afaa900b67bffd8498760d1f65464f4c2ea78cdbda2f3e633898b",
- "sources": "d40bbc426b8e79a026b4e570e6f57b0a8659b122864c874cfa309121066f1fb1"
+ "jar": "e32f454c2c1f4aca982f9ec764ed892d9a6eee7e8a77f435cbdd180f6ffdb821",
+ "sources": "7f38a50fa7406b61d867a2c81a89610bb816de2fa28696b4a54fcaa8d52530a1"
},
- "version": "1.18.10"
+ "version": "1.18.11"
},
"net.bytebuddy:byte-buddy-agent": {
"shasums": {
- "jar": "9cfa3c71c8f07bfb5f4c3c68db7715940d792801eba82d346fc343f7bd7c2401",
- "sources": "af62bcc1d124110ee1917f61d4cf3c19eb832f9213a555a1d375b743327345a8"
+ "jar": "780b3601c34150ab9fb822673c472f7229c1041e8e2a12facf6a5de9ba7a2d64",
+ "sources": "30bbf5860aa58e4740b352d2c4c15fe2428a2019e81dccd25c8e3937a0a2a0a3"
},
- "version": "1.18.10"
+ "version": "1.18.11"
},
"net.java.dev.jna:jna": {
"shasums": {
@@ -1194,24 +1194,24 @@
},
"org.apache.sshd:sshd-mina": {
"shasums": {
- "jar": "7399961346882ef50952ae9774e8dd1eac7ce232d2f82c058ade2c20c02591f1",
- "sources": "cc526f8a54d375e87b21419e1c3ce7462637718c6e692fce3940cff98a5151a5"
+ "jar": "da1088d16ba7953444b7d9aefcfc60c9b5e000bf26542d4c3ed0573f692bf14a",
+ "sources": "a8e548e09d8744effe88d83dcd55faa87dc14c37f8a0a595b4c6af3b20e558aa"
},
- "version": "2.18.0"
+ "version": "2.19.0"
},
"org.apache.sshd:sshd-osgi": {
"shasums": {
- "jar": "e771c4239b1c4818c102368d57d0cc082c224eefb76224524473bf7021d1a32f",
- "sources": "dd5838716293c8aeaf9487c50c6b313dff304e7ddca84ce16923f73865ba4d1d"
+ "jar": "0b6b9371c6a97430390b84c23c58f4470927a747e74704a0ca7d19a09a66fe37",
+ "sources": "d11b69618dba155f075571cbd9b21741953c27dfa9a1af09b4024f2183226abe"
},
- "version": "2.18.0"
+ "version": "2.19.0"
},
"org.apache.sshd:sshd-sftp": {
"shasums": {
- "jar": "bf52fd81d63337cb40050c70ee460c80e78a0a4b77f15da7125eb1841f527e93",
- "sources": "5171d9bac4ee76a013beccc1fdeab93fb43aeb84172d19b929ee158b9281c648"
+ "jar": "a3ad30d2feba9fad589c7ad9117fcd9d332823697d59eb424fe2902f4d805575",
+ "sources": "e26b7df972cead5c529bca6ab3e782c27dd43b323f9a54f98d9e23d4f5d03c30"
},
- "version": "2.18.0"
+ "version": "2.19.0"
},
"org.asciidoctor:asciidoctorj": {
"shasums": {
@@ -1297,33 +1297,33 @@
},
"version": "0.24.0"
},
- "org.eclipse.jetty.ee10:jetty-ee10-servlet": {
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet": {
"shasums": {
- "jar": "05cccc74bbe1478ceb765e967b1cb1a3c8d9b51e99acf586190887e467ffd87d",
- "sources": "51a734b4bc04235b24ccd759515dd2947e5b675c227c556f02262b765bce47eb"
+ "jar": "f88e19a29f4e46322df60fe43d5ac4d852edefad923e8c38ef17ff14dc522e84",
+ "sources": "345f50f1a2937968934f354134cf4dd7e2b94bbfec36a177bb015ba675bd345c"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty.ee8:jetty-ee8-nested": {
"shasums": {
- "jar": "240df6fb5bb28545183cbac87f191c0d21074b17a2c9d4562581a68a8d79c347",
- "sources": "45b7a070430ced248fab480132c2a02c98b64181b619f11fdc27291fc60cdefc"
+ "jar": "b6b4db33b8894688a08f23aba9eee1bc951c66be12a43095f2811121a54018d8",
+ "sources": "2ba3403fb5daf6eaa10e4c3e59fa859e35e4451593d0afd681c2d57b8f6056e9"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty.ee8:jetty-ee8-security": {
"shasums": {
- "jar": "85351106e71c1036256488bbd2c84879d6316c67cdce3b44dda7835daf82e3c9",
- "sources": "d5e6227dfbde0e6beb3cf2976cc64049a85b828143bb328f3de3ef06e5a4803f"
+ "jar": "9f165768c7f7b7a02c7631b38d898f7c16a729b78307c5c3d5940f5de7ee955d",
+ "sources": "7269d79523195225aab585f0bd799914b4d6a9d4746fd71758bb509e6c9b356e"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty.ee8:jetty-ee8-servlet": {
"shasums": {
- "jar": "f593838935e9c15b9cd6bbe8707af6f5e8204f2732c88c84b654962bac660dbe",
- "sources": "53b2477db964532be722a1ff8f53ab4d7f88b87012f4e2b4e3360c5ecd08aff0"
+ "jar": "82bd9eed66b147f243231a164c1157d3dd72cf2d05ae9029e8b12aff9df25fec",
+ "sources": "520e666d8dc4646ccd4b274946278322a393742f54f29d9911be8f46d087c54e"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty.toolchain:jetty-servlet-api": {
"shasums": {
@@ -1334,59 +1334,59 @@
},
"org.eclipse.jetty:jetty-http": {
"shasums": {
- "jar": "090f276739fd9bf8c30511007caec669ea3804b1df1061c37f44467474bee71d",
- "sources": "4d416e2686881085327d3a28e349029d4ae9fc9b44db831291633f18bbf01625"
+ "jar": "0e204f4c71c5d7e138949d50bb7fb15766840ecea6ca24513fb92ee34b363f55",
+ "sources": "1410d5686da1b63ad5d290cdd09b27bd4dfb1a563619a12ef02f63ad8c174eea"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty:jetty-io": {
"shasums": {
- "jar": "448fc0f8f6f5f7251fc46de8e3aae7da14bd7c571a8043dac3dc381d08228fa0",
- "sources": "bf40abffd40e759b16b642e12dfacb7bca1d0c937f5456b62506cc78169f6b56"
+ "jar": "0534454eb445263a8577200f7bd009153d36f3a81ef1543e79ab551846ee3b94",
+ "sources": "d7298bbee4ebde8b35a6566212c9b04c9b19ac9dff7b84eb9a9109ddde805fe9"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty:jetty-jmx": {
"shasums": {
- "jar": "baaaf76b139335125bfa51109c80d271de73f40ee8b5270674f56e90a66e9d81",
- "sources": "b45a4c63d7b7ea44ca6eb9b9c5fbf1d100069bec66942c83ee553d05335a1fcb"
+ "jar": "1207fefdedd9f690d3ac37f1408af6e41f4d9d60a00491e71b3b7137ef95da6f",
+ "sources": "29621d7f6da9909f9214434fef0644c1b5ff20c7d34bc4084daf3de6f1700e86"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty:jetty-security": {
"shasums": {
- "jar": "2f34b7895cec4e3547a1b52e12e7e92b3f3a110bf3c17637f8743ca3f4e42f0c",
- "sources": "9e55b7f04431d4cc723a85a18ddc910e71f5b1a284c28b059d297d07509b4ff8"
+ "jar": "6d21a7cbfd1915735cab6638011998f881161fdeff94936ee8f71e37d3528e79",
+ "sources": "bd00bca2c71ba594de92e10215c705493cbb0fc79149069c6db643911715c9b9"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty:jetty-server": {
"shasums": {
- "jar": "4b0108e87abada7027123deca17186249413232dad0a2bd58a4e70a987b5354a",
- "sources": "5e7693e35285d286dcd0bfdc73d74e6824027eeaaa0a9b4c70c0080475c22f71"
+ "jar": "772f84baf043bbc34edd99de728f3c0b2de642c400dde0fefa763e40de2ea583",
+ "sources": "433739222a745d1a4e14c71b78601065caac517bf307b44f5f85b1cd83da48ae"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty:jetty-session": {
"shasums": {
- "jar": "164649123d15a3f2be5c196e82aa652dff05c75362db71b0f4ab6bb35165020a",
- "sources": "b11e8cfb2db04ac2d1633bccfd47ba9e1b3afca0b75d4354a38140ba3e94c83e"
+ "jar": "d00db0879d2dde6bc8742c3050e995314c5d423e20ca63601cf91add2547a381",
+ "sources": "b86814b8efcff1b2a79bc3ebdd9e02851d131692f2b0e7ab7b9735bbfa86d5bf"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty:jetty-util": {
"shasums": {
- "jar": "c52b4ff62cdacca8a399c611231129e6bd1074db7e3892e78cd106725cdd0ef1",
- "sources": "209630667d8e042f187bed4e754c3f8af7c5247888fc83b8dc97b5bb2134d435"
+ "jar": "8a8d7e063cf312b044927f817b09ad7a4517162d747f7ff891a414e8ef476c26",
+ "sources": "a1cf0445b69a53200633bc8b264cfd88a2927ce4c041048649666ad7cddaaacf"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.eclipse.jetty:jetty-util-ajax": {
"shasums": {
- "jar": "73dfbf388b46c9e2afbc78823ea556f8d25cf851902f99873d03df90becc2b97",
- "sources": "4617309092393ed2f6ed76d915f24b518ccbff8c8731124bf109e346607e86b3"
+ "jar": "2fc1756acdde0bdbc44c693f2c9f5801d7843ccf823b25bd65e6fc52ed77d4f5",
+ "sources": "501f94d01324e7455f365e471acf3c5a3ad6c7c11ceeacf9514f3bc60cdc59e7"
},
- "version": "12.1.10"
+ "version": "12.1.11"
},
"org.hamcrest:hamcrest": {
"shasums": {
@@ -1809,7 +1809,7 @@
"org.commonmark:commonmark-ext-gfm-tables": [
"org.commonmark:commonmark"
],
- "org.eclipse.jetty.ee10:jetty-ee10-servlet": [
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet": [
"jakarta.servlet:jakarta.servlet-api",
"org.eclipse.jetty:jetty-security",
"org.eclipse.jetty:jetty-server",
@@ -1985,20 +1985,12 @@
"autovalue.shaded.com.google.auto.service",
"autovalue.shaded.com.google.common.annotations",
"autovalue.shaded.com.google.common.base",
- "autovalue.shaded.com.google.common.cache",
"autovalue.shaded.com.google.common.collect",
- "autovalue.shaded.com.google.common.escape",
- "autovalue.shaded.com.google.common.eventbus",
- "autovalue.shaded.com.google.common.graph",
"autovalue.shaded.com.google.common.hash",
- "autovalue.shaded.com.google.common.html",
"autovalue.shaded.com.google.common.io",
"autovalue.shaded.com.google.common.math",
- "autovalue.shaded.com.google.common.net",
"autovalue.shaded.com.google.common.primitives",
"autovalue.shaded.com.google.common.reflect",
- "autovalue.shaded.com.google.common.util.concurrent",
- "autovalue.shaded.com.google.common.xml",
"autovalue.shaded.com.google.errorprone.annotations",
"autovalue.shaded.com.google.errorprone.annotations.concurrent",
"autovalue.shaded.com.google.escapevelocity",
@@ -2104,7 +2096,6 @@
"com.google.common.collect.testing",
"com.google.common.collect.testing.features",
"com.google.common.collect.testing.google",
- "com.google.common.collect.testing.suites",
"com.google.common.collect.testing.testers",
"com.google.common.escape.testing",
"com.google.common.testing",
@@ -2364,40 +2355,18 @@
"autovaluegson.shaded.com.google.auto.common",
"autovaluegson.shaded.com.google.common.annotations",
"autovaluegson.shaded.com.google.common.base",
- "autovaluegson.shaded.com.google.common.cache",
"autovaluegson.shaded.com.google.common.collect",
- "autovaluegson.shaded.com.google.common.escape",
- "autovaluegson.shaded.com.google.common.eventbus",
- "autovaluegson.shaded.com.google.common.graph",
- "autovaluegson.shaded.com.google.common.hash",
- "autovaluegson.shaded.com.google.common.html",
- "autovaluegson.shaded.com.google.common.io",
"autovaluegson.shaded.com.google.common.math",
- "autovaluegson.shaded.com.google.common.net",
"autovaluegson.shaded.com.google.common.primitives",
- "autovaluegson.shaded.com.google.common.reflect",
- "autovaluegson.shaded.com.google.common.util.concurrent",
- "autovaluegson.shaded.com.google.common.xml",
"com.ryanharter.auto.value.gson"
],
"com.ryanharter.auto.value:auto-value-gson-factory": [
"autovaluegson.factory.shaded.com.google.auto.common",
"autovaluegson.factory.shaded.com.google.common.annotations",
"autovaluegson.factory.shaded.com.google.common.base",
- "autovaluegson.factory.shaded.com.google.common.cache",
"autovaluegson.factory.shaded.com.google.common.collect",
- "autovaluegson.factory.shaded.com.google.common.escape",
- "autovaluegson.factory.shaded.com.google.common.eventbus",
- "autovaluegson.factory.shaded.com.google.common.graph",
- "autovaluegson.factory.shaded.com.google.common.hash",
- "autovaluegson.factory.shaded.com.google.common.html",
- "autovaluegson.factory.shaded.com.google.common.io",
"autovaluegson.factory.shaded.com.google.common.math",
- "autovaluegson.factory.shaded.com.google.common.net",
"autovaluegson.factory.shaded.com.google.common.primitives",
- "autovaluegson.factory.shaded.com.google.common.reflect",
- "autovaluegson.factory.shaded.com.google.common.util.concurrent",
- "autovaluegson.factory.shaded.com.google.common.xml",
"com.ryanharter.auto.value.gson.factory"
],
"com.ryanharter.auto.value:auto-value-gson-runtime": [
@@ -2806,7 +2775,6 @@
"org.apache.commons.compress.compressors.xz",
"org.apache.commons.compress.compressors.z",
"org.apache.commons.compress.compressors.zstandard",
- "org.apache.commons.compress.harmony",
"org.apache.commons.compress.harmony.archive.internal.nls",
"org.apache.commons.compress.harmony.pack200",
"org.apache.commons.compress.harmony.unpack200",
@@ -3197,7 +3165,6 @@
"org.apache.mina.filter.statistic",
"org.apache.mina.filter.stream",
"org.apache.mina.filter.util",
- "org.apache.mina.handler",
"org.apache.mina.handler.chain",
"org.apache.mina.handler.demux",
"org.apache.mina.handler.multiton",
@@ -3775,14 +3742,14 @@
"org.commonmark.ext.gfm.tables",
"org.commonmark.ext.gfm.tables.internal"
],
- "org.eclipse.jetty.ee10:jetty-ee10-servlet": [
- "org.eclipse.jetty.ee10.servlet",
- "org.eclipse.jetty.ee10.servlet.internal",
- "org.eclipse.jetty.ee10.servlet.jmx",
- "org.eclipse.jetty.ee10.servlet.listener",
- "org.eclipse.jetty.ee10.servlet.security",
- "org.eclipse.jetty.ee10.servlet.security.authentication",
- "org.eclipse.jetty.ee10.servlet.util"
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet": [
+ "org.eclipse.jetty.ee11.servlet",
+ "org.eclipse.jetty.ee11.servlet.internal",
+ "org.eclipse.jetty.ee11.servlet.jmx",
+ "org.eclipse.jetty.ee11.servlet.listener",
+ "org.eclipse.jetty.ee11.servlet.security",
+ "org.eclipse.jetty.ee11.servlet.security.authentication",
+ "org.eclipse.jetty.ee11.servlet.util"
],
"org.eclipse.jetty.ee8:jetty-ee8-nested": [
"org.eclipse.jetty.ee8.nested",
@@ -4548,8 +4515,8 @@
"org.commonmark:commonmark-ext-gfm-tables",
"org.commonmark:commonmark-ext-gfm-tables:jar:sources",
"org.commonmark:commonmark:jar:sources",
- "org.eclipse.jetty.ee10:jetty-ee10-servlet",
- "org.eclipse.jetty.ee10:jetty-ee10-servlet:jar:sources",
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet",
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet:jar:sources",
"org.eclipse.jetty.ee8:jetty-ee8-nested",
"org.eclipse.jetty.ee8:jetty-ee8-nested:jar:sources",
"org.eclipse.jetty.ee8:jetty-ee8-security",
@@ -4848,8 +4815,8 @@
"org.commonmark:commonmark-ext-gfm-tables",
"org.commonmark:commonmark-ext-gfm-tables:jar:sources",
"org.commonmark:commonmark:jar:sources",
- "org.eclipse.jetty.ee10:jetty-ee10-servlet",
- "org.eclipse.jetty.ee10:jetty-ee10-servlet:jar:sources",
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet",
+ "org.eclipse.jetty.ee11:jetty-ee11-servlet:jar:sources",
"org.eclipse.jetty.ee8:jetty-ee8-nested",
"org.eclipse.jetty.ee8:jetty-ee8-nested:jar:sources",
"org.eclipse.jetty.ee8:jetty-ee8-security",
diff --git a/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java b/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
index e520fa2..aba621c 100644
--- a/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
+++ b/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
@@ -200,7 +200,7 @@
} catch (AuthenticationFailedException e) {
// This exception is thrown if the user provided wrong credentials, we don't need to log a
// stacktrace for it.
- logger.atWarning().log(authenticationFailedMsg(username, req) + ": %s", e.getMessage());
+ logger.atWarning().log("%s: %s", authenticationFailedMsg(username, req), e.getMessage());
rsp.sendError(SC_UNAUTHORIZED);
return false;
} catch (AuthenticationUnavailableException e) {
diff --git a/java/com/google/gerrit/pgm/Reindex.java b/java/com/google/gerrit/pgm/Reindex.java
index 7c0f258..0964dae 100644
--- a/java/com/google/gerrit/pgm/Reindex.java
+++ b/java/com/google/gerrit/pgm/Reindex.java
@@ -315,7 +315,7 @@
new CacheDisplay(
sw,
StreamSupport.stream(cacheMap.spliterator(), false)
- .map(e -> CacheInfoFactory.create(e.getExportName(), e.get()))
+ .map(e -> CacheInfoFactory.create(e.getExportName(), e.get(), true))
.collect(Collectors.toList()))
.displayCaches();
System.out.print(sw.toString());
diff --git a/java/com/google/gerrit/pgm/init/api/ConsoleUI.java b/java/com/google/gerrit/pgm/init/api/ConsoleUI.java
index 865f7d7..aaa236c 100644
--- a/java/com/google/gerrit/pgm/init/api/ConsoleUI.java
+++ b/java/com/google/gerrit/pgm/init/api/ConsoleUI.java
@@ -242,7 +242,8 @@
}
@Override
- public void message(String fmt, Object... args) {
+ @FormatMethod
+ public void message(@FormatString String fmt, Object... args) {
console.printf(fmt, args);
}
}
diff --git a/java/com/google/gerrit/server/cache/CacheInfoFactory.java b/java/com/google/gerrit/server/cache/CacheInfoFactory.java
index dafa186..48122db 100644
--- a/java/com/google/gerrit/server/cache/CacheInfoFactory.java
+++ b/java/com/google/gerrit/server/cache/CacheInfoFactory.java
@@ -24,11 +24,11 @@
public class CacheInfoFactory {
- public static CacheInfo create(Cache<?, ?> cache) {
- return create(null, cache);
+ public static CacheInfo create(Cache<?, ?> cache, boolean includeDiskStats) {
+ return create(null, cache, includeDiskStats);
}
- public static CacheInfo create(String name, Cache<?, ?> cache) {
+ public static CacheInfo create(String name, Cache<?, ?> cache, boolean includeDiskStats) {
CacheInfo cacheInfo = new CacheInfo();
cacheInfo.name = name;
@@ -44,10 +44,12 @@
if (cache instanceof PersistentCache) {
cacheInfo.type = CacheType.DISK;
- PersistentCache.DiskStats diskStats = ((PersistentCache) cache).diskStats();
- cacheInfo.entries.setDisk(diskStats.size());
- cacheInfo.entries.setSpace(diskStats.space());
- cacheInfo.hitRatio.setDisk(diskStats.hitCount(), diskStats.requestCount());
+ if (includeDiskStats) {
+ PersistentCache.DiskStats diskStats = ((PersistentCache) cache).diskStats();
+ cacheInfo.entries.setDisk(diskStats.size());
+ cacheInfo.entries.setSpace(diskStats.space());
+ cacheInfo.hitRatio.setDisk(diskStats.hitCount(), diskStats.requestCount());
+ }
} else {
cacheInfo.type = CacheType.MEM;
}
diff --git a/java/com/google/gerrit/server/cache/CacheMetrics.java b/java/com/google/gerrit/server/cache/CacheMetrics.java
index 7053df0..e6dd0a7 100644
--- a/java/com/google/gerrit/server/cache/CacheMetrics.java
+++ b/java/com/google/gerrit/server/cache/CacheMetrics.java
@@ -59,6 +59,12 @@
Long.class,
new Description("Memory eviction count").setGauge().setUnit("evicted entries"),
F_NAME);
+ CallbackMetric1<String, Long> memReq =
+ metrics.newCallbackMetric(
+ "caches/memory_request_count",
+ Long.class,
+ new Description("Memory request count").setGauge().setUnit("requests"),
+ F_NAME);
CallbackMetric1<String, Long> perDiskEnt =
metrics.newCallbackMetric(
"caches/disk_cached",
@@ -79,9 +85,18 @@
.setGauge()
.setUnit("invalidated entries"),
F_NAME);
+ CallbackMetric1<String, Long> perDiskReq =
+ metrics.newCallbackMetric(
+ "caches/disk_request_count",
+ Long.class,
+ new Description("Disk request count for persistent cache")
+ .setGauge()
+ .setUnit("requests"),
+ F_NAME);
ImmutableSet<CallbackMetric<?>> cacheMetrics =
- ImmutableSet.of(memEnt, memHit, memEvict, perDiskEnt, perDiskHit, perDiskInvalid);
+ ImmutableSet.of(
+ memEnt, memHit, memEvict, memReq, perDiskEnt, perDiskHit, perDiskInvalid, perDiskReq);
metrics.newTrigger(
cacheMetrics,
@@ -93,12 +108,14 @@
memEnt.set(name, c.size());
memHit.set(name, cstats.hitRate() * 100);
memEvict.set(name, cstats.evictionCount());
+ memReq.set(name, cstats.requestCount());
if (c instanceof PersistentCache
&& config.getBoolean("cache", "enableDiskStatMetrics", false)) {
PersistentCache.DiskStats d = ((PersistentCache) c).diskStats();
perDiskEnt.set(name, d.size());
perDiskHit.set(name, hitRatio(d));
perDiskInvalid.set(name, d.invalidatedCount());
+ perDiskReq.set(name, d.requestCount());
}
}
cacheMetrics.forEach(CallbackMetric::prune);
diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
index a0534ca..000b03d 100644
--- a/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
+++ b/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
@@ -88,6 +88,7 @@
private final Schedule schedule;
private final AtomicBoolean isDiskCacheReadOnly;
@Nullable private final ExecutorService startupExecutor;
+ private final boolean preWarmForBloomFilter;
@Inject
H2CacheFactory(
@@ -104,6 +105,7 @@
h2CacheSize = cfg.getLong("cache", null, "h2CacheSize", -1);
h2AutoServer = cfg.getBoolean("cache", null, "h2AutoServer", false);
pruneOnStartup = cfg.getBoolean("cachePruning", null, "pruneOnStartup", true);
+ preWarmForBloomFilter = cfg.getBoolean("cache", null, "preWarmForBloomFilter", true);
caches = new ArrayList<>();
schedule =
ScheduleConfig.createSchedule(cfg, "cachePruning")
@@ -224,14 +226,10 @@
}
private <V, K> SqlStore<K, V> newSqlStore(PersistentCacheDef<K, V> def, long maxSize) {
+ String cacheName = def.name() + "-v" + COMPATIBILITY_VERSION;
StringBuilder url = new StringBuilder();
url.append("jdbc:h2:file:")
- .append(
- cacheDir
- .resolve(def.name() + "-v" + COMPATIBILITY_VERSION)
- .toAbsolutePath()
- .toString()
- .replace(";", "\\;"));
+ .append(cacheDir.resolve(cacheName).toAbsolutePath().toString().replace(";", "\\;"));
if (h2CacheSize >= 0) {
url.append(";CACHE_SIZE=");
// H2 CACHE_SIZE is always given in KB
@@ -269,7 +267,9 @@
refreshAfterWrite,
options.contains(CacheOptions.BUILD_BLOOM_FILTER),
options.contains(CacheOptions.TRACK_LAST_ACCESS),
- isDiskCacheReadOnly);
+ isDiskCacheReadOnly,
+ preWarmForBloomFilter,
+ cacheDir.resolve(cacheName + ".mv.db"));
}
private boolean has(String name, String var) {
diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
index 7dada27..d4a6052 100644
--- a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
+++ b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.cache.h2;
+import com.google.common.base.Stopwatch;
import com.google.common.base.Throwables;
import com.google.common.cache.AbstractLoadingCache;
import com.google.common.cache.Cache;
@@ -37,7 +38,10 @@
import com.google.gerrit.util.concurrent.ConcurrentBloomFilter;
import com.google.inject.TypeLiteral;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InvalidClassException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -348,6 +352,8 @@
private boolean trackLastAccess;
private final AtomicBoolean isDiskCacheReadOnly;
private volatile boolean ensuredSchemaCreation;
+ private final Path cacheFilePath;
+ private final boolean preWarmForBloomFilter;
SqlStore(
String jdbcUrl,
@@ -361,7 +367,9 @@
@Nullable Duration refreshAfterWrite,
boolean buildBloomFilter,
boolean trackLastAccess,
- AtomicBoolean isDiskCacheReadOnly) {
+ AtomicBoolean isDiskCacheReadOnly,
+ boolean preWarmForBloomFilter,
+ Path cacheFilePath) {
this.url = jdbcUrl;
this.keyType = createKeyType(keyType, keySerializer);
this.valueSerializer = valueSerializer;
@@ -372,6 +380,8 @@
this.buildBloomFilter = buildBloomFilter;
this.trackLastAccess = trackLastAccess;
this.isDiskCacheReadOnly = isDiskCacheReadOnly;
+ this.cacheFilePath = cacheFilePath;
+ this.preWarmForBloomFilter = preWarmForBloomFilter;
int cores = Runtime.getRuntime().availableProcessors();
int keep = Math.min(cores, 16);
@@ -424,6 +434,24 @@
}
}
+ void warmupOsPageCache() {
+ // null check because tests use in-memory h2.
+ if (cacheFilePath == null || !Files.exists(cacheFilePath)) {
+ return;
+ }
+ logger.atFine().log("Warming OS page cache for %s", cacheFilePath.getFileName());
+ Stopwatch sw = Stopwatch.createStarted();
+ byte[] buf = new byte[65536];
+ try (InputStream in = Files.newInputStream(cacheFilePath)) {
+ while (in.read(buf) != -1) {}
+ } catch (IOException e) {
+ logger.atWarning().log(
+ "Failed to warm OS page cache for %s: %s", cacheFilePath.getFileName(), e.getMessage());
+ }
+ logger.atFine().log(
+ "Finished warming OS page cache for %s after %s", cacheFilePath.getFileName(), sw);
+ }
+
void open() {
bloomFilter.initIfNeeded();
}
@@ -461,6 +489,9 @@
}
private void buildBloomFilter() {
+ if (preWarmForBloomFilter) {
+ warmupOsPageCache();
+ }
SqlHandle c = null;
try (TraceTimer ignored = TraceContext.newTimer("Build bloom filter", Metadata.empty())) {
c = acquire();
@@ -750,6 +781,7 @@
}
DiskStats diskStats() {
+ warmupOsPageCache();
long size = 0;
long space = 0;
SqlHandle c = null;
diff --git a/java/com/google/gerrit/server/change/AddReviewersOp.java b/java/com/google/gerrit/server/change/AddReviewersOp.java
index 239fa7a..6851004 100644
--- a/java/com/google/gerrit/server/change/AddReviewersOp.java
+++ b/java/com/google/gerrit/server/change/AddReviewersOp.java
@@ -82,6 +82,7 @@
private final Collection<Address> addresses;
private final ReviewerState state;
private final boolean forGroup;
+ private boolean allowDowngradeToCC = true;
// Unlike addedCCs, addedReviewers is a PatchSetApproval because the ReviewerResult returned
// via the REST API is supposed to include vote information.
@@ -118,6 +119,10 @@
this.forGroup = forGroup;
}
+ public void setAllowDowngradeToCC(boolean allowDowngradeToCC) {
+ this.allowDowngradeToCC = allowDowngradeToCC;
+ }
+
@Override
public boolean updateChange(ChangeContext ctx) throws RestApiException, IOException {
change = ctx.getChange();
@@ -130,7 +135,10 @@
if (state == CC) {
addedCCs =
approvalsUtil.addCcs(
- ctx.getNotes(), ctx.getUpdate(change.currentPatchSetId()), accountIds, forGroup);
+ ctx.getNotes(),
+ ctx.getUpdate(change.currentPatchSetId()),
+ accountIds,
+ forGroup || !allowDowngradeToCC);
} else {
addedReviewers =
approvalsUtil.addReviewers(
diff --git a/java/com/google/gerrit/server/change/ChangeJson.java b/java/com/google/gerrit/server/change/ChangeJson.java
index a2472e6..16b6cf3 100644
--- a/java/com/google/gerrit/server/change/ChangeJson.java
+++ b/java/com/google/gerrit/server/change/ChangeJson.java
@@ -640,7 +640,7 @@
notes = cd.notes();
} catch (StorageException e) {
String msg = "Error loading change";
- logger.atWarning().withCause(e).log(msg + " %s", cd.getId());
+ logger.atWarning().withCause(e).log("%s %s", msg, cd.getId());
ChangeInfo info = new ChangeInfo();
info._number = cd.getId().get();
ProblemInfo p = new ProblemInfo();
diff --git a/java/com/google/gerrit/server/change/ReviewerModifier.java b/java/com/google/gerrit/server/change/ReviewerModifier.java
index 92dd9db..68e7d90 100644
--- a/java/com/google/gerrit/server/change/ReviewerModifier.java
+++ b/java/com/google/gerrit/server/change/ReviewerModifier.java
@@ -130,6 +130,13 @@
/** Whether the visibility check for the reviewer account should be skipped. */
public boolean skipVisibilityCheck = false;
+
+ /**
+ * Whether an existing REVIEWER should be downgraded to CC if the input state is CC.
+ *
+ * <p>If false, and the account is already a REVIEWER, the state will remain REVIEWER.
+ */
+ public boolean allowDowngradeToCC = true;
}
public static InternalReviewerInput newReviewerInput(
@@ -161,6 +168,10 @@
in.state = CC;
in.notify = notify;
in.otherFailureBehavior = FailureBehavior.IGNORE_ALL;
+ // Automatic addition of author/committer as CC is an implicit system action on push.
+ // Preserve existing REVIEWER status so implicit auto-CC does not demote explicitly assigned
+ // reviewers.
+ in.allowDowngradeToCC = false;
return Optional.of(in);
}
@@ -527,6 +538,10 @@
this.reviewersByEmail,
state(),
forGroup);
+ if (input instanceof InternalReviewerInput) {
+ ((AddReviewersOp) op)
+ .setAllowDowngradeToCC(((InternalReviewerInput) input).allowDowngradeToCC);
+ }
}
this.exactMatchFound = exactMatchFound;
}
diff --git a/java/com/google/gerrit/server/events/EventFactory.java b/java/com/google/gerrit/server/events/EventFactory.java
index 6380db3..f339d76 100644
--- a/java/com/google/gerrit/server/events/EventFactory.java
+++ b/java/com/google/gerrit/server/events/EventFactory.java
@@ -62,9 +62,14 @@
import com.google.gerrit.server.patch.DiffNotAvailableException;
import com.google.gerrit.server.patch.DiffOperations;
import com.google.gerrit.server.patch.DiffOptions;
+import com.google.gerrit.server.patch.DiffSummaryKey;
import com.google.gerrit.server.patch.FilePathAdapter;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
import com.google.gerrit.server.patch.filediff.FileDiffOutput;
import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeData.ChangedLines;
import com.google.gerrit.server.query.change.InternalChangeQuery;
import com.google.gerrit.server.util.AccountTemplateUtil;
import com.google.inject.Inject;
@@ -90,6 +95,7 @@
private final AccountCache accountCache;
private final DynamicItem<UrlFormatter> urlFormatter;
private final DiffOperations diffOperations;
+ private final PatchListCache patchListCache;
private final Emails emails;
private final Provider<PersonIdent> myIdent;
private final ChangeData.Factory changeDataFactory;
@@ -105,6 +111,7 @@
Emails emails,
DynamicItem<UrlFormatter> urlFormatter,
DiffOperations diffOperations,
+ PatchListCache patchListCache,
@GerritPersonIdent Provider<PersonIdent> myIdent,
ChangeData.Factory changeDataFactory,
ApprovalsUtil approvalsUtil,
@@ -116,6 +123,7 @@
this.urlFormatter = urlFormatter;
this.emails = emails;
this.diffOperations = diffOperations;
+ this.patchListCache = patchListCache;
this.myIdent = myIdent;
this.changeDataFactory = changeDataFactory;
this.approvalsUtil = approvalsUtil;
@@ -460,7 +468,6 @@
p.ref = patchSet.refName();
p.uploader = asAccountAttribute(patchSet.uploader(), accountLoader);
p.createdOn = patchSet.createdOn().getEpochSecond();
- PatchSet.Id pId = patchSet.id();
try {
p.parents = new ArrayList<>();
RevCommit c = revWalk.parseCommit(ObjectId.fromString(p.revision));
@@ -478,20 +485,20 @@
p.author = asAccountAttribute(author.getAccount(), accountLoader);
}
- Map<String, FileDiffOutput> modifiedFiles =
- diffOperations.listModifiedFilesAgainstParent(
- changeData.project(), patchSet.commitId(), /* parentNum= */ 0, DiffOptions.DEFAULTS);
- for (FileDiffOutput fileDiff : modifiedFiles.values()) {
- p.sizeDeletions += fileDiff.deletions();
- p.sizeInsertions += fileDiff.insertions();
- }
+ ChangedLines changedLines =
+ patchListCache
+ .getDiffSummary(
+ DiffSummaryKey.fromPatchListKey(
+ PatchListKey.againstBase(patchSet.commitId(), c.getParentCount())),
+ changeData.project())
+ .getChangedLines();
+ p.sizeDeletions = changedLines.deletions;
+ p.sizeInsertions = changedLines.insertions;
p.kind =
changeKindCache.getChangeKind(
revWalk, repoConfig, attributesNodeProvider, changeData, patchSet);
- } catch (IOException | StorageException e) {
+ } catch (IOException | StorageException | PatchListNotAvailableException e) {
logger.atSevere().withCause(e).log("Cannot load patch set data for %s", patchSet.id());
- } catch (DiffNotAvailableException e) {
- logger.atSevere().withCause(e).log("Cannot get size information for %s.", pId);
}
return p;
}
diff --git a/java/com/google/gerrit/server/git/WorkQueue.java b/java/com/google/gerrit/server/git/WorkQueue.java
index 5771fe9..6209854 100644
--- a/java/com/google/gerrit/server/git/WorkQueue.java
+++ b/java/com/google/gerrit/server/git/WorkQueue.java
@@ -970,7 +970,7 @@
if (runningState.compareAndSet(null, State.READY)) {
String oldThreadName = Thread.currentThread().getName();
try {
- Thread.currentThread().setName(oldThreadName + "[" + this + "]");
+ setThreadName(oldThreadName);
executor.waitUntilReadyToStart(this); // Transitions to PARKED while not ready to start
runningState.set(State.STARTING);
executor.onStart(this);
@@ -992,6 +992,20 @@
}
}
+ private void setThreadName(String oldThreadName) {
+ try {
+ Thread.currentThread().setName(oldThreadName + "[" + this + "]");
+ } catch (Exception e) {
+ logger.atWarning().withCause(e).log("Cannot describe task");
+ try {
+ Thread.currentThread().setName(oldThreadName + "[" + runnable.getClass().getName() + "]");
+ } catch (Exception e2) {
+ logger.atWarning().withCause(e2).log("Cannot get runnable class name");
+ Thread.currentThread().setName(oldThreadName + "[unknown task]");
+ }
+ }
+ }
+
@Override
public String toString() {
// This is a workaround to be able to print a proper name when the task
diff --git a/java/com/google/gerrit/server/patch/filediff/FileDiffCacheImpl.java b/java/com/google/gerrit/server/patch/filediff/FileDiffCacheImpl.java
index 2c50d10..9abbe45 100644
--- a/java/com/google/gerrit/server/patch/filediff/FileDiffCacheImpl.java
+++ b/java/com/google/gerrit/server/patch/filediff/FileDiffCacheImpl.java
@@ -549,12 +549,9 @@
result.add(AugmentedFileDiffCacheKey.builder().key(key).ignoreRebase(true).build());
}
} catch (IOException e) {
- logger.atWarning().log(
- "Failed to evaluate commits relation for key "
- + key
- + ". Skipping this key: "
- + e.getMessage(),
- e);
+ logger.atWarning().withCause(e).log(
+ "Failed to evaluate commits relation for key %s. Skipping this key: %s",
+ key, e.getMessage());
result.add(AugmentedFileDiffCacheKey.builder().key(key).ignoreRebase(true).build());
}
}
diff --git a/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiff.java b/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiff.java
index 580aef5..23b0024 100644
--- a/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiff.java
+++ b/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiff.java
@@ -32,6 +32,7 @@
import com.google.gerrit.server.patch.filediff.Edit;
import com.google.protobuf.Descriptors.FieldDescriptor;
import java.util.Optional;
+import org.eclipse.jgit.attributes.Attribute;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.lib.AbbreviatedObjectId;
import org.eclipse.jgit.lib.FileMode;
@@ -66,8 +67,17 @@
* parameters.
*/
static GitFileDiff create(DiffEntry diffEntry, FileHeader fileHeader) {
+ Attribute diffAttr = diffEntry.getDiffAttribute();
+ // Treat the file as binary if .gitattributes explicitly unsets diffing (e.g. "-diff"
+ // or the "binary" macro which JGit expands to "-diff -merge -text").
+ boolean isBinary = diffAttr != null && diffAttr.getState() == Attribute.State.UNSET;
+
ImmutableList<Edit> edits =
- fileHeader.toEditList().stream().map(Edit::fromJGitEdit).collect(toImmutableList());
+ isBinary
+ ? ImmutableList.of()
+ : fileHeader.toEditList().stream().map(Edit::fromJGitEdit).collect(toImmutableList());
+
+ PatchType patchType = isBinary ? PatchType.BINARY : FileHeaderUtil.getPatchType(fileHeader);
return builder()
.edits(edits)
@@ -77,7 +87,7 @@
.oldPath(FileHeaderUtil.getOldPath(fileHeader))
.newPath(FileHeaderUtil.getNewPath(fileHeader))
.changeType(FileHeaderUtil.getChangeType(fileHeader))
- .patchType(Optional.of(FileHeaderUtil.getPatchType(fileHeader)))
+ .patchType(Optional.of(patchType))
.oldMode(Optional.of(mapFileMode(diffEntry.getOldMode())))
.newMode(Optional.of(mapFileMode(diffEntry.getNewMode())))
.build();
diff --git a/java/com/google/gerrit/server/permissions/DefaultRefFilter.java b/java/com/google/gerrit/server/permissions/DefaultRefFilter.java
index 31be280..4e156fa 100644
--- a/java/com/google/gerrit/server/permissions/DefaultRefFilter.java
+++ b/java/com/google/gerrit/server/permissions/DefaultRefFilter.java
@@ -349,7 +349,7 @@
boolean canRead =
permissionBackendForProject.ref(dest.branch()).test(RefPermission.READ_PRIVATE_CHANGES);
logger.atFinest().log(
- "Foreign change edit ref is " + (canRead ? "visible" : "invisible") + ": %s", name);
+ "Foreign change edit ref is %s: %s", canRead ? "visible" : "invisible", name);
return canRead;
}
@@ -359,7 +359,7 @@
private boolean isMetadata(String name) {
boolean isMetaData = RefNames.isRefsChanges(name) || RefNames.isRefsEdit(name);
- logger.atFinest().log("ref %s is " + (isMetaData ? "" : "not ") + "a metadata ref", name);
+ logger.atFinest().log("ref %s is %sa metadata ref", isMetaData ? "" : "not ", name);
return isMetaData;
}
diff --git a/java/com/google/gerrit/server/permissions/RefVisibilityControl.java b/java/com/google/gerrit/server/permissions/RefVisibilityControl.java
index 665f995..4f7768b 100644
--- a/java/com/google/gerrit/server/permissions/RefVisibilityControl.java
+++ b/java/com/google/gerrit/server/permissions/RefVisibilityControl.java
@@ -181,7 +181,7 @@
.ref(cd.change().getDest().branch())
.test(RefPermission.READ_PRIVATE_CHANGES);
logger.atFinest().log(
- "Foreign change edit ref is " + (canRead ? "visible" : "invisible") + ": %s", refName);
+ "Foreign change edit ref is %s: %s", canRead ? "visible" : "invisible", refName);
return canRead;
}
}
diff --git a/java/com/google/gerrit/server/query/change/ChangePredicates.java b/java/com/google/gerrit/server/query/change/ChangePredicates.java
index d5f9c5b..fdaa061 100644
--- a/java/com/google/gerrit/server/query/change/ChangePredicates.java
+++ b/java/com/google/gerrit/server/query/change/ChangePredicates.java
@@ -249,6 +249,11 @@
ChangeField.FUZZY_HASHTAG, HashtagsUtil.cleanupHashtag(hashtag).toLowerCase(Locale.US));
}
+ /** Returns a predicate that matches changes that are tagged with at least one hashtag. */
+ public static Predicate<ChangeData> hasHashtag() {
+ return new ChangeIndexPredicate(ChangeField.PREFIX_HASHTAG, "");
+ }
+
/**
* Returns a predicate that matches changes in the provided {@code hashtag}. Used with prefixes
*/
diff --git a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index 704f8ed..6311c65 100644
--- a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -719,6 +719,11 @@
return new IsUnresolvedPredicate();
}
+ if ("hashtag".equalsIgnoreCase(value)) {
+ checkOperatorAvailable(ChangeField.PREFIX_HASHTAG, "has:hashtag");
+ return ChangePredicates.hasHashtag();
+ }
+
// for plugins the value will be operandName_pluginName
List<String> names = PLUGIN_SPLITTER.splitToList(value);
if (names.size() == 2) {
diff --git a/java/com/google/gerrit/server/query/change/OutputStreamQuery.java b/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
index 3ce7e38..9f4e6d2 100644
--- a/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
+++ b/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
@@ -30,6 +30,8 @@
import com.google.gerrit.index.query.QueryResult;
import com.google.gerrit.server.DynamicOptions;
import com.google.gerrit.server.account.AccountAttributeLoader;
+import com.google.gerrit.server.cancellation.RequestCancelledException;
+import com.google.gerrit.server.cancellation.RequestStateProvider;
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.data.ChangeAttribute;
import com.google.gerrit.server.data.PatchSetAttribute;
@@ -224,6 +226,10 @@
AccountAttributeLoader accountLoader = accountAttributeLoaderFactory.create();
List<ChangeAttribute> changeAttributes = new ArrayList<>();
for (ChangeData d : results.entities()) {
+ if (Thread.currentThread().isInterrupted()) {
+ throw new RequestCancelledException(
+ RequestStateProvider.Reason.CLIENT_CLOSED_REQUEST, null);
+ }
changeAttributes.add(
buildChangeAttribute(d, repos, revWalks, accountLoader, attributesNodeProviders));
}
diff --git a/java/com/google/gerrit/server/restapi/account/QueryAccounts.java b/java/com/google/gerrit/server/restapi/account/QueryAccounts.java
index f0476d1..05ac95e 100644
--- a/java/com/google/gerrit/server/restapi/account/QueryAccounts.java
+++ b/java/com/google/gerrit/server/restapi/account/QueryAccounts.java
@@ -30,10 +30,6 @@
import com.google.gerrit.index.query.Predicate;
import com.google.gerrit.index.query.QueryParseException;
import com.google.gerrit.index.query.QueryResult;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.Units;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.Timer0;
import com.google.gerrit.server.account.AccountControl;
import com.google.gerrit.server.account.AccountDirectory.FillOptions;
import com.google.gerrit.server.account.AccountInfoComparator;
@@ -48,7 +44,6 @@
import com.google.gerrit.server.query.account.AccountQueryProcessor;
import com.google.inject.Inject;
import com.google.inject.Provider;
-import com.google.inject.Singleton;
import java.util.Collections;
import java.util.EnumSet;
import java.util.LinkedHashMap;
@@ -76,7 +71,8 @@
private final boolean suggestConfig;
private final int suggestFrom;
private final AccountControl.Factory accountControlFactory;
- private final Metrics metrics;
+
+ private final AccountVisibility accountVisibility;
private AccountLoader accountLoader;
private boolean suggest;
@@ -144,13 +140,13 @@
Provider<AccountQueryProcessor> queryProcessorProvider,
@GerritServerConfig Config cfg,
AccountControl.Factory accountControlFactory,
- Metrics metrics) {
+ AccountVisibility accountVisibility) {
this.permissionBackend = permissionBackend;
this.accountLoaderFactory = accountLoaderFactory;
this.queryBuilder = queryBuilder;
this.queryProcessorProvider = queryProcessorProvider;
this.accountControlFactory = accountControlFactory;
- this.metrics = metrics;
+ this.accountVisibility = accountVisibility;
this.suggestFrom = cfg.getInt("suggest", null, "from", 0);
this.options = EnumSet.noneOf(ListAccountsOption.class);
@@ -179,8 +175,14 @@
return Response.ok(Collections.emptyList());
}
+ AccountControl accountControl = accountControlFactory.get();
+ boolean canSeeDetails =
+ accountVisibility == AccountVisibility.ALL
+ || accountControl.getUser().isIdentifiedUser()
+ || accountControl.canViewAll();
+
Set<FillOptions> fillOptions = EnumSet.of(FillOptions.ID);
- if (options.contains(ListAccountsOption.DETAILS)) {
+ if (options.contains(ListAccountsOption.DETAILS) && canSeeDetails) {
fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
}
boolean modifyAccountCapabilityChecked = false;
@@ -191,13 +193,12 @@
fillOptions.add(FillOptions.SECONDARY_EMAILS);
}
if (suggest) {
- fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
- fillOptions.add(FillOptions.EMAIL);
+ if (canSeeDetails) {
+ fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
+ fillOptions.add(FillOptions.EMAIL);
- if (modifyAccountCapabilityChecked) {
- fillOptions.add(FillOptions.SECONDARY_EMAILS);
- } else {
- if (permissionBackend.currentUser().test(GlobalPermission.VIEW_SECONDARY_EMAILS)) {
+ if (modifyAccountCapabilityChecked
+ || permissionBackend.currentUser().test(GlobalPermission.VIEW_SECONDARY_EMAILS)) {
fillOptions.add(FillOptions.SECONDARY_EMAILS);
}
}
@@ -209,6 +210,7 @@
throw new MethodNotAllowedException("query disabled");
}
+ queryProcessor.enforceVisibility(true);
queryProcessor.setUserProvidedLimit(limit != null ? limit : 0, /* applyDefaultLimit */ true);
if (start != null) {
@@ -232,15 +234,10 @@
// active accounts should be queried
queryPred = AccountPredicates.andActive(queryPred);
}
- AccountControl accountControl = accountControlFactory.get();
QueryResult<AccountState> result = queryProcessor.query(queryPred);
- try (Timer0.Context ignored = metrics.filterVisibilityLatency.start()) {
- for (AccountState accountState : result.entities()) {
- Account.Id id = accountState.account().id();
- if (accountControl.canSee(accountState)) {
- matches.put(id, accountLoader.get(id));
- }
- }
+ for (AccountState accountState : result.entities()) {
+ Account.Id id = accountState.account().id();
+ matches.put(id, accountLoader.get(id));
}
accountLoader.fill();
@@ -258,19 +255,4 @@
throw new BadRequestException(e.getMessage(), e);
}
}
-
- @Singleton
- private static class Metrics {
- final Timer0 filterVisibilityLatency;
-
- @Inject
- Metrics(MetricMaker metricMaker) {
- filterVisibilityLatency =
- metricMaker.newTimer(
- "accounts/query/filter_visibility",
- new Description("Latency for removing accounts that are not visible to the caller")
- .setCumulative()
- .setUnit(Units.MILLISECONDS));
- }
- }
}
diff --git a/java/com/google/gerrit/server/restapi/config/GetCache.java b/java/com/google/gerrit/server/restapi/config/GetCache.java
index 23615fa..0f06128 100644
--- a/java/com/google/gerrit/server/restapi/config/GetCache.java
+++ b/java/com/google/gerrit/server/restapi/config/GetCache.java
@@ -26,6 +26,6 @@
@Override
public Response<CacheInfo> apply(CacheResource rsrc) {
- return Response.ok(CacheInfoFactory.create(rsrc.getName(), rsrc.getCache()));
+ return Response.ok(CacheInfoFactory.create(rsrc.getName(), rsrc.getCache(), true));
}
}
diff --git a/java/com/google/gerrit/server/restapi/config/ListCaches.java b/java/com/google/gerrit/server/restapi/config/ListCaches.java
index 2856d83..6411615 100644
--- a/java/com/google/gerrit/server/restapi/config/ListCaches.java
+++ b/java/com/google/gerrit/server/restapi/config/ListCaches.java
@@ -51,26 +51,33 @@
@Option(name = "--format", usage = "output format")
private OutputFormat format;
+ @Option(
+ name = "--include-diskstats",
+ usage = "if set, disk stat collection is included for persistent caches")
+ private boolean includeDiskStats;
+
public ListCaches setFormat(OutputFormat format) {
this.format = format;
return this;
}
+ public ListCaches setIncludeDiskStats(boolean includeDiskStats) {
+ this.includeDiskStats = includeDiskStats;
+ return this;
+ }
+
@Inject
public ListCaches(DynamicMap<Cache<?, ?>> cacheMap) {
this.cacheMap = cacheMap;
}
- public Map<String, CacheInfo> getCacheInfos() {
- return getCacheInfos(name -> true);
- }
-
- public Map<String, CacheInfo> getCacheInfos(Predicate<String> nameFilter) {
+ public Map<String, CacheInfo> getCacheInfos(
+ Predicate<String> nameFilter, boolean includeDiskStats) {
Map<String, CacheInfo> cacheInfos = new TreeMap<>();
for (Extension<Cache<?, ?>> e : cacheMap) {
String name = cacheNameOf(e.getPluginName(), e.getExportName());
if (nameFilter.test(name)) {
- cacheInfos.put(name, CacheInfoFactory.create(e.getProvider().get()));
+ cacheInfos.put(name, CacheInfoFactory.create(e.getProvider().get(), includeDiskStats));
}
}
return cacheInfos;
@@ -79,7 +86,7 @@
@Override
public Response<Object> apply(ConfigResource rsrc) {
if (format == null) {
- return Response.ok(getCacheInfos());
+ return Response.ok(getCacheInfos(name -> true, includeDiskStats));
}
Stream<String> cacheNames =
Streams.stream(cacheMap)
diff --git a/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java
index c820e5a..944fb2c 100644
--- a/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java
+++ b/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java
@@ -35,6 +35,10 @@
super(cfg, sitePaths, threadSettingsConfig);
}
+ protected H2AccountPatchReviewStore() {
+ super();
+ }
+
@Override
public StorageException convertError(String op, SQLException err) {
switch (getSQLStateInt(err)) {
diff --git a/java/com/google/gerrit/server/schema/H2CustomLockAccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/H2CustomLockAccountPatchReviewStore.java
new file mode 100644
index 0000000..678fea1
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/H2CustomLockAccountPatchReviewStore.java
@@ -0,0 +1,124 @@
+// Copyright (C) 2026 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.schema;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.SitePaths;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Proxy;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Abstract base for H2 stores that replace H2's built-in file locking with a custom mechanism.
+ *
+ * <p>H2 is opened with {@code FILE_LOCK=NO}; subclasses implement {@link #tryAcquireLock()} to make
+ * a single lock attempt. The retry loop with exponential backoff is handled here.
+ */
+abstract class H2CustomLockAccountPatchReviewStore extends H2AccountPatchReviewStore {
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+ private static final long INITIAL_BACKOFF_MS = 1;
+ private static final long MAX_BACKOFF_MS = 500;
+ static final long DEFAULT_LOCK_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(30);
+
+ private final String url;
+ private final long lockTimeoutMs;
+
+ protected H2CustomLockAccountPatchReviewStore(Config cfg, SitePaths sitePaths) {
+ super();
+ this.url =
+ JdbcAccountPatchReviewStore.getUrl(cfg, sitePaths) + ";FILE_LOCK=NO;DB_CLOSE_DELAY=0";
+ this.lockTimeoutMs =
+ ConfigUtil.getTimeUnit(
+ cfg,
+ JdbcAccountPatchReviewStore.ACCOUNT_PATCH_REVIEW_DB,
+ null,
+ "h2LockTimeout",
+ DEFAULT_LOCK_TIMEOUT_MS,
+ TimeUnit.MILLISECONDS);
+ }
+
+ protected long getLockTimeoutMs() {
+ return lockTimeoutMs;
+ }
+
+ /**
+ * Makes a single attempt to acquire the lock.
+ *
+ * @return a {@link Runnable} that releases the lock, or {@code null} if the lock is currently
+ * held by another process (retry-able)
+ * @throws SQLException on a hard, non-retryable error
+ */
+ @Nullable
+ protected abstract Runnable tryAcquireLock() throws SQLException;
+
+ private Runnable acquireExclusiveLock() throws SQLException {
+ long backoffMs = INITIAL_BACKOFF_MS;
+ long deadline = System.currentTimeMillis() + lockTimeoutMs;
+ while (true) {
+ Runnable unlock = tryAcquireLock();
+ if (unlock != null) {
+ return unlock;
+ }
+ long remaining = deadline - System.currentTimeMillis();
+ if (remaining <= 0) {
+ throw new SQLException("Could not acquire H2 lock within " + lockTimeoutMs + " ms");
+ }
+ long sleepMs = Math.min(backoffMs, remaining);
+ logger.atFine().log("H2 lock held by another process, retrying in %d ms", sleepMs);
+ try {
+ Thread.sleep(sleepMs);
+ } catch (InterruptedException ie) {
+ Thread.currentThread().interrupt();
+ throw new SQLException("Interrupted while waiting for H2 lock", ie);
+ }
+ backoffMs = Math.min(backoffMs * 2, MAX_BACKOFF_MS);
+ }
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+ Runnable unlock = acquireExclusiveLock();
+ try {
+ return lockingConnection(DriverManager.getConnection(url), unlock);
+ } catch (SQLException e) {
+ unlock.run();
+ throw e;
+ }
+ }
+
+ private static Connection lockingConnection(Connection con, Runnable unlock) {
+ return (Connection)
+ Proxy.newProxyInstance(
+ Connection.class.getClassLoader(),
+ new Class<?>[] {Connection.class},
+ (proxy, method, args) -> {
+ try {
+ return method.invoke(con, args);
+ } catch (InvocationTargetException e) {
+ throw e.getCause();
+ } finally {
+ if ("close".equals(method.getName())) {
+ unlock.run();
+ }
+ }
+ });
+ }
+}
diff --git a/java/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStore.java
new file mode 100644
index 0000000..d930013
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStore.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2026 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.schema;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.File;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.internal.storage.file.LockFile;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * H2 store using jgit-style {@link LockFile} locking for inter-process mutual exclusion.
+ *
+ * <p>Activated by setting {@code accountPatchReviewDb.h2LockType = jgit}. Each call to {@link
+ * #getConnection()} atomically creates a {@code .lock} sidecar file before opening H2 and deletes
+ * it when the connection is closed.
+ */
+@Singleton
+public class H2JGitLockAccountPatchReviewStore extends H2CustomLockAccountPatchReviewStore {
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+ private static final String H2_DB_URL_PREFIX = "jdbc:h2:file:";
+ private final File lockTarget;
+
+ @Inject
+ H2JGitLockAccountPatchReviewStore(@GerritServerConfig Config cfg, SitePaths sitePaths) {
+ super(cfg, sitePaths);
+ this.lockTarget = lockTargetFromUrl(JdbcAccountPatchReviewStore.getUrl(cfg, sitePaths));
+ }
+
+ @VisibleForTesting
+ static File lockTargetFromUrl(String h2Url) {
+ if (!h2Url.startsWith(H2_DB_URL_PREFIX)) {
+ throw new IllegalArgumentException("Not a valid H2 file URL: " + h2Url);
+ }
+
+ // URL format: "jdbc:h2:file:/path/to/db" - where ";" in the path is escaped as "\;"
+ String path = h2Url.substring(H2_DB_URL_PREFIX.length());
+
+ // Split on first unescaped ";" to drop options, then unescape "\;" in the path
+ return new File(
+ Iterables.get(Splitter.on(Pattern.compile("(?<!\\\\);")).split(path), 0)
+ .replace("\\;", ";"));
+ }
+
+ @Override
+ public void start() {
+ super.start();
+ logger.atInfo().log(
+ "AccountPatchReviewStore using H2 with jgit-style locking (h2LockType=jgit)."
+ + " lockFile=%s lockTimeout=%d ms",
+ lockTarget, getLockTimeoutMs());
+ }
+
+ @Nullable
+ @Override
+ protected Runnable tryAcquireLock() throws SQLException {
+ LockFile lock = new LockFile(lockTarget);
+ try {
+ return lock.lock() ? lock::unlock : null;
+ } catch (IOException e) {
+ throw new SQLException("Failed to acquire jgit-style lock for H2 database", e);
+ }
+ }
+}
diff --git a/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
index 3ca034d..fa53fe7 100644
--- a/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
+++ b/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
@@ -60,13 +60,15 @@
public static final String TEST_IN_MEMORY_URL =
"jdbc:h2:mem:account_patch_reviews;DB_CLOSE_DELAY=-1";
- private static final String ACCOUNT_PATCH_REVIEW_DB = "accountPatchReviewDb";
+ static final String ACCOUNT_PATCH_REVIEW_DB = "accountPatchReviewDb";
private static final String H2_DB = "h2";
private static final String MARIADB = "mariadb";
private static final String MYSQL = "mysql";
private static final String POSTGRESQL = "postgresql";
private static final String CLOUDSPANNER = "cloudspanner";
private static final String URL = "url";
+ private static final String H2_LOCK_TYPE = "h2LockType";
+ static final String H2_LOCK_TYPE_JGIT = "jgit";
public static class JdbcAccountPatchReviewStoreModule extends LifecycleModule {
private final Config cfg;
@@ -80,7 +82,18 @@
Class<? extends JdbcAccountPatchReviewStore> impl;
String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
if (url == null || url.contains(H2_DB)) {
- impl = H2AccountPatchReviewStore.class;
+ String lockType = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, H2_LOCK_TYPE);
+ switch (lockType != null ? lockType : "") {
+ case "":
+ impl = H2AccountPatchReviewStore.class;
+ break;
+ case H2_LOCK_TYPE_JGIT:
+ impl = H2JGitLockAccountPatchReviewStore.class;
+ break;
+ default:
+ throw new IllegalArgumentException(
+ "Invalid accountPatchReviewDb.h2LockType value: " + lockType);
+ }
} else if (url.contains(POSTGRESQL)) {
impl = PostgresqlAccountPatchReviewStore.class;
} else if (url.contains(MYSQL)) {
@@ -104,7 +117,16 @@
Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
if (url == null || url.contains(H2_DB)) {
- return new H2AccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
+ String lockType = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, H2_LOCK_TYPE);
+ switch (lockType != null ? lockType : "") {
+ case "":
+ return new H2AccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
+ case H2_LOCK_TYPE_JGIT:
+ return new H2JGitLockAccountPatchReviewStore(cfg, sitePaths);
+ default:
+ throw new IllegalArgumentException(
+ "Invalid accountPatchReviewDb.h2LockType value: " + lockType);
+ }
}
if (url.contains(POSTGRESQL)) {
return new PostgresqlAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
@@ -127,7 +149,12 @@
this.ds = createDataSource(cfg, sitePaths, threadSettingsConfig);
}
- private static String getUrl(@GerritServerConfig Config cfg, SitePaths sitePaths) {
+ // Used by subclasses that manage their own connections without a pool.
+ protected JdbcAccountPatchReviewStore() {
+ this.ds = null;
+ }
+
+ static String getUrl(@GerritServerConfig Config cfg, SitePaths sitePaths) {
String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
if (url == null) {
return createH2Url(sitePaths.db_dir.resolve("account_patch_reviews"));
@@ -191,7 +218,7 @@
}
public void createTableIfNotExists() {
- try (Connection con = ds.getConnection();
+ try (Connection con = getConnection();
Statement stmt = con.createStatement()) {
doCreateTable(stmt);
} catch (SQLException e) {
@@ -212,7 +239,7 @@
}
public void dropTableIfExists() {
- try (Connection con = ds.getConnection();
+ try (Connection con = getConnection();
Statement stmt = con.createStatement()) {
stmt.executeUpdate("DROP TABLE IF EXISTS account_patch_reviews");
} catch (SQLException e) {
@@ -233,7 +260,7 @@
.accountId(accountId.get())
.filePath(path)
.build());
- Connection con = ds.getConnection();
+ Connection con = getConnection();
PreparedStatement stmt =
con.prepareStatement(
"INSERT INTO account_patch_reviews "
@@ -268,7 +295,7 @@
.accountId(accountId.get())
.resourceCount(paths.size())
.build());
- Connection con = ds.getConnection();
+ Connection con = getConnection();
PreparedStatement stmt =
con.prepareStatement(
"INSERT INTO account_patch_reviews "
@@ -301,7 +328,7 @@
.accountId(accountId.get())
.filePath(path)
.build());
- Connection con = ds.getConnection();
+ Connection con = getConnection();
PreparedStatement stmt =
con.prepareStatement(
"DELETE FROM account_patch_reviews "
@@ -323,7 +350,7 @@
TraceContext.newTimer(
"Clear all reviewed flags of patch set",
Metadata.builder().patchSetId(psId.get()).build());
- Connection con = ds.getConnection();
+ Connection con = getConnection();
PreparedStatement stmt =
con.prepareStatement(
"DELETE FROM account_patch_reviews "
@@ -342,7 +369,7 @@
TraceContext.newTimer(
"Clear all reviewed flags of change",
Metadata.builder().changeId(changeId.get()).build());
- Connection con = ds.getConnection();
+ Connection con = getConnection();
PreparedStatement stmt =
con.prepareStatement("DELETE FROM account_patch_reviews WHERE change_id = ?")) {
stmt.setInt(1, changeId.get());
@@ -358,7 +385,7 @@
TraceContext.newTimer(
"Clear all reviewed flags by user",
Metadata.builder().accountId(accountId.get()).build());
- Connection con = ds.getConnection();
+ Connection con = getConnection();
PreparedStatement stmt =
con.prepareStatement("DELETE FROM account_patch_reviews WHERE account_id = ?")) {
stmt.setInt(1, accountId.get());
@@ -374,7 +401,7 @@
TraceContext.newTimer(
"Find reviewed flags",
Metadata.builder().patchSetId(psId.get()).accountId(accountId.get()).build());
- Connection con = ds.getConnection();
+ Connection con = getConnection();
PreparedStatement stmt =
con.prepareStatement(
"SELECT patch_set_id, file_name FROM account_patch_reviews APR1 "
diff --git a/java/com/google/gerrit/sshd/commands/ShowCaches.java b/java/com/google/gerrit/sshd/commands/ShowCaches.java
index 71e5bd1..bf7c154 100644
--- a/java/com/google/gerrit/sshd/commands/ShowCaches.java
+++ b/java/com/google/gerrit/sshd/commands/ShowCaches.java
@@ -85,6 +85,11 @@
private boolean showThreads;
@Option(
+ name = "--include-diskstats",
+ usage = "include disk stat collection for persistent caches")
+ private boolean includeDiskStats;
+
+ @Option(
name = "--cache",
usage = "show the named cache; may be supplied more than once",
metaVar = "NAME")
@@ -166,11 +171,13 @@
private Collection<CacheInfo> getCaches() {
Map<String, CacheInfo> selected;
if (caches.isEmpty()) {
- selected = listCaches.getCacheInfos();
+ selected = listCaches.getCacheInfos(name -> true, includeDiskStats);
} else {
Set<String> filter =
caches.stream().map(n -> n.toLowerCase(Locale.US)).collect(Collectors.toSet());
- selected = listCaches.getCacheInfos(n -> filter.contains(n.toLowerCase(Locale.US)));
+ selected =
+ listCaches.getCacheInfos(
+ n -> filter.contains(n.toLowerCase(Locale.US)), includeDiskStats);
}
for (Map.Entry<String, CacheInfo> entry : selected.entrySet()) {
CacheInfo cache = entry.getValue();
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/AbstractAccountIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/AbstractAccountIT.java
index 6c5c70e..e15741e 100644
--- a/javatests/com/google/gerrit/acceptance/api/accounts/AbstractAccountIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/AbstractAccountIT.java
@@ -3504,4 +3504,74 @@
assertThat(result).hasSize(1);
assertThat(result.get(0)._accountId).isEqualTo(user.id().get());
}
+
+ @Test
+ @GerritConfig(name = "accounts.visibility", value = "NONE")
+ public void queryAccountsVisibilityNone() throws Exception {
+ TestAccount user2 = accountCreator.user2();
+
+ requestScopeOperations.setApiUser(user.id());
+
+ // Querying for user2 should return nothing
+ List<AccountInfo> result = gApi.accounts().query("email:" + user2.email()).get();
+ assertThat(result).isEmpty();
+
+ // Querying for self should still return self
+ result = gApi.accounts().query("email:" + user.email()).get();
+ assertThat(result).hasSize(1);
+ assertThat(result.get(0)._accountId).isEqualTo(user.id().get());
+ }
+
+ @Test
+ @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
+ public void queryAccountsAnonymousUserSameGroup() throws Exception {
+ requestScopeOperations.setApiUserAnonymous();
+
+ // Anonymous user is not in same group as user, so query should return empty list
+ List<AccountInfo> result =
+ gApi.accounts().query("email:" + user.email()).withOption(ListAccountsOption.DETAILS).get();
+ assertThat(result).isEmpty();
+
+ // Suggest should also return empty list
+ result = gApi.accounts().suggestAccounts(user.email()).get();
+ assertThat(result).isEmpty();
+ }
+
+ @Test
+ @GerritConfig(name = "accounts.visibility", value = "VISIBLE_GROUP")
+ public void queryAccountsAnonymousUserVisibleGroup() throws Exception {
+ requestScopeOperations.setApiUserAnonymous();
+
+ // Anonymous user cannot see user, so query should return empty list
+ List<AccountInfo> result =
+ gApi.accounts().query("email:" + user.email()).withOption(ListAccountsOption.DETAILS).get();
+ assertThat(result).isEmpty();
+
+ // Suggest should also return empty list
+ result = gApi.accounts().suggestAccounts(user.email()).get();
+ assertThat(result).isEmpty();
+ }
+
+ @Test
+ @GerritConfig(name = "accounts.visibility", value = "ALL")
+ public void queryAccountsAnonymousUserVisibilityAll() throws Exception {
+ requestScopeOperations.setApiUserAnonymous();
+
+ // Query with details should return details (name, email)
+ List<AccountInfo> result =
+ gApi.accounts().query("email:" + user.email()).withOption(ListAccountsOption.DETAILS).get();
+ assertThat(result).isNotEmpty();
+ for (AccountInfo info : result) {
+ assertThat(info.name).isEqualTo(user.fullName());
+ assertThat(info.email).isEqualTo(user.email());
+ }
+
+ // Suggest should return details (name, email)
+ result = gApi.accounts().suggestAccounts(user.email()).get();
+ assertThat(result).isNotEmpty();
+ for (AccountInfo info : result) {
+ assertThat(info.name).isEqualTo(user.fullName());
+ assertThat(info.email).isEqualTo(user.email());
+ }
+ }
}
diff --git a/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
index 3e82712..44f12e3 100644
--- a/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
+++ b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
@@ -37,6 +37,8 @@
import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_ACCOUNTS;
import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.extensions.client.ReviewerState.CC;
+import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
import static com.google.gerrit.extensions.common.testing.EditInfoSubject.assertThat;
import static com.google.gerrit.server.git.receive.ReceiveConstants.PUSH_OPTION_SKIP_VALIDATION;
import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
@@ -805,6 +807,30 @@
}
@Test
+ public void authorRemainsReviewerOnNewPatchSet() throws Exception {
+ PushOneCommit.Result r = pushTo("refs/for/master");
+ String changeId = r.getChangeId();
+
+ TestAccount user = accountCreator.user1();
+ gApi.changes().id(changeId).addReviewer(user.email());
+
+ PushOneCommit push =
+ pushFactory.create(user.newIdent(), testRepo, "Subject", "file.txt", "content", changeId);
+ r = push.to("refs/for/master");
+ r.assertOkStatus();
+
+ ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+ Collection<AccountInfo> reviewers = changeInfo.reviewers.get(REVIEWER);
+ assertThat(reviewers).isNotNull();
+ assertThat(reviewers.stream().anyMatch(a -> a._accountId == user.id().get())).isTrue();
+
+ Collection<AccountInfo> ccs = changeInfo.reviewers.get(CC);
+ if (ccs != null) {
+ assertThat(ccs.stream().anyMatch(a -> a._accountId == user.id().get())).isFalse();
+ }
+ }
+
+ @Test
public void pushForMasterWithReviewerByEmail() throws Exception {
ConfigInput conf = new ConfigInput();
conf.enableReviewerByEmail = InheritableBoolean.TRUE;
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/ListCachesIT.java b/javatests/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
index a987225..7f2e39e 100644
--- a/javatests/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
@@ -21,6 +21,7 @@
import com.google.common.io.BaseEncoding;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.UseLocalDisk;
import com.google.gerrit.extensions.common.CacheInfo;
import com.google.gson.reflect.TypeToken;
import java.util.Arrays;
@@ -88,4 +89,36 @@
public void listCaches_BadRequest() throws Exception {
adminRestSession.get("/config/server/caches/?format=NONSENSE").assertBadRequest();
}
+
+ @Test
+ public void listCaches_withoutIncludeDiskStats_memCacheUnaffected() throws Exception {
+ RestResponse r = adminRestSession.get("/config/server/caches/");
+ r.assertOK();
+ Map<String, CacheInfo> result =
+ newGson().fromJson(r.getReader(), new TypeToken<Map<String, CacheInfo>>() {}.getType());
+
+ assertThat(result).containsKey("accounts");
+ CacheInfo accountsCacheInfo = result.get("accounts");
+ assertThat(accountsCacheInfo.type).isEqualTo(CacheInfo.CacheType.MEM);
+ assertThat(accountsCacheInfo.entries.mem).isAtLeast(1L);
+ assertThat(accountsCacheInfo.hitRatio.mem).isAtLeast(0);
+
+ assertThat(accountsCacheInfo.entries.disk).isNull();
+ assertThat(accountsCacheInfo.hitRatio.disk).isNull();
+ }
+
+ @Test
+ @UseLocalDisk
+ public void listCaches_withIncludeDiskStats_diskCacheHasDiskStats() throws Exception {
+ RestResponse r = adminRestSession.get("/config/server/caches/?include-diskstats=true");
+ r.assertOK();
+ Map<String, CacheInfo> result =
+ newGson().fromJson(r.getReader(), new TypeToken<Map<String, CacheInfo>>() {}.getType());
+
+ assertThat(result).containsKey("accounts");
+ CacheInfo accountsInfo = result.get("accounts");
+ assertThat(accountsInfo.type).isEqualTo(CacheInfo.CacheType.DISK);
+ assertThat(accountsInfo.entries.mem).isNotNull();
+ assertThat(accountsInfo.entries.disk).isNotNull();
+ }
}
diff --git a/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java b/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java
index cf8bdda..b4228b6 100644
--- a/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java
+++ b/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java
@@ -75,7 +75,9 @@
refreshAfterWrite,
true,
true,
- new AtomicBoolean(false));
+ new AtomicBoolean(false),
+ false,
+ null);
}
@Test
diff --git a/javatests/com/google/gerrit/server/cache/serialize/BooleanCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/BooleanCacheSerializerTest.java
index ebd7d55..810cc38 100644
--- a/javatests/com/google/gerrit/server/cache/serialize/BooleanCacheSerializerTest.java
+++ b/javatests/com/google/gerrit/server/cache/serialize/BooleanCacheSerializerTest.java
@@ -23,10 +23,8 @@
public class BooleanCacheSerializerTest {
@Test
public void serialize() throws Exception {
- assertThat(BooleanCacheSerializer.INSTANCE.serialize(true))
- .isEqualTo(new byte[] {'t', 'r', 'u', 'e'});
- assertThat(BooleanCacheSerializer.INSTANCE.serialize(false))
- .isEqualTo(new byte[] {'f', 'a', 'l', 's', 'e'});
+ assertThat(BooleanCacheSerializer.INSTANCE.serialize(true)).isEqualTo("true".getBytes(UTF_8));
+ assertThat(BooleanCacheSerializer.INSTANCE.serialize(false)).isEqualTo("false".getBytes(UTF_8));
}
@Test
diff --git a/javatests/com/google/gerrit/server/cache/serialize/StringCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/StringCacheSerializerTest.java
index dc22805..06af9f1 100644
--- a/javatests/com/google/gerrit/server/cache/serialize/StringCacheSerializerTest.java
+++ b/javatests/com/google/gerrit/server/cache/serialize/StringCacheSerializerTest.java
@@ -22,13 +22,14 @@
import org.junit.Test;
public class StringCacheSerializerTest {
+ private static final byte[] ABC = {'a', 'b', 'c'};
+ private static final byte[] A_1234_C = {'a', (byte) 0xe1, (byte) 0x88, (byte) 0xb4, 'c'};
+
@Test
public void serialize() {
assertThat(StringCacheSerializer.INSTANCE.serialize("")).isEmpty();
- assertThat(StringCacheSerializer.INSTANCE.serialize("abc"))
- .isEqualTo(new byte[] {'a', 'b', 'c'});
- assertThat(StringCacheSerializer.INSTANCE.serialize("a\u1234c"))
- .isEqualTo(new byte[] {'a', (byte) 0xe1, (byte) 0x88, (byte) 0xb4, 'c'});
+ assertThat(StringCacheSerializer.INSTANCE.serialize("abc")).isEqualTo(ABC);
+ assertThat(StringCacheSerializer.INSTANCE.serialize("a\u1234c")).isEqualTo(A_1234_C);
}
@Test
@@ -44,12 +45,8 @@
@Test
public void deserialize() {
assertThat(StringCacheSerializer.INSTANCE.deserialize(new byte[0])).isEmpty();
- assertThat(StringCacheSerializer.INSTANCE.deserialize(new byte[] {'a', 'b', 'c'}))
- .isEqualTo("abc");
- assertThat(
- StringCacheSerializer.INSTANCE.deserialize(
- new byte[] {'a', (byte) 0xe1, (byte) 0x88, (byte) 0xb4, 'c'}))
- .isEqualTo("a\u1234c");
+ assertThat(StringCacheSerializer.INSTANCE.deserialize(ABC)).isEqualTo("abc");
+ assertThat(StringCacheSerializer.INSTANCE.deserialize(A_1234_C)).isEqualTo("a\u1234c");
}
@Test
diff --git a/javatests/com/google/gerrit/server/patch/DiffOperationsTest.java b/javatests/com/google/gerrit/server/patch/DiffOperationsTest.java
index 7c8555e..1234262 100644
--- a/javatests/com/google/gerrit/server/patch/DiffOperationsTest.java
+++ b/javatests/com/google/gerrit/server/patch/DiffOperationsTest.java
@@ -20,6 +20,7 @@
import com.google.common.collect.ImmutableList;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.Patch.ChangeType;
+import com.google.gerrit.entities.Patch.PatchType;
import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.server.git.GitRepositoryManager;
@@ -423,6 +424,66 @@
}
}
+ @Test
+ public void gitattributesDiffOverride() throws Exception {
+ String jsonFile = "file_2.json";
+ // 1. First, let's create a commit where the file is modified but there is no .gitattributes.
+ // It should be diffed as UNIFIED.
+ ObjectId oldCommitId1 =
+ createCommit(repo, null, ImmutableList.of(new FileEntity(jsonFile, "{}")));
+ ObjectId newCommitId1 =
+ createCommit(
+ repo, oldCommitId1, ImmutableList.of(new FileEntity(jsonFile, "{\"foo\": \"bar\"}")));
+ FileDiffOutput diffOutput1 =
+ diffOperations.getModifiedFileAgainstParent(
+ testProjectName, newCommitId1, 0, jsonFile, null);
+ assertThat(diffOutput1.patchType()).hasValue(PatchType.UNIFIED);
+ assertThat(diffOutput1.edits()).isNotEmpty();
+
+ // 2. Now let's create a commit where .gitattributes specifies "-diff" for the file.
+ // It should be treated as BINARY.
+ ObjectId oldCommitId2 =
+ createCommit(
+ repo,
+ null,
+ ImmutableList.of(
+ new FileEntity(".gitattributes", jsonFile + " -diff"),
+ new FileEntity(jsonFile, "{}")));
+ ObjectId newCommitId2 =
+ createCommit(
+ repo,
+ oldCommitId2,
+ ImmutableList.of(
+ new FileEntity(".gitattributes", jsonFile + " -diff"),
+ new FileEntity(jsonFile, "{\"foo\": \"bar\"}")));
+ FileDiffOutput diffOutput2 =
+ diffOperations.getModifiedFileAgainstParent(
+ testProjectName, newCommitId2, 0, jsonFile, null);
+ assertThat(diffOutput2.patchType()).hasValue(PatchType.BINARY);
+ assertThat(diffOutput2.edits()).isEmpty();
+
+ // 3. Let's also test with "binary" macro attribute.
+ ObjectId oldCommitId3 =
+ createCommit(
+ repo,
+ null,
+ ImmutableList.of(
+ new FileEntity(".gitattributes", jsonFile + " binary"),
+ new FileEntity(jsonFile, "{}")));
+ ObjectId newCommitId3 =
+ createCommit(
+ repo,
+ oldCommitId3,
+ ImmutableList.of(
+ new FileEntity(".gitattributes", jsonFile + " binary"),
+ new FileEntity(jsonFile, "{\"foo\": \"bar\"}")));
+ FileDiffOutput diffOutput3 =
+ diffOperations.getModifiedFileAgainstParent(
+ testProjectName, newCommitId3, 0, jsonFile, null);
+ assertThat(diffOutput3.patchType()).hasValue(PatchType.BINARY);
+ assertThat(diffOutput3.edits()).isEmpty();
+ }
+
static class FileEntity {
String name;
String content;
diff --git a/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
index 0f09496..8d1e3dd 100644
--- a/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
+++ b/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
@@ -2871,6 +2871,23 @@
}
@Test
+ public void byHasHashtag() throws Exception {
+ assume().that(getSchema().hasField(ChangeField.PREFIX_HASHTAG)).isTrue();
+
+ Project.NameKey project = Project.nameKey("repo");
+ repo = createAndOpenProject(project);
+ Change change1 = insert(project, newChange(repo));
+ Change change2 = insert(project, newChange(repo));
+ Change change3 = insert(project, newChange(repo));
+
+ addHashtags(change1, "foo");
+ addHashtags(change2, "foo", "bar");
+
+ assertQuery("has:hashtag", change2, change1);
+ assertQuery("-has:hashtag", change3);
+ }
+
+ @Test
public void byHashtagFullText() throws Exception {
assume().that(getSchema().hasField(ChangeField.FUZZY_HASHTAG)).isTrue();
ImmutableList<Change> changes = setUpHashtagChanges();
diff --git a/javatests/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStoreIT.java b/javatests/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStoreIT.java
new file mode 100644
index 0000000..bac1b31
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStoreIT.java
@@ -0,0 +1,125 @@
+// Copyright (C) 2026 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.entities.Account;
+import com.google.gerrit.entities.Change;
+import com.google.gerrit.entities.PatchSet;
+import com.google.gerrit.server.config.SitePaths;
+import java.nio.file.Files;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.stream.IntStream;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class H2JGitLockAccountPatchReviewStoreIT {
+ @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
+ private H2JGitLockAccountPatchReviewStore store;
+ private static final Account.Id ACCOUNT = Account.id(1);
+ private static final PatchSet.Id PS = PatchSet.id(Change.id(1), 1);
+ private static final String FILE = "foo/bar.txt";
+
+ @Before
+ public void setUp() throws Exception {
+ SitePaths sitePaths = new SitePaths(temporaryFolder.getRoot().toPath());
+ Files.createDirectories(sitePaths.db_dir);
+ Config cfg = new Config();
+ store = new H2JGitLockAccountPatchReviewStore(cfg, sitePaths);
+ store.start();
+ }
+
+ @Test
+ public void markAndFindReviewed() {
+ assertThat(store.findReviewed(PS, ACCOUNT)).isEmpty();
+
+ var unused = store.markReviewed(PS, ACCOUNT, FILE);
+
+ assertThat(store.findReviewed(PS, ACCOUNT)).isPresent();
+ assertThat(store.findReviewed(PS, ACCOUNT).get().files()).containsExactly(FILE);
+ }
+
+ @Test
+ public void clearReviewedFile() {
+ var unused = store.markReviewed(PS, ACCOUNT, FILE);
+ assertThat(store.findReviewed(PS, ACCOUNT)).isPresent();
+
+ store.clearReviewed(PS, ACCOUNT, FILE);
+
+ assertThat(store.findReviewed(PS, ACCOUNT)).isEmpty();
+ }
+
+ @Test
+ public void clearReviewedPatchSet() {
+ var unused = store.markReviewed(PS, ACCOUNT, FILE);
+ assertThat(store.findReviewed(PS, ACCOUNT)).isPresent();
+ assertThat(store.findReviewed(PS, ACCOUNT).get().files()).containsExactly(FILE);
+
+ store.clearReviewed(PS);
+
+ assertThat(store.findReviewed(PS, ACCOUNT)).isEmpty();
+ }
+
+ @Test
+ public void concurrentMarksAreAllDurable() throws Exception {
+ int nThreads = 8;
+ int filesPerThread = 5;
+ CyclicBarrier startGate = new CyclicBarrier(nThreads);
+
+ try (ExecutorService executor = Executors.newFixedThreadPool(nThreads)) {
+ ImmutableList<Future<?>> futures =
+ IntStream.range(0, nThreads)
+ .mapToObj(
+ threadIdx ->
+ executor.submit(
+ () -> {
+ startGate.await();
+ for (int f = 0; f < filesPerThread; f++) {
+ var unused = store.markReviewed(PS, ACCOUNT, fileName(threadIdx, f));
+ }
+ return null;
+ }))
+ .collect(ImmutableList.toImmutableList());
+
+ for (Future<?> future : futures) {
+ future.get();
+ }
+ }
+
+ ImmutableSet<String> expected =
+ IntStream.range(0, nThreads)
+ .boxed()
+ .flatMap(
+ threadIdx ->
+ IntStream.range(0, filesPerThread).mapToObj(f -> fileName(threadIdx, f)))
+ .collect(ImmutableSet.toImmutableSet());
+
+ assertThat(store.findReviewed(PS, ACCOUNT)).isPresent();
+ assertThat(store.findReviewed(PS, ACCOUNT).get().files()).isEqualTo(expected);
+ }
+
+ private static String fileName(int threadIdx, int fileIdx) {
+ return "file-" + threadIdx + "-" + fileIdx + ".txt";
+ }
+}
diff --git a/javatests/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStoreTest.java b/javatests/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStoreTest.java
new file mode 100644
index 0000000..c15d1c8
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/H2JGitLockAccountPatchReviewStoreTest.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2026 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.schema.H2JGitLockAccountPatchReviewStore.lockTargetFromUrl;
+import static com.google.gerrit.testing.GerritJUnit.assertThrows;
+
+import java.io.File;
+import org.junit.Test;
+
+public class H2JGitLockAccountPatchReviewStoreTest {
+ @Test
+ public void lockTargetFromUrl_plainPath() {
+ assertThat(lockTargetFromUrl("jdbc:h2:file:/path/to/db")).isEqualTo(new File("/path/to/db"));
+ }
+
+ @Test
+ public void lockTargetFromUrl_stripsOptions() {
+ assertThat(lockTargetFromUrl("jdbc:h2:file:/path/to/db;FILE_LOCK=NO;DB_CLOSE_DELAY=0"))
+ .isEqualTo(new File("/path/to/db"));
+ }
+
+ @Test
+ public void lockTargetFromUrl_unescapesSemicolonInPath() {
+ assertThat(lockTargetFromUrl("jdbc:h2:file:/path/with\\;semi/db;FILE_LOCK=NO"))
+ .isEqualTo(new File("/path/with;semi/db"));
+ }
+
+ @Test
+ public void lockTargetFromUrl_throwsOnInvalidUrls() {
+ assertThrows(
+ IllegalArgumentException.class, () -> lockTargetFromUrl("jdbc:h2:mem:/path/to/db"));
+ }
+}
diff --git a/modules/jgit b/modules/jgit
index d29c264..bf0f0ad 160000
--- a/modules/jgit
+++ b/modules/jgit
@@ -1 +1 @@
-Subproject commit d29c264b2983782418b4c8357a6422750edfa15c
+Subproject commit bf0f0ad1cc2ce422604383272a4a4b8b3947b465
diff --git a/package.json b/package.json
index 97acc45..75a1a9f 100644
--- a/package.json
+++ b/package.json
@@ -66,11 +66,11 @@
"test:single:coverage": "yarn --cwd=polygerrit-ui test:single:coverage",
"safe_bazelisk": "if which bazelisk >/dev/null; then bazel_bin=bazelisk; else bazel_bin=bazel; fi && $bazel_bin",
"eslint": "npm run safe_bazelisk test polygerrit-ui/app:lint_test",
- "eslintfix": "npm run safe_bazelisk run polygerrit-ui/app:lint_bin -- -- --fix $(pwd)/polygerrit-ui/app",
- "eslintfix:modified": "git diff --name-only --diff-filter=d | grep -E 'polygerrit-ui/app/.*\\.(js|ts)$' | sed 's|^polygerrit-ui/app/||' | xargs -r npm run safe_bazelisk run polygerrit-ui/app:lint_bin -- -- --fix",
+ "eslintfix": "eslint -c polygerrit-ui/app/eslint-bazel.config.js polygerrit-ui/app --fix --cache",
+ "eslintfix:modified": "git diff --name-only --diff-filter=d | grep -E 'polygerrit-ui/app/.*\\.(js|ts)$' | xargs -r eslint -c polygerrit-ui/app/eslint-bazel.config.js --fix",
"litlint": "npm run safe_bazelisk run polygerrit-ui/app:lit_analysis",
"litlintforCI": "lit-analyzer --strict --rules.no-unknown-property off --rules.no-unknown-tag-name off --rules.no-incompatible-type-binding off --rules.no-incompatible-property-type off --rules.no-invalid-tag-name off --rules.no-property-visibility-mismatch off --rules.no-unknown-attribute off **/elements/**/*.ts",
- "lint": "eslint -c polygerrit-ui/app/eslint-bazel.config.js polygerrit-ui/app",
+ "lint": "eslint -c polygerrit-ui/app/eslint-bazel.config.js polygerrit-ui/app --cache",
"gjf": "./tools/gjf.sh run"
},
"repository": {
diff --git a/plugins/replication b/plugins/replication
index 4296f73..c89dc44 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit 4296f7364429ffe5e537756199cd14daab2d3353
+Subproject commit c89dc44d4bddfc7d2d34051c7d5aebf7755c6f2e
diff --git a/polygerrit-ui/app/api/BUILD_for_publishing_api_only b/polygerrit-ui/app/api/BUILD_for_publishing_api_only
index a917916..b54e157 100644
--- a/polygerrit-ui/app/api/BUILD_for_publishing_api_only
+++ b/polygerrit-ui/app/api/BUILD_for_publishing_api_only
@@ -50,6 +50,5 @@
],
) + [
":js_plugin_api_compiled",
- "//plugins:tsconfig-plugins-base.json",
],
)
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts
index 5f274bc..b35a0ab 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts
@@ -1213,6 +1213,15 @@
continue;
}
const status = this.getLabelStatus(labelInfo);
+ if (status === LabelStatus.REJECT || status === LabelStatus.IMPOSSIBLE) {
+ return null;
+ }
+ if (
+ label === StandardLabels.PRESUBMIT_VERIFIED ||
+ label.toLowerCase().startsWith('presubmit')
+ ) {
+ continue;
+ }
if (status === LabelStatus.NEED) {
if (result) {
// More than one label is missing, so check if Code Review can be
@@ -1221,11 +1230,6 @@
break;
}
result = label;
- } else if (
- status === LabelStatus.REJECT ||
- status === LabelStatus.IMPOSSIBLE
- ) {
- return null;
}
}
// Allow the user to use quick approve to vote the max score on code review
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
index c571675..a8a31c6 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
@@ -2561,6 +2561,57 @@
);
assert.isNotOk(approveButton);
});
+
+ test('ignore presubmit labels for quick approve', async () => {
+ element.change = {
+ ...createChangeViewChange(),
+ current_revision: 'abc1234' as CommitId,
+ labels: {
+ 'Code-Review': {
+ approved: createAccountWithId(1),
+ all: [{value: 2}],
+ },
+ 'Presubmit-Verified': {
+ values: {'-1': '', ' 0': '', '+1': ''},
+ },
+ },
+ permitted_labels: {
+ 'Presubmit-Verified': ['-1', ' 0', '+1'],
+ },
+ };
+ await element.updateComplete;
+ const approveButton = query(
+ element,
+ "gr-button[data-action-key='review']"
+ );
+ assert.isNotOk(approveButton);
+ });
+
+ test('rejected presubmit label blocks quick approve', async () => {
+ element.change = {
+ ...createChangeViewChange(),
+ current_revision: 'abc1234' as CommitId,
+ labels: {
+ 'Code-Review': {
+ values: {'-2': '', '-1': '', ' 0': '', '+1': '', '+2': ''},
+ },
+ 'Presubmit-Verified': {
+ rejected: createAccountWithId(2),
+ values: {'-1': '', ' 0': '', '+1': ''},
+ },
+ },
+ permitted_labels: {
+ 'Code-Review': ['-2', '-1', ' 0', '+1', '+2'],
+ 'Presubmit-Verified': ['-1', ' 0', '+1'],
+ },
+ };
+ await element.updateComplete;
+ const approveButton = query(
+ element,
+ "gr-button[data-action-key='review']"
+ );
+ assert.isNotOk(approveButton);
+ });
});
test('adds download revision action', async () => {
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
index 4439344..d9de5f4e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
@@ -579,6 +579,7 @@
.statusOrCategory=${statusOrCategory}
.text=${text}
.links=${links}
+ .isAi=${!!run.isAiPowered}
@click=${handler}
@keydown=${(e: KeyboardEvent) => handleSpaceOrEnter(e, handler)}
></gr-checks-chip>`;
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_screenshot_test.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_screenshot_test.ts
index 1559a1c..045186e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_screenshot_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_screenshot_test.ts
@@ -52,11 +52,13 @@
createRun({
status: RunStatus.COMPLETED,
checkName: 'info-check',
+ isAiPowered: true,
results: [createCheckResult({category: Category.INFO})],
}),
createRun({
status: RunStatus.COMPLETED,
checkName: 'warning-check',
+ isAiPowered: true,
results: [createCheckResult({category: Category.WARNING})],
}),
createRun({
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_test.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_test.ts
index 5a1e855..9744398 100644
--- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_test.ts
@@ -264,6 +264,92 @@
});
});
+ suite('ai chips', () => {
+ test('detailed chip has isAi set based on run.isAiPowered', async () => {
+ element.runs = [
+ createRun({
+ checkName: 'AI Check',
+ status: RunStatus.COMPLETED,
+ isAiPowered: true,
+ results: [createCheckResult({category: Category.ERROR})],
+ }),
+ createRun({
+ checkName: 'Normal Check',
+ status: RunStatus.COMPLETED,
+ isAiPowered: false,
+ results: [createCheckResult({category: Category.ERROR})],
+ }),
+ ];
+ element.showChecksSummary = true;
+ await element.updateComplete;
+
+ const chips = queryAll<GrChecksChip>(element, 'gr-checks-chip');
+ assert.equal(chips.length, 2);
+ assert.isTrue(chips[0].isAi);
+ assert.equal(chips[0].text, 'AI Check');
+ assert.isFalse(chips[1].isAi);
+ assert.equal(chips[1].text, 'Normal Check');
+ });
+
+ test('collapsed chip does not have isAi=true even if run is AI powered', async () => {
+ element.runs = [
+ createRun({
+ status: RunStatus.COMPLETED,
+ isAiPowered: true,
+ results: [createCheckResult({category: Category.SUCCESS})],
+ }),
+ createRun({
+ status: RunStatus.COMPLETED,
+ isAiPowered: false,
+ results: [createCheckResult({category: Category.SUCCESS})],
+ }),
+ createRun({status: RunStatus.RUNNING}),
+ ];
+ element.showChecksSummary = true;
+ await element.updateComplete;
+
+ const chips = queryAll<GrChecksChip>(element, 'gr-checks-chip');
+ const successChip = [...chips].find(
+ c => c.statusOrCategory === Category.SUCCESS
+ );
+ assert.isDefined(successChip);
+ assert.isFalse(successChip.isAi);
+ assert.equal(successChip.text, '2');
+ });
+
+ test('plus-more chip does not have isAi=true even if overflow run is AI powered', async () => {
+ const runs: CheckRun[] = [];
+ for (let i = 0; i < 8; i++) {
+ runs.push(
+ createRun({
+ checkName: `Error ${i}`,
+ status: RunStatus.COMPLETED,
+ isAiPowered: false,
+ results: [createCheckResult({category: Category.ERROR})],
+ })
+ );
+ }
+ runs.push(
+ createRun({
+ checkName: 'Error AI',
+ status: RunStatus.COMPLETED,
+ isAiPowered: true,
+ results: [createCheckResult({category: Category.ERROR})],
+ })
+ );
+
+ element.runs = runs;
+ element.showChecksSummary = true;
+ await element.updateComplete;
+
+ const chips = queryAll<GrChecksChip>(element, 'gr-checks-chip');
+ assert.equal(chips.length, 8);
+ const plusMoreChip = chips[7];
+ assert.equal(plusMoreChip.text, '+ 2 more');
+ assert.isFalse(plusMoreChip.isAi);
+ });
+ });
+
suite('flows summary', () => {
test('renders', async () => {
flowsModel.setState({
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-checks-chip.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-checks-chip.ts
index 1875fa5..eedf452 100644
--- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-checks-chip.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-checks-chip.ts
@@ -28,6 +28,9 @@
@property({type: Array})
links: string[] = [];
+ @property({type: Boolean})
+ isAi = false;
+
private readonly reporting = getAppContext().reportingService;
static override get styles() {
@@ -79,6 +82,10 @@
}
gr-icon {
font-size: var(--line-height-small);
+ --gr-icon-size: var(--line-height-small);
+ }
+ gr-icon.ai-sparkle {
+ margin-left: var(--spacing-xs);
}
.checksChip a gr-icon.launch {
color: var(--link-color);
@@ -172,9 +179,14 @@
// 15 is roughly the number of chars for the chip exceeding its 120px width.
return html`
${this.text.length > 15
- ? html` ${this.renderChip(chipClassFullLength, ariaLabel, icon)}`
+ ? html` ${this.renderChip(
+ chipClassFullLength,
+ ariaLabel,
+ icon,
+ this.isAi
+ )}`
: ''}
- ${this.renderChip(chipClass, ariaLabel, icon)}
+ ${this.renderChip(chipClass, ariaLabel, icon, this.isAi)}
`;
}
@@ -191,12 +203,18 @@
return `${label} for check ${this.text}`;
}
- private renderChip(clazz: string, ariaLabel: string, icon: ChecksIcon) {
+ private renderChip(
+ clazz: string,
+ ariaLabel: string,
+ icon: ChecksIcon,
+ isAi: boolean
+ ) {
return html`
<div class=${clazz} role="link" tabindex="0" aria-label=${ariaLabel}>
<gr-icon icon=${icon.name} ?filled=${!!icon.filled}></gr-icon>
${this.renderLinks()}
<div class="text">${this.text}</div>
+ ${isAi ? html`<gr-icon icon="ai" class="ai-sparkle"></gr-icon>` : ''}
</div>
`;
}
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-checks-chip_test.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-checks-chip_test.ts
index 6816609..c020980 100644
--- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-checks-chip_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-checks-chip_test.ts
@@ -85,4 +85,26 @@
`
);
});
+
+ test('renders AI icon', async () => {
+ element.text = 'AI Check';
+ element.statusOrCategory = Category.ERROR;
+ element.isAi = true;
+ await element.updateComplete;
+ assert.shadowDom.equal(
+ element,
+ /* HTML */ `
+ <div
+ aria-label="error for check AI Check"
+ class="checksChip error font-small"
+ role="link"
+ tabindex="0"
+ >
+ <gr-icon icon="error" filled></gr-icon>
+ <div class="text">AI Check</div>
+ <gr-icon icon="ai" class="ai-sparkle"></gr-icon>
+ </div>
+ `
+ );
+ });
});
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.ts b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.ts
index 95df2fac..f808b1c 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.ts
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.ts
@@ -168,6 +168,7 @@
.commands=${this.computeDownloadCommands()}
.schemes=${this.schemes}
.selectedScheme=${this.selectedScheme}
+ .disableAutoSelect=${true}
show-keyboard-shortcut-tooltips
@selected-scheme-changed=${(e: BindValueChangeEvent) => {
this.selectedScheme = e.detail.value;
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.ts b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.ts
index c107c20..438e151 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.ts
@@ -122,6 +122,7 @@
</section>
<section class="hidden">
<gr-download-commands
+ disable-auto-select=""
id="downloadCommands"
show-keyboard-shortcut-tooltips=""
>
@@ -234,6 +235,14 @@
await element.updateComplete;
});
+ test('passes disableAutoSelect to gr-download-commands', () => {
+ const commands = queryAndAssert<GrDownloadCommands>(
+ element,
+ '#downloadCommands'
+ );
+ assert.isTrue(commands.disableAutoSelect);
+ });
+
test('focuses on first copy link', async () => {
const focusStub = sinon.stub(
queryAndAssert<GrDownloadCommands>(element, '#downloadCommands'),
diff --git a/polygerrit-ui/app/elements/chat-panel/prompt-box.ts b/polygerrit-ui/app/elements/chat-panel/prompt-box.ts
index b1325fb..5c8cbfc 100644
--- a/polygerrit-ui/app/elements/chat-panel/prompt-box.ts
+++ b/polygerrit-ui/app/elements/chat-panel/prompt-box.ts
@@ -50,7 +50,7 @@
@property({type: String})
disabledMessage = 'Review Agent is disabled.';
- @state() hasModelLoadingError = false;
+ @state() modelLoadingError?: string;
@state() selectedModel?: ModelInfo;
@@ -98,7 +98,7 @@
subscribe(
this,
() => this.getChatModel().modelsLoadingError$,
- x => (this.hasModelLoadingError = !!x)
+ x => (this.modelLoadingError = x)
);
subscribe(
this,
@@ -161,9 +161,18 @@
return this.turns[this.turns.length - 1];
}
+ private get hasModelLoadingError(): boolean {
+ return this.modelLoadingError !== undefined;
+ }
+
get chatInputDisabledText() {
if (this.hasModelLoadingError) {
- return 'Failed to load models. Please reload the page.';
+ // getModels() rejected: show the provider's reason, or a generic
+ // message if it rejected without one.
+ return (
+ this.modelLoadingError ||
+ 'Failed to load models. Please reload the page.'
+ );
}
if (!this.selectedModel) {
return 'Loading models...';
diff --git a/polygerrit-ui/app/elements/chat-panel/prompt-box_test.ts b/polygerrit-ui/app/elements/chat-panel/prompt-box_test.ts
index 63ffb13..ccc92c8 100644
--- a/polygerrit-ui/app/elements/chat-panel/prompt-box_test.ts
+++ b/polygerrit-ui/app/elements/chat-panel/prompt-box_test.ts
@@ -80,10 +80,25 @@
);
});
- test('chatInputDisabledText when model loading error', async () => {
+ test('chatInputDisabledText surfaces provider error', async () => {
+ const providerError =
+ 'No AI provider is configured. Add an API token for a provider.';
chatModel.updateState({
...chatModel.getState(),
- modelsLoadingError: 'Error loading models',
+ // getModels() clears the models when it rejects, so no model is selected.
+ models: undefined,
+ modelsLoadingError: providerError,
+ });
+ await element.updateComplete;
+ assert.equal(element.chatInputDisabledText, providerError);
+ });
+
+ test('chatInputDisabledText fallback without provider message', async () => {
+ chatModel.updateState({
+ ...chatModel.getState(),
+ // getModels() rejected without a message (empty string).
+ models: undefined,
+ modelsLoadingError: '',
});
await element.updateComplete;
assert.equal(
@@ -92,6 +107,17 @@
);
});
+ test('chatInputDisabledText loading while models pending', async () => {
+ chatModel.updateState({
+ ...chatModel.getState(),
+ // No models yet and no error: getModels() is still in flight.
+ models: undefined,
+ modelsLoadingError: undefined,
+ });
+ await element.updateComplete;
+ assert.equal(element.chatInputDisabledText, 'Loading models...');
+ });
+
test('updates userInput on input', async () => {
const promptInput = element.shadowRoot?.querySelector('#promptInput');
assert.isOk(promptInput);
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-chip-for-label.ts b/polygerrit-ui/app/elements/checks/gr-checks-chip-for-label.ts
index ddf37ab..74af4d8 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-chip-for-label.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-chip-for-label.ts
@@ -75,10 +75,12 @@
if (runs.length === 1 && runs[0].statusLink) {
links.push(runs[0].statusLink);
}
+ const isAi = runs.some(run => run.isAiPowered);
return html`<gr-checks-chip
.text=${`${runsCount}`}
.links=${links}
.statusOrCategory=${category}
+ .isAi=${isAi}
@click=${() => {
fireShowTab(this, Tab.CHECKS, false, {
checksTab: {
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-chip-for-label_test.ts b/polygerrit-ui/app/elements/checks/gr-checks-chip-for-label_test.ts
index cac448a..641f2f8 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-chip-for-label_test.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-chip-for-label_test.ts
@@ -58,4 +58,22 @@
</div>`
);
});
+
+ test('sets isAi to true when check run is AI powered', async () => {
+ element.runs = [
+ createRun({
+ labelName: 'Verified',
+ isAiPowered: true,
+ results: [
+ createCheckResult({
+ category: Category.ERROR,
+ }),
+ ],
+ }),
+ ];
+ await element.updateComplete;
+
+ const checksChip = queryAndAssert<GrChecksChip>(element, 'gr-checks-chip');
+ assert.isTrue(checksChip.isAi);
+ });
});
diff --git a/polygerrit-ui/app/elements/core/gr-search-autocomplete/gr-search-autocomplete.ts b/polygerrit-ui/app/elements/core/gr-search-autocomplete/gr-search-autocomplete.ts
index 852e549..8b9676e 100644
--- a/polygerrit-ui/app/elements/core/gr-search-autocomplete/gr-search-autocomplete.ts
+++ b/polygerrit-ui/app/elements/core/gr-search-autocomplete/gr-search-autocomplete.ts
@@ -61,6 +61,7 @@
'has:attention',
'has:draft',
'has:edit',
+ 'has:hashtag',
'has:star',
'has:unresolved',
'hasfooter:',
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
index bfdde07..a9284c5 100644
--- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
+++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
@@ -29,7 +29,11 @@
import {subscribe} from '../../lit/subscription-controller';
import {assert} from '../../../utils/common-util';
import {resolve} from '../../../models/dependency';
-import {createChangeUrl} from '../../../models/views/change';
+import {
+ changeViewModelToken,
+ createApplyFixUrl,
+} from '../../../models/views/change';
+
import {GrDialog} from '../../shared/gr-dialog/gr-dialog';
import {userModelToken} from '../../../models/user/user-model';
import {modalStyles} from '../../../styles/gr-modal-styles';
@@ -114,6 +118,8 @@
private readonly getNavigation = resolve(this, navigationToken);
+ private readonly getViewModel = resolve(this, changeViewModelToken);
+
private readonly reporting = getAppContext().reportingService;
private readonly syntaxLayer = new GrSyntaxLayerWorker(
@@ -481,16 +487,22 @@
});
}
if (res?.ok) {
+ const currentChildView = this.getViewModel().getState()?.childView;
+ const filePath =
+ fixSuggestion.replacements[0]?.path ??
+ this.currentPreviews[0]?.filepath;
this.getNavigation().setUrl(
- createChangeUrl({
+ createApplyFixUrl({
change,
- patchNum: EDIT,
basePatchNum: patchNum as BasePatchSetNum,
forceReload: !this.hasEdit,
+ filePath,
+ currentChildView,
})
);
this.close(true);
}
+
this.isApplyFixLoading = false;
}
}
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts
index 1d35430..21ce8ed 100644
--- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts
+++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.ts
@@ -14,12 +14,15 @@
import {GrApplyFixDialog} from './gr-apply-fix-dialog';
import {PatchSetNum, PatchSetNumber} from '../../../types/common';
import {
+ createChangeViewState,
+ createDiffViewState,
createFixSuggestionInfo,
createParsedChange,
createRange,
createRevisions,
getCurrentRevision,
} from '../../../test/test-data-generators';
+import {changeViewModelToken} from '../../../models/views/change';
import {createDefaultDiffPrefs} from '../../../constants/constants';
import {OpenFixPreviewEventDetail} from '../../../types/events';
import {GrButton} from '../../shared/gr-button/gr-button';
@@ -227,4 +230,70 @@
'/c/test-project/+/42/2..edit?forceReload=true'
);
});
+
+ suite('handleApplyFix navigation', () => {
+ setup(() => {
+ stubRestApi('applyFixSuggestion').returns(
+ Promise.resolve(new Response(null, {status: 200}))
+ );
+ });
+
+ test('navigates to createDiffUrl when in Diff View', async () => {
+ testResolver(changeViewModelToken).setState(createDiffViewState());
+ const fixDetail: OpenFixPreviewEventDetail = {
+ patchNum: 2 as PatchSetNum,
+ fixSuggestions: [
+ {
+ ...createFixSuggestionInfo('fix_1'),
+ replacements: [
+ {
+ path: 'file1.txt',
+ replacement: 'new content',
+ range: createRange(),
+ },
+ ],
+ },
+ ],
+ onCloseFixPreviewCallbacks: [],
+ };
+ await open(fixDetail);
+
+ await element.handleApplyFix(new CustomEvent('confirm'));
+
+ assert.isTrue(setUrlStub.calledOnce);
+ assert.equal(
+ setUrlStub.lastCall.firstArg,
+ '/c/test-project/+/42/2..edit/file1.txt?forceReload=true'
+ );
+ });
+
+ test('navigates to createChangeUrl when in Change View', async () => {
+ testResolver(changeViewModelToken).setState(createChangeViewState());
+ const fixDetail: OpenFixPreviewEventDetail = {
+ patchNum: 2 as PatchSetNum,
+ fixSuggestions: [
+ {
+ ...createFixSuggestionInfo('fix_1'),
+ replacements: [
+ {
+ path: 'file1.txt',
+ replacement: 'new content',
+ range: createRange(),
+ },
+ ],
+ },
+ ],
+ onCloseFixPreviewCallbacks: [],
+ };
+ await open(fixDetail);
+
+ await element.handleApplyFix(new CustomEvent('confirm'));
+
+ assert.isTrue(setUrlStub.calledOnce);
+ assert.equal(
+ setUrlStub.lastCall.firstArg,
+ '/c/test-project/+/42/2..edit?forceReload=true'
+ );
+ });
+ });
});
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
index 93bf666..adfc532 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
@@ -19,6 +19,8 @@
import '../gr-diff-preferences-dialog/gr-diff-preferences-dialog';
import '../gr-patch-range-select/gr-patch-range-select';
import '../../change/gr-download-dialog/gr-download-dialog';
+import '../../shared/gr-content-with-sidebar/gr-content-with-sidebar';
+import {pluginLoaderToken} from '../../shared/gr-js-api-interface/gr-plugin-loader';
import {getAppContext} from '../../../services/app-context';
import {getParentIndex, isMergeParent} from '../../../utils/patch-set-util';
import {
@@ -88,7 +90,7 @@
import {ifDefined} from 'lit/directives/if-defined.js';
import {classMap} from 'lit/directives/class-map.js';
import {when} from 'lit/directives/when.js';
-import {styleMap} from 'lit/directives/style-map.js';
+import {keyed} from 'lit/directives/keyed.js';
import {
ChangeChildView,
changeViewModelToken,
@@ -127,6 +129,8 @@
@customElement('gr-diff-view')
export class GrDiffView extends LitElement {
+ private readonly getPluginLoader = resolve(this, pluginLoaderToken);
+
/**
* Fired when user tries to navigate away while comments are pending save.
*
@@ -153,11 +157,6 @@
@query('#diffPreferencesDialog')
diffPreferencesDialog?: GrDiffPreferencesDialog;
- @query('.sidebarAnchor')
- sidebarAnchor?: HTMLDivElement;
-
- @state() private sidebarHeight = 0;
-
// Private but used in tests.
@state()
get patchRange(): PatchRange | undefined {
@@ -203,7 +202,8 @@
@state() file?: NormalizedFileInfo;
- @state() private shownSidebar?: string;
+ // Private but used in tests.
+ @state() shownSidebar?: string;
/** Allows us to react when the user switches to the DIFF view. */
// Private but used in tests.
@@ -526,7 +526,9 @@
:host {
display: block;
background-color: var(--view-background-color);
- --sidebar-width: 300px;
+ --sidebar-top: calc(
+ var(--main-header-height) + var(--diff-header-height, 80px)
+ );
}
.hidden {
display: none;
@@ -702,24 +704,14 @@
:host(.hideCheckCodePointers) {
--gr-check-code-pointers-display: none;
}
- .diffContainer.sidebarOpen {
- margin-left: var(--sidebar-width);
- }
.sidebarTriggerContainer {
display: inline-block;
margin-right: var(--spacing-m);
}
- .sidebarAnchor {
- height: 0;
- width: 0;
- overflow: visible;
- }
.sidebarContents {
background: var(--background-color-secondary);
- width: var(--sidebar-width);
- border: var(--spacing-xxs) solid var(--border-color);
- border-left: 0;
- overflow: auto;
+ box-sizing: border-box;
+ height: 100%;
}
md-checkbox {
--md-checkbox-container-size: 15px;
@@ -749,8 +741,6 @@
this.addEventListener('open-fix-preview', e => this.onOpenFixPreview(e));
this.cursor = new GrDiffCursor();
if (this.diffHost) this.reInitCursor();
- window.addEventListener('scroll', this.updateSidebarHeight);
- window.addEventListener('resize', this.updateSidebarHeight);
this.getUserModel()
.preferences$.pipe(
map(p => p.diff_page_sidebar),
@@ -768,8 +758,6 @@
override disconnectedCallback() {
this.cursor?.dispose();
- window.removeEventListener('scroll', this.updateSidebarHeight);
- window.removeEventListener('resize', this.updateSidebarHeight);
super.disconnectedCallback();
}
@@ -779,13 +767,6 @@
this.cursor?.reInitCursor();
}
- private readonly updateSidebarHeight = () => {
- if (this.sidebarAnchor) {
- this.sidebarHeight =
- window.innerHeight - this.sidebarAnchor.getBoundingClientRect().bottom;
- }
- };
-
protected override updated(changedProperties: PropertyValues): void {
super.updated(changedProperties);
if (
@@ -844,7 +825,6 @@
this.patchRange
);
}
- this.updateSidebarHeight();
}
override render() {
@@ -868,34 +848,41 @@
</div>
`
)}
- <div
- class=${classMap({
- diffContainer: true,
- sidebarOpen: !!this.shownSidebar,
- hidden: !!this.file?.diffs_too_expensive_to_compute,
- })}
+ <gr-content-with-sidebar
+ .side=${this.getSidebarSide()}
+ .hideSide=${!this.shownSidebar}
>
- <gr-endpoint-decorator name="diff-content">
- <gr-diff-host
- id="diffHost"
- .changeNum=${this.changeNum}
- .change=${this.change}
- .patchRange=${this.patchRange}
- .file=${file}
- .lineOfInterest=${this.getLineOfInterest()}
- .path=${this.path}
- .projectName=${this.change?.project}
- @is-blame-loaded-changed=${this.onIsBlameLoadedChanged}
- @comment-anchor-tap=${this.onCommentAnchorTap}
- @line-selected=${this.onLineSelected}
- @diff-changed=${this.onDiffChanged}
- @edit-weblinks-changed=${this.onEditWeblinksChanged}
- @files-weblinks-changed=${this.onFilesWeblinksChanged}
- @render=${this.reInitCursor}
- >
- </gr-diff-host>
- </gr-endpoint-decorator>
- </div>
+ <div
+ slot="main"
+ class=${classMap({
+ diffContainer: true,
+ sidebarOpen: !!this.shownSidebar,
+ hidden: !!this.file?.diffs_too_expensive_to_compute,
+ })}
+ >
+ <gr-endpoint-decorator name="diff-content">
+ <gr-diff-host
+ id="diffHost"
+ .changeNum=${this.changeNum}
+ .change=${this.change}
+ .patchRange=${this.patchRange}
+ .file=${file}
+ .lineOfInterest=${this.getLineOfInterest()}
+ .path=${this.path}
+ .projectName=${this.change?.project}
+ @is-blame-loaded-changed=${this.onIsBlameLoadedChanged}
+ @comment-anchor-tap=${this.onCommentAnchorTap}
+ @line-selected=${this.onLineSelected}
+ @diff-changed=${this.onDiffChanged}
+ @edit-weblinks-changed=${this.onEditWeblinksChanged}
+ @files-weblinks-changed=${this.onFilesWeblinksChanged}
+ @render=${this.reInitCursor}
+ >
+ </gr-diff-host>
+ </gr-endpoint-decorator>
+ </div>
+ <div slot="side">${this.renderSidebarContent()}</div>
+ </gr-content-with-sidebar>
${this.renderDialogs()}
`;
}
@@ -920,7 +907,6 @@
>></a
>
</div>
- ${this.renderSidebarContent()}
</div>`;
}
@@ -1023,17 +1009,35 @@
`;
}
+ private getSidebarSide(): 'left' | 'right' {
+ if (!this.shownSidebar) {
+ return 'left';
+ }
+ const details = this.getPluginLoader().pluginEndPoints.getDetails(
+ `sidebarContent-${this.shownSidebar}`
+ );
+ for (const info of details) {
+ if (info.moduleName) {
+ const customElement = customElements.get(info.moduleName) as
+ | {sidebarPosition?: string}
+ | undefined;
+ // Bracket notation prevents Closure Compiler from mangling the property name
+ // when plugins are minified.
+ if (customElement?.['sidebarPosition'] === 'right') {
+ return 'right';
+ }
+ }
+ }
+ return 'left';
+ }
+
private renderSidebarContent() {
- // Always renders the 0x0px .sidebarAnchor div for scroll measurements.
return html`
- <div class="sidebarAnchor">
- ${when(
- this.shownSidebar !== undefined,
- () => html`
- <div
- class="sidebarContents"
- style=${styleMap({height: `${this.sidebarHeight}px`})}
- >
+ ${when(this.shownSidebar !== undefined, () =>
+ keyed(
+ this.shownSidebar,
+ html`
+ <div class="sidebarContents">
<gr-endpoint-decorator
name=${`sidebarContent-${this.shownSidebar}`}
>
@@ -1080,7 +1084,9 @@
// Only close the sidebar if that particular sidebar is
// still open. An async onClose callback should not close a
// different sidebar.
- if (this.shownSidebar !== pluginName) return;
+ if (this.shownSidebar !== pluginName) {
+ return;
+ }
this.shownSidebar = undefined;
this.getUserModel().updatePreferences({
diff_page_sidebar: 'NONE',
@@ -1091,8 +1097,8 @@
</gr-endpoint-decorator>
</div>
`
- )}
- </div>
+ )
+ )}
`;
}
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.ts
index b66542e..1d5a9b5 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.ts
@@ -51,7 +51,9 @@
} from '../../../types/common';
import {CursorMoveResult} from '../../../api/core';
import {Side} from '../../../api/diff';
+import {PluginApi} from '../../../api/plugin';
import {Files, GrDiffView} from './gr-diff-view';
+import {GrContentWithSidebar} from '../../shared/gr-content-with-sidebar/gr-content-with-sidebar';
import {DropdownItem} from '../../shared/gr-dropdown-list/gr-dropdown-list';
import {SinonFakeTimers, SinonStub, SinonStubbedMember} from 'sinon';
import {
@@ -398,14 +400,16 @@
>
</a>
</div>
- <div class="sidebarAnchor"></div>
</div>
<h2 class="assistive-tech-only">Diff view</h2>
- <div class="diffContainer">
- <gr-endpoint-decorator name="diff-content">
- <gr-diff-host id="diffHost"> </gr-diff-host>
- </gr-endpoint-decorator>
- </div>
+ <gr-content-with-sidebar>
+ <div class="diffContainer" slot="main">
+ <gr-endpoint-decorator name="diff-content">
+ <gr-diff-host id="diffHost"> </gr-diff-host>
+ </gr-endpoint-decorator>
+ </div>
+ <div slot="side"></div>
+ </gr-content-with-sidebar>
<gr-apply-fix-dialog id="applyFixDialog"> </gr-apply-fix-dialog>
<gr-diff-preferences-dialog id="diffPreferencesDialog">
</gr-diff-preferences-dialog>
@@ -2261,5 +2265,103 @@
'Button should be hidden for image diffs'
);
});
+
+ suite('sidebar', () => {
+ test('switching sidebars dismounts old component and mounts new one', async () => {
+ element.shownSidebar = 'sidebar-a';
+ await element.updateComplete;
+ const oldDecorator = element.shadowRoot?.querySelector(
+ '.sidebarContents gr-endpoint-decorator'
+ );
+ assert.isNotNull(oldDecorator);
+ assert.equal(
+ oldDecorator?.getAttribute('name'),
+ 'sidebarContent-sidebar-a'
+ );
+
+ element.shownSidebar = 'sidebar-b';
+ await element.updateComplete;
+ const newDecorator = element.shadowRoot?.querySelector(
+ '.sidebarContents gr-endpoint-decorator'
+ );
+ assert.isNotNull(newDecorator);
+ assert.equal(
+ newDecorator?.getAttribute('name'),
+ 'sidebarContent-sidebar-b'
+ );
+ assert.notEqual(oldDecorator, newDecorator);
+ });
+
+ test('defaults to left sidebar side when no sidebarPosition property set', async () => {
+ element.shownSidebar = 'left-sidebar';
+ await element.updateComplete;
+
+ const contentWithSidebar =
+ element.shadowRoot?.querySelector<GrContentWithSidebar>(
+ 'gr-content-with-sidebar'
+ );
+ assert.isNotNull(contentWithSidebar);
+ assert.equal(contentWithSidebar?.side, 'left');
+ });
+
+ test('detects right sidebar side when static sidebarPosition === "right"', async () => {
+ class RightSidebar extends HTMLElement {
+ static sidebarPosition = 'right';
+ }
+
+ customElements.define('right-sidebar-element', RightSidebar);
+
+ let plugin!: PluginApi;
+ window.Gerrit.install(
+ p => (plugin = p),
+ '0.1',
+ 'http://test.com/plugins/testplugin/static/test.js'
+ );
+ plugin.registerDynamicCustomComponent(
+ 'sidebarContent',
+ 'right-sidebar-element'
+ );
+
+ element.shownSidebar = 'testplugin';
+ await element.updateComplete;
+
+ const contentWithSidebar =
+ element.shadowRoot?.querySelector<GrContentWithSidebar>(
+ 'gr-content-with-sidebar'
+ );
+ assert.equal(contentWithSidebar?.side, 'right');
+ });
+
+ test('detects right sidebar side when static readonly \'sidebarPosition\' === "right"', async () => {
+ class RightSidebarBracket extends HTMLElement {
+ static readonly 'sidebarPosition' = 'right';
+ }
+
+ customElements.define(
+ 'right-sidebar-bracket-element',
+ RightSidebarBracket
+ );
+
+ let plugin!: PluginApi;
+ window.Gerrit.install(
+ p => (plugin = p),
+ '0.1',
+ 'http://test.com/plugins/testplugin-bracket/static/test.js'
+ );
+ plugin.registerDynamicCustomComponent(
+ 'sidebarContent',
+ 'right-sidebar-bracket-element'
+ );
+
+ element.shownSidebar = 'testplugin-bracket';
+ await element.updateComplete;
+
+ const contentWithSidebar =
+ element.shadowRoot?.querySelector<GrContentWithSidebar>(
+ 'gr-content-with-sidebar'
+ );
+ assert.equal(contentWithSidebar?.side, 'right');
+ });
+ });
});
});
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
index 53811e9..5e8cdd7 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
@@ -355,6 +355,7 @@
sharedStyles,
css`
:host {
+ display: block;
font-family: var(--font-family);
font-size: var(--font-size-normal);
font-weight: var(--font-weight-normal);
@@ -632,6 +633,18 @@
>
`
: nothing}
+ ${this.shouldShowDisagreeButton()
+ ? html`
+ <gr-button
+ id="disagreeBtn"
+ link
+ class="action disagree"
+ ?disabled=${this.saving}
+ @click=${this.handleCommentDisagree}
+ >Disagree</gr-button
+ >
+ `
+ : nothing}
<gr-button
id="ackBtn"
link
@@ -722,10 +735,19 @@
}
override firstUpdated() {
+ const lastComment = this.thread ? this.getLastComment() : undefined;
+ const isNewDraft =
+ isDraft(lastComment) && (lastComment?.message ?? '') === '';
if (this.shouldScrollIntoView) {
whenRendered(this, () => {
this.expandCollapseComments(false);
- this.commentBox?.focus();
+ // Because of the non-deterministic order of focus events firing from
+ // the JS event loop, focusing the comment box on a new draft can result
+ // in the draft comment not being focused, which means the user has to
+ // click into it to start typing.
+ if (!isNewDraft) {
+ this.commentBox?.focus();
+ }
// The delay is a hack because we don't know exactly when to
// scroll the comment into center.
// TODO: Find a better solution without a setTimeout
@@ -735,9 +757,9 @@
}, 500);
});
}
- if (this.thread && isDraft(this.getFirstComment())) {
- const msg = this.getFirstComment()?.message ?? '';
- if (msg.length === 0) this.editDraft();
+ // Focus the draft comment input to avoid the user having to click into it.
+ if (isNewDraft) {
+ this.editDraft();
}
}
@@ -957,6 +979,14 @@
);
}
+ protected handleCommentDisagree() {
+ this.createReplyComment(
+ 'Disagree.',
+ /* userWantsToEdit= */ false,
+ /* unresolved= */ false
+ );
+ }
+
private handleReplyToComment(e: ReplyToCommentEvent) {
const {content, userWantsToEdit, unresolved} = e.detail;
this.createReplyComment(content, userWantsToEdit, unresolved);
@@ -1024,6 +1054,17 @@
return this.isOwner && !hasUserSuggestion(comment);
}
+ protected shouldShowDisagreeButton(): boolean {
+ return !!(
+ this.thread &&
+ this.account &&
+ this.unresolved &&
+ this.thread.comments.length === 1 &&
+ this.isOwner &&
+ this.thread.comments[0]?.is_ai
+ );
+ }
+
private handleAppliedFix(fixSuggestion?: FixSuggestionInfo) {
const message = this.getLastComment()?.message;
assert(!!message, 'empty message');
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_screenshot_test.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_screenshot_test.ts
index 9731c4e8..bf06c20 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_screenshot_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_screenshot_test.ts
@@ -114,6 +114,15 @@
await visualDiffDarkTheme(element, 'gr-comment-thread-with-ai');
});
+ test('with AI comment author disagree', async () => {
+ element.isOwner = true;
+ element.thread = createThread({...c_ai, unresolved: true});
+ await element.updateComplete;
+
+ await visualDiff(element, 'gr-comment-thread-with-ai-disagree');
+ await visualDiffDarkTheme(element, 'gr-comment-thread-with-ai-disagree');
+ });
+
test('unresolved inline code review', async () => {
// Simulate inline context by setting custom properties
element.style.setProperty('--gr-comment-thread-width', '100%');
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts
index 816054b..d40490f 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts
@@ -173,6 +173,36 @@
);
});
+ test('focuses commentBox when it is NOT a new draft', async () => {
+ const thread = createThread(c1);
+ const element = await fixture<GrCommentThread>(html`
+ <gr-comment-thread
+ .thread=${thread}
+ .shouldScrollIntoView=${true}
+ ></gr-comment-thread>
+ `);
+ await element.updateComplete;
+ await new Promise(resolve => setTimeout(resolve, 0));
+
+ const commentBox = queryAndAssert<HTMLElement>(element, '.comment-box');
+ assert.equal(element.shadowRoot?.activeElement, commentBox);
+ });
+
+ test('does not focus commentBox when it IS a new draft', async () => {
+ const thread = createThread(createNewDraft({message: ''}));
+ const element = await fixture<GrCommentThread>(html`
+ <gr-comment-thread
+ .thread=${thread}
+ .shouldScrollIntoView=${true}
+ ></gr-comment-thread>
+ `);
+ await element.updateComplete;
+ await new Promise(resolve => setTimeout(resolve, 0));
+
+ const commentBox = queryAndAssert<HTMLElement>(element, '.comment-box');
+ assert.notEqual(element.shadowRoot?.activeElement, commentBox);
+ });
+
test('comment box spans 100% of container width', async () => {
const wrapper = await fixture(html`
<div style="width: 500px;">
@@ -518,6 +548,85 @@
// The draft should be discarded completely
assert.equal(draftElement.messageText, '');
});
+
+ test('handle Quote with multi-line message', async () => {
+ stubAdd.restore();
+ stubAdd = sinon
+ .stub(testResolver(commentsModelToken), 'addNewDraft')
+ .callsFake(draft => {
+ const newDraft = {
+ ...draft,
+ id: 'new-draft' as UrlEncodedCommentId,
+ __draft: true,
+ };
+ if (element.thread) {
+ element.thread = {
+ ...element.thread,
+ comments: [...element.thread.comments, newDraft],
+ };
+ }
+ return Promise.resolve(newDraft);
+ });
+
+ element.thread = createThread(c1, {
+ ...c2,
+ message: 'first line\nsecond line\nthird line',
+ unresolved: true,
+ });
+ await element.updateComplete;
+
+ queryAndAssert<GrButton>(element, '#quoteBtn').click();
+ assert.isTrue(stubAdd.called);
+ assert.equal(stubAdd.lastCall.firstArg.in_reply_to, c2.id);
+ await element.updateComplete;
+
+ const draftElement = queryAndAssert<GrComment>(
+ element,
+ 'gr-comment.draft'
+ );
+ await draftElement.updateComplete;
+ await waitUntil(
+ () =>
+ draftElement.messageText ===
+ '> first line\n> second line\n> third line\n\n'
+ );
+ assert.equal(
+ draftElement.messageText,
+ '> first line\n> second line\n> third line\n\n'
+ );
+ });
+
+ test('handle reply-to-comment event from child comment', async () => {
+ element.thread = createThread(c1, {...c2, unresolved: true});
+ await element.updateComplete;
+
+ const commentEl = queryAndAssert<GrComment>(element, 'gr-comment');
+ commentEl.dispatchEvent(
+ new CustomEvent('reply-to-comment', {
+ detail: {
+ content: 'custom response',
+ userWantsToEdit: true,
+ unresolved: true,
+ },
+ bubbles: true,
+ composed: true,
+ })
+ );
+
+ assert.isTrue(stubAdd.called);
+ assert.equal(stubAdd.lastCall.firstArg.in_reply_to, c2.id);
+ assert.equal(stubAdd.lastCall.firstArg.unresolved, true);
+ });
+
+ test('reply sets in_reply_to to the last comment id in thread', async () => {
+ element.thread = createThread(c1, c2);
+ await element.updateComplete;
+
+ queryAndAssert<GrButton>(element, '#replyBtn').click();
+ assert.isTrue(stubAdd.called);
+ const newDraft = stubAdd.lastCall.firstArg;
+ assert.equal(newDraft.in_reply_to, c2.id);
+ });
});
test('comments are sorted correctly', () => {
@@ -763,4 +872,52 @@
]);
});
});
+
+ suite('Disagree button', () => {
+ setup(async () => {
+ element.isOwner = true;
+ element.account = createAccountDetailWithId(13);
+ element.thread = createThread({...c1, is_ai: true, unresolved: true});
+ await element.updateComplete;
+ });
+
+ test('renders with unresolved AI comment when owner', async () => {
+ assert.isOk(query(element, '#disagreeBtn'));
+ });
+
+ test('does not show disagree button if comment is not AI', async () => {
+ element.thread = createThread({...c1, is_ai: false, unresolved: true});
+ await element.updateComplete;
+ assert.isNotOk(query(element, '#disagreeBtn'));
+ });
+
+ test('does not show disagree button if user is not change owner', async () => {
+ element.isOwner = false;
+ await element.updateComplete;
+ assert.isNotOk(query(element, '#disagreeBtn'));
+ });
+
+ test('does not show disagree button if thread has more than 1 comment', async () => {
+ element.thread = createThread(
+ {...c1, is_ai: true, unresolved: true},
+ createComment()
+ );
+ await element.updateComplete;
+ assert.isNotOk(query(element, '#disagreeBtn'));
+ });
+
+ test('handleCommentDisagree creates a "Disagree." reply', async () => {
+ const createReplyCommentSpy = sinon.spy(
+ element as unknown as {createReplyComment: () => void},
+ 'createReplyComment'
+ );
+ queryAndAssert<GrButton>(element, '#disagreeBtn').click();
+ assert.isTrue(createReplyCommentSpy.calledOnce);
+ assert.deepEqual(createReplyCommentSpy.firstCall.args, [
+ 'Disagree.',
+ false,
+ false,
+ ]);
+ });
+ });
});
diff --git a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
index 418ddb0..24ca939 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
@@ -1381,11 +1381,9 @@
override updated(changed: PropertyValues) {
if (changed.has('editing')) {
if (this.editing && !this.permanentEditingMode) {
- // Note that this is a bit fragile, because we are relying on the
- // comment to become visible soonish. If that does not happen, then we
- // will be waiting indefinitely and grab focus at some point in the
- // distant future.
- whenVisible(this, () => this.textarea?.putCursorAtEnd());
+ this.focusTextarea().catch(() => {
+ // Ignore error since failure to focus is non-fatal.
+ });
}
}
if (changed.has('changeNum') || changed.has('comment')) {
@@ -1400,6 +1398,27 @@
}
}
+ private async focusTextarea(): Promise<void> {
+ await this.updateComplete;
+ if (!this.textarea) {
+ return;
+ }
+ await this.textarea.updateComplete;
+ if (this.isVisible()) {
+ this.textarea.putCursorAtEnd();
+ } else {
+ // Note that this is a bit fragile, because we are relying on the
+ // comment to become visible soonish. If that does not happen, then we
+ // will be waiting indefinitely and grab focus at some point in the
+ // distant future.
+ whenVisible(this, () => this.textarea?.putCursorAtEnd());
+ }
+ }
+
+ private isVisible(): boolean {
+ return this.offsetWidth > 0 || this.offsetHeight > 0;
+ }
+
override willUpdate(changed: PropertyValues) {
this.firstWillUpdate();
if (changed.has('comment')) {
diff --git a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.ts b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.ts
index 58a64bd..b437a74 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.ts
@@ -54,6 +54,7 @@
import {suggestionsServiceToken} from '../../../services/suggestions/suggestions-service';
import {AutocompletionContext} from '../../../utils/autocomplete-cache';
import {FixSuggestionInfo} from '../../../api/rest-api';
+import {GrSuggestionTextarea} from '../gr-suggestion-textarea/gr-suggestion-textarea';
suite('gr-comment tests', () => {
let element: GrComment;
@@ -533,6 +534,24 @@
assert.isTrue(element.isSaveDisabled());
});
+ test('focuses textarea when editing is set to true', async () => {
+ const spy = sinon.spy(GrSuggestionTextarea.prototype, 'putCursorAtEnd');
+ try {
+ element.comment = createDraft();
+ element.editing = false;
+ await element.updateComplete;
+
+ element.editing = true;
+ await element.updateComplete;
+ // focusTextarea is async, wait for it to complete.
+ await new Promise(resolve => setTimeout(resolve, 0));
+
+ assert.isTrue(spy.called);
+ } finally {
+ spy.restore();
+ }
+ });
+
test('ctrl+s saves comment', async () => {
const spy = sinon.stub(element, 'save');
element.messageText = 'is that the horse from horsing around??';
diff --git a/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar.ts b/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar.ts
index 0e0638e..869f9df 100644
--- a/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar.ts
+++ b/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar.ts
@@ -4,14 +4,14 @@
* SPDX-License-Identifier: Apache-2.0
*/
import {customElement, property, query, state} from 'lit/decorators.js';
-import {css, html, LitElement} from 'lit';
+import {css, html, LitElement, nothing} from 'lit';
import {styleMap} from 'lit/directives/style-map.js';
-const SIDEBAR_MIN_WIDTH = 400;
+const SIDEBAR_MIN_WIDTH = 250;
/**
* A component that displays content in a main area and a resizable sidebar.
- * The sidebar can be toggled between hidden and visible.
+ * The sidebar can be toggled between hidden and visible and positioned on the left or right.
*
* slot main - The content to be displayed in the main area.
* slot side - The content to be displayed in the sidebar.
@@ -21,11 +21,17 @@
@query('.sidebar-wrapper') sidebarWrapper?: HTMLElement;
@state()
- private sidebarWidthPx = SIDEBAR_MIN_WIDTH;
+ private sidebarWidthPx = 400;
@property()
hideSide = true;
+ @property()
+ side: 'left' | 'right' = 'right';
+
+ @property({type: Number})
+ minWidth = SIDEBAR_MIN_WIDTH;
+
private isSidebarResizing = false;
private sidebarResizingStartPosPx = 0;
@@ -43,22 +49,29 @@
:host {
display: block;
position: relative;
- --sidebar-height: calc(100vh - var(--sidebar-top));
+ --sidebar-height: calc(100vh - var(--sidebar-top, 0px));
}
.sidebar-wrapper {
z-index: 50;
position: absolute;
display: flex;
top: 0;
- bottom: calc(0px - var(--sidebar-bottom-overflow));
- right: 0;
- min-width: 400px;
+ bottom: calc(0px - var(--sidebar-bottom-overflow, 0px));
+ min-width: 250px;
max-width: 100%;
background-color: var(--background-color-secondary);
}
+ .sidebar-wrapper.right {
+ right: 0;
+ left: auto;
+ }
+ .sidebar-wrapper.left {
+ left: 0;
+ right: auto;
+ }
.sidebar {
position: sticky;
- top: var(--sidebar-top);
+ top: var(--sidebar-top, 0px);
height: var(--sidebar-height);
box-sizing: border-box;
overflow: auto;
@@ -67,35 +80,55 @@
}
.resizer-wrapper {
position: sticky;
- top: var(--sidebar-top);
+ top: var(--sidebar-top, 0px);
height: var(--sidebar-height);
z-index: 51;
}
.resizer {
background-color: var(--background-color-secondary);
width: 7px;
- border-left: 1px solid var(--border-color);
cursor: ew-resize;
position: absolute;
top: 0;
bottom: 0;
- left: -7px;
box-sizing: border-box;
}
- .resizer:hover {
+ .resizer.right-side {
+ left: -7px;
+ border-left: 1px solid var(--border-color);
+ }
+ .resizer.right-side:hover {
background-color: var(--background-color-tertiary);
width: 11px;
left: -9px;
}
+ .resizer.left-side {
+ right: -7px;
+ border-right: 1px solid var(--border-color);
+ }
+ .resizer.left-side:hover {
+ background-color: var(--background-color-tertiary);
+ width: 11px;
+ right: -9px;
+ }
`,
];
}
override render() {
const widthPx = this.hideSide ? 0 : this.sidebarWidthPx;
+ const mainStyle =
+ this.side === 'left'
+ ? styleMap({
+ marginLeft: `${widthPx}px`,
+ width: `calc(100% - ${widthPx}px)`,
+ })
+ : styleMap({
+ width: `calc(100% - ${widthPx}px)`,
+ });
return html`
<div>
- <div style=${styleMap({width: `calc(100% - ${widthPx}px)`})}>
+ <div style=${mainStyle}>
<slot name="main"></slot>
</div>
${this.renderSidebar()}
@@ -105,25 +138,34 @@
private renderSidebar() {
if (this.hideSide) return;
+ const sideClass = this.side === 'left' ? 'left' : 'right';
+ const resizerClass = this.side === 'left' ? 'left-side' : 'right-side';
return html`
<div
- class="sidebar-wrapper"
+ class="sidebar-wrapper ${sideClass}"
style=${styleMap({width: `${this.sidebarWidthPx}px`})}
>
- <div class="resizer-wrapper">
- <div
- class="resizer"
- role="separator"
- aria-orientation="vertical"
- aria-valuenow=${this.sidebarWidthPx}
- aria-label="Resize sidebar"
- tabindex="0"
- @mousedown=${this.startSidebarResize}
- ></div>
- </div>
+ ${this.side === 'right' ? this.renderResizer(resizerClass) : nothing}
<div class="sidebar">
<slot name="side"></slot>
</div>
+ ${this.side === 'left' ? this.renderResizer(resizerClass) : nothing}
+ </div>
+ `;
+ }
+
+ private renderResizer(resizerClass: string) {
+ return html`
+ <div class="resizer-wrapper">
+ <div
+ class="resizer ${resizerClass}"
+ role="separator"
+ aria-orientation="vertical"
+ aria-valuenow=${this.sidebarWidthPx}
+ aria-label="Resize sidebar"
+ tabindex="0"
+ @mousedown=${this.startSidebarResize}
+ ></div>
</div>
`;
}
@@ -157,10 +199,11 @@
if (!this.isSidebarResizing || event.buttons === 0) return;
const widthDiffPx = event.clientX - this.sidebarResizingStartPosPx;
- this.sidebarWidthPx = Math.max(
- this.sidebarResizingStartWidthPx - widthDiffPx,
- SIDEBAR_MIN_WIDTH
- );
+ const rawWidth =
+ this.side === 'right'
+ ? this.sidebarResizingStartWidthPx - widthDiffPx
+ : this.sidebarResizingStartWidthPx + widthDiffPx;
+ this.sidebarWidthPx = Math.max(rawWidth, this.minWidth);
}
}
diff --git a/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar_screenshot_test.ts b/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar_screenshot_test.ts
index 52ea31d..7ed19b7 100644
--- a/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar_screenshot_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar_screenshot_test.ts
@@ -44,8 +44,23 @@
await element.updateComplete;
});
- test('screenshot', async () => {
- await visualDiff(wrapper, 'gr-content-with-sidebar');
- await visualDiffDarkTheme(wrapper, 'gr-content-with-sidebar');
+ test('screenshot right sidebar', async () => {
+ const element = wrapper.querySelector<GrContentWithSidebar>(
+ 'gr-content-with-sidebar'
+ )!;
+ element.side = 'right';
+ await element.updateComplete;
+ await visualDiff(wrapper, 'gr-content-with-sidebar-right');
+ await visualDiffDarkTheme(wrapper, 'gr-content-with-sidebar-right');
+ });
+
+ test('screenshot left sidebar', async () => {
+ const element = wrapper.querySelector<GrContentWithSidebar>(
+ 'gr-content-with-sidebar'
+ )!;
+ element.side = 'left';
+ await element.updateComplete;
+ await visualDiff(wrapper, 'gr-content-with-sidebar-left');
+ await visualDiffDarkTheme(wrapper, 'gr-content-with-sidebar-left');
});
});
diff --git a/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar_test.ts b/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar_test.ts
index 7905c0a..626e3dc 100644
--- a/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-content-with-sidebar/gr-content-with-sidebar_test.ts
@@ -34,8 +34,9 @@
);
});
- test('renders sidebar', async () => {
+ test('renders right sidebar', async () => {
element.hideSide = false;
+ element.side = 'right';
await element.updateComplete;
assert.shadowDom.equal(
@@ -45,13 +46,13 @@
<div style="width: calc(100% - 400px);">
<slot name="main"> </slot>
</div>
- <div class="sidebar-wrapper" style="width:400px;">
+ <div class="right sidebar-wrapper" style="width:400px;">
<div class="resizer-wrapper">
<div
aria-label="Resize sidebar"
aria-orientation="vertical"
aria-valuenow="400"
- class="resizer"
+ class="right-side resizer"
role="separator"
tabindex="0"
></div>
@@ -64,4 +65,36 @@
`
);
});
+
+ test('renders left sidebar', async () => {
+ element.hideSide = false;
+ element.side = 'left';
+ await element.updateComplete;
+
+ assert.shadowDom.equal(
+ element,
+ /* HTML */ `
+ <div>
+ <div style="width: calc(100% - 400px); margin-left: 400px;">
+ <slot name="main"> </slot>
+ </div>
+ <div class="left sidebar-wrapper" style="width:400px;">
+ <div class="sidebar">
+ <slot name="side"> </slot>
+ </div>
+ <div class="resizer-wrapper">
+ <div
+ aria-label="Resize sidebar"
+ aria-orientation="vertical"
+ aria-valuenow="400"
+ class="left-side resizer"
+ role="separator"
+ tabindex="0"
+ ></div>
+ </div>
+ </div>
+ </div>
+ `
+ );
+ });
});
diff --git a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.ts b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.ts
index 0ee4aa3..bfc6462 100644
--- a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.ts
+++ b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.ts
@@ -52,6 +52,9 @@
@property({type: Boolean, reflect: true})
hideInput = false;
+ @property({type: Boolean, attribute: 'disable-auto-select', reflect: true})
+ disableAutoSelect = false;
+
@property({type: String})
label?: string;
@@ -216,6 +219,7 @@
}
private handleInputClick(e: MouseEvent) {
+ if (this.disableAutoSelect) return;
e.preventDefault();
const rootTarget = e.composedPath()[0];
(rootTarget as HTMLInputElement).select();
diff --git a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.ts b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.ts
index b50ecfd..acc1180 100644
--- a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.ts
@@ -128,6 +128,22 @@
assert.equal(mdOutlinedTextField.selectionEnd, element.text!.length - 1);
});
+ test('handleInputClick with disableAutoSelect', async () => {
+ element.disableAutoSelect = true;
+ await element.updateComplete;
+
+ const mdOutlinedTextField = queryAndAssert<MdOutlinedTextField>(
+ element,
+ 'md-outlined-text-field'
+ );
+ mdOutlinedTextField.selectionStart = 0;
+ mdOutlinedTextField.selectionEnd = 0;
+
+ mdOutlinedTextField.click();
+ assert.equal(mdOutlinedTextField.selectionStart, 0);
+ assert.equal(mdOutlinedTextField.selectionEnd, 0);
+ });
+
test('hideInput', async () => {
const mdOutlinedTextField = queryAndAssert<MdOutlinedTextField>(
element,
diff --git a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.ts b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.ts
index 9a7cabc..30defc5 100644
--- a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.ts
+++ b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.ts
@@ -54,6 +54,9 @@
@property({type: Boolean, attribute: 'show-keyboard-shortcut-tooltips'})
showKeyboardShortcutTooltips = false;
+ @property({type: Boolean, attribute: 'disable-auto-select', reflect: true})
+ disableAutoSelect = false;
+
// Private but used in tests.
readonly getUserModel = resolve(this, userModelToken);
@@ -171,6 +174,7 @@
.label=${command.title}
.command=${command.command}
.tooltip=${this.computeTooltip(index)}
+ .disableAutoSelect=${this.disableAutoSelect}
></gr-shell-command>
`;
}
diff --git a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.ts b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.ts
index 05011f8f..3f3b4bc 100644
--- a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.ts
@@ -97,6 +97,16 @@
assert.isTrue(focusStub.called);
});
+ test('passes disableAutoSelect to gr-shell-command', async () => {
+ element.disableAutoSelect = true;
+ await element.updateComplete;
+ const shellCommand = queryAndAssert<GrShellCommand>(
+ element,
+ 'gr-shell-command'
+ );
+ assert.isTrue(shellCommand.disableAutoSelect);
+ });
+
test('element visibility', async () => {
assert.isFalse(isHidden(queryAndAssert(element, 'md-tabs')));
assert.isFalse(isHidden(queryAndAssert(element, '.commands')));
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.ts b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.ts
index 6c2661f..1261e29 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.ts
+++ b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.ts
@@ -337,7 +337,6 @@
this.value = this.inputText || '';
}
this.editing = false;
- // TODO: This event seems to be unused (no listener). Remove?
fire(this, 'changed', this.value);
}
diff --git a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.ts b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.ts
index 95b6851..917ed1d 100644
--- a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.ts
+++ b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.ts
@@ -119,7 +119,7 @@
white-space: normal;
/* prose will automatically wrap but inline <code> blocks won't and we
should overflow in that case rather than wrapping or leaking out */
- overflow-x: auto;
+ overflow-x: var(--gr-formatted-text-markdown-html-overflow-x, auto);
overflow-wrap: break-word;
}
`,
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts
index 6ee3bf3..145be54 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts
@@ -217,6 +217,11 @@
// only skip the check if the caller wants to prosess status themselves.
reportServerError?: boolean;
isHighPriority?: boolean;
+ /**
+ * If true, the request will be routed through the readScheduler even if it
+ * uses a write method (PUT, POST, DELETE).
+ */
+ useReadScheduler?: boolean;
}
export interface FetchOptionsInit {
@@ -264,12 +269,20 @@
private readonly writeScheduler: Scheduler<Response>
) {}
+ private isWrite(method: string, useReadScheduler?: boolean): boolean {
+ return (
+ (method === 'PUT' || method === 'POST' || method === 'DELETE') &&
+ !useReadScheduler
+ );
+ }
+
private schedule(
method: string,
task: Task<Response>,
- name?: string
+ name?: string,
+ useReadScheduler?: boolean
): Promise<Response> {
- if (method === 'PUT' || method === 'POST' || method === 'DELETE') {
+ if (this.isWrite(method, useReadScheduler)) {
return this.writeScheduler.schedule(task, name);
} else {
return this.readScheduler.schedule(task, name);
@@ -284,8 +297,7 @@
const method = req.fetchOptions?.method ?? HttpMethod.GET;
const startTime = Date.now();
- const isWrite =
- method === 'PUT' || method === 'POST' || method === 'DELETE';
+ const isWrite = this.isWrite(method, req.useReadScheduler);
const origin = req.fetchOptions?.headers?.get(REQUEST_ORIGIN_HEADER);
const pluginName = origin?.startsWith('plugin:') ? origin : undefined;
const requestName = `${method} - ${
@@ -330,7 +342,9 @@
};
const resPromise = (
- req.isHighPriority ? task() : this.schedule(method, task, requestName)
+ req.isHighPriority
+ ? task()
+ : this.schedule(method, task, requestName, req.useReadScheduler)
).catch((err: unknown) => {
if (err instanceof RetryError) {
return err.payload;
@@ -414,6 +428,9 @@
fetchOptions: req.fetchOptions,
anonymizedUrl: req.reportUrlAsIs ? urlWithParams : req.anonymizedUrl,
};
+ if (req.useReadScheduler !== undefined) {
+ fetchReq.useReadScheduler = req.useReadScheduler;
+ }
let resp: Response;
try {
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper_test.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper_test.ts
index 92feb24..ea79611 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper_test.ts
@@ -130,6 +130,33 @@
});
assert.equal(readScheduler.scheduled.length, 0);
await assertWriteRequest();
+ const res = await promise;
+ assert.equal(await res.text(), 'Yay');
+ });
+
+ test('POST are sent to writeScheduler', async () => {
+ const promise = helper.fetch({
+ fetchOptions: {
+ method: HttpMethod.POST,
+ },
+ url: '/dummy/url',
+ });
+ assert.equal(readScheduler.scheduled.length, 0);
+ await assertWriteRequest();
+ const res = await promise;
+ assert.equal(await res.text(), 'Yay');
+ });
+
+ test('POST with useReadScheduler are sent to readScheduler', async () => {
+ const promise = helper.fetch({
+ fetchOptions: {
+ method: HttpMethod.POST,
+ },
+ url: '/changes/123/revisions/1/fix:preview',
+ useReadScheduler: true,
+ });
+ assert.equal(writeScheduler.scheduled.length, 0);
+ await assertReadRequest();
const res: Response = await promise;
assert.equal(await res.text(), 'Yay');
});
diff --git a/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.ts b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.ts
index 0c9be74..54aecb3 100644
--- a/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.ts
+++ b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.ts
@@ -27,6 +27,9 @@
@property({type: String})
tooltip = '';
+ @property({type: Boolean, attribute: 'disable-auto-select', reflect: true})
+ disableAutoSelect = false;
+
static override get styles() {
return [
sharedStyles,
@@ -73,6 +76,7 @@
.text=${this.command}
hasTooltip
buttonTitle=${this.tooltip}
+ .disableAutoSelect=${this.disableAutoSelect}
></gr-copy-clipboard>
</div>`;
}
diff --git a/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command_test.ts b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command_test.ts
index 1e0ff11..8fb66f5 100644
--- a/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command_test.ts
@@ -44,4 +44,14 @@
await element.focusOnCopy();
assert.isTrue(focusStub.called);
});
+
+ test('passes disableAutoSelect to gr-copy-clipboard', async () => {
+ element.disableAutoSelect = true;
+ await element.updateComplete;
+ const copyClipboard = queryAndAssert<GrCopyClipboard>(
+ element,
+ 'gr-copy-clipboard'
+ );
+ assert.isTrue(copyClipboard.disableAutoSelect);
+ });
});
diff --git a/polygerrit-ui/app/elements/shared/gr-suggestion-diff-preview/gr-suggestion-diff-preview.ts b/polygerrit-ui/app/elements/shared/gr-suggestion-diff-preview/gr-suggestion-diff-preview.ts
index 72e0905..0b46706 100644
--- a/polygerrit-ui/app/elements/shared/gr-suggestion-diff-preview/gr-suggestion-diff-preview.ts
+++ b/polygerrit-ui/app/elements/shared/gr-suggestion-diff-preview/gr-suggestion-diff-preview.ts
@@ -30,7 +30,11 @@
import {navigationToken} from '../../core/gr-navigation/gr-navigation';
import {fire, fireError} from '../../../utils/event-util';
import {Timing} from '../../../constants/reporting';
-import {createChangeUrl} from '../../../models/views/change';
+import {
+ changeViewModelToken,
+ createApplyFixUrl,
+} from '../../../models/views/change';
+
import {getFileExtension} from '../../../utils/file-util';
import {throwingErrorCallback} from '../gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper';
import {ReportSource} from '../../../services/suggestions/suggestions-service';
@@ -128,6 +132,8 @@
private readonly getNavigation = resolve(this, navigationToken);
+ private readonly getViewModel = resolve(this, changeViewModelToken);
+
private readonly syntaxLayer = new GrSyntaxLayerWorker(
resolve(this, highlightServiceToken),
() => getAppContext().reportingService
@@ -391,16 +397,23 @@
// basePatchNum is from comment patchset and comment cannot be created
// in EDIT. RevisionPatchset without EDIT is PatchSetNumber
if (res?.ok && basePatchNum !== undefined && basePatchNum !== EDIT) {
+ const currentChildView = this.getViewModel().getState()?.childView;
+ const filePath =
+ fixSuggestion.replacements[0]?.path ?? this.preview?.filepath;
this.getNavigation().setUrl(
- createChangeUrl({
+ createApplyFixUrl({
changeNum,
repo: this.repo!,
- patchNum: EDIT,
basePatchNum: basePatchNum as PatchSetNumber,
forceReload: !this.hasEdit,
+ filePath,
+ currentChildView,
})
);
- fire(this, 'reload-diff', {path: fixSuggestion.replacements[0].path});
+
+ if (filePath) {
+ fire(this, 'reload-diff', {path: filePath});
+ }
fire(this, 'apply-user-suggestion', {
fixSuggestion: fixSuggestion.description.includes(
ReportSource.GET_AI_FIX_FOR_COMMENT
diff --git a/polygerrit-ui/app/elements/shared/gr-suggestion-diff-preview/gr-suggestion-diff-preview_test.ts b/polygerrit-ui/app/elements/shared/gr-suggestion-diff-preview/gr-suggestion-diff-preview_test.ts
index 742900f..da0220c 100644
--- a/polygerrit-ui/app/elements/shared/gr-suggestion-diff-preview/gr-suggestion-diff-preview_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-suggestion-diff-preview/gr-suggestion-diff-preview_test.ts
@@ -17,8 +17,21 @@
} from '../../../test/test-data-generators';
import {getAppContext} from '../../../services/app-context';
import {GrSuggestionDiffPreview} from './gr-suggestion-diff-preview';
-import {stubFlags} from '../../../test/test-utils';
-import {NumericChangeId, RevisionPatchSetNum} from '../../../api/rest-api';
+import * as sinon from 'sinon';
+import {navigationToken} from '../../core/gr-navigation/gr-navigation';
+import {stubFlags, stubRestApi} from '../../../test/test-utils';
+import {
+ NumericChangeId,
+ RepoName,
+ RevisionPatchSetNum,
+} from '../../../api/rest-api';
+import {changeViewModelToken} from '../../../models/views/change';
+import {
+ createChangeViewState,
+ createDiffViewState,
+ createRange,
+} from '../../../test/test-data-generators';
+import {testResolver} from '../../../test/common-test-setup';
suite('gr-suggestion-diff-preview tests', () => {
let element: GrSuggestionDiffPreview;
@@ -121,4 +134,53 @@
{ignoreAttributes: ['style']}
);
});
+
+ suite('applyFix navigation', () => {
+ let setUrlStub: sinon.SinonStub;
+
+ setup(() => {
+ setUrlStub = sinon.stub(testResolver(navigationToken), 'setUrl');
+ stubRestApi('applyFixSuggestion').returns(
+ Promise.resolve(new Response(null, {status: 200}))
+ );
+ element.changeNum = 42 as NumericChangeId;
+ element.repo = 'test-project' as RepoName;
+ element.patchSet = 1 as RevisionPatchSetNum;
+
+ element.fixSuggestionInfo = {
+ ...createFixSuggestionInfo(),
+ replacements: [
+ {
+ path: 'foo/bar.ts',
+ replacement: 'new content',
+ range: createRange(),
+ },
+ ],
+ };
+ });
+
+ test('navigates to createDiffUrl when in Diff View', async () => {
+ testResolver(changeViewModelToken).setState(createDiffViewState());
+
+ await element.applyFix();
+
+ assert.isTrue(setUrlStub.calledOnce);
+ assert.equal(
+ setUrlStub.lastCall.firstArg,
+ '/c/test-project/+/42/1..edit/foo/bar.ts?forceReload=true'
+ );
+ });
+
+ test('navigates to createChangeUrl when in Change View', async () => {
+ testResolver(changeViewModelToken).setState(createChangeViewState());
+
+ await element.applyFix();
+
+ assert.isTrue(setUrlStub.calledOnce);
+ assert.equal(
+ setUrlStub.lastCall.firstArg,
+ '/c/test-project/+/42/1..edit?forceReload=true'
+ );
+ });
+ });
});
diff --git a/polygerrit-ui/app/models/checks/checks-model.ts b/polygerrit-ui/app/models/checks/checks-model.ts
index c986efe..3fbc552 100644
--- a/polygerrit-ui/app/models/checks/checks-model.ts
+++ b/polygerrit-ui/app/models/checks/checks-model.ts
@@ -321,9 +321,18 @@
);
this.checksLatest$ = select(this.state$, state => state.pluginStateLatest);
this.checksSelected$ = select(
- combineLatest([this.state$, this.changeViewModel.checksPatchset$]),
- ([state, ps]) => {
- const checksPs = ps ? ChecksPatchset.SELECTED : ChecksPatchset.LATEST;
+ combineLatest([
+ this.state$,
+ this.changeViewModel.checksPatchset$,
+ this.changeModel.latestPatchNum$,
+ ]),
+ ([state, ps, latestPs]) => {
+ // When no distinct patchset is selected SELECTED fetch is skipped
+ // (see initFetchingOfData), so fall back to the LATEST state here.
+ const checksPs =
+ ps && ps !== latestPs
+ ? ChecksPatchset.SELECTED
+ : ChecksPatchset.LATEST;
return this.getPluginState(state, checksPs);
}
);
@@ -865,29 +874,54 @@
this.reloadSubjects[pluginName],
pollIntervalMs === 0 ? from([0]) : timer(0, pollIntervalMs),
this.documentVisibilityChange$,
+ // Only the SELECTED subscription needs the latest patchset here, to
+ // detect when it coincides with the latest (see below). The LATEST
+ // subscription already has it as its second element, so feeding it in
+ // again would make combineLatest emit twice per change.
+ patchset === ChecksPatchset.SELECTED
+ ? this.changeModel.latestPatchNum$
+ : of(undefined),
])
.pipe(
takeWhile(_ => !!this.providers[pluginName]),
filter(_ => document.visibilityState !== 'hidden'),
throttleTime(500, undefined, {leading: true, trailing: true}),
- switchMap(([change, patchNum]): Observable<FetchResponse> => {
- if (!change || !patchNum) return of(this.empty());
- if (typeof patchNum !== 'number') return of(this.empty());
- assertIsDefined(change.revisions, 'change.revisions');
- const patchsetSha = getShaByPatchNum(change.revisions, patchNum);
- // Sometimes patchNum is updated earlier than change, so change
- // revisions don't have patchNum yet
- if (!patchsetSha) return of(this.empty());
- const data: ChangeData = {
- changeNumber: change?._number,
- patchsetNumber: patchNum,
- patchsetSha,
- repo: change.project,
- commitMessage: getCurrentRevision(change)?.commit?.message,
- changeInfo: change as ChangeInfo,
- };
- return this.fetchResults(pluginName, data, patchset);
- }),
+ switchMap(
+ ([
+ change,
+ patchNum,
+ ,
+ ,
+ ,
+ latestPatchNum,
+ ]): Observable<FetchResponse> => {
+ if (!change || !patchNum) return of(this.empty());
+ if (typeof patchNum !== 'number') return of(this.empty());
+ // Skip the duplicate fetch when the selected patchset is the
+ // latest: the LATEST subscription already fetches it and
+ // checksSelected$ falls back to that state.
+ if (
+ patchset === ChecksPatchset.SELECTED &&
+ patchNum === latestPatchNum
+ ) {
+ return of(this.empty());
+ }
+ assertIsDefined(change.revisions, 'change.revisions');
+ const patchsetSha = getShaByPatchNum(change.revisions, patchNum);
+ // Sometimes patchNum is updated earlier than change, so change
+ // revisions don't have patchNum yet
+ if (!patchsetSha) return of(this.empty());
+ const data: ChangeData = {
+ changeNumber: change?._number,
+ patchsetNumber: patchNum,
+ patchsetSha,
+ repo: change.project,
+ commitMessage: getCurrentRevision(change)?.commit?.message,
+ changeInfo: change as ChangeInfo,
+ };
+ return this.fetchResults(pluginName, data, patchset);
+ }
+ ),
catchError(e => {
// This should not happen and is really severe, because it means that
// the Observable has terminated and we won't recover from that. No
diff --git a/polygerrit-ui/app/models/checks/checks-model_test.ts b/polygerrit-ui/app/models/checks/checks-model_test.ts
index 94b3d0f..368b7e6 100644
--- a/polygerrit-ui/app/models/checks/checks-model_test.ts
+++ b/polygerrit-ui/app/models/checks/checks-model_test.ts
@@ -17,6 +17,7 @@
import {
Action,
Category,
+ ChangeData,
CheckRun,
ChecksApiConfig,
ChecksProvider,
@@ -27,9 +28,11 @@
import {
createCheckResult,
createParsedChange,
+ createRevisions,
createRun,
+ getCurrentRevision,
} from '../../test/test-data-generators';
-import {waitUntil, waitUntilCalled} from '../../test/test-utils';
+import {waitEventLoop, waitUntil, waitUntilCalled} from '../../test/test-utils';
import {ParsedChangeInfo} from '../../types/types';
import {
changeModelToken,
@@ -38,7 +41,11 @@
import {assert} from '@open-wc/testing';
import {testResolver} from '../../test/common-test-setup';
import {changeViewModelToken} from '../views/change';
-import {NumericChangeId, PatchSetNumber} from '../../api/rest-api';
+import {
+ NumericChangeId,
+ PatchSetNumber,
+ RevisionPatchSetNum,
+} from '../../api/rest-api';
import {pluginLoaderToken} from '../../elements/shared/gr-js-api-interface/gr-plugin-loader';
import {deepEqual} from '../../utils/deep-util';
@@ -79,6 +86,29 @@
};
}
+/**
+ * A provider that echoes back the patchset it was asked to fetch, so that tests
+ * can assert which patchset a tab is populated with.
+ */
+function createPatchsetTaggingProvider(): ChecksProvider {
+ return {
+ fetch: (data: ChangeData) =>
+ Promise.resolve({
+ responseCode: ResponseCode.OK,
+ runs: [createRun({patchset: data.patchsetNumber})],
+ }),
+ };
+}
+
+/** A change with two patchsets, so latest (2) and older (1) are distinct. */
+function createTwoPatchsetChange(): ParsedChangeInfo {
+ return updateRevisionsWithCommitShas({
+ ...createParsedChange(),
+ revisions: createRevisions(2),
+ current_revision: getCurrentRevision(1),
+ })!;
+}
+
suite('checks-model tests', () => {
let model: ChecksModel;
@@ -130,6 +160,130 @@
clock.restore();
});
+ test('no duplicate fetch when viewing latest patchset (no selection)', async () => {
+ const clock = sinon.useFakeTimers({shouldClearNativeTimers: true});
+ let change: ParsedChangeInfo | undefined = undefined;
+ testResolver(changeModelToken).change$.subscribe(c => (change = c));
+ let latestRuns: CheckRun[] = [];
+ let selectedRuns: CheckRun[] = [];
+ model.allRunsLatestPatchset$.subscribe(r => (latestRuns = r));
+ model.allRunsSelectedPatchset$.subscribe(r => (selectedRuns = r));
+ const provider = createPatchsetTaggingProvider();
+ const fetchSpy = sinon.spy(provider, 'fetch');
+
+ model.register({
+ pluginName: PLUGIN_NAME,
+ provider,
+ config: CONFIG_POLLING_NONE,
+ });
+ await waitUntil(() => change === undefined);
+
+ // Viewing the latest patchset (2), no explicit checks patchset override.
+ testResolver(changeViewModelToken).updateState({
+ patchNum: 2 as RevisionPatchSetNum,
+ });
+ const testChange = createTwoPatchsetChange();
+ testResolver(changeModelToken).updateStateChange(testChange);
+ await waitUntil(() => deepEqual(change, testChange));
+
+ // Fire the throttled emission, then flush the fetch promise into state.
+ clock.tick(600);
+ await waitEventLoop();
+
+ // The SELECTED patchset equals LATEST, so only a single fetch is needed.
+ assert.equal(fetchSpy.callCount, 1);
+ // Both tabs show data for the latest patchset (2).
+ assert.isNotEmpty(latestRuns);
+ assert.isNotEmpty(selectedRuns);
+ assert.isTrue(latestRuns.every(r => r.patchset === 2));
+ assert.isTrue(selectedRuns.every(r => r.patchset === 2));
+
+ clock.restore();
+ });
+
+ test('no duplicate fetch when latest patchset is explicitly selected', async () => {
+ const clock = sinon.useFakeTimers({shouldClearNativeTimers: true});
+ let change: ParsedChangeInfo | undefined = undefined;
+ testResolver(changeModelToken).change$.subscribe(c => (change = c));
+ let latestRuns: CheckRun[] = [];
+ let selectedRuns: CheckRun[] = [];
+ model.allRunsLatestPatchset$.subscribe(r => (latestRuns = r));
+ model.allRunsSelectedPatchset$.subscribe(r => (selectedRuns = r));
+ const provider = createPatchsetTaggingProvider();
+ const fetchSpy = sinon.spy(provider, 'fetch');
+
+ model.register({
+ pluginName: PLUGIN_NAME,
+ provider,
+ config: CONFIG_POLLING_NONE,
+ });
+ await waitUntil(() => change === undefined);
+
+ // Viewing patchset 1 but explicitly selecting the latest patchset (2) in the
+ // checks tab. checksPatchset differs from patchNum, so it is not reset.
+ testResolver(changeViewModelToken).updateState({
+ patchNum: 1 as RevisionPatchSetNum,
+ checksPatchset: 2 as PatchSetNumber,
+ });
+ const testChange = createTwoPatchsetChange();
+ testResolver(changeModelToken).updateStateChange(testChange);
+ await waitUntil(() => deepEqual(change, testChange));
+
+ // Fire the throttled emission, then flush the fetch promise into state.
+ clock.tick(600);
+ await waitEventLoop();
+
+ // Selected patchset (2) equals latest, so still only a single fetch.
+ assert.equal(fetchSpy.callCount, 1);
+ assert.isNotEmpty(latestRuns);
+ assert.isNotEmpty(selectedRuns);
+ assert.isTrue(latestRuns.every(r => r.patchset === 2));
+ assert.isTrue(selectedRuns.every(r => r.patchset === 2));
+
+ clock.restore();
+ });
+
+ test('fetches both patchsets when an older one is selected', async () => {
+ const clock = sinon.useFakeTimers({shouldClearNativeTimers: true});
+ let change: ParsedChangeInfo | undefined = undefined;
+ testResolver(changeModelToken).change$.subscribe(c => (change = c));
+ let latestRuns: CheckRun[] = [];
+ let selectedRuns: CheckRun[] = [];
+ model.allRunsLatestPatchset$.subscribe(r => (latestRuns = r));
+ model.allRunsSelectedPatchset$.subscribe(r => (selectedRuns = r));
+ const provider = createPatchsetTaggingProvider();
+ const fetchSpy = sinon.spy(provider, 'fetch');
+
+ model.register({
+ pluginName: PLUGIN_NAME,
+ provider,
+ config: CONFIG_POLLING_NONE,
+ });
+ await waitUntil(() => change === undefined);
+
+ // Explicitly selecting the older patchset (1); latest is 2.
+ testResolver(changeViewModelToken).updateState({
+ checksPatchset: 1 as PatchSetNumber,
+ });
+ const testChange = createTwoPatchsetChange();
+ testResolver(changeModelToken).updateStateChange(testChange);
+ await waitUntil(() => deepEqual(change, testChange));
+
+ // Fire the throttled emission, then flush the fetch promise into state.
+ clock.tick(600);
+ await waitEventLoop();
+
+ // Distinct patchsets require two fetches: one for latest, one for selected.
+ assert.equal(fetchSpy.callCount, 2);
+ // The latest tab shows patchset 2, the selected tab shows the older 1.
+ assert.isNotEmpty(latestRuns);
+ assert.isNotEmpty(selectedRuns);
+ assert.isTrue(latestRuns.every(r => r.patchset === 2));
+ assert.isTrue(selectedRuns.every(r => r.patchset === 1));
+
+ clock.restore();
+ });
+
test('fetch throttle', async () => {
const clock = sinon.useFakeTimers({shouldClearNativeTimers: true});
let change: ParsedChangeInfo | undefined = undefined;
diff --git a/polygerrit-ui/app/models/flows/flows-model.ts b/polygerrit-ui/app/models/flows/flows-model.ts
index 300a1b7..83d0c74 100644
--- a/polygerrit-ui/app/models/flows/flows-model.ts
+++ b/polygerrit-ui/app/models/flows/flows-model.ts
@@ -31,12 +31,26 @@
export const SUBMIT_ACTION_NAME = 'submit';
+/**
+ * Matches the base change path prefix up to the change number (e.g. `/c/project/+/123`),
+ * ignoring any trailing patchsets, diff ranges, comment IDs, or file paths.
+ *
+ * @see RoutePattern.CHANGE in `gr-router.ts` for corresponding route pattern.
+ */
+const CHANGE_PREFIX_PATTERN = /^(.*?\/(?:c\/.+?\/\+)\/\d+)/;
+
export function getSubmitCondition() {
return getChangePrefix() + ' is is:submittable';
}
+/**
+ * Returns the change URL prefix (e.g. `http://host/c/project/+/123`), stripping
+ * patchset numbers, diff ranges, comment IDs, and file paths from pathname.
+ */
export function getChangePrefix() {
- return window.location.origin + window.location.pathname;
+ const match = window.location.pathname.match(CHANGE_PREFIX_PATTERN);
+ const pathname = match ? match[1] : window.location.pathname;
+ return window.location.origin + pathname;
}
export class FlowsModel extends Model<FlowsState> {
diff --git a/polygerrit-ui/app/models/flows/flows-model_test.ts b/polygerrit-ui/app/models/flows/flows-model_test.ts
index 2dfe5a7..18c9538 100644
--- a/polygerrit-ui/app/models/flows/flows-model_test.ts
+++ b/polygerrit-ui/app/models/flows/flows-model_test.ts
@@ -200,4 +200,69 @@
await waitUntil(() => !flowsModel.hasAutosubmitFlowAlready());
assert.isFalse(flowsModel.hasAutosubmitFlowAlready());
});
+
+ suite('getChangePrefix', () => {
+ let originalPath: string;
+
+ setup(() => {
+ originalPath = window.location.pathname;
+ });
+
+ teardown(() => {
+ window.history.replaceState(null, '', originalPath);
+ });
+
+ test('strips patchset, diff range, and file path subpaths', () => {
+ const origin = window.location.origin;
+
+ window.history.replaceState(null, '', '/c/my-repo/+/123');
+ assert.equal(getChangePrefix(), `${origin}/c/my-repo/+/123`);
+
+ window.history.replaceState(null, '', '/c/my-repo/+/123/4');
+ assert.equal(getChangePrefix(), `${origin}/c/my-repo/+/123`);
+
+ window.history.replaceState(null, '', '/c/my-repo/+/123/1..4');
+ assert.equal(getChangePrefix(), `${origin}/c/my-repo/+/123`);
+
+ window.history.replaceState(
+ null,
+ '',
+ '/c/my-repo/+/123/1..4/src/file.ts'
+ );
+ assert.equal(getChangePrefix(), `${origin}/c/my-repo/+/123`);
+ });
+ });
+
+ test('hasAutosubmitFlowAlready detects flows when navigating between patchsets/diff ranges', async () => {
+ const originalPath = window.location.pathname;
+ try {
+ window.history.replaceState(null, '', '/c/my-repo/+/123/4..5/src/foo.ts');
+ stubRestApi('getIfFlowsIsEnabled').resolves({enabled: true});
+ const expectedPrefix = `${window.location.origin}/c/my-repo/+/123`;
+ stubRestApi('listFlows').resolves([
+ createFlow({
+ uuid: 'flow1',
+ stages: [
+ {
+ expression: {
+ condition: `${expectedPrefix} is is:submittable`,
+ action: {name: SUBMIT_ACTION_NAME},
+ },
+ state: FlowStageState.DONE,
+ },
+ ],
+ }),
+ ]);
+
+ changeModel.updateStateChange({
+ ...createParsedChange(),
+ _number: 123 as NumericChangeId,
+ });
+ await waitUntil(() => flowsModel.getState().flows.length > 0);
+
+ assert.isTrue(flowsModel.hasAutosubmitFlowAlready());
+ } finally {
+ window.history.replaceState(null, '', originalPath);
+ }
+ });
});
diff --git a/polygerrit-ui/app/models/views/change.ts b/polygerrit-ui/app/models/views/change.ts
index 03c944f..0ee5e99 100644
--- a/polygerrit-ui/app/models/views/change.ts
+++ b/polygerrit-ui/app/models/views/change.ts
@@ -253,6 +253,9 @@
) {
params.push(`checksPatchset=${state.checksPatchset}`);
}
+ if (state.forceReload) {
+ params.push('forceReload=true');
+ }
if (params.length > 0) {
queryParams = '?' + params.join('&');
}
@@ -285,6 +288,26 @@
return `${createChangeUrlCommon(state)}${path},edit${suffix}`;
}
+export function createApplyFixUrl(
+ obj: (CreateChangeUrlObject | Omit<ChangeViewState, 'view' | 'childView'>) & {
+ filePath?: string;
+ currentChildView?: ChangeChildView;
+ }
+): string {
+ const {filePath, currentChildView, ...restObj} = obj;
+ if (currentChildView === ChangeChildView.DIFF && filePath) {
+ return createDiffUrl({
+ ...restObj,
+ patchNum: EDIT,
+ diffView: {path: filePath},
+ });
+ }
+ return createChangeUrl({
+ ...restObj,
+ patchNum: EDIT,
+ });
+}
+
/**
* The shared part of creating a change URL between OVERVIEW, DIFF and EDIT
* child views.
diff --git a/polygerrit-ui/app/models/views/change_test.ts b/polygerrit-ui/app/models/views/change_test.ts
index e05adb6..8bebe21 100644
--- a/polygerrit-ui/app/models/views/change_test.ts
+++ b/polygerrit-ui/app/models/views/change_test.ts
@@ -6,10 +6,13 @@
import {assert} from '@open-wc/testing';
import {
BasePatchSetNum,
+ EDIT,
+ NumericChangeId,
PatchSetNumber,
RepoName,
RevisionPatchSetNum,
} from '../../api/rest-api';
+
import '../../test/common-test-setup';
import {
createChangeViewState,
@@ -17,7 +20,9 @@
createEditViewState,
} from '../../test/test-data-generators';
import {
+ ChangeChildView,
ChangeViewState,
+ createApplyFixUrl,
createChangeUrl,
createDiffUrl,
createEditUrl,
@@ -114,6 +119,14 @@
);
});
+ test('forceReload', () => {
+ params.forceReload = true;
+ assert.equal(
+ createDiffUrl(params),
+ '/c/test-project/+/42/12/x%252By/path.cpp?forceReload=true'
+ );
+ });
+
test('base patchset', () => {
params.basePatchNum = 6 as BasePatchSetNum;
assert.equal(
@@ -186,4 +199,36 @@
assert.equal(createEditUrl(params).substring(0, 5), '/base');
window.CANONICAL_PATH = undefined;
});
+
+ suite('createApplyFixUrl', () => {
+ test('Diff View context', () => {
+ assert.equal(
+ createApplyFixUrl({
+ changeNum: 42 as NumericChangeId,
+ repo: 'test-project' as RepoName,
+ patchNum: EDIT,
+ basePatchNum: 1 as BasePatchSetNum,
+ forceReload: true,
+ filePath: 'foo/bar.ts',
+ currentChildView: ChangeChildView.DIFF,
+ }),
+ '/c/test-project/+/42/1..edit/foo/bar.ts?forceReload=true'
+ );
+ });
+
+ test('Overview context', () => {
+ assert.equal(
+ createApplyFixUrl({
+ changeNum: 42 as NumericChangeId,
+ repo: 'test-project' as RepoName,
+ patchNum: EDIT,
+ basePatchNum: 1 as BasePatchSetNum,
+ forceReload: true,
+ filePath: 'foo/bar.ts',
+ currentChildView: ChangeChildView.OVERVIEW,
+ }),
+ '/c/test-project/+/42/1..edit?forceReload=true'
+ );
+ });
+ });
});
diff --git a/polygerrit-ui/app/node_modules_licenses/BUILD b/polygerrit-ui/app/node_modules_licenses/BUILD
index a1c869d..dc85b23 100644
--- a/polygerrit-ui/app/node_modules_licenses/BUILD
+++ b/polygerrit-ui/app/node_modules_licenses/BUILD
@@ -7,6 +7,7 @@
srcs = [
"licenses.ts",
],
+ transpiler = "tsc",
tsconfig = "tsconfig.json",
deps = [
"//tools/node_tools:node_modules",
diff --git a/polygerrit-ui/app/pnpm-lock.yaml b/polygerrit-ui/app/pnpm-lock.yaml
index da97189..6d865aa 100644
--- a/polygerrit-ui/app/pnpm-lock.yaml
+++ b/polygerrit-ui/app/pnpm-lock.yaml
@@ -138,15 +138,15 @@
engines: {node: '>=12.0.0'}
highlightjs-closure-templates@https://codeload.github.com/highlightjs/highlightjs-closure-templates/tar.gz/02fb0646e0499084f96a99b8c6f4a0d7bd1d33ba:
- resolution: {tarball: https://codeload.github.com/highlightjs/highlightjs-closure-templates/tar.gz/02fb0646e0499084f96a99b8c6f4a0d7bd1d33ba}
+ resolution: {gitHosted: true, tarball: https://codeload.github.com/highlightjs/highlightjs-closure-templates/tar.gz/02fb0646e0499084f96a99b8c6f4a0d7bd1d33ba}
version: 0.0.1
highlightjs-epp@https://codeload.github.com/highlightjs/highlightjs-epp/tar.gz/9f9e1a92f37c217c68899c7d3bdccb4d134681b9:
- resolution: {tarball: https://codeload.github.com/highlightjs/highlightjs-epp/tar.gz/9f9e1a92f37c217c68899c7d3bdccb4d134681b9}
+ resolution: {gitHosted: true, tarball: https://codeload.github.com/highlightjs/highlightjs-epp/tar.gz/9f9e1a92f37c217c68899c7d3bdccb4d134681b9}
version: 0.0.1
highlightjs-structured-text@https://codeload.github.com/highlightjs/highlightjs-structured-text/tar.gz/e68dd7aa829529fb6c40d6287585f43273605a9e:
- resolution: {tarball: https://codeload.github.com/highlightjs/highlightjs-structured-text/tar.gz/e68dd7aa829529fb6c40d6287585f43273605a9e}
+ resolution: {gitHosted: true, tarball: https://codeload.github.com/highlightjs/highlightjs-structured-text/tar.gz/e68dd7aa829529fb6c40d6287585f43273605a9e}
version: 1.4.9
highlightjs-ttcn3@git+https://gitea.osmocom.org/ttcn3/highlightjs-ttcn3.git#6daccff309fca1e7561a43984d42fa4f829ce06d:
@@ -154,7 +154,7 @@
version: 0.0.1
highlightjs-vue@https://codeload.github.com/paladox/highlightjs-vue/tar.gz/44eed074ea0110d1ad03d2cbd77d27027cf7bb04:
- resolution: {tarball: https://codeload.github.com/paladox/highlightjs-vue/tar.gz/44eed074ea0110d1ad03d2cbd77d27027cf7bb04}
+ resolution: {gitHosted: true, tarball: https://codeload.github.com/paladox/highlightjs-vue/tar.gz/44eed074ea0110d1ad03d2cbd77d27027cf7bb04}
version: 1.1.0
ieee754@1.2.1:
@@ -224,7 +224,7 @@
engines: {node: '>= 6'}
resemblejs@https://codeload.github.com/rsmbl/Resemble.js/tar.gz/66a55c5bfc3bda2303ad632ee8ce3c727b415917:
- resolution: {tarball: https://codeload.github.com/rsmbl/Resemble.js/tar.gz/66a55c5bfc3bda2303ad632ee8ce3c727b415917}
+ resolution: {gitHosted: true, tarball: https://codeload.github.com/rsmbl/Resemble.js/tar.gz/66a55c5bfc3bda2303ad632ee8ce3c727b415917}
version: 5.0.0
rxjs@6.6.7:
diff --git a/polygerrit-ui/app/services/gr-rest-api/gr-rest-api-impl.ts b/polygerrit-ui/app/services/gr-rest-api/gr-rest-api-impl.ts
index 92a9c02..51edcfc 100644
--- a/polygerrit-ui/app/services/gr-rest-api/gr-rest-api-impl.ts
+++ b/polygerrit-ui/app/services/gr-rest-api/gr-rest-api-impl.ts
@@ -2620,6 +2620,7 @@
}),
url: `${url}/fix:preview`,
anonymizedUrl: `${ANONYMIZED_REVISION_BASE_URL}/fix:preview`,
+ useReadScheduler: true,
})) as FilePathToDiffInfoMap | undefined;
if (response === undefined) {
diff --git a/polygerrit-ui/app/tsconfig_bazel.json b/polygerrit-ui/app/tsconfig_bazel.json
index 730fc4d..8cd5dfb 100644
--- a/polygerrit-ui/app/tsconfig_bazel.json
+++ b/polygerrit-ui/app/tsconfig_bazel.json
@@ -1,6 +1,10 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
+ // Override the yarn/IDE outDir from tsconfig.json: rules_ts requires the
+ // output directory to stay within the Bazel package (kept in sync with
+ // out_dir of the compile_pg ts_project in the BUILD file).
+ "outDir": "_pg_ts_out",
"typeRoots": [
"../../external/ui_npm/node_modules/@types",
"../../external/ui_dev_npm/node_modules/@types"
diff --git a/polygerrit-ui/app/tsconfig_bazel_test.json b/polygerrit-ui/app/tsconfig_bazel_test.json
index 7d74ffa..e6fc2cc 100644
--- a/polygerrit-ui/app/tsconfig_bazel_test.json
+++ b/polygerrit-ui/app/tsconfig_bazel_test.json
@@ -1,6 +1,10 @@
{
"extends": "./tsconfig_bazel.json",
"compilerOptions": {
+ // Override the yarn/IDE outDir from tsconfig.json: rules_ts requires the
+ // output directory to stay within the Bazel package (kept in sync with
+ // out_dir of the compile_pg_with_tests ts_project).
+ "outDir": "_pg_with_tests_out",
"typeRoots": [
"node_modules/@types",
"../node_modules/@types"
diff --git a/polygerrit-ui/app/types/events.ts b/polygerrit-ui/app/types/events.ts
index 52a4794..2a2ec16 100644
--- a/polygerrit-ui/app/types/events.ts
+++ b/polygerrit-ui/app/types/events.ts
@@ -110,7 +110,6 @@
export type ChangeEvent = InputEvent;
-// TODO: This event seems to be unused (no listener). Remove?
export type ChangedEvent = CustomEvent<string | undefined>;
export interface ChangeMessageDeletedEventDetail {
diff --git a/polygerrit-ui/polygerrit.MODULE.bazel b/polygerrit-ui/polygerrit.MODULE.bazel
index d839cc8..e04ccd6 100644
--- a/polygerrit-ui/polygerrit.MODULE.bazel
+++ b/polygerrit-ui/polygerrit.MODULE.bazel
@@ -27,34 +27,12 @@
)
use_repo(rules_ts_ext, "npm_typescript")
-NODE_24_REPO = {
- "24.14.1-darwin_arm64": ("node-v24.14.1-darwin-arm64.tar.gz", "node-v24.14.1-darwin-arm64", "25495ff85bd89e2d8a24d88566d7e2f827c6b0d3d872b2cebf75371f93fcb1fe"),
- "24.14.1-darwin_amd64": ("node-v24.14.1-darwin-x64.tar.gz", "node-v24.14.1-darwin-x64", "2526230ad7d922be82d4fdb1e7ee1e84303e133e3b4b0ec4c2897ab31de0253d"),
- "24.14.1-linux_arm64": ("node-v24.14.1-linux-arm64.tar.xz", "node-v24.14.1-linux-arm64", "71e427e28b78846f201d4d5ecc30cb13d1508ca099ef3871889a1256c7d6f67e"),
- "24.14.1-linux_ppc64le": ("node-v24.14.1-linux-ppc64le.tar.xz", "node-v24.14.1-linux-ppc64le", "95bf0c8dbb73144edb79a57399f03c70af6995b78e1c632926e53e6404662ef5"),
- "24.14.1-linux_s390x": ("node-v24.14.1-linux-s390x.tar.xz", "node-v24.14.1-linux-s390x", "ed3bfbc0ff418b0ec4633f23d53a12a691717a34b041c3fbdb296c8774e5a98a"),
- "24.14.1-linux_amd64": ("node-v24.14.1-linux-x64.tar.xz", "node-v24.14.1-linux-x64", "84d38715d449447117d05c3e71acd78daa49d5b1bfa8aacf610303920c3322be"),
- "24.14.1-windows_amd64": ("node-v24.14.1-win-x64.zip", "node-v24.14.1-win-x64", "6e50ce5498c0cebc20fd39ab3ff5df836ed2f8a31aa093cecad8497cff126d70"),
-}
-
+# The node version is read from //:.nvmrc, the cross-tool convention file
+# also honored by nvm and CI -- Bazel and the yarn dev flow share one pin.
+# Versions unknown to the pinned rules_nodejs release are auto-fetched and
+# recorded in MODULE.bazel.lock (rules_nodejs >= 6.7.5).
node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node")
-node.toolchain(
- name = "nodejs",
- node_repositories = NODE_24_REPO,
- node_version = "24.14.1",
-)
-use_repo(node, "nodejs_toolchains")
-use_repo(node, "nodejs_darwin_arm64")
-use_repo(node, "nodejs_darwin_amd64")
-use_repo(node, "nodejs_linux_arm64")
-use_repo(node, "nodejs_linux_ppc64le")
-use_repo(node, "nodejs_linux_s390x")
-use_repo(node, "nodejs_linux_amd64")
-use_repo(node, "nodejs_windows_amd64")
-
-pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm")
-pnpm.pnpm(pnpm_version = "10.33.3")
-use_repo(pnpm, "pnpm")
+node.toolchain(node_version_from_nvmrc = "//:.nvmrc")
npm = use_extension("@aspect_rules_js//npm:extensions.bzl", "npm")
npm.npm_translate_lock(
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-ai-review-prompt-dark.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-ai-review-prompt-dark.png
index 7bbdc5b..436031d 100644
--- a/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-ai-review-prompt-dark.png
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-ai-review-prompt-dark.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-ai-review-prompt.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-ai-review-prompt.png
index ff592ae..9aca5a8 100644
--- a/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-ai-review-prompt.png
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-ai-review-prompt.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-chips-dark.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-chips-dark.png
index 782a764..1cd5d8d 100644
--- a/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-chips-dark.png
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-chips-dark.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-chips.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-chips.png
index 1368d3d..569b3bb 100644
--- a/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-chips.png
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-change-summary-with-chips.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-comment-thread-with-ai-disagree-dark.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-comment-thread-with-ai-disagree-dark.png
new file mode 100644
index 0000000..025d1be
--- /dev/null
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-comment-thread-with-ai-disagree-dark.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-comment-thread-with-ai-disagree.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-comment-thread-with-ai-disagree.png
new file mode 100644
index 0000000..7e1a2af
--- /dev/null
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-comment-thread-with-ai-disagree.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-left-dark.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-left-dark.png
new file mode 100644
index 0000000..0f4857e
--- /dev/null
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-left-dark.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-left.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-left.png
new file mode 100644
index 0000000..2464d3f
--- /dev/null
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-left.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-right-dark.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-right-dark.png
new file mode 100644
index 0000000..238c3fb
--- /dev/null
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-right-dark.png
Binary files differ
diff --git a/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-right.png b/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-right.png
new file mode 100644
index 0000000..ff32fb3
--- /dev/null
+++ b/polygerrit-ui/screenshots/Chromium/baseline/gr-content-with-sidebar-right.png
Binary files differ
diff --git a/polygerrit-ui/web-test-runner.config.mjs b/polygerrit-ui/web-test-runner.config.mjs
index d510213..c8f9632 100644
--- a/polygerrit-ui/web-test-runner.config.mjs
+++ b/polygerrit-ui/web-test-runner.config.mjs
@@ -9,7 +9,9 @@
import { playwrightLauncher } from '@web/test-runner-playwright';
const runUnderBazel = !!process.env['RUNFILES_DIR'];
-const diffThreshold = 0.01;
+// We set this to a non-zero value because of sub-pixel rendering noise that
+// can create false positives.
+const diffThreshold = .02;
function testRunnerHtmlFactory(prefix) {
return (testFramework) => `
@@ -59,7 +61,16 @@
const pathPrefix = runUnderBazel ? 'polygerrit-ui/' : '';
const testFiles = getArgValue('--test-files');
const runScreenshots = process.argv.includes('--run-screenshots');
-const rootDir = getArgValue('--root-dir') ?? `${path.resolve(process.cwd())}/`;
+// Under Bazel, module imports may resolve through runfile symlinks to
+// rules_js package stores. Both the runfiles tree and those stores are under
+// bazel-out/<config>/bin, so use that as the WTR root.
+function getBazelBinDir() {
+ const cwd = path.resolve(process.cwd()).replace(/\\/g, '/');
+ const match = cwd.match(/^(.*\/bazel-out\/[^/]+\/bin)(?:\/|$)/);
+ return `${match?.[1] ?? cwd}/`;
+}
+
+const rootDir = getArgValue('--root-dir') ?? getBazelBinDir();
const tsConfig = getArgValue('--ts-config') ?? `${pathPrefix}app/tsconfig.json`;
// When running screenshots, we serve from the root directory, so we need to
diff --git a/resources/com/google/gerrit/server/mail/RegisterNewEmailHtml.soy b/resources/com/google/gerrit/server/mail/RegisterNewEmailHtml.soy
index 20f9999..a485abd 100644
--- a/resources/com/google/gerrit/server/mail/RegisterNewEmailHtml.soy
+++ b/resources/com/google/gerrit/server/mail/RegisterNewEmailHtml.soy
@@ -31,7 +31,7 @@
<p>
- {$email.emailRegistrationLink}
+ <a href="{$email.emailRegistrationLink}">{$email.emailRegistrationLink}</a>
</p>
<p>
If you have received this mail in error, you do not need to take any
diff --git a/resources/com/google/gerrit/server/mime/mime-types.properties b/resources/com/google/gerrit/server/mime/mime-types.properties
index 66f21b9..f557cfd 100644
--- a/resources/com/google/gerrit/server/mime/mime-types.properties
+++ b/resources/com/google/gerrit/server/mime/mime-types.properties
@@ -244,6 +244,7 @@
svg = application/xml
svh = text/x-systemverilog
swift = text/x-swift
+tada = text/x-python
tcl = text/x-tcl
tex = text/x-latex
text = text/plain
diff --git a/tools/bazlets.MODULE.bazel b/tools/bazlets.MODULE.bazel
index 8bf405d..361d843 100644
--- a/tools/bazlets.MODULE.bazel
+++ b/tools/bazlets.MODULE.bazel
@@ -6,7 +6,7 @@
bazel_dep(name = "com_googlesource_gerrit_bazlets")
git_override(
module_name = "com_googlesource_gerrit_bazlets",
- commit = "2366eccc72aac1a966ef3446c98a80230a7b5d89",
+ commit = "4ff70fa7dd82619332affcbf608d673ba142f378",
remote = "https://gerrit.googlesource.com/bazlets",
)
@@ -18,5 +18,4 @@
gerrit_api_version(
name = "gerrit_api_version",
version = GERRIT_VERSION,
- visibility = ["//visibility:public"],
)
diff --git a/tools/deps.toml b/tools/deps.toml
index 6444daf..e500cd6 100644
--- a/tools/deps.toml
+++ b/tools/deps.toml
@@ -2,13 +2,13 @@
antlr = "3.5.2"
autoValueGson = "1.3.1"
bouncyCastle = "1.84"
-byteBuddy = "1.18.10"
+byteBuddy = "1.18.11"
caffeine = "2.9.2"
commonmark = "0.24.0"
gitiles = "1.6.0"
greenmail = "1.5.5"
httpcomp = "4.5.14"
-jetty = "12.1.10"
+jetty = "12.1.11"
mail = "1.6.0"
mime4j = "0.8.1"
ow2 = "9.9.1"
diff --git a/tools/node_tools/node_modules_licenses/BUILD b/tools/node_tools/node_modules_licenses/BUILD
index c9fb69a..3e33ff7 100644
--- a/tools/node_tools/node_modules_licenses/BUILD
+++ b/tools/node_tools/node_modules_licenses/BUILD
@@ -8,6 +8,7 @@
name = "licenses-map",
srcs = glob(["*.ts"]),
declaration = True,
+ transpiler = "tsc",
tsconfig = "tsconfig.json",
deps = [
"//tools/node_tools:node_modules",
diff --git a/tools/nongoogle.toml b/tools/nongoogle.toml
index 701c4bc..5af54f27 100644
--- a/tools/nongoogle.toml
+++ b/tools/nongoogle.toml
@@ -12,7 +12,7 @@
guice = "6.0.0"
lucene = "10.4.0"
slf4j = "2.0.18"
-sshd = "2.18.0"
+sshd = "2.19.0"
truth = "1.4.4"
[libraries]
@@ -52,7 +52,7 @@
mina-core = { module = "org.apache.mina:mina-core", version = "2.2.9" }
nekohtml = { module = "net.sourceforge.nekohtml:nekohtml", version = "1.9.10" }
openid-consumer = { module = "org.openid4java:openid4java", version = "1.0.0" }
-protobuf-java = { module = "com.google.protobuf:protobuf-java", version = "4.35.0" }
+protobuf-java = { module = "com.google.protobuf:protobuf-java", version = "4.35.1" }
soy = { module = "com.google.template:soy", version = "2024-01-30" }
sshd-mina = { module = "org.apache.sshd:sshd-mina", version.ref = "sshd" }
sshd-osgi = { module = "org.apache.sshd:sshd-osgi", version.ref = "sshd" }