# JGit EE8 Bazel bridge

This package contains the Bazel-only bridge for source consumers that still run
on EE8 and `javax.servlet` while JGit master uses `jakarta.servlet`.

JGit hosts this bridge because Gerrit is a known downstream that consumes JGit
from source through a git submodule and still runs Jetty 12 EE8. Keeping the
bridge in JGit lets Gerrit track JGit master and avoids maintaining a long-lived
servlet-4 branch just for Gerrit. That branch was never a stable JGit release
line, so it is not a sustainable way for Gerrit to receive JGit maintenance
updates.

The bridge intentionally keeps the original JGit package names. It rewrites only
servlet API references from `jakarta.servlet` to `javax.servlet`, then compiles
generated jars from the rewritten source jars.

Generated targets:

* `//org.eclipse.jgit.http.server.ee8:jgit-servlet-ee8`
* `//org.eclipse.jgit.lfs.server.ee8:jgit-lfs-server-ee8`

Do not put one of these generated jars and its canonical Jakarta counterpart on
the same classpath. They contain the same JGit classes.

This is intentionally limited to source generation, build, and test. It does
not add Tycho, p2, or Maven Central publication machinery yet.

Run:

```sh
bazelisk test \
  //tools/jgit-ee8:generated_srcs_test \
  //org.eclipse.jgit.junit.http.ee8:tests
```

`//tools/jgit-ee8:generated_srcs_test` checks:

* generated sources are derived from the canonical source filegroups
* generated srcjar entries use Java package paths
* generated sources preserve line counts for debugger breakpoints
* generated sources contain `javax.servlet`, not `jakarta.servlet`
* generated sources do not move JGit classes to an `.ee8` package

The dedicated `org.eclipse.jgit.*.ee8` targets follow the Jetty 12 EE8 testing
model in a smaller form. Jetty generates EE8 main and test sources from the
canonical newer-EE modules and then runs the EE8 tests in the EE8 module graph.
JGit does the same for the servlet-facing tests: the HTTP/LFS test sources and
shared `junit-http` helpers are transformed to `javax.servlet`, wired to Jetty
EE8 test dependencies, and run against the generated EE8 JGit jars.

`//org.eclipse.jgit.http.test.ee8:server_unit` is a fast, focused target for the
three HTTP server utility tests. It is not part of the default EE8 suite because
those classes already run under `//org.eclipse.jgit.http.test.ee8:http`.

The test rewrite rules also map Jetty test helper imports from
`org.eclipse.jetty.ee11.servlet` to the Jetty EE8 packages needed by the tests.
They are intentionally test-only and separate from the production
`jakarta.servlet` to `javax.servlet` rules.

Next steps:

* Keep this source-consumer bridge while Gerrit runs on Jetty 12 EE8.
* Reuse these targets for other Bazel source consumers that need EE8 output.
* Move the generated-test JUnit helper to bazlets only if more generated-test
  users need the same split between suite source labels and compiled sources.
* Add Maven/Tycho/p2 generation only when a non-Bazel consumer needs published
  EE8 artifacts.
* Keep the canonical `srcs` filegroups aligned with each servlet-facing
  `java_library` so new Java sources are transformed automatically.
