Subject: [PATCH 00/12] t: exercise Git/JGit reftable compatibility

From: Patrick Steinhardt <[email-masked]>
Date: Thu, 4 Apr 2024 15:25:00 +0200

Hi,

while the reftable backend is a recent addition to Git, it has been part
of JGit since 2017 already. Given that there are essentially two
different implementations of the reftable format now there is a very
real risk of these two diverge and become incompatible with each other,
which would be a shame.

This patch series addresses this risk by introducing compatibility tests
which assert that both Git and JGit can access reftables written by the
respective other implementation.

The patch series is structured as follows:

  - Patches 1-8 merge "install-docker-dependencies.sh" into
    "install-dependencies.sh". This is done so that both CI job flavors
    have the same dependencies and thus the same test coverage available
    without always having to maintain them both.

  - Patch 9 makes JGit available.

  - Patch 10 starts running backend-specific tests in all jobs, and
    patch 11 addresses a portability issue surfaced by this.

  - Patch 12 adds a very basic compatibility test suite for Git/JGit
    reftables. I mostly consider this as a proof of concept, it should
    likely be extended over time.

These compatibility tests surface three findings:

  - JGit does not support reftables format v2, which was added to
    support the SHA256 object format.

  - JGit cannot read reflogs written by itself when starting from an
    unborn branch. This smells like a bug in JGit to me where it
    misinterprets reflog entries with a zero object ID as new OID, but I
    didn't dig any deeper yet.

  - JGit is incompatible with split indices because it cannot handle
    'link' DIRC entries. This is unrelated to reftables though.

I have tested the CI changes against both GitLab [1] and GitHub [2]. The
macOS test failures on GitHub are caused by the recent curl regression.

[1]: https://gitlab.com/gitlab-org/git/-/merge_requests/123
[2]: https://github.com/git/git/pull/1696

Patrick

Patrick Steinhardt (12):
  ci: rename "runs_on_pool" to "distro"
  ci: expose distro name in dockerized GitHub jobs
  ci: allow skipping sudo on dockerized jobs
  ci: drop duplicate package installation for "linux-gcc-default"
  ci: convert "install-dependencies.sh" to use "/bin/sh"
  ci: merge custom PATH directories
  ci: merge scripts which install dependencies
  ci: make Perforce binaries executable for all users
  ci: install JGit dependency
  t06xx: always execute backend-specific tests
  t0610: fix non-portable variable assignment
  t0612: add tests to exercise Git/JGit reftable compatibility

 .github/workflows/main.yml             |   8 +-
 .gitlab-ci.yml                         |   4 +-
 ci/install-dependencies.sh             | 100 ++++++++++++++-------
 ci/install-docker-dependencies.sh      |  46 ----------
 ci/lib.sh                              |  14 ++-
 t/t0600-reffiles-backend.sh            |   8 +-
 t/t0601-reffiles-pack-refs.sh          |   9 +-
 t/t0610-reftable-basics.sh             |  12 ++-
 t/t0612-reftable-jgit-compatibility.sh | 115 +++++++++++++++++++++++++
 9 files changed, 208 insertions(+), 108 deletions(-)
 delete mode 100755 ci/install-docker-dependencies.sh
 create mode 100755 t/t0612-reftable-jgit-compatibility.sh

base-commit: 7774cfed6261ce2900c84e55906da708c711d601
-- 
2.44.GIT