We have shared GerritForge’s goals for improving Gerrit in 2022: most of them will include significant contributions to JGit, the Java-based engine powering Gerrit Code Review’s support for Git data-format and protocol.
GerritForge will contribute many more changes to JGit during 2022, all focused on improving the functionality and performance of large mono-repos. All changes will go through the formal review through Eclipse Foundation’s JGit Gerrit Project.
Lack of knowledge and reviews
The JGit project has suffered from major losses in the past few years, which is clearly shown by the list of top-contributors vs. their recent 12 months activity. I have tried running a “git blame” against all the JGit code-base, which is a heuristic (therefore a rough approximation) of which part of the JGit code has been last written/edited.
- (49998 LOC) – Shawn Pearce
- (37854 LOC) – Thomas Wolf
- (31417 LOC) – Matthias Sohn
- (13593 LOC) – David Pursehouse
- (13200 LOC) – Christian Halstrick
See below the number of contributions (excluding merges and trivial changes) of the above 5 maintainers in the past 12 months:
- Shawn Pearce – 0 changes – He sadly passed away in 2018
- Thomas Wolf – 86 changes
- Matthias Sohn – 128 changes
- David PurseHouse – 0 changes
- Christian Halstrick – 0 changes
The above stats show that the currently active maintainers (Thomas and Matthias) appear in the bit blame of 69k out of the total 390k LOCs.
Thomas and Matthias are doing a fantastic job in keeping up as much as possible with the incoming changes’ pace and reviewing them at their best. At times, though, the incoming change may touch parts of the code they are less familiar with and, therefore, would require more eyes or more time to review.
Breaking the vicious circle
The JGit project is in a dangerous vicious circle.
- Incoming changes would take longer to get reviewed and merged.
- The lengthy reviews cause detriment to contributors that may lose interest in following up contributions or upload new changes.
- The lack of contributions and merged changes would keep the pressure on current maintainers, which fuel point 1. again.
How can GerritForge help break this vicious circle, provide meaningful contributions, and get them merged fast and with proper and thorough reviews?
Keeping the pace of contributions is key to avoid detriment: GerritForge will therefore create a “dev branch” of JGit. All the GerritForge’s contributions to JGit master branch will be part of the dev branch and will go through a rigorous code-review and E2E validation cycle, including the Gatling tests for Gerrit.
Two-steps validation workflow
- A new change is uploaded to the Eclipse Foundation JGit project.
- The normal Eclipse Foundation’s CI verification builds the change and, if passes all tests, provides a Verified +1
- One of the JGit maintainers, or members of the GerritForge’s contributors, can provide a Code-Review +1 score with the additional description “Approved for dev“
- The special “Approved for dev” description triggers the cherry-pick of the Change onto the GerritForge’s JGit dev branch
- The new change for review on the JGit dev branch triggers the creation of a Change on gerrit-review.googlesource.com/gerrit with the update of the JGit submodule pointing to the open change.
- The JGit submodule update Change triggers the current E2E validation using the Gatling tests, developed and hosted by GerritForge. If all tests are passing, the Gerrit change receives a Verified +1.
- The cherry-picked Change on JGit dev branch receives a Verified +1
- The cherry-picked Change is merged to the JGit dev branch
- The merge of the cherry-picked Change is notified on the original Change with a Code-Review +1 score with description “Merged in dev”.
- One of the JGit maintainers can finalise the review and, if all is good, provides the final Code-Review +2 and merge the change on JGit master.
NOTE: The above workflow will only apply to the upcoming changes on the master branch, where we do need to innovate and implement new features at a faster pace. We have to plans to apply the workflow to any stable branches.
Plus and minuses
There are good things on the above workflow, however, there are also risks:
- Complexity: the secondary dev branch will undergo an E2E validation process with Gerrit, which is obviously complex and it may break at times.
- Danger of forking: if the JGit maintainers would veto the Change at step 10 the changes already merged in dev would make effectively dev and master branches diverge, which isn’t a good thing and it should be avoided as much as possible.
The augmented lifecycle, which also involves Gerrit E2E tests with Gatling, has also many advantages:
- Additional E2E validation: incoming changes on JGit would involve an E2E validation with Gerrit against the suite of E2E Gatling tests, which is good feedback and gives more confidence in merging code also on less known parts of the JGit codebase.
- Increased velocity: speedup validation of new incoming changes and getting them merged to the JGit dev branch, without impacting the pace and quality of reviews from the current JGit maintainers.
- Gerrit edge release: allows to have a downloadable Gerrit change that includes the JGit dev branch, allowing canary deployments and see how Gerrit behaves with the latest and greatest of JGit code.
From a JGit project’s perspective, the flow of incoming changes will have an additional E2E validation, which is always a good thing. Additionally, it will bring more contributions and inspiration for new innovative changes on the project and attracting more and more talent.
Ready to gear-up contributions on JGit?
The workflow proposed is a starting point; however, we are committed to giving it a go and seeing how it would work in practice and if it will be enough to gear up the contributions to the JGit project.