Mark war-provided libraries as neverlink inside the Gerrit tree

When Gitiles is built as a Gerrit plugin from source, the plugin jar was
packaging the full transitive closure of libraries that Gerrit already
ships in gerrit.war (Guava, Gson, Soy, ICU4J, JGit, commons-lang3/io,
text/reload4j/flogger, ASM, html-types, ...). That inflated gitiles.jar
to ~34 MB of classes that are already on the plugin's runtime classpath
via gerrit.war -- pure duplication.

Introduce lib/provided.bzl with a provided_java_library() wrapper: a
single java_library whose neverlink attribute is a select() on the
existing @com_googlesource_gerrit_bazlets//flags:in_gerrit_tree flag.

Gerrit sets that flag in its .bazelrc; standalone Gitiles never does, so
it defaults to false.

* Standalone (flag false): the libraries are linked exactly as before
  and bundled into gitiles.war -- no behavioral change, zero regression
  risk.
* In the Gerrit tree (flag true): they become neverlink, so their
  classes are dropped from the plugin's runtime closure and are not
  re-packaged into gitiles.jar. Gerrit already provides them.

Only libraries that gerrit.war actually ships are converted (lib/BUILD,
lib/soy, lib/flogger). Gitiles-only libraries (the commonmark family,
java-prettify and autolink) stay linked in both configurations.

Alternative considered: exclude the same closure with deploy_env from
within the Gerrit plugin's BUILD (the pattern used by other plugins). We
defer that here because in_gerrit_tree is more principled -- Gitiles
itself declares "these are provided when I'm built inside Gerrit," so
the knowledge lives with the dependency declarations instead of being
duplicated as an exclusion list in Gerrit's plugin wiring. deploy_env
remains a viable follow-up if we later prefer to keep this decision
entirely on the Gerrit side.

Change-Id: I4f12d3a4be71a89df8830ecc872877f869997a8c
diff --git a/lib/BUILD b/lib/BUILD
index bd8b90a..3fd40f7 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -1,9 +1,20 @@
 load("@rules_java//java:defs.bzl", "java_library")
+load("//lib:provided.bzl", "provided_java_library")
 
 package(
     default_visibility = ["//visibility:public"],
 )
 
+# True when Gitiles is built inside the Gerrit source tree; Gerrit sets
+# --@com_googlesource_gerrit_bazlets//flags:in_gerrit_tree=true in its .bazelrc.
+# Standalone Gitiles never sets it, so it defaults to false.
+config_setting(
+    name = "in_gerrit_tree",
+    flag_values = {"@com_googlesource_gerrit_bazlets//flags:in_gerrit_tree": "true"},
+    visibility = ["//visibility:public"],
+)
+
+# Libraries that are NOT shipped in gerrit.war; the Gitiles plugin bundles them.
 [java_library(
     name = local_name,
     exports = [coord],
@@ -11,18 +22,11 @@
     ("autolink", "@external_deps//:org_nibor_autolink_autolink"),
     ("commonmark", "@external_deps//:org_commonmark_commonmark"),
     ("commons-codec", "@external_deps//:commons_codec_commons_codec"),
-    ("commons-io", "@external_deps//:commons_io_commons_io"),
-    ("commons-lang3", "@external_deps//:org_apache_commons_commons_lang3"),
-    ("commons-text", "@external_deps//:org_apache_commons_commons_text"),
     ("cm-autolink", "@external_deps//:org_commonmark_commonmark_ext_autolink"),
     ("gfm-strikethrough", "@external_deps//:org_commonmark_commonmark_ext_gfm_strikethrough"),
     ("gfm-tables", "@external_deps//:org_commonmark_commonmark_ext_gfm_tables"),
     ("cm-yaml-front-matter", "@external_deps//:org_commonmark_commonmark_ext_yaml_front_matter"),
-    ("html-types", "@external_deps//:com_google_common_html_types_types"),
-    ("jsr305", "@external_deps//:com_google_code_findbugs_jsr305"),
     ("servlet-api", "@external_deps//:javax_servlet_javax_servlet_api"),
-    ("gson", "@external_deps//:com_google_code_gson_gson"),
-    ("guava", "@external_deps//:com_google_guava_guava"),
     ("guava-failureaccess", "@external_deps//:com_google_guava_failureaccess"),
     ("ow2-asm", "@external_deps//:org_ow2_asm_asm"),
     ("ow2-asm-analysis", "@external_deps//:org_ow2_asm_asm_analysis"),
@@ -31,13 +35,28 @@
     ("ow2-asm-util", "@external_deps//:org_ow2_asm_asm_util"),
 ]]
 
+# Libraries already shipped in gerrit.war: linked standalone, neverlink in-tree.
+[provided_java_library(
+    name = local_name,
+    exports = [coord],
+) for local_name, coord in [
+    ("commons-io", "@external_deps//:commons_io_commons_io"),
+    ("commons-lang3", "@external_deps//:org_apache_commons_commons_lang3"),
+    ("commons-text", "@external_deps//:org_apache_commons_commons_text"),
+    ("html-types", "@external_deps//:com_google_common_html_types_types"),
+    ("jsr305", "@external_deps//:com_google_code_findbugs_jsr305"),
+    ("gson", "@external_deps//:com_google_code_gson_gson"),
+    ("guava", "@external_deps//:com_google_guava_guava"),
+    ("errorprone-annotations", "@external_deps//:com_google_errorprone_error_prone_annotations"),
+]]
+
 java_library(
     name = "prettify",
     visibility = ["//visibility:public"],
     exports = ["@java-prettify"],
 )
 
-java_library(
+provided_java_library(
     name = "slf4j-api",
     exports = ["@external_deps//:org_slf4j_slf4j_api"],
 )
@@ -50,9 +69,8 @@
     ],
 )
 
-java_library(
+provided_java_library(
     name = "jgit",
-    visibility = ["//visibility:public"],
     exports = ["@jgit//org.eclipse.jgit:jgit"],
     runtime_deps = [
         ":slf4j-api",
@@ -60,9 +78,8 @@
     ],
 )
 
-java_library(
+provided_java_library(
     name = "jgit-archive",
-    visibility = ["//visibility:public"],
     exports = ["@jgit//org.eclipse.jgit.archive:jgit-archive"],
     runtime_deps = [":jgit"],
 )
@@ -75,9 +92,8 @@
     runtime_deps = [":jgit"],
 )
 
-java_library(
+provided_java_library(
     name = "jgit-servlet",
-    visibility = ["//visibility:public"],
     exports = ["@jgit//org.eclipse.jgit.http.server.ee8:jgit-servlet-ee8"],
     runtime_deps = [":jgit"],
 )
@@ -91,9 +107,3 @@
     name = "commons-compress",
     exports = ["@external_deps//:org_apache_commons_commons_compress"],
 )
-
-java_library(
-    name = "errorprone-annotations",
-    visibility = ["//visibility:public"],
-    exports = ["@external_deps//:com_google_errorprone_error_prone_annotations"],
-)
diff --git a/lib/flogger/BUILD b/lib/flogger/BUILD
index 57c6e5a..e48dd33 100644
--- a/lib/flogger/BUILD
+++ b/lib/flogger/BUILD
@@ -1,8 +1,7 @@
-load("@rules_java//java:defs.bzl", "java_library")
+load("//lib:provided.bzl", "provided_java_library")
 
-java_library(
+provided_java_library(
     name = "flogger",
-    visibility = ["//visibility:public"],
     exports = [
         "@external_deps//:ch_qos_reload4j_reload4j",
         "@external_deps//:com_google_flogger_flogger",
diff --git a/lib/provided.bzl b/lib/provided.bzl
new file mode 100644
index 0000000..89d3712
--- /dev/null
+++ b/lib/provided.bzl
@@ -0,0 +1,29 @@
+"""Wrapper for libraries that Gerrit already ships in gerrit.war.
+
+Standalone Gitiles links these and bundles them into gitiles.war as usual.
+When Gitiles is built inside the Gerrit tree
+(--@com_googlesource_gerrit_bazlets//flags:in_gerrit_tree=true), they are
+switched to neverlink, so the Gitiles Gerrit plugin does not re-package
+classes that gerrit.war already provides on the runtime classpath.
+"""
+
+load("@rules_java//java:defs.bzl", "java_library")
+
+def provided_java_library(name, exports, runtime_deps = []):
+    """java_library that is linked standalone but neverlink inside Gerrit.
+
+    Args:
+      name: target name; consumers depend on this directly.
+      exports: exported libraries (as for java_library).
+      runtime_deps: runtime deps (only relevant to the standalone build).
+    """
+    java_library(
+        name = name,
+        exports = exports,
+        runtime_deps = runtime_deps,
+        neverlink = select({
+            "//lib:in_gerrit_tree": 1,
+            "//conditions:default": 0,
+        }),
+        visibility = ["//visibility:public"],
+    )
diff --git a/lib/soy/BUILD b/lib/soy/BUILD
index 3b08e29..ca6fdb4 100644
--- a/lib/soy/BUILD
+++ b/lib/soy/BUILD
@@ -1,10 +1,10 @@
-load("@rules_java//java:defs.bzl", "java_library")
+load("//lib:provided.bzl", "provided_java_library")
 
 package(
     default_visibility = ["//visibility:public"],
 )
 
-java_library(
+provided_java_library(
     name = "soy",
     exports = [
         "@external_deps//:com_google_template_soy",