Download: NOT RELEASED YET

Documentation: NOT AVAILABLE YET

Release highlights

Review Agent (AI Chat)

The AI-assisted code review, formerly known as “AI Chat”, has been promoted to a new identity as the “Review Agent” and is enabled by default when implemented by an AiCodeReviewProvider plugin.

The Review Agent helps to understand, summarize and review a change, through a convenient chat-like interface in the change screen.

The Change Screen includes a brand-new AI-powered chat panel sidebar, allowing users to interact with a review assistant, ask questions, and use predefined actions. This includes a splash page, conversation history, and message rendering.

The AI-powered chat panel also includes a “copy” button for incorporating the suggestions into the Gerrit review change screen and is able to discover and properly render the citation from other parts of the code.

The Review Agent supports multiple pluggable modules; the user can select which model to use in the AI-powered chat in the user’s preferences panel.

NOTE: Private changes should not be disclosed, therefore the Review Agent is disabled and no content is going to be shared with the AI model.

The AI model can also expose custom actions, which are going to be rendered by Gerrit in the “AI Chat” sidebar.

To enable the “Review Agent” panel, install one plugin that implements the Gerrit’s AiCodeReviewProvider (e.g. GerritForge’s ai-review-agent-gemini) and enable the “AI Chat” experiment in gerrit.config:

[experiments]
  enabled = UiFeature__enable_ai_chat

WebUI Modernization

The WebUI has been improved by removing all the legacy Polymer dependencies on paper- and iron- components. The overall user experience is now more consistent with the new Material Design 3 guidelines.

Gerrit Flows

The Gerrit Flows interface for creating flows has been redesigned, including a collapsible “Guided Builder” and improved validation logic.

A new REST API for flows has been added, allowing for programmatic creation, inspection, and deletion of automation flows on changes.

Access to the Gerrit Flows is restricted to the uploader of the Change and totally disabled if there isn’t a registered FlowService or if the service is disabled for the Change, without requiring any feature flag anymore.

Searching Changes

A new reviewercount search operator has been added to the change index, allowing to search for changes based on the number of reviewers.

Example: reviewercount:0 will return all changes with no reviewers.

Indexing

Change 534881 introduced the ability to flushed the indexes explicitly with a new REST endpoint (POST /config/indexes/<index>/flush) which assures that all the updates to the indeces data has been stored and flushed to disk. This functionality enables a transactional shutdown of Gerrit without the risk of having index inconsistencies.

Administration & Configuration

New configuration settings for introducing limits and constraints to user’s when reviewing changes.

  • Comment Limits

    Introduced a new change.maxCommentsPerUser to limit the number of comments a single user can post on a single change, regardless of the number of patch sets.

  • Commit Footers

    Change 536961 added change.addChangeReviewFootersToCommitMessage config to control if review footers (e.g., Reviewed-by) are added to the commit message on submit (Cherry Pick/Rebase Always).

  • Root PWA

    Added the ability to customize the root manifest file with the manifest.webmanifest in gerrit.config.

Improved User Experience

Gerrit UX has been improved for easier navigation on both desktop and mobile.

Sticky Headers

The page headers are now sticky on change-view and diff-view, allowing a direct access to the change’s action even when scrolling down on the page.

The top-menu bar remains also sticky in all pages in Desktop view, while on Mobile view the side-bar is always accessible.

Miscellaneous

  • Show Deleted User instead of Name of user not added for deleted accounts, for improved clarity.

  • Hide the bulk action checkbox until all changes are loaded.

Performance Improvements

Gerrit includes a significant number of performance improvement that makes the navigation and use of the UX smoother and more responsive.

Also the overall system load created by the Gerrit process is lower compared to the previous version, compared to the same level of incoming user traffic and machine specs.

Asynchronous change indexing for users

Change indexing for regular users is now asynchronous by default. This means that the user actions that trigger a reindexing, such as pushing a change or posting a review, will now return immediately without waiting for the indexing to complete.

This should improve the user experience, especially on busy servers, as users will not have to wait for the indexing to complete before they can continue with their work.

Submit Requirements

The computation of diff stats is now skipped altogether when computing SRs (Submit Requirements), giving a much better end-user latency of the change screen.

The evaluation of SRs is much faster thanks to the skipping of the file diffs when using “file” or “dir” predicates. [306584e9c3]

Parallel Dashboard Requests

Dashboards are composed concurrently by making parallel requests for each individual section, making the overall rendering much faster and responsive.

Reverted Changes and Submissions

Previously, the reverted changes and submissions were pointing to the original changes using search queries URLs, which were potentially causing significant system load.

Now, reverted changes contain a direct link to the original changes avoiding an expensive Change index lookup.

Client-Side Speedup

For changes containing many files, the scanning of all files array caused a significant main thread blocking, negatively impacting the user experience. The patch change calculation is now memoized reducing the main thread blocking.

The optimized file list rendering (memoization) has reduced the “Expand All Diffs” latency by ~29% (Avg) and ~50% (p99).

The rebase dialog opens up immediately without delays thanks to the additional restrictions on the Changes query by project name.

Performance Metrics & Performance Tracking

There are new metrics and timers for tracking the performance executions of some critical operations.

  • Added a new metric receivecommits/latency_for_scheduling for tracking the delay in scheduling a receive-pack execution into the ReceiveCommits thread pool.

  • Added user kind (SERVICE_USER or HUMAN_USER) to push and REST API latency metrics to enable tracking perceived performance by interactive users vs. the jobs and robots.

  • Included callers in the performance summary log, simplifying troubleshooting of performance issues and bottlenecks of incoming requests.

Important Notes

Schema and index changes

Gerrit schema version is unchanged.

The Changes index has been upgraded from v87 to v88 and requires a full reindex to populate the new reviewercount field.

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
  • Run the full reindex: java -jar $GERRIT_SITE/bin/gerrit.war reindex --index changes -d $GERRIT_SITE
  • Start Gerrit

Online upgrade with zero-downtime

Gerrit v3.14.x supports zero-downtime upgrade from Gerrit v3.13 when configured using a high-availability 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):

  1. Have Gerrit servers running v3.13 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.14.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 6 for each of the remaining Gerrit servers.

Breaking Changes

  • Change 534063 Disallow returning 500 via Response.withStatusCode

    REST endpoints should throw an exception to indicate an internal server error. RestApiServlet takes care to catch the exception and to return a ‘500 Internal Server Error’ response for it.

    Returning 500 via Response.withStatusCode also works but messes up the error metric. If no exception is thrown, then we can’t log an exception as the cause in the error metric.

    This change requires plugin developers to correctly adapt their REST endpoints in case it returns 500.

Permissions & Security Changes

  • The project configuration changes now require to have a contributor agreement in place, if configured.

New Features

  • Change 520401, Change 515123: Add new plugin events BEFORE_COMMIT_MSG_EDIT and BEFORE_PUBLISH_EDIT, allowing plugins to add validation hooks before a change’s commit message is edited and before a change edit is published.

  • Change 518701: Allow configuring the SameSite attribute for Gerrit’s authentication cookie via the httpd.sameSite setting in gerrit.config.

  • Change 521101: Add a new REST endpoint to get a single revision by its commit ID, avoiding the need to fetch all revisions for a change when only one is needed.

  • Change 512884: Add new REST endpoints to migrate legacy label functions to submit requirements, either directly or by creating a review change for the migration.

Bug fixes

  • Issue 440670261 Change 517921: The change query REST API now consistently returns submittable: false for changes that are already merged or abandoned.

  • Change 526661: Add a null check to prevent a NullPointerException in DiffUtil.mergeRewrittenModifiedFiles when processing file modifications.

  • Change 517641: Fix a bug in the access rights screen where deleting a permission rule could fail due to incorrect DOM node reuse by the underlying UI framework.

Frontend changes

  • Change 527486: Complete the removal of all paper-* and iron-* legacy Polymer component dependencies from the project.

  • Change 527482: Remove the deprecated AttributeHelper Plugin API as part of the Polymer removal effort.

  • Change 527161: Remove the legacy and obsolete gr-css-mixins styling helpers.

  • Change 523801, Change 521743: Fix UI display issues on smaller screens where long subject lines in change lists and change headers would not wrap correctly and overflow the viewable area.

  • Change 526621: Dynamically update the header height using ResizeObservers, allowing for more flexible layouts and ensuring components like the Review Agent panel are positioned correctly.

  • Change 538743: Ensure that context items from Review Agent splash page actions are correctly passed to the chat model, and prevent the page’s current context (e.g. open file) from being implicitly included.

  • Change 522122: Fix a bug on mobile layouts where the main sidebar would fail to close after tapping the account dropdown in the header.

Documentation changes

  • Change 538741: Document that at Google querying changes uses stale reads for non-service users.

  • Change 542021: Document necessity of using http.saveCookies.

  • Change 540601: Update labels documentation.

  • Change 549601: Clarify that plugins can define a Gerrit-ApiModule for exposing API that can be used by other plugins.

  • Issue 477829703: Clarify server-side deadline semantics in documentation and potential gotchas.

  • Change 545001: Improve the GEMINI.md documentation for giving more context to AI on how to validate changes and give more hints about the Gerrit architecture.

  • Change 517483: Simplify the Gerrit release process using the latest automation enhancements with the adoption of JReleaser.

Plugin changes

Delete Project plugin

  • Issue 456214601: Refactor the way trash folders are processed and avoid the system overload upon Gerrit start.

    The deletion of the trash folders was executed using an unmanaged thread which was not visible to the Gerrit admins in the list of tasks and was generating a huge system overload upon Gerrit startup.

    The overall archive and cleanup of the trash folder is now controlled by configuration, using the new settins deleteTrashFolderStartTime, deleteTrashFolderInterval and deleteTrashFolderJitter.

    The time spent for the trash folder cleanup can also be limited with a new specific configuration setting deleteTrashFoldersMaxAllowedTime.

JGit Changes

  $ git log --oneline --no-merges bb309748c..4e67a2306

Notable changes are:

  • 5a7e9db01 Consume rbe_autoconfig as bazel module
  • ad382b204 MODULE.bazel: Move dependencies from WORKSPACE to bazel modules
  • d0a524206 Do not always refresh packed-refs during ref updates
  • 90feb21a5 MidxPackList: Methods to find the top midx and uncovered packs
  • 8b23132d5 Avoid reading packed-refs concurrently sometimes
  • 240022be2 LfsPrePushHook: recognize 201 as successful response from LFS server
  • a678a5bc2 Refine time unit parsing to throw exception on invalid values
  • 82204b94d PackList: keep the list of unused midxs
  • d10e75c68 InterruptTimer: don’t use Yoda-style condition
  • b0c0a556a InterruptTimer: avoid expensive notify when begin is soon after end
  • c6c971a36 InterruptTimer: avoid unneeded notify for end()
  • dd4a19442 DfsObjDatabase: read reftables from midx covered packs
  • 3e3f18385 Fix signed push failing when using push options
  • fb3d422b3 DfsReader/PackFile: Move bitmap inclusion check to the packfile
  • 114668777 Use generic Map interface in signature of internal API methods
  • d3429a62a Allow to discover bitmap on disk created after the packfile
  • 4dccc412e MidxPackList: Helper to get packs/midx and overlaps between them

Other dependency changes

Community

Welcome to our new contributors

Welcome to the new contributors that had their first patch merged in 3.14.0:

  • Jussi Karhu
  • Manuel Stahl
  • Piotr Szlazak
  • Robert Dazi
  • Wyatt Hepler

Thank you for your contributions!