diff --git a/.github/release-note-generation/generate_module_notes.py b/.github/release-note-generation/generate_module_notes.py new file mode 100644 index 000000000000..99fcd2399ce3 --- /dev/null +++ b/.github/release-note-generation/generate_module_notes.py @@ -0,0 +1,335 @@ +import argparse +import re +import subprocess +import sys + + +def run_cmd(cmd, cwd=None): + """Runs a shell command and returns the output.""" + result = subprocess.run( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, cwd=cwd + ) + if result.returncode != 0: + print(f"Error running command: {' '.join(cmd)}", file=sys.stderr) + print(result.stderr, file=sys.stderr) + sys.exit(result.returncode) + return result.stdout + + +def find_version_boundaries(file_path, pattern, target_version, module=None): + """Scans history of a file to find release boundaries moving forward.""" + log_cmd = [ + "git", + "log", + "--oneline", + "--all", + "--", + file_path, + ] + try: + log_output = run_cmd(log_cmd) + commits = [line.split()[0] for line in log_output.splitlines() if line] + commits.reverse() # Move forward in time! + + first_prev_commit = None + target_release_commit = None + prev_version = None + + for commit in commits: + # Check if file exists at that commit to avoid noisy errors + check_cmd = ["git", "cat-file", "-e", f"{commit}:{file_path}"] + check_result = subprocess.run(check_cmd, stderr=subprocess.PIPE) + if check_result.returncode != 0: + continue + + show_cmd = ["git", "show", f"{commit}:{file_path}"] + try: + content = run_cmd(show_cmd) + except SystemExit: + continue + + found_ver = None + match = pattern.search(content) + if match: + found_ver = match.group(1) + + if found_ver: + if found_ver == target_version: + target_release_commit = commit + break # Stop as soon as we find the target release! + + # Track the first occurrence of the latest stable version before target + if found_ver != target_version and "-SNAPSHOT" not in found_ver and (not prev_version or found_ver != prev_version): + prev_version = found_ver + first_prev_commit = commit + + return first_prev_commit, target_release_commit, prev_version + except SystemExit: + return None, None, None + + +def verify_commit(commit_hash, directory, module, allowed_versions): + """Verifies if a commit belongs to the release based on file state.""" + if directory == ".": + pom_path = "gapic-libraries-bom/pom.xml" + else: + pom_path = f"{directory}/pom.xml" + + # Check if file exists at that commit to avoid noisy errors + check_cmd = ["git", "cat-file", "-e", f"{commit_hash}:{pom_path}"] + check_result = subprocess.run(check_cmd, stderr=subprocess.PIPE) + if check_result.returncode != 0: + return False + + try: + content = run_cmd(["git", "show", f"{commit_hash}:{pom_path}"]) + # Allow optional tag in between artifactId and version + pattern = re.compile(rf"{re.escape(module)}\s*(?:[^<]+\s*)?([^<]+)", re.DOTALL) + + match = pattern.search(content) + if match and match.group(1) in allowed_versions: + return True + except SystemExit: + pass + + return False + + +def parse_commit_overrides(commit_data, short_name, prefix_regex, commit_hash, categorize_callback): + """Parses commit overrides and calls callback for each item.""" + match = re.search(r"BEGIN_COMMIT_OVERRIDE(.*?)END_COMMIT_OVERRIDE", commit_data, re.DOTALL) + if not match: + return False + + override_content = match.group(1) + current_item = [] + in_module_item = False + + for line in override_content.splitlines(): + line_stripped = line.strip() + if not line_stripped: + continue + + is_new_item = prefix_regex.match(line_stripped) + + if is_new_item: + if in_module_item and current_item: + categorize_callback(commit_hash, " ".join(current_item)) + current_item = [] + in_module_item = False + + should_include = False + if short_name: + if f"[{short_name}]" in line_stripped: + should_include = True + else: + should_include = True + + if should_include: + in_module_item = True + current_item.append(line_stripped) + elif in_module_item: + if line_stripped.startswith(("PiperOrigin-RevId:", "Source Link:")): + continue + if line_stripped in ("END_NESTED_COMMIT", "BEGIN_NESTED_COMMIT"): + continue + current_item.append(line_stripped) + + if in_module_item and current_item: + categorize_callback(commit_hash, " ".join(current_item)) + + return True + + +def get_tag_or_commit(commit_hash, target_version): + """Returns the tag pointing at the commit if there is exactly one, else the commit hash.""" + if not commit_hash: + return None + try: + # Remove ~1 if present to find the actual tag pointing at the commit + clean_hash = commit_hash.split("~")[0] + tags_output = run_cmd(["git", "tag", "--points-at", clean_hash]) + tags = [line.strip() for line in tags_output.splitlines() if line.strip()] + if len(tags) == 1: + return tags[0] + elif len(tags) > 1: + for tag in tags: + if target_version in tag: + return tag + except SystemExit: + pass + return commit_hash + + +def main(): + parser = argparse.ArgumentParser( + description="Generate release notes based on commit history for a specific module." + ) + parser.add_argument( + "--module", required=True, help="Module name as specified in versions.txt" + ) + parser.add_argument( + "--directory", required=True, help="Path in the monorepo where the module has code" + ) + parser.add_argument("--version", required=True, help="Target version") + parser.add_argument( + "--short-name", help="Module short-name used in commit overrides (e.g., aiplatform). Omit for repo-wide generation." + ) + args = parser.parse_args() + + module = args.module + directory = args.directory + target_version = args.version + + # 1. Scan history of pom.xml + if directory == ".": + pom_path = "gapic-libraries-bom/pom.xml" + else: + pom_path = f"{directory}/pom.xml" + pom_pattern = re.compile(r"([^<]+)") + + prev_commit, target_release_commit, prev_version = find_version_boundaries(pom_path, pom_pattern, target_version) + + target_commit = None + if target_release_commit: + target_commit = target_release_commit + print(f"Found target release commit at {target_release_commit}. Using inclusive upper boundary {target_commit}", file=sys.stderr) + + if not target_commit: + print(f"Target version {target_version} not found in history of {pom_path}.", file=sys.stderr) + sys.exit(1) + + range_desc = f"between {prev_commit} and {target_commit}" if prev_commit else f"up to {target_commit}" + print( + f"Generating notes {range_desc} for directory {directory}", file=sys.stderr + ) + + # 2. Generate commit history in that range affecting that directory + # Use format that includes hash, subject, and body + notes_cmd = [ + "git", + "log", + "--format=%H %s%n%b%n--END_OF_COMMIT--", + f"{prev_commit}~1..{target_commit}" if prev_commit else target_commit, + ] + if directory != ".": + notes_cmd.extend(["--", directory]) + notes_output = run_cmd(notes_cmd) + + + + # Filter commit titles based on allowed prefixes and categorize them + # Supports scopes in parentheses, e.g., feat(spanner): + prefix_regex = re.compile(r"^(feat|fix|deps|docs|chore\(deps\)|build\(deps\))(\([^)]+\))?(!)?:") + + breaking_changes = [] + features = [] + bug_fixes = [] + dependency_upgrades = [] + documentation = [] + + def categorize_and_append(commit_hash, text): + match = prefix_regex.match(text) + if not match: + return + + prefix = match.group(1) + is_breaking = match.group(3) == "!" + + commit_link = f"([{commit_hash[:7]}](https://github.com/googleapis/google-cloud-java/commit/{commit_hash}))" + full_item = f"{text} {commit_link}" + + if is_breaking: + breaking_changes.append(full_item) + elif prefix == "feat": + features.append(full_item) + elif prefix == "fix": + bug_fixes.append(full_item) + elif prefix == "deps" or prefix in ("chore(deps)", "build(deps)"): + dependency_upgrades.append(full_item) + elif prefix == "docs": + documentation.append(full_item) + + commits_data = notes_output.split("--END_OF_COMMIT--") + + for commit_data in commits_data: + commit_data = commit_data.strip() + if not commit_data: + continue + + lines = commit_data.splitlines() + if not lines: + continue + + header_parts = lines[0].split(" ", 1) + commit_hash = header_parts[0] + subject = header_parts[1] if len(header_parts) > 1 else "" + + body = "\n".join(lines[1:]) + + # Verify if commit belongs to this release based on file state + target_snapshot = f"{target_version}-SNAPSHOT" + allowed_versions = (prev_version, target_snapshot) if prev_version else (target_snapshot,) + + target_module = "gapic-libraries-bom" if directory == "." else module + if not verify_commit(commit_hash, directory, target_module, allowed_versions): + continue + + # Check for override in the entire message + if "BEGIN_COMMIT_OVERRIDE" in body or "BEGIN_COMMIT_OVERRIDE" in subject: + if parse_commit_overrides(commit_data, args.short_name, prefix_regex, commit_hash, categorize_and_append): + continue + + # Fallback to title check if no override + if prefix_regex.match(subject): + categorize_and_append(commit_hash, subject) + + # Get dates and build header + target_date = run_cmd(["git", "log", "-1", "--format=%cI", target_commit]).strip() + date_str = target_date.split("T")[0] # Get YYYY-MM-DD + + prev_ref = get_tag_or_commit(prev_commit, prev_version) if prev_version else prev_commit + target_ref = get_tag_or_commit(target_commit, target_version) + + compare_url = f"https://github.com/googleapis/google-cloud-java/compare/{prev_ref}...{target_ref}" if prev_ref else f"https://github.com/googleapis/google-cloud-java/commit/{target_ref}" + + print(f"## [{target_version}]({compare_url}) ({date_str})") + print() + + if not any([breaking_changes, features, bug_fixes, dependency_upgrades, documentation]): + print("* No change") + else: + if breaking_changes: + print("### ⚠ BREAKING CHANGES\n") + for item in breaking_changes: + print(f"* {item}") + print() + + if features: + print("### Features\n") + for item in features: + print(f"* {item}") + print() + + if bug_fixes: + print("### Bug Fixes\n") + for item in bug_fixes: + print(f"* {item}") + print() + + if documentation: + print("### Documentation\n") + for item in documentation: + print(f"* {item}") + print() + + if dependency_upgrades: + print("### Dependencies\n") + for item in dependency_upgrades: + print(f"* {item}") + print() + + + +if __name__ == "__main__": + main() diff --git a/.github/release-note-generation/test_generate_module_notes.py b/.github/release-note-generation/test_generate_module_notes.py new file mode 100644 index 000000000000..487a43a31c85 --- /dev/null +++ b/.github/release-note-generation/test_generate_module_notes.py @@ -0,0 +1,62 @@ +import subprocess +import unittest +from pathlib import Path + + +class TestGenerateModuleNotes(unittest.TestCase): + + def setUp(self): + self.script_path = Path( + ".github/release-note-generation/generate_module_notes.py" + ) + self.testdata_dir = Path(".github/release-note-generation/testdata") + + def test_java_run_generation(self): + golden_file = self.testdata_dir / "golden_java-run_0.71.0.txt" + with open(golden_file, "r") as f: + expected_output = f.read() + + cmd = [ + "python3", + str(self.script_path), + "--module", + "google-cloud-run", + "--directory", + "java-run", + "--version", + "0.71.0", + "--short-name", + "run", + ] + result = subprocess.run( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True + ) + + self.assertEqual(result.returncode, 0) + self.assertEqual(result.stdout, expected_output) + + def test_root_generation(self): + golden_file = self.testdata_dir / "golden_root_1.85.0.txt" + with open(golden_file, "r") as f: + expected_output = f.read() + + cmd = [ + "python3", + str(self.script_path), + "--module", + "google-cloud-java", + "--directory", + ".", + "--version", + "1.85.0", + ] + result = subprocess.run( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True + ) + + self.assertEqual(result.returncode, 0) + self.assertEqual(result.stdout, expected_output) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/release-note-generation/testdata/golden_java-run_0.71.0.txt b/.github/release-note-generation/testdata/golden_java-run_0.71.0.txt new file mode 100644 index 000000000000..6b60c2402348 --- /dev/null +++ b/.github/release-note-generation/testdata/golden_java-run_0.71.0.txt @@ -0,0 +1,12 @@ +## [0.71.0](https://github.com/googleapis/google-cloud-java/compare/v1.64.0...v1.65.0) (2025-08-08) + +### ⚠ BREAKING CHANGES + +* fix!: [run] An existing resource_definition `cloudbuild.googleapis.com/WorkerPool` is removed ([9f28cd5](https://github.com/googleapis/google-cloud-java/commit/9f28cd5bcd951333fb2a3847edba015840b5029b)) +* fix!: [run] A type of an existing resource_reference option of the field `worker_pool` in message `.google.cloud.run.v2.SubmitBuildRequest` is changed from `cloudbuild.googleapis.com/WorkerPool` to `cloudbuild.googleapis.com/BuildWorkerPool` ([9f28cd5](https://github.com/googleapis/google-cloud-java/commit/9f28cd5bcd951333fb2a3847edba015840b5029b)) +* fix!: [run] A type of an existing resource_reference option of the field `worker_pool` in message `.google.cloud.run.v2.BuildConfig` is changed from `cloudbuild.googleapis.com/WorkerPool` to `cloudbuild.googleapis.com/BuildWorkerPool` ([9f28cd5](https://github.com/googleapis/google-cloud-java/commit/9f28cd5bcd951333fb2a3847edba015840b5029b)) + +### Features + +* feat: [run] Adding new resource tpye run.googleapis.com/WorkerPool. [googleapis/googleapis@0998e04](https://github.com/googleapis/googleapis/commit/0998e045cf83a1307ceb158e3da304bdaff5bb3a) ([9f28cd5](https://github.com/googleapis/google-cloud-java/commit/9f28cd5bcd951333fb2a3847edba015840b5029b)) + diff --git a/.github/release-note-generation/testdata/golden_root_1.85.0.txt b/.github/release-note-generation/testdata/golden_root_1.85.0.txt new file mode 100644 index 000000000000..b149d928ddfa --- /dev/null +++ b/.github/release-note-generation/testdata/golden_root_1.85.0.txt @@ -0,0 +1,46 @@ +## [1.85.0](https://github.com/googleapis/google-cloud-java/compare/6bef068b4d8...v1.85.0) (2026-04-13) + +### Features + +* feat: [chronicle] Add DataTableService to Chronicle v1 Client Libraries [googleapis/googleapis@e182cf5](https://github.com/googleapis/googleapis/commit/e182cf5152967047b763fd88f03094cfc836d194) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [vectorsearch] Added CMEK support ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [vectorsearch] Added UpdateIndex support ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [discoveryengine] add AUTO condition to SearchAsYouTypeSpec in v1alpha and v1beta [googleapis/googleapis@f01ba6b](https://github.com/googleapis/googleapis/commit/f01ba6bda9ef3a45069a699767ee7dc46f30028a) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [kms] support external-μ in the Digest [googleapis/googleapis@7fbf256](https://github.com/googleapis/googleapis/commit/7fbf256c9ee4e580bc2ffa825d8d41263d9462d3) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [kms] add a variable to SingleTenantHsmInstanceCreate to control whether future key portability features will be usable on the instance [googleapis/googleapis@bc600b8](https://github.com/googleapis/googleapis/commit/bc600b8b72913d10eaf1793a0845643fda94e4eb) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [databasecenter] Add support for BigQuery datasets and reservations ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [databasecenter] Introduce resource affiliation and lineage tracking ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [databasecenter] Enhance maintenance information with state, upcoming maintenance, and failure reasons [googleapis/googleapis@7f9e9ff](https://github.com/googleapis/googleapis/commit/7f9e9ff15720fac72c4ba3212343ba6e6102c920) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [shopping-merchant-inventories] a new field `base64_encoded_name` is added to the `LocalInventory` message ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [shopping-merchant-inventories] new field `base64_encoded_name` is added to the `RegionalInventory` message [googleapis/googleapis@6db5d2e](https://github.com/googleapis/googleapis/commit/6db5d2e6bc3a762fccebbcbcfb8681a6ebaf008e) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [dataplex] Allow Data Documentation DataScans to support BigQuery Dataset resources in addition to BigQuery table resources ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [dataproc] Add `Engine` field to support LightningEngine in clusters and add support for stop ttl [googleapis/googleapis@2da8658](https://github.com/googleapis/googleapis/commit/2da86587126416eb48d561cd800bb03afa2f501a) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [shopping-merchant-products] a new field `base64_encoded_name` is added to the `Product` message ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [shopping-merchant-products] new fields - `base64_encoded_name` and `base64_encoded_product` added to the `ProductInput` message ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [infra-manager] adding DeploymentGroups, you can now manage deployment of multiple module root dependencies in a single DAG [googleapis/googleapis@f5cb7af](https://github.com/googleapis/googleapis/commit/f5cb7afc40b63d52f43bc306cb9b64a87b681aea) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* feat: [appoptimize] new module for appoptimize (#12768) ([050187d](https://github.com/googleapis/google-cloud-java/commit/050187d934fc78139ec2790c04dd4c1e256591d4)) + +### Bug Fixes + +* fix: update appoptimize version to 0.0.1 to match released repo (#12782) ([80dfac6](https://github.com/googleapis/google-cloud-java/commit/80dfac6773bfe7e41e1d3f659fa5c9953a4fd83b)) +* fix(deps): update the Java code generator (gapic-generator-java) to 2.69.0 ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* fix(bqjdbc): lazily instantiate Statement in BigQueryDatabaseMetaData (#12752) ([72e5508](https://github.com/googleapis/google-cloud-java/commit/72e5508669ea48cde28f02adfeedfb05cd73fc57)) +* fix(gdch): support EC private keys (#1896) ([bf926fb](https://github.com/googleapis/google-cloud-java/commit/bf926fb23a0ee32b5563af7671af3776ca670126)) +* fix(auth): Address ClientSideCredentialAccessBoundary RefreshTask race condition (#12681) ([30088d2](https://github.com/googleapis/google-cloud-java/commit/30088d2140184b64e841b9864a2b9518f797a686)) + +### Documentation + +* docs: [vectorsearch] Updated documentation for listing locations ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* docs: [vectorsearch] Updated documentation for Collection.data_schema [googleapis/googleapis@8d0f6d8](https://github.com/googleapis/googleapis/commit/8d0f6d8615c72d1907aeec8984d68df50fb6b697) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* docs: [shopping-merchant-inventories] A comment for field `name` in message `.google.shopping.merchant.products.v1.LocalInventory` is changed ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* docs: [shopping-merchant-inventories] A comment for field `name` in message `.google.shopping.merchant.products.v1.RegionalInventory` is changed ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* docs: [dataplex] A comment for message `DataDocumentationResult` is changed ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* docs: [dataplex] A comment for field `table_result` in message `.google.cloud.dataplex.v1.DataDocumentationResult` is changed [googleapis/googleapis@1991351](https://github.com/googleapis/googleapis/commit/19913519dae24b82f58b8f1b43822c2c020a123c) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* docs: [network-management] Update comment for the `region` field in `RouteInfo` [googleapis/googleapis@66fcc02](https://github.com/googleapis/googleapis/commit/66fcc021fec9e5249e69da17068bea999f113622) chore: [dialogflow-cx] Add ruby_package to missing proto files in google-cloud-dialogflow-cx-v3 [googleapis/googleapis@b6669d7](https://github.com/googleapis/googleapis/commit/b6669d761c84c04682270ae5610106eb81ce1706) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* docs: [shopping-merchant-products] A comment for field `name` in message `.google.shopping.merchant.products.v1.ProductInput` is changed ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) +* docs: [shopping-merchant-products] A comment for field `name` in message `.google.shopping.merchant.products.v1.Product` is changed [googleapis/googleapis@2aba484](https://github.com/googleapis/googleapis/commit/2aba48492ae471bfb717f5e9c5a190b7cc1c6636) ([fc62b1e](https://github.com/googleapis/google-cloud-java/commit/fc62b1e80fa239ba8eec34ce1853e6c32126d9f4)) + +### Dependencies + +* build(deps): upgrade grpc-gcp to 1.10.0 (#12772) ([bb60a6e](https://github.com/googleapis/google-cloud-java/commit/bb60a6ea1a3481bd582e5c45503d2e578740e61c)) + diff --git a/java-bigquery/CHANGELOG.md b/java-bigquery/CHANGELOG.md index 045e090064b4..b5354465d9f9 100644 --- a/java-bigquery/CHANGELOG.md +++ b/java-bigquery/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [2.65.0](https://github.com/googleapis/google-cloud-java/compare/6bef068b4d8...v1.85.0) (2026-04-13) + +### Bug Fixes + +* fix(bqjdbc): lazily instantiate Statement in BigQueryDatabaseMetaData (#12752) ([72e5508](https://github.com/googleapis/google-cloud-java/commit/72e5508669ea48cde28f02adfeedfb05cd73fc57)) + + +## [2.64.0](https://github.com/googleapis/google-cloud-java/compare/0fe7d3822cc...6bef068b4d8) (2026-04-10) + +* No change + + ## 2.62.0 (None) * No change @@ -3525,4 +3537,4 @@ ### Documentation -* Update libraries-bom version ([#73](https://www.github.com/googleapis/java-bigquery/issues/73)) ([e967e10](https://www.github.com/googleapis/java-bigquery/commit/e967e10267514dfbac7013cac61f22b74d52b2b8)) +* Update libraries-bom version ([#73](https://www.github.com/googleapis/java-bigquery/issues/73)) ([e967e10](https://www.github.com/googleapis/java-bigquery/commit/e967e10267514dfbac7013cac61f22b74d52b2b8)) \ No newline at end of file diff --git a/java-spanner-jdbc/CHANGELOG.md b/java-spanner-jdbc/CHANGELOG.md index eca8e75685bf..3115a0cc6f26 100644 --- a/java-spanner-jdbc/CHANGELOG.md +++ b/java-spanner-jdbc/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [2.38.0](https://github.com/googleapis/google-cloud-java/compare/6bef068b4d8...v1.85.0) (2026-04-13) + +* No change + +## [2.37.0](https://github.com/googleapis/google-cloud-java/compare/55c4e0f125c...6bef068b4d8) (2026-04-10) + +### Bug Fixes + +* fix: update Version.java and correct spanner version for 1.83.0 release (#12712) ([c2147fc](https://github.com/googleapis/google-cloud-java/commit/c2147fc9ab767b0546e6f71483e3f0af1a99740c)) + + ## [2.35.4](https://github.com/googleapis/java-spanner-jdbc/compare/v2.35.3...v2.35.4) (2026-03-04) @@ -2238,4 +2249,4 @@ ### Dependencies * update core dependencies ([#25](https://www.github.com/googleapis/java-spanner-jdbc/issues/25)) ([9f4f4ad](https://www.github.com/googleapis/java-spanner-jdbc/commit/9f4f4ad1b076bd3131296c9f7f6558f2bc885d42)) -* update dependency org.threeten:threetenbp to v1.4.1 ([7cc951b](https://www.github.com/googleapis/java-spanner-jdbc/commit/7cc951b340b072e7853df868aaf7c17f854a69f5)) +* update dependency org.threeten:threetenbp to v1.4.1 ([7cc951b](https://www.github.com/googleapis/java-spanner-jdbc/commit/7cc951b340b072e7853df868aaf7c17f854a69f5)) \ No newline at end of file diff --git a/java-spanner/CHANGELOG.md b/java-spanner/CHANGELOG.md index 3e7586cd187b..63c8bf1e9de3 100644 --- a/java-spanner/CHANGELOG.md +++ b/java-spanner/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## [6.116.1](https://github.com/googleapis/google-cloud-java/compare/966e8a4d99b...cd6048171fc) (2026-04-21) + +### Features + +* feat(spanner): add shared endpoint cooldowns for location-aware rerouting (#12845) ([f5f273b](https://github.com/googleapis/google-cloud-java/commit/f5f273ba0bd6b7ca9a8be7d1b5a89211ef5ff9fc)) + + +## [6.116.0](https://github.com/googleapis/google-cloud-java/compare/6bef068b4d8...v1.85.0) (2026-04-13) + +* No change + +## [6.115.0](https://github.com/googleapis/google-cloud-java/compare/v1.83.0-sdk-platform-java...6bef068b4d8) (2026-04-10) + +### Bug Fixes + +* fix(java-spanner): use the existing dependency versions (#12746) ([8650bc6](https://github.com/googleapis/google-cloud-java/commit/8650bc6d907a5ad25f191a3d83d993d6d069694e)) +* fix(spanner): preserve all async cache updates (#12740) ([b8bf432](https://github.com/googleapis/google-cloud-java/commit/b8bf432f48f48bb454ba0ea50e40bfabca0ebc24)) +* fix(spanner): fix grpc-gcp affinity cleanup and multiplexed channel usage leaks (#12726) ([55c9857](https://github.com/googleapis/google-cloud-java/commit/55c985776700b1219ece39a519021030eb18d927)) +* fix(spanner): ensure executeQueryAsync is non-blocking (#12715) ([b7e34d2](https://github.com/googleapis/google-cloud-java/commit/b7e34d22191df6bf7fc2aa30bd83234312dd89c6)) +* fix(spanner): honor built-in metrics opt-out for gRPC metrics exporter (#12711) ([57baaea](https://github.com/googleapis/google-cloud-java/commit/57baaeaae5ef1f819e04b253dfcf570499ccc110)) +* fix: update Version.java and correct spanner version for 1.83.0 release (#12712) ([c2147fc](https://github.com/googleapis/google-cloud-java/commit/c2147fc9ab767b0546e6f71483e3f0af1a99740c)) + + +## [6.114.0](https://github.com/googleapis/google-cloud-java/compare/55c4e0f125c...v1.83.0-sdk-platform-java) (2026-04-08) + +* No change + +## [6.113.0](https://github.com/googleapis/google-cloud-java/compare/8e13cf00a16...55c4e0f125c) (2026-03-31) + +* No change + + ## [6.112.0](https://github.com/googleapis/java-spanner/compare/v6.111.1...v6.112.0) (2026-03-17) @@ -3704,4 +3736,4 @@ Apologies for the inconvenience. ### Dependencies -* update dependency org.jacoco:jacoco-maven-plugin to v0.8.5 ([#7023](https://www.github.com/googleapis/java-spanner/issues/7023)) ([d8b6438](https://www.github.com/googleapis/java-spanner/commit/d8b6438aa3b881c1c9baff584a74813664be4df8)) +* update dependency org.jacoco:jacoco-maven-plugin to v0.8.5 ([#7023](https://www.github.com/googleapis/java-spanner/issues/7023)) ([d8b6438](https://www.github.com/googleapis/java-spanner/commit/d8b6438aa3b881c1c9baff584a74813664be4df8)) \ No newline at end of file