Merge pull request #1395 from mmorel-35:bcr

PiperOrigin-RevId: 925175633
diff --git a/.bcr/README.md b/.bcr/README.md
new file mode 100644
index 0000000..2b25d48
--- /dev/null
+++ b/.bcr/README.md
@@ -0,0 +1,69 @@
+# Bazel Central Registry Publishing Configuration
+
+This directory contains the configuration files for publishing brotli modules to the Bazel Central Registry (BCR).
+
+## Modules
+
+This repository publishes two modules to BCR:
+
+1. **brotli** (root) - The main Brotli C library
+2. **brotli_go** (go/) - Go bindings for Brotli
+
+Each module has its own set of template files under `.bcr` and `.bcr/go` respectively.
+
+## Files
+
+### Root module (brotli)
+- **metadata.template.json**: Metadata about the brotli module including homepage, maintainers, and repository location
+- **source.template.json**: Template for generating source archive URLs for releases
+- **presubmit.yml**: BCR CI configuration that defines build and test tasks to validate the module
+
+### Go module (brotli_go)
+- **go/metadata.template.json**: Metadata for the brotli_go module
+- **go/source.template.json**: Source configuration with path to the go subdirectory
+- **go/presubmit.yml**: BCR CI configuration for the Go module
+
+### Shared
+- **config.yml**: Configuration specifying both modules via moduleRoots
+- **README.md**: This file
+
+## Setup (One-time)
+
+Before you can publish to BCR, you need to set up the following:
+
+1. **Fork the Bazel Central Registry**
+   - Fork https://github.com/bazelbuild/bazel-central-registry to your GitHub account
+
+2. **Create a Personal Access Token**
+   - Go to GitHub Settings > Developer settings > Personal access tokens > Tokens (classic)
+   - Click "Generate new token (classic)"
+   - Select scopes: `repo` and `workflow`
+   - Generate the token and copy it
+
+3. **Add the token to repository secrets**
+   - Go to the brotli repository Settings > Secrets and variables > Actions
+   - Click "New repository secret"
+   - Name: `BCR_PUBLISH_TOKEN`
+   - Value: Paste the token from step 2
+   - Click "Add secret"
+
+## Publishing Process
+
+To publish new versions of both modules to BCR:
+
+1. Create a GitHub release with a tag (e.g., `v1.2.1`)
+2. Go to the Actions tab in GitHub
+3. Select the "Publish to BCR" workflow
+4. Click "Run workflow"
+5. Enter the release tag name (e.g., `v1.2.1`)
+6. Enter your BCR fork (e.g., `yourusername/bazel-central-registry`)
+7. Click "Run workflow"
+
+The workflow will automatically create pull requests to the Bazel Central Registry for both modules.
+
+## References
+
+- [Bazel Central Registry](https://github.com/bazelbuild/bazel-central-registry)
+- [publish-to-bcr Documentation](https://github.com/bazel-contrib/publish-to-bcr)
+- [Bzlmod User Guide](https://bazel.build/external/module)
+- [Multi-module Publishing](https://github.com/bazel-contrib/publish-to-bcr/tree/main/templates#optional-configyml)
diff --git a/.bcr/config.yml b/.bcr/config.yml
new file mode 100644
index 0000000..f395e5a
--- /dev/null
+++ b/.bcr/config.yml
@@ -0,0 +1,8 @@
+# BCR configuration file for publish-to-bcr
+fixedReleaser:
+  login: eustas
+  email: eustas@google.com
+# Publish both the main brotli module and the Go bindings module
+moduleRoots:
+  - "."
+  - "go"
diff --git a/.bcr/go/metadata.template.json b/.bcr/go/metadata.template.json
new file mode 100644
index 0000000..df42141
--- /dev/null
+++ b/.bcr/go/metadata.template.json
@@ -0,0 +1,14 @@
+{
+  "homepage": "https://github.com/google/brotli",
+  "maintainers": [
+    {
+      "email": "eustas@google.com",
+      "github": "eustas",
+      "name": "Evgenii Kliuchnikov",
+      "github_user_id": 203457
+    }
+  ],
+  "repository": ["github:google/brotli"],
+  "versions": [],
+  "yanked_versions": {}
+}
diff --git a/.bcr/go/presubmit.yml b/.bcr/go/presubmit.yml
new file mode 100644
index 0000000..3e3aa53
--- /dev/null
+++ b/.bcr/go/presubmit.yml
@@ -0,0 +1,32 @@
+matrix:
+  platform:
+  - debian10
+  - ubuntu2004
+  - macos
+  - macos_arm64
+  bazel:
+  - 8.x
+  - 7.x
+tasks:
+  verify_targets:
+    name: Verify build targets
+    platform: ${{ platform }}
+    bazel: ${{ bazel }}
+    build_targets:
+    - '@brotli_go//cbrotli'
+    build_flags:
+      - "--conlyopt=-Wno-error=conversion"
+      - "--conlyopt=-Wno-error=sign-conversion"
+      - "--copt=-Wno-error=conversion"
+      - "--copt=-Wno-error=sign-conversion"
+      - "--host_conlyopt=-Wno-error=conversion"
+      - "--host_copt=-Wno-error=conversion"
+    test_targets:
+    - '@brotli_go//cbrotli:cbrotli_test'
+    test_flags:
+      - "--conlyopt=-Wno-error=conversion"
+      - "--conlyopt=-Wno-error=sign-conversion"
+      - "--copt=-Wno-error=conversion"
+      - "--copt=-Wno-error=sign-conversion"
+      - "--host_conlyopt=-Wno-error=conversion"
+      - "--host_copt=-Wno-error=conversion"
\ No newline at end of file
diff --git a/.bcr/go/source.template.json b/.bcr/go/source.template.json
new file mode 100644
index 0000000..362d6df
--- /dev/null
+++ b/.bcr/go/source.template.json
@@ -0,0 +1,5 @@
+{
+  "integrity": "",
+  "strip_prefix": "{REPO}-{VERSION}/go",
+  "url": "https://github.com/{OWNER}/{REPO}/archive/refs/tags/{TAG}.tar.gz"
+}
diff --git a/.bcr/metadata.template.json b/.bcr/metadata.template.json
new file mode 100644
index 0000000..df42141
--- /dev/null
+++ b/.bcr/metadata.template.json
@@ -0,0 +1,14 @@
+{
+  "homepage": "https://github.com/google/brotli",
+  "maintainers": [
+    {
+      "email": "eustas@google.com",
+      "github": "eustas",
+      "name": "Evgenii Kliuchnikov",
+      "github_user_id": 203457
+    }
+  ],
+  "repository": ["github:google/brotli"],
+  "versions": [],
+  "yanked_versions": {}
+}
diff --git a/.bcr/presubmit.yml b/.bcr/presubmit.yml
new file mode 100644
index 0000000..9e53079
--- /dev/null
+++ b/.bcr/presubmit.yml
@@ -0,0 +1,41 @@
+matrix:
+  platform:
+  - debian10
+  - ubuntu2004
+  - macos
+  - macos_arm64
+  bazel:
+  - 7.x
+  - 8.x
+tasks:
+  verify_targets:
+    name: Verify build targets
+    platform: ${{ platform }}
+    bazel: ${{ bazel }}
+    build_targets:
+      - '@brotli//:brotli'
+      - '@brotli//:brotlicommon'
+      - '@brotli//:brotlidec'
+      - '@brotli//:brotlienc'
+    build_flags:
+      - "--cxxopt=-std=c++17"
+      - "--conlyopt=-Wno-error=conversion"
+      - "--conlyopt=-Wno-error=sign-conversion"
+      - "--copt=-Wno-error=conversion"
+      - "--copt=-Wno-error=sign-conversion"
+      - "--host_conlyopt=-Wno-error=conversion"
+      - "--host_copt=-Wno-error=conversion"
+  verify_targets_windows:
+    name: Verify build targets
+    platform: windows
+    bazel: ${{ bazel }}
+    build_flags:
+      - "--cxxopt=/std:c++17"
+      - "--cxxopt=/D_WIN32_WINNT=0x0602"
+      - "--cxxopt=/DWINVER=0x0602"
+      - "--host_cxxopt=/std:c++17"
+    build_targets:
+      - '@brotli//:brotli'
+      - '@brotli//:brotlicommon'
+      - '@brotli//:brotlidec'
+      - '@brotli//:brotlienc'
\ No newline at end of file
diff --git a/.bcr/source.template.json b/.bcr/source.template.json
new file mode 100644
index 0000000..4f14819
--- /dev/null
+++ b/.bcr/source.template.json
@@ -0,0 +1,5 @@
+{
+  "integrity": "",
+  "strip_prefix": "{REPO}-{VERSION}",
+  "url": "https://github.com/{OWNER}/{REPO}/archive/refs/tags/{TAG}.tar.gz"
+}
diff --git a/.github/workflows/publish_to_bcr.yaml b/.github/workflows/publish_to_bcr.yaml
new file mode 100644
index 0000000..a0d9ef5
--- /dev/null
+++ b/.github/workflows/publish_to_bcr.yaml
@@ -0,0 +1,29 @@
+name: Publish to BCR
+
+on:
+  # Manually trigger the publish workflow
+  workflow_dispatch:
+    inputs:
+      tag_name:
+        description: Release tag to publish to the Bazel Central Registry
+        required: true
+        type: string
+      registry_fork:
+        description: Registry fork to push to (e.g., username/bazel-central-registry)
+        required: true
+        type: string
+
+jobs:
+  publish:
+    permissions:
+      contents: write
+      id-token: write
+      attestations: write
+    uses: bazel-contrib/publish-to-bcr/.github/workflows/publish.yaml@v2
+    with:
+      tag_name: ${{ inputs.tag_name }}
+      registry_fork: ${{ inputs.registry_fork }}
+      # Set to false since not using the release_ruleset workflow
+      attest: false
+    secrets:
+      publish_token: ${{ secrets.BCR_PUBLISH_TOKEN }}