blob: 8a027ee11b0a378078d33c9acbc1db3577788d6f [file] [view]
---
title: "Gerrit 3.13.x"
permalink: 3.13.html
hide_sidebar: true
hide_navtoggle: true
toc: true
---
Download: **[3.13.1](https://gerrit-releases.storage.googleapis.com/gerrit-3.13.1.war)**
| [3.13.0](https://gerrit-releases.storage.googleapis.com/gerrit-3.13.0.war)
Documentation: **[3.13.1](https://gerrit-documentation.storage.googleapis.com/Documentation/3.13.1/index.html)**
| [3.13.0](https://gerrit-documentation.storage.googleapis.com/Documentation/3.13.0/index.html)
## Release highlights
### Introducing Gerrit Flows
A flow is an automation rule on a change that triggers actions on the
change when the flow conditions become satisfied. For example, a flow
can be an automation rule that adds a reviewer to the change when the
change has been verified by the CI.
Flows can help to speed up the code review flow by automating actions,
e.g. instead of monitoring the change manually until it gets verified by
the CI and then manually adding a reviewer, the change owner may add a
flow on upload that adds the reviewer automatically as soon as the CI
verified the change.
Flows have stages, where the stages are only evaluated when all previous
stages have been satisfied. This allows users to define chains of
actions.
Conditions can be Gerrit conditions (e.g. _"is the change verified?"_) as
well as conditions in third-party tools (e.g. _"is the issue fixed?"_).
The same is true for actions, some actions may be Gerrit actions (e.g.
_"add a reviewer"_) but other actions may be actions in third-party tools
(e.g. _"close this issue"_).
Since organisations running Gerrit have different third-party tools that
they would like to integrate, the implementation of the flow service
is [pluggable through plugins](https://gerrit-documentation.storage.googleapis.com/Documentation/3.13.0/dev-plugins.html#flow-service).
Flow service implementations need to:
* handle the storage of flows (e.g. in a database)
* evaluate flows regularly (e.g. every minute) and trigger the flow
actions when conditions are satisfied
> **NOTE**: Gerrit Flows are experimental and available when the
> `UiFeature__show_flows_tab` flag is enabled.
### Delete groups
The Gerrit internal groups deletion functionality is now complete, with
the introduction of the delete button in the internal group details screen.
The backend support for removing groups was [introduced with v3.12](https://www.gerritcodereview.com/3.12.html#introduce-group-deletion-functionality)
however it wasn't usable end-to-end in Gerrit yet.
The ability to remove groups is enabled by:
- Set the [`groups.enableDeleteGroup`](https://gerrit-documentation.storage.googleapis.com/Documentation/3.13.0/config-gerrit.html#groups.enableDeleteGroup)
to `true`
- Enable the permissions to delete group as a _global capability_ on `All-Projects`
> **NOTE**: Groups cannot be deleted while they are referenced in projects ACLs.
### Submit Requirements and Labels screens
The Submit Requirements and Labels associated with a Project are now
accessible through two dedicated screens, which allows to list, create
or amend the current ones.
The screen uses brand-new REST API that also allows the full automation
of the listing, creation and edit of Submit Requirements and Labels
via scripting, simplifying the automation of Projects setup.
### Consistent change query results
Gerrit changes index may be temporarily out of synch with the underlying
repository due to the lack of transactionality between the storage
of the Git repository meta-data and the indexing process.
The misalignment between the index and the underlying Changes, or also
the presence of corrupted Change meta-data on the repository, may result
in an error screen as highlighted in [Issue 440670261](https://issues.gerritcodereview.com/issues/440670261).
Introduce the `is:consistent` predicate to validate each record
against the underlying repository, filtering out all the inconsistent
entries and compensating temporary misalignment between the index
and the repository.
> **NOTE**: Checking the consistency of each Change returned by the
> index is expensive, hence the introduction of a predicate to do it
> on demand and only when needed.
> An example scenario is the Change index healthcheck that expects at
> least one item to return a positive result upon query.
### OAuth bearer authentication
So far Gerrit only supported providing the OAuth token in the
`Authorization: Basic` header. However, that is not the way proposed
in the [OAuth2 RFC](https://www.rfc-editor.org/rfc/rfc6750#section-2.1),
which suggests the Authorization: Bearer header,
which is consequently used by most libraries.
This change adds support for using the Authorization: Bearer header.
Gerrit then fully relies on the username provided in the token.
### HTTP passwords replaced by auth-tokens
Move from long-lived HTTP passwords to time-limited authentication tokens
to improve security and manageability.
Tokens can be individually revoked, rotated, and scoped for specific use,
reducing the risk of credential leaks.
The [number of tokens per user](https://gerrit-documentation.storage.googleapis.com/Documentation/3.13.0/config-gerrit.html#auth.maxAuthTokensPerAccount)
can be limited for avoiding excessive slowdowns during authentication
due to the multiple token validation lookups.
The new authentication tokens can also be associated with a
[maximum lifetime](https://gerrit-documentation.storage.googleapis.com/Documentation/3.13.0/config-gerrit.html#auth.maxAuthTokenLifetime)
globally configured, for enforcing company policies on token expiration.
As part of this effort, the storage format for external IDs has been updated,
and passwords in external IDs are now deprecated and its support is flagged
for removal in future releases.
Gerrit administrators can use a new [offline migration tool](https://gerrit-documentation.storage.googleapis.com/Documentation/3.13.0/pgm-MigratePasswordsToTokens.html) for migrating all the HTTP passwords
into authentication tokens and therefore removing all references to the
deprecated HTTP password functionality.
### UI updates and improvements
* Several Polymer-based components were replaced with @material/web, as part
of the ongoing effort to remove Polymer in a future release.
* Plugins can now access `@material/web` components directly.
* The AI-assisted “generate prompt” feature has been enabled by default and no
longer hidden behind a feature flag.
* Creating changes is now easier and more prominent — users can create a new
change directly from the repository list.
* The mobile UI has been redesigned for improved navigation, and the search
bar has been refreshed for both mobile and desktop users.
* Reviewers and CCed users can be moved via drag-and-drop.
### Add scheduled reindexing of accounts
Add scheduled reindexing of accounts. Previously scheduling reindexing
was possible for Changes, Projects and Groups.
## Important Notes
### Schema and index changes
Gerrit schema version is unchanged. No reindex is needed.
### Offline upgrade
- Stop Gerrit
- Download the new `gerrit.war` and move it to `$GERRIT_SITE/bin`
- Extract all the plugins from `gerrit.war` and move the ones needed into `$GERRIT_SITE/plugins`
- Start Gerrit
### Online upgrade with zero-downtime
Gerrit v3.13.x supports zero-downtime upgrade from Gerrit v3.12 when configured
using
[high-availability](https://gerrit.googlesource.com/plugins/high-availability/+/refs/heads/master/README.md)
setup.
During the zero-downtime upgrade, Gerrit end-users will not experience any
outage or service disruption and will be able to perform any read/write Gerrit
operation seamlessly.
The zero-downtime upgrade process for high-availability setups
consists of the following steps ([demo](https://youtu.be/vK5qsb0W7q4)):
1. Have Gerrit servers running v3.12 in high-availability
configuration, healthy and able to handle the incoming traffic properly.
2. Set one of the Gerrit servers to unhealthy.
3. Shutdown the Gerrit server, update gerrit.war, plugins and libs to v3.13.x and start Gerrit again.
4. Verify that the Gerrit server is working properly (e.g. run automated smoke
tests) and then make it healthy again.
5. Ensure the Gerrit server is fully caught up with the events that happened while
it was down before directing traffic to it.
6. Repeat steps 2 to 5 for each of the remaining Gerrit servers.
### Downgrade
Downgrade to Gerrit v3.12 release is possible, but requires the following
manual steps:
1. Stop Gerrit
2. Rollback the gerrit.war and plugins to the previous v3.12 version
3. Start Gerrit
### Native packaging
Instructions on how to enable Gerrit native packages on Linux system
can be found [here](https://gitenterprise.me/2015/02/27/gerrit-2-10-rpm-and-debian-packages-available/).
The Docker-based distributions have been updated:
- AlmaLinux bumped to 9.6
- Ubuntu bumped to Eclipse Temurin 21.0.8_9-jdk-noble (24.04.3 LTS)
### Known issues
* [Issue 454695136](https://issues.gerritcodereview.com/issues/454695136)
Upgrade to new H2 v2 storage backend for persistent caches can cause corrupt
cache files upon forced JVM shutdown.
The new H2 library brings multi-threaded operations, but also [one critical
issue](https://github.com/h2database/h2database/issues/4083), reported on cache
files corruptions upon Gerrit ungracefully shutdowns.
## Breaking Changes
* [Change 499526](https://gerrit-review.googlesource.com/c/gerrit/+/499526),
[Change 499601](https://gerrit-review.googlesource.com/c/gerrit/+/499601)
Disallow setting deprecated label functions via REST, all new labels are
created as `NoOp` via REST API.
If a user attempts to create a label with a deprecated label function or
to update an existing label to a deprecated label function we reject the
request with `400 Bad Request`. Deprecated label functions should no longer be used and submit
requirements should be used instead.
When creating a new label via REST API, it is associated with the `NoOp`
function.
* [Change 488061](https://gerrit-review.googlesource.com/c/gerrit/+/488061):
Use full commit SHA1’s in file conflict markers.
* [Change 487442](https://gerrit-review.googlesource.com/c/gerrit/+/487442):
ChangeQueryBuilder#label: Reject using `user` and `group` args together.
Using the `user` and `group` args together is not supported. Currently
trying to use them together doesn't fail, but silently ignores the
`user` arg, which is bad. This is because both args result in setting
the `accounts` variable and when we process the `groups` arg the value
of `accounts` that has been set for the `user` arg gets overwritten.
This change may cause disruption to users. For example for projects that
have a submit requirement configured that uses `submittableIf =
label:Code-Review=MAX,user=non_uploader,group=myGroup` the submit
requirement currently passes if a `Code-Review=MAX` vote from a user of
the `myGroup` is present (but the `user=non_uploader` arg is ignored)
and with this change it will start failing (because the `user` and
`group` args cannot be used in conjunction).
* [Change 484723](https://gerrit-review.googlesource.com/c/gerrit/+/484723):
Allow project owners and admins to always see refs/meta/config.
Project owners, users that have the `Owner` access right on `refs/*`,
and administrators should always be able to see the `refs/meta/config'
branch.
* [Change 480721](https://gerrit-review.googlesource.com/c/gerrit/+/480721):
Disable the creation of new Prolog rules with `rules.allowNewRules` by default.
Prolog rules have been deprecated since Gerrit 3.6 but it was still
possible to create new ones in projects configuration.
From now on, the `rules.allowNewRules` is set to `false` therefore
new Prolog rules are blocked.
* [Change 480342](https://gerrit-review.googlesource.com/c/gerrit/+/480342):
Remove option auth.cookieSecure.
Do not allow to configure explicitly if the "secure" cookie attribute
should be set. Instead set the "secure" attribute automatically if the
request was done over a secure protocol (https). This prevents that
users can skip setting the "secure" cookie attribute when using
a secure protocol.
* [Change 465369](https://gerrit-review.googlesource.com/c/gerrit/+/465369):
Disable robot comments by default.
Change the default of the server config `enableRobotComments` from
`true` to `false`.
This change is part of generally deprecating robot comments (in favor
of checks). At the moment `enableRobotComments` can still be changed
to `true`, but support for robot comments will soon be entirely
removed.
* [Change 474301](https://gerrit-review.googlesource.com/c/gerrit/+/474301):
Remove Robot Comments from Gerrit UI.
* [Change 468102](https://gerrit-review.googlesource.com/c/gerrit/+/468102):
Remove feature of adding reviewers automatically from footers.
* [Change 480302](https://gerrit-review.googlesource.com/c/gerrit/+/480302):
Set default of SMTP connect and socket timeouts to 10 seconds.
* [Change 480301](https://gerrit-review.googlesource.com/c/gerrit/+/480301):
Set reasonable defaults for LDAP connect and read timeouts.
Set default of:
- ldap.connectTimeout to 10 seconds
- ldap.readTimeout to 1 minute
* [Change 480303](https://gerrit-review.googlesource.com/c/gerrit/+/480303):
Set a reasonable default `transfer.timeout` of 1 minute.
Do not wait indefinitely for a single network read or write but
timeout after a minute to allow other requests to make progress instead
of blocking a thread for a long time.
## New Features
* [Change 504121](https://gerrit-review.googlesource.com/c/gerrit/+/504121):
Added support for `jitter` configuration in periodic job scheduling to allow a
random delay to be added to the start time of periodic background jobs.
This is particularly useful in multi-primary setups, where multiple
instances of the same job may be scheduled to run at the same time,
leading to spikes in resource usage and potential conflicts. By
introducing a randomized delay, we ensure a more staggered and balanced
execution pattern across instances.
* [Change 502661](https://gerrit-review.googlesource.com/c/gerrit/+/502661):
EvaluateChangeQueryExpression: Add `use-index` option to evaluate against the index.
Evaluating expressions that require checking if the change is
submittable (e.g. "is:submittable") triggers executing the submit
requirements which can be expensive. This may be a problem when the
EvaluateChangeQueryExpression REST endpoint is used to evaluate flow
conditions (that often check if the change is submittable) because flow
conditions are evaluated very frequently (e.g. every minute).
If we evaluate the expression against the change state in the index
submit requirements don't need to be executed, since the submit
requirement results are stored in the index.
* [Change 500904](https://gerrit-review.googlesource.com/c/gerrit/+/500904):
Add `--queue` option to filter tasks by queue in show-queue.
* [Change 501361](https://gerrit-review.googlesource.com/c/gerrit/+/501361):
Support non_author/committer arg on label predicate in submit requirements.
Add new non_author and non_committer args for the label predicate that
work for submit requirement expressions as follows:
- "label:Code-Review=+2,user=non_author":
matches with the change if it has a Code-Review+2 vote on the latest
patchset from a Gerrit account that's not the author of the latest
patchset
- "label:Code-Review=+2,user=non_committer":
matches with the change if it has a Code-Review+2 vote on the latest
patchset from a Gerrit account that's not the committer of the latest
patchset
Checking for non author/committer votes may make sense when changes are
imported by service user.
Since the author/committer can be forged with the Forge Author/Committer
permission requiring a non-author/committer approval is not sufficient
to prevent self-approvals when this permission is assigned.
* [Change 500946](https://gerrit-review.googlesource.com/c/gerrit/+/500946):
Add a REST endpoint to evaluate whether a change matches a query expression.
The new REST endpoint allows to evaluate whether a change query
expression (e.g. "is:submittable label:Auto-Submit+1") matches a change.
This is useful to evaluate Gerrit flow expressions or to test submit
requirement expressions.
* [Change 498401](https://gerrit-review.googlesource.com/c/gerrit/+/498401):
Add option to toggle HTTP password fallback.
If all HTTP passwords were already migrated to authentication
tokens, Gerrit would still check the external IDs for HTTP
passwords. This added unnecessary costs.
Now, the fallback can be switched off using the
`auth.httpPasswordFallbackEnabled` option to avoid the additional
lookups.
* [Change 494604](https://gerrit-review.googlesource.com/c/gerrit/+/494604):
Add REST API endpoint to reduce auth token lifetime.
The REST API endpoint `POST /config/server/reduce.token.lifetime`
can be used to reduce the lifetime of existing tokens exceeding a given
limit.
* [Change 459866](https://gerrit-review.googlesource.com/c/gerrit/+/459866):
Allow to generate tokens with the set-account command.
* [Change 497803](https://gerrit-review.googlesource.com/c/gerrit/+/497803):
Add context option to the get-patch endpoint.
Introduce a new `--context` (or `-U`) parameter to the
`changes/{id}/revisions/{id}/patch` REST endpoint. This allows users to specify
the number of context lines to include in the generated patch file, similar
to the `git format-patch -U` command.
* [Change 497586](https://gerrit-review.googlesource.com/c/gerrit/+/497586):
CreateBranch: Add a source_ref input parameter.
Callers creating branches with a commit-id revision often know the ref
where that commit currently exists. Accepting it as an input provides
both a performance optimization (reachability and visibility are only
checked against that one ref) and a functional improvement since object
ids can now be discovered on refs outside of refs/heads/ and refs/tags/.
* [Change 497223](https://gerrit-review.googlesource.com/c/gerrit/+/497223):
Add work in progress to related changes rest api.
This is to allow making it easier to identify a change that has
work in progress set to true.
* [Change 496681](https://gerrit-review.googlesource.com/c/gerrit/+/496681):
Allow changing project config through review if project is READ_ONLY or HIDDEN.
* [Change 496303](https://gerrit-review.googlesource.com/c/gerrit/+/496303):
Added REST endpoint to list global labels.
Global labels can be added programmatically via the LabelType extension
point. Add a REST endpoint to list the global labels. This REST endpoint
could be used to query the global labels in order to show them in the
web UI (e.g. under `BROWSE` > `Server Info').
* [Change 496401](https://gerrit-review.googlesource.com/c/gerrit/+/496401):
Project label configuration changes can now be saved for review.
* [Change 495922](https://gerrit-review.googlesource.com/c/gerrit/+/495922):
Enable save for review on project config by default.
* [Change 495921](https://gerrit-review.googlesource.com/c/gerrit/+/495921):
Added extension point to add labels programmatically.
The new extension point can be used to define a global label
programmatically that applies to all projects (if overriding is
disallowed). This is useful for plugins that require a label, as they
don't need to rely on the administrators to configure the label
correctly (e.g. in All-Projects).
The new extension point is similar to the existing extension point that
allows to define a global submit requirement programatically.
* [Change 494661](https://gerrit-review.googlesource.com/c/gerrit/+/494661):
Add repo label management screen.
Project owners can now manage repository labels through a new `Labels'
screen in the repository settings.
* [Change 492104](https://gerrit-review.googlesource.com/c/gerrit/+/492104):
Add new REST API to delete list of changes in a single request.
API takes a list of ChangeId/ChangeNumber in the request body and try to
deletes the mentioned Changes and returns a response about the change deletions.
* [Change 492103](https://gerrit-review.googlesource.com/c/gerrit/+/492103):
Return the base that was used when performing a merge in ConflictsInfo.
Knowing the base is useful for tools that use the conflicts information
to support users with resolving conflicts.
* [Change 492781](https://gerrit-review.googlesource.com/c/gerrit/+/492781):
Change authors can now use the `Please Fix` button on check comments.
* [Change 465368](https://gerrit-review.googlesource.com/c/gerrit/+/465368):
Add notification about token expiry.
Users will get notified ~7d before their tokens expire and after
their token has expired. These emails are being sent by a daily
run background task.
* [Change 464601](https://gerrit-review.googlesource.com/c/gerrit/+/464601):
Add REST API to migrate HTTP passwords to tokens.
So far, HTTP passwords could only be migrated offline or by each user
regenerating their tokens.
This change adds a REST API to migrate all HTTP passwords to tokens.
This will add the existing token with an optional default lifetime
to the user's ref and afterwards delete all passwords from the
external IDs.
* [Change 456342](https://gerrit-review.googlesource.com/c/gerrit/+/456342):
Use dedicated cache for HTTP passwords / tokens.
The new token cache will only be enabled, if the
option `auth.gitBasicAuthPolicy` is either `HTTP` or
`HTTP_LDAP`. Otherwise, tokens can still be accessed
directly in notedb. However, note that the tokens will
not be used for authentication in that case.
* [Change 457041](https://gerrit-review.googlesource.com/c/gerrit/+/457041):
Implement support for authentication tokens.
This change adds the new notedb schema version that supports tokens.
These tokens are stored in a file `tokens.config` in the user's ref in
All-Users. They are stored in git config format:
```
[token "some-token-id"]
hash = bcrypt0:4:....
```
This change also adds REST API endpoints to create, list and delete
tokens.
* [Change 489321](https://gerrit-review.googlesource.com/c/gerrit/+/489321):
Don't try to generate prompt for merge changes.
Gerrit's GetPatch REST API does not support revisions with more
than one parent. This caused an error, when the "Help me review"
feature is enabled and a merge change is opened in the UI.
To improve the user experience, no prompt will be generated for
merge changes. Instead a message informing the user that this
scenario is not yet supported will be shown.
* [Change 483644](https://gerrit-review.googlesource.com/c/gerrit/+/483644):
Expose setNoLimit method from the InternalQuery API.
Set noLimit from the queryChangesInIndex in the AllChangesIndexer class.
This has an effect that, when paging through index query results, every
next page size is multiplied by the factor of 10. For large result sets
this should bring significant performance improvements. For example: for
a result set of 100K entries:
- without this change we would get 100K/500 = 200 pages
- with this change we would get 4 pages: 500, 5000, 50000, 44500
* [Change 481052](https://gerrit-review.googlesource.com/c/gerrit/+/481052):
Add before change action event.
This allows plugins to add additional checks before code approval
actions.
* [Change 482922](https://gerrit-review.googlesource.com/c/gerrit/+/482922):
Add an option to the Create Project REST endpoint to redo the project init.
ProjectCreator first creates the repository, then it initializes the
project.
The project initialization consists out of setting `HEAD`, creating the
`project.config` file in `refs/meta/config` and creating initial
branches with empty commits.
This change adds a new `init_only` option to the Create Project REST
endpoint that allows to redo only the project initialization. This does
not override any existing project configuration. If a conflicting
configuration already exists the request is rejected with `409
Conflict'.
In particular this means that this cannot be used to:
- reset HEAD
- reset the project.config
- create additional branches
This is important to prevent misuse, e.g. attempts to do no non-reviewed
updates on existing projects.
* [Change 481026](https://gerrit-review.googlesource.com/c/gerrit/+/481026):
Add a REST API for flows.
This change adds REST endpoints for creating, getting, listing and
deleting flows.
Which permissions are required for creating, seeing and deleting flows
depends on the flow service implementation.
If no flow service is bound (i.e. if no plugin that provides a flow
service is installed) the flow REST endpoints return `405 Method Not
Allowed'.
* [Change 473141](https://gerrit-review.googlesource.com/c/gerrit/+/473141):
Support creating a branch on an initial empty commit from the web UI.
Add a new field to the Create Branch dialog for creating a branch on an
initial empty commit.
* [Change 465861](https://gerrit-review.googlesource.com/c/gerrit/+/465861):
Add an extension point to validate push options.
Allow plugins to validate push options. For example, to reject options
(or a combination of options) or to emit a warning when a deprecated
option is being used.
* [Change 473825](https://gerrit-review.googlesource.com/c/gerrit/+/473825):
Support showing all labels in change list.
Configured using:
```
[dashboard]
showAllLabels = true
```
If set, all the applicable labels for the currently shown changes is
displayed in the change list view, even ones that are not considered
submit requirements.
* [Change 475821](https://gerrit-review.googlesource.com/c/gerrit/+/475821):
Allow to configure server-wide defaults for boolean project configs.
Admins can set global defaults in gerrit.config (true/false) or enforce them with `forced',
overriding project-level settings.
This allows consistent defaults and enables enforcing options such as
rejecting implicit merges across all projects.
## Performance improvements
* [Change 494961](https://gerrit-review.googlesource.com/c/gerrit/+/494961):
Speed up parent data computation.
What makes the parent data computation slow is checking whether the
commit is merged into the target branch. If we have a change for the
parent commit we can just skip this computation and instead check
whether the status of the parent change is merged.
* [Change 473823](https://gerrit-review.googlesource.com/c/gerrit/+/473823):
Make updating disk caches during offline reindexing optional.
Add a read-only H2 cache store that can optionally
be used during offline reindexing. Using that, values will still
be cached in memory, but the persisted caches will not be updated
and only read from.
* [Change 506123](https://gerrit-review.googlesource.com/c/gerrit/+/506123):
Persist changes_by_project cache to disk.
changes_by_project cache now stores its data in a serialized format on disk,
reducing the need to rebuild the cache after server restarts, minimizing
cache warm-up times and improving runtime performance.
## Bug fixes
* [Change 472506](https://gerrit-review.googlesource.com/c/gerrit/+/472506):
Remove orphan index-only entries without an underlying Change after (re)index
with `--reuse` option
Reindexing with the `--reuse` option may result in having orphan index entries
for which changes do not exist anymore. This change adds index cleanup
step which is performed after reindexing is done, so that the orphan
entries are cleaned up.
* [Change 512587](https://gerrit-review.googlesource.com/c/gerrit/+/512587):
Fix shutdown of executor persisting cache updates in background thread.
* [Change 512503](https://gerrit-review.googlesource.com/c/gerrit/+/512503):
Don't close h2 database when last connection is closed.
* [Change 512281](https://gerrit-review.googlesource.com/c/gerrit/+/512281):
Explicitly shutdown h2 database when SqlStore is closed.
* [Issue 446722017](https://issues.gerritcodereview.com/issues/446722017)
[Change 512122](https://gerrit-review.googlesource.com/c/gerrit/+/512122):
Create h2 schema only once when SqlStore is created.
* [Issue 446941362](https://issues.gerritcodereview.com/issues/446941362)
[Change 512541](https://gerrit-review.googlesource.com/c/gerrit/+/512502):
Fixed git-upload-pack errors on replicas by skipping unloadable changes.
* [Change 510885](https://gerrit-review.googlesource.com/c/gerrit/+/510885):
Fixed changes_by_project cache to handle private changes with no reviewers.
* [Change 509082](https://gerrit-review.googlesource.com/c/gerrit/+/509082):
Schedule configs with invalid time units now cause scheduling failures instead
of using a default value.
* [Change 470262](https://gerrit-review.googlesource.com/c/gerrit/+/470262):
Fixed docs to reflect assets under /static/ are cached at most 15 minutes.
* [Issue 375097838](https://issues.gerritcodereview.com/issues/375097838)
[Change 479024](https://gerrit-review.googlesource.com/c/gerrit/+/479024):
Avoid pass-by-reference of hashtags.
This change resolves a bug where hashtags from a previous change
were being incorrectly propagated to new changes in the same
series during a push.
* [Change 463421](https://gerrit-review.googlesource.com/c/gerrit/+/463421):
GitFileDiffCacheImpl: cancel tasks failing due to timeout or interrupt.
This avoids the task continues consuming resources unnecessarily. This
may help to avoid unnecessary computations and return the thread
executing the task earlier to the ExecutorService where it can be used
to schedule other tasks waiting for an execution thread.
## Frontend changes
* [Change 502622](https://gerrit-review.googlesource.com/c/gerrit/+/502622):
Added auto-complete for hasfooter search operator.
See [documentation](https://gerrit-review.googlesource.com/Documentation/user-search.html#hasfooter-operator).
* [Change 486462](https://gerrit-review.googlesource.com/c/gerrit/+/486462):
Switch @webcomponents/webcomponentsjs to use the loader.
This change improves frontend performance by loading only the necessary polyfills
for browsers that require them, reducing unnecessary overhead on the browser.
* [Change 511306](https://gerrit-review.googlesource.com/c/gerrit/+/511306):
Fix bug with deleting permissions in handleAddedPermissionRemoved.
This bug occurred for example if you add Delete Own Changes and
Delete Changes. When you click remove on Delete Own Changes, it
would delete both Delete Own Changes and Delete Changes but on the
later, it would add a undo button.
Now the undo button should only be shown if the permission was saved
previously, and also Delete Changes shouldn't have been deleted as
you didn't click the remove button on that.
* [Issue 397701289](https://issues.gerritcodereview.com/issues/397701289)
[Change 509464](https://gerrit-review.googlesource.com/c/gerrit/+/509464):
Notify reviewers and watchers on change edit in UI.
Previously email notifications weren't sent.
* [Change 488077](https://gerrit-review.googlesource.com/c/gerrit/+/488077):
Support creating symlinks in change edits.
A symlink is a special type of file that acts as a shortcut, pointing to
another file or directory.
There is no content validation for symlinks, i.e. we do not validate
that the content of the symlink file is a file path (JGit accepts any
content).
* [Change 488365](https://gerrit-review.googlesource.com/c/gerrit/+/488365):
Copy conflict information when commit message is updated.
The Set Commit Message REST endpoint updates the commit message by
amending the patch set commit. If the patch set commit was created by
performing a merge (e.g. a merge commit, a cherry-pick commit or a
rebased commit) and contains conflicts, the conflicts are preserved and
the conflicts information is still accurate. Hence we should copy it
over to the new patch set.
This is important if tools rely on the conflicts information to support
users with resolving them.
* [Change 471081](https://gerrit-review.googlesource.com/c/gerrit/+/471081):
Enable keyboard shortcut for download dialog up to 9.
* [Change 463141](https://gerrit-review.googlesource.com/c/gerrit/+/463141):
Allow opening edit preference in editor view.
* [Change 471481](https://gerrit-review.googlesource.com/c/gerrit/+/471481):
Add plugin api to add custom emojis.
* [Change 478021](https://gerrit-review.googlesource.com/c/gerrit/+/478021):
Add Copy-to-Clipboard for Patch File.
This change introduces a "Copy to Clipboard" button in the download
dialog for patch files. Users can now directly copy the raw diff
content to their clipboard without needing to download the patch file
first.
* [Change 522121](https://gerrit-review.googlesource.com/522121):
`gr-change-list-item`: Fix issue with text not truncating on mobile for subject.
Resolved a display issue where long subject lines in the change list were not properly truncated
on mobile devices.
* [Change 522141](https://gerrit-review.googlesource.com/522141):
`gr-change-view`: Fix issue with subject going out of screen.
Fixed a UI issue where long change subjects could extend beyond the visible screen area in the
change view.
## Other Changes
* [Change 499144](https://gerrit-review.googlesource.com/c/gerrit/+/499144):
Fixed git-push-review python3 with shebang line update.
* [Change 462243](https://gerrit-review.googlesource.com/c/gerrit/+/462243):
Add tool to adapt auth token lifetime to lower max lifetime.
## Documentation changes
* [Change 502621](https://gerrit-review.googlesource.com/c/gerrit/+/502621):
Document and test that footer keys with underscore cannot be matched.
* [Change 500401](https://gerrit-review.googlesource.com/c/gerrit/+/500401):
Clarify that Gerrit HTTP passwords are limited to 71 chars.
* [Change 498459](https://gerrit-review.googlesource.com/c/gerrit/+/498459):
Add note about legacy HTTP password in account to UI.
## Plugin changes
* [Change 475523](https://gerrit-review.googlesource.com/c/gerrit/+/475523):
Update CodeMirror.
codemirror/view contains a fix for the [highlight of trailing spaces](https://discuss.codemirror.net/t/bug-with-highlighttrailingwhitespace-and-entering-a-new-line-and-pressing-command-z/9213).
Updates the following:
* @codemirror/commands -> 6.8.1
* @codemirror/lang-javascript -> 6.2.4
* @codemirror/lang-python -> 6.2.1
* @codemirror/language -> 6.11.0
* @codemirror/legacy-modes -> 6.5.1
* @codemirror/lint -> 6.8.5
* @codemirror/search -> 6.5.11
* @codemirror/view -> 6.36.8
## JGit Changes
* Update JGit to bb30974
```shell
$ git log --oneline --no-merges 7a46fa6f8...bb30974
```
Notable changes are:
- e3ec1e57c `[ssh]` Fix order of keys in pubkey auth if an agent is used
- 008955d57 Update bytebuddy to 1.17.8
- 87337f302 Update jetty to 12.1.2
- ed0f86af0 DfsPackCompactor: Move #autoAdd to the tests (its only caller)
- c29026355 DfsPackFileMidx: add #getAllCoveredPacks() method
- fab22a4a2 DfsGarbageCollector: handle pack lists with multipack indexes
- 89823f0f9 DfsPackFileMidx: Return bitmap from any underlying pack
- 3ec94f2d3 midx: caller chooses the order of packs in the midx
- dac4c985a DfsObjDatabase: make #setUseMultipackIndex public
- 5b3757ed5 DfsObjDatabase: make useMultipackIndex getter/setter protected
- ee5bfa014 DfsObjDatabase: introduce multipack index
- 8e9d7ae9b Update jna to 5.18.1
- 317efecb1 DfsPackFileMidx: getters for the midx covered packs and base
- 0e2176ecf DfsPackFileMidx: support a chain of multi-pack indexes
- b2160eb4f DfsPackFileMidx: A packfile using the multipack index
- 0795b926b Silence API error for constant CoreConfig.DEFAULT_MULTIPACK_INDEX_ENABLE
- 2bba95d78 Update jetty to 12.1.1
- 07dc33fb0 Update bouncycastle to 1.82
- 1ac94c881 Update org.assertj:assertj-core to 3.27.6
- 665089f0b Update org.apache.commons:commons-lang3 to 3.19.0
- 99377fc6e Update jna to 5.18.0
- de78e4d05 Update com.google.code.gson:gson to 2.13.2
- fc18af059 ConfigConstants: Add constant for multipack index
- ebc179fa1 Support unshallow request in Boundary/TopoSortGenerators
- a5a1c87e2 Make UNSHALLOW a globally available static RevFlag
- 1f4a13450 DfsPackDescription: make covered packs non-null
- d5b6962cf Disable BOUNDARY and TOPO sort for unshallow fetches
- 7739cddc4 IndexDiffWithSymlinkTest: Java 20+ stores NFC, not NFD
- 9a748158b DfsPackDescription: Add fields for multipack index
- 3f5de671a Fix NPE when calling `GC.prune(Set<ObjectId>)`
- 3caa6d233 MultiPackIndex.resolve: handle correctly last object
- ba209b9ae MultiPackIndexWriter: report also object count and ordered packs
- acd1eff8b PendingGenerator: drop only buffers loaded in the generator
- 8fd4cf3de Do not include 3rd party dependencies in features
- e109bad94 Ensure pack files are closed after git.close()
- 2b64b5c6f WindowCursor: honor pack.useObjectSizeIndex
- 6ebd2f5d7 Prevent CommitGraphWriter.write() from closing its stream
- 1c0df9426 Make CancellableDigestOutputStream extend FilterOutputStream
- 5155683dc Shortcut PackWriter reuse selection when possible
- a762badfc SmartHttpFetchConnection: suppress errors on close()
- 01123ee70 Mark Git(Repository repo, boolean closeRepo) public
- ee304e465 Use volatiles for bitmap and revIndex in Pack
- 37d1a65f0 Fix performance regression in Pack.idx()
- d9aba160b Use representation from LocalObjectToPack if possible
- 6c8d6e299 Avoid conditional in LocalObjectRepresentation.wasDeltaAttempted
- ca6d673d5 Use chunked encoding when uploading LFS objects
- c86cdcb96 WindowCursor: Use the object size index when possible
- a673f022a GC: Write object size index if config says so
- d9ac2f31e ObjectDirectoryPackParser: Write object-size index with the pack
- 8929300aa PackInserter: write object-size index with the pack
- 427af1262 Pack: getter for the indexed object size (when available)
- 896d07370 AmazonS3: Do not accept DOCTYPE and entities
- 8d30b5a75 ManifestParser: Do not accept DOCTYPE and entities
- 518cc54f8 AdvertisedRequestValidator: fix WantNotValidException caused by race
- c3f354edc Lock reftable auto-refresh to ensure consistency
- 7c7f7d32e MultiPackIndexLoader: Add NON-NLS annotation to message
- 9fb0c4fca ChangedPathFilter: Suppress nls warnings in toString
- 3f3f3b5a6 Fix: Close the "preserved" PackDirectory
- 1c7289509 Use the same ordering/locking in delete() as C git
- 3e0eedc57 AmazonS3: Do not accept DOCTYPE and entities
- 07d00f6df ManifestParser: Do not accept DOCTYPE and entities
- 98494cd1a FS.getFileStoreAttributes: cancel failed task executed asynchronously
- dab4f52d4 ManifestParser: Do not accept DOCTYPE and entities
- 4919c2b70 FileReftableStack: ensure new reftable files aren't missed on NFS
- f96e5e3b4 Encapsulate layout of reftable stack in FileReftableStack
- 43d3bc6d6 PlotWalk: Replace call to deprecated method in PersonIdent
## Other dependency changes
* Update Update h2 to 2.4.240
* Update lucene to 10.2.2
* Update guava to 33.4.8-jre
* Update Apache mina-core to 2.2.4
* Update apache sshd to 2.16.0
* Update lit to ^3.3.1
* Upgrade ICU4J to 77.1
* Update typescript to 5.8.3
* Upgrade eslint to 9.26.0
## Bugfix releases
### 3.13.1
* Bug Fixes
* [Issue 459326231](https://issues.gerritcodereview.com/issues/459326231):
Generate ref-update events upon the addition of new auth tokens.
Previously, generating a new authentication token did not emit a ref-update event, meaning other
nodes in the Gerrit cluster, such as replicas or additional primaries, were not notified of the
updated user ref, leaving nodes out of sync.
* [Issue 459059302](https://issues.gerritcodereview.com/issues/459059302):
Reduce unnecessary data loading when opening the rebase dialog.
Previously, opening the rebase dialog triggered a backend query that fetched the `450` most
recent `open` changes across all projects, resulting in large JSON payloads and slow loading,
even though only changes from the same project are relevant for rebasing. The autocompletion
query now restricts results to the current project, significantly reducing the data returned and
ensuring the suggestions are both smaller and more relevant.
* [Change 526701](https://gerrit-review.googlesource.com/526701):
Prevent NPE when merging rewritten modified files.
Fixed an issue where Gerrit could throw a `NullPointerException` when preparing the list of
modified files for display in a diff. This affected cases where a file was rewritten between
patchsets.
* UI Fixes
* [Change 526682](https://gerrit-review.googlesource.com/526682):
Fix issue with sidebar not closing if you click on account dropdown.
Resolved an issue where tapping the account dropdown in the header failed to close the sidebar
on mobile or narrow layouts. The dropdown now properly triggers the closing behavior, ensuring
the sidebar collapses as expected and avoiding UI elements overlapping or staying open
unintentionally.
* Enhancements
* [Change 526023](https://gerrit-review.googlesource.com/526023):
Log performance summaries automatically for slow requests.
Previously, performance summaries were only logged when tracing was explicitly enabled, making
slow requests difficult to diagnose unless the problem could be reproduced with tracing turned on.
Gerrit now logs a warning-level performance summary automatically when a request exceeds a
configurable slow-request threshold, helping administrators identify which operations contributed
to the slowdown without extra instrumentation. The threshold can be tuned via the
`performance.slowRequestThreshold` setting in `gerrit.config` (default: `30 seconds`).