From d3495c6c90c506340094468b13329af21761b791 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Mon, 25 Nov 2019 10:30:09 -0500 Subject: [PATCH 001/201] remove unused dependencies (#91) --- build.gradle | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 2c63217c3..0178b4dbb 100644 --- a/build.gradle +++ b/build.gradle @@ -48,10 +48,6 @@ ext { junit: 'junit:junit:4.12', mockito: 'org.mockito:mockito-core:1.10.19', truth: 'com.google.truth:truth:1.0', - commons: 'org.apache.commons:commons-lang3:3.5', - - // Formatter - javaFomatter: 'com.google.googlejavaformat:google-java-format:0.1-alpha' ] } @@ -70,8 +66,7 @@ dependencies { testCompile libraries.junit, libraries.mockito, - libraries.truth, - libraries.commons + libraries.truth } clean.doFirst { From 0761dde9cf8e1789d4a6c8c68fffebba788576db Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Mon, 25 Nov 2019 12:07:55 -0600 Subject: [PATCH 002/201] Add Kokoro release scripts (#88) --- .kokoro/build.sh | 27 +++++++++++++++ .kokoro/common.cfg | 13 ++++++++ .kokoro/continuous/common.cfg | 24 +++++++++++++ .kokoro/continuous/java11.cfg | 7 ++++ .kokoro/continuous/java7.cfg | 7 ++++ .kokoro/continuous/java8.cfg | 7 ++++ .kokoro/presubmit/common.cfg | 24 +++++++++++++ .kokoro/presubmit/java11.cfg | 7 ++++ .kokoro/presubmit/java7.cfg | 7 ++++ .kokoro/presubmit/java8.cfg | 7 ++++ .kokoro/release/common.cfg | 49 +++++++++++++++++++++++++++ .kokoro/release/common.sh | 40 ++++++++++++++++++++++ .kokoro/release/drop.cfg | 5 +++ .kokoro/release/drop.sh | 19 +++++++++++ .kokoro/release/promote.cfg | 5 +++ .kokoro/release/promote.sh | 31 +++++++++++++++++ .kokoro/release/publish_javadoc.cfg | 19 +++++++++++ .kokoro/release/publish_javadoc.sh | 52 +++++++++++++++++++++++++++++ .kokoro/release/stage.cfg | 35 +++++++++++++++++++ .kokoro/release/stage.sh | 38 +++++++++++++++++++++ .kokoro/trampoline.sh | 24 +++++++++++++ build.gradle | 3 ++ 22 files changed, 450 insertions(+) create mode 100755 .kokoro/build.sh create mode 100644 .kokoro/common.cfg create mode 100644 .kokoro/continuous/common.cfg create mode 100644 .kokoro/continuous/java11.cfg create mode 100644 .kokoro/continuous/java7.cfg create mode 100644 .kokoro/continuous/java8.cfg create mode 100644 .kokoro/presubmit/common.cfg create mode 100644 .kokoro/presubmit/java11.cfg create mode 100644 .kokoro/presubmit/java7.cfg create mode 100644 .kokoro/presubmit/java8.cfg create mode 100644 .kokoro/release/common.cfg create mode 100755 .kokoro/release/common.sh create mode 100644 .kokoro/release/drop.cfg create mode 100755 .kokoro/release/drop.sh create mode 100644 .kokoro/release/promote.cfg create mode 100755 .kokoro/release/promote.sh create mode 100644 .kokoro/release/publish_javadoc.cfg create mode 100755 .kokoro/release/publish_javadoc.sh create mode 100644 .kokoro/release/stage.cfg create mode 100755 .kokoro/release/stage.sh create mode 100755 .kokoro/trampoline.sh diff --git a/.kokoro/build.sh b/.kokoro/build.sh new file mode 100755 index 000000000..dad012856 --- /dev/null +++ b/.kokoro/build.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +cd github/api-common-java/ + +# Print out Java +java -version +echo $JOB_TYPE + +./gradlew assemble +./gradlew build install + +bash $KOKORO_GFILE_DIR/codecov.sh diff --git a/.kokoro/common.cfg b/.kokoro/common.cfg new file mode 100644 index 000000000..f10834a28 --- /dev/null +++ b/.kokoro/common.cfg @@ -0,0 +1,13 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Download trampoline resources. These will be in ${KOKORO_GFILE_DIR} +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# All builds use the trampoline script to run in docker. +build_file: "api-common-java/.kokoro/trampoline.sh" + +# Tell the trampoline which build file to use. +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/build.sh" +} diff --git a/.kokoro/continuous/common.cfg b/.kokoro/continuous/common.cfg new file mode 100644 index 000000000..1c23fa586 --- /dev/null +++ b/.kokoro/continuous/common.cfg @@ -0,0 +1,24 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "api-common-java/.kokoro/trampoline.sh" + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/build.sh" +} + +env_vars: { + key: "JOB_TYPE" + value: "test" +} diff --git a/.kokoro/continuous/java11.cfg b/.kokoro/continuous/java11.cfg new file mode 100644 index 000000000..709f2b4c7 --- /dev/null +++ b/.kokoro/continuous/java11.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java11" +} diff --git a/.kokoro/continuous/java7.cfg b/.kokoro/continuous/java7.cfg new file mode 100644 index 000000000..cb24f44ee --- /dev/null +++ b/.kokoro/continuous/java7.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java7" +} diff --git a/.kokoro/continuous/java8.cfg b/.kokoro/continuous/java8.cfg new file mode 100644 index 000000000..3b017fc80 --- /dev/null +++ b/.kokoro/continuous/java8.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} diff --git a/.kokoro/presubmit/common.cfg b/.kokoro/presubmit/common.cfg new file mode 100644 index 000000000..1c23fa586 --- /dev/null +++ b/.kokoro/presubmit/common.cfg @@ -0,0 +1,24 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "api-common-java/.kokoro/trampoline.sh" + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/build.sh" +} + +env_vars: { + key: "JOB_TYPE" + value: "test" +} diff --git a/.kokoro/presubmit/java11.cfg b/.kokoro/presubmit/java11.cfg new file mode 100644 index 000000000..709f2b4c7 --- /dev/null +++ b/.kokoro/presubmit/java11.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java11" +} diff --git a/.kokoro/presubmit/java7.cfg b/.kokoro/presubmit/java7.cfg new file mode 100644 index 000000000..cb24f44ee --- /dev/null +++ b/.kokoro/presubmit/java7.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java7" +} diff --git a/.kokoro/presubmit/java8.cfg b/.kokoro/presubmit/java8.cfg new file mode 100644 index 000000000..3b017fc80 --- /dev/null +++ b/.kokoro/presubmit/java8.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg new file mode 100644 index 000000000..c22ce6933 --- /dev/null +++ b/.kokoro/release/common.cfg @@ -0,0 +1,49 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "api-common-java/.kokoro/trampoline.sh" + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 70247 + keyname: "maven-gpg-keyring" + } + } +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 70247 + keyname: "maven-gpg-passphrase" + } + } +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 70247 + keyname: "maven-gpg-pubkeyring" + } + } +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 70247 + keyname: "sonatype-credentials" + } + } +} diff --git a/.kokoro/release/common.sh b/.kokoro/release/common.sh new file mode 100755 index 000000000..d5738d430 --- /dev/null +++ b/.kokoro/release/common.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +# Get secrets from keystore and set and environment variables +setup_environment_secrets() { + export GPG_PASSPHRASE=$(cat ${KOKORO_KEYSTORE_DIR}/70247_maven-gpg-passphrase) + export GPG_TTY=$(tty) + export GPG_HOMEDIR=/gpg + mkdir $GPG_HOMEDIR + mv ${KOKORO_KEYSTORE_DIR}/70247_maven-gpg-pubkeyring $GPG_HOMEDIR/pubring.gpg + mv ${KOKORO_KEYSTORE_DIR}/70247_maven-gpg-keyring $GPG_HOMEDIR/secring.gpg + export GPG_KEY_ID=$(echo -n $(gpg --with-colons ${GPG_HOMEDIR}/pubring.gpg | awk -F':' '/pub/{ print $5 }')) + export SONATYPE_USERNAME=$(cat ${KOKORO_KEYSTORE_DIR}/70247_sonatype-credentials | cut -f1 -d'|') + export SONATYPE_PASSWORD=$(cat ${KOKORO_KEYSTORE_DIR}/70247_sonatype-credentials | cut -f2 -d'|') +} + +create_gradle_properties_file() { + echo " +signing.gnupg.executable=gpg +signing.gnupg.homeDir=${GPG_HOMEDIR} +signing.gnupg.keyName=${GPG_KEY_ID} +signing.gnupg.passphrase=${GPG_PASSPHRASE} + +ossrhUsername=${SONATYPE_USERNAME} +ossrhPassword=${SONATYPE_PASSWORD}" > $1 +} diff --git a/.kokoro/release/drop.cfg b/.kokoro/release/drop.cfg new file mode 100644 index 000000000..feb878972 --- /dev/null +++ b/.kokoro/release/drop.cfg @@ -0,0 +1,5 @@ +# Format: //devtools/kokoro/config/proto/build.proto + env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/drop.sh" +} diff --git a/.kokoro/release/drop.sh b/.kokoro/release/drop.sh new file mode 100755 index 000000000..ce6ae7543 --- /dev/null +++ b/.kokoro/release/drop.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +echo "This dropping a staged repo does not appear supported by the gradle-nexus-staging-plugin" +exit 1 diff --git a/.kokoro/release/promote.cfg b/.kokoro/release/promote.cfg new file mode 100644 index 000000000..d69f1d6f2 --- /dev/null +++ b/.kokoro/release/promote.cfg @@ -0,0 +1,5 @@ +# Format: //devtools/kokoro/config/proto/build.proto + env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/promote.sh" +} diff --git a/.kokoro/release/promote.sh b/.kokoro/release/promote.sh new file mode 100755 index 000000000..2dcfd256d --- /dev/null +++ b/.kokoro/release/promote.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +# STAGING_REPOSITORY_ID must be set +#if [ -z "${STAGING_REPOSITORY_ID}" ]; then +# echo "Missing STAGING_REPOSITORY_ID environment variable" +# exit 1 +#fi + +source $(dirname "$0")/common.sh +pushd $(dirname "$0")/../../ + +setup_environment_secrets +mkdir -p ${HOME}/.gradle +create_gradle_properties_file "${HOME}/.gradle/gradle.properties" + +./gradlew closeAndReleaseRepository diff --git a/.kokoro/release/publish_javadoc.cfg b/.kokoro/release/publish_javadoc.cfg new file mode 100644 index 000000000..043f92f13 --- /dev/null +++ b/.kokoro/release/publish_javadoc.cfg @@ -0,0 +1,19 @@ +# Format: //devtools/kokoro/config/proto/build.proto +env_vars: { + key: "STAGING_BUCKET" + value: "docs-staging" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/publish_javadoc.sh" +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "docuploader_service_account" + } + } +} diff --git a/.kokoro/release/publish_javadoc.sh b/.kokoro/release/publish_javadoc.sh new file mode 100755 index 000000000..09e830704 --- /dev/null +++ b/.kokoro/release/publish_javadoc.sh @@ -0,0 +1,52 @@ +#!/bin/bash +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +if [[ -z "${CREDENTIALS}" ]]; then + CREDENTIALS=${KOKORO_KEYSTORE_DIR}/73713_docuploader_service_account +fi + +if [[ -z "${STAGING_BUCKET}" ]]; then + echo "Need to set STAGING_BUCKET environment variable" + exit 1 +fi + +# work from the git root directory +pushd $(dirname "$0")/../../ + +# install docuploader package +python3 -m pip install gcp-docuploader + +NAME=api-common +VERSION=$(grep ${NAME}: versions.txt | cut -d: -f3) + +# build the docs +./gradlew javadocCombined + +pushd tmp_docs + +# create metadata +python3 -m docuploader create-metadata \ + --name ${NAME} \ + --version ${VERSION} \ + --language java + +# upload docs +python3 -m docuploader upload . \ + --credentials ${CREDENTIALS} \ + --staging-bucket ${STAGING_BUCKET} + +popd diff --git a/.kokoro/release/stage.cfg b/.kokoro/release/stage.cfg new file mode 100644 index 000000000..4016988c9 --- /dev/null +++ b/.kokoro/release/stage.cfg @@ -0,0 +1,35 @@ +# Format: //devtools/kokoro/config/proto/build.proto + env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/stage.sh" +} + +# Fetch the token needed for reporting release status to GitHub +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "yoshi-automation-github-key" + } + } +} + +# Fetch magictoken to use with Magic Github Proxy +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "releasetool-magictoken" + } + } +} + +# Fetch api key to use with Magic Github Proxy +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "magic-github-proxy-api-key" + } + } +} diff --git a/.kokoro/release/stage.sh b/.kokoro/release/stage.sh new file mode 100755 index 000000000..f927ce143 --- /dev/null +++ b/.kokoro/release/stage.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +if [[ -n "${AUTORELEASE_PR}" ]] +then + # Start the releasetool reporter + python3 -m pip install gcp-releasetool + python3 -m releasetool publish-reporter-script > /tmp/publisher-script; source /tmp/publisher-script +fi + +source $(dirname "$0")/common.sh +MAVEN_SETTINGS_FILE=$(realpath $(dirname "$0")/../../)/settings.xml +pushd $(dirname "$0")/../../ + +setup_environment_secrets +mkdir -p ${HOME}/.gradle +create_gradle_properties_file "${HOME}/.gradle/gradle.properties" + +./gradlew assemble uploadArchives + +if [[ -n "${AUTORELEASE_PR}" ]] +then + ./gradlew closeAndReleaseRepository +fi diff --git a/.kokoro/trampoline.sh b/.kokoro/trampoline.sh new file mode 100755 index 000000000..3e90f6494 --- /dev/null +++ b/.kokoro/trampoline.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +set -eo pipefail +# Always run the cleanup script, regardless of the success of bouncing into +# the container. +function cleanup() { + chmod +x ${KOKORO_GFILE_DIR}/trampoline_cleanup.sh + ${KOKORO_GFILE_DIR}/trampoline_cleanup.sh + echo "cleanup"; +} +trap cleanup EXIT +python3 "${KOKORO_GFILE_DIR}/trampoline_v1.py" diff --git a/build.gradle b/build.gradle index 0178b4dbb..5aa3faa66 100644 --- a/build.gradle +++ b/build.gradle @@ -190,6 +190,9 @@ artifacts { signing { required { gradle.taskGraph.hasTask("uploadArchives") } + if (project.hasProperty('signing.gnupg.executable')) { + useGpgCmd() + } sign configurations.archives } From cb7171e7b7b84618324a8f453b1a7d37a27e2d16 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 11 Dec 2019 18:36:06 -0500 Subject: [PATCH 003/201] update autovalue (#103) * update autovalue * auto value requires Java 8 compiler * give auto_value_annotations compile scope --- .travis.yml | 2 +- build.gradle | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 058f65fc9..2e07a726e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ addons: hostname: fake-hostname-to-work-around-travis-bug jdk: - oraclejdk8 - - openjdk7 + - openjdk8 script: ./gradlew check --info after_success: diff --git a/build.gradle b/build.gradle index 5aa3faa66..29d33638a 100644 --- a/build.gradle +++ b/build.gradle @@ -39,9 +39,10 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7', + auto_value: 'com.google.auto.value:auto-value:1.7', guava: 'com.google.guava:guava:28.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - autovalue: 'com.google.auto.value:auto-value:1.1', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.3', // Testing @@ -57,12 +58,15 @@ repositories { } dependencies { + + annotationProcessor libraries.auto_value + compile libraries.guava, libraries.jsr305, - libraries.javax_annotations + libraries.javax_annotations, + libraries.auto_value_annotations - compileOnly libraries.autovalue, - libraries.error_prone_annotations + compileOnly libraries.error_prone_annotations testCompile libraries.junit, libraries.mockito, @@ -134,9 +138,8 @@ configurations { } dependencies { - codeGeneration libraries.autovalue, libraries.jsr305 - compile libraries.jsr305 - compileOnly libraries.autovalue + codeGeneration libraries.auto_value, libraries.jsr305 + compile libraries.jsr305, libraries.auto_value_annotations } compileJava.classpath += configurations.codeGeneration From 9538997378c638fd4d38777612a024a0a3501fca Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 19 Feb 2020 22:28:38 +0100 Subject: [PATCH 004/201] Update dependency junit:junit to v4.13 (#105) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 29d33638a..ebfc6d56b 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.3', // Testing - junit: 'junit:junit:4.12', + junit: 'junit:junit:4.13', mockito: 'org.mockito:mockito-core:1.10.19', truth: 'com.google.truth:truth:1.0', ] From c3319b79459fda38cb30f2535fd6c39efee2fae2 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 19 Feb 2020 22:29:55 +0100 Subject: [PATCH 005/201] Update dependency com.google.truth:truth to v1.0.1 (#107) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ebfc6d56b..b12fbf172 100644 --- a/build.gradle +++ b/build.gradle @@ -48,7 +48,7 @@ ext { // Testing junit: 'junit:junit:4.13', mockito: 'org.mockito:mockito-core:1.10.19', - truth: 'com.google.truth:truth:1.0', + truth: 'com.google.truth:truth:1.0.1', ] } From c4c1fff02b4d0c2f37f5f1f1c32b94c9db3b76ab Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 19 Feb 2020 16:38:23 -0500 Subject: [PATCH 006/201] deps: update guava to 28.2 (#110) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b12fbf172..295c2be43 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ ext { javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7', auto_value: 'com.google.auto.value:auto-value:1.7', - guava: 'com.google.guava:guava:28.1-android', + guava: 'com.google.guava:guava:28.2-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.3', From 4848c9cf1cba8b9eb78b5b5ff0260d8326097296 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 24 Feb 2020 16:18:13 +0100 Subject: [PATCH 007/201] chore(deps): update dependency com.google.errorprone:error_prone_annotations to v2.3.4 (#111) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 295c2be43..24e5b0af7 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ ext { auto_value: 'com.google.auto.value:auto-value:1.7', guava: 'com.google.guava:guava:28.2-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.3', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.4', // Testing junit: 'junit:junit:4.13', From f125067440b40cadd5d9e857b62da607db9fc9aa Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 24 Feb 2020 16:18:56 +0100 Subject: [PATCH 008/201] Update dependency io.codearte.gradle.nexus:gradle-nexus-staging-plugin to v0.21.2 (#104) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 24e5b0af7..e7220b02b 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { } dependencies { classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.6", - "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.8.0" + "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.2" } } From f9320c361eeea642929cec137fece445e27ee374 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 28 Feb 2020 21:23:29 +0100 Subject: [PATCH 009/201] chore(deps): update dependency gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin to v0.8 (#109) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e7220b02b..b4e410765 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { jcenter() } dependencies { - classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.6", + classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.8", "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.2" } } From 8d40a11357c3bb614d0442f3b9341e7830830464 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Fri, 13 Mar 2020 11:27:31 -0700 Subject: [PATCH 010/201] feat: add @BetaApi ApiFutures.catchingAsync (#117) Add new ApiFuture.catchingAsync method mirroring ApiFuture.catching, except allowing for an ApiAsyncFunction to be passed instead of ApiFunction. I tried to match the existing signature that allows the callback to return '? extends V' but this does not seem to be possible (see transformAsync). --- .../java/com/google/api/core/ApiFutures.java | 21 +++++++++++++++++++ .../com/google/api/core/ApiFuturesTest.java | 18 ++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/main/java/com/google/api/core/ApiFutures.java b/src/main/java/com/google/api/core/ApiFutures.java index d0638f1f6..d02892619 100644 --- a/src/main/java/com/google/api/core/ApiFutures.java +++ b/src/main/java/com/google/api/core/ApiFutures.java @@ -104,6 +104,27 @@ public static ApiFuture catching( return new ListenableFutureToApiFuture(catchingFuture); } + @BetaApi + public static ApiFuture catchingAsync( + ApiFuture input, + Class exceptionType, + final ApiAsyncFunction callback, + Executor executor) { + ListenableFuture catchingFuture = + Futures.catchingAsync( + listenableFutureForApiFuture(input), + exceptionType, + new AsyncFunction() { + @Override + public ListenableFuture apply(X exception) throws Exception { + ApiFuture result = callback.apply(exception); + return listenableFutureForApiFuture(result); + } + }, + executor); + return new ListenableFutureToApiFuture<>(catchingFuture); + } + public static ApiFuture immediateFuture(V value) { return new ListenableFutureToApiFuture<>(Futures.immediateFuture(value)); } diff --git a/src/test/java/com/google/api/core/ApiFuturesTest.java b/src/test/java/com/google/api/core/ApiFuturesTest.java index eec0fd8f3..de10b7ee8 100644 --- a/src/test/java/com/google/api/core/ApiFuturesTest.java +++ b/src/test/java/com/google/api/core/ApiFuturesTest.java @@ -83,6 +83,24 @@ public Integer apply(Exception ex) { assertThat(fallback.get()).isEqualTo(42); } + @Test + public void testCatchAsync() throws Exception { + SettableApiFuture future = SettableApiFuture.create(); + ApiFuture fallback = + ApiFutures.catchingAsync( + future, + Exception.class, + new ApiAsyncFunction() { + @Override + public ApiFuture apply(Exception ex) { + return ApiFutures.immediateFuture(42); + } + }, + directExecutor()); + future.setException(new Exception()); + assertThat(fallback.get()).isEqualTo(42); + } + @Test public void testTransform() throws Exception { SettableApiFuture inputFuture = SettableApiFuture.create(); From b6e9dadb29dfa124a39857f0784cfd1387d7507e Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 25 Mar 2020 14:14:21 -0700 Subject: [PATCH 011/201] chore: release v1.9.0 (#118) --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 4df9f77d1..f8e233b27 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.8.2-SNAPSHOT +1.9.0 From 140d26d4bd1d99ba3ead4dc5b78f8a3cd5cc3ec4 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Wed, 13 May 2020 15:10:12 -0700 Subject: [PATCH 012/201] chore: support complex resource identifiers (#125) * chore: support complex resource identifiers * remove debug printf * fix: clean up PathTemplate.java and tests --- .../google/api/pathtemplate/PathTemplate.java | 343 ++++++++++++------ .../api/pathtemplate/PathTemplateTest.java | 252 ++++++++++++- 2 files changed, 479 insertions(+), 116 deletions(-) diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java index e21becd23..970fa510e 100644 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ b/src/main/java/com/google/api/pathtemplate/PathTemplate.java @@ -40,6 +40,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -139,12 +140,28 @@ public class PathTemplate { // A splitter on slash. private static final Splitter SLASH_SPLITTER = Splitter.on('/').trimResults(); + // A regex to match the valid complex resource ID delimiters. + private static final Pattern COMPLEX_DELIMITER_PATTERN = Pattern.compile("[_\\-\\.~]"); + + // A regex to match multiple complex resource ID delimiters. + private static final Pattern MULTIPLE_COMPLEX_DELIMITER_PATTERN = + Pattern.compile("\\}[_\\-\\.~]{2,}\\{"); + + // A regex to match a missing complex resource ID delimiter. + private static final Pattern MISSING_COMPLEX_DELIMITER_PATTERN = Pattern.compile("\\}\\{"); + + // A regex to match invalid complex resource ID delimiters. + private static final Pattern INVALID_COMPLEX_DELIMITER_PATTERN = + Pattern.compile("\\}[^_\\-\\.~]\\{"); + + // A regex to match a closing segment (end brace) followed by one complex resource ID delimiter. + private static final Pattern END_SEGMENT_COMPLEX_DELIMITER_PATTERN = + Pattern.compile("\\}[_\\-\\.~]{1}"); + // Helper Types // ============ - /** - * Specifies a path segment kind. - */ + /** Specifies a path segment kind. */ enum SegmentKind { /** A literal path segment. */ LITERAL, @@ -165,37 +182,34 @@ enum SegmentKind { END_BINDING, } - /** - * Specifies a path segment. - */ + /** Specifies a path segment. */ @AutoValue abstract static class Segment { - /** - * A constant for the WILDCARD segment. - */ + /** A constant for the WILDCARD segment. */ private static final Segment WILDCARD = create(SegmentKind.WILDCARD, "*"); - /** - * A constant for the PATH_WILDCARD segment. - */ + /** A constant for the PATH_WILDCARD segment. */ private static final Segment PATH_WILDCARD = create(SegmentKind.PATH_WILDCARD, "**"); - /** - * A constant for the END_BINDING segment. - */ + /** A constant for the END_BINDING segment. */ private static final Segment END_BINDING = create(SegmentKind.END_BINDING, ""); - /** - * Creates a segment of given kind and value. - */ + /** Creates a segment of given kind and value. */ private static Segment create(SegmentKind kind, String value) { - return new AutoValue_PathTemplate_Segment(kind, value); + return new AutoValue_PathTemplate_Segment(kind, value, ""); } - /** - * The path segment kind. - */ + private static Segment wildcardCreate(String complexSeparator) { + return new AutoValue_PathTemplate_Segment( + SegmentKind.WILDCARD, + "*", + !complexSeparator.isEmpty() && COMPLEX_DELIMITER_PATTERN.matcher(complexSeparator).find() + ? complexSeparator + : ""); + } + + /** The path segment kind. */ abstract SegmentKind kind(); /** @@ -204,9 +218,9 @@ private static Segment create(SegmentKind kind, String value) { */ abstract String value(); - /** - * Returns true of this segment is one of the wildcards, - */ + abstract String complexSeparator(); + + /** Returns true of this segment is one of the wildcards, */ boolean isAnyWildcard() { return kind() == SegmentKind.WILDCARD || kind() == SegmentKind.PATH_WILDCARD; } @@ -277,9 +291,7 @@ private PathTemplate(Iterable segments, boolean urlEncoding) { this.urlEncoding = urlEncoding; } - /** - * Returns the set of variable names used in the template. - */ + /** Returns the set of variable names used in the template. */ public Set vars() { return bindings.keySet(); } @@ -363,16 +375,12 @@ public PathTemplate subTemplate(String varName) { String.format("Variable '%s' is undefined in template '%s'", varName, this.toRawString())); } - /** - * Returns true of this template ends with a literal. - */ + /** Returns true of this template ends with a literal. */ public boolean endsWithLiteral() { return segments.get(segments.size() - 1).kind() == SegmentKind.LITERAL; } - /** - * Returns true of this template ends with a custom verb. - */ + /** Returns true of this template ends with a custom verb. */ public boolean endsWithCustomVerb() { return segments.get(segments.size() - 1).kind() == SegmentKind.CUSTOM_VERB; } @@ -464,9 +472,7 @@ public Map validatedMatch(String path, String exceptionMessagePr return matchMap; } - /** - * Returns true if the template matches the path. - */ + /** Returns true if the template matches the path. */ public boolean matches(String path) { return match(path) != null; } @@ -565,7 +571,8 @@ private Map match(String path, boolean forceHostName) { return ImmutableMap.copyOf(values); } - // Aligns input to start of literal value of literal or binding segment if input contains hostname. + // Aligns input to start of literal value of literal or binding segment if input contains + // hostname. private int alignInputToAlignableSegment(List input, int inPos, Segment segment) { switch (segment.kind()) { case BINDING: @@ -597,6 +604,7 @@ private boolean match( int segPos, Map values) { String currentVar = null; + List modifiableInput = new ArrayList<>(input); while (segPos < segments.size()) { Segment seg = segments.get(segPos++); switch (seg.kind()) { @@ -614,18 +622,30 @@ private boolean match( break; case LITERAL: case WILDCARD: - if (inPos >= input.size()) { + if (inPos >= modifiableInput.size()) { // End of input return false; } // Check literal match. - String next = decodeUrl(input.get(inPos++)); + String next = decodeUrl(modifiableInput.get(inPos++)); if (seg.kind() == SegmentKind.LITERAL) { if (!seg.value().equals(next)) { // Literal does not match. return false; } } + if (seg.kind() == SegmentKind.WILDCARD && !seg.complexSeparator().isEmpty()) { + // Parse the complex resource separators one by one. + int complexSeparatorIndex = next.indexOf(seg.complexSeparator()); + if (complexSeparatorIndex >= 0) { + modifiableInput.add(inPos, next.substring(complexSeparatorIndex + 1)); + next = next.substring(0, complexSeparatorIndex); + modifiableInput.set(inPos - 1, next); + } else { + // No complex resource ID separator found in the literal when we expected one. + return false; + } + } if (currentVar != null) { // Create or extend current match values.put(currentVar, concatCaptures(values.get(currentVar), next)); @@ -645,18 +665,19 @@ private boolean match( segsToMatch++; } } - int available = (input.size() - inPos) - segsToMatch; + int available = (modifiableInput.size() - inPos) - segsToMatch; // If this segment is empty, make sure it is still captured. if (available == 0 && !values.containsKey(currentVar)) { values.put(currentVar, ""); } while (available-- > 0) { values.put( - currentVar, concatCaptures(values.get(currentVar), decodeUrl(input.get(inPos++)))); + currentVar, + concatCaptures(values.get(currentVar), decodeUrl(modifiableInput.get(inPos++)))); } } } - return inPos == input.size(); + return inPos == modifiableInput.size(); } private static String concatCaptures(@Nullable String cur, String next) { @@ -681,9 +702,7 @@ public String instantiate(Map values) { return instantiate(values, false); } - /** - * Shortcut for {@link #instantiate(Map)} with a vararg parameter for keys and values. - */ + /** Shortcut for {@link #instantiate(Map)} with a vararg parameter for keys and values. */ public String instantiate(String... keysAndValues) { ImmutableMap.Builder builder = ImmutableMap.builder(); for (int i = 0; i < keysAndValues.length; i += 2) { @@ -850,89 +869,118 @@ private static ImmutableList parseTemplate(String template) { int pathWildCardBound = 0; for (String seg : Splitter.on('/').trimResults().split(template)) { + if (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(0, 1)).find() + || COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(seg.length() - 1)).find()) { + throw new ValidationException("parse error: invalid begin or end character in '%s'", seg); + } + // Disallow zero or multiple delimiters between variable names. + if (MULTIPLE_COMPLEX_DELIMITER_PATTERN.matcher(seg).find() + || MISSING_COMPLEX_DELIMITER_PATTERN.matcher(seg).find()) { + throw new ValidationException( + "parse error: missing or 2+ consecutive delimiter characters in '%s'", seg); + } // If segment starts with '{', a binding group starts. boolean bindingStarts = seg.startsWith("{"); boolean implicitWildcard = false; + boolean complexDelimiterFound = false; if (bindingStarts) { if (varName != null) { throw new ValidationException("parse error: nested binding in '%s'", template); } seg = seg.substring(1); - int i = seg.indexOf('='); - if (i <= 0) { - // Possibly looking at something like "{name}" with implicit wildcard. - if (seg.endsWith("}")) { - // Remember to add an implicit wildcard later. - implicitWildcard = true; - varName = seg.substring(0, seg.length() - 1).trim(); - seg = seg.substring(seg.length() - 1).trim(); - } else { - throw new ValidationException("parse error: invalid binding syntax in '%s'", template); - } - } else { - // Looking at something like "{name=wildcard}". - varName = seg.substring(0, i).trim(); - seg = seg.substring(i + 1).trim(); + // Check for invalid complex resource ID delimiters. + if (INVALID_COMPLEX_DELIMITER_PATTERN.matcher(seg).find()) { + throw new ValidationException( + "parse error: invalid complex resource ID delimiter character in '%s'", seg); } - builder.add(Segment.create(SegmentKind.BINDING, varName)); - } - // If segment ends with '}', a binding group ends. Remove the brace and remember. - boolean bindingEnds = seg.endsWith("}"); - if (bindingEnds) { - seg = seg.substring(0, seg.length() - 1).trim(); - } + Matcher complexPatternDelimiterMatcher = END_SEGMENT_COMPLEX_DELIMITER_PATTERN.matcher(seg); + complexDelimiterFound = complexPatternDelimiterMatcher.find(); - // Process the segment, after stripping off "{name=.." and "..}". - switch (seg) { - case "**": - case "*": - if ("**".equals(seg)) { - pathWildCardBound++; - } - Segment wildcard = seg.length() == 2 ? Segment.PATH_WILDCARD : Segment.WILDCARD; - if (varName == null) { - // Not in a binding, turn wildcard into implicit binding. - // "*" => "{$n=*}" - builder.add(Segment.create(SegmentKind.BINDING, "$" + freeWildcardCounter)); - freeWildcardCounter++; - builder.add(wildcard); - builder.add(Segment.END_BINDING); + // Look for complex resource names. + // Need to handle something like "{user_a}~{user_b}". + if (complexDelimiterFound) { + builder.addAll(parseComplexResourceId(seg)); + } else { + int i = seg.indexOf('='); + if (i <= 0) { + // Possibly looking at something like "{name}" with implicit wildcard. + if (seg.endsWith("}")) { + // Remember to add an implicit wildcard later. + implicitWildcard = true; + varName = seg.substring(0, seg.length() - 1).trim(); + seg = seg.substring(seg.length() - 1).trim(); + } else { + throw new ValidationException( + "parse error: invalid binding syntax in '%s'", template); + } } else { - builder.add(wildcard); + // Looking at something like "{name=wildcard}". + varName = seg.substring(0, i).trim(); + seg = seg.substring(i + 1).trim(); } - break; - case "": - if (!bindingEnds) { - throw new ValidationException( - "parse error: empty segment not allowed in '%s'", template); - } - // If the wildcard is implicit, seg will be empty. Just continue. - break; - default: - builder.add(Segment.create(SegmentKind.LITERAL, seg)); + builder.add(Segment.create(SegmentKind.BINDING, varName)); + } } - // End a binding. - if (bindingEnds) { - // Reset varName to null for next binding. - varName = null; + if (!complexDelimiterFound) { + // If segment ends with '}', a binding group ends. Remove the brace and remember. + boolean bindingEnds = seg.endsWith("}"); + if (bindingEnds) { + seg = seg.substring(0, seg.length() - 1).trim(); + } - if (implicitWildcard) { - // Looking at something like "{var}". Insert an implicit wildcard, as it is the same - // as "{var=*}". - builder.add(Segment.WILDCARD); + // Process the segment, after stripping off "{name=.." and "..}". + switch (seg) { + case "**": + case "*": + if ("**".equals(seg)) { + pathWildCardBound++; + } + Segment wildcard = seg.length() == 2 ? Segment.PATH_WILDCARD : Segment.WILDCARD; + if (varName == null) { + // Not in a binding, turn wildcard into implicit binding. + // "*" => "{$n=*}" + builder.add(Segment.create(SegmentKind.BINDING, "$" + freeWildcardCounter)); + freeWildcardCounter++; + builder.add(wildcard); + builder.add(Segment.END_BINDING); + } else { + builder.add(wildcard); + } + break; + case "": + if (!bindingEnds) { + throw new ValidationException( + "parse error: empty segment not allowed in '%s'", template); + } + // If the wildcard is implicit, seg will be empty. Just continue. + break; + default: + builder.add(Segment.create(SegmentKind.LITERAL, seg)); } - builder.add(Segment.END_BINDING); - } - if (pathWildCardBound > 1) { - // Report restriction on number of '**' in the pattern. There can be only one, which - // enables non-backtracking based matching. - throw new ValidationException( - "parse error: pattern must not contain more than one path wildcard ('**') in '%s'", - template); + // End a binding. + if (bindingEnds && !complexDelimiterFound) { + // Reset varName to null for next binding. + varName = null; + + if (implicitWildcard) { + // Looking at something like "{var}". Insert an implicit wildcard, as it is the same + // as "{var=*}". + builder.add(Segment.WILDCARD); + } + builder.add(Segment.END_BINDING); + } + + if (pathWildCardBound > 1) { + // Report restriction on number of '**' in the pattern. There can be only one, which + // enables non-backtracking based matching. + throw new ValidationException( + "parse error: pattern must not contain more than one path wildcard ('**') in '%s'", + template); + } } } @@ -942,6 +990,77 @@ private static ImmutableList parseTemplate(String template) { return builder.build(); } + private static List parseComplexResourceId(String seg) { + List segments = new ArrayList<>(); + List separatorIndices = new ArrayList<>(); + + Matcher complexPatternDelimiterMatcher = END_SEGMENT_COMPLEX_DELIMITER_PATTERN.matcher(seg); + boolean delimiterFound = complexPatternDelimiterMatcher.find(); + + while (delimiterFound) { + int delimiterIndex = complexPatternDelimiterMatcher.start(); + if (seg.substring(delimiterIndex).startsWith("}")) { + delimiterIndex += 1; + } + String currDelimiter = seg.substring(delimiterIndex, delimiterIndex + 1); + if (!COMPLEX_DELIMITER_PATTERN.matcher(currDelimiter).find()) { + throw new ValidationException( + "parse error: invalid complex ID delimiter '%s' in '%s'", currDelimiter, seg); + } + separatorIndices.add(currDelimiter); + delimiterFound = complexPatternDelimiterMatcher.find(delimiterIndex + 1); + } + // The last entry does not have a delimiter. + separatorIndices.add(""); + + String subVarName = null; + Iterable complexSubsegments = + Splitter.onPattern("\\}[_\\-\\.~]").trimResults().split(seg); + boolean complexSegImplicitWildcard = false; + int currIteratorIndex = 0; + for (String complexSeg : complexSubsegments) { + boolean subsegmentBindingStarts = complexSeg.startsWith("{"); + if (subsegmentBindingStarts) { + if (subVarName != null) { + throw new ValidationException("parse error: nested binding in '%s'", complexSeg); + } + complexSeg = complexSeg.substring(1); + } + subVarName = complexSeg.trim(); + + boolean subBindingEnds = complexSeg.endsWith("}"); + int i = complexSeg.indexOf('='); + if (i <= 0) { + // Possibly looking at something like "{name}" with implicit wildcard. + if (subBindingEnds) { + // Remember to add an implicit wildcard later. + complexSegImplicitWildcard = true; + subVarName = complexSeg.substring(0, complexSeg.length() - 1).trim(); + complexSeg = complexSeg.substring(complexSeg.length() - 1).trim(); + } + } else { + // Looking at something like "{name=wildcard}". + subVarName = complexSeg.substring(0, i).trim(); + complexSeg = complexSeg.substring(i + 1).trim(); + if (complexSeg.equals("**")) { + throw new ValidationException( + "parse error: wildcard path not allowed in complex ID resource '%s'", subVarName); + } + } + String complexDelimiter = + currIteratorIndex < separatorIndices.size() + ? separatorIndices.get(currIteratorIndex) + : ""; + segments.add(Segment.create(SegmentKind.BINDING, subVarName)); + segments.add(Segment.wildcardCreate(complexDelimiter)); + segments.add(Segment.END_BINDING); + subVarName = null; + + currIteratorIndex++; + } + return segments; + } + // Helpers // ======= @@ -1003,9 +1122,7 @@ private static void restore(ListIterator segments, int index) { // Equality and String Conversion // ============================== - /** - * Returns a pretty version of the template as a string. - */ + /** Returns a pretty version of the template as a string. */ @Override public String toString() { return toSyntax(segments, true); diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java index 45be25f3b..33b9033b8 100644 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java @@ -33,6 +33,9 @@ import com.google.common.collect.ImmutableMap; import com.google.common.truth.Truth; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Map; import org.junit.Rule; import org.junit.Test; @@ -40,9 +43,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -/** - * Tests for {@link PathTemplate}. - */ +/** Tests for {@link PathTemplate}. */ @RunWith(JUnit4.class) public class PathTemplateTest { @@ -171,6 +172,251 @@ public void matchWithUnboundInMiddle() { assertPositionalMatch(template.match("bar/foo/foo/foo/bar"), "foo/foo", "bar"); } + // Complex Resource ID Segments. + // ======== + + @Test + public void complexResourceIdBasicCases() { + // Separate by "~". + PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}"); + Map match = + template.match( + "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c~us-east3-a"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a}~{zone_b")).isNull(); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + + // Separate by "-". + template = PathTemplate.create("projects/{project}/zones/{zone_a}-{zone_b}"); + match = template.match("projects/project-123/zones/europe-west3-c~us-east3-a"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe"); + Truth.assertThat(match.get("zone_b")).isEqualTo("west3-c~us-east3-a"); + + // Separate by ".". + template = PathTemplate.create("projects/{project}/zones/{zone_a}.{zone_b}"); + match = template.match("projects/project-123/zones/europe-west3-c.us-east3-a"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + + // Separate by "_". + template = PathTemplate.create("projects/{project}/zones/{zone_a}_{zone_b}"); + match = template.match("projects/project-123/zones/europe-west3-c_us-east3-a"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + } + + @Test + public void complexResourceIdEqualsWildcard() { + PathTemplate template = PathTemplate.create("projects/{project=*}/zones/{zone_a=*}~{zone_b=*}"); + Map match = + template.match("projects/project-123/zones/europe-west3-c~us-east3-a"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a}~{zone_b")).isNull(); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + } + + @Test + public void complexResourceIdEqualsPathWildcard() { + thrown.expect(ValidationException.class); + PathTemplate template = PathTemplate.create("projects/{project=*}/zones/{zone_a=**}~{zone_b}"); + thrown.expectMessage( + String.format( + "parse error: wildcard path not allowed in complex ID resource '%s'", "zone_a")); + + template = PathTemplate.create("projects/{project=*}/zones/{zone_a}.{zone_b=**}"); + thrown.expectMessage( + String.format( + "parse error: wildcard path not allowed in complex ID resource '%s'", "zone_b")); + } + + @Test + public void complexResourceIdMissingMatches() { + PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}"); + Truth.assertThat(template.match("projects/project-123/zones/europe-west3-c")).isNull(); + + template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}.{zone_c}"); + Map match = + template.match("projects/project-123/zones/europe-west3-c~.us-east3-a"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a}~{zone_b")).isNull(); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEmpty(); + Truth.assertThat(match.get("zone_c")).isEqualTo("us-east3-a"); + } + + @Test + public void complexResourceIdNoSeparator() { + thrown.expect(ValidationException.class); + PathTemplate.create("projects/{project}/zones/{zone_a}{zone_b}"); + thrown.expectMessage( + String.format( + "parse error: missing or 2+ consecutive delimiter characters in '%s'", + "{zone_a}{zone_b}")); + + PathTemplate.create("projects/{project}/zones/{zone_a}_{zone_b}{zone_c}"); + thrown.expectMessage( + String.format( + "parse error: missing or 2+ consecutive delimiter characters in '%s'", + "{zone_a}_{zone_b}{zone_c}")); + } + + @Test + public void complexResourceIdInvalidDelimiter() { + thrown.expect(ValidationException.class); + // Not a comprehensive set of invalid delimiters, please check the class's defined pattern. + List someInvalidDelimiters = + new ArrayList<>(Arrays.asList("|", "!", "@", "a", "1", ",", "{", ")")); + for (String invalidDelimiter : someInvalidDelimiters) { + PathTemplate.create( + String.format("projects/{project=*}/zones/{zone_a}%s{zone_b}", invalidDelimiter)); + thrown.expectMessage( + String.format( + "parse error: invalid complex resource ID delimiter character in '%s'", + String.format("{zone_a}%s{zone_b}", invalidDelimiter))); + } + } + + @Test + public void complexResourceIdMixedSeparators() { + // Separate by a mix of delimiters. + PathTemplate template = + PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}.{zone_c}-{zone_d}"); + Map match = + template.match( + "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c~us-east3-a.us-west2-b-europe-west2-b"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + Truth.assertThat(match.get("zone_c")).isEqualTo("us"); + Truth.assertThat(match.get("zone_d")).isEqualTo("west2-b-europe-west2-b"); + + template = PathTemplate.create("projects/{project}/zones/{zone_a}.{zone_b}.{zone_c}~{zone_d}"); + match = + template.match( + "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c.us-east3-a.us-west2-b~europe-west2-b"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + Truth.assertThat(match.get("zone_c")).isEqualTo("us-west2-b"); + Truth.assertThat(match.get("zone_d")).isEqualTo("europe-west2-b"); + } + + @Test + public void complexResourceIdInParent() { + // One parent has a complex resource ID. + PathTemplate template = + PathTemplate.create( + "projects/{project}/zones/{zone_a}-{zone_b}_{zone_c}/machines/{machine}"); + Map match = + template.match( + "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c-us-east3-a_us-west2-b/machines/roomba"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe"); + Truth.assertThat(match.get("zone_b")).isEqualTo("west3-c-us-east3-a"); + Truth.assertThat(match.get("zone_c")).isEqualTo("us-west2-b"); + Truth.assertThat(match.get("machine")).isEqualTo("roomba"); + + // All parents and resource IDs have complex resource IDs. + template = + PathTemplate.create( + "projects/{foo}_{bar}/zones/{zone_a}-{zone_b}_{zone_c}/machines/{cell1}.{cell2}"); + match = + template.match( + "https://www.googleapis.com/compute/v1/projects/project_123/zones/europe-west3-c-us-east3-a_us-west2-b/machines/roomba.broomba"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); + Truth.assertThat(match.get("foo")).isEqualTo("project"); + Truth.assertThat(match.get("bar")).isEqualTo("123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe"); + Truth.assertThat(match.get("zone_b")).isEqualTo("west3-c-us-east3-a"); + Truth.assertThat(match.get("zone_c")).isEqualTo("us-west2-b"); + Truth.assertThat(match.get("cell1")).isEqualTo("roomba"); + Truth.assertThat(match.get("cell2")).isEqualTo("broomba"); + } + + @Test + public void complexResourceBasicInvalidIds() { + thrown.expect(ValidationException.class); + PathTemplate.create("projects/*/zones/~{zone_a}"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", "~{zone_a}")); + + PathTemplate.create("projects/*/zones/{zone_a}~"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", "{zone_a}~")); + + PathTemplate.create("projects/*/zones/.{zone_a}"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", ".{zone_a}")); + + PathTemplate.create("projects/*/zones/{zone_a}."); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", "{zone_a}.")); + + PathTemplate.create("projects/*/zones/-{zone_a}"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", "-{zone_a}")); + + PathTemplate.create("projects/*/zones/{zone_a}-"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", "{zone_a}-")); + + PathTemplate.create("projects/*/zones/_{zone_a}"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", "{zone_a}_")); + + PathTemplate.create("projects/*/zones/{zone_a}_"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", "{zone_a}_")); + } + + @Test + public void complexResourceMultipleDelimiters() { + thrown.expect(ValidationException.class); + PathTemplate.create("projects/*/zones/.-~{zone_a}"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", ".-~{zone_a}")); + + PathTemplate.create("projects/*/zones/{zone_a}~.{zone_b}"); + thrown.expectMessage( + String.format( + "parse error: missing or 2+ consecutive delimiter characters in '%s'", + "{zone_a}~.{zone_b}")); + + PathTemplate.create("projects/*/zones/{zone_a}~{zone_b}..{zone_c}"); + thrown.expectMessage( + String.format( + "parse error: missing or 2+ consecutive delimiter characters in '%s'", + "{zone_a}~{zone_b}..{zone_c}")); + + String pathString = "projects/project_123/zones/lorum~ipsum"; + PathTemplate template = PathTemplate.create("projects/*/zones/{zone_.~-a}~{zone_b}"); + template.validate(pathString, ""); + // No assertion - success is no exception thrown from template.validate(). + Map match = template.match(pathString); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("zone_.~-a")).isEqualTo("lorum"); + Truth.assertThat(match.get("zone_b")).isEqualTo("ipsum"); + } + // Validate // ======== From 100f16bc44fb71ec907f414c3ebec62fdfd1e64f Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Mon, 18 May 2020 13:15:51 -0400 Subject: [PATCH 013/201] -a (#138) update guava --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b4e410765..0c3f53571 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ ext { javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7', auto_value: 'com.google.auto.value:auto-value:1.7', - guava: 'com.google.guava:guava:28.2-android', + guava: 'com.google.guava:guava:29.0-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.4', From 3b1ff075105d5b0dca503cef0d1bb1878e4be0b0 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 18 May 2020 19:20:23 +0200 Subject: [PATCH 014/201] chore(deps): update dependency com.google.auto.value:auto-value-annotations to v1.7.2 (#136) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0c3f53571..14d4eb872 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7.2', auto_value: 'com.google.auto.value:auto-value:1.7', guava: 'com.google.guava:guava:29.0-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', From 5bc5b80c9960576ae7b9c3526b913ee3fa098233 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Mon, 18 May 2020 13:26:45 -0400 Subject: [PATCH 015/201] deps: prevent renovate-bot from updating to guava -jre versions (#142) fixes #140 --- renovate.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index f45d8f110..b76243f10 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,21 @@ { "extends": [ - "config:base" + ":separateMajorReleases", + ":combinePatchMinorReleases", + ":ignoreUnstable", + ":prImmediately", + ":updateNotScheduled", + ":automergeDisabled", + ":ignoreModulesAndTests", + ":maintainLockFilesDisabled", + ":autodetectPinVersions" + ], + "packageRules": [ + { + "packagePatterns": [ + "^com.google.guava:" + ], + "versionScheme": "docker" + } ] } From 68ae3d4fbe6a0e8f90f32a5d4da31f03f4b1a7c7 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 18 May 2020 22:24:29 +0200 Subject: [PATCH 016/201] chore(deps): update dependency com.google.auto.value:auto-value to v1.7.2 (#135) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 14d4eb872..859349425 100644 --- a/build.gradle +++ b/build.gradle @@ -40,7 +40,7 @@ ext { libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7.2', - auto_value: 'com.google.auto.value:auto-value:1.7', + auto_value: 'com.google.auto.value:auto-value:1.7.2', guava: 'com.google.guava:guava:29.0-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.4', From 1af5bfcff527915e417806cb34417ae2238e9ae2 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Tue, 26 May 2020 10:27:19 -0700 Subject: [PATCH 017/201] chore: release v1.9.1 (#144) --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index f8e233b27..9ab8337f3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.9.0 +1.9.1 From 4caf2cad09cde7b2050dfd3a85c44ba0e2746b94 Mon Sep 17 00:00:00 2001 From: Dmitry <58846611+dmitry-fa@users.noreply.github.com> Date: Wed, 27 May 2020 18:30:16 +0300 Subject: [PATCH 018/201] fix: update mockito dependency (#146) fix: update mockito dependency --- build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/build.gradle b/build.gradle index 859349425..4d5288a54 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,6 @@ ext { // Testing junit: 'junit:junit:4.13', - mockito: 'org.mockito:mockito-core:1.10.19', truth: 'com.google.truth:truth:1.0.1', ] } @@ -69,7 +68,6 @@ dependencies { compileOnly libraries.error_prone_annotations testCompile libraries.junit, - libraries.mockito, libraries.truth } From 8fb8068e72c219d2bf4c438aa61d957c3c85a2e1 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Wed, 3 Jun 2020 18:48:53 -0700 Subject: [PATCH 019/201] fix: parse collection wildcards and _deleted-topic_ patterns (#150) --- .../google/api/pathtemplate/PathTemplate.java | 21 +++++++++++++--- .../api/pathtemplate/PathTemplateTest.java | 25 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java index 970fa510e..45071968c 100644 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ b/src/main/java/com/google/api/pathtemplate/PathTemplate.java @@ -869,8 +869,17 @@ private static ImmutableList parseTemplate(String template) { int pathWildCardBound = 0; for (String seg : Splitter.on('/').trimResults().split(template)) { - if (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(0, 1)).find() - || COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(seg.length() - 1)).find()) { + // Handle _deleted-topic_ for PubSub. + if (seg.equals("_deleted-topic_")) { + builder.add(Segment.create(SegmentKind.LITERAL, seg)); + continue; + } + + boolean isLastSegment = (template.indexOf(seg) + seg.length()) == template.length(); + boolean isCollectionWildcard = !isLastSegment && (seg.equals("-") || seg.equals("-}")); + if (!isCollectionWildcard + && (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(0, 1)).find() + || COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(seg.length() - 1)).find())) { throw new ValidationException("parse error: invalid begin or end character in '%s'", seg); } // Disallow zero or multiple delimiters between variable names. @@ -896,7 +905,7 @@ private static ImmutableList parseTemplate(String template) { } Matcher complexPatternDelimiterMatcher = END_SEGMENT_COMPLEX_DELIMITER_PATTERN.matcher(seg); - complexDelimiterFound = complexPatternDelimiterMatcher.find(); + complexDelimiterFound = !isCollectionWildcard && complexPatternDelimiterMatcher.find(); // Look for complex resource names. // Need to handle something like "{user_a}~{user_b}". @@ -915,6 +924,8 @@ private static ImmutableList parseTemplate(String template) { throw new ValidationException( "parse error: invalid binding syntax in '%s'", template); } + } else if (seg.indexOf('-') <= 0 && isCollectionWildcard) { + implicitWildcard = true; } else { // Looking at something like "{name=wildcard}". varName = seg.substring(0, i).trim(); @@ -957,6 +968,10 @@ private static ImmutableList parseTemplate(String template) { } // If the wildcard is implicit, seg will be empty. Just continue. break; + case "-": + builder.add(Segment.WILDCARD); + implicitWildcard = false; + break; default: builder.add(Segment.create(SegmentKind.LITERAL, seg)); } diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java index 33b9033b8..ccac31f6d 100644 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java @@ -317,6 +317,31 @@ public void complexResourceIdMixedSeparators() { Truth.assertThat(match.get("zone_d")).isEqualTo("europe-west2-b"); } + @Test + public void collectionWildcardMatchingInParent() { + PathTemplate template = PathTemplate.create("v1/publishers/-/books/{book}"); + Map match = + template.match( + "https://example.googleapis.com/v1/publishers/publisher-abc/books/blockchain_for_babies"); + Truth.assertThat(match).isNotNull(); + + template = PathTemplate.create("/v1/{parent=rooms/-}/blurbs/{blurb}"); + match = template.match("https://example.googleapis.com/v1/rooms/den/blurbs/asdf"); + Truth.assertThat(match).isNotNull(); + } + + @Test + public void collectionWildcardMatchingInvalid() { + thrown.expect(ValidationException.class); + PathTemplate.create("v1/publishers/{publisher}/books/-"); + } + + @Test + public void complexResourceIdPubSubDeletedTopic() { + PathTemplate template = PathTemplate.create("_deleted-topic_"); + Truth.assertThat(template).isNotNull(); + } + @Test public void complexResourceIdInParent() { // One parent has a complex resource ID. From e4dd57a645bd6261c395e7f61be1c1b80a6624f1 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Thu, 4 Jun 2020 12:04:25 -0700 Subject: [PATCH 020/201] chore: release v1.9.2 (#152) --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 9ab8337f3..8fdcf3869 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.9.1 +1.9.2 From 39612f1f2f385228f0e03e6667dc9627c9ff18ab Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Thu, 4 Jun 2020 16:14:53 -0700 Subject: [PATCH 021/201] [api-common-java] docs: add build/test steps and update doc links (#153) * docs: add build/test steps and update doc links * docs: add build steps --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0ef1b58a3..75f7ee118 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,21 @@ License BSD - See [LICENSE] for more information. -[CONTRIBUTING]:https://github.com/googleapis/path-template-java/blob/master/CONTRIBUTING.md -[LICENSE]: https://github.com/googleapis/path-template-java/blob/master/LICENSE +Build and Test +-------------- +To build this library, please do the following. + +```sh +./gradlew build +``` + +After making changes, run the following commands to format your code and test your changes. + +```sh +./gradlew googleJavaFormat +./gradlew test +``` + +[CONTRIBUTING]:https://github.com/googleapis/api-common-java/blob/master/CONTRIBUTING.md +[LICENSE]: https://github.com/googleapis/api-common-java/blob/master/LICENSE From 955b8a7c7d117c05593763501ee365b74f3cd1f8 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Wed, 1 Jul 2020 11:12:48 -0700 Subject: [PATCH 022/201] fix: enable complex resource ids in instantiate() (#159) --- .../google/api/pathtemplate/PathTemplate.java | 12 +++- .../api/pathtemplate/PathTemplateTest.java | 72 +++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java index 45071968c..dd133461a 100644 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ b/src/main/java/com/google/api/pathtemplate/PathTemplate.java @@ -200,6 +200,11 @@ private static Segment create(SegmentKind kind, String value) { return new AutoValue_PathTemplate_Segment(kind, value, ""); } + /** Creates a segment of given kind, value, and complex separator. */ + private static Segment create(SegmentKind kind, String value, String complexSeparator) { + return new AutoValue_PathTemplate_Segment(kind, value, complexSeparator); + } + private static Segment wildcardCreate(String complexSeparator) { return new AutoValue_PathTemplate_Segment( SegmentKind.WILDCARD, @@ -737,10 +742,13 @@ private String instantiate(Map values, boolean allowPartial) { boolean continueLast = true; // Whether to not append separator boolean skip = false; // Whether we are substituting a binding and segments shall be skipped. ListIterator iterator = segments.listIterator(); + String prevSeparator = ""; while (iterator.hasNext()) { Segment seg = iterator.next(); if (!skip && !continueLast) { - result.append(seg.separator()); + String separator = prevSeparator.isEmpty() ? seg.separator() : prevSeparator; + result.append(separator); + prevSeparator = seg.complexSeparator().isEmpty() ? seg.separator() : seg.complexSeparator(); } continueLast = false; switch (seg.kind()) { @@ -1066,7 +1074,7 @@ private static List parseComplexResourceId(String seg) { currIteratorIndex < separatorIndices.size() ? separatorIndices.get(currIteratorIndex) : ""; - segments.add(Segment.create(SegmentKind.BINDING, subVarName)); + segments.add(Segment.create(SegmentKind.BINDING, subVarName, complexDelimiter)); segments.add(Segment.wildcardCreate(complexDelimiter)); segments.add(Segment.END_BINDING); subVarName = null; diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java index ccac31f6d..dc90b65ba 100644 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java @@ -37,6 +37,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Set; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -377,6 +378,26 @@ public void complexResourceIdInParent() { Truth.assertThat(match.get("cell2")).isEqualTo("broomba"); } + @Test + public void complexResourcePathTemplateVariables() { + String pattern = + "projects/{foo}_{bar}/zones/{zone_a}-{zone_b}_{zone_c}/machines/{cell1}.{cell2}"; + PathTemplate template = PathTemplate.create(pattern); + Set variables = template.vars(); + Truth.assertThat(variables) + .containsExactly("foo", "bar", "zone_a", "zone_b", "zone_c", "cell1", "cell2"); + + pattern = "projects/{foo}_{bar}/zones/*"; + template = PathTemplate.create(pattern); + Map match = + template.match("https://www.googleapis.com/compute/v1/projects/foo1_bar2/zones/azone"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("foo")).isEqualTo("foo1"); + Truth.assertThat(match.get("bar")).isEqualTo("bar2"); + variables = template.vars(); + System.out.println("DEL: vars: " + variables); + } + @Test public void complexResourceBasicInvalidIds() { thrown.expect(ValidationException.class); @@ -575,6 +596,57 @@ public void instantiateWithUnusualCharactersNoEncoding() { Truth.assertThat(instance).isEqualTo("bar/asdf:;`~,.<>[]!@#$%^&*()"); } + @Test + public void instantiateWithComplexResourceId_basic() { + PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}"); + String instance = + template.instantiate("project", "a/b/c", "zone_a", "apple", "zone_b", "baseball"); + Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc/zones/apple~baseball"); + } + + @Test + public void instantiateWithComplexResourceId_mixedSeparators() { + PathTemplate template = + PathTemplate.create( + "projects/{project}/zones/{zone_a}~{zone_b}.{zone_c}-{zone_d}~{zone_e}"); + String instance = + template.instantiate( + "project", + "a/b/c", + "zone_a", + "apple", + "zone_b", + "baseball/basketball", + "zone_c", + "cat/kitty", + "zone_d", + "dog/hound", + "zone_e", + "12345"); + Truth.assertThat(instance) + .isEqualTo( + "projects/a%2Fb%2Fc/zones/apple~baseball%2Fbasketball.cat%2Fkitty-dog%2Fhound~12345"); + } + + @Test + public void instantiateWithComplexResourceId_mixedSeparatorsInParent() { + PathTemplate template = + PathTemplate.create("projects/{project_a}~{project_b}.{project_c}/zones/{zone_a}~{zone_b}"); + String instance = + template.instantiate( + "project_a", + "a/b/c", + "project_b", + "foo", + "project_c", + "bar", + "zone_a", + "apple", + "zone_b", + "baseball"); + Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc~foo.bar/zones/apple~baseball"); + } + // Other // ===== From 1e17d1033bfec6ed4a56fd04a1c3d28c699a62fc Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 1 Jul 2020 11:48:50 -0700 Subject: [PATCH 023/201] chore: enable release-please bot (#160) * chore: enable release-please bot * chore: convert version.txt to versions.txt for expected release-please format --- .github/release-please.yml | 2 ++ build.gradle | 2 +- version.txt | 1 - versions.txt | 4 ++++ 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .github/release-please.yml delete mode 100644 version.txt create mode 100644 versions.txt diff --git a/.github/release-please.yml b/.github/release-please.yml new file mode 100644 index 000000000..ac6459300 --- /dev/null +++ b/.github/release-please.yml @@ -0,0 +1,2 @@ +releaseType: java-yoshi +bumpMinorPreMajor: true diff --git a/build.gradle b/build.gradle index 4d5288a54..febc87cc5 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = new File("version.txt").text.trim() +project.version = "1.9.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/version.txt b/version.txt deleted file mode 100644 index 8fdcf3869..000000000 --- a/version.txt +++ /dev/null @@ -1 +0,0 @@ -1.9.2 diff --git a/versions.txt b/versions.txt new file mode 100644 index 000000000..d082ef1ed --- /dev/null +++ b/versions.txt @@ -0,0 +1,4 @@ +# Format: +# module:released-version:current-version + +api-common:1.9.2:1.9.3-SNAPSHOT \ No newline at end of file From 8fad49dd7c237d69303be3bd052e871c84c3bf75 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2020 12:03:11 -0700 Subject: [PATCH 024/201] chore: release 1.9.3 (#161) * created CHANGELOG.md [ci skip] * updated README.md [ci skip] * updated versions.txt [ci skip] * updated build.gradle Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..a7f27aa44 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +### [1.9.3](https://www.github.com/googleapis/api-common-java/compare/v1.9.2...v1.9.3) (2020-07-01) + + +### Bug Fixes + +* enable complex resource ids in instantiate() ([#159](https://www.github.com/googleapis/api-common-java/issues/159)) ([955b8a7](https://www.github.com/googleapis/api-common-java/commit/955b8a7c7d117c05593763501ee365b74f3cd1f8)) diff --git a/build.gradle b/build.gradle index febc87cc5..86bb97af3 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.9.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "1.9.3" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index d082ef1ed..be1b8c5c0 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.9.2:1.9.3-SNAPSHOT \ No newline at end of file +api-common:1.9.3:1.9.3 \ No newline at end of file From 6af8e24a6252da7217e7c53f86cbb2b321327fc4 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Fri, 17 Jul 2020 10:29:26 -0700 Subject: [PATCH 025/201] feat: add ApiFutures.successfulAsList (#163) --- src/main/java/com/google/api/core/ApiFutures.java | 15 +++++++++++++++ .../java/com/google/api/core/ApiFuturesTest.java | 11 +++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/main/java/com/google/api/core/ApiFutures.java b/src/main/java/com/google/api/core/ApiFutures.java index d02892619..e25170fea 100644 --- a/src/main/java/com/google/api/core/ApiFutures.java +++ b/src/main/java/com/google/api/core/ApiFutures.java @@ -172,6 +172,21 @@ public ListenableFuture apply(ApiFuture apiFuture) { } }))); } + + @BetaApi + public static ApiFuture> successfulAsList( + Iterable> futures) { + return new ListenableFutureToApiFuture<>( + Futures.successfulAsList( + Iterables.transform( + futures, + new Function, ListenableFuture>() { + public ListenableFuture apply(ApiFuture apiFuture) { + return listenableFutureForApiFuture(apiFuture); + } + }))); + } + /* * @deprecated Use {@linkplain #transformAsync(ApiFuture, ApiFunction, Executor) the * overload that requires an executor}. For identical behavior, pass {@link diff --git a/src/test/java/com/google/api/core/ApiFuturesTest.java b/src/test/java/com/google/api/core/ApiFuturesTest.java index de10b7ee8..c726bf278 100644 --- a/src/test/java/com/google/api/core/ApiFuturesTest.java +++ b/src/test/java/com/google/api/core/ApiFuturesTest.java @@ -154,6 +154,17 @@ public void testAllAsList() throws Exception { assertThat(listFuture.get()).containsExactly(1, 2).inOrder(); } + @Test + public void successfulAllAsList() throws Exception { + SettableApiFuture inputFuture1 = SettableApiFuture.create(); + SettableApiFuture inputFuture2 = SettableApiFuture.create(); + ApiFuture> listFuture = + ApiFutures.successfulAsList(ImmutableList.of(inputFuture1, inputFuture2)); + inputFuture1.set(1); + inputFuture2.setException(new Exception()); + assertThat(listFuture.get()).containsExactly(1, null).inOrder(); + } + @Test public void testTransformAsync() throws Exception { ApiFuture inputFuture = ApiFutures.immediateFuture(0); From 92c46406d665bb5b11785ecec1c3e1a588eef49c Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2020 11:02:51 -0700 Subject: [PATCH 026/201] chore: release 1.9.4-SNAPSHOT (#164) * updated versions.txt [ci skip] * updated build.gradle Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 86bb97af3..f816ccca6 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.9.3" // {x-version-update:api-common:current} +project.version = "1.9.4-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index be1b8c5c0..79c09611c 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.9.3:1.9.3 \ No newline at end of file +api-common:1.9.3:1.9.4-SNAPSHOT \ No newline at end of file From d47b4e6148dcc36d1de40cecb93f2ffd22ca1250 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2020 16:56:29 -0400 Subject: [PATCH 027/201] chore: release 1.10.0 (#165) * updated CHANGELOG.md [ci skip] * updated README.md [ci skip] * updated versions.txt [ci skip] * updated build.gradle Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7f27aa44..e9b589af4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.10.0](https://www.github.com/googleapis/api-common-java/compare/v1.9.3...v1.10.0) (2020-07-17) + + +### Features + +* add ApiFutures.successfulAsList ([#163](https://www.github.com/googleapis/api-common-java/issues/163)) ([6af8e24](https://www.github.com/googleapis/api-common-java/commit/6af8e24a6252da7217e7c53f86cbb2b321327fc4)) + ### [1.9.3](https://www.github.com/googleapis/api-common-java/compare/v1.9.2...v1.9.3) (2020-07-01) diff --git a/build.gradle b/build.gradle index f816ccca6..277dc137a 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.9.4-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "1.10.0" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index 79c09611c..ee77bfa7f 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.9.3:1.9.4-SNAPSHOT \ No newline at end of file +api-common:1.10.0:1.10.0 \ No newline at end of file From aac14eb00691e75e425df50bf6f6ab98811818f4 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2020 13:32:00 -0700 Subject: [PATCH 028/201] chore: release 1.10.1-SNAPSHOT (#168) * chore: updated versions.txt [ci skip] * chore: updated build.gradle Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 277dc137a..779b734e1 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.0" // {x-version-update:api-common:current} +project.version = "1.10.1-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index ee77bfa7f..ccdf44e52 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.0:1.10.0 \ No newline at end of file +api-common:1.10.0:1.10.1-SNAPSHOT \ No newline at end of file From ab98dc9b245180f000433d0634a293b850f89830 Mon Sep 17 00:00:00 2001 From: Justin Beckwith Date: Wed, 16 Sep 2020 16:23:33 -0700 Subject: [PATCH 029/201] chore: add CODEOWNERS and repo settings (#177) --- .github/CODEOWNERS | 7 +++++++ .github/sync-repo-settings.yaml | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/sync-repo-settings.yaml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..aec8a7e9a --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,7 @@ +# Code owners file. +# This file controls who is tagged for review for any given pull request. +# +# For syntax help see: +# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax + +* @googleapis/yoshi-java diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml new file mode 100644 index 000000000..a48126be3 --- /dev/null +++ b/.github/sync-repo-settings.yaml @@ -0,0 +1,23 @@ +rebaseMergeAllowed: true +squashMergeAllowed: true +mergeCommitAllowed: false +branchProtectionRules: +- pattern: master + isAdminEnforced: true + requiredStatusCheckContexts: + - 'continuous-integration/travis-ci' + - 'codecov/patch' + - 'codecov/project' + - 'cla/google' + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: true +permissionRules: + - team: Googlers + permission: pull + - team: yoshi-java + permission: push + - team: yoshi-java-admins + permission: admin + - team: yoshi-admins + permission: admin From a26e19fce1b1ac6a63cb59d3331e33c41d1225c2 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 12 Oct 2020 20:08:25 +0200 Subject: [PATCH 030/201] chore(deps): update dependency junit:junit to v4.13.1 (#179) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 779b734e1..ca312dca3 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.4', // Testing - junit: 'junit:junit:4.13', + junit: 'junit:junit:4.13.1', truth: 'com.google.truth:truth:1.0.1', ] } From e6f8fef536858c05a2b83404e8b9c774c6506894 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 16 Oct 2020 18:27:04 +0200 Subject: [PATCH 031/201] deps: update dependency com.google.auto.value:auto-value to v1.7.4 (#170) Co-authored-by: Elliotte Rusty Harold Co-authored-by: Jeff Ching --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ca312dca3..aa1bec314 100644 --- a/build.gradle +++ b/build.gradle @@ -40,7 +40,7 @@ ext { libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7.2', - auto_value: 'com.google.auto.value:auto-value:1.7.2', + auto_value: 'com.google.auto.value:auto-value:1.7.4', guava: 'com.google.guava:guava:29.0-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.4', From 668d62aac4df147197e011772e916e9e3f35bd40 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Fri, 16 Oct 2020 09:50:05 -0700 Subject: [PATCH 032/201] build: make this repo match gax-java's release configuration (#162) This should allow the closeAndReleaseRepository to work for autorelease. --- .kokoro/release/stage.sh | 2 +- build.gradle | 74 ++++++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/.kokoro/release/stage.sh b/.kokoro/release/stage.sh index f927ce143..c7ba60c16 100755 --- a/.kokoro/release/stage.sh +++ b/.kokoro/release/stage.sh @@ -30,7 +30,7 @@ setup_environment_secrets mkdir -p ${HOME}/.gradle create_gradle_properties_file "${HOME}/.gradle/gradle.properties" -./gradlew assemble uploadArchives +./gradlew assemble publish if [[ -n "${AUTORELEASE_PR}" ]] then diff --git a/build.gradle b/build.gradle index aa1bec314..7a0573d77 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,7 @@ apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'jacoco' apply plugin: 'signing' +apply plugin: 'maven-publish' apply plugin: 'com.github.sherter.google-java-format' apply plugin: 'io.codearte.nexus-staging' @@ -198,51 +199,74 @@ signing { } if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword')) { - uploadArchives { - repositories { - mavenDeployer { - beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + nexusStaging { + username = ossrhUsername + password = ossrhPassword + packageGroup = "com.google.api" + } +} - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { - authentication(userName: ossrhUsername, password: ossrhPassword) - } +afterEvaluate { + publishing { + publications { + mavenJava(MavenPublication) { + version = project.version - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { - authentication(userName: ossrhUsername, password: ossrhPassword) - } + from components.java + + artifact javadocJar + artifact sourcesJar - pom.project { - name 'API Common' - packaging 'jar' - artifactId 'api-common' - description 'Common utilities for Google APIs in Java' - url 'https://github.com/googleapis/api-common-java' + pom { + name = 'API Common' + packaging = 'jar' + artifactId = 'api-common' + description = 'Common utilities for Google APIs in Java' + url = 'https://github.com/googleapis/api-common-java' scm { - url 'https://github.com/googleapis/api-common-java' - connection 'scm:git:https://github.com/googleapis/api-common-java.git' + url = 'https://github.com/googleapis/api-common-java' + connection = 'scm:git:https://github.com/googleapis/api-common-java.git' } licenses { license { - name 'BSD' - url 'https://github.com/googleapis/api-common-java/blob/master/LICENSE' + name = 'BSD' + url = 'https://github.com/googleapis/api-common-java/blob/master/LICENSE' } } developers { developer { - id 'GoogleAPIs' - name 'GoogleAPIs' - email 'googleapis@googlegroups.com' - url 'https://github.com/googleapis' + id = 'GoogleAPIs' + name = 'GoogleAPIs' + email = 'googleapis@googlegroups.com' + url = 'https://github.com/googleapis' organization = 'Google, Inc.' - organizationUrl 'https://www.google.com' + organizationUrl = 'https://www.google.com' } } } } } + repositories { + maven { + url 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + credentials { + username = project.hasProperty('ossrhUsername') ? project.getProperty('ossrhUsername') : null + password = project.hasProperty('ossrhPassword') ? project.getProperty('ossrhPassword') : null + } + } + } + } + + signing { + if (!project.hasProperty('skip.signing')) { + if (project.hasProperty('signing.gnupg.executable')) { + useGpgCmd() + } + sign publishing.publications.mavenJava + } } } From 00a12b94c44463b8f37b13cedc3a9241ec031f34 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 16 Oct 2020 20:39:19 +0200 Subject: [PATCH 033/201] deps: update dependency com.google.auto.value:auto-value-annotations to v1.7.4 (#171) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7a0573d77..a858570b3 100644 --- a/build.gradle +++ b/build.gradle @@ -40,7 +40,7 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7.2', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7.4', auto_value: 'com.google.auto.value:auto-value:1.7.4', guava: 'com.google.guava:guava:29.0-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', From 89b2a48ac22043d85c222979599522ca9397849f Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 16 Oct 2020 20:43:39 +0200 Subject: [PATCH 034/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.4.0 (#172) Co-authored-by: Elliotte Rusty Harold Co-authored-by: Jeff Ching --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a858570b3..65d038e70 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ ext { auto_value: 'com.google.auto.value:auto-value:1.7.4', guava: 'com.google.guava:guava:29.0-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.3.4', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.4.0', // Testing junit: 'junit:junit:4.13.1', From fabfc88fc8547becadb35f9e9c4fb48ad93822f6 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 16 Oct 2020 18:48:06 +0000 Subject: [PATCH 035/201] chore: release 1.10.1 (#180) :robot: I have created a release \*beep\* \*boop\* --- ### [1.10.1](https://www.github.com/googleapis/api-common-java/compare/v1.10.0...v1.10.1) (2020-10-16) ### Dependencies * update dependency com.google.auto.value:auto-value to v1.7.4 ([#170](https://www.github.com/googleapis/api-common-java/issues/170)) ([e6f8fef](https://www.github.com/googleapis/api-common-java/commit/e6f8fef536858c05a2b83404e8b9c774c6506894)) * update dependency com.google.auto.value:auto-value-annotations to v1.7.4 ([#171](https://www.github.com/googleapis/api-common-java/issues/171)) ([00a12b9](https://www.github.com/googleapis/api-common-java/commit/00a12b94c44463b8f37b13cedc3a9241ec031f34)) * update dependency com.google.errorprone:error_prone_annotations to v2.4.0 ([#172](https://www.github.com/googleapis/api-common-java/issues/172)) ([89b2a48](https://www.github.com/googleapis/api-common-java/commit/89b2a48ac22043d85c222979599522ca9397849f)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). --- CHANGELOG.md | 9 +++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9b589af4..8f7a8264a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +### [1.10.1](https://www.github.com/googleapis/api-common-java/compare/v1.10.0...v1.10.1) (2020-10-16) + + +### Dependencies + +* update dependency com.google.auto.value:auto-value to v1.7.4 ([#170](https://www.github.com/googleapis/api-common-java/issues/170)) ([e6f8fef](https://www.github.com/googleapis/api-common-java/commit/e6f8fef536858c05a2b83404e8b9c774c6506894)) +* update dependency com.google.auto.value:auto-value-annotations to v1.7.4 ([#171](https://www.github.com/googleapis/api-common-java/issues/171)) ([00a12b9](https://www.github.com/googleapis/api-common-java/commit/00a12b94c44463b8f37b13cedc3a9241ec031f34)) +* update dependency com.google.errorprone:error_prone_annotations to v2.4.0 ([#172](https://www.github.com/googleapis/api-common-java/issues/172)) ([89b2a48](https://www.github.com/googleapis/api-common-java/commit/89b2a48ac22043d85c222979599522ca9397849f)) + ## [1.10.0](https://www.github.com/googleapis/api-common-java/compare/v1.9.3...v1.10.0) (2020-07-17) diff --git a/build.gradle b/build.gradle index 65d038e70..917607491 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.1-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "1.10.1" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index ccdf44e52..d70a8693c 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.0:1.10.1-SNAPSHOT \ No newline at end of file +api-common:1.10.1:1.10.1 \ No newline at end of file From 6c4881ce08d09cf8ff4b72a493d919fe700f2856 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 21 Oct 2020 13:29:58 +0200 Subject: [PATCH 036/201] chore(deps): update dependency com.google.guava:guava to v30 (#186) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 917607491..249064e8b 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ ext { javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7.4', auto_value: 'com.google.auto.value:auto-value:1.7.4', - guava: 'com.google.guava:guava:29.0-android', + guava: 'com.google.guava:guava:30.0-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.4.0', From c3184c1fffc451db8af933ce57f0dc9a4db474dc Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2020 17:28:03 +0000 Subject: [PATCH 037/201] chore: release 1.10.2-SNAPSHOT (#183) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 249064e8b..23507af1d 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.1" // {x-version-update:api-common:current} +project.version = "1.10.2-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index d70a8693c..f350f021d 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.1:1.10.1 \ No newline at end of file +api-common:1.10.1:1.10.2-SNAPSHOT \ No newline at end of file From 75e3273237c09ca5189ac431a322cb7fdf71fec0 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Tue, 1 Dec 2020 11:03:31 -0800 Subject: [PATCH 038/201] chore: Add vim files to .gitignore (#188) --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 1204a607d..a09410d53 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ tmp_gh-pages *.iml *.iws *.ipr + +# Vim +*.sw* From 86f9c6aa25d0728085507a0e865bf5e5c9c951b0 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Fri, 11 Dec 2020 12:18:55 -0800 Subject: [PATCH 039/201] chore: Add actools-java to api-common-java CODEOWNERS (#191) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index aec8a7e9a..f45d2c83e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,4 +4,4 @@ # For syntax help see: # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax -* @googleapis/yoshi-java +* @googleapis/actools-java @googleapis/yoshi-java From ad661d0f4cd738f5d6c68a73ee2e81855b05e4b6 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Fri, 11 Dec 2020 12:19:29 -0800 Subject: [PATCH 040/201] chore: Remove soon-to-be-deprecated TravisCI [api-common-java] (#187) * chore: Add CircleCI config * fix: remove swp, travis.yml files * fix: remove circleci in favor of PR #189 * chore: Remove travisci from the GitHub settings file --- .github/sync-repo-settings.yaml | 1 - .travis.yml | 15 --------------- 2 files changed, 16 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index a48126be3..1db1802ae 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -5,7 +5,6 @@ branchProtectionRules: - pattern: master isAdminEnforced: true requiredStatusCheckContexts: - - 'continuous-integration/travis-ci' - 'codecov/patch' - 'codecov/project' - 'cla/google' diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2e07a726e..000000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -sudo: false -dist: trusty -language: java -addons: - # https://github.com/travis-ci/travis-ci/issues/5227#issuecomment-165131913 - hosts: - - fake-hostname-to-work-around-travis-bug - hostname: fake-hostname-to-work-around-travis-bug -jdk: - - oraclejdk8 - - openjdk8 -script: - ./gradlew check --info -after_success: - - bash <(curl -s https://codecov.io/bash) From 769a04845deebff6431d5585ad7323d86fc980ad Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Fri, 11 Dec 2020 12:23:09 -0800 Subject: [PATCH 041/201] chore(docs): update javadoc link to googleapis.dev (#192) Fixes #31 Co-authored-by: Mira Leung --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 75f7ee118..51f24b3e9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ API Common for Java [![Code Coverage](https://img.shields.io/codecov/c/github/googleapis/api-common-java.svg)](https://codecov.io/github/googleapis/api-common-java) -- [Documentation](http://googleapis.github.io/api-common-java/apidocs) +- [Documentation](https://googleapis.dev/java/api-common/latest/index.html) API Common for Java is a library for foundational types relating to Google APIs. It currently contains the following packages: From 1904b7a25d924f9bfdaf35d5dff8da9d188292b3 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Fri, 11 Dec 2020 12:27:12 -0800 Subject: [PATCH 042/201] ci: add GitHub actions ci config (#190) * ci: add GitHub actions ci config * ci: skip Java 7 tests * ci: only run units on Java 8 Co-authored-by: Mira Leung --- .github/workflows/ci.yaml | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 000000000..1a7605026 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,38 @@ +on: + push: + branches: + - master + pull_request: +name: ci +jobs: + units: + runs-on: ubuntu-latest + env: + # Customize the JVM maximum heap limit + JVM_OPTS: -Xmx3200m + TERM: dumb + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 8 + - run: java -version + - name: Gradle Assemble + run: ./gradlew assemble + - name: Gradle Test + run: ./gradlew test + - name: Gradle Build + run: ./gradlew build install + - name: coverage + uses: codecov/codecov-action@v1 + with: + name: actions ${{ matrix.java }} + format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 8 + - name: Java Linter + run: ./gradlew googleJavaFormat From dbdd49024338cb3be3c5d75c7d3dbab4c147a906 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 12 Jan 2021 12:32:34 +0100 Subject: [PATCH 043/201] chore(deps): update dependency com.google.guava:guava to v30.1-android (#193) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 23507af1d..158a2d12d 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ ext { javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7.4', auto_value: 'com.google.auto.value:auto-value:1.7.4', - guava: 'com.google.guava:guava:30.0-android', + guava: 'com.google.guava:guava:30.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.4.0', From 054558785e187b9082d12ad239c2478f90511b64 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 13 Jan 2021 01:18:35 +0100 Subject: [PATCH 044/201] chore(deps): update dependency com.google.errorprone:error_prone_annotations to v2.5.0 (#194) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 158a2d12d..dd5e73515 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ ext { auto_value: 'com.google.auto.value:auto-value:1.7.4', guava: 'com.google.guava:guava:30.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.4.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.5.0', // Testing junit: 'junit:junit:4.13.1', From 0f5eef50d3a300405a45dbba4f7611c6a6ab4bbe Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 15 Jan 2021 12:36:20 +0100 Subject: [PATCH 045/201] chore(deps): update dependency com.google.errorprone:error_prone_annotations to v2.5.1 (#196) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dd5e73515..b38a36dca 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ ext { auto_value: 'com.google.auto.value:auto-value:1.7.4', guava: 'com.google.guava:guava:30.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.5.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.5.1', // Testing junit: 'junit:junit:4.13.1', From a92ccd57dccf3269c4eb47953b470edf84ad2a7c Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 22 Jan 2021 13:11:39 +0100 Subject: [PATCH 046/201] chore(deps): update dependency com.google.truth:truth to v1.1.1 (#197) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b38a36dca..ffa32dfab 100644 --- a/build.gradle +++ b/build.gradle @@ -48,7 +48,7 @@ ext { // Testing junit: 'junit:junit:4.13.1', - truth: 'com.google.truth:truth:1.0.1', + truth: 'com.google.truth:truth:1.1.1', ] } From ca48ffe6d0a05911c1489238b4ad116084b7558e Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 28 Jan 2021 21:13:40 +0100 Subject: [PATCH 047/201] chore(deps): update dependency com.google.truth:truth to v1.1.2 (#198) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ffa32dfab..9cd1fff64 100644 --- a/build.gradle +++ b/build.gradle @@ -48,7 +48,7 @@ ext { // Testing junit: 'junit:junit:4.13.1', - truth: 'com.google.truth:truth:1.1.1', + truth: 'com.google.truth:truth:1.1.2', ] } From 57996428445eb11ba53bf2deedf2dec0f7971df5 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Sat, 13 Feb 2021 18:29:02 +0100 Subject: [PATCH 048/201] chore(deps): update dependency junit:junit to v4.13.2 (#199) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9cd1fff64..9914d92d4 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,7 @@ ext { error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.5.1', // Testing - junit: 'junit:junit:4.13.1', + junit: 'junit:junit:4.13.2', truth: 'com.google.truth:truth:1.1.2', ] } From 319553eb18e42f10120cda3591dd2255c2ea0ed4 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Tue, 2 Mar 2021 20:05:25 +0000 Subject: [PATCH 049/201] This library does not depend on GAX (#200) --- .../java/com/google/api/core/AbstractApiService.java | 12 ++++++------ .../google/api/core/ApiFutureToListenableFuture.java | 2 +- src/main/java/com/google/api/core/ApiFutures.java | 8 ++++---- .../google/api/core/ListenableFutureToApiFuture.java | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/google/api/core/AbstractApiService.java b/src/main/java/com/google/api/core/AbstractApiService.java index d32f1e410..8b627e659 100644 --- a/src/main/java/com/google/api/core/AbstractApiService.java +++ b/src/main/java/com/google/api/core/AbstractApiService.java @@ -38,11 +38,11 @@ import java.util.concurrent.TimeoutException; /** - * Base class for {@link ApiService}. Similar to Guava's {@code AbstractService} but redeclared to + * Base class for {@link ApiService}. Similar to Guava's {@code AbstractService} but redeclared so * that Guava can be shaded. */ public abstract class AbstractApiService implements ApiService { - private static final ImmutableMap guavaToGaxState = + private static final ImmutableMap GUAVA_TO_API_SERVICE_STATE = ImmutableMap.builder() .put(Service.State.FAILED, ApiService.State.FAILED) .put(Service.State.NEW, ApiService.State.NEW) @@ -66,7 +66,7 @@ public void addListener(final ApiService.Listener listener, Executor executor) { new Service.Listener() { @Override public void failed(Service.State from, Throwable failure) { - listener.failed(guavaToGaxState.get(from), failure); + listener.failed(GUAVA_TO_API_SERVICE_STATE.get(from), failure); } @Override @@ -81,12 +81,12 @@ public void starting() { @Override public void stopping(Service.State from) { - listener.stopping(guavaToGaxState.get(from)); + listener.stopping(GUAVA_TO_API_SERVICE_STATE.get(from)); } @Override public void terminated(Service.State from) { - listener.terminated(guavaToGaxState.get(from)); + listener.terminated(GUAVA_TO_API_SERVICE_STATE.get(from)); } }, executor); @@ -122,7 +122,7 @@ public ApiService startAsync() { } public State state() { - return guavaToGaxState.get(impl.state()); + return GUAVA_TO_API_SERVICE_STATE.get(impl.state()); } public ApiService stopAsync() { diff --git a/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java b/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java index fc8745231..681a0d87d 100644 --- a/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java +++ b/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java @@ -37,7 +37,7 @@ import java.util.concurrent.TimeoutException; /** - * INTERNAL USE ONLY. Adapter from GAX ApiFuture to Guava ListenableFuture. + * INTERNAL USE ONLY. Adapter from ApiFuture to Guava ListenableFuture. */ @InternalApi public class ApiFutureToListenableFuture implements ListenableFuture { diff --git a/src/main/java/com/google/api/core/ApiFutures.java b/src/main/java/com/google/api/core/ApiFutures.java index e25170fea..5e4f9f176 100644 --- a/src/main/java/com/google/api/core/ApiFutures.java +++ b/src/main/java/com/google/api/core/ApiFutures.java @@ -99,7 +99,7 @@ public static ApiFuture catching( Futures.catching( listenableFutureForApiFuture(input), exceptionType, - new GaxFunctionToGuavaFunction(callback), + new ApiFunctionToGuavaFunction(callback), executor); return new ListenableFutureToApiFuture(catchingFuture); } @@ -156,7 +156,7 @@ public static ApiFuture transform( return new ListenableFutureToApiFuture<>( Futures.transform( listenableFutureForApiFuture(input), - new GaxFunctionToGuavaFunction(function), + new ApiFunctionToGuavaFunction(function), executor)); } @@ -226,11 +226,11 @@ private static ListenableFuture listenableFutureForApiFuture(ApiFuture return listenableFuture; } - private static class GaxFunctionToGuavaFunction + private static class ApiFunctionToGuavaFunction implements com.google.common.base.Function { private ApiFunction f; - public GaxFunctionToGuavaFunction(ApiFunction f) { + public ApiFunctionToGuavaFunction(ApiFunction f) { this.f = f; } diff --git a/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java b/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java index 97eddd5ca..d389fedf7 100644 --- a/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java +++ b/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java @@ -34,7 +34,7 @@ import com.google.common.util.concurrent.ListenableFuture; /** - * INTERNAL USE ONLY. Adapter from Guava ListenableFuture to GAX ApiFuture. + * INTERNAL USE ONLY. Adapter from Guava ListenableFuture to ApiFuture. */ @InternalApi public class ListenableFutureToApiFuture extends SimpleForwardingListenableFuture From 06c9284dfcabce8b1b120a5fcedc1cf65c57cf82 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 9 Mar 2021 00:08:06 +0100 Subject: [PATCH 050/201] chore(deps): update dependency gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin to v0.9 (#173) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin](gradle/plugin/com/github/sherter/google-java-format/google-java-format-gradle-plugin) | minor | `0.8` -> `0.9` | --- ### Renovate configuration :date: **Schedule**: At any time (no schedule defined). :vertical_traffic_light: **Automerge**: Disabled by config. Please merge this manually once you are satisfied. :recycle: **Rebasing**: Renovate will not automatically rebase this PR, because other commits have been found. :no_bell: **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9914d92d4..ea8be0ebd 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { jcenter() } dependencies { - classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.8", + classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.9", "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.2" } } From ee0d5b59b338c3e7196095ce296cd6e687c6b0fc Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Tue, 16 Mar 2021 14:46:46 +0000 Subject: [PATCH 051/201] jcenter is going away (#201) --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index ea8be0ebd..b4e907931 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,6 @@ buildscript { url 'https://plugins.gradle.org/m2/' } mavenCentral() - jcenter() } dependencies { classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.9", From dc4ce08e2d5fb7354f6db1352a6f1ac2c9341136 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 13 Apr 2021 12:47:31 +0200 Subject: [PATCH 052/201] chore(deps): update dependency com.google.errorprone:error_prone_annotations to v2.6.0 (#204) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b4e907931..90c9aa3cf 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ ext { auto_value: 'com.google.auto.value:auto-value:1.7.4', guava: 'com.google.guava:guava:30.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.5.1', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.6.0', // Testing junit: 'junit:junit:4.13.2', From cbe635b557ab83e0985ccdc80c4fb31f44a6f2d9 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 14 Apr 2021 02:49:51 +0200 Subject: [PATCH 053/201] chore(deps): update dependency com.google.auto.value:auto-value-annotations to v1.8 (#203) Co-authored-by: Elliotte Rusty Harold --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 90c9aa3cf..356d183fe 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.7.4', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8', auto_value: 'com.google.auto.value:auto-value:1.7.4', guava: 'com.google.guava:guava:30.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', From 20578a00e5b4ba2f9c4482eccf55ffa37ab12335 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Mon, 19 Apr 2021 14:09:24 +0000 Subject: [PATCH 054/201] deps: guava 30.1.1 (#207) @Neenu1995 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 356d183fe..04be5d680 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ ext { javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8', auto_value: 'com.google.auto.value:auto-value:1.7.4', - guava: 'com.google.guava:guava:30.1-android', + guava: 'com.google.guava:guava:30.1.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.6.0', From b2410f921cb884383ef54a606c94730cba0a0cca Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 19 Apr 2021 21:13:19 +0200 Subject: [PATCH 055/201] chore(deps): update dependency com.google.auto.value:auto-value to v1.8 (#202) Co-authored-by: Elliotte Rusty Harold --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 04be5d680..904b7b4be 100644 --- a/build.gradle +++ b/build.gradle @@ -39,8 +39,8 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', + auto_value: 'com.google.auto.value:auto-value:1.8', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8', - auto_value: 'com.google.auto.value:auto-value:1.7.4', guava: 'com.google.guava:guava:30.1.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.6.0', From 4f2cf334fbe2c9f10304113f930b657ffe1c3180 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 21:28:11 +0000 Subject: [PATCH 056/201] chore: release 1.10.2 (#208) :robot: I have created a release \*beep\* \*boop\* --- ### [1.10.2](https://www.github.com/googleapis/api-common-java/compare/v1.10.1...v1.10.2) (2021-04-19) ### Dependencies * guava 30.1.1 ([#207](https://www.github.com/googleapis/api-common-java/issues/207)) ([20578a0](https://www.github.com/googleapis/api-common-java/commit/20578a00e5b4ba2f9c4482eccf55ffa37ab12335)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f7a8264a..c23d353a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [1.10.2](https://www.github.com/googleapis/api-common-java/compare/v1.10.1...v1.10.2) (2021-04-19) + + +### Dependencies + +* guava 30.1.1 ([#207](https://www.github.com/googleapis/api-common-java/issues/207)) ([20578a0](https://www.github.com/googleapis/api-common-java/commit/20578a00e5b4ba2f9c4482eccf55ffa37ab12335)) + ### [1.10.1](https://www.github.com/googleapis/api-common-java/compare/v1.10.0...v1.10.1) (2020-10-16) diff --git a/build.gradle b/build.gradle index 904b7b4be..8eb9998e8 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.2-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "1.10.2" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index f350f021d..25f951e98 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.1:1.10.2-SNAPSHOT \ No newline at end of file +api-common:1.10.2:1.10.2 \ No newline at end of file From 7014db17904a165c78fbda1284d433b38e839876 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 21:46:09 +0000 Subject: [PATCH 057/201] chore: release 1.10.3-SNAPSHOT (#209) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 8eb9998e8..7d91ccfd6 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.2" // {x-version-update:api-common:current} +project.version = "1.10.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index 25f951e98..ebf778ab4 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.2:1.10.2 \ No newline at end of file +api-common:1.10.2:1.10.3-SNAPSHOT \ No newline at end of file From 0886a52b629423f639761fbe9d070a9999ef09cc Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Thu, 22 Apr 2021 16:32:02 -0400 Subject: [PATCH 058/201] chore: fix release (#213) --- .github/CODEOWNERS | 5 +- .github/ISSUE_TEMPLATE/bug_report.md | 51 +++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 21 ++++ .github/ISSUE_TEMPLATE/support_request.md | 7 ++ .github/PULL_REQUEST_TEMPLATE.md | 7 ++ .github/blunderbuss.yml | 7 ++ .github/generated-files-bot.yml | 11 ++ .github/readme/synth.py | 19 ++++ .github/release-please.yml | 2 +- .github/snippet-bot.yml | 0 .github/sync-repo-settings.yaml | 22 ++-- .github/trusted-contribution.yml | 2 + .github/workflows/ci.yaml | 44 ++++---- .kokoro/build.bat | 3 + .kokoro/build.sh | 2 +- .kokoro/coerce_logs.sh | 38 +++++++ .kokoro/common.cfg | 4 +- .kokoro/common.sh | 58 ++++++++++ .kokoro/continuous/common.cfg | 1 + .kokoro/continuous/java8.cfg | 5 + .kokoro/continuous/readme.cfg | 55 ++++++++++ .kokoro/dependencies.sh | 90 ++++++++++++++++ .kokoro/nightly/common.cfg | 25 +++++ .kokoro/nightly/integration.cfg | 37 +++++++ .kokoro/nightly/java11.cfg | 7 ++ .kokoro/nightly/java7.cfg | 7 ++ .kokoro/nightly/java8-osx.cfg | 3 + .kokoro/nightly/java8-win.cfg | 3 + .kokoro/nightly/java8.cfg | 12 +++ .kokoro/nightly/samples.cfg | 38 +++++++ .kokoro/populate-secrets.sh | 43 ++++++++ .kokoro/presubmit/clirr.cfg | 13 +++ .kokoro/presubmit/common.cfg | 10 ++ .kokoro/presubmit/dependencies.cfg | 12 +++ .kokoro/presubmit/integration.cfg | 33 ++++++ .kokoro/presubmit/java8-osx.cfg | 3 + .kokoro/presubmit/java8-win.cfg | 3 + .kokoro/presubmit/java8.cfg | 5 + .kokoro/presubmit/linkage-monitor.cfg | 12 +++ .kokoro/presubmit/lint.cfg | 13 +++ .kokoro/presubmit/samples.cfg | 33 ++++++ .kokoro/release/bump_snapshot.cfg | 53 ++++++++++ .kokoro/release/common.cfg | 4 +- .kokoro/release/common.sh | 1 - .kokoro/release/drop.cfg | 7 +- .kokoro/release/promote.cfg | 7 +- .kokoro/release/publish_javadoc.cfg | 12 ++- .kokoro/release/snapshot.cfg | 6 ++ .kokoro/release/snapshot.sh | 29 +++++ .kokoro/release/stage.cfg | 38 ++----- .kokoro/trampoline.sh | 2 + CODE_OF_CONDUCT.md | 123 +++++++++++++++------- LICENSE | 2 +- codecov.yaml | 4 + java.header | 15 +++ license-checks.xml | 10 ++ renovate.json | 54 +++++++++- synth.metadata | 18 ++++ 58 files changed, 1035 insertions(+), 116 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/support_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/blunderbuss.yml create mode 100644 .github/generated-files-bot.yml create mode 100644 .github/readme/synth.py create mode 100644 .github/snippet-bot.yml create mode 100644 .github/trusted-contribution.yml create mode 100644 .kokoro/build.bat create mode 100755 .kokoro/coerce_logs.sh create mode 100644 .kokoro/common.sh create mode 100644 .kokoro/continuous/readme.cfg create mode 100755 .kokoro/dependencies.sh create mode 100644 .kokoro/nightly/common.cfg create mode 100644 .kokoro/nightly/integration.cfg create mode 100644 .kokoro/nightly/java11.cfg create mode 100644 .kokoro/nightly/java7.cfg create mode 100644 .kokoro/nightly/java8-osx.cfg create mode 100644 .kokoro/nightly/java8-win.cfg create mode 100644 .kokoro/nightly/java8.cfg create mode 100644 .kokoro/nightly/samples.cfg create mode 100755 .kokoro/populate-secrets.sh create mode 100644 .kokoro/presubmit/clirr.cfg create mode 100644 .kokoro/presubmit/dependencies.cfg create mode 100644 .kokoro/presubmit/integration.cfg create mode 100644 .kokoro/presubmit/java8-osx.cfg create mode 100644 .kokoro/presubmit/java8-win.cfg create mode 100644 .kokoro/presubmit/linkage-monitor.cfg create mode 100644 .kokoro/presubmit/lint.cfg create mode 100644 .kokoro/presubmit/samples.cfg create mode 100644 .kokoro/release/bump_snapshot.cfg create mode 100644 .kokoro/release/snapshot.cfg create mode 100755 .kokoro/release/snapshot.sh mode change 100755 => 100644 .kokoro/trampoline.sh create mode 100644 codecov.yaml create mode 100644 java.header create mode 100644 license-checks.xml create mode 100644 synth.metadata diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f45d2c83e..1bb9607cb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,7 +1,10 @@ # Code owners file. # This file controls who is tagged for review for any given pull request. -# + # For syntax help see: # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax * @googleapis/actools-java @googleapis/yoshi-java + +# The java-samples-reviewers team is the default owner for samples changes +samples/**/*.java @googleapis/java-samples-reviewers diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..4924b71dd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,51 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +Thanks for stopping by to let us know something could be better! + +**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. + +Please run down the following list and make sure you've tried the usual "quick fixes": + + - Search the issues already opened: https://github.com/googleapis/api-common-java/issues + - Check for answers on StackOverflow: http://stackoverflow.com/questions/tagged/google-cloud-platform + +If you are still having issues, please include as much information as possible: + +#### Environment details + +1. Specify the API at the beginning of the title. For example, "BigQuery: ..."). + General, Core, and Other are also allowed as types +2. OS type and version: +3. Java version: +4. api-common-java version(s): + +#### Steps to reproduce + + 1. ? + 2. ? + +#### Code example + +```java +// example +``` + +#### Stack trace +``` +Any relevant stacktrace here. +``` + +#### External references such as API reference guides + +- ? + +#### Any additional information below + + +Following these steps guarantees the quickest resolution possible. + +Thanks! diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..754e30c68 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,21 @@ +--- +name: Feature request +about: Suggest an idea for this library + +--- + +Thanks for stopping by to let us know something could be better! + +**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. + +**Is your feature request related to a problem? Please describe.** +What the problem is. Example: I'm always frustrated when [...] + +**Describe the solution you'd like** +What you want to happen. + +**Describe alternatives you've considered** +Any alternative solutions or features you've considered. + +**Additional context** +Any other context or screenshots about the feature request. diff --git a/.github/ISSUE_TEMPLATE/support_request.md b/.github/ISSUE_TEMPLATE/support_request.md new file mode 100644 index 000000000..995869032 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/support_request.md @@ -0,0 +1,7 @@ +--- +name: Support request +about: If you have a support contract with Google, please create an issue in the Google Cloud Support console. + +--- + +**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..dfc305331 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,7 @@ +Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: +- [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/api-common-java/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea +- [ ] Ensure the tests and linter pass +- [ ] Code coverage does not decrease (if any source code was changed) +- [ ] Appropriate docs were updated (if necessary) + +Fixes # ☕️ diff --git a/.github/blunderbuss.yml b/.github/blunderbuss.yml new file mode 100644 index 000000000..1a23ea42b --- /dev/null +++ b/.github/blunderbuss.yml @@ -0,0 +1,7 @@ +# Configuration for the Blunderbuss GitHub app. For more info see +# https://github.com/googleapis/repo-automation-bots/tree/master/packages/blunderbuss +assign_prs_by: +- labels: + - samples + to: + - googleapis/java-samples-reviewers \ No newline at end of file diff --git a/.github/generated-files-bot.yml b/.github/generated-files-bot.yml new file mode 100644 index 000000000..47c2ba132 --- /dev/null +++ b/.github/generated-files-bot.yml @@ -0,0 +1,11 @@ +externalManifests: +- type: json + file: 'synth.metadata' + jsonpath: '$.generatedFiles[*]' +- type: json + file: '.github/readme/synth.metadata/synth.metadata' + jsonpath: '$.generatedFiles[*]' +ignoreAuthors: +- 'renovate-bot' +- 'yoshi-automation' +- 'release-please[bot]' diff --git a/.github/readme/synth.py b/.github/readme/synth.py new file mode 100644 index 000000000..7b48cc28d --- /dev/null +++ b/.github/readme/synth.py @@ -0,0 +1,19 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This script is used to synthesize generated the README for this library.""" + +from synthtool.languages import java + +java.custom_templates(["java_library/README.md"]) diff --git a/.github/release-please.yml b/.github/release-please.yml index ac6459300..dce2c8450 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -1,2 +1,2 @@ releaseType: java-yoshi -bumpMinorPreMajor: true +bumpMinorPreMajor: true \ No newline at end of file diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml new file mode 100644 index 000000000..e69de29bb diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 1db1802ae..be76ae755 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -5,18 +5,18 @@ branchProtectionRules: - pattern: master isAdminEnforced: true requiredStatusCheckContexts: - - 'codecov/patch' - - 'codecov/project' - - 'cla/google' + - 'codecov/patch' + - 'codecov/project' + - 'cla/google' requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true requiresStrictStatusChecks: true permissionRules: - - team: Googlers - permission: pull - - team: yoshi-java - permission: push - - team: yoshi-java-admins - permission: admin - - team: yoshi-admins - permission: admin +- team: Googlers + permission: pull +- team: yoshi-java + permission: push +- team: yoshi-java-admins + permission: admin +- team: yoshi-admins + permission: admin diff --git a/.github/trusted-contribution.yml b/.github/trusted-contribution.yml new file mode 100644 index 000000000..f247d5c78 --- /dev/null +++ b/.github/trusted-contribution.yml @@ -0,0 +1,2 @@ +trustedContributors: +- renovate-bot \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1a7605026..263aa40e6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,7 +1,7 @@ on: push: branches: - - master + - master pull_request: name: ci jobs: @@ -12,27 +12,27 @@ jobs: JVM_OPTS: -Xmx3200m TERM: dumb steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: 8 - - run: java -version - - name: Gradle Assemble - run: ./gradlew assemble - - name: Gradle Test - run: ./gradlew test - - name: Gradle Build - run: ./gradlew build install - - name: coverage - uses: codecov/codecov-action@v1 - with: - name: actions ${{ matrix.java }} + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 8 + - run: java -version + - name: Gradle Assemble + run: ./gradlew assemble + - name: Gradle Test + run: ./gradlew test + - name: Gradle Build + run: ./gradlew build install + - name: coverage + uses: codecov/codecov-action@v1 + with: + name: actions ${{ matrix.java }} format: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: 8 - - name: Java Linter - run: ./gradlew googleJavaFormat + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 8 + - name: Java Linter + run: ./gradlew googleJavaFormat \ No newline at end of file diff --git a/.kokoro/build.bat b/.kokoro/build.bat new file mode 100644 index 000000000..05826ad93 --- /dev/null +++ b/.kokoro/build.bat @@ -0,0 +1,3 @@ +:: See documentation in type-shell-output.bat + +"C:\Program Files\Git\bin\bash.exe" %~dp0build.sh diff --git a/.kokoro/build.sh b/.kokoro/build.sh index dad012856..4757df8eb 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2019 Google Inc. +# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/coerce_logs.sh b/.kokoro/coerce_logs.sh new file mode 100755 index 000000000..5cf7ba49e --- /dev/null +++ b/.kokoro/coerce_logs.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script finds and moves sponge logs so that they can be found by placer +# and are not flagged as flaky by sponge. + +set -eo pipefail + +## Get the directory of the build script +scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}")) +## cd to the parent directory, i.e. the root of the git repo +cd ${scriptDir}/.. + +job=$(basename ${KOKORO_JOB_NAME}) + +echo "coercing sponge logs..." +for xml in `find . -name *-sponge_log.xml` +do + echo "processing ${xml}" + class=$(basename ${xml} | cut -d- -f2) + dir=$(dirname ${xml})/${job}/${class} + text=$(dirname ${xml})/${class}-sponge_log.txt + mkdir -p ${dir} + mv ${xml} ${dir}/sponge_log.xml + mv ${text} ${dir}/sponge_log.txt +done diff --git a/.kokoro/common.cfg b/.kokoro/common.cfg index f10834a28..083db40dd 100644 --- a/.kokoro/common.cfg +++ b/.kokoro/common.cfg @@ -8,6 +8,6 @@ build_file: "api-common-java/.kokoro/trampoline.sh" # Tell the trampoline which build file to use. env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/build.sh" + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/build.sh" } diff --git a/.kokoro/common.sh b/.kokoro/common.sh new file mode 100644 index 000000000..ace89f45a --- /dev/null +++ b/.kokoro/common.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +function retry_with_backoff { + attempts_left=$1 + sleep_seconds=$2 + shift 2 + command=$@ + + + # store current flag state + flags=$- + + # allow a failures to continue + set +e + ${command} + exit_code=$? + + # restore "e" flag + if [[ ${flags} =~ e ]] + then set -e + else set +e + fi + + if [[ $exit_code == 0 ]] + then + return 0 + fi + + # failure + if [[ ${attempts_left} > 0 ]] + then + echo "failure (${exit_code}), sleeping ${sleep_seconds}..." + sleep ${sleep_seconds} + new_attempts=$((${attempts_left} - 1)) + new_sleep=$((${sleep_seconds} * 2)) + retry_with_backoff ${new_attempts} ${new_sleep} ${command} + fi + + return $exit_code +} + +## Helper functionss +function now() { date +"%Y-%m-%d %H:%M:%S" | tr -d '\n'; } +function msg() { println "$*" >&2; } +function println() { printf '%s\n' "$(now) $*"; } \ No newline at end of file diff --git a/.kokoro/continuous/common.cfg b/.kokoro/continuous/common.cfg index 1c23fa586..c690aeb8a 100644 --- a/.kokoro/continuous/common.cfg +++ b/.kokoro/continuous/common.cfg @@ -4,6 +4,7 @@ action { define_artifacts { regex: "**/*sponge_log.xml" + regex: "**/*sponge_log.txt" } } diff --git a/.kokoro/continuous/java8.cfg b/.kokoro/continuous/java8.cfg index 3b017fc80..495cc7bac 100644 --- a/.kokoro/continuous/java8.cfg +++ b/.kokoro/continuous/java8.cfg @@ -5,3 +5,8 @@ env_vars: { key: "TRAMPOLINE_IMAGE" value: "gcr.io/cloud-devrel-kokoro-resources/java8" } + +env_vars: { + key: "REPORT_COVERAGE" + value: "true" +} diff --git a/.kokoro/continuous/readme.cfg b/.kokoro/continuous/readme.cfg new file mode 100644 index 000000000..637d4c083 --- /dev/null +++ b/.kokoro/continuous/readme.cfg @@ -0,0 +1,55 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-multi" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/readme.sh" +} + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + regex: "**/*sponge_log.log" + } +} + +# The github token is stored here. +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "yoshi-automation-github-key" + # TODO(theacodes): remove this after secrets have globally propagated + backend_type: FASTCONFIGPUSH + } + } +} + +# Common env vars for all repositories and builds. +env_vars: { + key: "GITHUB_USER" + value: "yoshi-automation" +} +env_vars: { + key: "GITHUB_EMAIL" + value: "yoshi-automation@google.com" +} diff --git a/.kokoro/dependencies.sh b/.kokoro/dependencies.sh new file mode 100755 index 000000000..59d2aafc7 --- /dev/null +++ b/.kokoro/dependencies.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +## Get the directory of the build script +scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}")) +## cd to the parent directory, i.e. the root of the git repo +cd ${scriptDir}/.. + +# include common functions +source ${scriptDir}/common.sh + +# Print out Java +java -version +echo $JOB_TYPE + +export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=128m" + +# this should run maven enforcer +retry_with_backoff 3 10 \ + mvn install -B -V -ntp \ + -DskipTests=true \ + -Dmaven.javadoc.skip=true \ + -Dclirr.skip=true + +mvn -B dependency:analyze -DfailOnWarning=true + +echo "****************** DEPENDENCY LIST COMPLETENESS CHECK *******************" +## Run dependency list completeness check +function completenessCheck() { + # Output dep list with compile scope generated using the original pom + # Running mvn dependency:list on Java versions that support modules will also include the module of the dependency. + # This is stripped from the output as it is not present in the flattened pom. + # Only dependencies with 'compile' or 'runtime' scope are included from original dependency list. + msg "Generating dependency list using original pom..." + mvn dependency:list -f pom.xml -DincludeScope=runtime -Dsort=true | grep '\[INFO] .*:.*:.*:.*:.*' | sed -e s/\\s--\\smodule.*// >.org-list.txt + + # Output dep list generated using the flattened pom (only 'compile' and 'runtime' scopes) + msg "Generating dependency list using flattened pom..." + mvn dependency:list -f .flattened-pom.xml -DincludeScope=runtime -Dsort=true | grep '\[INFO] .*:.*:.*:.*:.*' >.new-list.txt + + # Compare two dependency lists + msg "Comparing dependency lists..." + diff .org-list.txt .new-list.txt >.diff.txt + if [[ $? == 0 ]] + then + msg "Success. No diff!" + else + msg "Diff found. See below: " + msg "You can also check .diff.txt file located in $1." + cat .diff.txt + return 1 + fi +} + +# Allow failures to continue running the script +set +e + +error_count=0 +for path in $(find -name ".flattened-pom.xml") +do + # Check flattened pom in each dir that contains it for completeness + dir=$(dirname "$path") + pushd "$dir" + completenessCheck "$dir" + error_count=$(($error_count + $?)) + popd +done + +if [[ $error_count == 0 ]] +then + msg "All checks passed." + exit 0 +else + msg "Errors found. See log statements above." + exit 1 +fi diff --git a/.kokoro/nightly/common.cfg b/.kokoro/nightly/common.cfg new file mode 100644 index 000000000..c690aeb8a --- /dev/null +++ b/.kokoro/nightly/common.cfg @@ -0,0 +1,25 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + regex: "**/*sponge_log.txt" + } +} + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "api-common-java/.kokoro/trampoline.sh" + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/build.sh" +} + +env_vars: { + key: "JOB_TYPE" + value: "test" +} diff --git a/.kokoro/nightly/integration.cfg b/.kokoro/nightly/integration.cfg new file mode 100644 index 000000000..0048c8ece --- /dev/null +++ b/.kokoro/nightly/integration.cfg @@ -0,0 +1,37 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "JOB_TYPE" + value: "integration" +} +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "ENABLE_BUILD_COP" + value: "true" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-it-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-it-service-account" +} diff --git a/.kokoro/nightly/java11.cfg b/.kokoro/nightly/java11.cfg new file mode 100644 index 000000000..709f2b4c7 --- /dev/null +++ b/.kokoro/nightly/java11.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java11" +} diff --git a/.kokoro/nightly/java7.cfg b/.kokoro/nightly/java7.cfg new file mode 100644 index 000000000..cb24f44ee --- /dev/null +++ b/.kokoro/nightly/java7.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java7" +} diff --git a/.kokoro/nightly/java8-osx.cfg b/.kokoro/nightly/java8-osx.cfg new file mode 100644 index 000000000..affd3b901 --- /dev/null +++ b/.kokoro/nightly/java8-osx.cfg @@ -0,0 +1,3 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +build_file: "api-common-java/.kokoro/build.sh" diff --git a/.kokoro/nightly/java8-win.cfg b/.kokoro/nightly/java8-win.cfg new file mode 100644 index 000000000..590450c23 --- /dev/null +++ b/.kokoro/nightly/java8-win.cfg @@ -0,0 +1,3 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +build_file: "api-common-java/.kokoro/build.bat" diff --git a/.kokoro/nightly/java8.cfg b/.kokoro/nightly/java8.cfg new file mode 100644 index 000000000..495cc7bac --- /dev/null +++ b/.kokoro/nightly/java8.cfg @@ -0,0 +1,12 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "REPORT_COVERAGE" + value: "true" +} diff --git a/.kokoro/nightly/samples.cfg b/.kokoro/nightly/samples.cfg new file mode 100644 index 000000000..f25429314 --- /dev/null +++ b/.kokoro/nightly/samples.cfg @@ -0,0 +1,38 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "JOB_TYPE" + value: "samples" +} + +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "java-docs-samples-testing" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "java-docs-samples-testing" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-docs-samples-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-docs-samples-service-account" +} + +env_vars: { + key: "ENABLE_BUILD_COP" + value: "true" +} diff --git a/.kokoro/populate-secrets.sh b/.kokoro/populate-secrets.sh new file mode 100755 index 000000000..f52514257 --- /dev/null +++ b/.kokoro/populate-secrets.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# Copyright 2020 Google LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +function now { date +"%Y-%m-%d %H:%M:%S" | tr -d '\n' ;} +function msg { println "$*" >&2 ;} +function println { printf '%s\n' "$(now) $*" ;} + + +# Populates requested secrets set in SECRET_MANAGER_KEYS from service account: +# kokoro-trampoline@cloud-devrel-kokoro-resources.iam.gserviceaccount.com +SECRET_LOCATION="${KOKORO_GFILE_DIR}/secret_manager" +msg "Creating folder on disk for secrets: ${SECRET_LOCATION}" +mkdir -p ${SECRET_LOCATION} +for key in $(echo ${SECRET_MANAGER_KEYS} | sed "s/,/ /g") +do + msg "Retrieving secret ${key}" + docker run --entrypoint=gcloud \ + --volume=${KOKORO_GFILE_DIR}:${KOKORO_GFILE_DIR} \ + gcr.io/google.com/cloudsdktool/cloud-sdk \ + secrets versions access latest \ + --project cloud-devrel-kokoro-resources \ + --secret ${key} > \ + "${SECRET_LOCATION}/${key}" + if [[ $? == 0 ]]; then + msg "Secret written to ${SECRET_LOCATION}/${key}" + else + msg "Error retrieving secret ${key}" + fi +done diff --git a/.kokoro/presubmit/clirr.cfg b/.kokoro/presubmit/clirr.cfg new file mode 100644 index 000000000..ec572442e --- /dev/null +++ b/.kokoro/presubmit/clirr.cfg @@ -0,0 +1,13 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. + +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "JOB_TYPE" + value: "clirr" +} \ No newline at end of file diff --git a/.kokoro/presubmit/common.cfg b/.kokoro/presubmit/common.cfg index 1c23fa586..09383a58f 100644 --- a/.kokoro/presubmit/common.cfg +++ b/.kokoro/presubmit/common.cfg @@ -4,6 +4,7 @@ action { define_artifacts { regex: "**/*sponge_log.xml" + regex: "**/*sponge_log.txt" } } @@ -22,3 +23,12 @@ env_vars: { key: "JOB_TYPE" value: "test" } + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "dpebot_codecov_token" + } + } +} diff --git a/.kokoro/presubmit/dependencies.cfg b/.kokoro/presubmit/dependencies.cfg new file mode 100644 index 000000000..701ec13bd --- /dev/null +++ b/.kokoro/presubmit/dependencies.cfg @@ -0,0 +1,12 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/dependencies.sh" +} diff --git a/.kokoro/presubmit/integration.cfg b/.kokoro/presubmit/integration.cfg new file mode 100644 index 000000000..dded67a9d --- /dev/null +++ b/.kokoro/presubmit/integration.cfg @@ -0,0 +1,33 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "JOB_TYPE" + value: "integration" +} + +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-it-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-it-service-account" +} diff --git a/.kokoro/presubmit/java8-osx.cfg b/.kokoro/presubmit/java8-osx.cfg new file mode 100644 index 000000000..affd3b901 --- /dev/null +++ b/.kokoro/presubmit/java8-osx.cfg @@ -0,0 +1,3 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +build_file: "api-common-java/.kokoro/build.sh" diff --git a/.kokoro/presubmit/java8-win.cfg b/.kokoro/presubmit/java8-win.cfg new file mode 100644 index 000000000..590450c23 --- /dev/null +++ b/.kokoro/presubmit/java8-win.cfg @@ -0,0 +1,3 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +build_file: "api-common-java/.kokoro/build.bat" diff --git a/.kokoro/presubmit/java8.cfg b/.kokoro/presubmit/java8.cfg index 3b017fc80..495cc7bac 100644 --- a/.kokoro/presubmit/java8.cfg +++ b/.kokoro/presubmit/java8.cfg @@ -5,3 +5,8 @@ env_vars: { key: "TRAMPOLINE_IMAGE" value: "gcr.io/cloud-devrel-kokoro-resources/java8" } + +env_vars: { + key: "REPORT_COVERAGE" + value: "true" +} diff --git a/.kokoro/presubmit/linkage-monitor.cfg b/.kokoro/presubmit/linkage-monitor.cfg new file mode 100644 index 000000000..edd98254e --- /dev/null +++ b/.kokoro/presubmit/linkage-monitor.cfg @@ -0,0 +1,12 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/linkage-monitor.sh" +} \ No newline at end of file diff --git a/.kokoro/presubmit/lint.cfg b/.kokoro/presubmit/lint.cfg new file mode 100644 index 000000000..6d323c8ae --- /dev/null +++ b/.kokoro/presubmit/lint.cfg @@ -0,0 +1,13 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. + +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "JOB_TYPE" + value: "lint" +} \ No newline at end of file diff --git a/.kokoro/presubmit/samples.cfg b/.kokoro/presubmit/samples.cfg new file mode 100644 index 000000000..01e096004 --- /dev/null +++ b/.kokoro/presubmit/samples.cfg @@ -0,0 +1,33 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "JOB_TYPE" + value: "samples" +} + +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "java-docs-samples-testing" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "java-docs-samples-testing" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-docs-samples-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-docs-samples-service-account" +} \ No newline at end of file diff --git a/.kokoro/release/bump_snapshot.cfg b/.kokoro/release/bump_snapshot.cfg new file mode 100644 index 000000000..4d600c86c --- /dev/null +++ b/.kokoro/release/bump_snapshot.cfg @@ -0,0 +1,53 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "api-common-java/.kokoro/trampoline.sh" + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/node:10-user" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/bump_snapshot.sh" +} + +# tokens used by release-please to keep an up-to-date release PR. +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "github-magic-proxy-key-release-please" + } + } +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "github-magic-proxy-token-release-please" + } + } +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "github-magic-proxy-url-release-please" + } + } +} diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg index c22ce6933..adb59b9d9 100644 --- a/.kokoro/release/common.cfg +++ b/.kokoro/release/common.cfg @@ -8,8 +8,8 @@ build_file: "api-common-java/.kokoro/trampoline.sh" # Configure the docker image for kokoro-trampoline. env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" } before_action { diff --git a/.kokoro/release/common.sh b/.kokoro/release/common.sh index d5738d430..92716fa0b 100755 --- a/.kokoro/release/common.sh +++ b/.kokoro/release/common.sh @@ -34,7 +34,6 @@ signing.gnupg.executable=gpg signing.gnupg.homeDir=${GPG_HOMEDIR} signing.gnupg.keyName=${GPG_KEY_ID} signing.gnupg.passphrase=${GPG_PASSPHRASE} - ossrhUsername=${SONATYPE_USERNAME} ossrhPassword=${SONATYPE_PASSWORD}" > $1 } diff --git a/.kokoro/release/drop.cfg b/.kokoro/release/drop.cfg index feb878972..456a07816 100644 --- a/.kokoro/release/drop.cfg +++ b/.kokoro/release/drop.cfg @@ -1,5 +1,6 @@ # Format: //devtools/kokoro/config/proto/build.proto - env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/drop.sh" + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/drop.sh" } diff --git a/.kokoro/release/promote.cfg b/.kokoro/release/promote.cfg index d69f1d6f2..418890c65 100644 --- a/.kokoro/release/promote.cfg +++ b/.kokoro/release/promote.cfg @@ -1,5 +1,6 @@ # Format: //devtools/kokoro/config/proto/build.proto - env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/promote.sh" + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/promote.sh" } diff --git a/.kokoro/release/publish_javadoc.cfg b/.kokoro/release/publish_javadoc.cfg index 043f92f13..d635fca80 100644 --- a/.kokoro/release/publish_javadoc.cfg +++ b/.kokoro/release/publish_javadoc.cfg @@ -1,14 +1,18 @@ # Format: //devtools/kokoro/config/proto/build.proto + +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/doc-templates/" + env_vars: { - key: "STAGING_BUCKET" - value: "docs-staging" + key: "STAGING_BUCKET" + value: "docs-staging" } env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/publish_javadoc.sh" + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/publish_javadoc.sh" } + before_action { fetch_keystore { keystore_resource { diff --git a/.kokoro/release/snapshot.cfg b/.kokoro/release/snapshot.cfg new file mode 100644 index 000000000..a1fb5ce3c --- /dev/null +++ b/.kokoro/release/snapshot.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/snapshot.sh" +} \ No newline at end of file diff --git a/.kokoro/release/snapshot.sh b/.kokoro/release/snapshot.sh new file mode 100755 index 000000000..53a904a1c --- /dev/null +++ b/.kokoro/release/snapshot.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +source $(dirname "$0")/common.sh +MAVEN_SETTINGS_FILE=$(realpath $(dirname "$0")/../../)/settings.xml +pushd $(dirname "$0")/../../ + +# ensure we're trying to push a snapshot (no-result returns non-zero exit code) +grep SNAPSHOT versions.txt + +setup_environment_secrets +mkdir -p ${HOME}/.gradle +create_gradle_properties_file "${HOME}/.gradle/gradle.properties" + +./gradlew assemble publish diff --git a/.kokoro/release/stage.cfg b/.kokoro/release/stage.cfg index 4016988c9..d42938cc5 100644 --- a/.kokoro/release/stage.cfg +++ b/.kokoro/release/stage.cfg @@ -1,35 +1,19 @@ # Format: //devtools/kokoro/config/proto/build.proto - env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/stage.sh" -} -# Fetch the token needed for reporting release status to GitHub -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "yoshi-automation-github-key" - } - } +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/stage.sh" } -# Fetch magictoken to use with Magic Github Proxy -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "releasetool-magictoken" - } +# Need to save the properties file +action { + define_artifacts { + regex: "github/api-common-java/target/nexus-staging/staging/*.properties" + strip_prefix: "github/api-common-java" } } -# Fetch api key to use with Magic Github Proxy -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "magic-github-proxy-api-key" - } - } +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem" } diff --git a/.kokoro/trampoline.sh b/.kokoro/trampoline.sh old mode 100755 new mode 100644 index 3e90f6494..e422a90dd --- a/.kokoro/trampoline.sh +++ b/.kokoro/trampoline.sh @@ -21,4 +21,6 @@ function cleanup() { echo "cleanup"; } trap cleanup EXIT + +$(dirname $0)/populate-secrets.sh # Secret Manager secrets. python3 "${KOKORO_GFILE_DIR}/trampoline_v1.py" diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 46b2a08ea..2add2547a 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,43 +1,94 @@ -# Contributor Code of Conduct + +# Code of Conduct -As contributors and maintainers of this project, -and in the interest of fostering an open and welcoming community, -we pledge to respect all people who contribute through reporting issues, -posting feature requests, updating documentation, -submitting pull requests or patches, and other activities. +## Our Pledge -We are committed to making participation in this project -a harassment-free experience for everyone, -regardless of level of experience, gender, gender identity and expression, -sexual orientation, disability, personal appearance, -body size, race, ethnicity, age, religion, or nationality. +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of +experience, education, socio-economic status, nationality, personal appearance, +race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery -* Personal attacks -* Trolling or insulting/derogatory comments -* Public or private harassment -* Publishing other's private information, -such as physical or electronic -addresses, without explicit permission -* Other unethical or unprofessional conduct. +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct. -By adopting this Code of Conduct, -project maintainers commit themselves to fairly and consistently -applying these principles to every aspect of managing this project. -Project maintainers who do not follow or enforce the Code of Conduct -may be permanently removed from the project team. - -This code of conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. - -Instances of abusive, harassing, or otherwise unacceptable behavior -may be reported by opening an issue -or contacting one or more of the project maintainers. - -This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, -available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, or to ban temporarily or permanently any +contributor for other behaviors that they deem inappropriate, threatening, +offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +This Code of Conduct also applies outside the project spaces when the Project +Steward has a reasonable belief that an individual's behavior may have a +negative impact on the project or its community. + +## Conflict Resolution + +We do not believe that all conflict is bad; healthy debate and disagreement +often yield positive results. However, it is never okay to be disrespectful or +to engage in behavior that violates the project’s code of conduct. + +If you see someone violating the code of conduct, you are encouraged to address +the behavior directly with those involved. Many issues can be resolved quickly +and easily, and this gives people more control over the outcome of their +dispute. If you are unable to resolve the matter for any reason, or if the +behavior is threatening or harassing, report it. We are dedicated to providing +an environment where participants feel welcome and safe. + +Reports should be directed to *googleapis-stewards@google.com*, the +Project Steward(s) for *Google Cloud Client Libraries*. It is the Project Steward’s duty to +receive and address reported violations of the code of conduct. They will then +work with a committee consisting of representatives from the Open Source +Programs Office and the Google Open Source Strategy team. If for any reason you +are uncomfortable reaching out to the Project Steward, please email +opensource@google.com. + +We will investigate every complaint, but you may not receive a direct response. +We will use our discretion in determining when and how to follow up on reported +incidents, which may range from not taking action to permanent expulsion from +the project and project-sponsored spaces. We will notify the accused of the +report and provide them an opportunity to discuss it before any action is taken. +The identity of the reporter will be omitted from the details of the report +supplied to the accused. In potentially harmful situations, such as ongoing +harassment or threats to anyone's safety, we may take action without notice. + +## Attribution + +This Code of Conduct is adapted from the Contributor Covenant, version 1.4, +available at +https://www.contributor-covenant.org/version/1/4/code-of-conduct.html \ No newline at end of file diff --git a/LICENSE b/LICENSE index 6d16b6578..4e1943723 100644 --- a/LICENSE +++ b/LICENSE @@ -24,4 +24,4 @@ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/codecov.yaml b/codecov.yaml new file mode 100644 index 000000000..5724ea947 --- /dev/null +++ b/codecov.yaml @@ -0,0 +1,4 @@ +--- +codecov: + ci: + - source.cloud.google.com diff --git a/java.header b/java.header new file mode 100644 index 000000000..3a9b503aa --- /dev/null +++ b/java.header @@ -0,0 +1,15 @@ +^/\*$ +^ \* Copyright \d\d\d\d,? Google (Inc\.|LLC)( All [rR]ights [rR]eserved\.)?$ +^ \*$ +^ \* Licensed under the Apache License, Version 2\.0 \(the "License"\);$ +^ \* you may not use this file except in compliance with the License\.$ +^ \* You may obtain a copy of the License at$ +^ \*$ +^ \*[ ]+https?://www.apache.org/licenses/LICENSE-2\.0$ +^ \*$ +^ \* Unless required by applicable law or agreed to in writing, software$ +^ \* distributed under the License is distributed on an "AS IS" BASIS,$ +^ \* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.$ +^ \* See the License for the specific language governing permissions and$ +^ \* limitations under the License\.$ +^ \*/$ diff --git a/license-checks.xml b/license-checks.xml new file mode 100644 index 000000000..6597fced8 --- /dev/null +++ b/license-checks.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/renovate.json b/renovate.json index b76243f10..e820d7bbd 100644 --- a/renovate.json +++ b/renovate.json @@ -16,6 +16,58 @@ "^com.google.guava:" ], "versionScheme": "docker" + }, + { + "packagePatterns": [ + "*" + ], + "semanticCommitType": "deps", + "semanticCommitScope": null + }, + { + "packagePatterns": [ + "^org.apache.maven", + "^org.jacoco:", + "^org.codehaus.mojo:", + "^org.sonatype.plugins:", + "^com.coveo:", + "^com.google.cloud:google-cloud-shared-config" + ], + "semanticCommitType": "build", + "semanticCommitScope": "deps" + }, + { + "packagePatterns": [ + "^com.google.api:api-common", + "^com.google.cloud:libraries-bom", + "^com.google.cloud.samples:shared-configuration" + ], + "semanticCommitType": "chore", + "semanticCommitScope": "deps" + }, + { + "packagePatterns": [ + "^junit:junit", + "^com.google.truth:truth", + "^org.mockito:mockito-core", + "^org.objenesis:objenesis" + ], + "semanticCommitType": "test", + "semanticCommitScope": "deps" + }, + { + "packagePatterns": [ + "^com.google.cloud:google-cloud-" + ], + "ignoreUnstable": false + }, + { + "packagePatterns": [ + "^com.fasterxml.jackson.core" + ], + "groupName": "jackson dependencies" } - ] + ], + "semanticCommits": true, + "masterIssue": true } diff --git a/synth.metadata b/synth.metadata new file mode 100644 index 000000000..b8bf18aed --- /dev/null +++ b/synth.metadata @@ -0,0 +1,18 @@ +{ + "sources": [ + { + "git": { + "name": ".", + "remote": "git@github.com:googleapis/api-common-java.git", + "sha": "7014db17904a165c78fbda1284d433b38e839876" + } + }, + { + "git": { + "name": "synthtool", + "remote": "https://github.com/googleapis/synthtool.git", + "sha": "5a6f30b8bb7672cf237c4f75d5aa96bfba170e7f" + } + } + ] +} \ No newline at end of file From 15cebbcaea8a1ea62e4a800d8d325ee302971fcf Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 22 Apr 2021 22:36:02 +0200 Subject: [PATCH 059/201] deps: update dependency com.google.auto.value:auto-value-annotations to v1.8.1 (#215) [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.auto.value:auto-value-annotations](https://togithub.com/google/auto) | `1.8` -> `1.8.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.8.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.8.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.8.1/compatibility-slim/1.8)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.8.1/confidence-slim/1.8)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration :date: **Schedule**: At any time (no schedule defined). :vertical_traffic_light: **Automerge**: Disabled by config. Please merge this manually once you are satisfied. :recycle: **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. :no_bell: **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7d91ccfd6..a9d63e010 100644 --- a/build.gradle +++ b/build.gradle @@ -40,7 +40,7 @@ ext { libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value: 'com.google.auto.value:auto-value:1.8', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.1', guava: 'com.google.guava:guava:30.1.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.6.0', From c6fa06ff4bb54797d4f4211e04933668a7d9894b Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 22 Apr 2021 22:44:02 +0200 Subject: [PATCH 060/201] chore(deps): update dependency com.google.auto.value:auto-value to v1.8.1 (#214) [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.auto.value:auto-value](https://togithub.com/google/auto) | `1.8` -> `1.8.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.8.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.8.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.8.1/compatibility-slim/1.8)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.8.1/confidence-slim/1.8)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration :date: **Schedule**: At any time (no schedule defined). :vertical_traffic_light: **Automerge**: Disabled by config. Please merge this manually once you are satisfied. :recycle: **Rebasing**: Renovate will not automatically rebase this PR, because other commits have been found. :no_bell: **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a9d63e010..9f1b5adbd 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', - auto_value: 'com.google.auto.value:auto-value:1.8', + auto_value: 'com.google.auto.value:auto-value:1.8.1', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.1', guava: 'com.google.guava:guava:30.1.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', From 307c640cb487962786be5551a65863c7d2276a3a Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 23 Apr 2021 00:26:02 +0200 Subject: [PATCH 061/201] deps: update dependency com.google.auto.value:auto-value to v1.8.1 (#219) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.auto.value:auto-value](https://togithub.com/google/auto) | `1.8` -> `1.8.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.8.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.8.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.8.1/compatibility-slim/1.8)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.8.1/confidence-slim/1.8)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration :date: **Schedule**: At any time (no schedule defined). :vertical_traffic_light: **Automerge**: Disabled by config. Please merge this manually once you are satisfied. :recycle: **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. :no_bell: **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box. ⚠️ **Warning**: custom changes will be lost. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). From f92eca64269668a484d1e3c6320d40462d588d0b Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 22 Apr 2021 22:34:02 +0000 Subject: [PATCH 062/201] chore: release 1.10.3 (#218) :robot: I have created a release \*beep\* \*boop\* --- ### [1.10.3](https://www.github.com/googleapis/api-common-java/compare/v1.10.2...v1.10.3) (2021-04-22) ### Dependencies * update dependency com.google.auto.value:auto-value to v1.8.1 ([#219](https://www.github.com/googleapis/api-common-java/issues/219)) ([307c640](https://www.github.com/googleapis/api-common-java/commit/307c640cb487962786be5551a65863c7d2276a3a)) * update dependency com.google.auto.value:auto-value-annotations to v1.8.1 ([#215](https://www.github.com/googleapis/api-common-java/issues/215)) ([15cebbc](https://www.github.com/googleapis/api-common-java/commit/15cebbcaea8a1ea62e4a800d8d325ee302971fcf)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 8 ++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c23d353a6..56eb7b608 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +### [1.10.3](https://www.github.com/googleapis/api-common-java/compare/v1.10.2...v1.10.3) (2021-04-22) + + +### Dependencies + +* update dependency com.google.auto.value:auto-value to v1.8.1 ([#219](https://www.github.com/googleapis/api-common-java/issues/219)) ([307c640](https://www.github.com/googleapis/api-common-java/commit/307c640cb487962786be5551a65863c7d2276a3a)) +* update dependency com.google.auto.value:auto-value-annotations to v1.8.1 ([#215](https://www.github.com/googleapis/api-common-java/issues/215)) ([15cebbc](https://www.github.com/googleapis/api-common-java/commit/15cebbcaea8a1ea62e4a800d8d325ee302971fcf)) + ### [1.10.2](https://www.github.com/googleapis/api-common-java/compare/v1.10.1...v1.10.2) (2021-04-19) diff --git a/build.gradle b/build.gradle index 9f1b5adbd..5d1128c1c 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "1.10.3" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index ebf778ab4..7df685a7a 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.2:1.10.3-SNAPSHOT \ No newline at end of file +api-common:1.10.3:1.10.3 \ No newline at end of file From c240935519e81fa498668f064274e4d046c45be1 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 22 Apr 2021 23:14:09 +0000 Subject: [PATCH 063/201] chore: release 1.10.4-SNAPSHOT (#220) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 5d1128c1c..166121621 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.3" // {x-version-update:api-common:current} +project.version = "1.10.4-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index 7df685a7a..7e3194fc8 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.3:1.10.3 \ No newline at end of file +api-common:1.10.3:1.10.4-SNAPSHOT \ No newline at end of file From a7d15be2d60e67d820d3bdae242d1cfd66e5c83f Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Thu, 22 Apr 2021 16:40:50 -0700 Subject: [PATCH 064/201] chore: cloud-rad-java doc generation (#212) * feat: cloud-rad-java doc generation * chore: fix file name Co-authored-by: Les Vogel --- .kokoro/release/publish_javadoc11.cfg | 30 ++++++++++++++ .kokoro/release/publish_javadoc11.sh | 56 +++++++++++++++++++++++++++ build.gradle | 38 ++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 .kokoro/release/publish_javadoc11.cfg create mode 100755 .kokoro/release/publish_javadoc11.sh diff --git a/.kokoro/release/publish_javadoc11.cfg b/.kokoro/release/publish_javadoc11.cfg new file mode 100644 index 000000000..2d99e2448 --- /dev/null +++ b/.kokoro/release/publish_javadoc11.cfg @@ -0,0 +1,30 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# cloud-rad production +env_vars: { + key: "STAGING_BUCKET_V2" + value: "docs-staging-v2" +} + +# Configure the docker image for kokoro-trampoline +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java11" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/api-common-java/.kokoro/release/publish_javadoc11.sh" +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "docuploader_service_account" + } + } +} + +# Downloads docfx doclet resource. This will be in ${KOKORO_GFILE_DIR}/ +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/docfx" diff --git a/.kokoro/release/publish_javadoc11.sh b/.kokoro/release/publish_javadoc11.sh new file mode 100755 index 000000000..b9a8f55ea --- /dev/null +++ b/.kokoro/release/publish_javadoc11.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +if [[ -z "${CREDENTIALS}" ]]; then + CREDENTIALS=${KOKORO_KEYSTORE_DIR}/73713_docuploader_service_account +fi + +if [[ -z "${STAGING_BUCKET_V2}" ]]; then + echo "Need to set STAGING_BUCKET environment variable" + exit 1 +fi + +# work from the git root directory +pushd $(dirname "$0")/../../ + +# install docuploader package +python3 -m pip install gcp-docuploader + +NAME=api-common +VERSION=$(grep ${NAME}: versions.txt | cut -d: -f3) + +# build the docs +./gradlew javadocCombinedV3 + +# copy README to tmp_docs dir and rename index.md +cp README.md tmp_docs/index.md + +pushd tmp_docs + +# create metadata +python3 -m docuploader create-metadata \ + --name ${NAME} \ + --version ${VERSION} \ + --language java + +# upload docs +python3 -m docuploader upload . \ + --credentials ${CREDENTIALS} \ + --staging-bucket ${STAGING_BUCKET_V2} \ + --destination-prefix docfx + +popd diff --git a/build.gradle b/build.gradle index 166121621..7fa41d83a 100644 --- a/build.gradle +++ b/build.gradle @@ -112,6 +112,26 @@ javadoc.options { links 'https://docs.oracle.com/javase/7/docs/api/' } +// JavaDocV3 +// ------- + +task javadocJarV3(type: Jar) { + classifier = 'javadoc' + from javadoc +} + +javadoc.options { + encoding = 'UTF-8' + links 'https://docs.oracle.com/javase/7/docs/api/' + + if (JavaVersion.current().isJava8Compatible()) { + addStringOption('Xdoclint:all,-missing', '-quiet') + } + if (JavaVersion.current().isJava11Compatible()) { + addStringOption('-release', '7') + } +} + // Test Logging // ------------ @@ -312,6 +332,24 @@ tasks.verifyGoogleJavaFormat { } test.dependsOn verifyGoogleJavaFormat +// JavaDocV3 docFX +// +task javadocCombinedV3(type: Javadoc) { + source project.sourceSets.main.allJava + classpath = files(project.sourceSets.main.compileClasspath) + destinationDir = new File(projectDir, 'tmp_docs') + + options.addStringOption('encoding', 'UTF-8') + options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") + options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/docfx-doclet-1.0-SNAPSHOT-jar-with-dependencies-172556.jar")] +} + +clean { + delete 'tmp_gh-pages/' + delete 'tmp_docs/' +} + + // Release // ======= From 98e8a4d9f81e21d1cdfaff0fbd3f7efd29a3bfc5 Mon Sep 17 00:00:00 2001 From: "google-cloud-policy-bot[bot]" <80869356+google-cloud-policy-bot[bot]@users.noreply.github.com> Date: Tue, 27 Apr 2021 17:20:17 +0000 Subject: [PATCH 065/201] chore: add SECURITY.md (#221) add a security policy --- SECURITY.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..8b58ae9c0 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,7 @@ +# Security Policy + +To report a security issue, please use [g.co/vulnz](https://g.co/vulnz). + +The Google Security Team will respond within 5 working days of your report on g.co/vulnz. + +We use g.co/vulnz for our intake, and do coordination and disclosure here using GitHub Security Advisory to privately discuss and fix the issue. From a155c7e9ac3494ee294f0ad5c77ad0d3e41500d0 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Tue, 4 May 2021 13:50:08 -0700 Subject: [PATCH 066/201] build: configure branch 1.10.1-sp as a release branch (#222) enable releases --- .github/release-please.yml | 6 ++++- .github/sync-repo-settings.yaml | 43 ++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/.github/release-please.yml b/.github/release-please.yml index dce2c8450..ae0a4d90d 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -1,2 +1,6 @@ releaseType: java-yoshi -bumpMinorPreMajor: true \ No newline at end of file +bumpMinorPreMajor: true +branches: + - releaseType: java-lts + bumpMinorPreMajor: true + branch: 1.10.1-sp diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index be76ae755..c387e67f7 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -2,21 +2,30 @@ rebaseMergeAllowed: true squashMergeAllowed: true mergeCommitAllowed: false branchProtectionRules: -- pattern: master - isAdminEnforced: true - requiredStatusCheckContexts: - - 'codecov/patch' - - 'codecov/project' - - 'cla/google' - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true - requiresStrictStatusChecks: true + - pattern: master + isAdminEnforced: true + requiredStatusCheckContexts: + - codecov/patch + - codecov/project + - cla/google + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: true + - pattern: 1.10.1-sp + isAdminEnforced: true + requiredStatusCheckContexts: + - codecov/patch + - codecov/project + - cla/google + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: true permissionRules: -- team: Googlers - permission: pull -- team: yoshi-java - permission: push -- team: yoshi-java-admins - permission: admin -- team: yoshi-admins - permission: admin + - team: Googlers + permission: pull + - team: yoshi-java + permission: push + - team: yoshi-java-admins + permission: admin + - team: yoshi-admins + permission: admin From 7a3fb6de9987f13715d25f3c4654051d5df36f72 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 12 May 2021 09:06:02 -0700 Subject: [PATCH 067/201] build: allow release-please to handle release tagging (#227) --- .github/release-please.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/release-please.yml b/.github/release-please.yml index ae0a4d90d..72ef01bed 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -1,6 +1,8 @@ releaseType: java-yoshi bumpMinorPreMajor: true +handleGHRelease: true branches: - releaseType: java-lts bumpMinorPreMajor: true branch: 1.10.1-sp + handleGHRelease: true From a0c656a3dce025c271ca4552d76ddce2e716140c Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 12 May 2021 09:10:07 -0700 Subject: [PATCH 068/201] build: fix required checks (#228) codecov is not required --- .github/sync-repo-settings.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index c387e67f7..7c26125bd 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -5,8 +5,8 @@ branchProtectionRules: - pattern: master isAdminEnforced: true requiredStatusCheckContexts: - - codecov/patch - - codecov/project + - units + - format - cla/google requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true @@ -14,8 +14,8 @@ branchProtectionRules: - pattern: 1.10.1-sp isAdminEnforced: true requiredStatusCheckContexts: - - codecov/patch - - codecov/project + - units + - format - cla/google requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true From 81cd081a91997128f6d59e1e4583b97d7d0cbb52 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Thu, 13 May 2021 17:26:06 +0000 Subject: [PATCH 069/201] chore: remove codecov (#223) --- .github/workflows/ci.yaml | 4 ---- .kokoro/build.sh | 2 -- .kokoro/presubmit/common.cfg | 8 -------- README.md | 2 -- codecov.yaml | 4 ---- 5 files changed, 20 deletions(-) delete mode 100644 codecov.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 263aa40e6..099bd8da8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,10 +23,6 @@ jobs: run: ./gradlew test - name: Gradle Build run: ./gradlew build install - - name: coverage - uses: codecov/codecov-action@v1 - with: - name: actions ${{ matrix.java }} format: runs-on: ubuntu-latest steps: diff --git a/.kokoro/build.sh b/.kokoro/build.sh index 4757df8eb..fbf2695f4 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -23,5 +23,3 @@ echo $JOB_TYPE ./gradlew assemble ./gradlew build install - -bash $KOKORO_GFILE_DIR/codecov.sh diff --git a/.kokoro/presubmit/common.cfg b/.kokoro/presubmit/common.cfg index 09383a58f..3958711ba 100644 --- a/.kokoro/presubmit/common.cfg +++ b/.kokoro/presubmit/common.cfg @@ -24,11 +24,3 @@ env_vars: { value: "test" } -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "dpebot_codecov_token" - } - } -} diff --git a/README.md b/README.md index 51f24b3e9..f139ae63d 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,6 @@ API Common for Java [![Build Status](https://travis-ci.org/googleapis/api-common-java.svg?branch=master)](https://travis-ci.org/googleapis/api-common-java) -[![Code Coverage](https://img.shields.io/codecov/c/github/googleapis/api-common-java.svg)](https://codecov.io/github/googleapis/api-common-java) - - [Documentation](https://googleapis.dev/java/api-common/latest/index.html) API Common for Java is a library for foundational types relating to Google diff --git a/codecov.yaml b/codecov.yaml deleted file mode 100644 index 5724ea947..000000000 --- a/codecov.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -codecov: - ci: - - source.cloud.google.com From 51b00e0603583fc3b781783945dcbccef81a22fd Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 19 May 2021 17:18:10 +0200 Subject: [PATCH 070/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.7.1 (#231) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | com.google.errorprone:error_prone_annotations | `2.6.0` -> `2.7.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.7.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.7.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.7.1/compatibility-slim/2.6.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.7.1/confidence-slim/2.6.0)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻️ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7fa41d83a..6d2ec9007 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.1', guava: 'com.google.guava:guava:30.1.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.6.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.7.1', // Testing junit: 'junit:junit:4.13.2', From aa02c6552dc73ea768ae76bdb65d23dbd585b2f7 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 09:23:51 -0700 Subject: [PATCH 071/201] chore: release 1.10.4 (#232) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56eb7b608..6c595aa5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [1.10.4](https://www.github.com/googleapis/api-common-java/compare/v1.10.3...v1.10.4) (2021-05-19) + + +### Dependencies + +* update dependency com.google.errorprone:error_prone_annotations to v2.7.1 ([#231](https://www.github.com/googleapis/api-common-java/issues/231)) ([51b00e0](https://www.github.com/googleapis/api-common-java/commit/51b00e0603583fc3b781783945dcbccef81a22fd)) + ### [1.10.3](https://www.github.com/googleapis/api-common-java/compare/v1.10.2...v1.10.3) (2021-04-22) diff --git a/build.gradle b/build.gradle index 6d2ec9007..625b0f6c5 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.4-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "1.10.4" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index 7e3194fc8..72419e5d6 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.3:1.10.4-SNAPSHOT \ No newline at end of file +api-common:1.10.4:1.10.4 \ No newline at end of file From c9990f235b01fcfbfb93dc372de2c4192d681fc4 Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Wed, 19 May 2021 11:15:31 -0700 Subject: [PATCH 072/201] chore: update cloud-rad doclet (#234) Updates cloud rad doc generation to use new doclet. Added the new doclet jar to cloud-devrel-kokoro-resources/docfx bucket --- .kokoro/release/publish_javadoc11.sh | 7 +++++-- build.gradle | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.kokoro/release/publish_javadoc11.sh b/.kokoro/release/publish_javadoc11.sh index b9a8f55ea..1e8bb68a9 100755 --- a/.kokoro/release/publish_javadoc11.sh +++ b/.kokoro/release/publish_javadoc11.sh @@ -37,9 +37,12 @@ VERSION=$(grep ${NAME}: versions.txt | cut -d: -f3) ./gradlew javadocCombinedV3 # copy README to tmp_docs dir and rename index.md -cp README.md tmp_docs/index.md +cp README.md tmp_docs/docfx-yml/index.md -pushd tmp_docs +# copy CHANGELOG to docfx-yml dir and rename history.md +cp CHANGELOG.md tmp_docs/docfx-yml/history.md + +pushd tmp_docs/docfx-yml/ # create metadata python3 -m docuploader create-metadata \ diff --git a/build.gradle b/build.gradle index 625b0f6c5..67b658551 100644 --- a/build.gradle +++ b/build.gradle @@ -337,11 +337,12 @@ test.dependsOn verifyGoogleJavaFormat task javadocCombinedV3(type: Javadoc) { source project.sourceSets.main.allJava classpath = files(project.sourceSets.main.compileClasspath) - destinationDir = new File(projectDir, 'tmp_docs') + destinationDir = new File(projectDir, 'tmp_docs/docfx-yml') options.addStringOption('encoding', 'UTF-8') options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") - options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/docfx-doclet-1.0-SNAPSHOT-jar-with-dependencies-172556.jar")] + options.addStringOption("projectname", "api-common") + options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.0.jar")] } clean { From fe262dae7569768ecdd6284016d65aa07f4855f7 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 26 May 2021 22:58:10 +0200 Subject: [PATCH 073/201] test(deps): update dependency com.google.truth:truth to v1.1.3 (#237) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | com.google.truth:truth | `1.1.2` -> `1.1.3` | [![age](https://badges.renovateapi.com/packages/maven/com.google.truth:truth/1.1.3/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.truth:truth/1.1.3/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.truth:truth/1.1.3/compatibility-slim/1.1.2)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.truth:truth/1.1.3/confidence-slim/1.1.2)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻️ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 67b658551..47caa31a5 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,7 @@ ext { // Testing junit: 'junit:junit:4.13.2', - truth: 'com.google.truth:truth:1.1.2', + truth: 'com.google.truth:truth:1.1.3', ] } From a9f0d79819a9f04aeb116d9aa9c15ad79149f752 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 21:10:05 +0000 Subject: [PATCH 074/201] chore: release 1.10.5-SNAPSHOT (#233) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 47caa31a5..7071f3b52 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.4" // {x-version-update:api-common:current} +project.version = "1.10.5-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index 72419e5d6..4c9b647dc 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.4:1.10.4 \ No newline at end of file +api-common:1.10.4:1.10.5-SNAPSHOT \ No newline at end of file From 2ca4359127cc2f8eddb81e8091362a75e1e6e38e Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 9 Jun 2021 21:08:54 +0200 Subject: [PATCH 075/201] deps: update dependency io.codearte.gradle.nexus:gradle-nexus-staging-plugin to v0.30.0 (#239) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7071f3b52..89c3b0cc3 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.9", - "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.2" + "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.30.0" } } From d4913d33ff2153cb3a8f6382ab8d918980f542ea Mon Sep 17 00:00:00 2001 From: Vadym Matsishevskyi <25311427+vam-google@users.noreply.github.com> Date: Tue, 20 Jul 2021 12:58:21 -0700 Subject: [PATCH 076/201] fix: Fix PathTemplate custom verb logic matching and instantiating (#244) The custom verb (":literal" at the end of a url path) was not handled properly. On instantiation `:` was incorrectly replaced with `/`. On matching `:literal` was not properly recognized as a valid input. --- build.gradle | 4 ++ .../google/api/pathtemplate/PathTemplate.java | 6 +- .../api/pathtemplate/PathTemplateTest.java | 70 +++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 89c3b0cc3..b26b72af4 100644 --- a/build.gradle +++ b/build.gradle @@ -32,6 +32,10 @@ project.version = "1.10.5-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 +jacoco { + toolVersion = "0.8.7" +} + // Dependencies // ------------ diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java index dd133461a..098524210 100644 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ b/src/main/java/com/google/api/pathtemplate/PathTemplate.java @@ -664,7 +664,8 @@ private boolean match( switch (segments.get(i).kind()) { case BINDING: case END_BINDING: - // skip + case CUSTOM_VERB: + // These segments do not actually consume any input. continue; default: segsToMatch++; @@ -746,7 +747,8 @@ private String instantiate(Map values, boolean allowPartial) { while (iterator.hasNext()) { Segment seg = iterator.next(); if (!skip && !continueLast) { - String separator = prevSeparator.isEmpty() ? seg.separator() : prevSeparator; + String separator = + prevSeparator.isEmpty() || !iterator.hasNext() ? seg.separator() : prevSeparator; result.append(separator); prevSeparator = seg.complexSeparator().isEmpty() ? seg.separator() : seg.complexSeparator(); } diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java index dc90b65ba..5c6a83858 100644 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java @@ -114,6 +114,7 @@ public void pathWildcards_matchZeroOrMoreSegments() { PathTemplate start = PathTemplate.create("{glob=**}/b"); PathTemplate middle = PathTemplate.create("a/{glob=**}/b"); PathTemplate end = PathTemplate.create("a/{glob=**}"); + PathTemplate endWithCustomVerb = PathTemplate.create("a/{glob=**}:foo"); Truth.assertThat(start.match("b").get("glob")).isEmpty(); Truth.assertThat(start.match("/b").get("glob")).isEmpty(); @@ -129,6 +130,10 @@ public void pathWildcards_matchZeroOrMoreSegments() { Truth.assertThat(end.match("a/").get("glob")).isEmpty(); Truth.assertThat(end.match("a/b").get("glob")).isEqualTo("b"); Truth.assertThat(end.match("a/b/b/b").get("glob")).isEqualTo("b/b/b"); + + Truth.assertThat(endWithCustomVerb.match("a/:foo").get("glob")).isEmpty(); + Truth.assertThat(endWithCustomVerb.match("a/b:foo").get("glob")).isEqualTo("b"); + Truth.assertThat(endWithCustomVerb.match("a/b/b:foo").get("glob")).isEqualTo("b/b"); } @Test @@ -173,6 +178,12 @@ public void matchWithUnboundInMiddle() { assertPositionalMatch(template.match("bar/foo/foo/foo/bar"), "foo/foo", "bar"); } + @Test + public void matchWithCustomVerbs() { + PathTemplate template = PathTemplate.create("**:foo"); + assertPositionalMatch(template.match("a/b/c:foo"), "a/b/c"); + } + // Complex Resource ID Segments. // ======== @@ -215,6 +226,45 @@ public void complexResourceIdBasicCases() { Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); } + @Test + public void complexResourceIdCustomVerb() { + // Separate by "~". + PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}:hello"); + Map match = + template.match( + "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c~us-east3-a:hello"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a}~{zone_b")).isNull(); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + + // Separate by "-". + template = PathTemplate.create("projects/{project}/zones/{zone_a}-{zone_b}:hello"); + match = template.match("projects/project-123/zones/europe-west3-c~us-east3-a:hello"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe"); + Truth.assertThat(match.get("zone_b")).isEqualTo("west3-c~us-east3-a"); + + // Separate by ".". + template = PathTemplate.create("projects/{project}/zones/{zone_a}.{zone_b}:hello"); + match = template.match("projects/project-123/zones/europe-west3-c.us-east3-a:hello"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + + // Separate by "_". + template = PathTemplate.create("projects/{project}/zones/{zone_a}_{zone_b}:hello"); + match = template.match("projects/project-123/zones/europe-west3-c_us-east3-a:hello"); + Truth.assertThat(match).isNotNull(); + Truth.assertThat(match.get("project")).isEqualTo("project-123"); + Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); + Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); + } + @Test public void complexResourceIdEqualsWildcard() { PathTemplate template = PathTemplate.create("projects/{project=*}/zones/{zone_a=*}~{zone_b=*}"); @@ -604,6 +654,18 @@ public void instantiateWithComplexResourceId_basic() { Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc/zones/apple~baseball"); } + @Test + public void instantiateWithComplexResourceId_customVerb() { + PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}:hello"); + String instance = + template.instantiate("project", "a/b/c", "zone_a", "apple", "zone_b", "baseball"); + Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc/zones/apple~baseball:hello"); + + template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}/stuff:hello"); + instance = template.instantiate("project", "a/b/c", "zone_a", "apple", "zone_b", "baseball"); + Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc/zones/apple~baseball/stuff:hello"); + } + @Test public void instantiateWithComplexResourceId_mixedSeparators() { PathTemplate template = @@ -647,6 +709,14 @@ public void instantiateWithComplexResourceId_mixedSeparatorsInParent() { Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc~foo.bar/zones/apple~baseball"); } + @Test + public void instantiateWithCustomVerbs() { + PathTemplate template = PathTemplate.create("/v1/{name=operations/**}:cancel"); + String templateInstance = template.instantiate("name", "operations/3373707"); + Truth.assertThat(templateInstance).isEqualTo("v1/operations/3373707:cancel"); + Truth.assertThat(template.matches(templateInstance)); + } + // Other // ===== From e93a10a40b4c9c5b9e8a20eea629563c93747555 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 27 Jul 2021 08:31:58 -0700 Subject: [PATCH 077/201] chore: release 1.10.5 (#240) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c595aa5d..22fff48fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +### [1.10.5](https://www.github.com/googleapis/api-common-java/compare/v1.10.4...v1.10.5) (2021-07-20) + + +### Bug Fixes + +* Fix PathTemplate custom verb logic matching and instantiating ([#244](https://www.github.com/googleapis/api-common-java/issues/244)) ([d4913d3](https://www.github.com/googleapis/api-common-java/commit/d4913d33ff2153cb3a8f6382ab8d918980f542ea)) + + +### Dependencies + +* update dependency io.codearte.gradle.nexus:gradle-nexus-staging-plugin to v0.30.0 ([#239](https://www.github.com/googleapis/api-common-java/issues/239)) ([2ca4359](https://www.github.com/googleapis/api-common-java/commit/2ca4359127cc2f8eddb81e8091362a75e1e6e38e)) + ### [1.10.4](https://www.github.com/googleapis/api-common-java/compare/v1.10.3...v1.10.4) (2021-05-19) diff --git a/build.gradle b/build.gradle index b26b72af4..f32e4773d 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.5-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "1.10.5" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index 4c9b647dc..dad6ae029 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.4:1.10.5-SNAPSHOT \ No newline at end of file +api-common:1.10.5:1.10.5 \ No newline at end of file From 01b66161786816b9861fab2df5c3477ac383c963 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 27 Jul 2021 16:08:24 +0000 Subject: [PATCH 078/201] chore: release 1.10.6-SNAPSHOT (#246) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index f32e4773d..f244a9aa2 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.5" // {x-version-update:api-common:current} +project.version = "1.10.6-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index dad6ae029..802049e1a 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.5:1.10.5 \ No newline at end of file +api-common:1.10.5:1.10.6-SNAPSHOT \ No newline at end of file From 88896894b821771293cda2d4b7a2f6027ee20ef4 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 27 Jul 2021 18:19:35 +0200 Subject: [PATCH 079/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.8.0 (#245) Co-authored-by: Elliotte Rusty Harold Co-authored-by: Neenu Shaji --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f244a9aa2..12a8cdd83 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.1', guava: 'com.google.guava:guava:30.1.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.7.1', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.8.0', // Testing junit: 'junit:junit:4.13.2', From c3ab73eca99f3036a26fe10a880c1ff068efc0da Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Tue, 27 Jul 2021 12:30:00 -0400 Subject: [PATCH 080/201] build: migrate to google sonatype endpoint (#248) Release-As: 1.10.5 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 12a8cdd83..c0b29d252 100644 --- a/build.gradle +++ b/build.gradle @@ -274,7 +274,7 @@ afterEvaluate { } repositories { maven { - url 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + url 'https://google.oss.sonatype.org/service/local/staging/deploy/maven2/' credentials { username = project.hasProperty('ossrhUsername') ? project.getProperty('ossrhUsername') : null password = project.hasProperty('ossrhPassword') ? project.getProperty('ossrhPassword') : null From 53d6d38ac0a7d6dc5738823d69ac96d1eadd23a3 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 27 Jul 2021 18:31:55 +0200 Subject: [PATCH 081/201] deps: update dependency com.google.auto.value:auto-value-annotations to v1.8.2 (#243) Co-authored-by: Elliotte Rusty Harold Co-authored-by: Neenu Shaji Co-authored-by: gcf-merge-on-green[bot] <60162190+gcf-merge-on-green[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c0b29d252..4f311513f 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ ext { libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value: 'com.google.auto.value:auto-value:1.8.1', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.1', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.2', guava: 'com.google.guava:guava:30.1.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.8.0', From 5de2f3edfcaed42061ad7dbc4efc886587c0e769 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 27 Jul 2021 18:34:41 +0200 Subject: [PATCH 082/201] deps: update dependency com.google.auto.value:auto-value to v1.8.2 (#242) Co-authored-by: Elliotte Rusty Harold Co-authored-by: Neenu Shaji Co-authored-by: gcf-merge-on-green[bot] <60162190+gcf-merge-on-green[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4f311513f..b6d568436 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', - auto_value: 'com.google.auto.value:auto-value:1.8.1', + auto_value: 'com.google.auto.value:auto-value:1.8.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.2', guava: 'com.google.guava:guava:30.1.1-android', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', From 2c3b0fc12d31657cf53e23c45c2ef0ab709c84e2 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 27 Jul 2021 16:38:09 +0000 Subject: [PATCH 083/201] chore: release 1.10.6 (#247) :robot: I have created a release \*beep\* \*boop\* --- ### [1.10.5](https://www.github.com/googleapis/api-common-java/compare/v1.10.5...v1.10.5) (2021-07-27) ### Bug Fixes * Fix PathTemplate custom verb logic matching and instantiating ([#244](https://www.github.com/googleapis/api-common-java/issues/244)) ([d4913d3](https://www.github.com/googleapis/api-common-java/commit/d4913d33ff2153cb3a8f6382ab8d918980f542ea)) ### Build System * migrate to google sonatype endpoint ([#248](https://www.github.com/googleapis/api-common-java/issues/248)) ([c3ab73e](https://www.github.com/googleapis/api-common-java/commit/c3ab73eca99f3036a26fe10a880c1ff068efc0da)) ### Dependencies * update dependency com.google.auto.value:auto-value to v1.8.2 ([#242](https://www.github.com/googleapis/api-common-java/issues/242)) ([5de2f3e](https://www.github.com/googleapis/api-common-java/commit/5de2f3edfcaed42061ad7dbc4efc886587c0e769)) * update dependency com.google.auto.value:auto-value-annotations to v1.8.2 ([#243](https://www.github.com/googleapis/api-common-java/issues/243)) ([53d6d38](https://www.github.com/googleapis/api-common-java/commit/53d6d38ac0a7d6dc5738823d69ac96d1eadd23a3)) * update dependency com.google.errorprone:error_prone_annotations to v2.8.0 ([#245](https://www.github.com/googleapis/api-common-java/issues/245)) ([8889689](https://www.github.com/googleapis/api-common-java/commit/88896894b821771293cda2d4b7a2f6027ee20ef4)) * update dependency io.codearte.gradle.nexus:gradle-nexus-staging-plugin to v0.30.0 ([#239](https://www.github.com/googleapis/api-common-java/issues/239)) ([2ca4359](https://www.github.com/googleapis/api-common-java/commit/2ca4359127cc2f8eddb81e8091362a75e1e6e38e)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 14 ++++++++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22fff48fd..d99737a0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +### [1.10.5](https://www.github.com/googleapis/api-common-java/compare/v1.10.5...v1.10.5) (2021-07-27) + + +### Build System + +* migrate to google sonatype endpoint ([#248](https://www.github.com/googleapis/api-common-java/issues/248)) ([c3ab73e](https://www.github.com/googleapis/api-common-java/commit/c3ab73eca99f3036a26fe10a880c1ff068efc0da)) + + +### Dependencies + +* update dependency com.google.auto.value:auto-value to v1.8.2 ([#242](https://www.github.com/googleapis/api-common-java/issues/242)) ([5de2f3e](https://www.github.com/googleapis/api-common-java/commit/5de2f3edfcaed42061ad7dbc4efc886587c0e769)) +* update dependency com.google.auto.value:auto-value-annotations to v1.8.2 ([#243](https://www.github.com/googleapis/api-common-java/issues/243)) ([53d6d38](https://www.github.com/googleapis/api-common-java/commit/53d6d38ac0a7d6dc5738823d69ac96d1eadd23a3)) +* update dependency com.google.errorprone:error_prone_annotations to v2.8.0 ([#245](https://www.github.com/googleapis/api-common-java/issues/245)) ([8889689](https://www.github.com/googleapis/api-common-java/commit/88896894b821771293cda2d4b7a2f6027ee20ef4)) + ### [1.10.5](https://www.github.com/googleapis/api-common-java/compare/v1.10.4...v1.10.5) (2021-07-20) diff --git a/build.gradle b/build.gradle index b6d568436..789d4a029 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.6-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "1.10.6" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index 802049e1a..6ffd0258a 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.5:1.10.6-SNAPSHOT \ No newline at end of file +api-common:1.10.6:1.10.6 \ No newline at end of file From b74dc16443eec83ee5b5bcdbe1c7bd08c42ec9fc Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 27 Jul 2021 13:08:21 -0400 Subject: [PATCH 084/201] chore: release 1.10.7-SNAPSHOT (#249) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 789d4a029..71d2cb611 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.6" // {x-version-update:api-common:current} +project.version = "1.10.7-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.7 targetCompatibility = 1.7 diff --git a/versions.txt b/versions.txt index 6ffd0258a..8e5602d2c 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.6:1.10.6 \ No newline at end of file +api-common:1.10.6:1.10.7-SNAPSHOT \ No newline at end of file From 7fe322cef65bdcc9549ddc9efa1ff95df36cc531 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Wed, 28 Jul 2021 17:48:42 -0400 Subject: [PATCH 085/201] feat!: update api-common-java min java version to java8 (#251) deps: update guava version to 30.1.1-jre --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 71d2cb611..8b74e3deb 100644 --- a/build.gradle +++ b/build.gradle @@ -29,8 +29,8 @@ archivesBaseName = "api-common" project.version = "1.10.7-SNAPSHOT" // {x-version-update:api-common:current} -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 jacoco { toolVersion = "0.8.7" @@ -45,7 +45,7 @@ ext { javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value: 'com.google.auto.value:auto-value:1.8.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.2', - guava: 'com.google.guava:guava:30.1.1-android', + guava: 'com.google.guava:guava:30.1.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.8.0', From 8b3a2e4f24831ad9cf09cab5c8448918b6f01965 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Wed, 28 Jul 2021 20:24:25 -0400 Subject: [PATCH 086/201] build: configure branch java7 as a release branch (#254) --- .github/release-please.yml | 4 ++++ .github/sync-repo-settings.yaml | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/.github/release-please.yml b/.github/release-please.yml index 72ef01bed..f35b7ebdb 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -6,3 +6,7 @@ branches: bumpMinorPreMajor: true branch: 1.10.1-sp handleGHRelease: true + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-yoshi + branch: java7 diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 7c26125bd..c4edd6e37 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -20,6 +20,15 @@ branchProtectionRules: requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true requiresStrictStatusChecks: true + - pattern: java7 + isAdminEnforced: true + requiredStatusCheckContexts: + - units + - format + - cla/google + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: true permissionRules: - team: Googlers permission: pull From a856b97774101d3feb4a84ace64824899d8fee98 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 29 Jul 2021 01:28:29 +0000 Subject: [PATCH 087/201] chore: release 2.0.0 (#252) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release \*beep\* \*boop\* --- ## [2.0.0](https://www.github.com/googleapis/api-common-java/compare/v1.10.6...v2.0.0) (2021-07-29) ### ⚠ BREAKING CHANGES * update api-common-java min java version to java8 (#251) ### Features * update api-common-java min java version to java8 ([#251](https://www.github.com/googleapis/api-common-java/issues/251)) ([7fe322c](https://www.github.com/googleapis/api-common-java/commit/7fe322cef65bdcc9549ddc9efa1ff95df36cc531)) ### Dependencies * update guava version to 30.1.1-jre ([7fe322c](https://www.github.com/googleapis/api-common-java/commit/7fe322cef65bdcc9549ddc9efa1ff95df36cc531)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 16 ++++++++++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d99737a0b..d76f8547c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [2.0.0](https://www.github.com/googleapis/api-common-java/compare/v1.10.6...v2.0.0) (2021-07-29) + + +### ⚠ BREAKING CHANGES + +* update api-common-java min java version to java8 (#251) + +### Features + +* update api-common-java min java version to java8 ([#251](https://www.github.com/googleapis/api-common-java/issues/251)) ([7fe322c](https://www.github.com/googleapis/api-common-java/commit/7fe322cef65bdcc9549ddc9efa1ff95df36cc531)) + + +### Dependencies + +* update guava version to 30.1.1-jre ([7fe322c](https://www.github.com/googleapis/api-common-java/commit/7fe322cef65bdcc9549ddc9efa1ff95df36cc531)) + ### [1.10.5](https://www.github.com/googleapis/api-common-java/compare/v1.10.5...v1.10.5) (2021-07-27) diff --git a/build.gradle b/build.gradle index 8b74e3deb..46e37aa8b 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "1.10.7-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.0" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 8e5602d2c..8cca1209e 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:1.10.6:1.10.7-SNAPSHOT \ No newline at end of file +api-common:2.0.0:2.0.0 \ No newline at end of file From e8a2d31051233224beab31f7d7d59b0898f268de Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 10 Aug 2021 19:21:04 -0400 Subject: [PATCH 088/201] chore: release 2.0.1-SNAPSHOT (#260) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 46e37aa8b..f9e5bcf8e 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.0" // {x-version-update:api-common:current} +project.version = "2.0.1-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 8cca1209e..426e7e7b6 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.0:2.0.0 \ No newline at end of file +api-common:2.0.0:2.0.1-SNAPSHOT \ No newline at end of file From 187593451b90252daddb55555ab4d40e2fbd4d82 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 11 Aug 2021 01:22:33 +0200 Subject: [PATCH 089/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.8.1 (#261) Co-authored-by: Neenu Shaji --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f9e5bcf8e..5b8f8255f 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.2', guava: 'com.google.guava:guava:30.1.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.8.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.8.1', // Testing junit: 'junit:junit:4.13.2', From 83490edd8adc1fa0210de8db90266e5e4c965213 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 10 Aug 2021 23:34:36 +0000 Subject: [PATCH 090/201] chore: release 2.0.1 (#262) :robot: I have created a release \*beep\* \*boop\* --- ### [2.0.1](https://www.github.com/googleapis/api-common-java/compare/v2.0.0...v2.0.1) (2021-08-10) ### Dependencies * update dependency com.google.errorprone:error_prone_annotations to v2.8.1 ([#261](https://www.github.com/googleapis/api-common-java/issues/261)) ([1875934](https://www.github.com/googleapis/api-common-java/commit/187593451b90252daddb55555ab4d40e2fbd4d82)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d76f8547c..59e6c7c79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.0.1](https://www.github.com/googleapis/api-common-java/compare/v2.0.0...v2.0.1) (2021-08-10) + + +### Dependencies + +* update dependency com.google.errorprone:error_prone_annotations to v2.8.1 ([#261](https://www.github.com/googleapis/api-common-java/issues/261)) ([1875934](https://www.github.com/googleapis/api-common-java/commit/187593451b90252daddb55555ab4d40e2fbd4d82)) + ## [2.0.0](https://www.github.com/googleapis/api-common-java/compare/v1.10.6...v2.0.0) (2021-07-29) diff --git a/build.gradle b/build.gradle index 5b8f8255f..3feb5fbd0 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.1-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.1" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 426e7e7b6..062d928e6 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.0:2.0.1-SNAPSHOT \ No newline at end of file +api-common:2.0.1:2.0.1 \ No newline at end of file From d80985706a6fe4420f9f2436fce78eb82d6beaf9 Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Thu, 19 Aug 2021 12:54:56 -0700 Subject: [PATCH 091/201] chore: update doclet version (#265) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3feb5fbd0..0c754a9c2 100644 --- a/build.gradle +++ b/build.gradle @@ -346,7 +346,7 @@ task javadocCombinedV3(type: Javadoc) { options.addStringOption('encoding', 'UTF-8') options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") options.addStringOption("projectname", "api-common") - options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.0.jar")] + options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.1.1.jar")] } clean { From 9019ce98dcd722deea2ca3845d4396184dcc1599 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 20 Aug 2021 17:54:40 +0200 Subject: [PATCH 092/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.9.0 (#266) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0c754a9c2..a4df20543 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.2', guava: 'com.google.guava:guava:30.1.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.8.1', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.9.0', // Testing junit: 'junit:junit:4.13.2', From 87bb580d9c9f0bf26d754ca1d73cecc2db180e92 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 20 Aug 2021 08:58:02 -0700 Subject: [PATCH 093/201] chore: release 2.0.2-SNAPSHOT (#263) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Emily Ball --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index a4df20543..13530f5dd 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.1" // {x-version-update:api-common:current} +project.version = "2.0.2-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 062d928e6..73c2998a0 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.1:2.0.1 \ No newline at end of file +api-common:2.0.1:2.0.2-SNAPSHOT \ No newline at end of file From abebcc4a49d742856f544bf533047ef607861c32 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 14:43:28 -0700 Subject: [PATCH 094/201] chore: release 2.0.2 (#267) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59e6c7c79..1410f5842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.0.2](https://www.github.com/googleapis/api-common-java/compare/v2.0.1...v2.0.2) (2021-08-20) + + +### Dependencies + +* update dependency com.google.errorprone:error_prone_annotations to v2.9.0 ([#266](https://www.github.com/googleapis/api-common-java/issues/266)) ([9019ce9](https://www.github.com/googleapis/api-common-java/commit/9019ce98dcd722deea2ca3845d4396184dcc1599)) + ### [2.0.1](https://www.github.com/googleapis/api-common-java/compare/v2.0.0...v2.0.1) (2021-08-10) diff --git a/build.gradle b/build.gradle index 13530f5dd..96435a47c 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.2-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.2" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 73c2998a0..63022e088 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.1:2.0.2-SNAPSHOT \ No newline at end of file +api-common:2.0.2:2.0.2 \ No newline at end of file From 61c2de881df1aa0fb90ce491ac6cd976e6279475 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 22:26:34 +0000 Subject: [PATCH 095/201] chore: release 2.0.3-SNAPSHOT (#268) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 96435a47c..090b81b76 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.codearte.nexus-staging' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.2" // {x-version-update:api-common:current} +project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 63022e088..b88b63a3d 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.2:2.0.2 \ No newline at end of file +api-common:2.0.2:2.0.3-SNAPSHOT \ No newline at end of file From 7776834dd69d3f5556f852b8cb57e5fe6628ce5f Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Mon, 30 Aug 2021 14:48:14 -0400 Subject: [PATCH 096/201] deps: update gradle-nexus-publish-plugin (#269) * deps: update gradle-nexus-publish-plugin * chore: fix the units check * chore: pim Gradle version at 6.9.1 --- .github/workflows/ci.yaml | 2 +- build.gradle | 35 ++++--- gradle/wrapper/gradle-wrapper.jar | Bin 47603 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 115 +++++++++++++---------- gradlew.bat | 33 +++++-- 6 files changed, 113 insertions(+), 76 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 099bd8da8..dc3f823d0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,7 +22,7 @@ jobs: - name: Gradle Test run: ./gradlew test - name: Gradle Build - run: ./gradlew build install + run: ./gradlew build format: runs-on: ubuntu-latest steps: diff --git a/build.gradle b/build.gradle index 090b81b76..5dcbcdcce 100644 --- a/build.gradle +++ b/build.gradle @@ -10,19 +10,18 @@ buildscript { } dependencies { classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.9", - "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.30.0" + "io.github.gradle-nexus:publish-plugin:1.1.0" } } - apply plugin: 'java' -apply plugin: 'maven' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'jacoco' apply plugin: 'signing' apply plugin: 'maven-publish' apply plugin: 'com.github.sherter.google-java-format' -apply plugin: 'io.codearte.nexus-staging' +apply plugin: 'io.github.gradle-nexus.publish-plugin' + group = "com.google.api" archivesBaseName = "api-common" @@ -64,15 +63,15 @@ dependencies { annotationProcessor libraries.auto_value - compile libraries.guava, + implementation( libraries.guava, libraries.jsr305, libraries.javax_annotations, - libraries.auto_value_annotations + libraries.auto_value_annotations) compileOnly libraries.error_prone_annotations - testCompile libraries.junit, - libraries.truth + testImplementation(libraries.junit, + libraries.truth) } clean.doFirst { @@ -97,7 +96,9 @@ jar { // Source jar // ---------- - +project.gradle.taskGraph.whenReady { + println project.gradle.taskGraph.getAllTasks() +} task sourcesJar(type: Jar, dependsOn: classes) { classifier = 'sources' from sourceSets.main.allSource @@ -161,7 +162,7 @@ configurations { dependencies { codeGeneration libraries.auto_value, libraries.jsr305 - compile libraries.jsr305, libraries.auto_value_annotations + implementation(libraries.jsr305, libraries.auto_value_annotations) } compileJava.classpath += configurations.codeGeneration @@ -214,7 +215,7 @@ artifacts { } signing { - required { gradle.taskGraph.hasTask("uploadArchives") } + required { gradle.taskGraph.hasTask("publishToSonatype") } if (project.hasProperty('signing.gnupg.executable')) { useGpgCmd() } @@ -222,10 +223,14 @@ signing { } if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword')) { - nexusStaging { - username = ossrhUsername - password = ossrhPassword + nexusPublishing { packageGroup = "com.google.api" + repositories { + sonatype { //or custom repository name + username = ossrhUsername + password = ossrhPassword + } + } } } @@ -422,7 +427,7 @@ task stageRelease { exec { // We need to spawn a new gradle build process in order to upload appropriately // More details: http://stackoverflow.com/questions/31614735/gradle-uploadarchives-artificats-namespace-when-depending-on-a-plugin - commandLine './gradlew', 'uploadArchives' + commandLine './gradlew', 'publishToSonatype', 'closeAndReleaseSonatypeStagingRepository' } } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a34ba8bb8750fa1e1829eef8427429cd0eb13db4..490fda8577df6c95960ba7077c43220e5bb2c0d9 100644 GIT binary patch literal 58694 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 literal 47603 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 H!T|msHn_y) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f6fd8db47..5c3a792e2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Sep 20 10:02:51 PDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +# pinning this at 6.9.1 because gradle-7.0 and above do not support the necessary groovy imports. +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip diff --git a/gradlew b/gradlew index 91a7e269e..2fe81a7d9 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,20 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## ## @@ -6,20 +22,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +64,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,31 +75,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -90,7 +105,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -110,10 +125,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` @@ -138,27 +154,30 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec99730b..9109989e3 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -8,14 +24,17 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +65,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +78,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From 623e368cb743c45c883707e221879217b2273403 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 30 Aug 2021 18:50:32 +0000 Subject: [PATCH 097/201] chore: release 2.0.3 (#270) :robot: I have created a release \*beep\* \*boop\* --- ### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.2...v2.0.3) (2021-08-30) ### Dependencies * update gradle-nexus-publish-plugin ([#269](https://www.github.com/googleapis/api-common-java/issues/269)) ([7776834](https://www.github.com/googleapis/api-common-java/commit/7776834dd69d3f5556f852b8cb57e5fe6628ce5f)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1410f5842..dc61eb673 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.2...v2.0.3) (2021-08-30) + + +### Dependencies + +* update gradle-nexus-publish-plugin ([#269](https://www.github.com/googleapis/api-common-java/issues/269)) ([7776834](https://www.github.com/googleapis/api-common-java/commit/7776834dd69d3f5556f852b8cb57e5fe6628ce5f)) + ### [2.0.2](https://www.github.com/googleapis/api-common-java/compare/v2.0.1...v2.0.2) (2021-08-20) diff --git a/build.gradle b/build.gradle index 5dcbcdcce..1dc428943 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.3" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index b88b63a3d..7c91c9cc3 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.2:2.0.3-SNAPSHOT \ No newline at end of file +api-common:2.0.3:2.0.3 \ No newline at end of file From aa7275f197fa9351c648d9594e9ae8143df41b17 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 8 Sep 2021 15:08:42 -0700 Subject: [PATCH 098/201] chore: remove readme autosynth config (#274) --- .github/readme/synth.py | 19 ------------ .kokoro/continuous/readme.cfg | 55 ----------------------------------- 2 files changed, 74 deletions(-) delete mode 100644 .github/readme/synth.py delete mode 100644 .kokoro/continuous/readme.cfg diff --git a/.github/readme/synth.py b/.github/readme/synth.py deleted file mode 100644 index 7b48cc28d..000000000 --- a/.github/readme/synth.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""This script is used to synthesize generated the README for this library.""" - -from synthtool.languages import java - -java.custom_templates(["java_library/README.md"]) diff --git a/.kokoro/continuous/readme.cfg b/.kokoro/continuous/readme.cfg deleted file mode 100644 index 637d4c083..000000000 --- a/.kokoro/continuous/readme.cfg +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/python-multi" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/readme.sh" -} - -# Build logs will be here -action { - define_artifacts { - regex: "**/*sponge_log.xml" - regex: "**/*sponge_log.log" - } -} - -# The github token is stored here. -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "yoshi-automation-github-key" - # TODO(theacodes): remove this after secrets have globally propagated - backend_type: FASTCONFIGPUSH - } - } -} - -# Common env vars for all repositories and builds. -env_vars: { - key: "GITHUB_USER" - value: "yoshi-automation" -} -env_vars: { - key: "GITHUB_EMAIL" - value: "yoshi-automation@google.com" -} From 1ffdbf4e0ae57d97208a568fb205607d0b7528da Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Thu, 16 Sep 2021 11:20:01 -0700 Subject: [PATCH 099/201] chore: update java docfx doclet version (#275) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1dc428943..e4ae69054 100644 --- a/build.gradle +++ b/build.gradle @@ -351,7 +351,7 @@ task javadocCombinedV3(type: Javadoc) { options.addStringOption('encoding', 'UTF-8') options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") options.addStringOption("projectname", "api-common") - options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.1.1.jar")] + options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.2.0.jar")] } clean { From c2457e84ae7c3b5da1498c4394049f39d9fb95c3 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 27 Sep 2021 23:11:32 +0200 Subject: [PATCH 100/201] deps: update dependency com.google.guava:guava to v31 (#277) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e4ae69054..2b15d59ab 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ ext { javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value: 'com.google.auto.value:auto-value:1.8.2', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.2', - guava: 'com.google.guava:guava:30.1.1-jre', + guava: 'com.google.guava:guava:31.0.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.9.0', From d4b8ceb999b9374c23b1c673f7b21735e44a0010 Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Mon, 27 Sep 2021 14:14:17 -0700 Subject: [PATCH 101/201] chore: update java-docfx-doclet version (#276) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2b15d59ab..237f64b1b 100644 --- a/build.gradle +++ b/build.gradle @@ -351,7 +351,7 @@ task javadocCombinedV3(type: Javadoc) { options.addStringOption('encoding', 'UTF-8') options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") options.addStringOption("projectname", "api-common") - options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.2.0.jar")] + options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.2.1.jar")] } clean { From 2898942d514193d905b7d9c884131f83886ec2a6 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:16:29 +0000 Subject: [PATCH 102/201] chore: release 2.0.4-SNAPSHOT (#271) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 237f64b1b..249f2165c 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3" // {x-version-update:api-common:current} +project.version = "2.0.4-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 7c91c9cc3..f97c070e2 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.3:2.0.3 \ No newline at end of file +api-common:2.0.3:2.0.4-SNAPSHOT \ No newline at end of file From 84eb82b172ab45b730ceff633e8e6d4b4e4721fd Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 27 Sep 2021 15:04:13 -0700 Subject: [PATCH 103/201] chore: release 2.0.4 (#278) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc61eb673..8ad9adac3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-09-27) + + +### Dependencies + +* update dependency com.google.guava:guava to v31 ([#277](https://www.github.com/googleapis/api-common-java/issues/277)) ([c2457e8](https://www.github.com/googleapis/api-common-java/commit/c2457e84ae7c3b5da1498c4394049f39d9fb95c3)) + ### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.2...v2.0.3) (2021-08-30) diff --git a/build.gradle b/build.gradle index 249f2165c..aaeab84cc 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.4-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.4" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index f97c070e2..5271e403c 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.3:2.0.4-SNAPSHOT \ No newline at end of file +api-common:2.0.4:2.0.4 \ No newline at end of file From 25dc7ad63a9de56280e9abcd466e0b33be47c913 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Tue, 28 Sep 2021 14:14:09 -0400 Subject: [PATCH 104/201] chore: change branch master to main in sync-repo-settings.yaml (#282) --- .github/sync-repo-settings.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index c4edd6e37..e6f6bb9c8 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -2,7 +2,7 @@ rebaseMergeAllowed: true squashMergeAllowed: true mergeCommitAllowed: false branchProtectionRules: - - pattern: master + - pattern: main isAdminEnforced: true requiredStatusCheckContexts: - units From d8364d0f5ee4cba9dea4dad1389ae1964b0c14a8 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Wed, 29 Sep 2021 10:30:20 -0400 Subject: [PATCH 105/201] chore: change branch master to main in github configurations (#283) --- .github/blunderbuss.yml | 2 +- .github/workflows/ci.yaml | 2 +- README.md | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/blunderbuss.yml b/.github/blunderbuss.yml index 1a23ea42b..2176b0543 100644 --- a/.github/blunderbuss.yml +++ b/.github/blunderbuss.yml @@ -1,5 +1,5 @@ # Configuration for the Blunderbuss GitHub app. For more info see -# https://github.com/googleapis/repo-automation-bots/tree/master/packages/blunderbuss +# https://github.com/googleapis/repo-automation-bots/tree/main/packages/blunderbuss assign_prs_by: - labels: - samples diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index dc3f823d0..ed0d06bdd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,7 +1,7 @@ on: push: branches: - - master + - main pull_request: name: ci jobs: diff --git a/README.md b/README.md index f139ae63d..b76bc7840 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ API Common for Java ============================== -[![Build Status](https://travis-ci.org/googleapis/api-common-java.svg?branch=master)](https://travis-ci.org/googleapis/api-common-java) +[![Build Status](https://travis-ci.org/googleapis/api-common-java.svg?branch=main)](https://travis-ci.org/googleapis/api-common-java) - [Documentation](https://googleapis.dev/java/api-common/latest/index.html) @@ -67,6 +67,6 @@ After making changes, run the following commands to format your code and test yo ./gradlew test ``` -[CONTRIBUTING]:https://github.com/googleapis/api-common-java/blob/master/CONTRIBUTING.md -[LICENSE]: https://github.com/googleapis/api-common-java/blob/master/LICENSE +[CONTRIBUTING]:https://github.com/googleapis/api-common-java/blob/main/CONTRIBUTING.md +[LICENSE]: https://github.com/googleapis/api-common-java/blob/main/LICENSE From 6ca0ab8286b862e7c5767cedf18007f7ea542126 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 1 Oct 2021 10:05:50 -0400 Subject: [PATCH 106/201] chore: release 2.0.3-SNAPSHOT (#281) * chore: release 2.0.5-SNAPSHOT * chore: fix version Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Neenu1995 Co-authored-by: Neenu Shaji --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index aaeab84cc..aefba4251 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.4" // {x-version-update:api-common:current} +project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 5271e403c..e33eb1b27 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.4:2.0.4 \ No newline at end of file +api-common:2.0.4:2.0.3-SNAPSHOT \ No newline at end of file From d489502e6020e7ac6af56bed3c2c9f299cf7fe07 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Mon, 4 Oct 2021 14:39:54 -0400 Subject: [PATCH 107/201] feat: use gadle-publish plugin (#284) --- build.gradle | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index aefba4251..e16ec23f0 100644 --- a/build.gradle +++ b/build.gradle @@ -100,7 +100,7 @@ project.gradle.taskGraph.whenReady { println project.gradle.taskGraph.getAllTasks() } task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' + archiveClassifier = 'sources' from sourceSets.main.allSource } @@ -108,7 +108,7 @@ task sourcesJar(type: Jar, dependsOn: classes) { // ------- task javadocJar(type: Jar) { - classifier = 'javadoc' + archiveClassifier = 'javadoc' from javadoc } @@ -121,7 +121,7 @@ javadoc.options { // ------- task javadocJarV3(type: Jar) { - classifier = 'javadoc' + archiveClassifier = 'javadoc' from javadoc } @@ -215,7 +215,7 @@ artifacts { } signing { - required { gradle.taskGraph.hasTask("publishToSonatype") } + required { gradle.taskGraph.hasTask("uploadArchives") } if (project.hasProperty('signing.gnupg.executable')) { useGpgCmd() } @@ -237,7 +237,7 @@ if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword') afterEvaluate { publishing { publications { - mavenJava(MavenPublication) { + release(MavenPublication) { version = project.version from components.java @@ -293,7 +293,7 @@ afterEvaluate { if (project.hasProperty('signing.gnupg.executable')) { useGpgCmd() } - sign publishing.publications.mavenJava + sign publishing.publications } } } @@ -402,7 +402,7 @@ task createApiDocsRedirect { } task publishDocs { - dependsOn 'closeAndReleaseRepository' + dependsOn 'publishToSonatype' doLast { exec { workingDir './tmp_gh-pages' @@ -425,9 +425,7 @@ task stageRelease { dependsOn 'createApiDocsRedirect' doLast { exec { - // We need to spawn a new gradle build process in order to upload appropriately - // More details: http://stackoverflow.com/questions/31614735/gradle-uploadarchives-artificats-namespace-when-depending-on-a-plugin - commandLine './gradlew', 'publishToSonatype', 'closeAndReleaseSonatypeStagingRepository' + commandLine './gradlew', 'uploadArchives' } } } From 19cf7b76d97f62b1e31e4f7c85d8e2f133cf09ad Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 4 Oct 2021 18:42:34 +0000 Subject: [PATCH 108/201] chore: release 2.1.0 (#285) :robot: I have created a release \*beep\* \*boop\* --- ## [2.1.0](https://www.github.com/googleapis/api-common-java/compare/v2.0.4...v2.1.0) (2021-10-04) ### Features * use gadle-publish plugin ([#284](https://www.github.com/googleapis/api-common-java/issues/284)) ([d489502](https://www.github.com/googleapis/api-common-java/commit/d489502e6020e7ac6af56bed3c2c9f299cf7fe07)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ad9adac3..2519912ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.1.0](https://www.github.com/googleapis/api-common-java/compare/v2.0.4...v2.1.0) (2021-10-04) + + +### Features + +* use gadle-publish plugin ([#284](https://www.github.com/googleapis/api-common-java/issues/284)) ([d489502](https://www.github.com/googleapis/api-common-java/commit/d489502e6020e7ac6af56bed3c2c9f299cf7fe07)) + ### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-09-27) diff --git a/build.gradle b/build.gradle index e16ec23f0..6d6ee9ae9 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.1.0" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index e33eb1b27..3f179d09a 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.4:2.0.3-SNAPSHOT \ No newline at end of file +api-common:2.1.0:2.1.0 \ No newline at end of file From 6d262e81a7d70ce55da5c991bb1ef9cdf8440423 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 4 Oct 2021 19:22:10 +0000 Subject: [PATCH 109/201] chore: release 2.1.1-SNAPSHOT (#286) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 6d6ee9ae9..e16ec23f0 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.0" // {x-version-update:api-common:current} +project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 3f179d09a..e8aa40f43 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.0:2.1.0 \ No newline at end of file +api-common:2.1.0:2.0.3-SNAPSHOT \ No newline at end of file From 39be94af0331318004fab25b071edcd1d96b9753 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Tue, 5 Oct 2021 13:24:51 -0400 Subject: [PATCH 110/201] deps: fix publishing script (#287) --- .kokoro/release/stage.sh | 4 ++-- build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.kokoro/release/stage.sh b/.kokoro/release/stage.sh index c7ba60c16..5bb36b6f2 100755 --- a/.kokoro/release/stage.sh +++ b/.kokoro/release/stage.sh @@ -30,9 +30,9 @@ setup_environment_secrets mkdir -p ${HOME}/.gradle create_gradle_properties_file "${HOME}/.gradle/gradle.properties" -./gradlew assemble publish +./gradlew publishToSonatype if [[ -n "${AUTORELEASE_PR}" ]] then - ./gradlew closeAndReleaseRepository + ./gradlew publishReleasePublicationToSonatypeRepository fi diff --git a/build.gradle b/build.gradle index e16ec23f0..482a0a0ac 100644 --- a/build.gradle +++ b/build.gradle @@ -237,7 +237,7 @@ if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword') afterEvaluate { publishing { publications { - release(MavenPublication) { + mavenJava(MavenPublication) { version = project.version from components.java @@ -402,7 +402,7 @@ task createApiDocsRedirect { } task publishDocs { - dependsOn 'publishToSonatype' + dependsOn 'publishReleasePublicationToSonatypeRepository' doLast { exec { workingDir './tmp_gh-pages' From 01e18d16e4db44e52d8c73ee2c1664370d6ec328 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 5 Oct 2021 17:30:17 +0000 Subject: [PATCH 111/201] chore: release 2.0.3 (#289) :robot: I have created a release \*beep\* \*boop\* --- ### [2.1.1](https://www.github.com/googleapis/api-common-java/compare/v2.1.0...v2.1.1) (2021-10-05) ### Dependencies * fix publishing script ([#287](https://www.github.com/googleapis/api-common-java/issues/287)) ([39be94a](https://www.github.com/googleapis/api-common-java/commit/39be94af0331318004fab25b071edcd1d96b9753)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2519912ac..74f391558 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.1.1](https://www.github.com/googleapis/api-common-java/compare/v2.1.0...v2.1.1) (2021-10-05) + + +### Dependencies + +* fix publishing script ([#287](https://www.github.com/googleapis/api-common-java/issues/287)) ([39be94a](https://www.github.com/googleapis/api-common-java/commit/39be94af0331318004fab25b071edcd1d96b9753)) + ## [2.1.0](https://www.github.com/googleapis/api-common-java/compare/v2.0.4...v2.1.0) (2021-10-04) diff --git a/build.gradle b/build.gradle index 482a0a0ac..6a458fb8b 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.3" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index e8aa40f43..81b0069ab 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.0:2.0.3-SNAPSHOT \ No newline at end of file +api-common:2.1.1:2.0.3 \ No newline at end of file From 807671bd498f093344f9058c110add5048a063d5 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Tue, 5 Oct 2021 14:05:19 -0400 Subject: [PATCH 112/201] chore: enable release-trigger (#291) --- .github/release-trigger.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/release-trigger.yml diff --git a/.github/release-trigger.yml b/.github/release-trigger.yml new file mode 100644 index 000000000..7fe362257 --- /dev/null +++ b/.github/release-trigger.yml @@ -0,0 +1 @@ +enabled: true \ No newline at end of file From ed52f376575734eed1ce50a79a74e8355c38f87c Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 5 Oct 2021 14:20:19 -0400 Subject: [PATCH 113/201] chore: release 2.0.3-SNAPSHOT (#290) * chore: release 2.0.4-SNAPSHOT * chore: fix dependencies Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Neenu1995 Co-authored-by: Neenu Shaji --- CHANGELOG.md | 21 ++------------------- build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74f391558..bc4831b6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,26 +1,7 @@ # Changelog -### [2.1.1](https://www.github.com/googleapis/api-common-java/compare/v2.1.0...v2.1.1) (2021-10-05) - - -### Dependencies - -* fix publishing script ([#287](https://www.github.com/googleapis/api-common-java/issues/287)) ([39be94a](https://www.github.com/googleapis/api-common-java/commit/39be94af0331318004fab25b071edcd1d96b9753)) - -## [2.1.0](https://www.github.com/googleapis/api-common-java/compare/v2.0.4...v2.1.0) (2021-10-04) - - -### Features - -* use gadle-publish plugin ([#284](https://www.github.com/googleapis/api-common-java/issues/284)) ([d489502](https://www.github.com/googleapis/api-common-java/commit/d489502e6020e7ac6af56bed3c2c9f299cf7fe07)) - -### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-09-27) - - ### Dependencies -* update dependency com.google.guava:guava to v31 ([#277](https://www.github.com/googleapis/api-common-java/issues/277)) ([c2457e8](https://www.github.com/googleapis/api-common-java/commit/c2457e84ae7c3b5da1498c4394049f39d9fb95c3)) - ### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.2...v2.0.3) (2021-08-30) @@ -28,6 +9,8 @@ * update gradle-nexus-publish-plugin ([#269](https://www.github.com/googleapis/api-common-java/issues/269)) ([7776834](https://www.github.com/googleapis/api-common-java/commit/7776834dd69d3f5556f852b8cb57e5fe6628ce5f)) +* update dependency com.google.guava:guava to v31 ([#277](https://www.github.com/googleapis/api-common-java/issues/277)) ([c2457e8](https://www.github.com/googleapis/api-common-java/commit/c2457e84ae7c3b5da1498c4394049f39d9fb95c3)) + ### [2.0.2](https://www.github.com/googleapis/api-common-java/compare/v2.0.1...v2.0.2) (2021-08-20) diff --git a/build.gradle b/build.gradle index 6a458fb8b..482a0a0ac 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3" // {x-version-update:api-common:current} +project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 81b0069ab..b15370a11 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.1:2.0.3 \ No newline at end of file +api-common:2.1.1:2.0.3-SNAPSHOT \ No newline at end of file From c84d6bf8000447024d5fb2dc5c11bd4eea3139fc Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Tue, 5 Oct 2021 14:26:10 -0400 Subject: [PATCH 114/201] deps: use nexus publish plugin (#292) --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 482a0a0ac..e09cc079a 100644 --- a/build.gradle +++ b/build.gradle @@ -227,6 +227,8 @@ if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword') packageGroup = "com.google.api" repositories { sonatype { //or custom repository name + nexusUrl.set(uri("https://google.oss.sonatype.org/service/local/staging/deploy/maven2/")) + snapshotRepositoryUrl.set(uri("https://google.oss.sonatype.org/content/repositories/snapshots/")) username = ossrhUsername password = ossrhPassword } From 59e71de49259fc7de3636a81df01143625fff56c Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 5 Oct 2021 18:34:12 +0000 Subject: [PATCH 115/201] chore: release 2.0.3 (#293) :robot: I have created a release \*beep\* \*boop\* --- ### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-10-05) ### Dependencies * use nexus publish plugin ([#292](https://www.github.com/googleapis/api-common-java/issues/292)) ([c84d6bf](https://www.github.com/googleapis/api-common-java/commit/c84d6bf8000447024d5fb2dc5c11bd4eea3139fc)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 4 +--- build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc4831b6f..300906685 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,6 @@ # Changelog -### Dependencies - -### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.2...v2.0.3) (2021-08-30) +### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.2...v2.0.3) (2021-10-05) ### Dependencies diff --git a/build.gradle b/build.gradle index e09cc079a..1bb6443e2 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.3" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index b15370a11..7c91c9cc3 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.1:2.0.3-SNAPSHOT \ No newline at end of file +api-common:2.0.3:2.0.3 \ No newline at end of file From 16aacce8e815c3333bd13a7fd79718e48d9d0b3a Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 5 Oct 2021 14:51:00 -0400 Subject: [PATCH 116/201] chore: release 2.0.4-SNAPSHOT (#294) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 1bb6443e2..a529c960e 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3" // {x-version-update:api-common:current} +project.version = "2.0.4-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 7c91c9cc3..f97c070e2 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.3:2.0.3 \ No newline at end of file +api-common:2.0.3:2.0.4-SNAPSHOT \ No newline at end of file From 0a24236ef2e525053bb281b685935e2f0811432d Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Wed, 6 Oct 2021 10:41:13 -0400 Subject: [PATCH 117/201] chore: enable nexus-publish plugin (#296) * chore: release 2.0.4-SNAPSHOT * chore: fix dependencies * chore: enable nexus-publish plugin Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 9 --------- build.gradle | 6 +++--- versions.txt | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 300906685..1410f5842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,5 @@ # Changelog -### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.2...v2.0.3) (2021-10-05) - - -### Dependencies - -* update gradle-nexus-publish-plugin ([#269](https://www.github.com/googleapis/api-common-java/issues/269)) ([7776834](https://www.github.com/googleapis/api-common-java/commit/7776834dd69d3f5556f852b8cb57e5fe6628ce5f)) - -* update dependency com.google.guava:guava to v31 ([#277](https://www.github.com/googleapis/api-common-java/issues/277)) ([c2457e8](https://www.github.com/googleapis/api-common-java/commit/c2457e84ae7c3b5da1498c4394049f39d9fb95c3)) - ### [2.0.2](https://www.github.com/googleapis/api-common-java/compare/v2.0.1...v2.0.2) (2021-08-20) diff --git a/build.gradle b/build.gradle index a529c960e..00b134645 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.4-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 @@ -227,8 +227,8 @@ if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword') packageGroup = "com.google.api" repositories { sonatype { //or custom repository name - nexusUrl.set(uri("https://google.oss.sonatype.org/service/local/staging/deploy/maven2/")) - snapshotRepositoryUrl.set(uri("https://google.oss.sonatype.org/content/repositories/snapshots/")) + nexusUrl.set(uri('https://google.oss.sonatype.org/service/local/')) + snapshotRepositoryUrl.set(uri('https://google.oss.sonatype.org/content/repositories/snapshots/')) username = ossrhUsername password = ossrhPassword } diff --git a/versions.txt b/versions.txt index f97c070e2..940ba9cdc 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.3:2.0.4-SNAPSHOT \ No newline at end of file +api-common:2.0.2:2.0.3-SNAPSHOT From ea19c90e95088bd4c633c213b092fc9df673a02f Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Wed, 6 Oct 2021 11:00:08 -0400 Subject: [PATCH 118/201] deps: use nexus-publish plugin (#297) From aa866b16c496270d4aa3cd36435deb0ed22a7c4b Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 6 Oct 2021 15:04:14 +0000 Subject: [PATCH 119/201] chore: release 2.0.3 (#298) :robot: I have created a release \*beep\* \*boop\* --- ### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-10-06) ### Dependencies * use nexus-publish plugin ([#297](https://www.github.com/googleapis/api-common-java/issues/297)) ([ea19c90](https://www.github.com/googleapis/api-common-java/commit/ea19c90e95088bd4c633c213b092fc9df673a02f)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1410f5842..74e77ef33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.3) (2021-10-06) + + +### Dependencies + +* use nexus-publish plugin ([#297](https://www.github.com/googleapis/api-common-java/issues/297)) ([ea19c90](https://www.github.com/googleapis/api-common-java/commit/ea19c90e95088bd4c633c213b092fc9df673a02f)) + ### [2.0.2](https://www.github.com/googleapis/api-common-java/compare/v2.0.1...v2.0.2) (2021-08-20) diff --git a/build.gradle b/build.gradle index 00b134645..d674253aa 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.3" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 940ba9cdc..02f3b4284 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.2:2.0.3-SNAPSHOT +api-common:2.0.3:2.0.3 From 0e60182e9985bf90279bbf30d55ae0c8a9b865c5 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 6 Oct 2021 11:18:12 -0400 Subject: [PATCH 120/201] chore: release 2.0.4-SNAPSHOT (#299) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d674253aa..83987078f 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.3" // {x-version-update:api-common:current} +project.version = "2.0.4-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 02f3b4284..f260a2a9c 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.3:2.0.3 +api-common:2.0.3:2.0.4-SNAPSHOT From e502ae63f7cea8293c3bf617a74bc74bd345edbc Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Wed, 6 Oct 2021 12:00:16 -0400 Subject: [PATCH 121/201] deps: use nexus-publish plugin (#300) --- .kokoro/release/stage.sh | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.kokoro/release/stage.sh b/.kokoro/release/stage.sh index 5bb36b6f2..59af80200 100755 --- a/.kokoro/release/stage.sh +++ b/.kokoro/release/stage.sh @@ -34,5 +34,5 @@ create_gradle_properties_file "${HOME}/.gradle/gradle.properties" if [[ -n "${AUTORELEASE_PR}" ]] then - ./gradlew publishReleasePublicationToSonatypeRepository + ./gradlew closeAndReleaseSonatypeStagingRepository fi diff --git a/build.gradle b/build.gradle index 83987078f..072abbb31 100644 --- a/build.gradle +++ b/build.gradle @@ -404,7 +404,7 @@ task createApiDocsRedirect { } task publishDocs { - dependsOn 'publishReleasePublicationToSonatypeRepository' + dependsOn 'closeAndReleaseSonatypeStagingRepository' doLast { exec { workingDir './tmp_gh-pages' From 9cffdd6a737e9ddce2459df1209c06c04dafd841 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 6 Oct 2021 16:06:15 +0000 Subject: [PATCH 122/201] chore: release 2.0.4 (#301) :robot: I have created a release \*beep\* \*boop\* --- ### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-10-06) ### Dependencies * use nexus-publish plugin ([#300](https://www.github.com/googleapis/api-common-java/issues/300)) ([e502ae6](https://www.github.com/googleapis/api-common-java/commit/e502ae63f7cea8293c3bf617a74bc74bd345edbc)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74e77ef33..65c5db077 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-10-06) + + +### Dependencies + +* use nexus-publish plugin ([#300](https://www.github.com/googleapis/api-common-java/issues/300)) ([e502ae6](https://www.github.com/googleapis/api-common-java/commit/e502ae63f7cea8293c3bf617a74bc74bd345edbc)) + ### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.3) (2021-10-06) diff --git a/build.gradle b/build.gradle index 072abbb31..50d68cbf2 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.4-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.4" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index f260a2a9c..973b180ee 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.3:2.0.4-SNAPSHOT +api-common:2.0.4:2.0.4 From 6289d6257eb25cd47ad4b2388aadbe256e9a2a10 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Wed, 6 Oct 2021 13:23:50 -0400 Subject: [PATCH 123/201] chore: add nexus-publish plugin (#303) --- .kokoro/release/stage.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.kokoro/release/stage.sh b/.kokoro/release/stage.sh index 59af80200..ab598b823 100755 --- a/.kokoro/release/stage.sh +++ b/.kokoro/release/stage.sh @@ -30,9 +30,4 @@ setup_environment_secrets mkdir -p ${HOME}/.gradle create_gradle_properties_file "${HOME}/.gradle/gradle.properties" -./gradlew publishToSonatype - -if [[ -n "${AUTORELEASE_PR}" ]] -then - ./gradlew closeAndReleaseSonatypeStagingRepository -fi +./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository From d9536e86829b6e9cf1bffbf371292cde0b45ef4c Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 6 Oct 2021 17:46:10 +0000 Subject: [PATCH 124/201] chore: release 2.0.5-SNAPSHOT (#302) :robot: I have created a release \*beep\* \*boop\* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 50d68cbf2..7e918eba5 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.4" // {x-version-update:api-common:current} +project.version = "2.0.5-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 973b180ee..595181e94 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.4:2.0.4 +api-common:2.0.4:2.0.5-SNAPSHOT From ea0b7773c799db16b2ae68ff600dcacaca52abf9 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Fri, 8 Oct 2021 16:28:22 -0400 Subject: [PATCH 125/201] deps: add maven plugin to enable install (#304) --- .github/workflows/ci.yaml | 2 +- build.gradle | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ed0d06bdd..f14a3e444 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,7 +22,7 @@ jobs: - name: Gradle Test run: ./gradlew test - name: Gradle Build - run: ./gradlew build + run: ./gradlew build install format: runs-on: ubuntu-latest steps: diff --git a/build.gradle b/build.gradle index 7e918eba5..b2a956ce3 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,7 @@ apply plugin: 'idea' apply plugin: 'jacoco' apply plugin: 'signing' apply plugin: 'maven-publish' +apply plugin: 'maven' apply plugin: 'com.github.sherter.google-java-format' apply plugin: 'io.github.gradle-nexus.publish-plugin' From 4a319adee0e0a884df800d9ba0294eb6f36d1106 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 8 Oct 2021 20:44:18 +0000 Subject: [PATCH 126/201] chore: release 2.0.5 (#305) :robot: I have created a release \*beep\* \*boop\* --- ### [2.0.5](https://www.github.com/googleapis/api-common-java/compare/v2.0.4...v2.0.5) (2021-10-08) ### Dependencies * add maven plugin to enable install ([#304](https://www.github.com/googleapis/api-common-java/issues/304)) ([ea0b777](https://www.github.com/googleapis/api-common-java/commit/ea0b7773c799db16b2ae68ff600dcacaca52abf9)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65c5db077..3240b5bbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.0.5](https://www.github.com/googleapis/api-common-java/compare/v2.0.4...v2.0.5) (2021-10-08) + + +### Dependencies + +* add maven plugin to enable install ([#304](https://www.github.com/googleapis/api-common-java/issues/304)) ([ea0b777](https://www.github.com/googleapis/api-common-java/commit/ea0b7773c799db16b2ae68ff600dcacaca52abf9)) + ### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-10-06) diff --git a/build.gradle b/build.gradle index b2a956ce3..3361a3dec 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.5-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.0.5" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 595181e94..fbd3c8618 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.4:2.0.5-SNAPSHOT +api-common:2.0.5:2.0.5 From 3965b13ea832cefe4aa58f4f2ecfd0423686c0f9 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Fri, 8 Oct 2021 14:48:05 -0700 Subject: [PATCH 127/201] feat: next release from main branch is 2.1.0 (#308) --- .github/release-please.yml | 4 ++++ .github/sync-repo-settings.yaml | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/.github/release-please.yml b/.github/release-please.yml index f35b7ebdb..701b57ed2 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -10,3 +10,7 @@ branches: handleGHRelease: true releaseType: java-yoshi branch: java7 + - releaseType: java-backport + bumpMinorPreMajor: true + handleGHRelease: true + branch: 2.0.x diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index e6f6bb9c8..bf50572e9 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -29,6 +29,15 @@ branchProtectionRules: requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true requiresStrictStatusChecks: true + - pattern: 2.0.x + isAdminEnforced: true + requiredStatusCheckContexts: + - units + - format + - cla/google + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: true permissionRules: - team: Googlers permission: pull From 36467871be15a2ebd63477a293d6d33c68a6c9b0 Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Thu, 14 Oct 2021 08:35:49 -0700 Subject: [PATCH 128/201] chore: update doclet version (#312) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3361a3dec..a197a0b88 100644 --- a/build.gradle +++ b/build.gradle @@ -354,7 +354,7 @@ task javadocCombinedV3(type: Javadoc) { options.addStringOption('encoding', 'UTF-8') options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") options.addStringOption("projectname", "api-common") - options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.2.1.jar")] + options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.3.0.jar")] } clean { From c82fe8aaaf8566381e7f7c5d4c8d362736c088fc Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 14 Oct 2021 15:36:43 -0400 Subject: [PATCH 129/201] chore: remove deprecated `maven` plugin (#313) * Update ci.yaml * Remove deprecated `maven` plugin --- .github/workflows/ci.yaml | 4 ++-- build.gradle | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f14a3e444..89788f258 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,7 +22,7 @@ jobs: - name: Gradle Test run: ./gradlew test - name: Gradle Build - run: ./gradlew build install + run: ./gradlew build publishToMavenLocal format: runs-on: ubuntu-latest steps: @@ -31,4 +31,4 @@ jobs: with: java-version: 8 - name: Java Linter - run: ./gradlew googleJavaFormat \ No newline at end of file + run: ./gradlew googleJavaFormat diff --git a/build.gradle b/build.gradle index a197a0b88..8cd039a43 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,6 @@ apply plugin: 'idea' apply plugin: 'jacoco' apply plugin: 'signing' apply plugin: 'maven-publish' -apply plugin: 'maven' apply plugin: 'com.github.sherter.google-java-format' apply plugin: 'io.github.gradle-nexus.publish-plugin' From 0b59836b359f651baa12f3c9c9fa01ec9b7bf4a9 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 15:12:48 -0400 Subject: [PATCH 130/201] chore: release 2.0.6-SNAPSHOT (#311) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Neenu Shaji --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 8cd039a43..53ef45239 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.5" // {x-version-update:api-common:current} +project.version = "2.0.6-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index fbd3c8618..dd4972cec 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.5:2.0.5 +api-common:2.0.5:2.0.6-SNAPSHOT From 222396beba176b4c6e2c288fbbfda2692e4e265a Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 25 Oct 2021 16:08:26 -0700 Subject: [PATCH 131/201] chore: release 2.1.0 (#314) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3240b5bbc..f53bb2ac8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.1.0](https://www.github.com/googleapis/api-common-java/compare/v2.0.5...v2.1.0) (2021-10-20) + + +### Features + +* next release from main branch is 2.1.0 ([#308](https://www.github.com/googleapis/api-common-java/issues/308)) ([3965b13](https://www.github.com/googleapis/api-common-java/commit/3965b13ea832cefe4aa58f4f2ecfd0423686c0f9)) + ### [2.0.5](https://www.github.com/googleapis/api-common-java/compare/v2.0.4...v2.0.5) (2021-10-08) diff --git a/build.gradle b/build.gradle index 53ef45239..04f955686 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.0.6-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.1.0" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index dd4972cec..a338d9794 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.0.5:2.0.6-SNAPSHOT +api-common:2.1.0:2.1.0 From 99df0919c7901948a90cc411fc212468a7754c01 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 5 Nov 2021 18:52:20 +0100 Subject: [PATCH 132/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.10.0 (#316) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.9.0` -> `2.10.0` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.10.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.10.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.10.0/compatibility-slim/2.9.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.10.0/confidence-slim/2.9.0)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.10.0`](https://togithub.com/google/error-prone/releases/v2.10.0) New checks - [`AlwaysThrows`](http://errorprone.info/bugpattern/AlwaysThrows) - [`StackTraceElementGetClass`](http://errorprone.info/bugpattern/StackTraceElementGetClass) - [`BareDotMetacharacter`](http://errorprone.info/bugpattern/BareDotMetacharacter) - [`DistinctVarargsChecker`](http://errorprone.info/bugpattern/DistinctVarargsChecker) - [`MalformedInlineTag`](http://errorprone.info/bugpattern/MalformedInlineTag) - [`MemoizeConstantVisitorStateLookups`](http://errorprone.info/bugpattern/MemoizeConstantVisitorStateLookups) - [`UnicodeEscape`](http://errorprone.info/bugpattern/UnicodeEscape) - [`FieldMissingNullable`](http://errorprone.info/bugpattern/FieldMissingNullable) - [`Java8ApiChecker`](http://errorprone.info/bugpattern/Java8ApiChecker) - [`ParameterMissingNullable`](http://errorprone.info/bugpattern/ParameterMissingNullable) - [`TooManyParameters`](http://errorprone.info/bugpattern/TooManyParameters) - [`TryWithResourcesVariable`](http://errorprone.info/bugpattern/TryWithResourcesVariable) - [`UnnecessaryFinal`](http://errorprone.info/bugpattern/UnnecessaryFinal) - [`VoidMissingNullable`](http://errorprone.info/bugpattern/VoidMissingNullable) Fixed issues: [#​2616](https://togithub.com/google/error-prone/issues/2616), [#​2629](https://togithub.com/google/error-prone/issues/2629) **Full Changelog**: https://github.com/google/error-prone/compare/v2.9.0...v2.10.0
--- ### Configuration 📅 **Schedule**: At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 04f955686..ed86091f9 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.2', guava: 'com.google.guava:guava:31.0.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.9.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.10.0', // Testing junit: 'junit:junit:4.13.2', From b33d6e11c91d35b56392264c514d942084b21b95 Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Tue, 9 Nov 2021 11:39:51 -0800 Subject: [PATCH 133/201] chore: include @code in javadoc (#318) fixes b/205642105 issue --- .../google/api/pathtemplate/PathTemplate.java | 36 +++++++++---------- .../pathtemplate/TemplatedResourceName.java | 4 +-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java index 098524210..4e4e770e6 100644 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ b/src/main/java/com/google/api/pathtemplate/PathTemplate.java @@ -69,7 +69,7 @@ *

* Here is an example for a template using simple variables: * - *

+ * 
{@code
  *   PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}");
  *   assert template.matches("v2/shelves") == false;
  *   Map<String, String> values = template.match("v1/shelves/s1/books/b1");
@@ -78,22 +78,22 @@
  *   expectedValues.put("book", "b1");
  *   assert values.equals(expectedValues);
  *   assert template.instantiate(values).equals("v1/shelves/s1/books/b1");
- * 
+ * }
* * Templates can use variables which match sub-paths. Example: * - *
+ * 
{@code
  *   PathTemplate template = PathTemplate.create("v1/{name=shelves/*/books/*}"};
  *   assert template.match("v1/shelves/books/b1") == null;
  *   Map<String, String> expectedValues = new HashMap<>();
  *   expectedValues.put("name", "shelves/s1/books/b1");
  *   assert template.match("v1/shelves/s1/books/b1").equals(expectedValues);
- * 
+ * }
* * Path templates can also be used with only wildcards. Each wildcard is associated with an implicit * variable {@code $n}, where n is the zero-based position of the wildcard. Example: * - *
+ * 
{@code
  *   PathTemplate template = PathTemplate.create("shelves/*/books/*"};
  *   assert template.match("shelves/books/b1") == null;
  *   Map<String, String> values = template.match("v1/shelves/s1/books/b1");
@@ -101,14 +101,14 @@
  *   expectedValues.put("$0", s1");
  *   expectedValues.put("$1", "b1");
  *   assert values.equals(expectedValues);
- * 
+ * }
* * Paths input to matching can use URL relative syntax to indicate a host name by prefixing the host * name, as in {@code //somewhere.io/some/path}. The host name is matched into the special variable * {@link #HOSTNAME_VAR}. Patterns are agnostic about host names, and the same pattern can be used * for URL relative syntax and simple path syntax: * - *
+ * 
{@code
  *   PathTemplate template = PathTemplate.create("shelves/*"};
  *   Map<String, String> expectedValues = new HashMap<>();
  *   expectedValues.put(PathTemplate.HOSTNAME_VAR, "//somewhere.io");
@@ -117,7 +117,7 @@
  *   expectedValues.clear();
  *   expectedValues.put("$0", s1");
  *   assert template.match("shelves/s1").equals(expectedValues);
- * 
+ * }
* * For the representation of a resource name see {@link TemplatedResourceName}, which is * based on path templates. @@ -347,10 +347,10 @@ public PathTemplate withoutVars() { /** * Returns a path template for the sub-path of the given variable. Example: * - *
+   * 
{@code
    *   PathTemplate template = PathTemplate.create("v1/{name=shelves/*/books/*}");
    *   assert template.subTemplate("name").toString().equals("shelves/*/books/*");
-   * 
+ * }
* * The returned template will never have named variables, but only wildcards, which are dealt with * in matching and instantiation using '$n'-variables. See the documentation of @@ -446,7 +446,7 @@ public void validate(String path, String exceptionMessagePrefix) { * For free wildcards in the template, the matching process creates variables named '$n', where * 'n' is the wildcard's position in the template (starting at n=0). For example: * - *
+   * 
{@code
    *   PathTemplate template = PathTemplate.create("shelves/*/books/*");
    *   Map<String, String> expectedValues = new HashMap<>();
    *   expectedValues.put("$0", "s1");
@@ -459,7 +459,7 @@ public void validate(String path, String exceptionMessagePrefix) {
    *   expectedValues.put("$1", "b1");
    *   assert template.validatedMatch("//somewhere.io/shelves/s1/books/b2", "User exception string")
    *              .equals(expectedValues);
-   * 
+ * }
* * All matched values will be properly unescaped using URL encoding rules (so long as URL encoding * has not been disabled by the {@link #createWithoutUrlEncoding} method). @@ -498,7 +498,7 @@ public boolean matches(String path) { * For free wildcards in the template, the matching process creates variables named '$n', where * 'n' is the wildcard's position in the template (starting at n=0). For example: * - *
+   * 
{@code
    *   PathTemplate template = PathTemplate.create("shelves/*/books/*");
    *   Map<String, String> expectedValues = new HashMap<>();
    *   expectedValues.put("$0", "s1");
@@ -509,7 +509,7 @@ public boolean matches(String path) {
    *   expectedValues.put("$0", "s1");
    *   expectedValues.put("$1", "b1");
    *   assert template.match("//somewhere.io/shelves/s1/books/b2").equals(expectedValues);
-   * 
+ * }
* * All matched values will be properly unescaped using URL encoding rules (so long as URL encoding * has not been disabled by the {@link #createWithoutUrlEncoding} method). @@ -523,13 +523,13 @@ public Map match(String path) { * Matches the path, where the first segment is interpreted as the host name regardless of whether * it starts with '//' or not. Example: * - *
+   * 
{@code
    *   Map<String, String> expectedValues = new HashMap<>();
    *   expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
    *   expectedValues.put("name", "shelves/s1");
    *   assert template("{name=shelves/*}").matchFromFullName("somewhere.io/shelves/s1")
    *            .equals(expectedValues);
-   * 
+ * }
*/ @Nullable public Map matchFromFullName(String path) { @@ -721,12 +721,12 @@ public String instantiate(String... keysAndValues) { * Same like {@link #instantiate(Map)} but allows for unbound variables, which are substituted * using their original syntax. Example: * - *
+   * 
{@code
    *   PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}");
    *   Map<String, String> partialMap = new HashMap<>();
    *   partialMap.put("shelf", "s1");
    *   assert template.instantiatePartial(partialMap).equals("v1/shelves/s1/books/{book}");
-   * 
+ * }
* * The result of this call can be used to create a new template. */ diff --git a/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java b/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java index bbbedeaeb..c5e9cd6e1 100644 --- a/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java +++ b/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java @@ -58,12 +58,12 @@ *

* Usage examples: * - *

+ * 
{@code
  *   PathTemplate template = PathTemplate.create("shelves/*/books/*");
  *   TemplatedResourceName resourceName = TemplatedResourceName.create(template, "shelves/s1/books/b1");
  *   assert resourceName.get("$1").equals("b1");
  *   assert resourceName.parentName().toString().equals("shelves/s1/books");
- * 
+ * }
*/ public class TemplatedResourceName implements Map { From 6d8eeb4d8396cdcbbc8a25f5702971f869827377 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 10 Nov 2021 11:12:14 -0500 Subject: [PATCH 134/201] chore: release 2.1.1-SNAPSHOT (#315) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Neenu Shaji --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index ed86091f9..d129e0a32 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.0" // {x-version-update:api-common:current} +project.version = "2.1.1-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index a338d9794..e3dac80f2 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.0:2.1.0 +api-common:2.1.0:2.1.1-SNAPSHOT From 1e0e382b5ab007a443a61137fd6dc01148dfe215 Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Wed, 10 Nov 2021 09:49:55 -0800 Subject: [PATCH 135/201] chore: fix doc generation (#317) --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index d129e0a32..5343c6e7d 100644 --- a/build.gradle +++ b/build.gradle @@ -354,6 +354,9 @@ task javadocCombinedV3(type: Javadoc) { options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") options.addStringOption("projectname", "api-common") options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.3.0.jar")] + // Newer Gradle 6 passes -notimestamp by default, which the doclet above doesn't understand: + // https://github.com/gradle/gradle/issues/11898 + options.noTimestamp false } clean { From 67cc5542896828e6b288b2969b42a305a11ee03d Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 15 Nov 2021 15:13:41 -0800 Subject: [PATCH 136/201] chore: release 2.1.1 (#319) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Emily Ball --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f53bb2ac8..410ecb87d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.1.1](https://www.github.com/googleapis/api-common-java/compare/v2.1.0...v2.1.1) (2021-11-10) + + +### Dependencies + +* update dependency com.google.errorprone:error_prone_annotations to v2.10.0 ([#316](https://www.github.com/googleapis/api-common-java/issues/316)) ([99df091](https://www.github.com/googleapis/api-common-java/commit/99df0919c7901948a90cc411fc212468a7754c01)) + ## [2.1.0](https://www.github.com/googleapis/api-common-java/compare/v2.0.5...v2.1.0) (2021-10-20) diff --git a/build.gradle b/build.gradle index 5343c6e7d..d25359a92 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.1-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.1.1" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index e3dac80f2..8c4d855cb 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.0:2.1.1-SNAPSHOT +api-common:2.1.1:2.1.1 From 55b6dbbb5dc445a94584e791f26f405a6e008b03 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 14:00:43 -0500 Subject: [PATCH 137/201] chore: release 2.1.2-SNAPSHOT (#320) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d25359a92..d3e50e6e9 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.1" // {x-version-update:api-common:current} +project.version = "2.1.2-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 8c4d855cb..50070265d 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.1:2.1.1 +api-common:2.1.1:2.1.2-SNAPSHOT From 43a86f2c02c735f422663d5cb32c6991589ad0d3 Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Tue, 7 Dec 2021 11:39:20 -0800 Subject: [PATCH 138/201] chore: update doclet version (#321) Same as https://github.com/googleapis/java-shared-config/pull/368 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d3e50e6e9..70296168a 100644 --- a/build.gradle +++ b/build.gradle @@ -353,7 +353,7 @@ task javadocCombinedV3(type: Javadoc) { options.addStringOption('encoding', 'UTF-8') options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") options.addStringOption("projectname", "api-common") - options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.3.0.jar")] + options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.4.0.jar")] // Newer Gradle 6 passes -notimestamp by default, which the doclet above doesn't understand: // https://github.com/gradle/gradle/issues/11898 options.noTimestamp false From 0c920a4c5e68cc7b0a05297bf01114d4a231c591 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 6 Jan 2022 19:47:35 +0100 Subject: [PATCH 139/201] deps: update dependency com.google.auto.value:auto-value-annotations to v1.9 (#324) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 70296168a..e99cbc272 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ ext { libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value: 'com.google.auto.value:auto-value:1.8.2', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.8.2', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.0.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.10.0', From d8d708468f134ad0b39bfd8bccf8d7e08a19e7e1 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 6 Jan 2022 19:49:21 +0100 Subject: [PATCH 140/201] deps: update dependency com.google.auto.value:auto-value to v1.9 (#323) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e99cbc272..71616bbe9 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', - auto_value: 'com.google.auto.value:auto-value:1.8.2', + auto_value: 'com.google.auto.value:auto-value:1.9', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.0.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', From 10048064bd7b592346c6fc1f5d755ec8a0c3af87 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 6 Jan 2022 18:52:14 +0000 Subject: [PATCH 141/201] chore: release 2.1.2 (#327) :robot: I have created a release \*beep\* \*boop\* --- ### [2.1.2](https://www.github.com/googleapis/api-common-java/compare/v2.1.1...v2.1.2) (2022-01-06) ### Dependencies * update dependency com.google.auto.value:auto-value to v1.9 ([#323](https://www.github.com/googleapis/api-common-java/issues/323)) ([d8d7084](https://www.github.com/googleapis/api-common-java/commit/d8d708468f134ad0b39bfd8bccf8d7e08a19e7e1)) * update dependency com.google.auto.value:auto-value-annotations to v1.9 ([#324](https://www.github.com/googleapis/api-common-java/issues/324)) ([0c920a4](https://www.github.com/googleapis/api-common-java/commit/0c920a4c5e68cc7b0a05297bf01114d4a231c591)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 8 ++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 410ecb87d..8bf2600ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +### [2.1.2](https://www.github.com/googleapis/api-common-java/compare/v2.1.1...v2.1.2) (2022-01-06) + + +### Dependencies + +* update dependency com.google.auto.value:auto-value to v1.9 ([#323](https://www.github.com/googleapis/api-common-java/issues/323)) ([d8d7084](https://www.github.com/googleapis/api-common-java/commit/d8d708468f134ad0b39bfd8bccf8d7e08a19e7e1)) +* update dependency com.google.auto.value:auto-value-annotations to v1.9 ([#324](https://www.github.com/googleapis/api-common-java/issues/324)) ([0c920a4](https://www.github.com/googleapis/api-common-java/commit/0c920a4c5e68cc7b0a05297bf01114d4a231c591)) + ### [2.1.1](https://www.github.com/googleapis/api-common-java/compare/v2.1.0...v2.1.1) (2021-11-10) diff --git a/build.gradle b/build.gradle index 71616bbe9..15dfc7210 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.2-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.1.2" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 50070265d..410bce4f4 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.1:2.1.2-SNAPSHOT +api-common:2.1.2:2.1.2 From 31ac97989f5e46c5fb219b0709f28536051789da Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Wed, 19 Jan 2022 11:52:20 -0800 Subject: [PATCH 142/201] chore: update cloud rad doclet (#329) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 15dfc7210..ce976fdc2 100644 --- a/build.gradle +++ b/build.gradle @@ -353,7 +353,7 @@ task javadocCombinedV3(type: Javadoc) { options.addStringOption('encoding', 'UTF-8') options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") options.addStringOption("projectname", "api-common") - options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.4.0.jar")] + options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.5.0.jar")] // Newer Gradle 6 passes -notimestamp by default, which the doclet above doesn't understand: // https://github.com/gradle/gradle/issues/11898 options.noTimestamp false From cb2accd13a00e9e30bd2d9c0360078999912b46c Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 19 Jan 2022 12:45:53 -0800 Subject: [PATCH 143/201] chore(main): release 2.1.3-SNAPSHOT (#330) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index ce976fdc2..49c8cacbb 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.2" // {x-version-update:api-common:current} +project.version = "2.1.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 410bce4f4..3969aebea 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.2:2.1.2 +api-common:2.1.2:2.1.3-SNAPSHOT From e37fbee96b2946e2101f313f87b5427833471ea2 Mon Sep 17 00:00:00 2001 From: Daniel Gazineu Date: Wed, 19 Jan 2022 15:51:57 -0500 Subject: [PATCH 144/201] chore: fixed test assertion (#326) Co-authored-by: Emily Ball --- src/test/java/com/google/api/pathtemplate/PathTemplateTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java index 5c6a83858..49b64e6d4 100644 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java @@ -714,7 +714,7 @@ public void instantiateWithCustomVerbs() { PathTemplate template = PathTemplate.create("/v1/{name=operations/**}:cancel"); String templateInstance = template.instantiate("name", "operations/3373707"); Truth.assertThat(templateInstance).isEqualTo("v1/operations/3373707:cancel"); - Truth.assertThat(template.matches(templateInstance)); + Truth.assertThat(template.matches(templateInstance)).isTrue(); } // Other From 1a1910c1812375c98212d761034ed300a952f604 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 26 Jan 2022 00:10:16 +0100 Subject: [PATCH 145/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.11.0 (#331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.10.0` -> `2.11.0` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.11.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.11.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.11.0/compatibility-slim/2.10.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.11.0/confidence-slim/2.10.0)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.11.0`](https://togithub.com/google/error-prone/releases/v2.11.0) Error Prone now requires JDK 11 or newer ([https://github.com/google/error-prone/issues/2730](https://togithub.com/google/error-prone/issues/2730)). New checks - [`AutoValueBuilderDefaultsInConstructor`](http://errorprone.info/bugpattern/AutoValueBuilderDefaultsInConstructor) - [`FloggerLogString`](http://errorprone.info/bugpattern/FloggerLogString) - [`UnicodeDirectionalityCharacters`](http://errorprone.info/bugpattern/UnicodeDirectionalityCharacters) - [`UnicodeInCode`](http://errorprone.info/bugpattern/UnicodeInCode) - [`AlreadyChecked`](http://errorprone.info/bugpattern/AlreadyChecked) - [`BugPatternNaming`](http://errorprone.info/bugpattern/BugPatternNaming) - [`MissingImplementsComparable`](http://errorprone.info/bugpattern/MissingImplementsComparable) - [`NegativeCharLiteral`](http://errorprone.info/bugpattern/NegativeCharLiteral) - [`PreferredInterfaceType`](http://errorprone.info/bugpattern/PreferredInterfaceType) - [`StronglyTypeByteString`](http://errorprone.info/bugpattern/StronglyTypeByteString) - [`UsingJsr305CheckReturnValue`](http://errorprone.info/bugpattern/UsingJsr305CheckReturnValue) Fixed issues: [#​2641](https://togithub.com/google/error-prone/issues/2641), [#​2705](https://togithub.com/google/error-prone/issues/2705), [#​2776](https://togithub.com/google/error-prone/issues/2776), [#​2798](https://togithub.com/google/error-prone/issues/2798), [#​2799](https://togithub.com/google/error-prone/issues/2799), [#​2819](https://togithub.com/google/error-prone/issues/2819), [#​2820](https://togithub.com/google/error-prone/issues/2820), [#​2831](https://togithub.com/google/error-prone/issues/2831), [#​2833](https://togithub.com/google/error-prone/issues/2833), [#​2834](https://togithub.com/google/error-prone/issues/2834), [#​2835](https://togithub.com/google/error-prone/issues/2835), [#​2861](https://togithub.com/google/error-prone/issues/2861), [#​2873](https://togithub.com/google/error-prone/issues/2873), [#​2889](https://togithub.com/google/error-prone/issues/2889), [#​2892](https://togithub.com/google/error-prone/issues/2892), [#​2901](https://togithub.com/google/error-prone/issues/2901) **Full Changelog**: https://github.com/google/error-prone/compare/v2.10.0...v2.11.0
--- ### Configuration 📅 **Schedule**: At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 49c8cacbb..aa4d4be73 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.0.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.10.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.11.0', // Testing junit: 'junit:junit:4.13.2', From 19f33ababeac1ba0667a3a39ee06c0b67c6647ad Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 27 Jan 2022 12:12:05 -0500 Subject: [PATCH 146/201] chore(main): release 2.1.3 (#332) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bf2600ed..dd8e11a66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.1.3](https://github.com/googleapis/api-common-java/compare/v2.1.2...v2.1.3) (2022-01-25) + + +### Dependencies + +* update dependency com.google.errorprone:error_prone_annotations to v2.11.0 ([#331](https://github.com/googleapis/api-common-java/issues/331)) ([1a1910c](https://github.com/googleapis/api-common-java/commit/1a1910c1812375c98212d761034ed300a952f604)) + ### [2.1.2](https://www.github.com/googleapis/api-common-java/compare/v2.1.1...v2.1.2) (2022-01-06) diff --git a/build.gradle b/build.gradle index aa4d4be73..2af47fe51 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.1.3" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 3969aebea..dfce69814 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.2:2.1.3-SNAPSHOT +api-common:2.1.3:2.1.3 From 6a8a0a44fbf942ea6224ab3d8d4b3bcc6c79c5b4 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 27 Jan 2022 12:43:58 -0500 Subject: [PATCH 147/201] chore(main): release 2.1.4-SNAPSHOT (#334) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2af47fe51..997621553 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.3" // {x-version-update:api-common:current} +project.version = "2.1.4-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index dfce69814..95d79688f 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.3:2.1.3 +api-common:2.1.3:2.1.4-SNAPSHOT From 309521b3e6666d6ba86b47714c898a3b15d843bd Mon Sep 17 00:00:00 2001 From: Blake Li Date: Fri, 4 Feb 2022 14:00:52 -0500 Subject: [PATCH 148/201] Support delimiters(_-.~) as start or end characters for a segment. (#336) Support delimiters(_-.~) as start or end characters for a segment if the segment does not contain complex resource names. A segment can start with a delimiter, as long as there is no { right after it. A segment can end with a delimiter, as long as there is no } right before it. A segment like .{well}-{known} or {well}-{known}. is invalid. A segment like .well-known, .well-{known} or .-~{well-known} is considered a literal hence is valid. --- .../google/api/pathtemplate/PathTemplate.java | 18 ++++- .../api/pathtemplate/PathTemplateTest.java | 77 ++++++++++++++++++- 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java index 4e4e770e6..4458e5ed6 100644 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ b/src/main/java/com/google/api/pathtemplate/PathTemplate.java @@ -887,9 +887,7 @@ private static ImmutableList parseTemplate(String template) { boolean isLastSegment = (template.indexOf(seg) + seg.length()) == template.length(); boolean isCollectionWildcard = !isLastSegment && (seg.equals("-") || seg.equals("-}")); - if (!isCollectionWildcard - && (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(0, 1)).find() - || COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(seg.length() - 1)).find())) { + if (!isCollectionWildcard && isSegmentBeginOrEndInvalid(seg)) { throw new ValidationException("parse error: invalid begin or end character in '%s'", seg); } // Disallow zero or multiple delimiters between variable names. @@ -1015,6 +1013,20 @@ private static ImmutableList parseTemplate(String template) { return builder.build(); } + private static boolean isSegmentBeginOrEndInvalid(String seg) { + // A segment is invalid if it contains only one character and the character is a delimiter + if (seg.length() == 1 && COMPLEX_DELIMITER_PATTERN.matcher(seg).find()) { + return true; + } + // A segment can start with a delimiter, as long as there is no { right after it. + // A segment can end with a delimiter, as long as there is no } right before it. + // e.g. Invalid: .{well}-{known}, {well}-{known}- + // Valid: .well-known, .well-{known}, .-~{well-known}, these segments are all considered as literals for matching + return (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(0, 1)).find() && seg.charAt(1) == '{') + || (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(seg.length() - 1)).find() + && seg.charAt(seg.length() - 2) == '}'); + } + private static List parseComplexResourceId(String seg) { List segments = new ArrayList<>(); List separatorIndices = new ArrayList<>(); diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java index 49b64e6d4..6e4f02557 100644 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java @@ -487,9 +487,6 @@ public void complexResourceBasicInvalidIds() { @Test public void complexResourceMultipleDelimiters() { thrown.expect(ValidationException.class); - PathTemplate.create("projects/*/zones/.-~{zone_a}"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", ".-~{zone_a}")); PathTemplate.create("projects/*/zones/{zone_a}~.{zone_b}"); thrown.expectMessage( @@ -717,6 +714,80 @@ public void instantiateWithCustomVerbs() { Truth.assertThat(template.matches(templateInstance)).isTrue(); } + @Test + public void instantiateWithASegmentStartsWithADelimiter() { + PathTemplate pathTemplate = + PathTemplate.create( + "v1beta1/{parent=projects/*/locations/*/clusters/*}/.well-known/openid-configuration"); + String pattern = + "v1beta1/projects/abc/locations/def/clusters/yte/.well-known/openid-configuration"; + Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); + } + + @Test + public void instantiateWithASegmentContainingComplexResourceNamesAndStartsWithADelimiter() { + thrown.expect(ValidationException.class); + PathTemplate.create( + "v1beta1/{parent=projects/*/locations/*/clusters/*}/.{well}-{known}/openid-configuration"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", ".{well}-{known}")); + } + + @Test + public void + instantiateWithASegmentContainingNoComplexResourceNamesAndStartsWithMultipleDelimiters() { + PathTemplate pathTemplate = + PathTemplate.create( + "v1beta1/{parent=projects/*/locations/*/clusters/*}/.-~well-known/openid-configuration"); + String pattern = + "v1beta1/projects/abc/locations/def/clusters/yte/.-~well-known/openid-configuration"; + Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); + } + + @Test + public void instantiateWithASegmentOnlyContainingOneDelimiter() { + thrown.expect(ValidationException.class); + PathTemplate.create("v1/publishers/{publisher}/books/."); + thrown.expectMessage(String.format("parse error: invalid begin or end character in '%s'", ".")); + } + + @Test + public void instantiateWithASegmentOnlyContainingOneCharacter() { + PathTemplate pathTemplate = PathTemplate.create("v1/publishers/{publisher}/books/a"); + String pattern = "v1/publishers/o'reilly/books/a"; + Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); + } + + @Test + public void instantiateWithASegmentEndsWithADelimiter() { + PathTemplate pathTemplate = + PathTemplate.create( + "v1beta1/{parent=projects/*/locations/*/clusters/*}/well-known./openid-configuration"); + String pattern = + "v1beta1/projects/abc/locations/def/clusters/yte/well-known./openid-configuration"; + Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); + } + + @Test + public void instantiateWithASegmentContainingComplexResourceNamesAndEndsWithADelimiter() { + thrown.expect(ValidationException.class); + PathTemplate.create( + "v1beta1/{parent=projects/*/locations/*/clusters/*}/{well}-{known}./openid-configuration"); + thrown.expectMessage( + String.format("parse error: invalid begin or end character in '%s'", "{well}-{known}.")); + } + + @Test + public void + instantiateWithASegmentContainingNoComplexResourceNamesAndEndsWithMultipleDelimiters() { + PathTemplate pathTemplate = + PathTemplate.create( + "v1beta1/{parent=projects/*/locations/*/clusters/*}/well-known.-~/openid-configuration"); + String pattern = + "v1beta1/projects/abc/locations/def/clusters/yte/well-known.-~/openid-configuration"; + Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); + } + // Other // ===== From fb048ca4037dac220169ba27dc149b36a73ee919 Mon Sep 17 00:00:00 2001 From: Blake Li Date: Fri, 4 Feb 2022 21:47:22 -0500 Subject: [PATCH 149/201] Add unit tests for explicit dynamic routing header feature. (#337) --- .../api/pathtemplate/PathTemplateTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java index 6e4f02557..ae829c5ad 100644 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java @@ -178,6 +178,36 @@ public void matchWithUnboundInMiddle() { assertPositionalMatch(template.match("bar/foo/foo/foo/bar"), "foo/foo", "bar"); } + @Test + public void matchWithNamedBindings() { + PathTemplate template = PathTemplate.create("projects/*/{instance_id=instances/*}/**"); + Map actual = + template.match("projects/proj_foo/instances/instance_bar/table/table_baz"); + Truth.assertThat(actual).containsEntry("instance_id", "instances/instance_bar"); + } + + @Test + public void matchFailWithNamedBindingsWhenPathMismatches() { + PathTemplate template = PathTemplate.create("projects/*/{instance_id=instances/*}/**"); + Map actual = + template.match("projects/proj_foo/instances_fail/instance_bar/table/table_baz"); + Truth.assertThat(actual).isNull(); + } + + @Test + public void matchWithNamedBindingsThatHasOnlyWildcard() { + PathTemplate template = PathTemplate.create("profiles/{routing_id=*}"); + Map actual = template.match("profiles/prof_qux"); + Truth.assertThat(actual).containsEntry("routing_id", "prof_qux"); + } + + @Test + public void matchFailWithNamedBindingsThatHasOnlyWildcardWhenPathMismatches() { + PathTemplate template = PathTemplate.create("profiles/{routing_id=*}"); + Map actual = template.match("profiles/prof_qux/fail"); + Truth.assertThat(actual).isNull(); + } + @Test public void matchWithCustomVerbs() { PathTemplate template = PathTemplate.create("**:foo"); From b2eba9e7497fe13f7132e05a658ca936de5aa9c5 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Mon, 7 Feb 2022 18:13:37 -0500 Subject: [PATCH 150/201] fix: Support delimiters(_-.~) as start or end characters for a segment (#338) * fix: Support delimiters(_-.~) as start or end characters for a segment * Update versions.txt From 11380dd34e4b7780079cfe4b00898267996fc705 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:22:38 -0500 Subject: [PATCH 151/201] chore(main): release 2.1.4 (#339) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd8e11a66..689fcd2ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [2.1.4](https://github.com/googleapis/api-common-java/compare/v2.1.3...v2.1.4) (2022-02-07) + + +### Bug Fixes + +* Support delimiters(_-.~) as start or end characters for a segment ([#338](https://github.com/googleapis/api-common-java/issues/338)) ([b2eba9e](https://github.com/googleapis/api-common-java/commit/b2eba9e7497fe13f7132e05a658ca936de5aa9c5)) + ### [2.1.3](https://github.com/googleapis/api-common-java/compare/v2.1.2...v2.1.3) (2022-01-25) diff --git a/build.gradle b/build.gradle index 997621553..907bc9bf5 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.4-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.1.4" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 95d79688f..3dbfb03b7 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.3:2.1.4-SNAPSHOT +api-common:2.1.4:2.1.4 From 58b33f5b83583f85a3091c83e1f13771aa7d0a1c Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 8 Feb 2022 02:14:27 +0100 Subject: [PATCH 152/201] deps: update dependency gradle to v6.9.2 (#325) Co-authored-by: Chanseok Oh --- gradle/wrapper/gradle-wrapper.jar | Bin 58694 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 257 ++++++++++++++--------- gradlew.bat | 22 +- 4 files changed, 159 insertions(+), 123 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 490fda8577df6c95960ba7077c43220e5bb2c0d9..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 6763 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -105,79 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 9109989e3..ac1b06f93 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From ec861840a9c35d2201d77b5929081daffae0d611 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 8 Feb 2022 11:38:59 -0500 Subject: [PATCH 153/201] chore(main): release 2.1.5-SNAPSHOT (#340) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 907bc9bf5..0dffdba44 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.4" // {x-version-update:api-common:current} +project.version = "2.1.5-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 3dbfb03b7..007026508 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.4:2.1.4 +api-common:2.1.4:2.1.5-SNAPSHOT From 7027c0b63dfd93c99d2ffaf8d84159596d1da561 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Fri, 11 Feb 2022 14:23:33 -0500 Subject: [PATCH 154/201] chore: downstream check for all libraries in single job (#322) * [DO_NOT_MERGE]chore: downstream check for all libraries in single job * chore: move to java-core directory * chore: fix api-common version * chore: change publish command * chore: make java version 11 * chore: make java version 8 * chore: clone core with https * chore: test more libraries * chore: check all libraries * chore: check all libraries * chore: trigger job with label * chore: trigger on pull request with label * chore: trigger on pull request target with label * chore: run on pull-request * chore: run on pull-request labeled * chore: run on pull-request labeled * chore: only run on pull request label * chore: generalize script * chore: add correct parameters * chore: minor fixes * chore: add retry * fix typo * remove timeout * Update downstream.yaml * chore: fix typo * chore: debug * chore: debug 2 * chore: debug 3 * chore: try cloning in separate directories * chore: fix folder path * chore: remove retry * chore: try all librraies * chore: fix maven build command * Update downstream-client-library-check.sh * Update downstream-client-library-check.sh * Update downstream.yaml * Update downstream-client-library-check.sh --- .github/workflows/downstream.yaml | 142 +++++++++++++++++++++ .kokoro/downstream-client-library-check.sh | 92 +++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 .github/workflows/downstream.yaml create mode 100755 .kokoro/downstream-client-library-check.sh diff --git a/.github/workflows/downstream.yaml b/.github/workflows/downstream.yaml new file mode 100644 index 000000000..4258bbf56 --- /dev/null +++ b/.github/workflows/downstream.yaml @@ -0,0 +1,142 @@ +on: + pull_request: + types: [ labeled ] + branches: + - main +name: downstream +jobs: + dependencies: + if: ${{ github.event.label.name == 'downstream-check:run' }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: [8] + repo: + # This list needs to be updated manually until an automated solution is in place. + - accessapproval + - accesscontextmanager + - aiplatform + - analytics-admin + - analytics-data + - api-gateway + - apigee-connect + - appengine-admin + - area120-tables + - artifact-registry + - asset + - assured-workloads + - automl + - bigquery + - bigqueryconnection + - bigquerydatatransfer + - bigquerymigration + - bigqueryreservation + - bigtable + - billing + - billingbudgets + - binary-authorization + - channel + - cloudbuild + - compute + - contact-center-insights + - container + - containeranalysis + - data-fusion + - datacatalog + - dataflow + - datalabeling + - dataproc + - dataproc-metastore + - datastore + - datastream + - debugger-client + - deploy + - dialogflow + - dialogflow-cx + - dlp + - dms + - dns + - document-ai + - domains + - errorreporting + - essential-contacts + - eventarc + - filestore + - firestore + - functions + - game-servers + - gke-connect-gateway + - gkehub + - gsuite-addons + - iam-admin + - iamcredentials + - iot + - kms + - language + - life-sciences + - logging + - logging-logback + - managed-identities + - mediatranslation + - memcache + - monitoring + - monitoring-dashboards + - network-management + - network-security + - networkconnectivity + - notebooks + - orchestration-airflow + - orgpolicy + - os-config + - os-login + - phishingprotection + - policy-troubleshooter + - private-catalog + - profiler + - pubsublite + - recaptchaenterprise + - recommendations-ai + - recommender + - redis + - resource-settings + - resourcemanager + - retail + - scheduler + - secretmanager + - security-private-ca + - securitycenter + - securitycenter-settings + - service-control + - service-management + - service-usage + - servicedirectory + - shell + - spanner + - spanner-jdbc + - speech + - storage + - storage-nio + - storage-transfer + - talent + - tasks + - texttospeech + - tpu + - trace + - translate + - video-intelligence + - video-transcoder + - vision + - vpcaccess + - webrisk + - websecurityscanner + - workflow-executions + - workflows + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: ${{matrix.java}} + - run: java -version + - run: sudo apt-get install libxml2-utils + - run: .kokoro/downstream-client-library-check.sh api-common ${{matrix.repo}} diff --git a/.kokoro/downstream-client-library-check.sh b/.kokoro/downstream-client-library-check.sh new file mode 100755 index 000000000..b3751f630 --- /dev/null +++ b/.kokoro/downstream-client-library-check.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Presubmit to ensure the dependencies of the Google Libraries BOM, with the modification of change +# in the PR, pick up the highest versions among transitive dependencies. +# https://maven.apache.org/enforcer/enforcer-rules/requireUpperBoundDeps.html +set -eo pipefail +# Display commands being run. +set -x + +CORE_LIBRARY_ARTIFACT=$1 +CLIENT_LIBRARY=$2 +## Get the directory of the build script +scriptDir="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" +## cd to the parent directory, i.e. the root of the git repo +cd "${scriptDir}"/.. + +CORE_VERSION=$( ./gradlew -q properties | grep '^version: ' | cut -d' ' -f2 ) +echo "$CORE_VERSION" + +# Publish api-common to local maven to make it available for downstream libraries +./gradlew publishToMavenLocal + +# Round 1 +# Check this java core library against HEAD of java-shared dependencies + +git clone "https://github.com/googleapis/java-shared-dependencies.git" --depth=1 +pushd java-shared-dependencies/first-party-dependencies + +# replace version +xmllint --shell pom.xml << EOF +setns x=http://maven.apache.org/POM/4.0.0 +cd .//x:artifactId[text()="${CORE_LIBRARY_ARTIFACT}"] +cd ../x:version +set ${CORE_VERSION} +save pom.xml +EOF + +cd .. +mvn verify install -B -V -ntp -fae \ +-DskipTests=true \ +-Dmaven.javadoc.skip=true \ +-Dgcloud.download.skip=true \ +-Denforcer.skip=true + +SHARED_DEPS_VERSION_POM=pom.xml +# Namespace (xmlns) prevents xmllint from specifying tag names in XPath +SHARED_DEPS_VERSION=$(sed -e 's/xmlns=".*"//' ${SHARED_DEPS_VERSION_POM} | xmllint --xpath '/project/version/text()' -) + +if [ -z "${SHARED_DEPS_VERSION}" ]; then + echo "Version is not found in ${SHARED_DEPS_VERSION_POM}" + exit 1 +fi + +# Round 2 +# Check this BOM against java client libraries +git clone "https://github.com/googleapis/java-${CLIENT_LIBRARY}.git" --depth=1 +pushd java-"${CLIENT_LIBRARY}" + +if [[ $CLIENT_LIBRARY == "bigtable" ]]; then + pushd google-cloud-bigtable-deps-bom +fi + +# replace version +xmllint --shell pom.xml << EOF +setns x=http://maven.apache.org/POM/4.0.0 +cd .//x:artifactId[text()="google-cloud-shared-dependencies"] +cd ../x:version +set ${SHARED_DEPS_VERSION} +save pom.xml +EOF + +if [[ $CLIENT_LIBRARY == "bigtable" ]]; then + popd +fi + +mvn verify install -B -V -ntp -fae \ +-Dmaven.javadoc.skip=true \ +-Dgcloud.download.skip=true \ +-Denforcer.skip=true From 1621288ce732d512b605e6730e8886c70384ac58 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Thu, 17 Mar 2022 12:58:36 -0400 Subject: [PATCH 155/201] chore: fix license headers (#345) --- LICENSE | 1 - license-header-javadoc.txt | 1 - src/main/java/com/google/api/core/AbstractApiFuture.java | 1 - src/main/java/com/google/api/core/AbstractApiService.java | 1 - src/main/java/com/google/api/core/ApiAsyncFunction.java | 1 - src/main/java/com/google/api/core/ApiClock.java | 1 - src/main/java/com/google/api/core/ApiFunction.java | 1 - src/main/java/com/google/api/core/ApiFuture.java | 1 - src/main/java/com/google/api/core/ApiFutureCallback.java | 1 - .../java/com/google/api/core/ApiFutureToListenableFuture.java | 1 - src/main/java/com/google/api/core/ApiFutures.java | 1 - src/main/java/com/google/api/core/ApiService.java | 1 - src/main/java/com/google/api/core/BetaApi.java | 1 - src/main/java/com/google/api/core/CurrentMillisClock.java | 1 - src/main/java/com/google/api/core/ForwardingApiFuture.java | 1 - src/main/java/com/google/api/core/InternalApi.java | 1 - src/main/java/com/google/api/core/InternalExtensionOnly.java | 1 - .../java/com/google/api/core/ListenableFutureToApiFuture.java | 1 - src/main/java/com/google/api/core/NanoClock.java | 1 - src/main/java/com/google/api/core/SettableApiFuture.java | 1 - src/main/java/com/google/api/pathtemplate/PathTemplate.java | 1 - .../java/com/google/api/pathtemplate/TemplatedResourceName.java | 1 - .../java/com/google/api/pathtemplate/ValidationException.java | 1 - src/main/java/com/google/api/resourcenames/ResourceName.java | 1 - .../java/com/google/api/resourcenames/ResourceNameFactory.java | 1 - .../java/com/google/api/resourcenames/UntypedResourceName.java | 1 - src/test/java/com/google/api/core/ApiFuturesTest.java | 1 - src/test/java/com/google/api/core/ApiServiceTest.java | 1 - .../com/google/api/core/ListenableFutureToApiFutureTest.java | 1 - src/test/java/com/google/api/core/SettableApiFutureTest.java | 1 - src/test/java/com/google/api/pathtemplate/PathTemplateTest.java | 1 - .../com/google/api/pathtemplate/TemplatedResourceNameTest.java | 1 - .../com/google/api/resourcenames/UntypedResourceNameTest.java | 1 - 33 files changed, 33 deletions(-) diff --git a/LICENSE b/LICENSE index 4e1943723..b442fc4b6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,4 @@ Copyright 2016, Google Inc. -All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/license-header-javadoc.txt b/license-header-javadoc.txt index beea26020..924e0da02 100644 --- a/license-header-javadoc.txt +++ b/license-header-javadoc.txt @@ -1,6 +1,5 @@ /* * Copyright 20xx, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/AbstractApiFuture.java b/src/main/java/com/google/api/core/AbstractApiFuture.java index 0299c9277..64196a1f1 100644 --- a/src/main/java/com/google/api/core/AbstractApiFuture.java +++ b/src/main/java/com/google/api/core/AbstractApiFuture.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/AbstractApiService.java b/src/main/java/com/google/api/core/AbstractApiService.java index 8b627e659..ce6cc6673 100644 --- a/src/main/java/com/google/api/core/AbstractApiService.java +++ b/src/main/java/com/google/api/core/AbstractApiService.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ApiAsyncFunction.java b/src/main/java/com/google/api/core/ApiAsyncFunction.java index 1de164ceb..54554c5be 100644 --- a/src/main/java/com/google/api/core/ApiAsyncFunction.java +++ b/src/main/java/com/google/api/core/ApiAsyncFunction.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ApiClock.java b/src/main/java/com/google/api/core/ApiClock.java index 71053e66d..0c3893ad9 100644 --- a/src/main/java/com/google/api/core/ApiClock.java +++ b/src/main/java/com/google/api/core/ApiClock.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ApiFunction.java b/src/main/java/com/google/api/core/ApiFunction.java index b814a8e5f..749b534a2 100644 --- a/src/main/java/com/google/api/core/ApiFunction.java +++ b/src/main/java/com/google/api/core/ApiFunction.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ApiFuture.java b/src/main/java/com/google/api/core/ApiFuture.java index 6a5bbf6af..de16aceb6 100644 --- a/src/main/java/com/google/api/core/ApiFuture.java +++ b/src/main/java/com/google/api/core/ApiFuture.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ApiFutureCallback.java b/src/main/java/com/google/api/core/ApiFutureCallback.java index 9457d60a7..4c0fdd002 100644 --- a/src/main/java/com/google/api/core/ApiFutureCallback.java +++ b/src/main/java/com/google/api/core/ApiFutureCallback.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java b/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java index 681a0d87d..2903877bd 100644 --- a/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java +++ b/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ApiFutures.java b/src/main/java/com/google/api/core/ApiFutures.java index 5e4f9f176..2189a5e53 100644 --- a/src/main/java/com/google/api/core/ApiFutures.java +++ b/src/main/java/com/google/api/core/ApiFutures.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ApiService.java b/src/main/java/com/google/api/core/ApiService.java index c843a7daf..713c244f6 100644 --- a/src/main/java/com/google/api/core/ApiService.java +++ b/src/main/java/com/google/api/core/ApiService.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/BetaApi.java b/src/main/java/com/google/api/core/BetaApi.java index f35cab81b..0c1d349ee 100644 --- a/src/main/java/com/google/api/core/BetaApi.java +++ b/src/main/java/com/google/api/core/BetaApi.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/CurrentMillisClock.java b/src/main/java/com/google/api/core/CurrentMillisClock.java index 068569ec4..62d2efa39 100644 --- a/src/main/java/com/google/api/core/CurrentMillisClock.java +++ b/src/main/java/com/google/api/core/CurrentMillisClock.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ForwardingApiFuture.java b/src/main/java/com/google/api/core/ForwardingApiFuture.java index 95922bf14..1d814f4bf 100644 --- a/src/main/java/com/google/api/core/ForwardingApiFuture.java +++ b/src/main/java/com/google/api/core/ForwardingApiFuture.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/InternalApi.java b/src/main/java/com/google/api/core/InternalApi.java index f0777f97a..67161bcbd 100644 --- a/src/main/java/com/google/api/core/InternalApi.java +++ b/src/main/java/com/google/api/core/InternalApi.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/InternalExtensionOnly.java b/src/main/java/com/google/api/core/InternalExtensionOnly.java index ad78d3bfd..5b410e2c8 100644 --- a/src/main/java/com/google/api/core/InternalExtensionOnly.java +++ b/src/main/java/com/google/api/core/InternalExtensionOnly.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java b/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java index d389fedf7..7bf9fabc4 100644 --- a/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java +++ b/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/NanoClock.java b/src/main/java/com/google/api/core/NanoClock.java index 8b2c04f6d..27d587a7c 100644 --- a/src/main/java/com/google/api/core/NanoClock.java +++ b/src/main/java/com/google/api/core/NanoClock.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/core/SettableApiFuture.java b/src/main/java/com/google/api/core/SettableApiFuture.java index eab25a744..babcdd6d4 100644 --- a/src/main/java/com/google/api/core/SettableApiFuture.java +++ b/src/main/java/com/google/api/core/SettableApiFuture.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java index 4458e5ed6..b23430e6e 100644 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ b/src/main/java/com/google/api/pathtemplate/PathTemplate.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java b/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java index c5e9cd6e1..98312e342 100644 --- a/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java +++ b/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/pathtemplate/ValidationException.java b/src/main/java/com/google/api/pathtemplate/ValidationException.java index 13057ca33..0db919306 100644 --- a/src/main/java/com/google/api/pathtemplate/ValidationException.java +++ b/src/main/java/com/google/api/pathtemplate/ValidationException.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/resourcenames/ResourceName.java b/src/main/java/com/google/api/resourcenames/ResourceName.java index 8442f4fdd..bb88cebe3 100644 --- a/src/main/java/com/google/api/resourcenames/ResourceName.java +++ b/src/main/java/com/google/api/resourcenames/ResourceName.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/resourcenames/ResourceNameFactory.java b/src/main/java/com/google/api/resourcenames/ResourceNameFactory.java index 13c1967af..8f0099ce4 100644 --- a/src/main/java/com/google/api/resourcenames/ResourceNameFactory.java +++ b/src/main/java/com/google/api/resourcenames/ResourceNameFactory.java @@ -1,6 +1,5 @@ /* * Copyright 2018, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/main/java/com/google/api/resourcenames/UntypedResourceName.java b/src/main/java/com/google/api/resourcenames/UntypedResourceName.java index 19a6e1e9d..2dcf7fd3d 100644 --- a/src/main/java/com/google/api/resourcenames/UntypedResourceName.java +++ b/src/main/java/com/google/api/resourcenames/UntypedResourceName.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/test/java/com/google/api/core/ApiFuturesTest.java b/src/test/java/com/google/api/core/ApiFuturesTest.java index c726bf278..34dc41dda 100644 --- a/src/test/java/com/google/api/core/ApiFuturesTest.java +++ b/src/test/java/com/google/api/core/ApiFuturesTest.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/test/java/com/google/api/core/ApiServiceTest.java b/src/test/java/com/google/api/core/ApiServiceTest.java index a13b2d565..19b10af47 100644 --- a/src/test/java/com/google/api/core/ApiServiceTest.java +++ b/src/test/java/com/google/api/core/ApiServiceTest.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/test/java/com/google/api/core/ListenableFutureToApiFutureTest.java b/src/test/java/com/google/api/core/ListenableFutureToApiFutureTest.java index 41c945c2e..9bc06dae0 100644 --- a/src/test/java/com/google/api/core/ListenableFutureToApiFutureTest.java +++ b/src/test/java/com/google/api/core/ListenableFutureToApiFutureTest.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/test/java/com/google/api/core/SettableApiFutureTest.java b/src/test/java/com/google/api/core/SettableApiFutureTest.java index 6cfed9b92..a4cff9b08 100644 --- a/src/test/java/com/google/api/core/SettableApiFutureTest.java +++ b/src/test/java/com/google/api/core/SettableApiFutureTest.java @@ -1,6 +1,5 @@ /* * Copyright 2017, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java index ae829c5ad..47747a115 100644 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/test/java/com/google/api/pathtemplate/TemplatedResourceNameTest.java b/src/test/java/com/google/api/pathtemplate/TemplatedResourceNameTest.java index 77e5244a1..bb143932f 100644 --- a/src/test/java/com/google/api/pathtemplate/TemplatedResourceNameTest.java +++ b/src/test/java/com/google/api/pathtemplate/TemplatedResourceNameTest.java @@ -1,6 +1,5 @@ /* * Copyright 2016, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java b/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java index ab13287ea..b796f54f5 100644 --- a/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java +++ b/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java @@ -1,6 +1,5 @@ /* * Copyright 2018, Google Inc. - * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are From 94ec14787626d64b82197ae541fb152e66dfa442 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 23 Mar 2022 16:12:50 -0400 Subject: [PATCH 156/201] deps: guava 31.1 (#346) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0dffdba44..5e149cf42 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ ext { javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value: 'com.google.auto.value:auto-value:1.9', auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', - guava: 'com.google.guava:guava:31.0.1-jre', + guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.11.0', From 1fcb661818dd25c206dbc1187a27306bb1aa8cb7 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:47:39 -0400 Subject: [PATCH 157/201] chore(main): release 2.1.5 (#341) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 689fcd2ea..37bb24994 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +### [2.1.5](https://github.com/googleapis/api-common-java/compare/v2.1.4...v2.1.5) (2022-03-23) + + +### Dependencies + +* guava 31.1 ([#346](https://github.com/googleapis/api-common-java/issues/346)) ([94ec147](https://github.com/googleapis/api-common-java/commit/94ec14787626d64b82197ae541fb152e66dfa442)) +* update dependency gradle to v6.9.2 ([#325](https://github.com/googleapis/api-common-java/issues/325)) ([58b33f5](https://github.com/googleapis/api-common-java/commit/58b33f5b83583f85a3091c83e1f13771aa7d0a1c)) + ### [2.1.4](https://github.com/googleapis/api-common-java/compare/v2.1.3...v2.1.4) (2022-02-07) diff --git a/build.gradle b/build.gradle index 5e149cf42..8e17ccf7f 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.5-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.1.5" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 007026508..42df431ff 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.4:2.1.5-SNAPSHOT +api-common:2.1.5:2.1.5 From a178ed33b8e7d18c0116fd4b6f0604ae6cca346b Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 25 Mar 2022 13:53:29 -0400 Subject: [PATCH 158/201] chore(main): release 2.1.6-SNAPSHOT (#347) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 8e17ccf7f..2a26565ae 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.5" // {x-version-update:api-common:current} +project.version = "2.1.6-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 42df431ff..f0d7fac48 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.5:2.1.5 +api-common:2.1.5:2.1.6-SNAPSHOT From 0b705e35ec6d952ff37a5c5818677e572bd6db28 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Mon, 28 Mar 2022 19:02:14 -0400 Subject: [PATCH 159/201] chore: fix downstream check (#349) --- .github/workflows/downstream.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/downstream.yaml b/.github/workflows/downstream.yaml index 4258bbf56..a61ff8d7a 100644 --- a/.github/workflows/downstream.yaml +++ b/.github/workflows/downstream.yaml @@ -134,9 +134,11 @@ jobs: - workflows steps: - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 + - uses: actions/setup-java@v3 with: + distribution: zulu java-version: ${{matrix.java}} - run: java -version + - run: sudo apt-get update -y - run: sudo apt-get install libxml2-utils - run: .kokoro/downstream-client-library-check.sh api-common ${{matrix.repo}} From 2e6de4f0ce7bbbbbcb066e9986a8d7bd04ab043c Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 7 Apr 2022 18:06:27 +0200 Subject: [PATCH 160/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.12.1 (#350) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.11.0` -> `2.12.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.12.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.12.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.12.1/compatibility-slim/2.11.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.12.1/confidence-slim/2.11.0)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.12.1`](https://togithub.com/google/error-prone/releases/v2.12.1) - This release adds an infrastructure optimization to `AppliedFix` source code processing. - [Release Diff: v2.12.0...v2.12.1](https://togithub.com/google/error-prone/compare/v2.12.0...v2.12.1). ### [`v2.12.0`](https://togithub.com/google/error-prone/releases/v2.12.0) New checks - [`BoxedPrimitiveEquality`](http://errorprone.info/bugpattern/BoxedPrimitiveEquality) - [`DoubleBraceInitialization`](http://errorprone.info/bugpattern/DoubleBraceInitialization) - [`IgnoredPureGetter`](http://errorprone.info/bugpattern/IgnoredPureGetter) - [`LockOnBoxedPrimitive`](http://errorprone.info/bugpattern/LockOnBoxedPrimitive) - [`IncorrectMainMethod`](http://errorprone.info/bugpattern/IncorrectMainMethod) - [`LongDoubleConversion`](http://errorprone.info/bugpattern/LongDoubleConversion) - [`RobolectricShadowDirectlyOn`](http://errorprone.info/bugpattern/RobolectricShadowDirectlyOn) - [`StaticAssignmentOfThrowable`](http://errorprone.info/bugpattern/StaticAssignmentOfThrowable) - [`UnnecessaryLongToIntConversion`](http://errorprone.info/bugpattern/UnnecessaryLongToIntConversion) - [`Varifier`](http://errorprone.info/bugpattern/Varifier) Fixed issues: [#​58](https://togithub.com/google/error-prone/issues/58), [#​65](https://togithub.com/google/error-prone/issues/65), [#​1327](https://togithub.com/google/error-prone/issues/1327), [#​1654](https://togithub.com/google/error-prone/issues/1654), [#​2858](https://togithub.com/google/error-prone/issues/2858), [#​2867](https://togithub.com/google/error-prone/issues/2867), [#​2916](https://togithub.com/google/error-prone/issues/2916), [#​2951](https://togithub.com/google/error-prone/issues/2951), [#​2954](https://togithub.com/google/error-prone/issues/2954), [#​3006](https://togithub.com/google/error-prone/issues/3006), [#​3008](https://togithub.com/google/error-prone/issues/3008) **Full Changelog**: https://github.com/google/error-prone/compare/v2.11.0...v2.12.0
--- ### Configuration 📅 **Schedule**: At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2a26565ae..251206107 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.11.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.12.1', // Testing junit: 'junit:junit:4.13.2', From 2954859afe658b07ac76773e056b1b48fe81182b Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 15 Apr 2022 01:28:13 +0200 Subject: [PATCH 161/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.13.0 (#353) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.12.1` -> `2.13.0` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.13.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.13.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.13.0/compatibility-slim/2.12.1)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.13.0/confidence-slim/2.12.1)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.13.0`](https://togithub.com/google/error-prone/releases/v2.13.0) - Handle all annotations with the simple name `Generated` in `-XepDisableWarningsInGeneratedCode` ([#​3094](https://togithub.com/google/error-prone/issues/3094)) - Reconcile `BugChecker#isSuppressed` with suppression handling in `ErrorProneScanner` ([#​3094](https://togithub.com/google/error-prone/issues/3094)) - Fix a bug in `enclosingPackage` ([`8fa64d4`](https://togithub.com/google/error-prone/commit/8fa64d48f3a1d8df852ed2546ba02b0e2b7585af)) - Improve performance of fix application ([`186334b`](https://togithub.com/google/error-prone/commit/186334bcc45d9c275037cdcce3eb509ae8b7ff50)) - Implicitly treat `@AutoBuilder` setter methods as `@CanIgnoreReturnValue`. - Remove some obsolete checks (`PublicConstructorForAbstractClass`, `HashCodeToString`) [Release Diff: v2.12.1...v2.13.0](https://togithub.com/google/error-prone/compare/v2.12.1...v2.13.0).
--- ### Configuration 📅 **Schedule**: At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 251206107..263fa8e5a 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.12.1', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.13.0', // Testing junit: 'junit:junit:4.13.2', From 75f57bca521495a91fd7e55447c60e2b8955ef06 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 18 Apr 2022 10:48:12 -0400 Subject: [PATCH 162/201] feat: next release from main branch is 2.2.0 (#355) --- .github/release-please.yml | 4 ++++ .github/sync-repo-settings.yaml | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/.github/release-please.yml b/.github/release-please.yml index 701b57ed2..8275c4f37 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -14,3 +14,7 @@ branches: bumpMinorPreMajor: true handleGHRelease: true branch: 2.0.x + - releaseType: java-backport + bumpMinorPreMajor: true + handleGHRelease: true + branch: 2.1.x diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index bf50572e9..0689f05cb 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -38,6 +38,15 @@ branchProtectionRules: requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true requiresStrictStatusChecks: true + - pattern: 2.1.x + isAdminEnforced: true + requiredStatusCheckContexts: + - units + - format + - cla/google + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: true permissionRules: - team: Googlers permission: pull From ca94cf901e15765d24a5abaaa9707a74f134cfec Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 18 Apr 2022 17:44:45 +0200 Subject: [PATCH 163/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.13.1 (#354) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.13.0` -> `2.13.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.13.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.13.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.13.1/compatibility-slim/2.13.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.13.1/confidence-slim/2.13.0)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.13.1`](https://togithub.com/google/error-prone/releases/v2.13.1) #### What's Changed - Fix a crash in `UnnecessaryBoxedVariable` in [https://github.com/google/error-prone/pull/3118](https://togithub.com/google/error-prone/pull/3118) - Include the unicode character in the diagnostic message in [https://github.com/google/error-prone/pull/3119](https://togithub.com/google/error-prone/pull/3119) **Full Changelog**: https://github.com/google/error-prone/compare/v2.13.0...v2.13.1
--- ### Configuration 📅 **Schedule**: At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 263fa8e5a..75bedefe4 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.13.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.13.1', // Testing junit: 'junit:junit:4.13.2', From 1bd5852a00f8128ebd67d60926cb20c23dbf804c Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 17 May 2022 15:54:41 -0400 Subject: [PATCH 164/201] chore(main): release 2.2.0 (#351) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 14 ++++++++++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37bb24994..b218098dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [2.2.0](https://github.com/googleapis/api-common-java/compare/v2.1.5...v2.2.0) (2022-04-18) + + +### Features + +* next release from main branch is 2.2.0 ([#355](https://github.com/googleapis/api-common-java/issues/355)) ([75f57bc](https://github.com/googleapis/api-common-java/commit/75f57bca521495a91fd7e55447c60e2b8955ef06)) + + +### Dependencies + +* update dependency com.google.errorprone:error_prone_annotations to v2.12.1 ([#350](https://github.com/googleapis/api-common-java/issues/350)) ([2e6de4f](https://github.com/googleapis/api-common-java/commit/2e6de4f0ce7bbbbbcb066e9986a8d7bd04ab043c)) +* update dependency com.google.errorprone:error_prone_annotations to v2.13.0 ([#353](https://github.com/googleapis/api-common-java/issues/353)) ([2954859](https://github.com/googleapis/api-common-java/commit/2954859afe658b07ac76773e056b1b48fe81182b)) +* update dependency com.google.errorprone:error_prone_annotations to v2.13.1 ([#354](https://github.com/googleapis/api-common-java/issues/354)) ([ca94cf9](https://github.com/googleapis/api-common-java/commit/ca94cf901e15765d24a5abaaa9707a74f134cfec)) + ### [2.1.5](https://github.com/googleapis/api-common-java/compare/v2.1.4...v2.1.5) (2022-03-23) diff --git a/build.gradle b/build.gradle index 75bedefe4..516905927 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.1.6-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.2.0" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index f0d7fac48..f37ce54bb 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.1.5:2.1.6-SNAPSHOT +api-common:2.2.0:2.2.0 From 556e536ea7821bd0cd60c6c514e8fd30ee24a78c Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 25 May 2022 14:58:44 -0700 Subject: [PATCH 165/201] chore: try and fix the license section for GitHub's license detector (#361) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b76bc7840..347f12c10 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ and probably not then. License ------- -BSD - See [LICENSE] for more information. +BSD 3-Clause - See [LICENSE] for more information. Build and Test -------------- From 2bf75c6415646df0a2dd074a75bd044d0bdc67ca Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 26 May 2022 00:28:20 +0200 Subject: [PATCH 166/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.14.0 (#360) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.13.1` -> `2.14.0` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.14.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.14.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.14.0/compatibility-slim/2.13.1)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.14.0/confidence-slim/2.13.1)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.14.0`](https://togithub.com/google/error-prone/releases/tag/v2.14.0) New checkers: - [`BanJNDI`](https://errorprone.info/bugpattern/BanJNDI) - [`EmptyTopLevelDeclaration`](https://errorprone.info/bugpattern/EmptyTopLevelDeclaration) - [`ErroneousBitwiseExpression`](https://errorprone.info/bugpattern/ErroneousBitwiseExpression) - [`FuzzyEqualsShouldNotBeUsedInEqualsMethod`](https://errorprone.info/bugpattern/FuzzyEqualsShouldNotBeUsedInEqualsMethod) - [`Interruption`](https://errorprone.info/bugpattern/Interruption) - [`NullableOnContainingClass`](https://errorprone.info/bugpattern/NullableOnContainingClass) Fixed issues: [#​3110](https://togithub.com/google/error-prone/issues/3110), [#​3193](https://togithub.com/google/error-prone/issues/3193) **Full Changelog**: https://github.com/google/error-prone/compare/v2.13.1...v2.14.0
--- ### Configuration 📅 **Schedule**: At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 516905927..802c61625 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.13.1', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.14.0', // Testing junit: 'junit:junit:4.13.2', From 5094cda68b43732b0a7f19d248f30abef23591af Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 9 Jun 2022 11:49:26 -0400 Subject: [PATCH 167/201] chore(main): release 2.2.1-SNAPSHOT (#359) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Neenu Shaji --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 802c61625..40f78f851 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.2.0" // {x-version-update:api-common:current} +project.version = "2.2.1-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index f37ce54bb..90e9abb03 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.2.0:2.2.0 +api-common:2.2.0:2.2.1-SNAPSHOT From 75edc631a62ea32bb3c7aaa2de10f093112c523a Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 9 Jun 2022 12:15:47 -0400 Subject: [PATCH 168/201] chore(main): release 2.2.1 (#362) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b218098dc..7da368d43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.2.1](https://github.com/googleapis/api-common-java/compare/v2.2.0...v2.2.1) (2022-06-09) + + +### Dependencies + +* update dependency com.google.errorprone:error_prone_annotations to v2.14.0 ([#360](https://github.com/googleapis/api-common-java/issues/360)) ([2bf75c6](https://github.com/googleapis/api-common-java/commit/2bf75c6415646df0a2dd074a75bd044d0bdc67ca)) + ## [2.2.0](https://github.com/googleapis/api-common-java/compare/v2.1.5...v2.2.0) (2022-04-18) diff --git a/build.gradle b/build.gradle index 40f78f851..5d1f59c54 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.2.1-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.2.1" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 90e9abb03..00910c461 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.2.0:2.2.1-SNAPSHOT +api-common:2.2.1:2.2.1 From 6ad1af8aeada10c8587d50cb5fce7598e6e61dd5 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 14:24:18 +0000 Subject: [PATCH 169/201] chore(main): release 2.2.2-SNAPSHOT (#363) :robot: I have created a release *beep* *boop* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- build.gradle | 2 +- versions.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 5d1f59c54..70019fa6f 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.2.1" // {x-version-update:api-common:current} +project.version = "2.2.2-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 00910c461..90874c7cf 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.2.1:2.2.1 +api-common:2.2.1:2.2.2-SNAPSHOT From 28ff65d7e70495cc079379b8e78cb515a2960dae Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 4 Aug 2022 07:04:26 +0200 Subject: [PATCH 170/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.15.0 (#364) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.14.0` -> `2.15.0` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.15.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.15.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.15.0/compatibility-slim/2.14.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.15.0/confidence-slim/2.14.0)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.15.0`](https://togithub.com/google/error-prone/releases/tag/v2.15.0) New Checkers: - [`BuilderReturnThis`](https://errorprone.info/bugpattern/BuilderReturnThis) - [`CanIgnoreReturnValueSuggester`](https://errorprone.info/bugpattern/CanIgnoreReturnValueSuggester) - [`CannotMockFinalClass`](https://errorprone.info/bugpattern/CannotMockFinalClass) - [`CannotMockFinalMethod`](https://errorprone.info/bugpattern/CannotMockFinalMethod) - [`DirectInvocationOnMock`](https://errorprone.info/bugpattern/DirectInvocationOnMock) - [`ExtendsObject`](https://errorprone.info/bugpattern/ExtendsObject) - [`MockNotUsedInProduction`](https://errorprone.info/bugpattern/MockNotUsedInProduction) - [`NoCanIgnoreReturnValueOnClasses`](https://errorprone.info/bugpattern/NoCanIgnoreReturnValueOnClasses) - [`NullArgumentForNonNullParameter`](https://errorprone.info/bugpattern/NullArgumentForNonNullParameter) - [`SelfAlwaysReturnsThis`](https://errorprone.info/bugpattern/SelfAlwaysReturnsThis) - [`UnsafeWildcard`](https://errorprone.info/bugpattern/UnsafeWildcard) - [`UnusedTypeParameter`](https://errorprone.info/bugpattern/UnusedTypeParameter) Fixed issues: [#​1562](https://togithub.com/google/error-prone/issues/1562), [#​3236](https://togithub.com/google/error-prone/issues/3236), [#​3245](https://togithub.com/google/error-prone/issues/3245), [#​3321](https://togithub.com/google/error-prone/issues/3321) **Full Changelog**: https://github.com/google/error-prone/compare/v2.14.0...v2.15.0
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 70019fa6f..22f226197 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.14.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.15.0', // Testing junit: 'junit:junit:4.13.2', From 767e2f48db9ea591c6e3edd64e005a80cd0386cc Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 27 Oct 2022 15:47:13 -0400 Subject: [PATCH 171/201] chore(main): release 2.2.2 (#365) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- versions.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7da368d43..5fe7e350e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.2.2](https://github.com/googleapis/api-common-java/compare/v2.2.1...v2.2.2) (2022-08-04) + + +### Dependencies + +* update dependency com.google.errorprone:error_prone_annotations to v2.15.0 ([#364](https://github.com/googleapis/api-common-java/issues/364)) ([28ff65d](https://github.com/googleapis/api-common-java/commit/28ff65d7e70495cc079379b8e78cb515a2960dae)) + ## [2.2.1](https://github.com/googleapis/api-common-java/compare/v2.2.0...v2.2.1) (2022-06-09) diff --git a/build.gradle b/build.gradle index 22f226197..bed03198f 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.2.2-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.2.2" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/versions.txt b/versions.txt index 90874c7cf..8910c8ba8 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.2.1:2.2.2-SNAPSHOT +api-common:2.2.2:2.2.2 From 9f6f62d1a32ee0b9c02065fe3752c2cd9d711038 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 27 Oct 2022 17:47:04 -0400 Subject: [PATCH 172/201] feat: next release from main branch is 2.3.0 (#371) --- .github/release-please.yml | 4 ++++ .github/sync-repo-settings.yaml | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/.github/release-please.yml b/.github/release-please.yml index 8275c4f37..8b034773a 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -18,3 +18,7 @@ branches: bumpMinorPreMajor: true handleGHRelease: true branch: 2.1.x + - releaseType: java-backport + bumpMinorPreMajor: true + handleGHRelease: true + branch: 2.2.x diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 0689f05cb..2fdb4a472 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -47,6 +47,15 @@ branchProtectionRules: requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true requiresStrictStatusChecks: true + - pattern: 2.2.x + isAdminEnforced: true + requiredStatusCheckContexts: + - units + - format + - cla/google + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: true permissionRules: - team: Googlers permission: pull From 7e48c87407ce7987bd2adedcb726fa97a5b942d9 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 17 Nov 2022 17:00:12 -0500 Subject: [PATCH 173/201] chore: Create initial pom.xml (#375) * chore: Add initial pom.xml * chore: Cleanup pom.xml --- pom.xml | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..1873277ea --- /dev/null +++ b/pom.xml @@ -0,0 +1,106 @@ + + + 4.0.0 + com.google.api + api-common + jar + 2.2.2 + API Common + https://github.com/googleapis/api-common-java + Common utilities for Google APIs in Java + + + com.google.cloud + google-cloud-shared-config + 1.5.4 + + + + + GoogleAPIs + GoogleAPIs + googleapis@googlegroups.com + Google LLC + https://www.google.com + + + + + scm:git:https://github.com/googleapis/api-common-java.git + https://github.com/googleapis/api-common-java + + + + + BSD + https://github.com/googleapis/api-common-java/blob/main/LICENSE + + + + + UTF-8 + 1.8 + 1.8 + 1.10 + + + + + com.google.guava + guava + 31.1-jre + + + com.google.auto.value + auto-value-annotations + ${auto-value.version} + + + + junit + junit + 4.13.2 + test + + + com.google.truth + truth + 1.1.3 + test + + + + + + + maven-compiler-plugin + + + + com.google.auto.value + auto-value + ${auto-value.version} + + + 8 + + -Xlint:unchecked + -Xlint:deprecation + + + + + org.apache.maven.plugins + maven-jar-plugin + + + false + + com.google.api.apicommon + + + + + + + \ No newline at end of file From da1937834bcfa9edfe2fa642211478fed54e5e61 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 21 Nov 2022 00:18:44 +0100 Subject: [PATCH 174/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.16 (#382) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.15.0` -> `2.16` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.16/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.16/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.16/compatibility-slim/2.15.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.16/confidence-slim/2.15.0)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.16`](https://togithub.com/google/error-prone/releases/tag/v2.16): Error Prone 2.16.0 New Checkers: - [`ASTHelpersSuggestions`](https://errorprone.info/bugpattern/ASTHelpersSuggestions) - [`CanIgnoreReturnValueSuggester`](https://errorprone.info/bugpattern/CanIgnoreReturnValueSuggester) - [`LenientFormatStringValidation`](https://errorprone.info/bugpattern/LenientFormatStringValidation) - [`UnnecessarilyUsedValue`](https://errorprone.info/bugpattern/UnnecessarilyUsedValue) Fixed issues: [#​3092](https://togithub.com/google/error-prone/issues/3092), [#​3220](https://togithub.com/google/error-prone/issues/3220), [#​3225](https://togithub.com/google/error-prone/issues/3225), [#​3267](https://togithub.com/google/error-prone/issues/3267), [#​3441](https://togithub.com/google/error-prone/issues/3441) **Full Changelog**: https://togithub.com/google/error-prone/compare/v2.15.0...v2.16.0
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bed03198f..a4ebf08e7 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.15.0', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.16', // Testing junit: 'junit:junit:4.13.2', From 3cbb296485c5f6a5483aa15573c563e97436e13a Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 21 Nov 2022 00:23:09 +0100 Subject: [PATCH 175/201] deps: update dependency gradle to v6.9.3 (#379) Co-authored-by: Diego Alonso Marquez Palacios --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ec991f9aa..d355f4c4f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From fb33ae8ab0810dde5e33400309b4e632e04f4e0b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 21 Nov 2022 00:24:14 +0100 Subject: [PATCH 176/201] deps: update dependency com.google.auto.value:auto-value-annotations to v1.10.1 (#381) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.auto.value:auto-value-annotations](https://togithub.com/google/auto/tree/master/value) ([source](https://togithub.com/google/auto)) | `1.9` -> `1.10.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.10.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.10.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.10.1/compatibility-slim/1.9)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.10.1/confidence-slim/1.9)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Renovate will not automatically rebase this PR, because other commits have been found. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a4ebf08e7..59c5ff75e 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ ext { libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value: 'com.google.auto.value:auto-value:1.9', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.10.1', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.16', From 96eb7d67c06fcd2e43dc6a2d332e9ad8e5fec7eb Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 21 Nov 2022 00:26:13 +0100 Subject: [PATCH 177/201] deps: update dependency com.google.auto.value:auto-value to v1.10.1 (#380) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.auto.value:auto-value](https://togithub.com/google/auto/tree/master/value) ([source](https://togithub.com/google/auto)) | `1.9` -> `1.10.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.10.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.10.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.10.1/compatibility-slim/1.9)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value/1.10.1/confidence-slim/1.9)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Renovate will not automatically rebase this PR, because other commits have been found. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 59c5ff75e..feb8de784 100644 --- a/build.gradle +++ b/build.gradle @@ -42,8 +42,8 @@ ext { // Shortcuts for libraries we are using libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', - auto_value: 'com.google.auto.value:auto-value:1.9', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.10.1', + auto_value: 'com.google.auto.value:auto-value:1.10.1', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.16', From d44ba0b7b15ef910ad7caba607d0d84edac2611b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 21 Nov 2022 00:27:45 +0100 Subject: [PATCH 178/201] deps: update auto-value.version to v1.10.1 (#378) Co-authored-by: gcf-merge-on-green[bot] <60162190+gcf-merge-on-green[bot]@users.noreply.github.com> Co-authored-by: Diego Alonso Marquez Palacios --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1873277ea..ea37e75b6 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ UTF-8 1.8 1.8 - 1.10 + 1.10.1 From 51aa6574a3e3e006e8cb8b1938c869c072f85b07 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:20:39 -0500 Subject: [PATCH 179/201] chore(main): release 2.2.3-SNAPSHOT (#368) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- pom.xml | 2 +- versions.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index feb8de784..7907f0104 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.2.2" // {x-version-update:api-common:current} +project.version = "2.2.3-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/pom.xml b/pom.xml index ea37e75b6..6a12947b7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.api api-common jar - 2.2.2 + 2.2.3-SNAPSHOT API Common https://github.com/googleapis/api-common-java Common utilities for Google APIs in Java diff --git a/versions.txt b/versions.txt index 8910c8ba8..cf199bbc1 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.2.2:2.2.2 +api-common:2.2.2:2.2.3-SNAPSHOT From ff7db47f1cb1b0ae8a702e599848acd5771e0b6a Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 29 Nov 2022 10:31:09 -0500 Subject: [PATCH 180/201] chore: Convert existing CI workflows to maven (#376) * chore: Add initial pom.xml * chore: Convert workflows to maven * chore: Cleanup the existing workflows * chore: Fix format of ci.yaml * chore: Fix format of ci.yaml * chore: Use seperate job for java 8 * chore: Update required status checks * chore: Run java formatter * chore: Resolve checkstyle issues * chore: Empty commit * chore: Run on java 11 or lint job * chore: Change to use temurin * chore: Empty commit * chore: Update for PR comments * chore: Add clirr check in GH actions * chore: Revert build.gradle to google, inc * chore: Revert license to Inc. * chore: Revert license to Inc. * chore: Update license in files * chore: Update the rest of the files to correct license * chore: temp add in old ci workflows for status checks * chore: temp remove required status checks * chore: revert previous commit --- .github/sync-repo-settings.yaml | 36 ++-- .github/workflows/ci.yaml | 115 +++++++++-- .github/workflows/downstream.yaml | 2 +- .gitignore | 2 + .kokoro/build.bat | 3 - .kokoro/build.sh | 53 ++++- .kokoro/coerce_logs.sh | 6 +- .kokoro/continuous/common.cfg | 25 --- .kokoro/continuous/java11.cfg | 7 - .kokoro/continuous/java7.cfg | 7 - .kokoro/continuous/java8.cfg | 12 -- .kokoro/dependencies.sh | 90 -------- .kokoro/nightly/common.cfg | 25 --- .kokoro/nightly/integration.cfg | 37 ---- .kokoro/nightly/java11.cfg | 7 - .kokoro/nightly/java7.cfg | 7 - .kokoro/nightly/java8-osx.cfg | 3 - .kokoro/nightly/java8-win.cfg | 3 - .kokoro/nightly/java8.cfg | 12 -- .kokoro/nightly/samples.cfg | 38 ---- .kokoro/presubmit/dependencies.cfg | 12 -- .kokoro/presubmit/integration.cfg | 33 --- .kokoro/presubmit/java11.cfg | 7 - .kokoro/presubmit/java7.cfg | 7 - .kokoro/presubmit/java8-osx.cfg | 3 - .kokoro/presubmit/java8-win.cfg | 3 - .kokoro/presubmit/java8.cfg | 12 -- .kokoro/presubmit/linkage-monitor.cfg | 12 -- .kokoro/presubmit/lint.cfg | 13 -- .kokoro/presubmit/samples.cfg | 33 --- .kokoro/release/bump_snapshot.cfg | 53 ----- .kokoro/release/drop.cfg | 6 - .kokoro/release/drop.sh | 19 -- .kokoro/release/promote.cfg | 6 - .kokoro/release/promote.sh | 31 --- .kokoro/release/snapshot.cfg | 6 - .kokoro/release/snapshot.sh | 29 --- java.header | 36 +++- license-checks.xml | 2 +- pom.xml | 14 +- .../google/api/core/AbstractApiFuture.java | 4 +- .../com/google/api/core/ApiAsyncFunction.java | 6 +- .../java/com/google/api/core/ApiClock.java | 14 +- .../java/com/google/api/core/ApiFunction.java | 3 +- .../java/com/google/api/core/ApiFuture.java | 2 +- .../google/api/core/ApiFutureCallback.java | 3 +- .../api/core/ApiFutureToListenableFuture.java | 4 +- .../java/com/google/api/core/ApiService.java | 98 ++++----- .../java/com/google/api/core/BetaApi.java | 22 +- .../java/com/google/api/core/InternalApi.java | 12 +- .../api/core/InternalExtensionOnly.java | 22 +- .../api/core/ListenableFutureToApiFuture.java | 4 +- .../google/api/pathtemplate/PathTemplate.java | 195 ++++++++---------- .../pathtemplate/TemplatedResourceName.java | 44 ++-- .../api/pathtemplate/ValidationException.java | 8 +- .../api/resourcenames/ResourceName.java | 4 +- .../UntypedResourceNameTest.java | 4 +- 57 files changed, 406 insertions(+), 870 deletions(-) delete mode 100644 .kokoro/build.bat delete mode 100644 .kokoro/continuous/common.cfg delete mode 100644 .kokoro/continuous/java11.cfg delete mode 100644 .kokoro/continuous/java7.cfg delete mode 100644 .kokoro/continuous/java8.cfg delete mode 100755 .kokoro/dependencies.sh delete mode 100644 .kokoro/nightly/common.cfg delete mode 100644 .kokoro/nightly/integration.cfg delete mode 100644 .kokoro/nightly/java11.cfg delete mode 100644 .kokoro/nightly/java7.cfg delete mode 100644 .kokoro/nightly/java8-osx.cfg delete mode 100644 .kokoro/nightly/java8-win.cfg delete mode 100644 .kokoro/nightly/java8.cfg delete mode 100644 .kokoro/nightly/samples.cfg delete mode 100644 .kokoro/presubmit/dependencies.cfg delete mode 100644 .kokoro/presubmit/integration.cfg delete mode 100644 .kokoro/presubmit/java11.cfg delete mode 100644 .kokoro/presubmit/java7.cfg delete mode 100644 .kokoro/presubmit/java8-osx.cfg delete mode 100644 .kokoro/presubmit/java8-win.cfg delete mode 100644 .kokoro/presubmit/java8.cfg delete mode 100644 .kokoro/presubmit/linkage-monitor.cfg delete mode 100644 .kokoro/presubmit/lint.cfg delete mode 100644 .kokoro/presubmit/samples.cfg delete mode 100644 .kokoro/release/bump_snapshot.cfg delete mode 100644 .kokoro/release/drop.cfg delete mode 100755 .kokoro/release/drop.sh delete mode 100644 .kokoro/release/promote.cfg delete mode 100755 .kokoro/release/promote.sh delete mode 100644 .kokoro/release/snapshot.cfg delete mode 100755 .kokoro/release/snapshot.sh diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 2fdb4a472..a1587888c 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -5,8 +5,10 @@ branchProtectionRules: - pattern: main isAdminEnforced: true requiredStatusCheckContexts: - - units - - format + - units (8) + - units (11) + - units (17) + - lint - cla/google requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true @@ -14,8 +16,10 @@ branchProtectionRules: - pattern: 1.10.1-sp isAdminEnforced: true requiredStatusCheckContexts: - - units - - format + - units (8) + - units (11) + - units (17) + - lint - cla/google requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true @@ -23,8 +27,10 @@ branchProtectionRules: - pattern: java7 isAdminEnforced: true requiredStatusCheckContexts: - - units - - format + - units (8) + - units (11) + - units (17) + - lint - cla/google requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true @@ -32,8 +38,10 @@ branchProtectionRules: - pattern: 2.0.x isAdminEnforced: true requiredStatusCheckContexts: - - units - - format + - units (8) + - units (11) + - units (17) + - lint - cla/google requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true @@ -41,8 +49,10 @@ branchProtectionRules: - pattern: 2.1.x isAdminEnforced: true requiredStatusCheckContexts: - - units - - format + - units (8) + - units (11) + - units (17) + - lint - cla/google requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true @@ -50,8 +60,10 @@ branchProtectionRules: - pattern: 2.2.x isAdminEnforced: true requiredStatusCheckContexts: - - units - - format + - units (8) + - units (11) + - units (17) + - lint - cla/google requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 89788f258..25f2d16c2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,23 +12,104 @@ jobs: JVM_OPTS: -Xmx3200m TERM: dumb steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: 8 - - run: java -version - - name: Gradle Assemble - run: ./gradlew assemble - - name: Gradle Test - run: ./gradlew test - - name: Gradle Build - run: ./gradlew build publishToMavenLocal + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 8 + - run: java -version format: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: 8 - - name: Java Linter - run: ./gradlew googleJavaFormat + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 8 + clirr: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 8 + - run: echo "JAVA8_HOME=${JAVA_HOME}" >> $GITHUB_ENV + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 11 + - run: echo "JAVA11_HOME=${JAVA_HOME}" >> $GITHUB_ENV + - run: .kokoro/build.sh + env: + JOB_TYPE: clirr + units-8: + name: units (8) - Maven + runs-on: ubuntu-latest + steps: + - name: Get current week within the year + id: date + run: echo "::set-output name=week_of_year::$(date +'%W' --utc)" + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + java-version: 8 + distribution: temurin + - run: echo "JAVA8_HOME=${JAVA_HOME}" >> $GITHUB_ENV + - uses: actions/setup-java@v3 + with: + java-version: 11 + distribution: temurin + - run: echo "JAVA11_HOME=${JAVA_HOME}" >> $GITHUB_ENV + - uses: actions/cache@v3 + id: mvn-cache + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.week_of_year }} + - run: .kokoro/build.sh + env: + JOB_TYPE: test + JOB_NAME: units-8 + units-maven: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: [ 11, 17 ] + steps: + - name: Get current week within the year + id: date + run: echo "::set-output name=week_of_year::$(date +'%W' --utc)" + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: ${{matrix.java}} + - run: java -version + - uses: actions/cache@v3 + id: mvn-cache + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.week_of_year }} + - run: .kokoro/build.sh + env: + JOB_TYPE: test + JOB_NAME: units-${{matrix.java}} + lint: + runs-on: ubuntu-latest + steps: + - name: Get current week within the year + id: date + run: echo "::set-output name=week_of_year::$(date +'%W' --utc)" + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 11 + - run: java -version + - uses: actions/cache@v3 + id: mvn-cache + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.week_of_year }} + - run: java -version + - run: mvn -B -ntp com.coveo:fmt-maven-plugin:check + - run: mvn -B -ntp checkstyle:check@checkstyle diff --git a/.github/workflows/downstream.yaml b/.github/workflows/downstream.yaml index a61ff8d7a..250194a16 100644 --- a/.github/workflows/downstream.yaml +++ b/.github/workflows/downstream.yaml @@ -136,7 +136,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-java@v3 with: - distribution: zulu + distribution: temurin java-version: ${{matrix.java}} - run: java -version - run: sudo apt-get update -y diff --git a/.gitignore b/.gitignore index a09410d53..517384895 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ tmp_gh-pages # Vim *.sw* + +target/ diff --git a/.kokoro/build.bat b/.kokoro/build.bat deleted file mode 100644 index 05826ad93..000000000 --- a/.kokoro/build.bat +++ /dev/null @@ -1,3 +0,0 @@ -:: See documentation in type-shell-output.bat - -"C:\Program Files\Git\bin\bash.exe" %~dp0build.sh diff --git a/.kokoro/build.sh b/.kokoro/build.sh index fbf2695f4..ba6d6192a 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -15,11 +15,54 @@ set -eo pipefail -cd github/api-common-java/ +## Get the directory of the build script +scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}")) +## cd to the parent directory, i.e. the root of the git repo +cd ${scriptDir}/.. -# Print out Java +# include common functions +source ${scriptDir}/common.sh + +function setJava() { + export JAVA_HOME=$1 + export PATH=${JAVA_HOME}/bin:$PATH +} + +# This project requires compiling the classes in JDK 11 or higher for GraalVM +# classes. Compiling this project with Java 8 or earlier would fail with "class +# file has wrong version 55.0, should be 53.0" and "unrecognized --release 8 +# option" (set in build.gradle). +if [ ! -z "${JAVA11_HOME}" ]; then + setJava "${JAVA11_HOME}" +fi + +echo "Compiling using Java:" java -version -echo $JOB_TYPE +mvn clean install -B -Dcheckstyle.skip -Dfmt.skip + +# We ensure the generated class files are compatible with Java 8 +if [ ! -z "${JAVA8_HOME}" ]; then + setJava "${JAVA8_HOME}" +fi + +RETURN_CODE=0 -./gradlew assemble -./gradlew build install +case ${JOB_TYPE} in + test) + retry_with_backoff 3 10 \ + mvn -B -ntp \ + -Dclirr.skip=true \ + -Denforcer.skip=true \ + -Dcheckstyle.skip=true \ + -Dflatten.skip=true \ + -Danimal.sniffer.skip=true \ + -Dmaven.wagon.http.retryHandler.count=5 \ + test + RETURN_CODE=$? + ;; + clirr) + mvn -B -ntp -Denforcer.skip=true clirr:check + RETURN_CODE=$? + ;; + *) ;; +esac diff --git a/.kokoro/coerce_logs.sh b/.kokoro/coerce_logs.sh index 5cf7ba49e..7b153733d 100755 --- a/.kokoro/coerce_logs.sh +++ b/.kokoro/coerce_logs.sh @@ -23,7 +23,11 @@ scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}")) ## cd to the parent directory, i.e. the root of the git repo cd ${scriptDir}/.. -job=$(basename ${KOKORO_JOB_NAME}) +if [ -z "${KOKORO_JOB_NAME}" ]; then + job="${JOB_NAME}" +else + job=$(basename ${KOKORO_JOB_NAME}) +fi echo "coercing sponge logs..." for xml in `find . -name *-sponge_log.xml` diff --git a/.kokoro/continuous/common.cfg b/.kokoro/continuous/common.cfg deleted file mode 100644 index c690aeb8a..000000000 --- a/.kokoro/continuous/common.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Build logs will be here -action { - define_artifacts { - regex: "**/*sponge_log.xml" - regex: "**/*sponge_log.txt" - } -} - -# Download trampoline resources. -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# Use the trampoline script to run in docker. -build_file: "api-common-java/.kokoro/trampoline.sh" - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/build.sh" -} - -env_vars: { - key: "JOB_TYPE" - value: "test" -} diff --git a/.kokoro/continuous/java11.cfg b/.kokoro/continuous/java11.cfg deleted file mode 100644 index 709f2b4c7..000000000 --- a/.kokoro/continuous/java11.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java11" -} diff --git a/.kokoro/continuous/java7.cfg b/.kokoro/continuous/java7.cfg deleted file mode 100644 index cb24f44ee..000000000 --- a/.kokoro/continuous/java7.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java7" -} diff --git a/.kokoro/continuous/java8.cfg b/.kokoro/continuous/java8.cfg deleted file mode 100644 index 495cc7bac..000000000 --- a/.kokoro/continuous/java8.cfg +++ /dev/null @@ -1,12 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "REPORT_COVERAGE" - value: "true" -} diff --git a/.kokoro/dependencies.sh b/.kokoro/dependencies.sh deleted file mode 100755 index 59d2aafc7..000000000 --- a/.kokoro/dependencies.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -## Get the directory of the build script -scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}")) -## cd to the parent directory, i.e. the root of the git repo -cd ${scriptDir}/.. - -# include common functions -source ${scriptDir}/common.sh - -# Print out Java -java -version -echo $JOB_TYPE - -export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=128m" - -# this should run maven enforcer -retry_with_backoff 3 10 \ - mvn install -B -V -ntp \ - -DskipTests=true \ - -Dmaven.javadoc.skip=true \ - -Dclirr.skip=true - -mvn -B dependency:analyze -DfailOnWarning=true - -echo "****************** DEPENDENCY LIST COMPLETENESS CHECK *******************" -## Run dependency list completeness check -function completenessCheck() { - # Output dep list with compile scope generated using the original pom - # Running mvn dependency:list on Java versions that support modules will also include the module of the dependency. - # This is stripped from the output as it is not present in the flattened pom. - # Only dependencies with 'compile' or 'runtime' scope are included from original dependency list. - msg "Generating dependency list using original pom..." - mvn dependency:list -f pom.xml -DincludeScope=runtime -Dsort=true | grep '\[INFO] .*:.*:.*:.*:.*' | sed -e s/\\s--\\smodule.*// >.org-list.txt - - # Output dep list generated using the flattened pom (only 'compile' and 'runtime' scopes) - msg "Generating dependency list using flattened pom..." - mvn dependency:list -f .flattened-pom.xml -DincludeScope=runtime -Dsort=true | grep '\[INFO] .*:.*:.*:.*:.*' >.new-list.txt - - # Compare two dependency lists - msg "Comparing dependency lists..." - diff .org-list.txt .new-list.txt >.diff.txt - if [[ $? == 0 ]] - then - msg "Success. No diff!" - else - msg "Diff found. See below: " - msg "You can also check .diff.txt file located in $1." - cat .diff.txt - return 1 - fi -} - -# Allow failures to continue running the script -set +e - -error_count=0 -for path in $(find -name ".flattened-pom.xml") -do - # Check flattened pom in each dir that contains it for completeness - dir=$(dirname "$path") - pushd "$dir" - completenessCheck "$dir" - error_count=$(($error_count + $?)) - popd -done - -if [[ $error_count == 0 ]] -then - msg "All checks passed." - exit 0 -else - msg "Errors found. See log statements above." - exit 1 -fi diff --git a/.kokoro/nightly/common.cfg b/.kokoro/nightly/common.cfg deleted file mode 100644 index c690aeb8a..000000000 --- a/.kokoro/nightly/common.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Build logs will be here -action { - define_artifacts { - regex: "**/*sponge_log.xml" - regex: "**/*sponge_log.txt" - } -} - -# Download trampoline resources. -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# Use the trampoline script to run in docker. -build_file: "api-common-java/.kokoro/trampoline.sh" - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/build.sh" -} - -env_vars: { - key: "JOB_TYPE" - value: "test" -} diff --git a/.kokoro/nightly/integration.cfg b/.kokoro/nightly/integration.cfg deleted file mode 100644 index 0048c8ece..000000000 --- a/.kokoro/nightly/integration.cfg +++ /dev/null @@ -1,37 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "JOB_TYPE" - value: "integration" -} -# TODO: remove this after we've migrated all tests and scripts -env_vars: { - key: "GCLOUD_PROJECT" - value: "gcloud-devel" -} - -env_vars: { - key: "GOOGLE_CLOUD_PROJECT" - value: "gcloud-devel" -} - -env_vars: { - key: "ENABLE_BUILD_COP" - value: "true" -} - -env_vars: { - key: "GOOGLE_APPLICATION_CREDENTIALS" - value: "secret_manager/java-it-service-account" -} - -env_vars: { - key: "SECRET_MANAGER_KEYS" - value: "java-it-service-account" -} diff --git a/.kokoro/nightly/java11.cfg b/.kokoro/nightly/java11.cfg deleted file mode 100644 index 709f2b4c7..000000000 --- a/.kokoro/nightly/java11.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java11" -} diff --git a/.kokoro/nightly/java7.cfg b/.kokoro/nightly/java7.cfg deleted file mode 100644 index cb24f44ee..000000000 --- a/.kokoro/nightly/java7.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java7" -} diff --git a/.kokoro/nightly/java8-osx.cfg b/.kokoro/nightly/java8-osx.cfg deleted file mode 100644 index affd3b901..000000000 --- a/.kokoro/nightly/java8-osx.cfg +++ /dev/null @@ -1,3 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -build_file: "api-common-java/.kokoro/build.sh" diff --git a/.kokoro/nightly/java8-win.cfg b/.kokoro/nightly/java8-win.cfg deleted file mode 100644 index 590450c23..000000000 --- a/.kokoro/nightly/java8-win.cfg +++ /dev/null @@ -1,3 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -build_file: "api-common-java/.kokoro/build.bat" diff --git a/.kokoro/nightly/java8.cfg b/.kokoro/nightly/java8.cfg deleted file mode 100644 index 495cc7bac..000000000 --- a/.kokoro/nightly/java8.cfg +++ /dev/null @@ -1,12 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "REPORT_COVERAGE" - value: "true" -} diff --git a/.kokoro/nightly/samples.cfg b/.kokoro/nightly/samples.cfg deleted file mode 100644 index f25429314..000000000 --- a/.kokoro/nightly/samples.cfg +++ /dev/null @@ -1,38 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "JOB_TYPE" - value: "samples" -} - -# TODO: remove this after we've migrated all tests and scripts -env_vars: { - key: "GCLOUD_PROJECT" - value: "java-docs-samples-testing" -} - -env_vars: { - key: "GOOGLE_CLOUD_PROJECT" - value: "java-docs-samples-testing" -} - -env_vars: { - key: "GOOGLE_APPLICATION_CREDENTIALS" - value: "secret_manager/java-docs-samples-service-account" -} - -env_vars: { - key: "SECRET_MANAGER_KEYS" - value: "java-docs-samples-service-account" -} - -env_vars: { - key: "ENABLE_BUILD_COP" - value: "true" -} diff --git a/.kokoro/presubmit/dependencies.cfg b/.kokoro/presubmit/dependencies.cfg deleted file mode 100644 index 701ec13bd..000000000 --- a/.kokoro/presubmit/dependencies.cfg +++ /dev/null @@ -1,12 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/dependencies.sh" -} diff --git a/.kokoro/presubmit/integration.cfg b/.kokoro/presubmit/integration.cfg deleted file mode 100644 index dded67a9d..000000000 --- a/.kokoro/presubmit/integration.cfg +++ /dev/null @@ -1,33 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "JOB_TYPE" - value: "integration" -} - -# TODO: remove this after we've migrated all tests and scripts -env_vars: { - key: "GCLOUD_PROJECT" - value: "gcloud-devel" -} - -env_vars: { - key: "GOOGLE_CLOUD_PROJECT" - value: "gcloud-devel" -} - -env_vars: { - key: "GOOGLE_APPLICATION_CREDENTIALS" - value: "secret_manager/java-it-service-account" -} - -env_vars: { - key: "SECRET_MANAGER_KEYS" - value: "java-it-service-account" -} diff --git a/.kokoro/presubmit/java11.cfg b/.kokoro/presubmit/java11.cfg deleted file mode 100644 index 709f2b4c7..000000000 --- a/.kokoro/presubmit/java11.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java11" -} diff --git a/.kokoro/presubmit/java7.cfg b/.kokoro/presubmit/java7.cfg deleted file mode 100644 index cb24f44ee..000000000 --- a/.kokoro/presubmit/java7.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java7" -} diff --git a/.kokoro/presubmit/java8-osx.cfg b/.kokoro/presubmit/java8-osx.cfg deleted file mode 100644 index affd3b901..000000000 --- a/.kokoro/presubmit/java8-osx.cfg +++ /dev/null @@ -1,3 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -build_file: "api-common-java/.kokoro/build.sh" diff --git a/.kokoro/presubmit/java8-win.cfg b/.kokoro/presubmit/java8-win.cfg deleted file mode 100644 index 590450c23..000000000 --- a/.kokoro/presubmit/java8-win.cfg +++ /dev/null @@ -1,3 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -build_file: "api-common-java/.kokoro/build.bat" diff --git a/.kokoro/presubmit/java8.cfg b/.kokoro/presubmit/java8.cfg deleted file mode 100644 index 495cc7bac..000000000 --- a/.kokoro/presubmit/java8.cfg +++ /dev/null @@ -1,12 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "REPORT_COVERAGE" - value: "true" -} diff --git a/.kokoro/presubmit/linkage-monitor.cfg b/.kokoro/presubmit/linkage-monitor.cfg deleted file mode 100644 index edd98254e..000000000 --- a/.kokoro/presubmit/linkage-monitor.cfg +++ /dev/null @@ -1,12 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/linkage-monitor.sh" -} \ No newline at end of file diff --git a/.kokoro/presubmit/lint.cfg b/.kokoro/presubmit/lint.cfg deleted file mode 100644 index 6d323c8ae..000000000 --- a/.kokoro/presubmit/lint.cfg +++ /dev/null @@ -1,13 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. - -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "JOB_TYPE" - value: "lint" -} \ No newline at end of file diff --git a/.kokoro/presubmit/samples.cfg b/.kokoro/presubmit/samples.cfg deleted file mode 100644 index 01e096004..000000000 --- a/.kokoro/presubmit/samples.cfg +++ /dev/null @@ -1,33 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "JOB_TYPE" - value: "samples" -} - -# TODO: remove this after we've migrated all tests and scripts -env_vars: { - key: "GCLOUD_PROJECT" - value: "java-docs-samples-testing" -} - -env_vars: { - key: "GOOGLE_CLOUD_PROJECT" - value: "java-docs-samples-testing" -} - -env_vars: { - key: "GOOGLE_APPLICATION_CREDENTIALS" - value: "secret_manager/java-docs-samples-service-account" -} - -env_vars: { - key: "SECRET_MANAGER_KEYS" - value: "java-docs-samples-service-account" -} \ No newline at end of file diff --git a/.kokoro/release/bump_snapshot.cfg b/.kokoro/release/bump_snapshot.cfg deleted file mode 100644 index 4d600c86c..000000000 --- a/.kokoro/release/bump_snapshot.cfg +++ /dev/null @@ -1,53 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Build logs will be here -action { - define_artifacts { - regex: "**/*sponge_log.xml" - } -} - -# Download trampoline resources. -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# Use the trampoline script to run in docker. -build_file: "api-common-java/.kokoro/trampoline.sh" - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/node:10-user" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/bump_snapshot.sh" -} - -# tokens used by release-please to keep an up-to-date release PR. -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "github-magic-proxy-key-release-please" - } - } -} - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "github-magic-proxy-token-release-please" - } - } -} - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "github-magic-proxy-url-release-please" - } - } -} diff --git a/.kokoro/release/drop.cfg b/.kokoro/release/drop.cfg deleted file mode 100644 index 456a07816..000000000 --- a/.kokoro/release/drop.cfg +++ /dev/null @@ -1,6 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/drop.sh" -} diff --git a/.kokoro/release/drop.sh b/.kokoro/release/drop.sh deleted file mode 100755 index ce6ae7543..000000000 --- a/.kokoro/release/drop.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -echo "This dropping a staged repo does not appear supported by the gradle-nexus-staging-plugin" -exit 1 diff --git a/.kokoro/release/promote.cfg b/.kokoro/release/promote.cfg deleted file mode 100644 index 418890c65..000000000 --- a/.kokoro/release/promote.cfg +++ /dev/null @@ -1,6 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/promote.sh" -} diff --git a/.kokoro/release/promote.sh b/.kokoro/release/promote.sh deleted file mode 100755 index 2dcfd256d..000000000 --- a/.kokoro/release/promote.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -# STAGING_REPOSITORY_ID must be set -#if [ -z "${STAGING_REPOSITORY_ID}" ]; then -# echo "Missing STAGING_REPOSITORY_ID environment variable" -# exit 1 -#fi - -source $(dirname "$0")/common.sh -pushd $(dirname "$0")/../../ - -setup_environment_secrets -mkdir -p ${HOME}/.gradle -create_gradle_properties_file "${HOME}/.gradle/gradle.properties" - -./gradlew closeAndReleaseRepository diff --git a/.kokoro/release/snapshot.cfg b/.kokoro/release/snapshot.cfg deleted file mode 100644 index a1fb5ce3c..000000000 --- a/.kokoro/release/snapshot.cfg +++ /dev/null @@ -1,6 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/snapshot.sh" -} \ No newline at end of file diff --git a/.kokoro/release/snapshot.sh b/.kokoro/release/snapshot.sh deleted file mode 100755 index 53a904a1c..000000000 --- a/.kokoro/release/snapshot.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -source $(dirname "$0")/common.sh -MAVEN_SETTINGS_FILE=$(realpath $(dirname "$0")/../../)/settings.xml -pushd $(dirname "$0")/../../ - -# ensure we're trying to push a snapshot (no-result returns non-zero exit code) -grep SNAPSHOT versions.txt - -setup_environment_secrets -mkdir -p ${HOME}/.gradle -create_gradle_properties_file "${HOME}/.gradle/gradle.properties" - -./gradlew assemble publish diff --git a/java.header b/java.header index 3a9b503aa..7e518c100 100644 --- a/java.header +++ b/java.header @@ -1,15 +1,29 @@ ^/\*$ -^ \* Copyright \d\d\d\d,? Google (Inc\.|LLC)( All [rR]ights [rR]eserved\.)?$ +^ \* Copyright 20\d\d,? Google (Inc\.|LLC)( All [rR]ights [rR]eserved\.)?$ ^ \*$ -^ \* Licensed under the Apache License, Version 2\.0 \(the "License"\);$ -^ \* you may not use this file except in compliance with the License\.$ -^ \* You may obtain a copy of the License at$ +^ \* Redistribution and use in source and binary forms, with or without$ +^ \* modification, are permitted provided that the following conditions are$ +^ \* met:$ ^ \*$ -^ \*[ ]+https?://www.apache.org/licenses/LICENSE-2\.0$ +^ \* \* Redistributions of source code must retain the above copyright$ +^ \* notice, this list of conditions and the following disclaimer.$ +^ \* \* Redistributions in binary form must reproduce the above$ +^ \* copyright notice, this list of conditions and the following disclaimer$ +^ \* in the documentation and/or other materials provided with the$ +^ \* distribution.$ +^ \* \* Neither the name of Google (Inc\.|LLC) nor the names of its$ +^ \* contributors may be used to endorse or promote products derived from$ +^ \* this software without specific prior written permission.$ ^ \*$ -^ \* Unless required by applicable law or agreed to in writing, software$ -^ \* distributed under the License is distributed on an "AS IS" BASIS,$ -^ \* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.$ -^ \* See the License for the specific language governing permissions and$ -^ \* limitations under the License\.$ -^ \*/$ +^ \* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS$ +^ \* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT$ +^ \* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR$ +^ \* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT$ +^ \* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,$ +^ \* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \(INCLUDING, BUT NOT$ +^ \* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,$ +^ \* DATA, OR PROFITS; OR BUSINESS INTERRUPTION\) HOWEVER CAUSED AND ON ANY$ +^ \* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT$ +^ \* \(INCLUDING NEGLIGENCE OR OTHERWISE\) ARISING IN ANY WAY OUT OF THE USE$ +^ \* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.$ +^ \*/$ \ No newline at end of file diff --git a/license-checks.xml b/license-checks.xml index 6597fced8..a800d524d 100644 --- a/license-checks.xml +++ b/license-checks.xml @@ -5,6 +5,6 @@ - + diff --git a/pom.xml b/pom.xml index 6a12947b7..f5318f900 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.google.api api-common @@ -89,6 +90,17 @@ + + com.coveo + fmt-maven-plugin + + + + check + + + + org.apache.maven.plugins maven-jar-plugin diff --git a/src/main/java/com/google/api/core/AbstractApiFuture.java b/src/main/java/com/google/api/core/AbstractApiFuture.java index 64196a1f1..04d17bb01 100644 --- a/src/main/java/com/google/api/core/AbstractApiFuture.java +++ b/src/main/java/com/google/api/core/AbstractApiFuture.java @@ -37,9 +37,7 @@ import java.util.concurrent.TimeoutException; import javax.annotation.Nullable; -/** - * Abstract implementation of ApiFuture that mirrors {@code AbstractFuture} in Guava. - */ +/** Abstract implementation of ApiFuture that mirrors {@code AbstractFuture} in Guava. */ public abstract class AbstractApiFuture implements ApiFuture { private final InternalSettableFuture impl = new InternalSettableFuture(); diff --git a/src/main/java/com/google/api/core/ApiAsyncFunction.java b/src/main/java/com/google/api/core/ApiAsyncFunction.java index 54554c5be..deb8d48e3 100644 --- a/src/main/java/com/google/api/core/ApiAsyncFunction.java +++ b/src/main/java/com/google/api/core/ApiAsyncFunction.java @@ -32,16 +32,14 @@ /** * Transforms a value, possibly asynchronously. * - *

- * It is similar to Guava's {@code AsyncFunction}, redeclared so that Guava can be shaded. + *

It is similar to Guava's {@code AsyncFunction}, redeclared so that Guava can be shaded. */ public interface ApiAsyncFunction { /** * Returns an output Future to use in place of the given input. The output Future need not be * done, making AsyncFunction suitable for asynchronous derivations. * - *

- * Throwing an exception from this method is equivalent to returning a failing Future. + *

Throwing an exception from this method is equivalent to returning a failing Future. */ ApiFuture apply(I input) throws Exception; } diff --git a/src/main/java/com/google/api/core/ApiClock.java b/src/main/java/com/google/api/core/ApiClock.java index 0c3893ad9..c90e80332 100644 --- a/src/main/java/com/google/api/core/ApiClock.java +++ b/src/main/java/com/google/api/core/ApiClock.java @@ -32,20 +32,16 @@ /** * An interface for getting the current value of a high-resolution time source, in nanoseconds. * - * Clocks other than {@link NanoClock} are typically used only for testing. + *

Clocks other than {@link NanoClock} are typically used only for testing. * - * This interface is required in addition to Java 8's Clock, because nanoTime is required to compare - * values with io.grpc.CallOptions.getDeadlineNanoTime(). + *

This interface is required in addition to Java 8's Clock, because nanoTime is required to + * compare values with io.grpc.CallOptions.getDeadlineNanoTime(). */ public interface ApiClock { - /** - * Returns the current value of this clock's high-resolution time source, in nanoseconds. - */ + /** Returns the current value of this clock's high-resolution time source, in nanoseconds. */ long nanoTime(); - /** - * Returns the current value of this clock's high-resolution time source, in milliseconds. - */ + /** Returns the current value of this clock's high-resolution time source, in milliseconds. */ long millisTime(); } diff --git a/src/main/java/com/google/api/core/ApiFunction.java b/src/main/java/com/google/api/core/ApiFunction.java index 749b534a2..d03d93493 100644 --- a/src/main/java/com/google/api/core/ApiFunction.java +++ b/src/main/java/com/google/api/core/ApiFunction.java @@ -32,8 +32,7 @@ /** * Legacy version of Function. * - *

- * It is similar to Guava's {@code Function}, redeclared so that Guava can be shaded. + *

It is similar to Guava's {@code Function}, redeclared so that Guava can be shaded. */ public interface ApiFunction { T apply(F input); diff --git a/src/main/java/com/google/api/core/ApiFuture.java b/src/main/java/com/google/api/core/ApiFuture.java index de16aceb6..523747585 100644 --- a/src/main/java/com/google/api/core/ApiFuture.java +++ b/src/main/java/com/google/api/core/ApiFuture.java @@ -35,7 +35,7 @@ /** * A Future that can have a listener added. * - * Similar to Guava's {@code ListenableFuture}, but redeclared so that Guava could be shaded. + *

Similar to Guava's {@code ListenableFuture}, but redeclared so that Guava could be shaded. */ public interface ApiFuture extends Future { void addListener(Runnable listener, Executor executor); diff --git a/src/main/java/com/google/api/core/ApiFutureCallback.java b/src/main/java/com/google/api/core/ApiFutureCallback.java index 4c0fdd002..78c0defe8 100644 --- a/src/main/java/com/google/api/core/ApiFutureCallback.java +++ b/src/main/java/com/google/api/core/ApiFutureCallback.java @@ -32,8 +32,7 @@ /** * A callback for accepting the results of an {@link ApiFuture}. * - *

- * It is similar to Guava's {@code FutureCallback}, redeclared so that Guava can be shaded. + *

It is similar to Guava's {@code FutureCallback}, redeclared so that Guava can be shaded. */ public interface ApiFutureCallback { void onFailure(Throwable t); diff --git a/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java b/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java index 2903877bd..e7c6e9f78 100644 --- a/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java +++ b/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java @@ -35,9 +35,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -/** - * INTERNAL USE ONLY. Adapter from ApiFuture to Guava ListenableFuture. - */ +/** INTERNAL USE ONLY. Adapter from ApiFuture to Guava ListenableFuture. */ @InternalApi public class ApiFutureToListenableFuture implements ListenableFuture { private final ApiFuture apiFuture; diff --git a/src/main/java/com/google/api/core/ApiService.java b/src/main/java/com/google/api/core/ApiService.java index 713c244f6..ee49e78f3 100644 --- a/src/main/java/com/google/api/core/ApiService.java +++ b/src/main/java/com/google/api/core/ApiService.java @@ -34,35 +34,32 @@ import java.util.concurrent.TimeoutException; /** - * An object with an operational state, plus asynchronous {@link #startAsync()} and - * {@link #stopAsync()} lifecycle methods to transition between states. Example services include + * An object with an operational state, plus asynchronous {@link #startAsync()} and {@link + * #stopAsync()} lifecycle methods to transition between states. Example services include * webservers, RPC servers and timers. * - *

- * The normal lifecycle of a service is: + *

The normal lifecycle of a service is: * *

    - *
  • {@linkplain State#NEW NEW} -> - *
  • {@linkplain State#STARTING STARTING} -> - *
  • {@linkplain State#RUNNING RUNNING} -> - *
  • {@linkplain State#STOPPING STOPPING} -> - *
  • {@linkplain State#TERMINATED TERMINATED} + *
  • {@linkplain State#NEW NEW} -> + *
  • {@linkplain State#STARTING STARTING} -> + *
  • {@linkplain State#RUNNING RUNNING} -> + *
  • {@linkplain State#STOPPING STOPPING} -> + *
  • {@linkplain State#TERMINATED TERMINATED} *
* - *

There are deviations from this if there are failures or if {@link ApiService#stopAsync} is + * called before the {@link ApiService} reaches the {@linkplain State#RUNNING RUNNING} state. The + * set of legal transitions form a DAG, therefore every method of the + * listener will be called at most once. N.B. The {@link State#FAILED} and {@link State#TERMINATED} + * states are terminal states, once a service enters either of these states it cannot ever leave + * them. * - *

- * Implementors of this interface are strongly encouraged to extend {@link AbstractApiService} which - * implement this interface and make the threading and state management easier. + *

Implementors of this interface are strongly encouraged to extend {@link AbstractApiService} + * which implement this interface and make the threading and state management easier. * - *

- * Similar to Guava's {@code Service}, but redeclared so that Guava could be shaded. + *

Similar to Guava's {@code Service}, but redeclared so that Guava could be shaded. */ public interface ApiService { /** @@ -71,17 +68,15 @@ public interface ApiService { * service changes state. The listener will not have previous state changes replayed, so it is * suggested that listeners are added before the service starts. * - *

- * {@code addListener} guarantees execution ordering across calls to a given listener but not + *

{@code addListener} guarantees execution ordering across calls to a given listener but not * across calls to multiple listeners. Specifically, a given listener will have its callbacks * invoked in the same order as the underlying service enters those states. Additionally, at most * one of the listener's callbacks will execute at once. However, multiple listeners' callbacks * may execute concurrently, and listeners may execute in an order different from the one in which * they were registered. * - *

- * RuntimeExceptions thrown by a listener will be caught and logged. Any exception thrown during - * {@code Executor.execute} (e.g., a {@code RejectedExecutionException}) will be caught and + *

RuntimeExceptions thrown by a listener will be caught and logged. Any exception thrown + * during {@code Executor.execute} (e.g., a {@code RejectedExecutionException}) will be caught and * logged. * * @param listener the listener to run when the service changes state is complete @@ -93,8 +88,8 @@ public interface ApiService { * Waits for the {@link ApiService} to reach the {@linkplain State#RUNNING running state}. * * @throws IllegalStateException if the service reaches a state from which it is not possible to - * enter the {@link State#RUNNING} state. e.g. if the {@code state} is {@code State#TERMINATED} - * when this method is called then this will throw an IllegalStateException. + * enter the {@link State#RUNNING} state. e.g. if the {@code state} is {@code + * State#TERMINATED} when this method is called then this will throw an IllegalStateException. */ void awaitRunning(); @@ -106,9 +101,8 @@ public interface ApiService { * @param unit the time unit of the timeout argument * @throws TimeoutException if the service has not reached the given state within the deadline * @throws IllegalStateException if the service reaches a state from which it is not possible to - * enter the {@link State#RUNNING RUNNING} state. e.g. if the {@code state} is - * {@code State#TERMINATED} when this method is called then this will throw an - * IllegalStateException. + * enter the {@link State#RUNNING RUNNING} state. e.g. if the {@code state} is {@code + * State#TERMINATED} when this method is called then this will throw an IllegalStateException. */ void awaitRunning(long timeout, TimeUnit unit) throws TimeoutException; @@ -154,10 +148,10 @@ public interface ApiService { /** * If the service is {@linkplain State#STARTING starting} or {@linkplain State#RUNNING running}, - * this initiates service shutdown and returns immediately. If the service is - * {@linkplain State#NEW new}, it is {@linkplain State#TERMINATED terminated} without having been - * started nor stopped. If the service has already been stopped, this method returns immediately - * without taking action. + * this initiates service shutdown and returns immediately. If the service is {@linkplain + * State#NEW new}, it is {@linkplain State#TERMINATED terminated} without having been started nor + * stopped. If the service has already been stopped, this method returns immediately without + * taking action. * * @return this */ @@ -166,9 +160,8 @@ public interface ApiService { /** * The lifecycle states of a service. * - *

- * The ordering of the {@link State} enum is defined such that if there is a state transition from - * {@code A -> B} then {@code A.compareTo(B) < 0}. N.B. The converse is not true, i.e. if + *

The ordering of the {@link State} enum is defined such that if there is a state transition + * from {@code A -> B} then {@code A.compareTo(B) < 0}. N.B. The converse is not true, i.e. if * {@code A.compareTo(B) < 0} then there is not guaranteed to be a valid state transition * {@code A -> B}. */ @@ -203,8 +196,7 @@ enum State { * A listener for the various state changes that a {@link ApiService} goes through in its * lifecycle. * - *

- * All methods are no-ops by default, implementors should override the ones they care about. + *

All methods are no-ops by default, implementors should override the ones they care about. */ @BetaApi abstract class Listener { @@ -214,29 +206,29 @@ abstract class Listener { * Therefore, if this method is called, no other methods will be called on the {@link Listener}. * * @param from The previous state that is being transitioned from. Failure can occur in any - * state with the exception of {@linkplain State#NEW NEW} or {@linkplain State#TERMINATED - * TERMINATED}. + * state with the exception of {@linkplain State#NEW NEW} or {@linkplain State#TERMINATED + * TERMINATED}. * @param failure The exception that caused the failure. */ public void failed(State from, Throwable failure) {} /** - * Called when the service transitions from {@linkplain State#STARTING STARTING} to - * {@linkplain State#RUNNING RUNNING}. This occurs when a service has successfully started. + * Called when the service transitions from {@linkplain State#STARTING STARTING} to {@linkplain + * State#RUNNING RUNNING}. This occurs when a service has successfully started. */ public void running() {} /** - * Called when the service transitions from {@linkplain State#NEW NEW} to - * {@linkplain State#STARTING STARTING}. This occurs when {@link ApiService#startAsync} is - * called the first time. + * Called when the service transitions from {@linkplain State#NEW NEW} to {@linkplain + * State#STARTING STARTING}. This occurs when {@link ApiService#startAsync} is called the first + * time. */ public void starting() {} /** * Called when the service transitions to the {@linkplain State#STOPPING STOPPING} state. The - * only valid values for {@code from} are {@linkplain State#STARTING STARTING} or - * {@linkplain State#RUNNING RUNNING}. This occurs when {@link ApiService#stopAsync} is called. + * only valid values for {@code from} are {@linkplain State#STARTING STARTING} or {@linkplain + * State#RUNNING RUNNING}. This occurs when {@link ApiService#stopAsync} is called. * * @param from The previous state that is being transitioned from. */ @@ -245,12 +237,12 @@ public void stopping(State from) {} /** * Called when the service transitions to the {@linkplain State#TERMINATED TERMINATED} state. * The {@linkplain State#TERMINATED TERMINATED} state is a terminal state in the transition - * diagram. Therefore, if this method is called, no other methods will be called on the - * {@link Listener}. + * diagram. Therefore, if this method is called, no other methods will be called on the {@link + * Listener}. * * @param from The previous state that is being transitioned from. The only valid values for - * this are {@linkplain State#NEW NEW}, {@linkplain State#RUNNING RUNNING} or - * {@linkplain State#STOPPING STOPPING}. + * this are {@linkplain State#NEW NEW}, {@linkplain State#RUNNING RUNNING} or {@linkplain + * State#STOPPING STOPPING}. */ public void terminated(State from) {} } diff --git a/src/main/java/com/google/api/core/BetaApi.java b/src/main/java/com/google/api/core/BetaApi.java index 0c1d349ee..4b6491b73 100644 --- a/src/main/java/com/google/api/core/BetaApi.java +++ b/src/main/java/com/google/api/core/BetaApi.java @@ -39,16 +39,16 @@ * Indicates a public API that can change at any time, and has no guarantee of API stability and * backward-compatibility. * - *

- * Usage guidelines: + *

Usage guidelines: + * *

    - *
  1. This annotation is used only on APIs with public visibility. Internal interfaces should not - * use it.
  2. - *
  3. This annotation should only be added to new APIs. Adding it to an existing API is considered - * API-breaking.
  4. - *
  5. Removing this annotation from an API gives it stable status, assuming the API doesn't have - * other annotations denoting instability (such as {@link InternalApi} or - * {@link InternalExtensionOnly}).
  6. + *
  7. This annotation is used only on APIs with public visibility. Internal interfaces should not + * use it. + *
  8. This annotation should only be added to new APIs. Adding it to an existing API is + * considered API-breaking. + *
  9. Removing this annotation from an API gives it stable status, assuming the API doesn't have + * other annotations denoting instability (such as {@link InternalApi} or {@link + * InternalExtensionOnly}). *
*/ @BetaApi @@ -63,8 +63,6 @@ }) @Documented public @interface BetaApi { - /** - * Context information such as links to a discussion thread, tracking issue, etc. - */ + /** Context information such as links to a discussion thread, tracking issue, etc. */ String value() default ""; } diff --git a/src/main/java/com/google/api/core/InternalApi.java b/src/main/java/com/google/api/core/InternalApi.java index 67161bcbd..80b76706c 100644 --- a/src/main/java/com/google/api/core/InternalApi.java +++ b/src/main/java/com/google/api/core/InternalApi.java @@ -39,12 +39,10 @@ * Annotates a program element (class, method, package etc) which is internal to its containing * library, not part of the public API, and should not be used by users of the library. * - *

- * This annotation only makes sense on APIs that are not private. Its existence is necessary because - * Java does not have a visibility level for code within a compilation unit. + *

This annotation only makes sense on APIs that are not private. Its existence is necessary + * because Java does not have a visibility level for code within a compilation unit. * - *

- * Adding this annotation to an API is considered API-breaking. + *

Adding this annotation to an API is considered API-breaking. */ @BetaApi @Retention(RetentionPolicy.RUNTIME) @@ -58,8 +56,6 @@ }) @Documented public @interface InternalApi { - /** - * Context information such as "internal to library", "for testing", etc. - */ + /** Context information such as "internal to library", "for testing", etc. */ String value() default ""; } diff --git a/src/main/java/com/google/api/core/InternalExtensionOnly.java b/src/main/java/com/google/api/core/InternalExtensionOnly.java index 5b410e2c8..2304f77d6 100644 --- a/src/main/java/com/google/api/core/InternalExtensionOnly.java +++ b/src/main/java/com/google/api/core/InternalExtensionOnly.java @@ -39,20 +39,18 @@ * Indicates a public API that is stable for callers to use, but has no guarantee of stability for * extension. Consequently, the API should only be extended within the package containing the API. * - *

- * For example: + *

For example: + * *

    - *
  • An interface marked with this annotation can have new methods added to it.
  • - *
  • A non-final class with this annotation can be marked final.
  • - *
  • A class with this annotation can have new abstract methods added.
  • - *
  • a non-final method with this annotation can be marked final.
  • + *
  • An interface marked with this annotation can have new methods added to it. + *
  • A non-final class with this annotation can be marked final. + *
  • A class with this annotation can have new abstract methods added. + *
  • a non-final method with this annotation can be marked final. *
* - *

- * The list above is just for illustration purposes and is not exhaustive. + *

The list above is just for illustration purposes and is not exhaustive. * - *

- * Adding this annotation to an API is considered API-breaking. + *

Adding this annotation to an API is considered API-breaking. */ @BetaApi @Retention(RetentionPolicy.RUNTIME) @@ -66,8 +64,6 @@ }) @Documented public @interface InternalExtensionOnly { - /** - * Context information on why the interface/class is annotated with InternalExtensionOnly. - */ + /** Context information on why the interface/class is annotated with InternalExtensionOnly. */ String value() default ""; } diff --git a/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java b/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java index 7bf9fabc4..fe77f56d3 100644 --- a/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java +++ b/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java @@ -32,9 +32,7 @@ import com.google.common.util.concurrent.ForwardingListenableFuture.SimpleForwardingListenableFuture; import com.google.common.util.concurrent.ListenableFuture; -/** - * INTERNAL USE ONLY. Adapter from Guava ListenableFuture to ApiFuture. - */ +/** INTERNAL USE ONLY. Adapter from Guava ListenableFuture to ApiFuture. */ @InternalApi public class ListenableFutureToApiFuture extends SimpleForwardingListenableFuture implements ApiFuture { diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java index b23430e6e..cc9f4c110 100644 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ b/src/main/java/com/google/api/pathtemplate/PathTemplate.java @@ -52,54 +52,51 @@ /** * Represents a path template. * - *

- * Templates use the syntax of the API platform; see the protobuf of HttpRule for details. A + *

Templates use the syntax of the API platform; see the protobuf of HttpRule for details. A * template consists of a sequence of literals, wildcards, and variable bindings, where each binding - * can have a sub-path. A string representation can be parsed into an instance of - * {@link PathTemplate}, which can then be used to perform matching and instantiation. + * can have a sub-path. A string representation can be parsed into an instance of {@link + * PathTemplate}, which can then be used to perform matching and instantiation. * - *

- * Matching and instantiation deals with unescaping and escaping using URL encoding rules. For - * example, if a template variable for a single segment is instantiated with a string like - * {@code "a/b"}, the slash will be escaped to {@code "%2f"}. (Note that slash will not be escaped - * for a multiple-segment variable, but other characters will). The literals in the template itself - * are not escaped automatically, and must be already URL encoded. + *

Matching and instantiation deals with unescaping and escaping using URL encoding rules. For + * example, if a template variable for a single segment is instantiated with a string like {@code + * "a/b"}, the slash will be escaped to {@code "%2f"}. (Note that slash will not be escaped for a + * multiple-segment variable, but other characters will). The literals in the template itself are + * not escaped automatically, and must be already URL encoded. * - *

- * Here is an example for a template using simple variables: + *

Here is an example for a template using simple variables: * *

{@code
- *   PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}");
- *   assert template.matches("v2/shelves") == false;
- *   Map<String, String> values = template.match("v1/shelves/s1/books/b1");
- *   Map<String, String> expectedValues = new HashMap<>();
- *   expectedValues.put("shelf", "s1");
- *   expectedValues.put("book", "b1");
- *   assert values.equals(expectedValues);
- *   assert template.instantiate(values).equals("v1/shelves/s1/books/b1");
+ * PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}");
+ * assert template.matches("v2/shelves") == false;
+ * Map<String, String> values = template.match("v1/shelves/s1/books/b1");
+ * Map<String, String> expectedValues = new HashMap<>();
+ * expectedValues.put("shelf", "s1");
+ * expectedValues.put("book", "b1");
+ * assert values.equals(expectedValues);
+ * assert template.instantiate(values).equals("v1/shelves/s1/books/b1");
  * }
* * Templates can use variables which match sub-paths. Example: * *
{@code
- *   PathTemplate template = PathTemplate.create("v1/{name=shelves/*/books/*}"};
- *   assert template.match("v1/shelves/books/b1") == null;
- *   Map<String, String> expectedValues = new HashMap<>();
- *   expectedValues.put("name", "shelves/s1/books/b1");
- *   assert template.match("v1/shelves/s1/books/b1").equals(expectedValues);
+ * PathTemplate template = PathTemplate.create("v1/{name=shelves/*/books/*}"};
+ * assert template.match("v1/shelves/books/b1") == null;
+ * Map<String, String> expectedValues = new HashMap<>();
+ * expectedValues.put("name", "shelves/s1/books/b1");
+ * assert template.match("v1/shelves/s1/books/b1").equals(expectedValues);
  * }
* * Path templates can also be used with only wildcards. Each wildcard is associated with an implicit * variable {@code $n}, where n is the zero-based position of the wildcard. Example: * *
{@code
- *   PathTemplate template = PathTemplate.create("shelves/*/books/*"};
- *   assert template.match("shelves/books/b1") == null;
- *   Map<String, String> values = template.match("v1/shelves/s1/books/b1");
- *   Map<String, String> expectedValues = new HashMap<>();
- *   expectedValues.put("$0", s1");
- *   expectedValues.put("$1", "b1");
- *   assert values.equals(expectedValues);
+ * PathTemplate template = PathTemplate.create("shelves/*/books/*"};
+ * assert template.match("shelves/books/b1") == null;
+ * Map<String, String> values = template.match("v1/shelves/s1/books/b1");
+ * Map<String, String> expectedValues = new HashMap<>();
+ * expectedValues.put("$0", s1");
+ * expectedValues.put("$1", "b1");
+ * assert values.equals(expectedValues);
  * }
* * Paths input to matching can use URL relative syntax to indicate a host name by prefixing the host @@ -108,14 +105,14 @@ * for URL relative syntax and simple path syntax: * *
{@code
- *   PathTemplate template = PathTemplate.create("shelves/*"};
- *   Map<String, String> expectedValues = new HashMap<>();
- *   expectedValues.put(PathTemplate.HOSTNAME_VAR, "//somewhere.io");
- *   expectedValues.put("$0", s1");
- *   assert template.match("//somewhere.io/shelves/s1").equals(expectedValues);
- *   expectedValues.clear();
- *   expectedValues.put("$0", s1");
- *   assert template.match("shelves/s1").equals(expectedValues);
+ * PathTemplate template = PathTemplate.create("shelves/*"};
+ * Map<String, String> expectedValues = new HashMap<>();
+ * expectedValues.put(PathTemplate.HOSTNAME_VAR, "//somewhere.io");
+ * expectedValues.put("$0", s1");
+ * assert template.match("//somewhere.io/shelves/s1").equals(expectedValues);
+ * expectedValues.clear();
+ * expectedValues.put("$0", s1");
+ * assert template.match("shelves/s1").equals(expectedValues);
  * }
* * For the representation of a resource name see {@link TemplatedResourceName}, which is @@ -124,9 +121,8 @@ public class PathTemplate { /** - * A constant identifying the special variable used for endpoint bindings in the result of - * {@link #matchFromFullName(String)}. It may also contain protocol string, if its provided in the - * input. + * A constant identifying the special variable used for endpoint bindings in the result of {@link + * #matchFromFullName(String)}. It may also contain protocol string, if its provided in the input. */ public static final String HOSTNAME_VAR = "$hostname"; @@ -347,16 +343,15 @@ public PathTemplate withoutVars() { * Returns a path template for the sub-path of the given variable. Example: * *
{@code
-   *   PathTemplate template = PathTemplate.create("v1/{name=shelves/*/books/*}");
-   *   assert template.subTemplate("name").toString().equals("shelves/*/books/*");
+   * PathTemplate template = PathTemplate.create("v1/{name=shelves/*/books/*}");
+   * assert template.subTemplate("name").toString().equals("shelves/*/books/*");
    * }
* * The returned template will never have named variables, but only wildcards, which are dealt with - * in matching and instantiation using '$n'-variables. See the documentation of - * {@link #match(String)} and {@link #instantiate(Map)}, respectively. + * in matching and instantiation using '$n'-variables. See the documentation of {@link + * #match(String)} and {@link #instantiate(Map)}, respectively. * - *

- * For a variable which has no sub-path, this returns a path template with a single wildcard + *

For a variable which has no sub-path, this returns a path template with a single wildcard * ('*'). * * @throws ValidationException if the variable does not exist in the template. @@ -422,9 +417,7 @@ public void validate(String path, String exceptionMessagePrefix) { throw new ValidationException( String.format( "%s: Parameter \"%s\" must be in the form \"%s\"", - exceptionMessagePrefix, - path, - this.toString())); + exceptionMessagePrefix, path, this.toString())); } } @@ -434,30 +427,27 @@ public void validate(String path, String exceptionMessagePrefix) { * throws a ValidationException. The exceptionMessagePrefix parameter will be prepended to the * ValidationException message. * - *

- * If the path starts with '//', the first segment will be interpreted as a host name and stored - * in the variable {@link #HOSTNAME_VAR}. + *

If the path starts with '//', the first segment will be interpreted as a host name and + * stored in the variable {@link #HOSTNAME_VAR}. * - *

- * See the {@link PathTemplate} class documentation for examples. + *

See the {@link PathTemplate} class documentation for examples. * - *

- * For free wildcards in the template, the matching process creates variables named '$n', where + *

For free wildcards in the template, the matching process creates variables named '$n', where * 'n' is the wildcard's position in the template (starting at n=0). For example: * *

{@code
-   *   PathTemplate template = PathTemplate.create("shelves/*/books/*");
-   *   Map<String, String> expectedValues = new HashMap<>();
-   *   expectedValues.put("$0", "s1");
-   *   expectedValues.put("$1", "b1");
-   *   assert template.validatedMatch("shelves/s1/books/b2", "User exception string")
-   *              .equals(expectedValues);
-   *   expectedValues.clear();
-   *   expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
-   *   expectedValues.put("$0", "s1");
-   *   expectedValues.put("$1", "b1");
-   *   assert template.validatedMatch("//somewhere.io/shelves/s1/books/b2", "User exception string")
-   *              .equals(expectedValues);
+   * PathTemplate template = PathTemplate.create("shelves/*/books/*");
+   * Map<String, String> expectedValues = new HashMap<>();
+   * expectedValues.put("$0", "s1");
+   * expectedValues.put("$1", "b1");
+   * assert template.validatedMatch("shelves/s1/books/b2", "User exception string")
+   *            .equals(expectedValues);
+   * expectedValues.clear();
+   * expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
+   * expectedValues.put("$0", "s1");
+   * expectedValues.put("$1", "b1");
+   * assert template.validatedMatch("//somewhere.io/shelves/s1/books/b2", "User exception string")
+   *            .equals(expectedValues);
    * }
* * All matched values will be properly unescaped using URL encoding rules (so long as URL encoding @@ -469,9 +459,7 @@ public Map validatedMatch(String path, String exceptionMessagePr throw new ValidationException( String.format( "%s: Parameter \"%s\" must be in the form \"%s\"", - exceptionMessagePrefix, - path, - this.toString())); + exceptionMessagePrefix, path, this.toString())); } return matchMap; } @@ -486,28 +474,25 @@ public boolean matches(String path) { * will be properly unescaped using URL encoding rules. If the path does not match the template, * null is returned. * - *

- * If the path starts with '//', the first segment will be interpreted as a host name and stored - * in the variable {@link #HOSTNAME_VAR}. + *

If the path starts with '//', the first segment will be interpreted as a host name and + * stored in the variable {@link #HOSTNAME_VAR}. * - *

- * See the {@link PathTemplate} class documentation for examples. + *

See the {@link PathTemplate} class documentation for examples. * - *

- * For free wildcards in the template, the matching process creates variables named '$n', where + *

For free wildcards in the template, the matching process creates variables named '$n', where * 'n' is the wildcard's position in the template (starting at n=0). For example: * *

{@code
-   *   PathTemplate template = PathTemplate.create("shelves/*/books/*");
-   *   Map<String, String> expectedValues = new HashMap<>();
-   *   expectedValues.put("$0", "s1");
-   *   expectedValues.put("$1", "b1");
-   *   assert template.match("shelves/s1/books/b2").equals(expectedValues);
-   *   expectedValues.clear();
-   *   expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
-   *   expectedValues.put("$0", "s1");
-   *   expectedValues.put("$1", "b1");
-   *   assert template.match("//somewhere.io/shelves/s1/books/b2").equals(expectedValues);
+   * PathTemplate template = PathTemplate.create("shelves/*/books/*");
+   * Map<String, String> expectedValues = new HashMap<>();
+   * expectedValues.put("$0", "s1");
+   * expectedValues.put("$1", "b1");
+   * assert template.match("shelves/s1/books/b2").equals(expectedValues);
+   * expectedValues.clear();
+   * expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
+   * expectedValues.put("$0", "s1");
+   * expectedValues.put("$1", "b1");
+   * assert template.match("//somewhere.io/shelves/s1/books/b2").equals(expectedValues);
    * }
* * All matched values will be properly unescaped using URL encoding rules (so long as URL encoding @@ -523,11 +508,11 @@ public Map match(String path) { * it starts with '//' or not. Example: * *
{@code
-   *   Map<String, String> expectedValues = new HashMap<>();
-   *   expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
-   *   expectedValues.put("name", "shelves/s1");
-   *   assert template("{name=shelves/*}").matchFromFullName("somewhere.io/shelves/s1")
-   *            .equals(expectedValues);
+   * Map<String, String> expectedValues = new HashMap<>();
+   * expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
+   * expectedValues.put("name", "shelves/s1");
+   * assert template("{name=shelves/*}").matchFromFullName("somewhere.io/shelves/s1")
+   *          .equals(expectedValues);
    * }
*/ @Nullable @@ -696,10 +681,9 @@ private static String concatCaptures(@Nullable String cur, String next) { * Instantiate the template based on the given variable assignment. Performs proper URL escaping * of variable assignments. * - *

- * Note that free wildcards in the template must have bindings of '$n' variables, where 'n' is the - * position of the wildcard (starting at 0). See the documentation of {@link #match(String)} for - * details. + *

Note that free wildcards in the template must have bindings of '$n' variables, where 'n' is + * the position of the wildcard (starting at 0). See the documentation of {@link #match(String)} + * for details. * * @throws ValidationException if a variable occurs in the template without a binding. */ @@ -721,10 +705,10 @@ public String instantiate(String... keysAndValues) { * using their original syntax. Example: * *

{@code
-   *   PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}");
-   *   Map<String, String> partialMap = new HashMap<>();
-   *   partialMap.put("shelf", "s1");
-   *   assert template.instantiatePartial(partialMap).equals("v1/shelves/s1/books/{book}");
+   * PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}");
+   * Map<String, String> partialMap = new HashMap<>();
+   * partialMap.put("shelf", "s1");
+   * assert template.instantiatePartial(partialMap).equals("v1/shelves/s1/books/{book}");
    * }
* * The result of this call can be used to create a new template. @@ -1020,7 +1004,8 @@ private static boolean isSegmentBeginOrEndInvalid(String seg) { // A segment can start with a delimiter, as long as there is no { right after it. // A segment can end with a delimiter, as long as there is no } right before it. // e.g. Invalid: .{well}-{known}, {well}-{known}- - // Valid: .well-known, .well-{known}, .-~{well-known}, these segments are all considered as literals for matching + // Valid: .well-known, .well-{known}, .-~{well-known}, these segments are all considered as + // literals for matching return (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(0, 1)).find() && seg.charAt(1) == '{') || (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(seg.length() - 1)).find() && seg.charAt(seg.length() - 2) == '}'); diff --git a/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java b/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java index 98312e342..f448f9677 100644 --- a/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java +++ b/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java @@ -30,7 +30,6 @@ package com.google.api.pathtemplate; -import com.google.api.core.BetaApi; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; @@ -43,25 +42,22 @@ /** * Class for representing and working with resource names. * - *

- * A resource name is represented by {@link PathTemplate}, an assignment to variables in the + *

A resource name is represented by {@link PathTemplate}, an assignment to variables in the * template, and an optional endpoint. The {@code ResourceName} class implements the map interface * (unmodifiable) to work with the variable assignments, and has methods to reproduce the string * representation of the name, to construct new names, and to dereference names into resources. * - *

- * As a resource name essentially represents a match of a path template against a string, it can be - * also used for other purposes than naming resources. However, not all provided methods may make + *

As a resource name essentially represents a match of a path template against a string, it can + * be also used for other purposes than naming resources. However, not all provided methods may make * sense in all applications. * - *

- * Usage examples: + *

Usage examples: * *

{@code
- *   PathTemplate template = PathTemplate.create("shelves/*/books/*");
- *   TemplatedResourceName resourceName = TemplatedResourceName.create(template, "shelves/s1/books/b1");
- *   assert resourceName.get("$1").equals("b1");
- *   assert resourceName.parentName().toString().equals("shelves/s1/books");
+ * PathTemplate template = PathTemplate.create("shelves/*/books/*");
+ * TemplatedResourceName resourceName = TemplatedResourceName.create(template, "shelves/s1/books/b1");
+ * assert resourceName.get("$1").equals("b1");
+ * assert resourceName.parentName().toString().equals("shelves/s1/books");
  * }
*/ public class TemplatedResourceName implements Map { @@ -69,13 +65,9 @@ public class TemplatedResourceName implements Map { // ResourceName Resolver // ===================== - /** - * Represents a resource name resolver which can be registered with this class. - */ + /** Represents a resource name resolver which can be registered with this class. */ public interface Resolver { - /** - * Resolves the resource name into a resource by calling the underlying API. - */ + /** Resolves the resource name into a resource by calling the underlying API. */ T resolve(Class resourceType, TemplatedResourceName name, @Nullable String version); } @@ -180,31 +172,23 @@ public int hashCode() { return Objects.hash(template, endpoint, values); } - /** - * Gets the template associated with this resource name. - */ + /** Gets the template associated with this resource name. */ public PathTemplate template() { return template; } - /** - * Checks whether the resource name has an endpoint. - */ + /** Checks whether the resource name has an endpoint. */ public boolean hasEndpoint() { return endpoint != null; } - /** - * Returns the endpoint of this resource name, or null if none is defined. - */ + /** Returns the endpoint of this resource name, or null if none is defined. */ @Nullable public String endpoint() { return endpoint; } - /** - * Returns a resource name with specified endpoint. - */ + /** Returns a resource name with specified endpoint. */ public TemplatedResourceName withEndpoint(String endpoint) { return new TemplatedResourceName(template, values, Preconditions.checkNotNull(endpoint)); } diff --git a/src/main/java/com/google/api/pathtemplate/ValidationException.java b/src/main/java/com/google/api/pathtemplate/ValidationException.java index 0db919306..3efa388f5 100644 --- a/src/main/java/com/google/api/pathtemplate/ValidationException.java +++ b/src/main/java/com/google/api/pathtemplate/ValidationException.java @@ -68,9 +68,7 @@ public String get() { }); } - /** - * Clears the validation context. - */ + /** Clears the validation context. */ public static void popCurrentThreadValidationContext() { Stack stack = contextLocal.get(); if (stack != null) { @@ -78,9 +76,7 @@ public static void popCurrentThreadValidationContext() { } } - /** - * Construct validation exception with implicit context. - */ + /** Construct validation exception with implicit context. */ public ValidationException(String format, Object... args) { super(message(contextLocal.get(), format, args)); } diff --git a/src/main/java/com/google/api/resourcenames/ResourceName.java b/src/main/java/com/google/api/resourcenames/ResourceName.java index bb88cebe3..e1c54663d 100644 --- a/src/main/java/com/google/api/resourcenames/ResourceName.java +++ b/src/main/java/com/google/api/resourcenames/ResourceName.java @@ -35,9 +35,7 @@ /** An interface that generated resource name types must implement. */ public interface ResourceName { - /** - * Return the map of each field name to its value. - */ + /** Return the map of each field name to its value. */ Map getFieldValuesMap(); /** diff --git a/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java b/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java index b796f54f5..c0615da41 100644 --- a/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java +++ b/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java @@ -39,9 +39,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -/** - * Tests for {@link UntypedResourceNameTest}. - */ +/** Tests for {@link UntypedResourceNameTest}. */ @RunWith(JUnit4.class) public class UntypedResourceNameTest { private static final String NAME_STRING = "sunshine"; From fe1a7c59e190f222933648e7640add02cab12f92 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 29 Nov 2022 11:18:59 -0500 Subject: [PATCH 181/201] chore: Cleanup old CI jobs (#385) --- .github/workflows/ci.yaml | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 25f2d16c2..663e62aaf 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,25 +5,6 @@ on: pull_request: name: ci jobs: - units: - runs-on: ubuntu-latest - env: - # Customize the JVM maximum heap limit - JVM_OPTS: -Xmx3200m - TERM: dumb - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: 8 - - run: java -version - format: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: 8 clirr: runs-on: ubuntu-latest steps: @@ -42,7 +23,7 @@ jobs: env: JOB_TYPE: clirr units-8: - name: units (8) - Maven + name: units (8) runs-on: ubuntu-latest steps: - name: Get current week within the year @@ -68,7 +49,7 @@ jobs: env: JOB_TYPE: test JOB_NAME: units-8 - units-maven: + units: runs-on: ubuntu-latest strategy: fail-fast: false From d47908af677cc25c88031d4ce36077e06dbc06f1 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 1 Dec 2022 10:47:50 -0500 Subject: [PATCH 182/201] chore: Add rest of gradle dependencies (#389) * chore: Add rest of gradle dependencies * chore: Remove unused dependencies * Revert "chore: Remove unused dependencies" This reverts commit 12fad677e1a0afb59d119fa71d962f455344f2cb. --- pom.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pom.xml b/pom.xml index f5318f900..7b308d98e 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,29 @@ auto-value-annotations ${auto-value.version} + + com.google.auto.value + auto-value + ${auto-value.version} + + + com.google.code.findbugs + jsr305 + 3.0.2 + + + javax.annotation + javax.annotation-api + 1.3.2 + + + com.google.errorprone + error_prone_annotations + 2.16 + compile + + junit junit From 8db63987072795e3ce1533aeb78b270172374631 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 2 Dec 2022 16:18:45 -0500 Subject: [PATCH 183/201] chore: Prepare maven release (#386) * chore: Prepare maven release * chore: Clean up build.sh * chore: Clean up build.sh * chore: Uncomment deploy command --- .kokoro/build.sh | 9 +- .kokoro/presubmit/clirr.cfg | 13 - .kokoro/presubmit/common.cfg | 26 -- .kokoro/release/common.sh | 27 +- .kokoro/release/publish_javadoc.cfg | 23 -- .kokoro/release/publish_javadoc.sh | 52 --- .kokoro/release/publish_javadoc11.sh | 23 +- .kokoro/release/stage.sh | 25 +- .kokoro/requirements.in | 34 ++ .kokoro/requirements.txt | 455 +++++++++++++++++++++++++++ 10 files changed, 550 insertions(+), 137 deletions(-) delete mode 100644 .kokoro/presubmit/clirr.cfg delete mode 100644 .kokoro/presubmit/common.cfg delete mode 100644 .kokoro/release/publish_javadoc.cfg delete mode 100755 .kokoro/release/publish_javadoc.sh create mode 100644 .kokoro/requirements.in create mode 100644 .kokoro/requirements.txt diff --git a/.kokoro/build.sh b/.kokoro/build.sh index ba6d6192a..38ab4128a 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -38,7 +38,7 @@ fi echo "Compiling using Java:" java -version -mvn clean install -B -Dcheckstyle.skip -Dfmt.skip +mvn clean install -B -ntp -DskipTests # We ensure the generated class files are compatible with Java 8 if [ ! -z "${JAVA8_HOME}" ]; then @@ -54,15 +54,16 @@ case ${JOB_TYPE} in -Dclirr.skip=true \ -Denforcer.skip=true \ -Dcheckstyle.skip=true \ - -Dflatten.skip=true \ - -Danimal.sniffer.skip=true \ -Dmaven.wagon.http.retryHandler.count=5 \ test RETURN_CODE=$? ;; clirr) - mvn -B -ntp -Denforcer.skip=true clirr:check + mvn -B -ntp clirr:check RETURN_CODE=$? ;; *) ;; esac + +echo "exiting with ${RETURN_CODE}" +exit ${RETURN_CODE} diff --git a/.kokoro/presubmit/clirr.cfg b/.kokoro/presubmit/clirr.cfg deleted file mode 100644 index ec572442e..000000000 --- a/.kokoro/presubmit/clirr.cfg +++ /dev/null @@ -1,13 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Configure the docker image for kokoro-trampoline. - -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" -} - -env_vars: { - key: "JOB_TYPE" - value: "clirr" -} \ No newline at end of file diff --git a/.kokoro/presubmit/common.cfg b/.kokoro/presubmit/common.cfg deleted file mode 100644 index 3958711ba..000000000 --- a/.kokoro/presubmit/common.cfg +++ /dev/null @@ -1,26 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Build logs will be here -action { - define_artifacts { - regex: "**/*sponge_log.xml" - regex: "**/*sponge_log.txt" - } -} - -# Download trampoline resources. -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# Use the trampoline script to run in docker. -build_file: "api-common-java/.kokoro/trampoline.sh" - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/build.sh" -} - -env_vars: { - key: "JOB_TYPE" - value: "test" -} - diff --git a/.kokoro/release/common.sh b/.kokoro/release/common.sh index 92716fa0b..e96a6f968 100755 --- a/.kokoro/release/common.sh +++ b/.kokoro/release/common.sh @@ -28,12 +28,25 @@ setup_environment_secrets() { export SONATYPE_PASSWORD=$(cat ${KOKORO_KEYSTORE_DIR}/70247_sonatype-credentials | cut -f2 -d'|') } -create_gradle_properties_file() { +create_settings_xml_file() { echo " -signing.gnupg.executable=gpg -signing.gnupg.homeDir=${GPG_HOMEDIR} -signing.gnupg.keyName=${GPG_KEY_ID} -signing.gnupg.passphrase=${GPG_PASSPHRASE} -ossrhUsername=${SONATYPE_USERNAME} -ossrhPassword=${SONATYPE_PASSWORD}" > $1 + + + + ossrh + ${SONATYPE_USERNAME} + ${SONATYPE_PASSWORD} + + + sonatype-nexus-staging + ${SONATYPE_USERNAME} + ${SONATYPE_PASSWORD} + + + sonatype-nexus-snapshots + ${SONATYPE_USERNAME} + ${SONATYPE_PASSWORD} + + +" > $1 } diff --git a/.kokoro/release/publish_javadoc.cfg b/.kokoro/release/publish_javadoc.cfg deleted file mode 100644 index d635fca80..000000000 --- a/.kokoro/release/publish_javadoc.cfg +++ /dev/null @@ -1,23 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/doc-templates/" - -env_vars: { - key: "STAGING_BUCKET" - value: "docs-staging" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/publish_javadoc.sh" -} - - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "docuploader_service_account" - } - } -} diff --git a/.kokoro/release/publish_javadoc.sh b/.kokoro/release/publish_javadoc.sh deleted file mode 100755 index 09e830704..000000000 --- a/.kokoro/release/publish_javadoc.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -if [[ -z "${CREDENTIALS}" ]]; then - CREDENTIALS=${KOKORO_KEYSTORE_DIR}/73713_docuploader_service_account -fi - -if [[ -z "${STAGING_BUCKET}" ]]; then - echo "Need to set STAGING_BUCKET environment variable" - exit 1 -fi - -# work from the git root directory -pushd $(dirname "$0")/../../ - -# install docuploader package -python3 -m pip install gcp-docuploader - -NAME=api-common -VERSION=$(grep ${NAME}: versions.txt | cut -d: -f3) - -# build the docs -./gradlew javadocCombined - -pushd tmp_docs - -# create metadata -python3 -m docuploader create-metadata \ - --name ${NAME} \ - --version ${VERSION} \ - --language java - -# upload docs -python3 -m docuploader upload . \ - --credentials ${CREDENTIALS} \ - --staging-bucket ${STAGING_BUCKET} - -popd diff --git a/.kokoro/release/publish_javadoc11.sh b/.kokoro/release/publish_javadoc11.sh index 1e8bb68a9..73b61d254 100755 --- a/.kokoro/release/publish_javadoc11.sh +++ b/.kokoro/release/publish_javadoc11.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2019 Google Inc. +# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -28,21 +28,28 @@ fi pushd $(dirname "$0")/../../ # install docuploader package -python3 -m pip install gcp-docuploader +python3 -m pip install --require-hashes -r .kokoro/requirements.txt NAME=api-common VERSION=$(grep ${NAME}: versions.txt | cut -d: -f3) # build the docs -./gradlew javadocCombinedV3 +mvn -B -ntp \ + -P docFX \ + -Dclirr.skip=true \ + -Denforcer.skip=true \ + -Dcheckstyle.skip=true \ + -Dflatten.skip=true \ + -Danimal.sniffer.skip=true \ + javadoc:aggregate -# copy README to tmp_docs dir and rename index.md -cp README.md tmp_docs/docfx-yml/index.md +# copy README to docfx-yml dir and rename index.md +cp README.md target/docfx-yml/index.md # copy CHANGELOG to docfx-yml dir and rename history.md -cp CHANGELOG.md tmp_docs/docfx-yml/history.md +cp CHANGELOG.md target/docfx-yml/history.md -pushd tmp_docs/docfx-yml/ +pushd target/docfx-yml/ # create metadata python3 -m docuploader create-metadata \ @@ -56,4 +63,4 @@ python3 -m docuploader upload . \ --staging-bucket ${STAGING_BUCKET_V2} \ --destination-prefix docfx -popd +popd \ No newline at end of file diff --git a/.kokoro/release/stage.sh b/.kokoro/release/stage.sh index ab598b823..ba1cf7e20 100755 --- a/.kokoro/release/stage.sh +++ b/.kokoro/release/stage.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2019 Google Inc. +# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -27,7 +27,24 @@ MAVEN_SETTINGS_FILE=$(realpath $(dirname "$0")/../../)/settings.xml pushd $(dirname "$0")/../../ setup_environment_secrets -mkdir -p ${HOME}/.gradle -create_gradle_properties_file "${HOME}/.gradle/gradle.properties" +create_settings_xml_file "settings.xml" -./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository +mvn clean deploy -B \ + -DskipTests=true \ + -Dclirr.skip=true \ + --settings ${MAVEN_SETTINGS_FILE} \ + -Dgpg.executable=gpg \ + -Dgpg.passphrase=${GPG_PASSPHRASE} \ + -Dgpg.homedir=${GPG_HOMEDIR} \ + -P release + +# The job triggered by Release Please (release-trigger) has this AUTORELEASE_PR +# environment variable. Fusion also lets us to specify this variable. +if [[ -n "${AUTORELEASE_PR}" ]] +then + mvn nexus-staging:release -B \ + -DperformRelease=true \ + --settings=${MAVEN_SETTINGS_FILE} +else + echo "AUTORELEASE_PR is not set. Not releasing." +fi \ No newline at end of file diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in new file mode 100644 index 000000000..924f94ae6 --- /dev/null +++ b/.kokoro/requirements.in @@ -0,0 +1,34 @@ +gcp-docuploader==0.6.3 +google-crc32c==1.3.0 +googleapis-common-protos==1.56.3 +gcp-releasetool==1.9.1 +cryptography==38.0.3 +cachetools==4.2.4 +cffi==1.15.1 +jeepney==0.7.1 +jinja2==3.0.3 +markupsafe==2.0.1 +keyring==23.4.1 +packaging==21.3 +protobuf==3.19.5 +pyjwt==2.4.0 +pyparsing==3.0.9 +pycparser==2.21 +pyperclip==1.8.2 +python-dateutil==2.8.2 +requests==2.27.1 +certifi==2022.9.24 +importlib-metadata==4.8.3 +zipp==3.6.0 +google_api_core==2.8.2 +google-cloud-storage==2.0.0 +google-resumable-media==2.3.3 +google-cloud-core==2.3.1 +typing-extensions==4.1.1 +urllib3==1.26.12 +zipp==3.6.0 +rsa==4.9 +six==1.16.0 +attrs==22.1.0 +google-auth==2.14.1 +idna==3.4 \ No newline at end of file diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt new file mode 100644 index 000000000..1271b9224 --- /dev/null +++ b/.kokoro/requirements.txt @@ -0,0 +1,455 @@ +# +# This file is autogenerated by pip-compile with python 3.10 +# To update, run: +# +# pip-compile --generate-hashes requirements.in +# +attrs==22.1.0 \ + --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ + --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c + # via + # -r requirements.in + # gcp-releasetool +cachetools==4.2.4 \ + --hash=sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693 \ + --hash=sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1 + # via + # -r requirements.in + # google-auth +certifi==2022.9.24 \ + --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ + --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 + # via + # -r requirements.in + # requests +cffi==1.15.1 \ + --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ + --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ + --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ + --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ + --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ + --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ + --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ + --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ + --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ + --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ + --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ + --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ + --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ + --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ + --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ + --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ + --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ + --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ + --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ + --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ + --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ + --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ + --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ + --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ + --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ + --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ + --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ + --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ + --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ + --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ + --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ + --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ + --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ + --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ + --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ + --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ + --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ + --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ + --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ + --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ + --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ + --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ + --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ + --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ + --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ + --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ + --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ + --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ + --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ + --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ + --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ + --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ + --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ + --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ + --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ + --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ + --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ + --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ + --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ + --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ + --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ + --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ + --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ + --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 + # via + # -r requirements.in + # cryptography +charset-normalizer==2.0.12 \ + --hash=sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597 \ + --hash=sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df + # via requests +click==8.0.4 \ + --hash=sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1 \ + --hash=sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb + # via + # gcp-docuploader + # gcp-releasetool +colorlog==6.7.0 \ + --hash=sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662 \ + --hash=sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5 + # via gcp-docuploader +cryptography==38.0.3 \ + --hash=sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d \ + --hash=sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd \ + --hash=sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146 \ + --hash=sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7 \ + --hash=sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436 \ + --hash=sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0 \ + --hash=sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828 \ + --hash=sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b \ + --hash=sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55 \ + --hash=sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36 \ + --hash=sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50 \ + --hash=sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2 \ + --hash=sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a \ + --hash=sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8 \ + --hash=sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0 \ + --hash=sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548 \ + --hash=sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320 \ + --hash=sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748 \ + --hash=sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249 \ + --hash=sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959 \ + --hash=sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f \ + --hash=sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0 \ + --hash=sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd \ + --hash=sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220 \ + --hash=sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c \ + --hash=sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722 + # via + # -r requirements.in + # gcp-releasetool + # secretstorage +gcp-docuploader==0.6.3 \ + --hash=sha256:ba8c9d76b3bbac54b0311c503a373b00edc2dc02d6d54ea9507045adb8e870f7 \ + --hash=sha256:c0f5aaa82ce1854a386197e4e359b120ad6d4e57ae2c812fce42219a3288026b + # via -r requirements.in +gcp-releasetool==1.9.1 \ + --hash=sha256:952f4055d5d986b070ae2a71c4410b250000f9cc5a1e26398fcd55a5bbc5a15f \ + --hash=sha256:d0d3c814a97c1a237517e837d8cfa668ced8df4b882452578ecef4a4e79c583b + # via -r requirements.in +google-api-core==2.8.2 \ + --hash=sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc \ + --hash=sha256:93c6a91ccac79079ac6bbf8b74ee75db970cc899278b97d53bc012f35908cf50 + # via + # -r requirements.in + # google-cloud-core + # google-cloud-storage +google-auth==2.14.1 \ + --hash=sha256:f5d8701633bebc12e0deea4df8abd8aff31c28b355360597f7f2ee60f2e4d016 + # via + # -r requirements.in + # gcp-releasetool + # google-api-core + # google-cloud-core + # google-cloud-storage +google-cloud-core==2.3.1 \ + --hash=sha256:113ba4f492467d5bd442c8d724c1a25ad7384045c3178369038840ecdd19346c \ + --hash=sha256:34334359cb04187bdc80ddcf613e462dfd7a3aabbc3fe4d118517ab4b9303d53 + # via + # -r requirements.in + # google-cloud-storage +google-cloud-storage==2.0.0 \ + --hash=sha256:a57a15aead0f9dfbd4381f1bfdbe8bf89818a4bd75bab846cafcefb2db846c47 \ + --hash=sha256:ec4be60bb223a3a960f0d01697d849b86d91cad815a84915a32ed3635e93a5e7 + # via + # -r requirements.in + # gcp-docuploader +google-crc32c==1.3.0 \ + --hash=sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3 \ + --hash=sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6 \ + --hash=sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206 \ + --hash=sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422 \ + --hash=sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a \ + --hash=sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e \ + --hash=sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0 \ + --hash=sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df \ + --hash=sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407 \ + --hash=sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea \ + --hash=sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48 \ + --hash=sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713 \ + --hash=sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3 \ + --hash=sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267 \ + --hash=sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829 \ + --hash=sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2 \ + --hash=sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a \ + --hash=sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183 \ + --hash=sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942 \ + --hash=sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59 \ + --hash=sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b \ + --hash=sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd \ + --hash=sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c \ + --hash=sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02 \ + --hash=sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328 \ + --hash=sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08 \ + --hash=sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f \ + --hash=sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168 \ + --hash=sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318 \ + --hash=sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d \ + --hash=sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73 \ + --hash=sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4 \ + --hash=sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812 \ + --hash=sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3 \ + --hash=sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d \ + --hash=sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e \ + --hash=sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217 \ + --hash=sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e \ + --hash=sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f \ + --hash=sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125 \ + --hash=sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4 \ + --hash=sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b \ + --hash=sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3 + # via + # -r requirements.in + # google-resumable-media +google-resumable-media==2.3.3 \ + --hash=sha256:27c52620bd364d1c8116eaac4ea2afcbfb81ae9139fb3199652fcac1724bfb6c \ + --hash=sha256:5b52774ea7a829a8cdaa8bd2d4c3d4bc660c91b30857ab2668d0eb830f4ea8c5 + # via + # -r requirements.in + # google-cloud-storage +googleapis-common-protos==1.56.3 \ + --hash=sha256:6f1369b58ed6cf3a4b7054a44ebe8d03b29c309257583a2bbdc064cd1e4a1442 \ + --hash=sha256:87955d7b3a73e6e803f2572a33179de23989ebba725e05ea42f24838b792e461 + # via + # -r requirements.in + # google-api-core +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via + # -r requirements.in + # requests +importlib-metadata==4.8.3 \ + --hash=sha256:65a9576a5b2d58ca44d133c42a241905cc45e34d2c06fd5ba2bafa221e5d7b5e \ + --hash=sha256:766abffff765960fcc18003801f7044eb6755ffae4521c8e8ce8e83b9c9b0668 + # via + # -r requirements.in + # keyring +jeepney==0.7.1 \ + --hash=sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac \ + --hash=sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f + # via + # -r requirements.in + # keyring + # secretstorage +jinja2==3.0.3 \ + --hash=sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8 \ + --hash=sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7 + # via + # -r requirements.in + # gcp-releasetool +keyring==23.4.1 \ + --hash=sha256:17e49fb0d6883c2b4445359434dba95aad84aabb29bbff044ad0ed7100232eca \ + --hash=sha256:89cbd74d4683ed164c8082fb38619341097741323b3786905c6dac04d6915a55 + # via + # -r requirements.in + # gcp-releasetool +markupsafe==2.0.1 \ + --hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \ + --hash=sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64 \ + --hash=sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b \ + --hash=sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194 \ + --hash=sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567 \ + --hash=sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff \ + --hash=sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724 \ + --hash=sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74 \ + --hash=sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646 \ + --hash=sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35 \ + --hash=sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6 \ + --hash=sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a \ + --hash=sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6 \ + --hash=sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad \ + --hash=sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26 \ + --hash=sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38 \ + --hash=sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac \ + --hash=sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7 \ + --hash=sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6 \ + --hash=sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047 \ + --hash=sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75 \ + --hash=sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f \ + --hash=sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b \ + --hash=sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135 \ + --hash=sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8 \ + --hash=sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a \ + --hash=sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a \ + --hash=sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1 \ + --hash=sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9 \ + --hash=sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864 \ + --hash=sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914 \ + --hash=sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee \ + --hash=sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f \ + --hash=sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18 \ + --hash=sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8 \ + --hash=sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2 \ + --hash=sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d \ + --hash=sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b \ + --hash=sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b \ + --hash=sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86 \ + --hash=sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6 \ + --hash=sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f \ + --hash=sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb \ + --hash=sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833 \ + --hash=sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28 \ + --hash=sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e \ + --hash=sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415 \ + --hash=sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902 \ + --hash=sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f \ + --hash=sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d \ + --hash=sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9 \ + --hash=sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d \ + --hash=sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145 \ + --hash=sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066 \ + --hash=sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c \ + --hash=sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1 \ + --hash=sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a \ + --hash=sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207 \ + --hash=sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f \ + --hash=sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53 \ + --hash=sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd \ + --hash=sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134 \ + --hash=sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85 \ + --hash=sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9 \ + --hash=sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5 \ + --hash=sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94 \ + --hash=sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509 \ + --hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \ + --hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872 + # via + # -r requirements.in + # jinja2 +packaging==21.3 \ + --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ + --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 + # via + # -r requirements.in + # gcp-releasetool +protobuf==3.19.5 \ + --hash=sha256:1867f93b06a183f87696871bb8d1e99ee71dbb69d468ce1f0cc8bf3d30f982f3 \ + --hash=sha256:3c4160b601220627f7e91154e572baf5e161a9c3f445a8242d536ee3d0b7b17c \ + --hash=sha256:4ee2af7051d3b10c8a4fe6fd1a2c69f201fea36aeee7086cf202a692e1b99ee1 \ + --hash=sha256:5266c36cc0af3bb3dbf44f199d225b33da66a9a5c3bdc2b14865ad10eddf0e37 \ + --hash=sha256:5470f892961af464ae6eaf0f3099e2c1190ae8c7f36f174b89491281341f79ca \ + --hash=sha256:66d14b5b90090353efe75c9fb1bf65ef7267383034688d255b500822e37d5c2f \ + --hash=sha256:67efb5d20618020aa9596e17bfc37ca068c28ec0c1507d9507f73c93d46c9855 \ + --hash=sha256:696e6cfab94cc15a14946f2bf72719dced087d437adbd994fff34f38986628bc \ + --hash=sha256:6a02172b9650f819d01fb8e224fc69b0706458fc1ab4f1c669281243c71c1a5e \ + --hash=sha256:950abd6c00e7b51f87ae8b18a0ce4d69fea217f62f171426e77de5061f6d9850 \ + --hash=sha256:9e1d74032f56ff25f417cfe84c8147047732e5059137ca42efad20cbbd25f5e0 \ + --hash=sha256:9e42b1cf2ecd8a1bd161239e693f22035ba99905ae6d7efeac8a0546c7ec1a27 \ + --hash=sha256:9f957ef53e872d58a0afd3bf6d80d48535d28c99b40e75e6634cbc33ea42fd54 \ + --hash=sha256:a89aa0c042e61e11ade320b802d6db4ee5391d8d973e46d3a48172c1597789f8 \ + --hash=sha256:c0f80876a8ff0ae7064084ed094eb86497bd5a3812e6fc96a05318b92301674e \ + --hash=sha256:c44e3282cff74ad18c7e8a0375f407f69ee50c2116364b44492a196293e08b21 \ + --hash=sha256:d249519ba5ecf5dd6b18150c9b6bcde510b273714b696f3923ff8308fc11ae49 \ + --hash=sha256:d3973a2d58aefc7d1230725c2447ce7f86a71cbc094b86a77c6ee1505ac7cdb1 \ + --hash=sha256:dca2284378a5f2a86ffed35c6ac147d14c48b525eefcd1083e5a9ce28dfa8657 \ + --hash=sha256:e63b0b3c42e51c94add62b010366cd4979cb6d5f06158bcae8faac4c294f91e1 \ + --hash=sha256:f2b599a21c9a32e171ec29a2ac54e03297736c578698e11b099d031f79da114b \ + --hash=sha256:f2bde37667b18c2b5280df83bc799204394a5d2d774e4deaf9de0eb741df6833 \ + --hash=sha256:f4f909f4dde413dec435a44b0894956d55bb928ded7d6e3c726556ca4c796e84 \ + --hash=sha256:f976234e20ab2785f54224bcdafa027674e23663b132fa3ca0caa291a6cfbde7 \ + --hash=sha256:f9cebda093c2f6bfed88f1c17cdade09d4d96096421b344026feee236532d4de + # via + # -r requirements.in + # gcp-docuploader + # gcp-releasetool + # google-api-core + # google-cloud-storage + # googleapis-common-protos +pyasn1==0.4.8 \ + --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ + --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba + # via + # pyasn1-modules + # rsa +pyasn1-modules==0.2.8 \ + --hash=sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e \ + --hash=sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74 + # via google-auth +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via + # -r requirements.in + # cffi +pyjwt==2.4.0 \ + --hash=sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf \ + --hash=sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba + # via + # -r requirements.in + # gcp-releasetool +pyparsing==3.0.9 \ + --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ + --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc + # via + # -r requirements.in + # packaging +pyperclip==1.8.2 \ + --hash=sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57 + # via + # -r requirements.in + # gcp-releasetool +python-dateutil==2.8.2 \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 + # via + # -r requirements.in + # gcp-releasetool +requests==2.27.1 \ + --hash=sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61 \ + --hash=sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d + # via + # -r requirements.in + # gcp-releasetool + # google-api-core + # google-cloud-storage +rsa==4.9 \ + --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ + --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 + # via + # -r requirements.in + # google-auth +secretstorage==3.3.3 \ + --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ + --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 + # via keyring +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via + # -r requirements.in + # gcp-docuploader + # google-auth + # python-dateutil +typing-extensions==4.1.1 \ + --hash=sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42 \ + --hash=sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2 + # via -r requirements.in +urllib3==1.26.12 \ + --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ + --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 + # via + # -r requirements.in + # requests +zipp==3.6.0 \ + --hash=sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832 \ + --hash=sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc + # via + # -r requirements.in + # importlib-metadata \ No newline at end of file From 6852eb794819c2f7ac42313e46fa7014c5fc72a5 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 5 Dec 2022 11:19:04 -0500 Subject: [PATCH 184/201] chore: Ignore requirements file upgrades (#418) --- renovate.json | 1 + 1 file changed, 1 insertion(+) diff --git a/renovate.json b/renovate.json index e820d7bbd..0e82ced57 100644 --- a/renovate.json +++ b/renovate.json @@ -10,6 +10,7 @@ ":maintainLockFilesDisabled", ":autodetectPinVersions" ], + "ignorePaths": [".kokoro/requirements.txt"], "packageRules": [ { "packagePatterns": [ From 5132d38782c8d681bc0d759c123fef446b2e80c4 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 11:26:36 -0500 Subject: [PATCH 185/201] chore(main): release 2.3.0 (#384) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 16 ++++++++++++++++ build.gradle | 2 +- pom.xml | 2 +- versions.txt | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fe7e350e..01cbea78b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [2.3.0](https://github.com/googleapis/api-common-java/compare/v2.2.2...v2.3.0) (2022-12-05) + + +### Features + +* Next release from main branch is 2.3.0 ([#371](https://github.com/googleapis/api-common-java/issues/371)) ([9f6f62d](https://github.com/googleapis/api-common-java/commit/9f6f62d1a32ee0b9c02065fe3752c2cd9d711038)) + + +### Dependencies + +* Update auto-value.version to v1.10.1 ([#378](https://github.com/googleapis/api-common-java/issues/378)) ([d44ba0b](https://github.com/googleapis/api-common-java/commit/d44ba0b7b15ef910ad7caba607d0d84edac2611b)) +* Update dependency com.google.auto.value:auto-value to v1.10.1 ([#380](https://github.com/googleapis/api-common-java/issues/380)) ([96eb7d6](https://github.com/googleapis/api-common-java/commit/96eb7d67c06fcd2e43dc6a2d332e9ad8e5fec7eb)) +* Update dependency com.google.auto.value:auto-value-annotations to v1.10.1 ([#381](https://github.com/googleapis/api-common-java/issues/381)) ([fb33ae8](https://github.com/googleapis/api-common-java/commit/fb33ae8ab0810dde5e33400309b4e632e04f4e0b)) +* Update dependency com.google.errorprone:error_prone_annotations to v2.16 ([#382](https://github.com/googleapis/api-common-java/issues/382)) ([da19378](https://github.com/googleapis/api-common-java/commit/da1937834bcfa9edfe2fa642211478fed54e5e61)) +* Update dependency gradle to v6.9.3 ([#379](https://github.com/googleapis/api-common-java/issues/379)) ([3cbb296](https://github.com/googleapis/api-common-java/commit/3cbb296485c5f6a5483aa15573c563e97436e13a)) + ## [2.2.2](https://github.com/googleapis/api-common-java/compare/v2.2.1...v2.2.2) (2022-08-04) diff --git a/build.gradle b/build.gradle index 7907f0104..320b6d77f 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.2.3-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.3.0" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/pom.xml b/pom.xml index 7b308d98e..162b0c134 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.google.api api-common jar - 2.2.3-SNAPSHOT + 2.3.0 API Common https://github.com/googleapis/api-common-java Common utilities for Google APIs in Java diff --git a/versions.txt b/versions.txt index cf199bbc1..4893b96e8 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.2.2:2.2.3-SNAPSHOT +api-common:2.3.0:2.3.0 From ed4ecc52d5ed85f17267a6164f42058b3f2c6307 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:14:13 -0500 Subject: [PATCH 186/201] chore(main): release 2.3.1-SNAPSHOT (#419) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- build.gradle | 2 +- pom.xml | 2 +- versions.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 320b6d77f..3bdf500f7 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.3.0" // {x-version-update:api-common:current} +project.version = "2.3.1-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/pom.xml b/pom.xml index 162b0c134..559be3ece 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.google.api api-common jar - 2.3.0 + 2.3.1-SNAPSHOT API Common https://github.com/googleapis/api-common-java Common utilities for Google APIs in Java diff --git a/versions.txt b/versions.txt index 4893b96e8..dce00bdbf 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.3.0:2.3.0 +api-common:2.3.0:2.3.1-SNAPSHOT From b3454109b3a0e043dc8fa64c75b4514b29505e93 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 6 Dec 2022 16:35:22 +0100 Subject: [PATCH 187/201] build(deps): update dependency com.google.cloud:google-cloud-shared-config to v1.5.5 (#390) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 559be3ece..b44b7ecec 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.google.cloud google-cloud-shared-config - 1.5.4 + 1.5.5 From 1862611d8b5cff69288380fe567e6ce033148c55 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 6 Dec 2022 10:55:50 -0500 Subject: [PATCH 188/201] chore: Use Java11 for release (#420) --- .kokoro/release/common.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg index adb59b9d9..3845a6665 100644 --- a/.kokoro/release/common.cfg +++ b/.kokoro/release/common.cfg @@ -9,7 +9,7 @@ build_file: "api-common-java/.kokoro/trampoline.sh" # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java8" + value: "gcr.io/cloud-devrel-kokoro-resources/java11" } before_action { From dc41e6fac7e26ce24e1fbada5926f0286f7882ea Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 13:09:08 -0500 Subject: [PATCH 189/201] chore(main): release 2.3.1 (#427) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ build.gradle | 2 +- pom.xml | 2 +- versions.txt | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01cbea78b..8922e5703 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.3.1](https://github.com/googleapis/api-common-java/compare/v2.3.0...v2.3.1) (2022-12-06) + + +### Bug Fixes + +* Build with JDK11 and target JDK8 ([1862611](https://github.com/googleapis/api-common-java/commit/1862611d8b5cff69288380fe567e6ce033148c55)) + ## [2.3.0](https://github.com/googleapis/api-common-java/compare/v2.2.2...v2.3.0) (2022-12-05) diff --git a/build.gradle b/build.gradle index 3bdf500f7..1c64c983d 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.3.1-SNAPSHOT" // {x-version-update:api-common:current} +project.version = "2.3.1" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/pom.xml b/pom.xml index b44b7ecec..7a9909688 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.google.api api-common jar - 2.3.1-SNAPSHOT + 2.3.1 API Common https://github.com/googleapis/api-common-java Common utilities for Google APIs in Java diff --git a/versions.txt b/versions.txt index dce00bdbf..fdc2d8c71 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.3.0:2.3.1-SNAPSHOT +api-common:2.3.1:2.3.1 From 3bcc43916ac1197319cca69d6452bfad8c1b0ddf Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 9 Dec 2022 14:03:41 -0500 Subject: [PATCH 190/201] chore: Update docs to reference Maven (#429) * chore: Update docs to reference maven * chore: Update README --- README.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 347f12c10..765a6d28c 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,23 @@ APIs. It currently contains the following packages: formatted as Google API resource names. - resourcenames: Resource Name library used by generated resource name types +> For new and existing Developers/ Contributors: +> +> In December 2022, api-common-java's build tool has been migrated from gradle to maven. +> Gradle related files are no longer being maintained and will be removed. +> +> The artifact coordinates in Maven Central (`{{ group_id }}:{{ artifact_id }}`) remain the same. + + Java Versions ------------- -Java 7 or above is required for using this library. +Java 8 or above is required for using this library. + +To build this project, JDK 11 or above is required. +The build produces Java bytecode targeted for Java 8. + +The project uses Maven to build. Contributing ------------ @@ -57,14 +70,14 @@ Build and Test To build this library, please do the following. ```sh -./gradlew build +mvn clean install ``` After making changes, run the following commands to format your code and test your changes. ```sh -./gradlew googleJavaFormat -./gradlew test +mvn fmt:format +mvn test ``` [CONTRIBUTING]:https://github.com/googleapis/api-common-java/blob/main/CONTRIBUTING.md From ee25e9e9b9295989a65e29dbf289c226a033b9c7 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 3 Jan 2023 15:46:24 +0100 Subject: [PATCH 191/201] deps: update dependency jacoco to v0.8.8 (#435) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [jacoco](http://jacoco.org) ([source](https://togithub.com/jacoco/jacoco)) | `0.8.7` -> `0.8.8` | [![age](https://badges.renovateapi.com/packages/maven/jacoco/0.8.8/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/jacoco/0.8.8/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/jacoco/0.8.8/compatibility-slim/0.8.7)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/jacoco/0.8.8/confidence-slim/0.8.7)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
jacoco/jacoco ### [`v0.8.8`](https://togithub.com/jacoco/jacoco/releases/tag/v0.8.8): 0.8.8 #### New Features - JaCoCo now officially supports Java 17 and 18 (GitHub [#​1282](https://togithub.com/jacoco/jacoco/issues/1282), [#​1198](https://togithub.com/jacoco/jacoco/issues/1198)). - Experimental support for Java 19 class files (GitHub [#​1264](https://togithub.com/jacoco/jacoco/issues/1264)). - Part of bytecode generated by the Java compilers for assert statement is filtered out during generation of report (GitHub [#​1196](https://togithub.com/jacoco/jacoco/issues/1196)). - Branch added by the Kotlin compiler version 1.6.0 and above for "unsafe" cast operator is filtered out during generation of report (GitHub [#​1266](https://togithub.com/jacoco/jacoco/issues/1266)). - Improved support for multiple JaCoCo runtimes in the same VM (GitHub [#​1057](https://togithub.com/jacoco/jacoco/issues/1057)). #### Fixed bugs - Fixed `NullPointerException` during filtering (GitHub [#​1189](https://togithub.com/jacoco/jacoco/issues/1189)). - Fix range for debug symbols of method parameters (GitHub [#​1246](https://togithub.com/jacoco/jacoco/issues/1246)). #### Non-functional Changes - JaCoCo now depends on ASM 9.2 (GitHub [#​1206](https://togithub.com/jacoco/jacoco/issues/1206)). - Messages of exceptions occurring during analysis or instrumentation now include JaCoCo version (GitHub [#​1217](https://togithub.com/jacoco/jacoco/issues/1217)).
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1c64c983d..88674ec55 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ sourceCompatibility = 1.8 targetCompatibility = 1.8 jacoco { - toolVersion = "0.8.7" + toolVersion = "0.8.8" } // Dependencies From 42b3e8a8baed0d5847b4f5988d614ba904969726 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 3 Jan 2023 15:52:13 +0100 Subject: [PATCH 192/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.17.0 (#434) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.16` -> `2.17.0` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.17.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.17.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.17.0/compatibility-slim/2.16)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.17.0/confidence-slim/2.16)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.17.0`](https://togithub.com/google/error-prone/releases/tag/v2.17.0): Error Prone 2.17.0 New Checkers: - [`AvoidObjectArrays`](https://errorprone.info/bugpattern/AvoidObjectArrays) - [`Finalize`](https://errorprone.info/bugpattern/Finalize) - [`IgnoredPureGetter`](https://errorprone.info/bugpattern/IgnoredPureGetter) - [`ImpossibleNullComparison`](https://errorprone.info/bugpattern/ProtoFieldNullComparison) - [`MathAbsoluteNegative`](https://errorprone.info/bugpattern/MathAbsoluteNegative) - [`NewFileSystem`](https://errorprone.info/bugpattern/NewFileSystem) - [`StatementSwitchToExpressionSwitch`](https://errorprone.info/bugpattern/StatementSwitchToExpressionSwitch) - [`UnqualifiedYield`](https://errorprone.info/bugpattern/UnqualifiedYield) Fixed issues: [#​2321](https://togithub.com/google/error-prone/issues/2321), [#​3144](https://togithub.com/google/error-prone/issues/3144), [#​3297](https://togithub.com/google/error-prone/issues/3297), [#​3428](https://togithub.com/google/error-prone/issues/3428), [#​3437](https://togithub.com/google/error-prone/issues/3437), [#​3462](https://togithub.com/google/error-prone/issues/3462), [#​3482](https://togithub.com/google/error-prone/issues/3482), [#​3494](https://togithub.com/google/error-prone/issues/3494) **Full Changelog**: https://togithub.com/google/error-prone/compare/v2.16...v2.17.0
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 88674ec55..4568c7860 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.16', + error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.17.0', // Testing junit: 'junit:junit:4.13.2', diff --git a/pom.xml b/pom.xml index 7a9909688..945794166 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ com.google.errorprone error_prone_annotations - 2.16 + 2.17.0 compile From 127f9462584ee1b39e965bbdf4f121055ef1bed9 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 3 Jan 2023 15:56:13 +0100 Subject: [PATCH 193/201] deps: update dependency com.google.errorprone:error_prone_annotations to v2.17.0 - abandoned (#437) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.16` -> `2.17.0` | [![age](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.17.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.17.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.17.0/compatibility-slim/2.16)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.errorprone:error_prone_annotations/2.17.0/confidence-slim/2.16)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/error-prone ### [`v2.17.0`](https://togithub.com/google/error-prone/releases/tag/v2.17.0): Error Prone 2.17.0 New Checkers: - [`AvoidObjectArrays`](https://errorprone.info/bugpattern/AvoidObjectArrays) - [`Finalize`](https://errorprone.info/bugpattern/Finalize) - [`IgnoredPureGetter`](https://errorprone.info/bugpattern/IgnoredPureGetter) - [`ImpossibleNullComparison`](https://errorprone.info/bugpattern/ProtoFieldNullComparison) - [`MathAbsoluteNegative`](https://errorprone.info/bugpattern/MathAbsoluteNegative) - [`NewFileSystem`](https://errorprone.info/bugpattern/NewFileSystem) - [`StatementSwitchToExpressionSwitch`](https://errorprone.info/bugpattern/StatementSwitchToExpressionSwitch) - [`UnqualifiedYield`](https://errorprone.info/bugpattern/UnqualifiedYield) Fixed issues: [#​2321](https://togithub.com/google/error-prone/issues/2321), [#​3144](https://togithub.com/google/error-prone/issues/3144), [#​3297](https://togithub.com/google/error-prone/issues/3297), [#​3428](https://togithub.com/google/error-prone/issues/3428), [#​3437](https://togithub.com/google/error-prone/issues/3437), [#​3462](https://togithub.com/google/error-prone/issues/3462), [#​3482](https://togithub.com/google/error-prone/issues/3482), [#​3494](https://togithub.com/google/error-prone/issues/3494) **Full Changelog**: https://togithub.com/google/error-prone/compare/v2.16...v2.17.0
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). From abbbb81d027a059a9b321d7d05faf9fb1938ac3c Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 3 Jan 2023 15:58:13 +0100 Subject: [PATCH 194/201] deps: update dependency com.google.auto.value:auto-value-annotations to v1.10.1 (#436) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.auto.value:auto-value-annotations](https://togithub.com/google/auto/tree/master/value) ([source](https://togithub.com/google/auto)) | `1.9` -> `1.10.1` | [![age](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.10.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.10.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.10.1/compatibility-slim/1.9)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/com.google.auto.value:auto-value-annotations/1.10.1/confidence-slim/1.9)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/api-common-java). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4568c7860..defe33162 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ ext { libraries = [ javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', auto_value: 'com.google.auto.value:auto-value:1.10.1', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.9', + auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.10.1', guava: 'com.google.guava:guava:31.1-jre', jsr305: 'com.google.code.findbugs:jsr305:3.0.2', error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.17.0', From c9a6ae648a75bb50ba4f106c015e5564d3c447d8 Mon Sep 17 00:00:00 2001 From: Deepankar Dixit <90280028+ddixit14@users.noreply.github.com> Date: Thu, 12 Jan 2023 13:30:28 -0500 Subject: [PATCH 195/201] chore: Adding note for migrated repo (#440) * chore: Adding note for migrated repo * Update README.md --- .github/ISSUE_TEMPLATE/bug_report.md | 1 + .github/ISSUE_TEMPLATE/feature_request.md | 1 + README.md | 3 +++ 3 files changed, 5 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 4924b71dd..affd18d5c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -3,6 +3,7 @@ name: Bug report about: Create a report to help us improve --- +This library has moved to [gapic-generator-java/api-common-java](https://github.com/googleapis/gapic-generator-java/tree/main/api-common-java) This repository will be archived in the future. Thanks for stopping by to let us know something could be better! diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 754e30c68..12ac8e6f4 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -3,6 +3,7 @@ name: Feature request about: Suggest an idea for this library --- +This library has moved to [gapic-generator-java/api-common-java](https://github.com/googleapis/gapic-generator-java/tree/main/api-common-java) This repository will be archived in the future. Thanks for stopping by to let us know something could be better! diff --git a/README.md b/README.md index 765a6d28c..0f12dc1a8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ API Common for Java [![Build Status](https://travis-ci.org/googleapis/api-common-java.svg?branch=main)](https://travis-ci.org/googleapis/api-common-java) +🚌 In January 2023, this library has moved to [gapic-generator-java/api-common-java](https://github.com/googleapis/gapic-generator-java/tree/main/api-common-java). This repository will be archived in the future. Future releases will appear in the new repository (https://github.com/googleapis/gapic-generator-java/releases). +The Maven artifact coordinates (com.google.api:api-common) remain the same. + - [Documentation](https://googleapis.dev/java/api-common/latest/index.html) API Common for Java is a library for foundational types relating to Google From eb445dd5abc0f25793627197c6641a1e79db6a68 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 7 Mar 2023 03:12:27 +0000 Subject: [PATCH 196/201] deps: update dependency gradle to v6.9.4 (#444) * deps: update dependency gradle to v6.9.4 * disable renovate --------- Co-authored-by: Tomo Suzuki --- gradle/wrapper/gradle-wrapper.properties | 2 +- renovate.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d355f4c4f..53b9e3802 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/renovate.json b/renovate.json index 0e82ced57..39f2c7152 100644 --- a/renovate.json +++ b/renovate.json @@ -1,4 +1,5 @@ { + "enabled": false, "extends": [ ":separateMajorReleases", ":combinePatchMinorReleases", From 988a3049e1639e22aafca64d8ce94c5a920b15db Mon Sep 17 00:00:00 2001 From: ddixit14 Date: Wed, 26 Apr 2023 11:59:24 -0400 Subject: [PATCH 197/201] chore: Disabling release-please --- .github/release-please.yml | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 .github/release-please.yml diff --git a/.github/release-please.yml b/.github/release-please.yml deleted file mode 100644 index 8b034773a..000000000 --- a/.github/release-please.yml +++ /dev/null @@ -1,24 +0,0 @@ -releaseType: java-yoshi -bumpMinorPreMajor: true -handleGHRelease: true -branches: - - releaseType: java-lts - bumpMinorPreMajor: true - branch: 1.10.1-sp - handleGHRelease: true - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-yoshi - branch: java7 - - releaseType: java-backport - bumpMinorPreMajor: true - handleGHRelease: true - branch: 2.0.x - - releaseType: java-backport - bumpMinorPreMajor: true - handleGHRelease: true - branch: 2.1.x - - releaseType: java-backport - bumpMinorPreMajor: true - handleGHRelease: true - branch: 2.2.x From 269fb34b707a473795f2e8d4b6efd0d2b64f3513 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 18:20:12 +0000 Subject: [PATCH 198/201] chore(main): release 2.3.2-SNAPSHOT (#428) :robot: I have created a release *beep* *boop* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please). --- build.gradle | 2 +- pom.xml | 2 +- versions.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index defe33162..21fa55b9f 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'io.github.gradle-nexus.publish-plugin' group = "com.google.api" archivesBaseName = "api-common" -project.version = "2.3.1" // {x-version-update:api-common:current} +project.version = "2.3.2-SNAPSHOT" // {x-version-update:api-common:current} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/pom.xml b/pom.xml index 945794166..e09578370 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.google.api api-common jar - 2.3.1 + 2.3.2-SNAPSHOT API Common https://github.com/googleapis/api-common-java Common utilities for Google APIs in Java diff --git a/versions.txt b/versions.txt index fdc2d8c71..de847d6ca 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -api-common:2.3.1:2.3.1 +api-common:2.3.1:2.3.2-SNAPSHOT From a7966f5faab23de2b9193f6aa3fa07873d65e16a Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Tue, 6 Jun 2023 19:42:19 -0700 Subject: [PATCH 199/201] build: enable multi-scm for releases (#447) --- .github/release-trigger.yml | 3 +- .kokoro/coerce_logs.sh | 42 --- .kokoro/common.cfg | 13 - .kokoro/populate-secrets.sh | 43 --- .kokoro/release/common.cfg | 49 --- .kokoro/release/common.sh | 52 --- .kokoro/release/publish_javadoc11.cfg | 30 -- .kokoro/release/publish_javadoc11.sh | 66 ---- .kokoro/release/stage.cfg | 19 -- .kokoro/release/stage.sh | 50 --- .kokoro/requirements.in | 34 -- .kokoro/requirements.txt | 455 -------------------------- .kokoro/trampoline.sh | 26 -- 13 files changed, 2 insertions(+), 880 deletions(-) delete mode 100755 .kokoro/coerce_logs.sh delete mode 100644 .kokoro/common.cfg delete mode 100755 .kokoro/populate-secrets.sh delete mode 100644 .kokoro/release/common.cfg delete mode 100755 .kokoro/release/common.sh delete mode 100644 .kokoro/release/publish_javadoc11.cfg delete mode 100755 .kokoro/release/publish_javadoc11.sh delete mode 100644 .kokoro/release/stage.cfg delete mode 100755 .kokoro/release/stage.sh delete mode 100644 .kokoro/requirements.in delete mode 100644 .kokoro/requirements.txt delete mode 100644 .kokoro/trampoline.sh diff --git a/.github/release-trigger.yml b/.github/release-trigger.yml index 7fe362257..1d1a3361c 100644 --- a/.github/release-trigger.yml +++ b/.github/release-trigger.yml @@ -1 +1,2 @@ -enabled: true \ No newline at end of file +enabled: true +multiScmName: api-common-java diff --git a/.kokoro/coerce_logs.sh b/.kokoro/coerce_logs.sh deleted file mode 100755 index 7b153733d..000000000 --- a/.kokoro/coerce_logs.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This script finds and moves sponge logs so that they can be found by placer -# and are not flagged as flaky by sponge. - -set -eo pipefail - -## Get the directory of the build script -scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}")) -## cd to the parent directory, i.e. the root of the git repo -cd ${scriptDir}/.. - -if [ -z "${KOKORO_JOB_NAME}" ]; then - job="${JOB_NAME}" -else - job=$(basename ${KOKORO_JOB_NAME}) -fi - -echo "coercing sponge logs..." -for xml in `find . -name *-sponge_log.xml` -do - echo "processing ${xml}" - class=$(basename ${xml} | cut -d- -f2) - dir=$(dirname ${xml})/${job}/${class} - text=$(dirname ${xml})/${class}-sponge_log.txt - mkdir -p ${dir} - mv ${xml} ${dir}/sponge_log.xml - mv ${text} ${dir}/sponge_log.txt -done diff --git a/.kokoro/common.cfg b/.kokoro/common.cfg deleted file mode 100644 index 083db40dd..000000000 --- a/.kokoro/common.cfg +++ /dev/null @@ -1,13 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Download trampoline resources. These will be in ${KOKORO_GFILE_DIR} -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# All builds use the trampoline script to run in docker. -build_file: "api-common-java/.kokoro/trampoline.sh" - -# Tell the trampoline which build file to use. -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/build.sh" -} diff --git a/.kokoro/populate-secrets.sh b/.kokoro/populate-secrets.sh deleted file mode 100755 index f52514257..000000000 --- a/.kokoro/populate-secrets.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# Copyright 2020 Google LLC. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -function now { date +"%Y-%m-%d %H:%M:%S" | tr -d '\n' ;} -function msg { println "$*" >&2 ;} -function println { printf '%s\n' "$(now) $*" ;} - - -# Populates requested secrets set in SECRET_MANAGER_KEYS from service account: -# kokoro-trampoline@cloud-devrel-kokoro-resources.iam.gserviceaccount.com -SECRET_LOCATION="${KOKORO_GFILE_DIR}/secret_manager" -msg "Creating folder on disk for secrets: ${SECRET_LOCATION}" -mkdir -p ${SECRET_LOCATION} -for key in $(echo ${SECRET_MANAGER_KEYS} | sed "s/,/ /g") -do - msg "Retrieving secret ${key}" - docker run --entrypoint=gcloud \ - --volume=${KOKORO_GFILE_DIR}:${KOKORO_GFILE_DIR} \ - gcr.io/google.com/cloudsdktool/cloud-sdk \ - secrets versions access latest \ - --project cloud-devrel-kokoro-resources \ - --secret ${key} > \ - "${SECRET_LOCATION}/${key}" - if [[ $? == 0 ]]; then - msg "Secret written to ${SECRET_LOCATION}/${key}" - else - msg "Error retrieving secret ${key}" - fi -done diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg deleted file mode 100644 index 3845a6665..000000000 --- a/.kokoro/release/common.cfg +++ /dev/null @@ -1,49 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Download trampoline resources. -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# Use the trampoline script to run in docker. -build_file: "api-common-java/.kokoro/trampoline.sh" - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java11" -} - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 70247 - keyname: "maven-gpg-keyring" - } - } -} - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 70247 - keyname: "maven-gpg-passphrase" - } - } -} - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 70247 - keyname: "maven-gpg-pubkeyring" - } - } -} - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 70247 - keyname: "sonatype-credentials" - } - } -} diff --git a/.kokoro/release/common.sh b/.kokoro/release/common.sh deleted file mode 100755 index e96a6f968..000000000 --- a/.kokoro/release/common.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -# Get secrets from keystore and set and environment variables -setup_environment_secrets() { - export GPG_PASSPHRASE=$(cat ${KOKORO_KEYSTORE_DIR}/70247_maven-gpg-passphrase) - export GPG_TTY=$(tty) - export GPG_HOMEDIR=/gpg - mkdir $GPG_HOMEDIR - mv ${KOKORO_KEYSTORE_DIR}/70247_maven-gpg-pubkeyring $GPG_HOMEDIR/pubring.gpg - mv ${KOKORO_KEYSTORE_DIR}/70247_maven-gpg-keyring $GPG_HOMEDIR/secring.gpg - export GPG_KEY_ID=$(echo -n $(gpg --with-colons ${GPG_HOMEDIR}/pubring.gpg | awk -F':' '/pub/{ print $5 }')) - export SONATYPE_USERNAME=$(cat ${KOKORO_KEYSTORE_DIR}/70247_sonatype-credentials | cut -f1 -d'|') - export SONATYPE_PASSWORD=$(cat ${KOKORO_KEYSTORE_DIR}/70247_sonatype-credentials | cut -f2 -d'|') -} - -create_settings_xml_file() { - echo " - - - - ossrh - ${SONATYPE_USERNAME} - ${SONATYPE_PASSWORD} - - - sonatype-nexus-staging - ${SONATYPE_USERNAME} - ${SONATYPE_PASSWORD} - - - sonatype-nexus-snapshots - ${SONATYPE_USERNAME} - ${SONATYPE_PASSWORD} - - -" > $1 -} diff --git a/.kokoro/release/publish_javadoc11.cfg b/.kokoro/release/publish_javadoc11.cfg deleted file mode 100644 index 2d99e2448..000000000 --- a/.kokoro/release/publish_javadoc11.cfg +++ /dev/null @@ -1,30 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# cloud-rad production -env_vars: { - key: "STAGING_BUCKET_V2" - value: "docs-staging-v2" -} - -# Configure the docker image for kokoro-trampoline -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/java11" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/publish_javadoc11.sh" -} - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "docuploader_service_account" - } - } -} - -# Downloads docfx doclet resource. This will be in ${KOKORO_GFILE_DIR}/ -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/docfx" diff --git a/.kokoro/release/publish_javadoc11.sh b/.kokoro/release/publish_javadoc11.sh deleted file mode 100755 index 73b61d254..000000000 --- a/.kokoro/release/publish_javadoc11.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -if [[ -z "${CREDENTIALS}" ]]; then - CREDENTIALS=${KOKORO_KEYSTORE_DIR}/73713_docuploader_service_account -fi - -if [[ -z "${STAGING_BUCKET_V2}" ]]; then - echo "Need to set STAGING_BUCKET environment variable" - exit 1 -fi - -# work from the git root directory -pushd $(dirname "$0")/../../ - -# install docuploader package -python3 -m pip install --require-hashes -r .kokoro/requirements.txt - -NAME=api-common -VERSION=$(grep ${NAME}: versions.txt | cut -d: -f3) - -# build the docs -mvn -B -ntp \ - -P docFX \ - -Dclirr.skip=true \ - -Denforcer.skip=true \ - -Dcheckstyle.skip=true \ - -Dflatten.skip=true \ - -Danimal.sniffer.skip=true \ - javadoc:aggregate - -# copy README to docfx-yml dir and rename index.md -cp README.md target/docfx-yml/index.md - -# copy CHANGELOG to docfx-yml dir and rename history.md -cp CHANGELOG.md target/docfx-yml/history.md - -pushd target/docfx-yml/ - -# create metadata -python3 -m docuploader create-metadata \ - --name ${NAME} \ - --version ${VERSION} \ - --language java - -# upload docs -python3 -m docuploader upload . \ - --credentials ${CREDENTIALS} \ - --staging-bucket ${STAGING_BUCKET_V2} \ - --destination-prefix docfx - -popd \ No newline at end of file diff --git a/.kokoro/release/stage.cfg b/.kokoro/release/stage.cfg deleted file mode 100644 index d42938cc5..000000000 --- a/.kokoro/release/stage.cfg +++ /dev/null @@ -1,19 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/api-common-java/.kokoro/release/stage.sh" -} - -# Need to save the properties file -action { - define_artifacts { - regex: "github/api-common-java/target/nexus-staging/staging/*.properties" - strip_prefix: "github/api-common-java" - } -} - -env_vars: { - key: "SECRET_MANAGER_KEYS" - value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem" -} diff --git a/.kokoro/release/stage.sh b/.kokoro/release/stage.sh deleted file mode 100755 index ba1cf7e20..000000000 --- a/.kokoro/release/stage.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -if [[ -n "${AUTORELEASE_PR}" ]] -then - # Start the releasetool reporter - python3 -m pip install gcp-releasetool - python3 -m releasetool publish-reporter-script > /tmp/publisher-script; source /tmp/publisher-script -fi - -source $(dirname "$0")/common.sh -MAVEN_SETTINGS_FILE=$(realpath $(dirname "$0")/../../)/settings.xml -pushd $(dirname "$0")/../../ - -setup_environment_secrets -create_settings_xml_file "settings.xml" - -mvn clean deploy -B \ - -DskipTests=true \ - -Dclirr.skip=true \ - --settings ${MAVEN_SETTINGS_FILE} \ - -Dgpg.executable=gpg \ - -Dgpg.passphrase=${GPG_PASSPHRASE} \ - -Dgpg.homedir=${GPG_HOMEDIR} \ - -P release - -# The job triggered by Release Please (release-trigger) has this AUTORELEASE_PR -# environment variable. Fusion also lets us to specify this variable. -if [[ -n "${AUTORELEASE_PR}" ]] -then - mvn nexus-staging:release -B \ - -DperformRelease=true \ - --settings=${MAVEN_SETTINGS_FILE} -else - echo "AUTORELEASE_PR is not set. Not releasing." -fi \ No newline at end of file diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in deleted file mode 100644 index 924f94ae6..000000000 --- a/.kokoro/requirements.in +++ /dev/null @@ -1,34 +0,0 @@ -gcp-docuploader==0.6.3 -google-crc32c==1.3.0 -googleapis-common-protos==1.56.3 -gcp-releasetool==1.9.1 -cryptography==38.0.3 -cachetools==4.2.4 -cffi==1.15.1 -jeepney==0.7.1 -jinja2==3.0.3 -markupsafe==2.0.1 -keyring==23.4.1 -packaging==21.3 -protobuf==3.19.5 -pyjwt==2.4.0 -pyparsing==3.0.9 -pycparser==2.21 -pyperclip==1.8.2 -python-dateutil==2.8.2 -requests==2.27.1 -certifi==2022.9.24 -importlib-metadata==4.8.3 -zipp==3.6.0 -google_api_core==2.8.2 -google-cloud-storage==2.0.0 -google-resumable-media==2.3.3 -google-cloud-core==2.3.1 -typing-extensions==4.1.1 -urllib3==1.26.12 -zipp==3.6.0 -rsa==4.9 -six==1.16.0 -attrs==22.1.0 -google-auth==2.14.1 -idna==3.4 \ No newline at end of file diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt deleted file mode 100644 index 1271b9224..000000000 --- a/.kokoro/requirements.txt +++ /dev/null @@ -1,455 +0,0 @@ -# -# This file is autogenerated by pip-compile with python 3.10 -# To update, run: -# -# pip-compile --generate-hashes requirements.in -# -attrs==22.1.0 \ - --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ - --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c - # via - # -r requirements.in - # gcp-releasetool -cachetools==4.2.4 \ - --hash=sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693 \ - --hash=sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1 - # via - # -r requirements.in - # google-auth -certifi==2022.9.24 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 - # via - # -r requirements.in - # requests -cffi==1.15.1 \ - --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ - --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ - --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ - --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ - --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ - --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ - --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ - --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ - --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ - --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ - --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ - --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ - --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ - --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ - --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ - --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ - --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ - --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ - --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ - --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ - --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ - --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ - --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ - --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ - --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ - --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ - --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ - --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ - --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ - --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ - --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ - --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ - --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ - --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ - --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ - --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ - --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ - --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ - --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ - --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ - --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ - --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ - --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ - --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ - --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ - --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ - --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ - --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ - --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ - --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ - --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ - --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ - --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ - --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ - --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ - --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ - --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ - --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ - --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ - --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ - --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ - --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ - --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ - --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 - # via - # -r requirements.in - # cryptography -charset-normalizer==2.0.12 \ - --hash=sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597 \ - --hash=sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df - # via requests -click==8.0.4 \ - --hash=sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1 \ - --hash=sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb - # via - # gcp-docuploader - # gcp-releasetool -colorlog==6.7.0 \ - --hash=sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662 \ - --hash=sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5 - # via gcp-docuploader -cryptography==38.0.3 \ - --hash=sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d \ - --hash=sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd \ - --hash=sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146 \ - --hash=sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7 \ - --hash=sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436 \ - --hash=sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0 \ - --hash=sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828 \ - --hash=sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b \ - --hash=sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55 \ - --hash=sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36 \ - --hash=sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50 \ - --hash=sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2 \ - --hash=sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a \ - --hash=sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8 \ - --hash=sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0 \ - --hash=sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548 \ - --hash=sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320 \ - --hash=sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748 \ - --hash=sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249 \ - --hash=sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959 \ - --hash=sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f \ - --hash=sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0 \ - --hash=sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd \ - --hash=sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220 \ - --hash=sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c \ - --hash=sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722 - # via - # -r requirements.in - # gcp-releasetool - # secretstorage -gcp-docuploader==0.6.3 \ - --hash=sha256:ba8c9d76b3bbac54b0311c503a373b00edc2dc02d6d54ea9507045adb8e870f7 \ - --hash=sha256:c0f5aaa82ce1854a386197e4e359b120ad6d4e57ae2c812fce42219a3288026b - # via -r requirements.in -gcp-releasetool==1.9.1 \ - --hash=sha256:952f4055d5d986b070ae2a71c4410b250000f9cc5a1e26398fcd55a5bbc5a15f \ - --hash=sha256:d0d3c814a97c1a237517e837d8cfa668ced8df4b882452578ecef4a4e79c583b - # via -r requirements.in -google-api-core==2.8.2 \ - --hash=sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc \ - --hash=sha256:93c6a91ccac79079ac6bbf8b74ee75db970cc899278b97d53bc012f35908cf50 - # via - # -r requirements.in - # google-cloud-core - # google-cloud-storage -google-auth==2.14.1 \ - --hash=sha256:f5d8701633bebc12e0deea4df8abd8aff31c28b355360597f7f2ee60f2e4d016 - # via - # -r requirements.in - # gcp-releasetool - # google-api-core - # google-cloud-core - # google-cloud-storage -google-cloud-core==2.3.1 \ - --hash=sha256:113ba4f492467d5bd442c8d724c1a25ad7384045c3178369038840ecdd19346c \ - --hash=sha256:34334359cb04187bdc80ddcf613e462dfd7a3aabbc3fe4d118517ab4b9303d53 - # via - # -r requirements.in - # google-cloud-storage -google-cloud-storage==2.0.0 \ - --hash=sha256:a57a15aead0f9dfbd4381f1bfdbe8bf89818a4bd75bab846cafcefb2db846c47 \ - --hash=sha256:ec4be60bb223a3a960f0d01697d849b86d91cad815a84915a32ed3635e93a5e7 - # via - # -r requirements.in - # gcp-docuploader -google-crc32c==1.3.0 \ - --hash=sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3 \ - --hash=sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6 \ - --hash=sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206 \ - --hash=sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422 \ - --hash=sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a \ - --hash=sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e \ - --hash=sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0 \ - --hash=sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df \ - --hash=sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407 \ - --hash=sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea \ - --hash=sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48 \ - --hash=sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713 \ - --hash=sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3 \ - --hash=sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267 \ - --hash=sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829 \ - --hash=sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2 \ - --hash=sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a \ - --hash=sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183 \ - --hash=sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942 \ - --hash=sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59 \ - --hash=sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b \ - --hash=sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd \ - --hash=sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c \ - --hash=sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02 \ - --hash=sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328 \ - --hash=sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08 \ - --hash=sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f \ - --hash=sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168 \ - --hash=sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318 \ - --hash=sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d \ - --hash=sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73 \ - --hash=sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4 \ - --hash=sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812 \ - --hash=sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3 \ - --hash=sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d \ - --hash=sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e \ - --hash=sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217 \ - --hash=sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e \ - --hash=sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f \ - --hash=sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125 \ - --hash=sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4 \ - --hash=sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b \ - --hash=sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3 - # via - # -r requirements.in - # google-resumable-media -google-resumable-media==2.3.3 \ - --hash=sha256:27c52620bd364d1c8116eaac4ea2afcbfb81ae9139fb3199652fcac1724bfb6c \ - --hash=sha256:5b52774ea7a829a8cdaa8bd2d4c3d4bc660c91b30857ab2668d0eb830f4ea8c5 - # via - # -r requirements.in - # google-cloud-storage -googleapis-common-protos==1.56.3 \ - --hash=sha256:6f1369b58ed6cf3a4b7054a44ebe8d03b29c309257583a2bbdc064cd1e4a1442 \ - --hash=sha256:87955d7b3a73e6e803f2572a33179de23989ebba725e05ea42f24838b792e461 - # via - # -r requirements.in - # google-api-core -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 - # via - # -r requirements.in - # requests -importlib-metadata==4.8.3 \ - --hash=sha256:65a9576a5b2d58ca44d133c42a241905cc45e34d2c06fd5ba2bafa221e5d7b5e \ - --hash=sha256:766abffff765960fcc18003801f7044eb6755ffae4521c8e8ce8e83b9c9b0668 - # via - # -r requirements.in - # keyring -jeepney==0.7.1 \ - --hash=sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac \ - --hash=sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f - # via - # -r requirements.in - # keyring - # secretstorage -jinja2==3.0.3 \ - --hash=sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8 \ - --hash=sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7 - # via - # -r requirements.in - # gcp-releasetool -keyring==23.4.1 \ - --hash=sha256:17e49fb0d6883c2b4445359434dba95aad84aabb29bbff044ad0ed7100232eca \ - --hash=sha256:89cbd74d4683ed164c8082fb38619341097741323b3786905c6dac04d6915a55 - # via - # -r requirements.in - # gcp-releasetool -markupsafe==2.0.1 \ - --hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \ - --hash=sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64 \ - --hash=sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b \ - --hash=sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194 \ - --hash=sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567 \ - --hash=sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff \ - --hash=sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724 \ - --hash=sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74 \ - --hash=sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646 \ - --hash=sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35 \ - --hash=sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6 \ - --hash=sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a \ - --hash=sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6 \ - --hash=sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad \ - --hash=sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26 \ - --hash=sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38 \ - --hash=sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac \ - --hash=sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7 \ - --hash=sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6 \ - --hash=sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047 \ - --hash=sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75 \ - --hash=sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f \ - --hash=sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b \ - --hash=sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135 \ - --hash=sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8 \ - --hash=sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a \ - --hash=sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a \ - --hash=sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1 \ - --hash=sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9 \ - --hash=sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864 \ - --hash=sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914 \ - --hash=sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee \ - --hash=sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f \ - --hash=sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18 \ - --hash=sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8 \ - --hash=sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2 \ - --hash=sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d \ - --hash=sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b \ - --hash=sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b \ - --hash=sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86 \ - --hash=sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6 \ - --hash=sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f \ - --hash=sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb \ - --hash=sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833 \ - --hash=sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28 \ - --hash=sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e \ - --hash=sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415 \ - --hash=sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902 \ - --hash=sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f \ - --hash=sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d \ - --hash=sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9 \ - --hash=sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d \ - --hash=sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145 \ - --hash=sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066 \ - --hash=sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c \ - --hash=sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1 \ - --hash=sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a \ - --hash=sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207 \ - --hash=sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f \ - --hash=sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53 \ - --hash=sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd \ - --hash=sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134 \ - --hash=sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85 \ - --hash=sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9 \ - --hash=sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5 \ - --hash=sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94 \ - --hash=sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509 \ - --hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \ - --hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872 - # via - # -r requirements.in - # jinja2 -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 - # via - # -r requirements.in - # gcp-releasetool -protobuf==3.19.5 \ - --hash=sha256:1867f93b06a183f87696871bb8d1e99ee71dbb69d468ce1f0cc8bf3d30f982f3 \ - --hash=sha256:3c4160b601220627f7e91154e572baf5e161a9c3f445a8242d536ee3d0b7b17c \ - --hash=sha256:4ee2af7051d3b10c8a4fe6fd1a2c69f201fea36aeee7086cf202a692e1b99ee1 \ - --hash=sha256:5266c36cc0af3bb3dbf44f199d225b33da66a9a5c3bdc2b14865ad10eddf0e37 \ - --hash=sha256:5470f892961af464ae6eaf0f3099e2c1190ae8c7f36f174b89491281341f79ca \ - --hash=sha256:66d14b5b90090353efe75c9fb1bf65ef7267383034688d255b500822e37d5c2f \ - --hash=sha256:67efb5d20618020aa9596e17bfc37ca068c28ec0c1507d9507f73c93d46c9855 \ - --hash=sha256:696e6cfab94cc15a14946f2bf72719dced087d437adbd994fff34f38986628bc \ - --hash=sha256:6a02172b9650f819d01fb8e224fc69b0706458fc1ab4f1c669281243c71c1a5e \ - --hash=sha256:950abd6c00e7b51f87ae8b18a0ce4d69fea217f62f171426e77de5061f6d9850 \ - --hash=sha256:9e1d74032f56ff25f417cfe84c8147047732e5059137ca42efad20cbbd25f5e0 \ - --hash=sha256:9e42b1cf2ecd8a1bd161239e693f22035ba99905ae6d7efeac8a0546c7ec1a27 \ - --hash=sha256:9f957ef53e872d58a0afd3bf6d80d48535d28c99b40e75e6634cbc33ea42fd54 \ - --hash=sha256:a89aa0c042e61e11ade320b802d6db4ee5391d8d973e46d3a48172c1597789f8 \ - --hash=sha256:c0f80876a8ff0ae7064084ed094eb86497bd5a3812e6fc96a05318b92301674e \ - --hash=sha256:c44e3282cff74ad18c7e8a0375f407f69ee50c2116364b44492a196293e08b21 \ - --hash=sha256:d249519ba5ecf5dd6b18150c9b6bcde510b273714b696f3923ff8308fc11ae49 \ - --hash=sha256:d3973a2d58aefc7d1230725c2447ce7f86a71cbc094b86a77c6ee1505ac7cdb1 \ - --hash=sha256:dca2284378a5f2a86ffed35c6ac147d14c48b525eefcd1083e5a9ce28dfa8657 \ - --hash=sha256:e63b0b3c42e51c94add62b010366cd4979cb6d5f06158bcae8faac4c294f91e1 \ - --hash=sha256:f2b599a21c9a32e171ec29a2ac54e03297736c578698e11b099d031f79da114b \ - --hash=sha256:f2bde37667b18c2b5280df83bc799204394a5d2d774e4deaf9de0eb741df6833 \ - --hash=sha256:f4f909f4dde413dec435a44b0894956d55bb928ded7d6e3c726556ca4c796e84 \ - --hash=sha256:f976234e20ab2785f54224bcdafa027674e23663b132fa3ca0caa291a6cfbde7 \ - --hash=sha256:f9cebda093c2f6bfed88f1c17cdade09d4d96096421b344026feee236532d4de - # via - # -r requirements.in - # gcp-docuploader - # gcp-releasetool - # google-api-core - # google-cloud-storage - # googleapis-common-protos -pyasn1==0.4.8 \ - --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ - --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba - # via - # pyasn1-modules - # rsa -pyasn1-modules==0.2.8 \ - --hash=sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e \ - --hash=sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74 - # via google-auth -pycparser==2.21 \ - --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ - --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 - # via - # -r requirements.in - # cffi -pyjwt==2.4.0 \ - --hash=sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf \ - --hash=sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba - # via - # -r requirements.in - # gcp-releasetool -pyparsing==3.0.9 \ - --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ - --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc - # via - # -r requirements.in - # packaging -pyperclip==1.8.2 \ - --hash=sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57 - # via - # -r requirements.in - # gcp-releasetool -python-dateutil==2.8.2 \ - --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ - --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - # via - # -r requirements.in - # gcp-releasetool -requests==2.27.1 \ - --hash=sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61 \ - --hash=sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d - # via - # -r requirements.in - # gcp-releasetool - # google-api-core - # google-cloud-storage -rsa==4.9 \ - --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ - --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 - # via - # -r requirements.in - # google-auth -secretstorage==3.3.3 \ - --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ - --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 - # via keyring -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via - # -r requirements.in - # gcp-docuploader - # google-auth - # python-dateutil -typing-extensions==4.1.1 \ - --hash=sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42 \ - --hash=sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2 - # via -r requirements.in -urllib3==1.26.12 \ - --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ - --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 - # via - # -r requirements.in - # requests -zipp==3.6.0 \ - --hash=sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832 \ - --hash=sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc - # via - # -r requirements.in - # importlib-metadata \ No newline at end of file diff --git a/.kokoro/trampoline.sh b/.kokoro/trampoline.sh deleted file mode 100644 index e422a90dd..000000000 --- a/.kokoro/trampoline.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -set -eo pipefail -# Always run the cleanup script, regardless of the success of bouncing into -# the container. -function cleanup() { - chmod +x ${KOKORO_GFILE_DIR}/trampoline_cleanup.sh - ${KOKORO_GFILE_DIR}/trampoline_cleanup.sh - echo "cleanup"; -} -trap cleanup EXIT - -$(dirname $0)/populate-secrets.sh # Secret Manager secrets. -python3 "${KOKORO_GFILE_DIR}/trampoline_v1.py" From 31231725d8ea9d9c81adefba955732dc639a03d9 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 6 Jul 2023 10:38:08 -0400 Subject: [PATCH 200/201] chore: removing outdated files in favor of https://github.com/googleapis/google-cloud-java/tree/main/api-common-java (#452) --- .github/CODEOWNERS | 10 - .github/ISSUE_TEMPLATE/bug_report.md | 52 - .github/ISSUE_TEMPLATE/feature_request.md | 22 - .github/ISSUE_TEMPLATE/support_request.md | 7 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/blunderbuss.yml | 7 - .github/generated-files-bot.yml | 11 - .github/snippet-bot.yml | 0 .github/sync-repo-settings.yaml | 79 -- .github/trusted-contribution.yml | 2 - .github/workflows/ci.yaml | 96 -- .github/workflows/downstream.yaml | 144 -- .gitignore | 23 - .kokoro/build.sh | 69 - .kokoro/common.sh | 58 - .kokoro/downstream-client-library-check.sh | 92 -- CHANGELOG.md | 218 --- RELEASING.md | 79 -- build.gradle | 449 ------ gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 5 - gradlew | 234 ---- gradlew.bat | 89 -- java.header | 29 - license-checks.xml | 10 - license-header-javadoc.txt | 29 - pom.xml | 140 -- renovate.json | 75 - .../google/api/core/AbstractApiFuture.java | 99 -- .../google/api/core/AbstractApiService.java | 167 --- .../com/google/api/core/ApiAsyncFunction.java | 45 - .../java/com/google/api/core/ApiClock.java | 47 - .../java/com/google/api/core/ApiFunction.java | 39 - .../java/com/google/api/core/ApiFuture.java | 42 - .../google/api/core/ApiFutureCallback.java | 41 - .../api/core/ApiFutureToListenableFuture.java | 77 -- .../java/com/google/api/core/ApiFutures.java | 242 ---- .../java/com/google/api/core/ApiService.java | 249 ---- .../java/com/google/api/core/BetaApi.java | 68 - .../google/api/core/CurrentMillisClock.java | 65 - .../google/api/core/ForwardingApiFuture.java | 74 - .../java/com/google/api/core/InternalApi.java | 61 - .../api/core/InternalExtensionOnly.java | 69 - .../api/core/ListenableFutureToApiFuture.java | 42 - .../java/com/google/api/core/NanoClock.java | 61 - .../google/api/core/SettableApiFuture.java | 53 - .../google/api/pathtemplate/PathTemplate.java | 1213 ----------------- .../pathtemplate/TemplatedResourceName.java | 290 ---- .../api/pathtemplate/ValidationException.java | 94 -- .../api/resourcenames/ResourceName.java | 46 - .../resourcenames/ResourceNameFactory.java | 36 - .../resourcenames/UntypedResourceName.java | 104 -- .../com/google/api/core/ApiFuturesTest.java | 232 ---- .../com/google/api/core/ApiServiceTest.java | 93 -- .../core/ListenableFutureToApiFutureTest.java | 45 - .../api/core/SettableApiFutureTest.java | 87 -- .../api/pathtemplate/PathTemplateTest.java | 851 ------------ .../TemplatedResourceNameTest.java | 54 - .../UntypedResourceNameTest.java | 92 -- synth.metadata | 18 - templates/apidocs_index.html.template | 1 - versions.txt | 4 - 62 files changed, 6837 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/support_request.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/blunderbuss.yml delete mode 100644 .github/generated-files-bot.yml delete mode 100644 .github/snippet-bot.yml delete mode 100644 .github/sync-repo-settings.yaml delete mode 100644 .github/trusted-contribution.yml delete mode 100644 .github/workflows/ci.yaml delete mode 100644 .github/workflows/downstream.yaml delete mode 100644 .gitignore delete mode 100755 .kokoro/build.sh delete mode 100644 .kokoro/common.sh delete mode 100755 .kokoro/downstream-client-library-check.sh delete mode 100644 CHANGELOG.md delete mode 100644 RELEASING.md delete mode 100644 build.gradle delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradlew delete mode 100644 gradlew.bat delete mode 100644 java.header delete mode 100644 license-checks.xml delete mode 100644 license-header-javadoc.txt delete mode 100644 pom.xml delete mode 100644 renovate.json delete mode 100644 src/main/java/com/google/api/core/AbstractApiFuture.java delete mode 100644 src/main/java/com/google/api/core/AbstractApiService.java delete mode 100644 src/main/java/com/google/api/core/ApiAsyncFunction.java delete mode 100644 src/main/java/com/google/api/core/ApiClock.java delete mode 100644 src/main/java/com/google/api/core/ApiFunction.java delete mode 100644 src/main/java/com/google/api/core/ApiFuture.java delete mode 100644 src/main/java/com/google/api/core/ApiFutureCallback.java delete mode 100644 src/main/java/com/google/api/core/ApiFutureToListenableFuture.java delete mode 100644 src/main/java/com/google/api/core/ApiFutures.java delete mode 100644 src/main/java/com/google/api/core/ApiService.java delete mode 100644 src/main/java/com/google/api/core/BetaApi.java delete mode 100644 src/main/java/com/google/api/core/CurrentMillisClock.java delete mode 100644 src/main/java/com/google/api/core/ForwardingApiFuture.java delete mode 100644 src/main/java/com/google/api/core/InternalApi.java delete mode 100644 src/main/java/com/google/api/core/InternalExtensionOnly.java delete mode 100644 src/main/java/com/google/api/core/ListenableFutureToApiFuture.java delete mode 100644 src/main/java/com/google/api/core/NanoClock.java delete mode 100644 src/main/java/com/google/api/core/SettableApiFuture.java delete mode 100644 src/main/java/com/google/api/pathtemplate/PathTemplate.java delete mode 100644 src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java delete mode 100644 src/main/java/com/google/api/pathtemplate/ValidationException.java delete mode 100644 src/main/java/com/google/api/resourcenames/ResourceName.java delete mode 100644 src/main/java/com/google/api/resourcenames/ResourceNameFactory.java delete mode 100644 src/main/java/com/google/api/resourcenames/UntypedResourceName.java delete mode 100644 src/test/java/com/google/api/core/ApiFuturesTest.java delete mode 100644 src/test/java/com/google/api/core/ApiServiceTest.java delete mode 100644 src/test/java/com/google/api/core/ListenableFutureToApiFutureTest.java delete mode 100644 src/test/java/com/google/api/core/SettableApiFutureTest.java delete mode 100644 src/test/java/com/google/api/pathtemplate/PathTemplateTest.java delete mode 100644 src/test/java/com/google/api/pathtemplate/TemplatedResourceNameTest.java delete mode 100644 src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java delete mode 100644 synth.metadata delete mode 100644 templates/apidocs_index.html.template delete mode 100644 versions.txt diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 1bb9607cb..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,10 +0,0 @@ -# Code owners file. -# This file controls who is tagged for review for any given pull request. - -# For syntax help see: -# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax - -* @googleapis/actools-java @googleapis/yoshi-java - -# The java-samples-reviewers team is the default owner for samples changes -samples/**/*.java @googleapis/java-samples-reviewers diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index affd18d5c..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- -This library has moved to [gapic-generator-java/api-common-java](https://github.com/googleapis/gapic-generator-java/tree/main/api-common-java) This repository will be archived in the future. - -Thanks for stopping by to let us know something could be better! - -**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. - -Please run down the following list and make sure you've tried the usual "quick fixes": - - - Search the issues already opened: https://github.com/googleapis/api-common-java/issues - - Check for answers on StackOverflow: http://stackoverflow.com/questions/tagged/google-cloud-platform - -If you are still having issues, please include as much information as possible: - -#### Environment details - -1. Specify the API at the beginning of the title. For example, "BigQuery: ..."). - General, Core, and Other are also allowed as types -2. OS type and version: -3. Java version: -4. api-common-java version(s): - -#### Steps to reproduce - - 1. ? - 2. ? - -#### Code example - -```java -// example -``` - -#### Stack trace -``` -Any relevant stacktrace here. -``` - -#### External references such as API reference guides - -- ? - -#### Any additional information below - - -Following these steps guarantees the quickest resolution possible. - -Thanks! diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 12ac8e6f4..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this library - ---- -This library has moved to [gapic-generator-java/api-common-java](https://github.com/googleapis/gapic-generator-java/tree/main/api-common-java) This repository will be archived in the future. - -Thanks for stopping by to let us know something could be better! - -**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. - -**Is your feature request related to a problem? Please describe.** -What the problem is. Example: I'm always frustrated when [...] - -**Describe the solution you'd like** -What you want to happen. - -**Describe alternatives you've considered** -Any alternative solutions or features you've considered. - -**Additional context** -Any other context or screenshots about the feature request. diff --git a/.github/ISSUE_TEMPLATE/support_request.md b/.github/ISSUE_TEMPLATE/support_request.md deleted file mode 100644 index 995869032..000000000 --- a/.github/ISSUE_TEMPLATE/support_request.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: Support request -about: If you have a support contract with Google, please create an issue in the Google Cloud Support console. - ---- - -**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index dfc305331..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ -Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: -- [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/api-common-java/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea -- [ ] Ensure the tests and linter pass -- [ ] Code coverage does not decrease (if any source code was changed) -- [ ] Appropriate docs were updated (if necessary) - -Fixes # ☕️ diff --git a/.github/blunderbuss.yml b/.github/blunderbuss.yml deleted file mode 100644 index 2176b0543..000000000 --- a/.github/blunderbuss.yml +++ /dev/null @@ -1,7 +0,0 @@ -# Configuration for the Blunderbuss GitHub app. For more info see -# https://github.com/googleapis/repo-automation-bots/tree/main/packages/blunderbuss -assign_prs_by: -- labels: - - samples - to: - - googleapis/java-samples-reviewers \ No newline at end of file diff --git a/.github/generated-files-bot.yml b/.github/generated-files-bot.yml deleted file mode 100644 index 47c2ba132..000000000 --- a/.github/generated-files-bot.yml +++ /dev/null @@ -1,11 +0,0 @@ -externalManifests: -- type: json - file: 'synth.metadata' - jsonpath: '$.generatedFiles[*]' -- type: json - file: '.github/readme/synth.metadata/synth.metadata' - jsonpath: '$.generatedFiles[*]' -ignoreAuthors: -- 'renovate-bot' -- 'yoshi-automation' -- 'release-please[bot]' diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml deleted file mode 100644 index a1587888c..000000000 --- a/.github/sync-repo-settings.yaml +++ /dev/null @@ -1,79 +0,0 @@ -rebaseMergeAllowed: true -squashMergeAllowed: true -mergeCommitAllowed: false -branchProtectionRules: - - pattern: main - isAdminEnforced: true - requiredStatusCheckContexts: - - units (8) - - units (11) - - units (17) - - lint - - cla/google - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true - requiresStrictStatusChecks: true - - pattern: 1.10.1-sp - isAdminEnforced: true - requiredStatusCheckContexts: - - units (8) - - units (11) - - units (17) - - lint - - cla/google - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true - requiresStrictStatusChecks: true - - pattern: java7 - isAdminEnforced: true - requiredStatusCheckContexts: - - units (8) - - units (11) - - units (17) - - lint - - cla/google - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true - requiresStrictStatusChecks: true - - pattern: 2.0.x - isAdminEnforced: true - requiredStatusCheckContexts: - - units (8) - - units (11) - - units (17) - - lint - - cla/google - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true - requiresStrictStatusChecks: true - - pattern: 2.1.x - isAdminEnforced: true - requiredStatusCheckContexts: - - units (8) - - units (11) - - units (17) - - lint - - cla/google - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true - requiresStrictStatusChecks: true - - pattern: 2.2.x - isAdminEnforced: true - requiredStatusCheckContexts: - - units (8) - - units (11) - - units (17) - - lint - - cla/google - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true - requiresStrictStatusChecks: true -permissionRules: - - team: Googlers - permission: pull - - team: yoshi-java - permission: push - - team: yoshi-java-admins - permission: admin - - team: yoshi-admins - permission: admin diff --git a/.github/trusted-contribution.yml b/.github/trusted-contribution.yml deleted file mode 100644 index f247d5c78..000000000 --- a/.github/trusted-contribution.yml +++ /dev/null @@ -1,2 +0,0 @@ -trustedContributors: -- renovate-bot \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 663e62aaf..000000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,96 +0,0 @@ -on: - push: - branches: - - main - pull_request: -name: ci -jobs: - clirr: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 8 - - run: echo "JAVA8_HOME=${JAVA_HOME}" >> $GITHUB_ENV - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 11 - - run: echo "JAVA11_HOME=${JAVA_HOME}" >> $GITHUB_ENV - - run: .kokoro/build.sh - env: - JOB_TYPE: clirr - units-8: - name: units (8) - runs-on: ubuntu-latest - steps: - - name: Get current week within the year - id: date - run: echo "::set-output name=week_of_year::$(date +'%W' --utc)" - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - java-version: 8 - distribution: temurin - - run: echo "JAVA8_HOME=${JAVA_HOME}" >> $GITHUB_ENV - - uses: actions/setup-java@v3 - with: - java-version: 11 - distribution: temurin - - run: echo "JAVA11_HOME=${JAVA_HOME}" >> $GITHUB_ENV - - uses: actions/cache@v3 - id: mvn-cache - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.week_of_year }} - - run: .kokoro/build.sh - env: - JOB_TYPE: test - JOB_NAME: units-8 - units: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - java: [ 11, 17 ] - steps: - - name: Get current week within the year - id: date - run: echo "::set-output name=week_of_year::$(date +'%W' --utc)" - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: ${{matrix.java}} - - run: java -version - - uses: actions/cache@v3 - id: mvn-cache - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.week_of_year }} - - run: .kokoro/build.sh - env: - JOB_TYPE: test - JOB_NAME: units-${{matrix.java}} - lint: - runs-on: ubuntu-latest - steps: - - name: Get current week within the year - id: date - run: echo "::set-output name=week_of_year::$(date +'%W' --utc)" - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 11 - - run: java -version - - uses: actions/cache@v3 - id: mvn-cache - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.week_of_year }} - - run: java -version - - run: mvn -B -ntp com.coveo:fmt-maven-plugin:check - - run: mvn -B -ntp checkstyle:check@checkstyle diff --git a/.github/workflows/downstream.yaml b/.github/workflows/downstream.yaml deleted file mode 100644 index 250194a16..000000000 --- a/.github/workflows/downstream.yaml +++ /dev/null @@ -1,144 +0,0 @@ -on: - pull_request: - types: [ labeled ] - branches: - - main -name: downstream -jobs: - dependencies: - if: ${{ github.event.label.name == 'downstream-check:run' }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - java: [8] - repo: - # This list needs to be updated manually until an automated solution is in place. - - accessapproval - - accesscontextmanager - - aiplatform - - analytics-admin - - analytics-data - - api-gateway - - apigee-connect - - appengine-admin - - area120-tables - - artifact-registry - - asset - - assured-workloads - - automl - - bigquery - - bigqueryconnection - - bigquerydatatransfer - - bigquerymigration - - bigqueryreservation - - bigtable - - billing - - billingbudgets - - binary-authorization - - channel - - cloudbuild - - compute - - contact-center-insights - - container - - containeranalysis - - data-fusion - - datacatalog - - dataflow - - datalabeling - - dataproc - - dataproc-metastore - - datastore - - datastream - - debugger-client - - deploy - - dialogflow - - dialogflow-cx - - dlp - - dms - - dns - - document-ai - - domains - - errorreporting - - essential-contacts - - eventarc - - filestore - - firestore - - functions - - game-servers - - gke-connect-gateway - - gkehub - - gsuite-addons - - iam-admin - - iamcredentials - - iot - - kms - - language - - life-sciences - - logging - - logging-logback - - managed-identities - - mediatranslation - - memcache - - monitoring - - monitoring-dashboards - - network-management - - network-security - - networkconnectivity - - notebooks - - orchestration-airflow - - orgpolicy - - os-config - - os-login - - phishingprotection - - policy-troubleshooter - - private-catalog - - profiler - - pubsublite - - recaptchaenterprise - - recommendations-ai - - recommender - - redis - - resource-settings - - resourcemanager - - retail - - scheduler - - secretmanager - - security-private-ca - - securitycenter - - securitycenter-settings - - service-control - - service-management - - service-usage - - servicedirectory - - shell - - spanner - - spanner-jdbc - - speech - - storage - - storage-nio - - storage-transfer - - talent - - tasks - - texttospeech - - tpu - - trace - - translate - - video-intelligence - - video-transcoder - - vision - - vpcaccess - - webrisk - - websecurityscanner - - workflow-executions - - workflows - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: ${{matrix.java}} - - run: java -version - - run: sudo apt-get update -y - - run: sudo apt-get install libxml2-utils - - run: .kokoro/downstream-client-library-check.sh api-common ${{matrix.repo}} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 517384895..000000000 --- a/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# Build results -bin -build -.gradle -tmp_gh-pages - -# Eclipse -.apt_generated -.classpath -.factorypath -.project -.settings - -# Intellij -.idea -*.iml -*.iws -*.ipr - -# Vim -*.sw* - -target/ diff --git a/.kokoro/build.sh b/.kokoro/build.sh deleted file mode 100755 index 38ab4128a..000000000 --- a/.kokoro/build.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -## Get the directory of the build script -scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}")) -## cd to the parent directory, i.e. the root of the git repo -cd ${scriptDir}/.. - -# include common functions -source ${scriptDir}/common.sh - -function setJava() { - export JAVA_HOME=$1 - export PATH=${JAVA_HOME}/bin:$PATH -} - -# This project requires compiling the classes in JDK 11 or higher for GraalVM -# classes. Compiling this project with Java 8 or earlier would fail with "class -# file has wrong version 55.0, should be 53.0" and "unrecognized --release 8 -# option" (set in build.gradle). -if [ ! -z "${JAVA11_HOME}" ]; then - setJava "${JAVA11_HOME}" -fi - -echo "Compiling using Java:" -java -version -mvn clean install -B -ntp -DskipTests - -# We ensure the generated class files are compatible with Java 8 -if [ ! -z "${JAVA8_HOME}" ]; then - setJava "${JAVA8_HOME}" -fi - -RETURN_CODE=0 - -case ${JOB_TYPE} in - test) - retry_with_backoff 3 10 \ - mvn -B -ntp \ - -Dclirr.skip=true \ - -Denforcer.skip=true \ - -Dcheckstyle.skip=true \ - -Dmaven.wagon.http.retryHandler.count=5 \ - test - RETURN_CODE=$? - ;; - clirr) - mvn -B -ntp clirr:check - RETURN_CODE=$? - ;; - *) ;; -esac - -echo "exiting with ${RETURN_CODE}" -exit ${RETURN_CODE} diff --git a/.kokoro/common.sh b/.kokoro/common.sh deleted file mode 100644 index ace89f45a..000000000 --- a/.kokoro/common.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -function retry_with_backoff { - attempts_left=$1 - sleep_seconds=$2 - shift 2 - command=$@ - - - # store current flag state - flags=$- - - # allow a failures to continue - set +e - ${command} - exit_code=$? - - # restore "e" flag - if [[ ${flags} =~ e ]] - then set -e - else set +e - fi - - if [[ $exit_code == 0 ]] - then - return 0 - fi - - # failure - if [[ ${attempts_left} > 0 ]] - then - echo "failure (${exit_code}), sleeping ${sleep_seconds}..." - sleep ${sleep_seconds} - new_attempts=$((${attempts_left} - 1)) - new_sleep=$((${sleep_seconds} * 2)) - retry_with_backoff ${new_attempts} ${new_sleep} ${command} - fi - - return $exit_code -} - -## Helper functionss -function now() { date +"%Y-%m-%d %H:%M:%S" | tr -d '\n'; } -function msg() { println "$*" >&2; } -function println() { printf '%s\n' "$(now) $*"; } \ No newline at end of file diff --git a/.kokoro/downstream-client-library-check.sh b/.kokoro/downstream-client-library-check.sh deleted file mode 100755 index b3751f630..000000000 --- a/.kokoro/downstream-client-library-check.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Presubmit to ensure the dependencies of the Google Libraries BOM, with the modification of change -# in the PR, pick up the highest versions among transitive dependencies. -# https://maven.apache.org/enforcer/enforcer-rules/requireUpperBoundDeps.html -set -eo pipefail -# Display commands being run. -set -x - -CORE_LIBRARY_ARTIFACT=$1 -CLIENT_LIBRARY=$2 -## Get the directory of the build script -scriptDir="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" -## cd to the parent directory, i.e. the root of the git repo -cd "${scriptDir}"/.. - -CORE_VERSION=$( ./gradlew -q properties | grep '^version: ' | cut -d' ' -f2 ) -echo "$CORE_VERSION" - -# Publish api-common to local maven to make it available for downstream libraries -./gradlew publishToMavenLocal - -# Round 1 -# Check this java core library against HEAD of java-shared dependencies - -git clone "https://github.com/googleapis/java-shared-dependencies.git" --depth=1 -pushd java-shared-dependencies/first-party-dependencies - -# replace version -xmllint --shell pom.xml << EOF -setns x=http://maven.apache.org/POM/4.0.0 -cd .//x:artifactId[text()="${CORE_LIBRARY_ARTIFACT}"] -cd ../x:version -set ${CORE_VERSION} -save pom.xml -EOF - -cd .. -mvn verify install -B -V -ntp -fae \ --DskipTests=true \ --Dmaven.javadoc.skip=true \ --Dgcloud.download.skip=true \ --Denforcer.skip=true - -SHARED_DEPS_VERSION_POM=pom.xml -# Namespace (xmlns) prevents xmllint from specifying tag names in XPath -SHARED_DEPS_VERSION=$(sed -e 's/xmlns=".*"//' ${SHARED_DEPS_VERSION_POM} | xmllint --xpath '/project/version/text()' -) - -if [ -z "${SHARED_DEPS_VERSION}" ]; then - echo "Version is not found in ${SHARED_DEPS_VERSION_POM}" - exit 1 -fi - -# Round 2 -# Check this BOM against java client libraries -git clone "https://github.com/googleapis/java-${CLIENT_LIBRARY}.git" --depth=1 -pushd java-"${CLIENT_LIBRARY}" - -if [[ $CLIENT_LIBRARY == "bigtable" ]]; then - pushd google-cloud-bigtable-deps-bom -fi - -# replace version -xmllint --shell pom.xml << EOF -setns x=http://maven.apache.org/POM/4.0.0 -cd .//x:artifactId[text()="google-cloud-shared-dependencies"] -cd ../x:version -set ${SHARED_DEPS_VERSION} -save pom.xml -EOF - -if [[ $CLIENT_LIBRARY == "bigtable" ]]; then - popd -fi - -mvn verify install -B -V -ntp -fae \ --Dmaven.javadoc.skip=true \ --Dgcloud.download.skip=true \ --Denforcer.skip=true diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 8922e5703..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,218 +0,0 @@ -# Changelog - -## [2.3.1](https://github.com/googleapis/api-common-java/compare/v2.3.0...v2.3.1) (2022-12-06) - - -### Bug Fixes - -* Build with JDK11 and target JDK8 ([1862611](https://github.com/googleapis/api-common-java/commit/1862611d8b5cff69288380fe567e6ce033148c55)) - -## [2.3.0](https://github.com/googleapis/api-common-java/compare/v2.2.2...v2.3.0) (2022-12-05) - - -### Features - -* Next release from main branch is 2.3.0 ([#371](https://github.com/googleapis/api-common-java/issues/371)) ([9f6f62d](https://github.com/googleapis/api-common-java/commit/9f6f62d1a32ee0b9c02065fe3752c2cd9d711038)) - - -### Dependencies - -* Update auto-value.version to v1.10.1 ([#378](https://github.com/googleapis/api-common-java/issues/378)) ([d44ba0b](https://github.com/googleapis/api-common-java/commit/d44ba0b7b15ef910ad7caba607d0d84edac2611b)) -* Update dependency com.google.auto.value:auto-value to v1.10.1 ([#380](https://github.com/googleapis/api-common-java/issues/380)) ([96eb7d6](https://github.com/googleapis/api-common-java/commit/96eb7d67c06fcd2e43dc6a2d332e9ad8e5fec7eb)) -* Update dependency com.google.auto.value:auto-value-annotations to v1.10.1 ([#381](https://github.com/googleapis/api-common-java/issues/381)) ([fb33ae8](https://github.com/googleapis/api-common-java/commit/fb33ae8ab0810dde5e33400309b4e632e04f4e0b)) -* Update dependency com.google.errorprone:error_prone_annotations to v2.16 ([#382](https://github.com/googleapis/api-common-java/issues/382)) ([da19378](https://github.com/googleapis/api-common-java/commit/da1937834bcfa9edfe2fa642211478fed54e5e61)) -* Update dependency gradle to v6.9.3 ([#379](https://github.com/googleapis/api-common-java/issues/379)) ([3cbb296](https://github.com/googleapis/api-common-java/commit/3cbb296485c5f6a5483aa15573c563e97436e13a)) - -## [2.2.2](https://github.com/googleapis/api-common-java/compare/v2.2.1...v2.2.2) (2022-08-04) - - -### Dependencies - -* update dependency com.google.errorprone:error_prone_annotations to v2.15.0 ([#364](https://github.com/googleapis/api-common-java/issues/364)) ([28ff65d](https://github.com/googleapis/api-common-java/commit/28ff65d7e70495cc079379b8e78cb515a2960dae)) - -## [2.2.1](https://github.com/googleapis/api-common-java/compare/v2.2.0...v2.2.1) (2022-06-09) - - -### Dependencies - -* update dependency com.google.errorprone:error_prone_annotations to v2.14.0 ([#360](https://github.com/googleapis/api-common-java/issues/360)) ([2bf75c6](https://github.com/googleapis/api-common-java/commit/2bf75c6415646df0a2dd074a75bd044d0bdc67ca)) - -## [2.2.0](https://github.com/googleapis/api-common-java/compare/v2.1.5...v2.2.0) (2022-04-18) - - -### Features - -* next release from main branch is 2.2.0 ([#355](https://github.com/googleapis/api-common-java/issues/355)) ([75f57bc](https://github.com/googleapis/api-common-java/commit/75f57bca521495a91fd7e55447c60e2b8955ef06)) - - -### Dependencies - -* update dependency com.google.errorprone:error_prone_annotations to v2.12.1 ([#350](https://github.com/googleapis/api-common-java/issues/350)) ([2e6de4f](https://github.com/googleapis/api-common-java/commit/2e6de4f0ce7bbbbbcb066e9986a8d7bd04ab043c)) -* update dependency com.google.errorprone:error_prone_annotations to v2.13.0 ([#353](https://github.com/googleapis/api-common-java/issues/353)) ([2954859](https://github.com/googleapis/api-common-java/commit/2954859afe658b07ac76773e056b1b48fe81182b)) -* update dependency com.google.errorprone:error_prone_annotations to v2.13.1 ([#354](https://github.com/googleapis/api-common-java/issues/354)) ([ca94cf9](https://github.com/googleapis/api-common-java/commit/ca94cf901e15765d24a5abaaa9707a74f134cfec)) - -### [2.1.5](https://github.com/googleapis/api-common-java/compare/v2.1.4...v2.1.5) (2022-03-23) - - -### Dependencies - -* guava 31.1 ([#346](https://github.com/googleapis/api-common-java/issues/346)) ([94ec147](https://github.com/googleapis/api-common-java/commit/94ec14787626d64b82197ae541fb152e66dfa442)) -* update dependency gradle to v6.9.2 ([#325](https://github.com/googleapis/api-common-java/issues/325)) ([58b33f5](https://github.com/googleapis/api-common-java/commit/58b33f5b83583f85a3091c83e1f13771aa7d0a1c)) - -### [2.1.4](https://github.com/googleapis/api-common-java/compare/v2.1.3...v2.1.4) (2022-02-07) - - -### Bug Fixes - -* Support delimiters(_-.~) as start or end characters for a segment ([#338](https://github.com/googleapis/api-common-java/issues/338)) ([b2eba9e](https://github.com/googleapis/api-common-java/commit/b2eba9e7497fe13f7132e05a658ca936de5aa9c5)) - -### [2.1.3](https://github.com/googleapis/api-common-java/compare/v2.1.2...v2.1.3) (2022-01-25) - - -### Dependencies - -* update dependency com.google.errorprone:error_prone_annotations to v2.11.0 ([#331](https://github.com/googleapis/api-common-java/issues/331)) ([1a1910c](https://github.com/googleapis/api-common-java/commit/1a1910c1812375c98212d761034ed300a952f604)) - -### [2.1.2](https://www.github.com/googleapis/api-common-java/compare/v2.1.1...v2.1.2) (2022-01-06) - - -### Dependencies - -* update dependency com.google.auto.value:auto-value to v1.9 ([#323](https://www.github.com/googleapis/api-common-java/issues/323)) ([d8d7084](https://www.github.com/googleapis/api-common-java/commit/d8d708468f134ad0b39bfd8bccf8d7e08a19e7e1)) -* update dependency com.google.auto.value:auto-value-annotations to v1.9 ([#324](https://www.github.com/googleapis/api-common-java/issues/324)) ([0c920a4](https://www.github.com/googleapis/api-common-java/commit/0c920a4c5e68cc7b0a05297bf01114d4a231c591)) - -### [2.1.1](https://www.github.com/googleapis/api-common-java/compare/v2.1.0...v2.1.1) (2021-11-10) - - -### Dependencies - -* update dependency com.google.errorprone:error_prone_annotations to v2.10.0 ([#316](https://www.github.com/googleapis/api-common-java/issues/316)) ([99df091](https://www.github.com/googleapis/api-common-java/commit/99df0919c7901948a90cc411fc212468a7754c01)) - -## [2.1.0](https://www.github.com/googleapis/api-common-java/compare/v2.0.5...v2.1.0) (2021-10-20) - - -### Features - -* next release from main branch is 2.1.0 ([#308](https://www.github.com/googleapis/api-common-java/issues/308)) ([3965b13](https://www.github.com/googleapis/api-common-java/commit/3965b13ea832cefe4aa58f4f2ecfd0423686c0f9)) - -### [2.0.5](https://www.github.com/googleapis/api-common-java/compare/v2.0.4...v2.0.5) (2021-10-08) - - -### Dependencies - -* add maven plugin to enable install ([#304](https://www.github.com/googleapis/api-common-java/issues/304)) ([ea0b777](https://www.github.com/googleapis/api-common-java/commit/ea0b7773c799db16b2ae68ff600dcacaca52abf9)) - -### [2.0.4](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.4) (2021-10-06) - - -### Dependencies - -* use nexus-publish plugin ([#300](https://www.github.com/googleapis/api-common-java/issues/300)) ([e502ae6](https://www.github.com/googleapis/api-common-java/commit/e502ae63f7cea8293c3bf617a74bc74bd345edbc)) - -### [2.0.3](https://www.github.com/googleapis/api-common-java/compare/v2.0.3...v2.0.3) (2021-10-06) - - -### Dependencies - -* use nexus-publish plugin ([#297](https://www.github.com/googleapis/api-common-java/issues/297)) ([ea19c90](https://www.github.com/googleapis/api-common-java/commit/ea19c90e95088bd4c633c213b092fc9df673a02f)) - -### [2.0.2](https://www.github.com/googleapis/api-common-java/compare/v2.0.1...v2.0.2) (2021-08-20) - - -### Dependencies - -* update dependency com.google.errorprone:error_prone_annotations to v2.9.0 ([#266](https://www.github.com/googleapis/api-common-java/issues/266)) ([9019ce9](https://www.github.com/googleapis/api-common-java/commit/9019ce98dcd722deea2ca3845d4396184dcc1599)) - -### [2.0.1](https://www.github.com/googleapis/api-common-java/compare/v2.0.0...v2.0.1) (2021-08-10) - - -### Dependencies - -* update dependency com.google.errorprone:error_prone_annotations to v2.8.1 ([#261](https://www.github.com/googleapis/api-common-java/issues/261)) ([1875934](https://www.github.com/googleapis/api-common-java/commit/187593451b90252daddb55555ab4d40e2fbd4d82)) - -## [2.0.0](https://www.github.com/googleapis/api-common-java/compare/v1.10.6...v2.0.0) (2021-07-29) - - -### ⚠ BREAKING CHANGES - -* update api-common-java min java version to java8 (#251) - -### Features - -* update api-common-java min java version to java8 ([#251](https://www.github.com/googleapis/api-common-java/issues/251)) ([7fe322c](https://www.github.com/googleapis/api-common-java/commit/7fe322cef65bdcc9549ddc9efa1ff95df36cc531)) - - -### Dependencies - -* update guava version to 30.1.1-jre ([7fe322c](https://www.github.com/googleapis/api-common-java/commit/7fe322cef65bdcc9549ddc9efa1ff95df36cc531)) - -### [1.10.5](https://www.github.com/googleapis/api-common-java/compare/v1.10.5...v1.10.5) (2021-07-27) - - -### Build System - -* migrate to google sonatype endpoint ([#248](https://www.github.com/googleapis/api-common-java/issues/248)) ([c3ab73e](https://www.github.com/googleapis/api-common-java/commit/c3ab73eca99f3036a26fe10a880c1ff068efc0da)) - - -### Dependencies - -* update dependency com.google.auto.value:auto-value to v1.8.2 ([#242](https://www.github.com/googleapis/api-common-java/issues/242)) ([5de2f3e](https://www.github.com/googleapis/api-common-java/commit/5de2f3edfcaed42061ad7dbc4efc886587c0e769)) -* update dependency com.google.auto.value:auto-value-annotations to v1.8.2 ([#243](https://www.github.com/googleapis/api-common-java/issues/243)) ([53d6d38](https://www.github.com/googleapis/api-common-java/commit/53d6d38ac0a7d6dc5738823d69ac96d1eadd23a3)) -* update dependency com.google.errorprone:error_prone_annotations to v2.8.0 ([#245](https://www.github.com/googleapis/api-common-java/issues/245)) ([8889689](https://www.github.com/googleapis/api-common-java/commit/88896894b821771293cda2d4b7a2f6027ee20ef4)) - -### [1.10.5](https://www.github.com/googleapis/api-common-java/compare/v1.10.4...v1.10.5) (2021-07-20) - - -### Bug Fixes - -* Fix PathTemplate custom verb logic matching and instantiating ([#244](https://www.github.com/googleapis/api-common-java/issues/244)) ([d4913d3](https://www.github.com/googleapis/api-common-java/commit/d4913d33ff2153cb3a8f6382ab8d918980f542ea)) - - -### Dependencies - -* update dependency io.codearte.gradle.nexus:gradle-nexus-staging-plugin to v0.30.0 ([#239](https://www.github.com/googleapis/api-common-java/issues/239)) ([2ca4359](https://www.github.com/googleapis/api-common-java/commit/2ca4359127cc2f8eddb81e8091362a75e1e6e38e)) - -### [1.10.4](https://www.github.com/googleapis/api-common-java/compare/v1.10.3...v1.10.4) (2021-05-19) - - -### Dependencies - -* update dependency com.google.errorprone:error_prone_annotations to v2.7.1 ([#231](https://www.github.com/googleapis/api-common-java/issues/231)) ([51b00e0](https://www.github.com/googleapis/api-common-java/commit/51b00e0603583fc3b781783945dcbccef81a22fd)) - -### [1.10.3](https://www.github.com/googleapis/api-common-java/compare/v1.10.2...v1.10.3) (2021-04-22) - - -### Dependencies - -* update dependency com.google.auto.value:auto-value to v1.8.1 ([#219](https://www.github.com/googleapis/api-common-java/issues/219)) ([307c640](https://www.github.com/googleapis/api-common-java/commit/307c640cb487962786be5551a65863c7d2276a3a)) -* update dependency com.google.auto.value:auto-value-annotations to v1.8.1 ([#215](https://www.github.com/googleapis/api-common-java/issues/215)) ([15cebbc](https://www.github.com/googleapis/api-common-java/commit/15cebbcaea8a1ea62e4a800d8d325ee302971fcf)) - -### [1.10.2](https://www.github.com/googleapis/api-common-java/compare/v1.10.1...v1.10.2) (2021-04-19) - - -### Dependencies - -* guava 30.1.1 ([#207](https://www.github.com/googleapis/api-common-java/issues/207)) ([20578a0](https://www.github.com/googleapis/api-common-java/commit/20578a00e5b4ba2f9c4482eccf55ffa37ab12335)) - -### [1.10.1](https://www.github.com/googleapis/api-common-java/compare/v1.10.0...v1.10.1) (2020-10-16) - - -### Dependencies - -* update dependency com.google.auto.value:auto-value to v1.7.4 ([#170](https://www.github.com/googleapis/api-common-java/issues/170)) ([e6f8fef](https://www.github.com/googleapis/api-common-java/commit/e6f8fef536858c05a2b83404e8b9c774c6506894)) -* update dependency com.google.auto.value:auto-value-annotations to v1.7.4 ([#171](https://www.github.com/googleapis/api-common-java/issues/171)) ([00a12b9](https://www.github.com/googleapis/api-common-java/commit/00a12b94c44463b8f37b13cedc3a9241ec031f34)) -* update dependency com.google.errorprone:error_prone_annotations to v2.4.0 ([#172](https://www.github.com/googleapis/api-common-java/issues/172)) ([89b2a48](https://www.github.com/googleapis/api-common-java/commit/89b2a48ac22043d85c222979599522ca9397849f)) - -## [1.10.0](https://www.github.com/googleapis/api-common-java/compare/v1.9.3...v1.10.0) (2020-07-17) - - -### Features - -* add ApiFutures.successfulAsList ([#163](https://www.github.com/googleapis/api-common-java/issues/163)) ([6af8e24](https://www.github.com/googleapis/api-common-java/commit/6af8e24a6252da7217e7c53f86cbb2b321327fc4)) - -### [1.9.3](https://www.github.com/googleapis/api-common-java/compare/v1.9.2...v1.9.3) (2020-07-01) - - -### Bug Fixes - -* enable complex resource ids in instantiate() ([#159](https://www.github.com/googleapis/api-common-java/issues/159)) ([955b8a7](https://www.github.com/googleapis/api-common-java/commit/955b8a7c7d117c05593763501ee365b74f3cd1f8)) diff --git a/RELEASING.md b/RELEASING.md deleted file mode 100644 index 9f8e308bb..000000000 --- a/RELEASING.md +++ /dev/null @@ -1,79 +0,0 @@ -One-time setup -============== - -Set up Sonatype Account ------------------------ -* Sign up for a Sonatype JIRA account [here](https://issues.sonatype.org) -* Click *Sign Up* in the login box, follow instructions - -Get access to repository ------------------------- -* Go to [community support](https://issues.sonatype.org/browse/OSSRH) -* Ask for publish rights by creating an issue similar to [this one](https://issues.sonatype.org/browse/OSSRH-32031) - * You must be logged in to create a new issue - * Use the *Create* button at the top tab - -* Generate the key `gpg --gen-key` - * Keep the defaults, but specify a passphrase - -* Determine your `gpg` version: `gpg -- version` - -* Find the ID of your public key - * If you're using GPG version 1.y.z, `gpg --list-secret-keys` - * Look for the line with format `sec 2048R/ABCDEFGH 2015-11-17` - * The `ABCDEFGH` is the ID for your public key - * If you're using GPG version 2.y.z `gpg --list-secret-keys --keyid-format LONG` - * Look for line with format `sec rsa2048/ABCDEFGHIJKLMNOP` - * The `ABCDEFGHIJKLMNOP` is the ID. It is 16-byte long, but Gradle - only support 8-byte keys. Use the *last* 8 bytes of the key when - following the rest of this document. - * `gpg --export-secret-keys $HOME/.gnupg/secring.gpg` - -* Upload your public key to a public server: `gpg --send-keys --keyserver hkp://pgp.mit.edu ` - -Add deploy credential settings ------------------------- -* Create a settings file at `$HOME/.gradle/gradle.properties` with your key information and your sonatype username/password - -``` -signing.keyId= -signing.password= -signing.secretKeyRingFile=/usr/local/google/home//.gnupg/secring.gpg - -ossrhUsername= -ossrhPassword= -``` - -To prepare a release -==================== - -Update version and deploy to Sonatype -------------------------------------- -1. Update `version.txt` to the release version you want -2. Run `./gradlew stageRelease` to: - * Regenerate `gh-pages` branch containing Javadocs - * Stage artifacts on Sonatype: to the staging repository if "-SNAPSHOT" is *not* included in the version; otherwise to the snapshot repository only -3. Submit a pull request, get it reviewed, and submit - -Publish the release -------------------- -1. Run `./gradlew finalizeRelease` - * Note: this will release **ALL** versions that have been staged to Sonatype: - if you have staged versions you do not intend to release, remove these first - from the [Nexus Repository Manager](https://oss.sonatype.org/) by logging in - (upper right) and browsing staging repositories (left panel) -2. It will take some time (~10 min to ~8 hours) for the package to transition -3. Publish a new release on Github: - * Go to the [releases page](https://github.com/googleapis/api-common-java/releases) and click "Draft a new release" - in order to start a new draft. - * Make sure the "Tag Version" is `vX.Y.Z` and the "Release Title" is `X.Y.Z`, where `X.Y.Z` is the release - version as listed in the `version.txt` files. - * Add the commits since the last release into the release draft. Try to group them into sections with related - changes. Anything that is a breaking change needs to be marked with `*breaking change*`. Such changes are - only allowed for alpha/beta modules and `@BetaApi` features. - * Ensure that the format is consistent with previous releases. After adding any missing updates and - reformatting as necessary, publish the draft. - -Bump development version ------------------------- -1. Update `version.txt` to the following "-SNAPSHOT" version diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 21fa55b9f..000000000 --- a/build.gradle +++ /dev/null @@ -1,449 +0,0 @@ -import groovy.io.FileType - -buildscript { - repositories { - mavenLocal() - maven { - url 'https://plugins.gradle.org/m2/' - } - mavenCentral() - } - dependencies { - classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.9", - "io.github.gradle-nexus:publish-plugin:1.1.0" - } -} -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'idea' -apply plugin: 'jacoco' -apply plugin: 'signing' -apply plugin: 'maven-publish' -apply plugin: 'com.github.sherter.google-java-format' -apply plugin: 'io.github.gradle-nexus.publish-plugin' - - -group = "com.google.api" -archivesBaseName = "api-common" - -project.version = "2.3.2-SNAPSHOT" // {x-version-update:api-common:current} - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -jacoco { - toolVersion = "0.8.8" -} - -// Dependencies -// ------------ - -ext { - // Shortcuts for libraries we are using - libraries = [ - javax_annotations: 'javax.annotation:javax.annotation-api:1.3.2', - auto_value: 'com.google.auto.value:auto-value:1.10.1', - auto_value_annotations: 'com.google.auto.value:auto-value-annotations:1.10.1', - guava: 'com.google.guava:guava:31.1-jre', - jsr305: 'com.google.code.findbugs:jsr305:3.0.2', - error_prone_annotations: 'com.google.errorprone:error_prone_annotations:2.17.0', - - // Testing - junit: 'junit:junit:4.13.2', - truth: 'com.google.truth:truth:1.1.3', - ] -} - -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - - annotationProcessor libraries.auto_value - - implementation( libraries.guava, - libraries.jsr305, - libraries.javax_annotations, - libraries.auto_value_annotations) - - compileOnly libraries.error_prone_annotations - - testImplementation(libraries.junit, - libraries.truth) -} - -clean.doFirst { - delete 'tmp_gh-pages/' -} - -jacocoTestReport { - reports { - xml.enabled true - html.enabled true - } -} - -check.dependsOn jacocoTestReport - -// jar with automatic module name: -jar { - manifest { - attributes('Automatic-Module-Name': 'com.google.api.apicommon') - } -} - -// Source jar -// ---------- -project.gradle.taskGraph.whenReady { - println project.gradle.taskGraph.getAllTasks() -} -task sourcesJar(type: Jar, dependsOn: classes) { - archiveClassifier = 'sources' - from sourceSets.main.allSource -} - -// JavaDoc -// ------- - -task javadocJar(type: Jar) { - archiveClassifier = 'javadoc' - from javadoc -} - -javadoc.options { - encoding = 'UTF-8' - links 'https://docs.oracle.com/javase/7/docs/api/' -} - -// JavaDocV3 -// ------- - -task javadocJarV3(type: Jar) { - archiveClassifier = 'javadoc' - from javadoc -} - -javadoc.options { - encoding = 'UTF-8' - links 'https://docs.oracle.com/javase/7/docs/api/' - - if (JavaVersion.current().isJava8Compatible()) { - addStringOption('Xdoclint:all,-missing', '-quiet') - } - if (JavaVersion.current().isJava11Compatible()) { - addStringOption('-release', '7') - } -} - -// Test Logging -// ------------ - -test { - testLogging { - events "passed", "skipped", "failed", "standardOut", "standardError" - exceptionFormat = 'full' - } -} - - -// Eclipse Annotation Processing -// ----------------------------- - -ext { - eclipseAptFolder = '.apt_generated' - eclipseSettingsDir = file('.settings') -} - -configurations { - codeGeneration -} - -dependencies { - codeGeneration libraries.auto_value, libraries.jsr305 - implementation(libraries.jsr305, libraries.auto_value_annotations) -} - -compileJava.classpath += configurations.codeGeneration - -eclipse { - jdt.file.withProperties { - it['org.eclipse.jdt.core.compiler.processAnnotations'] = 'enabled' - } -} - -tasks.eclipseJdt { - doFirst { - def aptPrefs = - file("${eclipseSettingsDir}/org.eclipse.jdt.apt.core.prefs") - aptPrefs.parentFile.mkdirs() - - aptPrefs.text = """\ - eclipse.preferences.version=1 - org.eclipse.jdt.apt.aptEnabled=true - org.eclipse.jdt.apt.genSrcDir=${eclipseAptFolder} - org.eclipse.jdt.apt.reconcileEnabled=true - """.stripIndent() - - file('.factorypath').withWriter { - new groovy.xml.MarkupBuilder(it).'factorypath' { - project.configurations.codeGeneration.each { dep-> - factorypathentry( - kind:'EXTJAR', - id:dep.absolutePath, - enabled:true, - runInBatchMode:false) - } - } - } - } -} - -tasks.cleanEclipseJdt { - doFirst { - delete file("${eclipseSettingsDir}/org.eclipse.jdt.apt.core.prefs"), - file('.factorypath') - } -} - -// Publishing -// ---------- - -artifacts { - archives javadocJar, sourcesJar -} - -signing { - required { gradle.taskGraph.hasTask("uploadArchives") } - if (project.hasProperty('signing.gnupg.executable')) { - useGpgCmd() - } - sign configurations.archives -} - -if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword')) { - nexusPublishing { - packageGroup = "com.google.api" - repositories { - sonatype { //or custom repository name - nexusUrl.set(uri('https://google.oss.sonatype.org/service/local/')) - snapshotRepositoryUrl.set(uri('https://google.oss.sonatype.org/content/repositories/snapshots/')) - username = ossrhUsername - password = ossrhPassword - } - } - } -} - -afterEvaluate { - publishing { - publications { - mavenJava(MavenPublication) { - version = project.version - - from components.java - - artifact javadocJar - artifact sourcesJar - - pom { - name = 'API Common' - packaging = 'jar' - artifactId = 'api-common' - description = 'Common utilities for Google APIs in Java' - url = 'https://github.com/googleapis/api-common-java' - - scm { - url = 'https://github.com/googleapis/api-common-java' - connection = 'scm:git:https://github.com/googleapis/api-common-java.git' - } - - licenses { - license { - name = 'BSD' - url = 'https://github.com/googleapis/api-common-java/blob/master/LICENSE' - } - } - - developers { - developer { - id = 'GoogleAPIs' - name = 'GoogleAPIs' - email = 'googleapis@googlegroups.com' - url = 'https://github.com/googleapis' - organization = 'Google, Inc.' - organizationUrl = 'https://www.google.com' - } - } - } - } - } - repositories { - maven { - url 'https://google.oss.sonatype.org/service/local/staging/deploy/maven2/' - credentials { - username = project.hasProperty('ossrhUsername') ? project.getProperty('ossrhUsername') : null - password = project.hasProperty('ossrhPassword') ? project.getProperty('ossrhPassword') : null - } - } - } - } - - signing { - if (!project.hasProperty('skip.signing')) { - if (project.hasProperty('signing.gnupg.executable')) { - useGpgCmd() - } - sign publishing.publications - } - } -} - -gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - } -} - -// Formatting tasks -// ================ - -task verifyLicense { - doLast { - def licenseText = new File(rootProject.rootDir, 'license-header-javadoc.txt').text - def srcFiles = [] - sourceSets - .collectMany{it.allJava.getSrcDirs()} - .each{it.eachFileRecurse(FileType.FILES, {srcFiles << new Tuple(it, it.text)})} - srcFiles = srcFiles - .findAll{it.get(0).path.endsWith(".java")} - .collect{new Tuple(it.get(0), it.get(1).replaceAll("Copyright 20[0-9]{2}", "Copyright 20xx"))} - .findAll{!it.get(1).startsWith(licenseText)} - if (srcFiles.asList().size() > 0) { - srcFiles.each({println 'missing license: ' + it.get(0)}) - throw new IllegalStateException("Above files do not have licenses") - } - } -} -test.dependsOn verifyLicense - -googleJavaFormat { - toolVersion '1.0' -} -tasks.googleJavaFormat { - exclude '.apt_generated/**' - exclude 'bin/**' - exclude 'build/**' -} -tasks.verifyGoogleJavaFormat { - exclude '.apt_generated/**' - exclude 'bin/**' - exclude 'build/**' -} -test.dependsOn verifyGoogleJavaFormat - -// JavaDocV3 docFX -// -task javadocCombinedV3(type: Javadoc) { - source project.sourceSets.main.allJava - classpath = files(project.sourceSets.main.compileClasspath) - destinationDir = new File(projectDir, 'tmp_docs/docfx-yml') - - options.addStringOption('encoding', 'UTF-8') - options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet") - options.addStringOption("projectname", "api-common") - options.docletpath = [file(System.getenv('KOKORO_GFILE_DIR') + "/java-docfx-doclet-1.5.0.jar")] - // Newer Gradle 6 passes -notimestamp by default, which the doclet above doesn't understand: - // https://github.com/gradle/gradle/issues/11898 - options.noTimestamp false -} - -clean { - delete 'tmp_gh-pages/' - delete 'tmp_docs/' -} - - -// Release -// ======= - -task checkOutGhPages { - doLast { - if (!new File('tmp_gh-pages').exists()) { - exec { - commandLine 'git', 'clone', '--branch', 'gh-pages', - '--single-branch', 'https://github.com/googleapis/api-common-java/', 'tmp_gh-pages' - } - } - } -} - -task copyFilesToGhPages { - dependsOn 'checkOutGhPages' - dependsOn 'javadoc' - doLast { - def newSiteDirPath = 'tmp_gh-pages/' + project.version + '/apidocs/' - new File(newSiteDirPath).mkdirs() - copy { - from 'build/docs/javadoc' - into newSiteDirPath - } - copy { - from 'README.md' - into 'tmp_gh-pages' - rename { filename -> filename.replace 'README', 'index' } - } - } -} - -task createApiDocsRedirect { - dependsOn 'copyFilesToGhPages' - doLast { - def template = new File('templates/apidocs_index.html.template').text - def outputContent = template.replace('{{siteVersion}}', project.version) - new File('tmp_gh-pages/apidocs/index.html').write(outputContent) - } -} - -task publishDocs { - dependsOn 'closeAndReleaseSonatypeStagingRepository' - doLast { - exec { - workingDir './tmp_gh-pages' - commandLine 'git', 'add', '.' - } - exec { - workingDir './tmp_gh-pages' - commandLine 'git', 'commit', '-m', 'Release docs for ' + project.version - } - exec { - workingDir './tmp_gh-pages' - commandLine 'git', 'push' - } - } -} - -// 1. Regenerates the gh-pages branch under tmp_gh-pages -// 2. Stages the artifact on Sonatype -task stageRelease { - dependsOn 'createApiDocsRedirect' - doLast { - exec { - commandLine './gradlew', 'uploadArchives' - } - } -} - -// 1. Closes and releases the artifact on Sonatype -// 2. Commits and pushes the new docs -// 3. Removes tmp_gh-pages -// Note: This task assumes that the 'stageRelease' task has been completed. -task finalizeRelease { - dependsOn 'publishDocs' - doLast { - exec { - commandLine 'rm', '-r', 'tmp_gh-pages' - } - } -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 53b9e3802..000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100755 index 1b6c78733..000000000 --- a/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index ac1b06f93..000000000 --- a/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/java.header b/java.header deleted file mode 100644 index 7e518c100..000000000 --- a/java.header +++ /dev/null @@ -1,29 +0,0 @@ -^/\*$ -^ \* Copyright 20\d\d,? Google (Inc\.|LLC)( All [rR]ights [rR]eserved\.)?$ -^ \*$ -^ \* Redistribution and use in source and binary forms, with or without$ -^ \* modification, are permitted provided that the following conditions are$ -^ \* met:$ -^ \*$ -^ \* \* Redistributions of source code must retain the above copyright$ -^ \* notice, this list of conditions and the following disclaimer.$ -^ \* \* Redistributions in binary form must reproduce the above$ -^ \* copyright notice, this list of conditions and the following disclaimer$ -^ \* in the documentation and/or other materials provided with the$ -^ \* distribution.$ -^ \* \* Neither the name of Google (Inc\.|LLC) nor the names of its$ -^ \* contributors may be used to endorse or promote products derived from$ -^ \* this software without specific prior written permission.$ -^ \*$ -^ \* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS$ -^ \* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT$ -^ \* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR$ -^ \* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT$ -^ \* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,$ -^ \* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \(INCLUDING, BUT NOT$ -^ \* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,$ -^ \* DATA, OR PROFITS; OR BUSINESS INTERRUPTION\) HOWEVER CAUSED AND ON ANY$ -^ \* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT$ -^ \* \(INCLUDING NEGLIGENCE OR OTHERWISE\) ARISING IN ANY WAY OUT OF THE USE$ -^ \* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.$ -^ \*/$ \ No newline at end of file diff --git a/license-checks.xml b/license-checks.xml deleted file mode 100644 index a800d524d..000000000 --- a/license-checks.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/license-header-javadoc.txt b/license-header-javadoc.txt deleted file mode 100644 index 924e0da02..000000000 --- a/license-header-javadoc.txt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 20xx, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ diff --git a/pom.xml b/pom.xml deleted file mode 100644 index e09578370..000000000 --- a/pom.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - 4.0.0 - com.google.api - api-common - jar - 2.3.2-SNAPSHOT - API Common - https://github.com/googleapis/api-common-java - Common utilities for Google APIs in Java - - - com.google.cloud - google-cloud-shared-config - 1.5.5 - - - - - GoogleAPIs - GoogleAPIs - googleapis@googlegroups.com - Google LLC - https://www.google.com - - - - - scm:git:https://github.com/googleapis/api-common-java.git - https://github.com/googleapis/api-common-java - - - - - BSD - https://github.com/googleapis/api-common-java/blob/main/LICENSE - - - - - UTF-8 - 1.8 - 1.8 - 1.10.1 - - - - - com.google.guava - guava - 31.1-jre - - - com.google.auto.value - auto-value-annotations - ${auto-value.version} - - - com.google.auto.value - auto-value - ${auto-value.version} - - - com.google.code.findbugs - jsr305 - 3.0.2 - - - javax.annotation - javax.annotation-api - 1.3.2 - - - com.google.errorprone - error_prone_annotations - 2.17.0 - compile - - - - - junit - junit - 4.13.2 - test - - - com.google.truth - truth - 1.1.3 - test - - - - - - - maven-compiler-plugin - - - - com.google.auto.value - auto-value - ${auto-value.version} - - - 8 - - -Xlint:unchecked - -Xlint:deprecation - - - - - com.coveo - fmt-maven-plugin - - - - check - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - false - - com.google.api.apicommon - - - - - - - \ No newline at end of file diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 39f2c7152..000000000 --- a/renovate.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "enabled": false, - "extends": [ - ":separateMajorReleases", - ":combinePatchMinorReleases", - ":ignoreUnstable", - ":prImmediately", - ":updateNotScheduled", - ":automergeDisabled", - ":ignoreModulesAndTests", - ":maintainLockFilesDisabled", - ":autodetectPinVersions" - ], - "ignorePaths": [".kokoro/requirements.txt"], - "packageRules": [ - { - "packagePatterns": [ - "^com.google.guava:" - ], - "versionScheme": "docker" - }, - { - "packagePatterns": [ - "*" - ], - "semanticCommitType": "deps", - "semanticCommitScope": null - }, - { - "packagePatterns": [ - "^org.apache.maven", - "^org.jacoco:", - "^org.codehaus.mojo:", - "^org.sonatype.plugins:", - "^com.coveo:", - "^com.google.cloud:google-cloud-shared-config" - ], - "semanticCommitType": "build", - "semanticCommitScope": "deps" - }, - { - "packagePatterns": [ - "^com.google.api:api-common", - "^com.google.cloud:libraries-bom", - "^com.google.cloud.samples:shared-configuration" - ], - "semanticCommitType": "chore", - "semanticCommitScope": "deps" - }, - { - "packagePatterns": [ - "^junit:junit", - "^com.google.truth:truth", - "^org.mockito:mockito-core", - "^org.objenesis:objenesis" - ], - "semanticCommitType": "test", - "semanticCommitScope": "deps" - }, - { - "packagePatterns": [ - "^com.google.cloud:google-cloud-" - ], - "ignoreUnstable": false - }, - { - "packagePatterns": [ - "^com.fasterxml.jackson.core" - ], - "groupName": "jackson dependencies" - } - ], - "semanticCommits": true, - "masterIssue": true -} diff --git a/src/main/java/com/google/api/core/AbstractApiFuture.java b/src/main/java/com/google/api/core/AbstractApiFuture.java deleted file mode 100644 index 04d17bb01..000000000 --- a/src/main/java/com/google/api/core/AbstractApiFuture.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import com.google.common.util.concurrent.AbstractFuture; -import com.google.common.util.concurrent.ListenableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import javax.annotation.Nullable; - -/** Abstract implementation of ApiFuture that mirrors {@code AbstractFuture} in Guava. */ -public abstract class AbstractApiFuture implements ApiFuture { - private final InternalSettableFuture impl = new InternalSettableFuture(); - - public void addListener(Runnable listener, Executor executor) { - impl.addListener(listener, executor); - } - - public boolean cancel(boolean mayInterruptIfRunning) { - return impl.cancel(mayInterruptIfRunning); - } - - public V get() throws InterruptedException, ExecutionException { - return impl.get(); - } - - public V get(long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - return impl.get(timeout, unit); - } - - public boolean isCancelled() { - return impl.isCancelled(); - } - - public boolean isDone() { - return impl.isDone(); - } - - protected boolean set(V value) { - return impl.set(value); - } - - protected boolean setException(Throwable throwable) { - return impl.setException(throwable); - } - - protected void interruptTask() {} - - /* package-private for internal library use, to reduce call layering */ - ListenableFuture getInternalListenableFuture() { - return impl; - } - - private class InternalSettableFuture extends AbstractFuture { - @Override - protected boolean set(@Nullable V value) { - return super.set(value); - } - - @Override - protected boolean setException(Throwable throwable) { - return super.setException(throwable); - } - - protected void interruptTask() { - AbstractApiFuture.this.interruptTask(); - } - } -} diff --git a/src/main/java/com/google/api/core/AbstractApiService.java b/src/main/java/com/google/api/core/AbstractApiService.java deleted file mode 100644 index ce6cc6673..000000000 --- a/src/main/java/com/google/api/core/AbstractApiService.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import com.google.common.collect.ImmutableMap; -import com.google.common.util.concurrent.AbstractService; -import com.google.common.util.concurrent.Service; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** - * Base class for {@link ApiService}. Similar to Guava's {@code AbstractService} but redeclared so - * that Guava can be shaded. - */ -public abstract class AbstractApiService implements ApiService { - private static final ImmutableMap GUAVA_TO_API_SERVICE_STATE = - ImmutableMap.builder() - .put(Service.State.FAILED, ApiService.State.FAILED) - .put(Service.State.NEW, ApiService.State.NEW) - .put(Service.State.RUNNING, ApiService.State.RUNNING) - .put(Service.State.STARTING, ApiService.State.STARTING) - .put(Service.State.STOPPING, ApiService.State.STOPPING) - .put(Service.State.TERMINATED, ApiService.State.TERMINATED) - .build(); - - private final InnerService impl = new InnerService(); - - protected AbstractApiService() {} - - protected abstract void doStart(); - - protected abstract void doStop(); - - @Override - public void addListener(final ApiService.Listener listener, Executor executor) { - impl.addListener( - new Service.Listener() { - @Override - public void failed(Service.State from, Throwable failure) { - listener.failed(GUAVA_TO_API_SERVICE_STATE.get(from), failure); - } - - @Override - public void running() { - listener.running(); - } - - @Override - public void starting() { - listener.starting(); - } - - @Override - public void stopping(Service.State from) { - listener.stopping(GUAVA_TO_API_SERVICE_STATE.get(from)); - } - - @Override - public void terminated(Service.State from) { - listener.terminated(GUAVA_TO_API_SERVICE_STATE.get(from)); - } - }, - executor); - } - - public void awaitRunning() { - impl.awaitRunning(); - } - - public void awaitRunning(long timeout, TimeUnit unit) throws TimeoutException { - impl.awaitRunning(timeout, unit); - } - - public void awaitTerminated() { - impl.awaitTerminated(); - } - - public void awaitTerminated(long timeout, TimeUnit unit) throws TimeoutException { - impl.awaitTerminated(timeout, unit); - } - - public Throwable failureCause() { - return impl.failureCause(); - } - - public boolean isRunning() { - return impl.isRunning(); - } - - public ApiService startAsync() { - impl.startAsync(); - return this; - } - - public State state() { - return GUAVA_TO_API_SERVICE_STATE.get(impl.state()); - } - - public ApiService stopAsync() { - impl.stopAsync(); - return this; - } - - protected void notifyStarted() { - impl.innerNotifyStarted(); - } - - protected void notifyStopped() { - impl.innerNotifyStopped(); - } - - protected void notifyFailed(Throwable cause) { - impl.innerNotifyFailed(cause); - } - - private class InnerService extends AbstractService { - @Override - protected void doStart() { - AbstractApiService.this.doStart(); - } - - @Override - protected void doStop() { - AbstractApiService.this.doStop(); - } - - private void innerNotifyStarted() { - notifyStarted(); - } - - private void innerNotifyStopped() { - notifyStopped(); - } - - private void innerNotifyFailed(Throwable cause) { - notifyFailed(cause); - } - } -} diff --git a/src/main/java/com/google/api/core/ApiAsyncFunction.java b/src/main/java/com/google/api/core/ApiAsyncFunction.java deleted file mode 100644 index deb8d48e3..000000000 --- a/src/main/java/com/google/api/core/ApiAsyncFunction.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -/** - * Transforms a value, possibly asynchronously. - * - *

It is similar to Guava's {@code AsyncFunction}, redeclared so that Guava can be shaded. - */ -public interface ApiAsyncFunction { - /** - * Returns an output Future to use in place of the given input. The output Future need not be - * done, making AsyncFunction suitable for asynchronous derivations. - * - *

Throwing an exception from this method is equivalent to returning a failing Future. - */ - ApiFuture apply(I input) throws Exception; -} diff --git a/src/main/java/com/google/api/core/ApiClock.java b/src/main/java/com/google/api/core/ApiClock.java deleted file mode 100644 index c90e80332..000000000 --- a/src/main/java/com/google/api/core/ApiClock.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -/** - * An interface for getting the current value of a high-resolution time source, in nanoseconds. - * - *

Clocks other than {@link NanoClock} are typically used only for testing. - * - *

This interface is required in addition to Java 8's Clock, because nanoTime is required to - * compare values with io.grpc.CallOptions.getDeadlineNanoTime(). - */ -public interface ApiClock { - - /** Returns the current value of this clock's high-resolution time source, in nanoseconds. */ - long nanoTime(); - - /** Returns the current value of this clock's high-resolution time source, in milliseconds. */ - long millisTime(); -} diff --git a/src/main/java/com/google/api/core/ApiFunction.java b/src/main/java/com/google/api/core/ApiFunction.java deleted file mode 100644 index d03d93493..000000000 --- a/src/main/java/com/google/api/core/ApiFunction.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -/** - * Legacy version of Function. - * - *

It is similar to Guava's {@code Function}, redeclared so that Guava can be shaded. - */ -public interface ApiFunction { - T apply(F input); -} diff --git a/src/main/java/com/google/api/core/ApiFuture.java b/src/main/java/com/google/api/core/ApiFuture.java deleted file mode 100644 index 523747585..000000000 --- a/src/main/java/com/google/api/core/ApiFuture.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import java.util.concurrent.Executor; -import java.util.concurrent.Future; - -/** - * A Future that can have a listener added. - * - *

Similar to Guava's {@code ListenableFuture}, but redeclared so that Guava could be shaded. - */ -public interface ApiFuture extends Future { - void addListener(Runnable listener, Executor executor); -} diff --git a/src/main/java/com/google/api/core/ApiFutureCallback.java b/src/main/java/com/google/api/core/ApiFutureCallback.java deleted file mode 100644 index 78c0defe8..000000000 --- a/src/main/java/com/google/api/core/ApiFutureCallback.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -/** - * A callback for accepting the results of an {@link ApiFuture}. - * - *

It is similar to Guava's {@code FutureCallback}, redeclared so that Guava can be shaded. - */ -public interface ApiFutureCallback { - void onFailure(Throwable t); - - void onSuccess(V result); -} diff --git a/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java b/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java deleted file mode 100644 index e7c6e9f78..000000000 --- a/src/main/java/com/google/api/core/ApiFutureToListenableFuture.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import com.google.common.util.concurrent.ListenableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** INTERNAL USE ONLY. Adapter from ApiFuture to Guava ListenableFuture. */ -@InternalApi -public class ApiFutureToListenableFuture implements ListenableFuture { - private final ApiFuture apiFuture; - - public ApiFutureToListenableFuture(ApiFuture apiFuture) { - this.apiFuture = apiFuture; - } - - @Override - public void addListener(Runnable listener, Executor executor) { - apiFuture.addListener(listener, executor); - } - - @Override - public boolean cancel(boolean b) { - return apiFuture.cancel(b); - } - - @Override - public boolean isCancelled() { - return apiFuture.isCancelled(); - } - - @Override - public boolean isDone() { - return apiFuture.isDone(); - } - - @Override - public V get() throws InterruptedException, ExecutionException { - return apiFuture.get(); - } - - @Override - public V get(long l, TimeUnit timeUnit) - throws InterruptedException, ExecutionException, TimeoutException { - return apiFuture.get(l, timeUnit); - } -} diff --git a/src/main/java/com/google/api/core/ApiFutures.java b/src/main/java/com/google/api/core/ApiFutures.java deleted file mode 100644 index 2189a5e53..000000000 --- a/src/main/java/com/google/api/core/ApiFutures.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import static com.google.common.util.concurrent.MoreExecutors.directExecutor; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.AsyncFunction; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import java.util.List; -import java.util.concurrent.Executor; -import javax.annotation.Nullable; - -/** Static utility methods for the {@link ApiFuture} interface. */ -public final class ApiFutures { - private ApiFutures() {} - - /* - * @deprecated Use {@linkplain #addCallback(ApiFuture, ApiFutureCallback, Executor) the - * overload that requires an executor}. For identical behavior, pass {@link - * com.google.common.util.concurrent.MoreExecutors#directExecutor}, but consider whether - * another executor would be safer. - */ - @Deprecated - public static void addCallback( - final ApiFuture future, final ApiFutureCallback callback) { - addCallback(future, callback, directExecutor()); - } - - public static void addCallback( - final ApiFuture future, final ApiFutureCallback callback, Executor executor) { - Futures.addCallback( - listenableFutureForApiFuture(future), - new FutureCallback() { - @Override - public void onFailure(Throwable t) { - callback.onFailure(t); - } - - @Override - public void onSuccess(V v) { - callback.onSuccess(v); - } - }, - executor); - } - - /* - * @deprecated Use {@linkplain #catching(ApiFuture, Class, ApiFunction, Executor) the - * overload that requires an executor}. For identical behavior, pass {@link - * com.google.common.util.concurrent.MoreExecutors#directExecutor}, but consider whether - * another executor would be safer. - */ - @Deprecated - public static ApiFuture catching( - ApiFuture input, - Class exceptionType, - ApiFunction callback) { - return catching(input, exceptionType, callback, directExecutor()); - } - - public static ApiFuture catching( - ApiFuture input, - Class exceptionType, - ApiFunction callback, - Executor executor) { - ListenableFuture catchingFuture = - Futures.catching( - listenableFutureForApiFuture(input), - exceptionType, - new ApiFunctionToGuavaFunction(callback), - executor); - return new ListenableFutureToApiFuture(catchingFuture); - } - - @BetaApi - public static ApiFuture catchingAsync( - ApiFuture input, - Class exceptionType, - final ApiAsyncFunction callback, - Executor executor) { - ListenableFuture catchingFuture = - Futures.catchingAsync( - listenableFutureForApiFuture(input), - exceptionType, - new AsyncFunction() { - @Override - public ListenableFuture apply(X exception) throws Exception { - ApiFuture result = callback.apply(exception); - return listenableFutureForApiFuture(result); - } - }, - executor); - return new ListenableFutureToApiFuture<>(catchingFuture); - } - - public static ApiFuture immediateFuture(V value) { - return new ListenableFutureToApiFuture<>(Futures.immediateFuture(value)); - } - - public static ApiFuture immediateFailedFuture(Throwable throwable) { - return new ListenableFutureToApiFuture(Futures.immediateFailedFuture(throwable)); - } - - public static ApiFuture immediateCancelledFuture() { - return new ListenableFutureToApiFuture(Futures.immediateCancelledFuture()); - } - - /* - * @deprecated Use {@linkplain #transform(ApiFuture, ApiFunction, Executor) the - * overload that requires an executor}. For identical behavior, pass {@link - * com.google.common.util.concurrent.MoreExecutors#directExecutor}, but consider whether - * another executor would be safer. - */ - @Deprecated - public static ApiFuture transform( - ApiFuture input, final ApiFunction function) { - return transform(input, function, directExecutor()); - } - - public static ApiFuture transform( - ApiFuture input, - final ApiFunction function, - Executor executor) { - return new ListenableFutureToApiFuture<>( - Futures.transform( - listenableFutureForApiFuture(input), - new ApiFunctionToGuavaFunction(function), - executor)); - } - - public static ApiFuture> allAsList( - Iterable> futures) { - return new ListenableFutureToApiFuture<>( - Futures.allAsList( - Iterables.transform( - futures, - new Function, ListenableFuture>() { - public ListenableFuture apply(ApiFuture apiFuture) { - return listenableFutureForApiFuture(apiFuture); - } - }))); - } - - @BetaApi - public static ApiFuture> successfulAsList( - Iterable> futures) { - return new ListenableFutureToApiFuture<>( - Futures.successfulAsList( - Iterables.transform( - futures, - new Function, ListenableFuture>() { - public ListenableFuture apply(ApiFuture apiFuture) { - return listenableFutureForApiFuture(apiFuture); - } - }))); - } - - /* - * @deprecated Use {@linkplain #transformAsync(ApiFuture, ApiFunction, Executor) the - * overload that requires an executor}. For identical behavior, pass {@link - * com.google.common.util.concurrent.MoreExecutors#directExecutor}, but consider whether - * another executor would be safer. - */ - @Deprecated - public static ApiFuture transformAsync( - ApiFuture input, final ApiAsyncFunction function) { - return transformAsync(input, function, directExecutor()); - } - - public static ApiFuture transformAsync( - ApiFuture input, final ApiAsyncFunction function, Executor executor) { - ListenableFuture listenableInput = listenableFutureForApiFuture(input); - ListenableFuture listenableOutput = - Futures.transformAsync( - listenableInput, - new AsyncFunction() { - @Override - public ListenableFuture apply(I input) throws Exception { - return listenableFutureForApiFuture(function.apply(input)); - } - }, - executor); - return new ListenableFutureToApiFuture<>(listenableOutput); - } - - private static ListenableFuture listenableFutureForApiFuture(ApiFuture apiFuture) { - ListenableFuture listenableFuture; - if (apiFuture instanceof AbstractApiFuture) { - // prefer to use the wrapped ListenableFuture to reduce the number of layers - listenableFuture = ((AbstractApiFuture) apiFuture).getInternalListenableFuture(); - } else { - listenableFuture = new ApiFutureToListenableFuture(apiFuture); - } - return listenableFuture; - } - - private static class ApiFunctionToGuavaFunction - implements com.google.common.base.Function { - private ApiFunction f; - - public ApiFunctionToGuavaFunction(ApiFunction f) { - this.f = f; - } - - @Nullable - @Override - public V apply(@Nullable X input) { - return f.apply(input); - } - } -} diff --git a/src/main/java/com/google/api/core/ApiService.java b/src/main/java/com/google/api/core/ApiService.java deleted file mode 100644 index ee49e78f3..000000000 --- a/src/main/java/com/google/api/core/ApiService.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** - * An object with an operational state, plus asynchronous {@link #startAsync()} and {@link - * #stopAsync()} lifecycle methods to transition between states. Example services include - * webservers, RPC servers and timers. - * - *

The normal lifecycle of a service is: - * - *

    - *
  • {@linkplain State#NEW NEW} -> - *
  • {@linkplain State#STARTING STARTING} -> - *
  • {@linkplain State#RUNNING RUNNING} -> - *
  • {@linkplain State#STOPPING STOPPING} -> - *
  • {@linkplain State#TERMINATED TERMINATED} - *
- * - *

There are deviations from this if there are failures or if {@link ApiService#stopAsync} is - * called before the {@link ApiService} reaches the {@linkplain State#RUNNING RUNNING} state. The - * set of legal transitions form a DAG, therefore every method of the - * listener will be called at most once. N.B. The {@link State#FAILED} and {@link State#TERMINATED} - * states are terminal states, once a service enters either of these states it cannot ever leave - * them. - * - *

Implementors of this interface are strongly encouraged to extend {@link AbstractApiService} - * which implement this interface and make the threading and state management easier. - * - *

Similar to Guava's {@code Service}, but redeclared so that Guava could be shaded. - */ -public interface ApiService { - /** - * Registers a {@link Listener} to be {@linkplain Executor#execute executed} on the given - * executor. The listener will have the corresponding transition method called whenever the - * service changes state. The listener will not have previous state changes replayed, so it is - * suggested that listeners are added before the service starts. - * - *

{@code addListener} guarantees execution ordering across calls to a given listener but not - * across calls to multiple listeners. Specifically, a given listener will have its callbacks - * invoked in the same order as the underlying service enters those states. Additionally, at most - * one of the listener's callbacks will execute at once. However, multiple listeners' callbacks - * may execute concurrently, and listeners may execute in an order different from the one in which - * they were registered. - * - *

RuntimeExceptions thrown by a listener will be caught and logged. Any exception thrown - * during {@code Executor.execute} (e.g., a {@code RejectedExecutionException}) will be caught and - * logged. - * - * @param listener the listener to run when the service changes state is complete - * @param executor the executor in which the listeners callback methods will be run. - */ - void addListener(Listener listener, Executor executor); - - /** - * Waits for the {@link ApiService} to reach the {@linkplain State#RUNNING running state}. - * - * @throws IllegalStateException if the service reaches a state from which it is not possible to - * enter the {@link State#RUNNING} state. e.g. if the {@code state} is {@code - * State#TERMINATED} when this method is called then this will throw an IllegalStateException. - */ - void awaitRunning(); - - /** - * Waits for the {@link ApiService} to reach the {@linkplain State#RUNNING running state} for no - * more than the given time. - * - * @param timeout the maximum time to wait - * @param unit the time unit of the timeout argument - * @throws TimeoutException if the service has not reached the given state within the deadline - * @throws IllegalStateException if the service reaches a state from which it is not possible to - * enter the {@link State#RUNNING RUNNING} state. e.g. if the {@code state} is {@code - * State#TERMINATED} when this method is called then this will throw an IllegalStateException. - */ - void awaitRunning(long timeout, TimeUnit unit) throws TimeoutException; - - /** - * Waits for the {@link ApiService} to reach the {@linkplain State#TERMINATED terminated state}. - * - * @throws IllegalStateException if the service {@linkplain State#FAILED fails}. - */ - void awaitTerminated(); - - /** - * Waits for the {@link ApiService} to reach a terminal state (either {@link State#TERMINATED - * terminated} or {@link State#FAILED failed}) for no more than the given time. - * - * @param timeout the maximum time to wait - * @param unit the time unit of the timeout argument - * @throws TimeoutException if the service has not reached the given state within the deadline - * @throws IllegalStateException if the service {@linkplain State#FAILED fails}. - */ - void awaitTerminated(long timeout, TimeUnit unit) throws TimeoutException; - - /** - * Returns the {@link Throwable} that caused this service to fail. - * - * @throws IllegalStateException if this service's state isn't {@linkplain State#FAILED FAILED}. - */ - Throwable failureCause(); - - /** Returns {@code true} if this service is {@linkplain State#RUNNING running}. */ - boolean isRunning(); - - /** - * If the service state is {@link State#NEW}, this initiates service startup and returns - * immediately. A stopped service may not be restarted. - * - * @return this - * @throws IllegalStateException if the service is not {@link State#NEW} - */ - ApiService startAsync(); - - /** Returns the lifecycle state of the service. */ - State state(); - - /** - * If the service is {@linkplain State#STARTING starting} or {@linkplain State#RUNNING running}, - * this initiates service shutdown and returns immediately. If the service is {@linkplain - * State#NEW new}, it is {@linkplain State#TERMINATED terminated} without having been started nor - * stopped. If the service has already been stopped, this method returns immediately without - * taking action. - * - * @return this - */ - ApiService stopAsync(); - - /** - * The lifecycle states of a service. - * - *

The ordering of the {@link State} enum is defined such that if there is a state transition - * from {@code A -> B} then {@code A.compareTo(B) < 0}. N.B. The converse is not true, i.e. if - * {@code A.compareTo(B) < 0} then there is not guaranteed to be a valid state transition - * {@code A -> B}. - */ - @BetaApi - enum State { - /** - * A service in this state has encountered a problem and may not be operational. It cannot be - * started nor stopped. - */ - FAILED, - - /** A service in this state is inactive. It does minimal work and consumes minimal resources. */ - NEW, - - /** A service in this state is operational. */ - RUNNING, - - /** A service in this state is transitioning to {@link #RUNNING}. */ - STARTING, - - /** A service in this state is transitioning to {@link #TERMINATED}. */ - STOPPING, - - /** - * A service in this state has completed execution normally. It does minimal work and consumes - * minimal resources. - */ - TERMINATED - } - - /** - * A listener for the various state changes that a {@link ApiService} goes through in its - * lifecycle. - * - *

All methods are no-ops by default, implementors should override the ones they care about. - */ - @BetaApi - abstract class Listener { - /** - * Called when the service transitions to the {@linkplain State#FAILED FAILED} state. The - * {@linkplain State#FAILED FAILED} state is a terminal state in the transition diagram. - * Therefore, if this method is called, no other methods will be called on the {@link Listener}. - * - * @param from The previous state that is being transitioned from. Failure can occur in any - * state with the exception of {@linkplain State#NEW NEW} or {@linkplain State#TERMINATED - * TERMINATED}. - * @param failure The exception that caused the failure. - */ - public void failed(State from, Throwable failure) {} - - /** - * Called when the service transitions from {@linkplain State#STARTING STARTING} to {@linkplain - * State#RUNNING RUNNING}. This occurs when a service has successfully started. - */ - public void running() {} - - /** - * Called when the service transitions from {@linkplain State#NEW NEW} to {@linkplain - * State#STARTING STARTING}. This occurs when {@link ApiService#startAsync} is called the first - * time. - */ - public void starting() {} - - /** - * Called when the service transitions to the {@linkplain State#STOPPING STOPPING} state. The - * only valid values for {@code from} are {@linkplain State#STARTING STARTING} or {@linkplain - * State#RUNNING RUNNING}. This occurs when {@link ApiService#stopAsync} is called. - * - * @param from The previous state that is being transitioned from. - */ - public void stopping(State from) {} - - /** - * Called when the service transitions to the {@linkplain State#TERMINATED TERMINATED} state. - * The {@linkplain State#TERMINATED TERMINATED} state is a terminal state in the transition - * diagram. Therefore, if this method is called, no other methods will be called on the {@link - * Listener}. - * - * @param from The previous state that is being transitioned from. The only valid values for - * this are {@linkplain State#NEW NEW}, {@linkplain State#RUNNING RUNNING} or {@linkplain - * State#STOPPING STOPPING}. - */ - public void terminated(State from) {} - } -} diff --git a/src/main/java/com/google/api/core/BetaApi.java b/src/main/java/com/google/api/core/BetaApi.java deleted file mode 100644 index 4b6491b73..000000000 --- a/src/main/java/com/google/api/core/BetaApi.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates a public API that can change at any time, and has no guarantee of API stability and - * backward-compatibility. - * - *

Usage guidelines: - * - *

    - *
  1. This annotation is used only on APIs with public visibility. Internal interfaces should not - * use it. - *
  2. This annotation should only be added to new APIs. Adding it to an existing API is - * considered API-breaking. - *
  3. Removing this annotation from an API gives it stable status, assuming the API doesn't have - * other annotations denoting instability (such as {@link InternalApi} or {@link - * InternalExtensionOnly}). - *
- */ -@BetaApi -@Retention(RetentionPolicy.RUNTIME) -@Target({ - ElementType.ANNOTATION_TYPE, - ElementType.CONSTRUCTOR, - ElementType.FIELD, - ElementType.METHOD, - ElementType.PACKAGE, - ElementType.TYPE -}) -@Documented -public @interface BetaApi { - /** Context information such as links to a discussion thread, tracking issue, etc. */ - String value() default ""; -} diff --git a/src/main/java/com/google/api/core/CurrentMillisClock.java b/src/main/java/com/google/api/core/CurrentMillisClock.java deleted file mode 100644 index 62d2efa39..000000000 --- a/src/main/java/com/google/api/core/CurrentMillisClock.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.google.api.core; - -import java.io.ObjectStreamException; -import java.io.Serializable; -import java.util.concurrent.TimeUnit; - -/** - * Implementation of the {@link ApiClock} interface, which uses {@link System#currentTimeMillis()} - * as time source. - */ -public final class CurrentMillisClock implements ApiClock, Serializable { - - private static final long serialVersionUID = -6019259882852183285L; - private static final ApiClock DEFAULT_CLOCK = new CurrentMillisClock(); - - public static ApiClock getDefaultClock() { - return DEFAULT_CLOCK; - } - - private CurrentMillisClock() {} - - @Override - public long nanoTime() { - return TimeUnit.NANOSECONDS.convert(millisTime(), TimeUnit.MILLISECONDS); - } - - @Override - public long millisTime() { - return System.currentTimeMillis(); - } - - private Object readResolve() throws ObjectStreamException { - return DEFAULT_CLOCK; - } -} diff --git a/src/main/java/com/google/api/core/ForwardingApiFuture.java b/src/main/java/com/google/api/core/ForwardingApiFuture.java deleted file mode 100644 index 1d814f4bf..000000000 --- a/src/main/java/com/google/api/core/ForwardingApiFuture.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class ForwardingApiFuture implements ApiFuture { - private final ApiFuture delegate; - - public ForwardingApiFuture(ApiFuture delegate) { - this.delegate = delegate; - } - - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return delegate.cancel(mayInterruptIfRunning); - } - - @Override - public T get() throws InterruptedException, ExecutionException { - return delegate.get(); - } - - @Override - public T get(long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - return delegate.get(timeout, unit); - } - - @Override - public boolean isCancelled() { - return delegate.isCancelled(); - } - - @Override - public boolean isDone() { - return delegate.isDone(); - } - - @Override - public void addListener(Runnable listener, Executor executor) { - delegate.addListener(listener, executor); - } -} diff --git a/src/main/java/com/google/api/core/InternalApi.java b/src/main/java/com/google/api/core/InternalApi.java deleted file mode 100644 index 80b76706c..000000000 --- a/src/main/java/com/google/api/core/InternalApi.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotates a program element (class, method, package etc) which is internal to its containing - * library, not part of the public API, and should not be used by users of the library. - * - *

This annotation only makes sense on APIs that are not private. Its existence is necessary - * because Java does not have a visibility level for code within a compilation unit. - * - *

Adding this annotation to an API is considered API-breaking. - */ -@BetaApi -@Retention(RetentionPolicy.RUNTIME) -@Target({ - ElementType.ANNOTATION_TYPE, - ElementType.CONSTRUCTOR, - ElementType.FIELD, - ElementType.METHOD, - ElementType.PACKAGE, - ElementType.TYPE -}) -@Documented -public @interface InternalApi { - /** Context information such as "internal to library", "for testing", etc. */ - String value() default ""; -} diff --git a/src/main/java/com/google/api/core/InternalExtensionOnly.java b/src/main/java/com/google/api/core/InternalExtensionOnly.java deleted file mode 100644 index 2304f77d6..000000000 --- a/src/main/java/com/google/api/core/InternalExtensionOnly.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates a public API that is stable for callers to use, but has no guarantee of stability for - * extension. Consequently, the API should only be extended within the package containing the API. - * - *

For example: - * - *

    - *
  • An interface marked with this annotation can have new methods added to it. - *
  • A non-final class with this annotation can be marked final. - *
  • A class with this annotation can have new abstract methods added. - *
  • a non-final method with this annotation can be marked final. - *
- * - *

The list above is just for illustration purposes and is not exhaustive. - * - *

Adding this annotation to an API is considered API-breaking. - */ -@BetaApi -@Retention(RetentionPolicy.RUNTIME) -@Target({ - ElementType.ANNOTATION_TYPE, - ElementType.CONSTRUCTOR, - ElementType.FIELD, - ElementType.METHOD, - ElementType.PACKAGE, - ElementType.TYPE -}) -@Documented -public @interface InternalExtensionOnly { - /** Context information on why the interface/class is annotated with InternalExtensionOnly. */ - String value() default ""; -} diff --git a/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java b/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java deleted file mode 100644 index fe77f56d3..000000000 --- a/src/main/java/com/google/api/core/ListenableFutureToApiFuture.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import com.google.common.util.concurrent.ForwardingListenableFuture.SimpleForwardingListenableFuture; -import com.google.common.util.concurrent.ListenableFuture; - -/** INTERNAL USE ONLY. Adapter from Guava ListenableFuture to ApiFuture. */ -@InternalApi -public class ListenableFutureToApiFuture extends SimpleForwardingListenableFuture - implements ApiFuture { - public ListenableFutureToApiFuture(ListenableFuture delegate) { - super(delegate); - } -} diff --git a/src/main/java/com/google/api/core/NanoClock.java b/src/main/java/com/google/api/core/NanoClock.java deleted file mode 100644 index 27d587a7c..000000000 --- a/src/main/java/com/google/api/core/NanoClock.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import java.io.ObjectStreamException; -import java.io.Serializable; -import java.util.concurrent.TimeUnit; - -/** Default implementation of the ApiClock interface, using call to System.nanoTime(). */ -public final class NanoClock implements ApiClock, Serializable { - - private static final ApiClock DEFAULT_CLOCK = new NanoClock(); - private static final long serialVersionUID = 5541462688633944865L; - - public static ApiClock getDefaultClock() { - return DEFAULT_CLOCK; - } - - private NanoClock() {} - - @Override - public final long nanoTime() { - return System.nanoTime(); - } - - @Override - public final long millisTime() { - return TimeUnit.MILLISECONDS.convert(nanoTime(), TimeUnit.NANOSECONDS); - } - - private Object readResolve() throws ObjectStreamException { - return DEFAULT_CLOCK; - } -} diff --git a/src/main/java/com/google/api/core/SettableApiFuture.java b/src/main/java/com/google/api/core/SettableApiFuture.java deleted file mode 100644 index babcdd6d4..000000000 --- a/src/main/java/com/google/api/core/SettableApiFuture.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -/** - * An {@link ApiFuture} whose result can be set. Similar to Guava's {@code SettableFuture}, but - * redeclared so that Guava could be shaded. - */ -public final class SettableApiFuture extends AbstractApiFuture { - - private SettableApiFuture() {} - - public static SettableApiFuture create() { - return new SettableApiFuture<>(); - } - - @Override - public boolean set(V value) { - return super.set(value); - } - - @Override - public boolean setException(Throwable throwable) { - return super.setException(throwable); - } -} diff --git a/src/main/java/com/google/api/pathtemplate/PathTemplate.java b/src/main/java/com/google/api/pathtemplate/PathTemplate.java deleted file mode 100644 index cc9f4c110..000000000 --- a/src/main/java/com/google/api/pathtemplate/PathTemplate.java +++ /dev/null @@ -1,1213 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.google.api.pathtemplate; - -import com.google.auto.value.AutoValue; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.annotation.Nullable; - -/** - * Represents a path template. - * - *

Templates use the syntax of the API platform; see the protobuf of HttpRule for details. A - * template consists of a sequence of literals, wildcards, and variable bindings, where each binding - * can have a sub-path. A string representation can be parsed into an instance of {@link - * PathTemplate}, which can then be used to perform matching and instantiation. - * - *

Matching and instantiation deals with unescaping and escaping using URL encoding rules. For - * example, if a template variable for a single segment is instantiated with a string like {@code - * "a/b"}, the slash will be escaped to {@code "%2f"}. (Note that slash will not be escaped for a - * multiple-segment variable, but other characters will). The literals in the template itself are - * not escaped automatically, and must be already URL encoded. - * - *

Here is an example for a template using simple variables: - * - *

{@code
- * PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}");
- * assert template.matches("v2/shelves") == false;
- * Map<String, String> values = template.match("v1/shelves/s1/books/b1");
- * Map<String, String> expectedValues = new HashMap<>();
- * expectedValues.put("shelf", "s1");
- * expectedValues.put("book", "b1");
- * assert values.equals(expectedValues);
- * assert template.instantiate(values).equals("v1/shelves/s1/books/b1");
- * }
- * - * Templates can use variables which match sub-paths. Example: - * - *
{@code
- * PathTemplate template = PathTemplate.create("v1/{name=shelves/*/books/*}"};
- * assert template.match("v1/shelves/books/b1") == null;
- * Map<String, String> expectedValues = new HashMap<>();
- * expectedValues.put("name", "shelves/s1/books/b1");
- * assert template.match("v1/shelves/s1/books/b1").equals(expectedValues);
- * }
- * - * Path templates can also be used with only wildcards. Each wildcard is associated with an implicit - * variable {@code $n}, where n is the zero-based position of the wildcard. Example: - * - *
{@code
- * PathTemplate template = PathTemplate.create("shelves/*/books/*"};
- * assert template.match("shelves/books/b1") == null;
- * Map<String, String> values = template.match("v1/shelves/s1/books/b1");
- * Map<String, String> expectedValues = new HashMap<>();
- * expectedValues.put("$0", s1");
- * expectedValues.put("$1", "b1");
- * assert values.equals(expectedValues);
- * }
- * - * Paths input to matching can use URL relative syntax to indicate a host name by prefixing the host - * name, as in {@code //somewhere.io/some/path}. The host name is matched into the special variable - * {@link #HOSTNAME_VAR}. Patterns are agnostic about host names, and the same pattern can be used - * for URL relative syntax and simple path syntax: - * - *
{@code
- * PathTemplate template = PathTemplate.create("shelves/*"};
- * Map<String, String> expectedValues = new HashMap<>();
- * expectedValues.put(PathTemplate.HOSTNAME_VAR, "//somewhere.io");
- * expectedValues.put("$0", s1");
- * assert template.match("//somewhere.io/shelves/s1").equals(expectedValues);
- * expectedValues.clear();
- * expectedValues.put("$0", s1");
- * assert template.match("shelves/s1").equals(expectedValues);
- * }
- * - * For the representation of a resource name see {@link TemplatedResourceName}, which is - * based on path templates. - */ -public class PathTemplate { - - /** - * A constant identifying the special variable used for endpoint bindings in the result of {@link - * #matchFromFullName(String)}. It may also contain protocol string, if its provided in the input. - */ - public static final String HOSTNAME_VAR = "$hostname"; - - // A regexp to match a custom verb at the end of a path. - private static final Pattern CUSTOM_VERB_PATTERN = Pattern.compile(":([^/*}{=]+)$"); - - // A regex to match a hostname with or without protocol. - private static final Pattern HOSTNAME_PATTERN = Pattern.compile("^(\\w+:)?//"); - - // A splitter on slash. - private static final Splitter SLASH_SPLITTER = Splitter.on('/').trimResults(); - - // A regex to match the valid complex resource ID delimiters. - private static final Pattern COMPLEX_DELIMITER_PATTERN = Pattern.compile("[_\\-\\.~]"); - - // A regex to match multiple complex resource ID delimiters. - private static final Pattern MULTIPLE_COMPLEX_DELIMITER_PATTERN = - Pattern.compile("\\}[_\\-\\.~]{2,}\\{"); - - // A regex to match a missing complex resource ID delimiter. - private static final Pattern MISSING_COMPLEX_DELIMITER_PATTERN = Pattern.compile("\\}\\{"); - - // A regex to match invalid complex resource ID delimiters. - private static final Pattern INVALID_COMPLEX_DELIMITER_PATTERN = - Pattern.compile("\\}[^_\\-\\.~]\\{"); - - // A regex to match a closing segment (end brace) followed by one complex resource ID delimiter. - private static final Pattern END_SEGMENT_COMPLEX_DELIMITER_PATTERN = - Pattern.compile("\\}[_\\-\\.~]{1}"); - - // Helper Types - // ============ - - /** Specifies a path segment kind. */ - enum SegmentKind { - /** A literal path segment. */ - LITERAL, - - /** A custom verb. Can only appear at the end of path. */ - CUSTOM_VERB, - - /** A simple wildcard ('*'). */ - WILDCARD, - - /** A path wildcard ('**'). */ - PATH_WILDCARD, - - /** A field binding start. */ - BINDING, - - /** A field binding end. */ - END_BINDING, - } - - /** Specifies a path segment. */ - @AutoValue - abstract static class Segment { - - /** A constant for the WILDCARD segment. */ - private static final Segment WILDCARD = create(SegmentKind.WILDCARD, "*"); - - /** A constant for the PATH_WILDCARD segment. */ - private static final Segment PATH_WILDCARD = create(SegmentKind.PATH_WILDCARD, "**"); - - /** A constant for the END_BINDING segment. */ - private static final Segment END_BINDING = create(SegmentKind.END_BINDING, ""); - - /** Creates a segment of given kind and value. */ - private static Segment create(SegmentKind kind, String value) { - return new AutoValue_PathTemplate_Segment(kind, value, ""); - } - - /** Creates a segment of given kind, value, and complex separator. */ - private static Segment create(SegmentKind kind, String value, String complexSeparator) { - return new AutoValue_PathTemplate_Segment(kind, value, complexSeparator); - } - - private static Segment wildcardCreate(String complexSeparator) { - return new AutoValue_PathTemplate_Segment( - SegmentKind.WILDCARD, - "*", - !complexSeparator.isEmpty() && COMPLEX_DELIMITER_PATTERN.matcher(complexSeparator).find() - ? complexSeparator - : ""); - } - - /** The path segment kind. */ - abstract SegmentKind kind(); - - /** - * The value for the segment. For literals, custom verbs, and wildcards, this reflects the value - * as it appears in the template. For bindings, this represents the variable of the binding. - */ - abstract String value(); - - abstract String complexSeparator(); - - /** Returns true of this segment is one of the wildcards, */ - boolean isAnyWildcard() { - return kind() == SegmentKind.WILDCARD || kind() == SegmentKind.PATH_WILDCARD; - } - - String separator() { - switch (kind()) { - case CUSTOM_VERB: - return ":"; - case END_BINDING: - return ""; - default: - return "/"; - } - } - } - - /** - * Creates a path template from a string. The string must satisfy the syntax of path templates of - * the API platform; see HttpRule's proto source. - * - * @throws ValidationException if there are errors while parsing the template. - */ - public static PathTemplate create(String template) { - return create(template, true); - } - - /** - * Creates a path template from a string. The string must satisfy the syntax of path templates of - * the API platform; see HttpRule's proto source. Url encoding of template variables is disabled. - * - * @throws ValidationException if there are errors while parsing the template. - */ - public static PathTemplate createWithoutUrlEncoding(String template) { - return create(template, false); - } - - private static PathTemplate create(String template, boolean urlEncoding) { - return new PathTemplate(parseTemplate(template), urlEncoding); - } - - // Instance State and Methods - // ========================== - - // List of segments of this template. - private final ImmutableList segments; - - // Map from variable names to bindings in the template. - private final ImmutableMap bindings; - - // Control use of URL encoding - private final boolean urlEncoding; - - private PathTemplate(Iterable segments, boolean urlEncoding) { - this.segments = ImmutableList.copyOf(segments); - if (this.segments.isEmpty()) { - throw new ValidationException("template cannot be empty."); - } - Map bindings = Maps.newLinkedHashMap(); - for (Segment seg : this.segments) { - if (seg.kind() == SegmentKind.BINDING) { - if (bindings.containsKey(seg.value())) { - throw new ValidationException("Duplicate binding '%s'", seg.value()); - } - bindings.put(seg.value(), seg); - } - } - this.bindings = ImmutableMap.copyOf(bindings); - this.urlEncoding = urlEncoding; - } - - /** Returns the set of variable names used in the template. */ - public Set vars() { - return bindings.keySet(); - } - - /** - * Returns a template for the parent of this template. - * - * @throws ValidationException if the template has no parent. - */ - public PathTemplate parentTemplate() { - int i = segments.size(); - Segment seg = segments.get(--i); - if (seg.kind() == SegmentKind.END_BINDING) { - while (i > 0 && segments.get(--i).kind() != SegmentKind.BINDING) {} - } - if (i == 0) { - throw new ValidationException("template does not have a parent"); - } - return new PathTemplate(segments.subList(0, i), urlEncoding); - } - - /** - * Returns a template where all variable bindings have been replaced by wildcards, but which is - * equivalent regards matching to this one. - */ - public PathTemplate withoutVars() { - StringBuilder result = new StringBuilder(); - ListIterator iterator = segments.listIterator(); - boolean start = true; - while (iterator.hasNext()) { - Segment seg = iterator.next(); - switch (seg.kind()) { - case BINDING: - case END_BINDING: - break; - default: - if (!start) { - result.append(seg.separator()); - } else { - start = false; - } - result.append(seg.value()); - } - } - return create(result.toString(), urlEncoding); - } - - /** - * Returns a path template for the sub-path of the given variable. Example: - * - *
{@code
-   * PathTemplate template = PathTemplate.create("v1/{name=shelves/*/books/*}");
-   * assert template.subTemplate("name").toString().equals("shelves/*/books/*");
-   * }
- * - * The returned template will never have named variables, but only wildcards, which are dealt with - * in matching and instantiation using '$n'-variables. See the documentation of {@link - * #match(String)} and {@link #instantiate(Map)}, respectively. - * - *

For a variable which has no sub-path, this returns a path template with a single wildcard - * ('*'). - * - * @throws ValidationException if the variable does not exist in the template. - */ - public PathTemplate subTemplate(String varName) { - List sub = Lists.newArrayList(); - boolean inBinding = false; - for (Segment seg : segments) { - if (seg.kind() == SegmentKind.BINDING && seg.value().equals(varName)) { - inBinding = true; - } else if (inBinding) { - if (seg.kind() == SegmentKind.END_BINDING) { - return PathTemplate.create(toSyntax(sub, true), urlEncoding); - } else { - sub.add(seg); - } - } - } - throw new ValidationException( - String.format("Variable '%s' is undefined in template '%s'", varName, this.toRawString())); - } - - /** Returns true of this template ends with a literal. */ - public boolean endsWithLiteral() { - return segments.get(segments.size() - 1).kind() == SegmentKind.LITERAL; - } - - /** Returns true of this template ends with a custom verb. */ - public boolean endsWithCustomVerb() { - return segments.get(segments.size() - 1).kind() == SegmentKind.CUSTOM_VERB; - } - - /** - * Creates a resource name from this template and a path. - * - * @throws ValidationException if the path does not match the template. - */ - public TemplatedResourceName parse(String path) { - return TemplatedResourceName.create(this, path); - } - - /** - * Returns the name of a singleton variable used by this template. If the template does not - * contain a single variable, returns null. - */ - @Nullable - public String singleVar() { - if (bindings.size() == 1) { - return bindings.entrySet().iterator().next().getKey(); - } - return null; - } - - // Template Matching - // ================= - - /** - * Throws a ValidationException if the template doesn't match the path. The exceptionMessagePrefix - * parameter will be prepended to the ValidationException message. - */ - public void validate(String path, String exceptionMessagePrefix) { - if (!matches(path)) { - throw new ValidationException( - String.format( - "%s: Parameter \"%s\" must be in the form \"%s\"", - exceptionMessagePrefix, path, this.toString())); - } - } - - /** - * Matches the path, returning a map from variable names to matched values. All matched values - * will be properly unescaped using URL encoding rules. If the path does not match the template, - * throws a ValidationException. The exceptionMessagePrefix parameter will be prepended to the - * ValidationException message. - * - *

If the path starts with '//', the first segment will be interpreted as a host name and - * stored in the variable {@link #HOSTNAME_VAR}. - * - *

See the {@link PathTemplate} class documentation for examples. - * - *

For free wildcards in the template, the matching process creates variables named '$n', where - * 'n' is the wildcard's position in the template (starting at n=0). For example: - * - *

{@code
-   * PathTemplate template = PathTemplate.create("shelves/*/books/*");
-   * Map<String, String> expectedValues = new HashMap<>();
-   * expectedValues.put("$0", "s1");
-   * expectedValues.put("$1", "b1");
-   * assert template.validatedMatch("shelves/s1/books/b2", "User exception string")
-   *            .equals(expectedValues);
-   * expectedValues.clear();
-   * expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
-   * expectedValues.put("$0", "s1");
-   * expectedValues.put("$1", "b1");
-   * assert template.validatedMatch("//somewhere.io/shelves/s1/books/b2", "User exception string")
-   *            .equals(expectedValues);
-   * }
- * - * All matched values will be properly unescaped using URL encoding rules (so long as URL encoding - * has not been disabled by the {@link #createWithoutUrlEncoding} method). - */ - public Map validatedMatch(String path, String exceptionMessagePrefix) { - Map matchMap = match(path); - if (matchMap == null) { - throw new ValidationException( - String.format( - "%s: Parameter \"%s\" must be in the form \"%s\"", - exceptionMessagePrefix, path, this.toString())); - } - return matchMap; - } - - /** Returns true if the template matches the path. */ - public boolean matches(String path) { - return match(path) != null; - } - - /** - * Matches the path, returning a map from variable names to matched values. All matched values - * will be properly unescaped using URL encoding rules. If the path does not match the template, - * null is returned. - * - *

If the path starts with '//', the first segment will be interpreted as a host name and - * stored in the variable {@link #HOSTNAME_VAR}. - * - *

See the {@link PathTemplate} class documentation for examples. - * - *

For free wildcards in the template, the matching process creates variables named '$n', where - * 'n' is the wildcard's position in the template (starting at n=0). For example: - * - *

{@code
-   * PathTemplate template = PathTemplate.create("shelves/*/books/*");
-   * Map<String, String> expectedValues = new HashMap<>();
-   * expectedValues.put("$0", "s1");
-   * expectedValues.put("$1", "b1");
-   * assert template.match("shelves/s1/books/b2").equals(expectedValues);
-   * expectedValues.clear();
-   * expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
-   * expectedValues.put("$0", "s1");
-   * expectedValues.put("$1", "b1");
-   * assert template.match("//somewhere.io/shelves/s1/books/b2").equals(expectedValues);
-   * }
- * - * All matched values will be properly unescaped using URL encoding rules (so long as URL encoding - * has not been disabled by the {@link #createWithoutUrlEncoding} method). - */ - @Nullable - public Map match(String path) { - return match(path, false); - } - - /** - * Matches the path, where the first segment is interpreted as the host name regardless of whether - * it starts with '//' or not. Example: - * - *
{@code
-   * Map<String, String> expectedValues = new HashMap<>();
-   * expectedValues.put(HOSTNAME_VAR, "//somewhere.io");
-   * expectedValues.put("name", "shelves/s1");
-   * assert template("{name=shelves/*}").matchFromFullName("somewhere.io/shelves/s1")
-   *          .equals(expectedValues);
-   * }
- */ - @Nullable - public Map matchFromFullName(String path) { - return match(path, true); - } - - // Matches a path. - private Map match(String path, boolean forceHostName) { - // Quick check for trailing custom verb. - Segment last = segments.get(segments.size() - 1); - if (last.kind() == SegmentKind.CUSTOM_VERB) { - Matcher matcher = CUSTOM_VERB_PATTERN.matcher(path); - if (!matcher.find() || !decodeUrl(matcher.group(1)).equals(last.value())) { - return null; - } - path = path.substring(0, matcher.start(0)); - } - - Matcher matcher = HOSTNAME_PATTERN.matcher(path); - boolean withHostName = matcher.find(); - if (withHostName) { - path = matcher.replaceFirst(""); - } - List input = SLASH_SPLITTER.splitToList(path); - int inPos = 0; - Map values = Maps.newLinkedHashMap(); - if (withHostName || forceHostName) { - if (input.isEmpty()) { - return null; - } - String hostName = input.get(inPos++); - if (withHostName) { - // Put the // back, so we can distinguish this case from forceHostName. - hostName = matcher.group(0) + hostName; - } - values.put(HOSTNAME_VAR, hostName); - } - if (withHostName) { - inPos = alignInputToAlignableSegment(input, inPos, segments.get(0)); - } - if (!match(input, inPos, segments, 0, values)) { - return null; - } - return ImmutableMap.copyOf(values); - } - - // Aligns input to start of literal value of literal or binding segment if input contains - // hostname. - private int alignInputToAlignableSegment(List input, int inPos, Segment segment) { - switch (segment.kind()) { - case BINDING: - inPos = alignInputPositionToLiteral(input, inPos, segment.value() + "s"); - return inPos + 1; - case LITERAL: - return alignInputPositionToLiteral(input, inPos, segment.value()); - } - return inPos; - } - - // Aligns input to start of literal value if input contains hostname. - private int alignInputPositionToLiteral( - List input, int inPos, String literalSegmentValue) { - for (; inPos < input.size(); inPos++) { - if (literalSegmentValue.equals(input.get(inPos))) { - return inPos; - } - } - return inPos; - } - - // Tries to match the input based on the segments at given positions. Returns a boolean - // indicating whether the match was successful. - private boolean match( - List input, - int inPos, - List segments, - int segPos, - Map values) { - String currentVar = null; - List modifiableInput = new ArrayList<>(input); - while (segPos < segments.size()) { - Segment seg = segments.get(segPos++); - switch (seg.kind()) { - case END_BINDING: - // End current variable binding scope. - currentVar = null; - continue; - case BINDING: - // Start variable binding scope. - currentVar = seg.value(); - continue; - case CUSTOM_VERB: - // This is the final segment, and this check should have already been performed by the - // caller. The matching value is no longer present in the input. - break; - case LITERAL: - case WILDCARD: - if (inPos >= modifiableInput.size()) { - // End of input - return false; - } - // Check literal match. - String next = decodeUrl(modifiableInput.get(inPos++)); - if (seg.kind() == SegmentKind.LITERAL) { - if (!seg.value().equals(next)) { - // Literal does not match. - return false; - } - } - if (seg.kind() == SegmentKind.WILDCARD && !seg.complexSeparator().isEmpty()) { - // Parse the complex resource separators one by one. - int complexSeparatorIndex = next.indexOf(seg.complexSeparator()); - if (complexSeparatorIndex >= 0) { - modifiableInput.add(inPos, next.substring(complexSeparatorIndex + 1)); - next = next.substring(0, complexSeparatorIndex); - modifiableInput.set(inPos - 1, next); - } else { - // No complex resource ID separator found in the literal when we expected one. - return false; - } - } - if (currentVar != null) { - // Create or extend current match - values.put(currentVar, concatCaptures(values.get(currentVar), next)); - } - break; - case PATH_WILDCARD: - // Compute the number of additional input the ** can consume. This - // is possible because we restrict patterns to have only one **. - int segsToMatch = 0; - for (int i = segPos; i < segments.size(); i++) { - switch (segments.get(i).kind()) { - case BINDING: - case END_BINDING: - case CUSTOM_VERB: - // These segments do not actually consume any input. - continue; - default: - segsToMatch++; - } - } - int available = (modifiableInput.size() - inPos) - segsToMatch; - // If this segment is empty, make sure it is still captured. - if (available == 0 && !values.containsKey(currentVar)) { - values.put(currentVar, ""); - } - while (available-- > 0) { - values.put( - currentVar, - concatCaptures(values.get(currentVar), decodeUrl(modifiableInput.get(inPos++)))); - } - } - } - return inPos == modifiableInput.size(); - } - - private static String concatCaptures(@Nullable String cur, String next) { - return cur == null ? next : cur + "/" + next; - } - - // Template Instantiation - // ====================== - - /** - * Instantiate the template based on the given variable assignment. Performs proper URL escaping - * of variable assignments. - * - *

Note that free wildcards in the template must have bindings of '$n' variables, where 'n' is - * the position of the wildcard (starting at 0). See the documentation of {@link #match(String)} - * for details. - * - * @throws ValidationException if a variable occurs in the template without a binding. - */ - public String instantiate(Map values) { - return instantiate(values, false); - } - - /** Shortcut for {@link #instantiate(Map)} with a vararg parameter for keys and values. */ - public String instantiate(String... keysAndValues) { - ImmutableMap.Builder builder = ImmutableMap.builder(); - for (int i = 0; i < keysAndValues.length; i += 2) { - builder.put(keysAndValues[i], keysAndValues[i + 1]); - } - return instantiate(builder.build()); - } - - /** - * Same like {@link #instantiate(Map)} but allows for unbound variables, which are substituted - * using their original syntax. Example: - * - *

{@code
-   * PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}");
-   * Map<String, String> partialMap = new HashMap<>();
-   * partialMap.put("shelf", "s1");
-   * assert template.instantiatePartial(partialMap).equals("v1/shelves/s1/books/{book}");
-   * }
- * - * The result of this call can be used to create a new template. - */ - public String instantiatePartial(Map values) { - return instantiate(values, true); - } - - private String instantiate(Map values, boolean allowPartial) { - StringBuilder result = new StringBuilder(); - if (values.containsKey(HOSTNAME_VAR)) { - result.append(values.get(HOSTNAME_VAR)); - result.append('/'); - } - boolean continueLast = true; // Whether to not append separator - boolean skip = false; // Whether we are substituting a binding and segments shall be skipped. - ListIterator iterator = segments.listIterator(); - String prevSeparator = ""; - while (iterator.hasNext()) { - Segment seg = iterator.next(); - if (!skip && !continueLast) { - String separator = - prevSeparator.isEmpty() || !iterator.hasNext() ? seg.separator() : prevSeparator; - result.append(separator); - prevSeparator = seg.complexSeparator().isEmpty() ? seg.separator() : seg.complexSeparator(); - } - continueLast = false; - switch (seg.kind()) { - case BINDING: - String var = seg.value(); - String value = values.get(seg.value()); - if (value == null) { - if (!allowPartial) { - throw new ValidationException( - String.format("Unbound variable '%s'. Bindings: %s", var, values)); - } - // Append pattern to output - if (var.startsWith("$")) { - // Eliminate positional variable. - result.append(iterator.next().value()); - iterator.next(); - continue; - } - result.append('{'); - result.append(seg.value()); - result.append('='); - continueLast = true; - continue; - } - Segment next = iterator.next(); - Segment nextNext = iterator.next(); - boolean pathEscape = - next.kind() == SegmentKind.PATH_WILDCARD - || nextNext.kind() != SegmentKind.END_BINDING; - restore(iterator, iterator.nextIndex() - 2); - if (!pathEscape) { - result.append(encodeUrl(value)); - } else { - // For a path wildcard or path of length greater 1, split the value and escape - // every sub-segment. - boolean first = true; - for (String subSeg : SLASH_SPLITTER.split(value)) { - if (!first) { - result.append('/'); - } - first = false; - result.append(encodeUrl(subSeg)); - } - } - skip = true; - continue; - case END_BINDING: - if (!skip) { - result.append('}'); - } - skip = false; - continue; - default: - if (!skip) { - result.append(seg.value()); - } - } - } - return result.toString(); - } - - // Positional Matching and Instantiation - // ===================================== - - /** - * Instantiates the template from the given positional parameters. The template must not be build - * from named bindings, but only contain wildcards. Each parameter position corresponds to a - * wildcard of the according position in the template. - */ - public String encode(String... values) { - ImmutableMap.Builder builder = ImmutableMap.builder(); - int i = 0; - for (String value : values) { - builder.put("$" + i++, value); - } - // We will get an error if there are named bindings which are not reached by values. - return instantiate(builder.build()); - } - - /** - * Matches the template into a list of positional values. The template must not be build from - * named bindings, but only contain wildcards. For each wildcard in the template, a value is - * returned at corresponding position in the list. - */ - public List decode(String path) { - Map match = match(path); - if (match == null) { - throw new IllegalArgumentException( - String.format("template '%s' does not match '%s'", this, path)); - } - List result = Lists.newArrayList(); - for (Map.Entry entry : match.entrySet()) { - String key = entry.getKey(); - if (!key.startsWith("$")) { - throw new IllegalArgumentException("template must not contain named bindings"); - } - int i = Integer.parseInt(key.substring(1)); - while (result.size() <= i) { - result.add(""); - } - result.set(i, entry.getValue()); - } - return ImmutableList.copyOf(result); - } - - // Template Parsing - // ================ - - private static ImmutableList parseTemplate(String template) { - // Skip useless leading slash. - if (template.startsWith("/")) { - template = template.substring(1); - } - - // Extract trailing custom verb. - Matcher matcher = CUSTOM_VERB_PATTERN.matcher(template); - String customVerb = null; - if (matcher.find()) { - customVerb = matcher.group(1); - template = template.substring(0, matcher.start(0)); - } - - ImmutableList.Builder builder = ImmutableList.builder(); - String varName = null; - int freeWildcardCounter = 0; - int pathWildCardBound = 0; - - for (String seg : Splitter.on('/').trimResults().split(template)) { - // Handle _deleted-topic_ for PubSub. - if (seg.equals("_deleted-topic_")) { - builder.add(Segment.create(SegmentKind.LITERAL, seg)); - continue; - } - - boolean isLastSegment = (template.indexOf(seg) + seg.length()) == template.length(); - boolean isCollectionWildcard = !isLastSegment && (seg.equals("-") || seg.equals("-}")); - if (!isCollectionWildcard && isSegmentBeginOrEndInvalid(seg)) { - throw new ValidationException("parse error: invalid begin or end character in '%s'", seg); - } - // Disallow zero or multiple delimiters between variable names. - if (MULTIPLE_COMPLEX_DELIMITER_PATTERN.matcher(seg).find() - || MISSING_COMPLEX_DELIMITER_PATTERN.matcher(seg).find()) { - throw new ValidationException( - "parse error: missing or 2+ consecutive delimiter characters in '%s'", seg); - } - // If segment starts with '{', a binding group starts. - boolean bindingStarts = seg.startsWith("{"); - boolean implicitWildcard = false; - boolean complexDelimiterFound = false; - if (bindingStarts) { - if (varName != null) { - throw new ValidationException("parse error: nested binding in '%s'", template); - } - seg = seg.substring(1); - - // Check for invalid complex resource ID delimiters. - if (INVALID_COMPLEX_DELIMITER_PATTERN.matcher(seg).find()) { - throw new ValidationException( - "parse error: invalid complex resource ID delimiter character in '%s'", seg); - } - - Matcher complexPatternDelimiterMatcher = END_SEGMENT_COMPLEX_DELIMITER_PATTERN.matcher(seg); - complexDelimiterFound = !isCollectionWildcard && complexPatternDelimiterMatcher.find(); - - // Look for complex resource names. - // Need to handle something like "{user_a}~{user_b}". - if (complexDelimiterFound) { - builder.addAll(parseComplexResourceId(seg)); - } else { - int i = seg.indexOf('='); - if (i <= 0) { - // Possibly looking at something like "{name}" with implicit wildcard. - if (seg.endsWith("}")) { - // Remember to add an implicit wildcard later. - implicitWildcard = true; - varName = seg.substring(0, seg.length() - 1).trim(); - seg = seg.substring(seg.length() - 1).trim(); - } else { - throw new ValidationException( - "parse error: invalid binding syntax in '%s'", template); - } - } else if (seg.indexOf('-') <= 0 && isCollectionWildcard) { - implicitWildcard = true; - } else { - // Looking at something like "{name=wildcard}". - varName = seg.substring(0, i).trim(); - seg = seg.substring(i + 1).trim(); - } - builder.add(Segment.create(SegmentKind.BINDING, varName)); - } - } - - if (!complexDelimiterFound) { - // If segment ends with '}', a binding group ends. Remove the brace and remember. - boolean bindingEnds = seg.endsWith("}"); - if (bindingEnds) { - seg = seg.substring(0, seg.length() - 1).trim(); - } - - // Process the segment, after stripping off "{name=.." and "..}". - switch (seg) { - case "**": - case "*": - if ("**".equals(seg)) { - pathWildCardBound++; - } - Segment wildcard = seg.length() == 2 ? Segment.PATH_WILDCARD : Segment.WILDCARD; - if (varName == null) { - // Not in a binding, turn wildcard into implicit binding. - // "*" => "{$n=*}" - builder.add(Segment.create(SegmentKind.BINDING, "$" + freeWildcardCounter)); - freeWildcardCounter++; - builder.add(wildcard); - builder.add(Segment.END_BINDING); - } else { - builder.add(wildcard); - } - break; - case "": - if (!bindingEnds) { - throw new ValidationException( - "parse error: empty segment not allowed in '%s'", template); - } - // If the wildcard is implicit, seg will be empty. Just continue. - break; - case "-": - builder.add(Segment.WILDCARD); - implicitWildcard = false; - break; - default: - builder.add(Segment.create(SegmentKind.LITERAL, seg)); - } - - // End a binding. - if (bindingEnds && !complexDelimiterFound) { - // Reset varName to null for next binding. - varName = null; - - if (implicitWildcard) { - // Looking at something like "{var}". Insert an implicit wildcard, as it is the same - // as "{var=*}". - builder.add(Segment.WILDCARD); - } - builder.add(Segment.END_BINDING); - } - - if (pathWildCardBound > 1) { - // Report restriction on number of '**' in the pattern. There can be only one, which - // enables non-backtracking based matching. - throw new ValidationException( - "parse error: pattern must not contain more than one path wildcard ('**') in '%s'", - template); - } - } - } - - if (customVerb != null) { - builder.add(Segment.create(SegmentKind.CUSTOM_VERB, customVerb)); - } - return builder.build(); - } - - private static boolean isSegmentBeginOrEndInvalid(String seg) { - // A segment is invalid if it contains only one character and the character is a delimiter - if (seg.length() == 1 && COMPLEX_DELIMITER_PATTERN.matcher(seg).find()) { - return true; - } - // A segment can start with a delimiter, as long as there is no { right after it. - // A segment can end with a delimiter, as long as there is no } right before it. - // e.g. Invalid: .{well}-{known}, {well}-{known}- - // Valid: .well-known, .well-{known}, .-~{well-known}, these segments are all considered as - // literals for matching - return (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(0, 1)).find() && seg.charAt(1) == '{') - || (COMPLEX_DELIMITER_PATTERN.matcher(seg.substring(seg.length() - 1)).find() - && seg.charAt(seg.length() - 2) == '}'); - } - - private static List parseComplexResourceId(String seg) { - List segments = new ArrayList<>(); - List separatorIndices = new ArrayList<>(); - - Matcher complexPatternDelimiterMatcher = END_SEGMENT_COMPLEX_DELIMITER_PATTERN.matcher(seg); - boolean delimiterFound = complexPatternDelimiterMatcher.find(); - - while (delimiterFound) { - int delimiterIndex = complexPatternDelimiterMatcher.start(); - if (seg.substring(delimiterIndex).startsWith("}")) { - delimiterIndex += 1; - } - String currDelimiter = seg.substring(delimiterIndex, delimiterIndex + 1); - if (!COMPLEX_DELIMITER_PATTERN.matcher(currDelimiter).find()) { - throw new ValidationException( - "parse error: invalid complex ID delimiter '%s' in '%s'", currDelimiter, seg); - } - separatorIndices.add(currDelimiter); - delimiterFound = complexPatternDelimiterMatcher.find(delimiterIndex + 1); - } - // The last entry does not have a delimiter. - separatorIndices.add(""); - - String subVarName = null; - Iterable complexSubsegments = - Splitter.onPattern("\\}[_\\-\\.~]").trimResults().split(seg); - boolean complexSegImplicitWildcard = false; - int currIteratorIndex = 0; - for (String complexSeg : complexSubsegments) { - boolean subsegmentBindingStarts = complexSeg.startsWith("{"); - if (subsegmentBindingStarts) { - if (subVarName != null) { - throw new ValidationException("parse error: nested binding in '%s'", complexSeg); - } - complexSeg = complexSeg.substring(1); - } - subVarName = complexSeg.trim(); - - boolean subBindingEnds = complexSeg.endsWith("}"); - int i = complexSeg.indexOf('='); - if (i <= 0) { - // Possibly looking at something like "{name}" with implicit wildcard. - if (subBindingEnds) { - // Remember to add an implicit wildcard later. - complexSegImplicitWildcard = true; - subVarName = complexSeg.substring(0, complexSeg.length() - 1).trim(); - complexSeg = complexSeg.substring(complexSeg.length() - 1).trim(); - } - } else { - // Looking at something like "{name=wildcard}". - subVarName = complexSeg.substring(0, i).trim(); - complexSeg = complexSeg.substring(i + 1).trim(); - if (complexSeg.equals("**")) { - throw new ValidationException( - "parse error: wildcard path not allowed in complex ID resource '%s'", subVarName); - } - } - String complexDelimiter = - currIteratorIndex < separatorIndices.size() - ? separatorIndices.get(currIteratorIndex) - : ""; - segments.add(Segment.create(SegmentKind.BINDING, subVarName, complexDelimiter)); - segments.add(Segment.wildcardCreate(complexDelimiter)); - segments.add(Segment.END_BINDING); - subVarName = null; - - currIteratorIndex++; - } - return segments; - } - - // Helpers - // ======= - - private String encodeUrl(String text) { - if (urlEncoding) { - try { - return URLEncoder.encode(text, "UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new ValidationException("UTF-8 encoding is not supported on this platform"); - } - } else { - // When encoding is disabled, we accept any character except '/' - final String INVALID_CHAR = "/"; - if (text.contains(INVALID_CHAR)) { - throw new ValidationException( - "Invalid character \"" + INVALID_CHAR + "\" in path section \"" + text + "\"."); - } - return text; - } - } - - private String decodeUrl(String url) { - if (urlEncoding) { - try { - return URLDecoder.decode(url, "UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new ValidationException("UTF-8 encoding is not supported on this platform"); - } - } else { - return url; - } - } - - // Checks for the given segments kind. On success, consumes them. Otherwise leaves - // the list iterator in its state. - private static boolean peek(ListIterator segments, SegmentKind... kinds) { - int start = segments.nextIndex(); - boolean success = false; - for (SegmentKind kind : kinds) { - if (!segments.hasNext() || segments.next().kind() != kind) { - success = false; - break; - } - } - if (success) { - return true; - } - restore(segments, start); - return false; - } - - // Restores a list iterator back to a given index. - private static void restore(ListIterator segments, int index) { - while (segments.nextIndex() > index) { - segments.previous(); - } - } - - // Equality and String Conversion - // ============================== - - /** Returns a pretty version of the template as a string. */ - @Override - public String toString() { - return toSyntax(segments, true); - } - - /** - * Returns a raw version of the template as a string. This renders the template in its internal, - * normalized form. - */ - public String toRawString() { - return toSyntax(segments, false); - } - - private static String toSyntax(List segments, boolean pretty) { - StringBuilder result = new StringBuilder(); - boolean continueLast = true; // if true, no slash is appended. - ListIterator iterator = segments.listIterator(); - while (iterator.hasNext()) { - Segment seg = iterator.next(); - if (!continueLast) { - result.append(seg.separator()); - } - continueLast = false; - switch (seg.kind()) { - case BINDING: - if (pretty && seg.value().startsWith("$")) { - // Remove the internal binding. - seg = iterator.next(); // Consume wildcard - result.append(seg.value()); - iterator.next(); // Consume END_BINDING - continue; - } - result.append('{'); - result.append(seg.value()); - if (pretty && peek(iterator, SegmentKind.WILDCARD, SegmentKind.END_BINDING)) { - // Reduce {name=*} to {name}. - result.append('}'); - continue; - } - result.append('='); - continueLast = true; - continue; - case END_BINDING: - result.append('}'); - continue; - default: - result.append(seg.value()); - continue; - } - } - return result.toString(); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof PathTemplate)) { - return false; - } - PathTemplate other = (PathTemplate) obj; - return Objects.equals(segments, other.segments); - } - - @Override - public int hashCode() { - return segments.hashCode(); - } -} diff --git a/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java b/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java deleted file mode 100644 index f448f9677..000000000 --- a/src/main/java/com/google/api/pathtemplate/TemplatedResourceName.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.google.api.pathtemplate; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Sets; -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import javax.annotation.Nullable; - -/** - * Class for representing and working with resource names. - * - *

A resource name is represented by {@link PathTemplate}, an assignment to variables in the - * template, and an optional endpoint. The {@code ResourceName} class implements the map interface - * (unmodifiable) to work with the variable assignments, and has methods to reproduce the string - * representation of the name, to construct new names, and to dereference names into resources. - * - *

As a resource name essentially represents a match of a path template against a string, it can - * be also used for other purposes than naming resources. However, not all provided methods may make - * sense in all applications. - * - *

Usage examples: - * - *

{@code
- * PathTemplate template = PathTemplate.create("shelves/*/books/*");
- * TemplatedResourceName resourceName = TemplatedResourceName.create(template, "shelves/s1/books/b1");
- * assert resourceName.get("$1").equals("b1");
- * assert resourceName.parentName().toString().equals("shelves/s1/books");
- * }
- */ -public class TemplatedResourceName implements Map { - - // ResourceName Resolver - // ===================== - - /** Represents a resource name resolver which can be registered with this class. */ - public interface Resolver { - /** Resolves the resource name into a resource by calling the underlying API. */ - T resolve(Class resourceType, TemplatedResourceName name, @Nullable String version); - } - - // The registered resource name resolver. - // TODO(wrwg): its a bit spooky to have this static global. Think of ways to - // configure this from the outside instead if programmatically (e.g. java properties). - private static volatile Resolver resourceNameResolver = - new Resolver() { - @Override - public T resolve(Class resourceType, TemplatedResourceName name, String version) { - throw new IllegalStateException( - "No resource name resolver is registered in ResourceName class."); - } - }; - - /** - * Sets the resource name resolver which is used by the {@link #resolve(Class, String)} method. By - * default, no resolver is registered. - */ - public static void registerResourceNameResolver(Resolver resolver) { - resourceNameResolver = resolver; - } - - // ResourceName - // ============ - - /** - * Creates a new resource name based on given template and path. The path must match the template, - * otherwise null is returned. - * - * @throws ValidationException if the path does not match the template. - */ - public static TemplatedResourceName create(PathTemplate template, String path) { - Map values = template.match(path); - if (values == null) { - throw new ValidationException("path '%s' does not match template '%s'", path, template); - } - return new TemplatedResourceName(template, values, null); - } - - /** - * Creates a new resource name from a template and a value assignment for variables. - * - * @throws ValidationException if not all variables in the template are bound. - */ - public static TemplatedResourceName create(PathTemplate template, Map values) { - if (!values.keySet().containsAll(template.vars())) { - Set unbound = Sets.newLinkedHashSet(template.vars()); - unbound.removeAll(values.keySet()); - throw new ValidationException("unbound variables: %s", unbound); - } - return new TemplatedResourceName(template, values, null); - } - - /** - * Creates a new resource name based on given template and path, where the path contains an - * endpoint. If the path does not match, null is returned. - */ - @Nullable - public static TemplatedResourceName createFromFullName(PathTemplate template, String path) { - Map values = template.matchFromFullName(path); - if (values == null) { - return null; - } - return new TemplatedResourceName(template, values, null); - } - - private final PathTemplate template; - private final ImmutableMap values; - private final String endpoint; - - private volatile String stringRepr; - - private TemplatedResourceName( - PathTemplate template, Map values, String endpoint) { - this.template = template; - this.values = ImmutableMap.copyOf(values); - this.endpoint = endpoint; - } - - @Override - public String toString() { - if (stringRepr == null) { - stringRepr = template.instantiate(values); - } - return stringRepr; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof TemplatedResourceName)) { - return false; - } - TemplatedResourceName other = (TemplatedResourceName) obj; - return Objects.equals(template, other.template) - && Objects.equals(endpoint, other.endpoint) - && Objects.equals(values, other.values); - } - - @Override - public int hashCode() { - return Objects.hash(template, endpoint, values); - } - - /** Gets the template associated with this resource name. */ - public PathTemplate template() { - return template; - } - - /** Checks whether the resource name has an endpoint. */ - public boolean hasEndpoint() { - return endpoint != null; - } - - /** Returns the endpoint of this resource name, or null if none is defined. */ - @Nullable - public String endpoint() { - return endpoint; - } - - /** Returns a resource name with specified endpoint. */ - public TemplatedResourceName withEndpoint(String endpoint) { - return new TemplatedResourceName(template, values, Preconditions.checkNotNull(endpoint)); - } - - /** - * Returns the parent resource name. For example, if the name is {@code shelves/s1/books/b1}, the - * parent is {@code shelves/s1/books}. - */ - public TemplatedResourceName parentName() { - PathTemplate parentTemplate = template.parentTemplate(); - return new TemplatedResourceName(parentTemplate, values, endpoint); - } - - /** - * Returns true of the resource name starts with the parent resource name, i.e. is a child of the - * parent. - */ - public boolean startsWith(TemplatedResourceName parentName) { - // TODO: more efficient implementation. - return toString().startsWith(parentName.toString()); - } - - /** - * Attempts to resolve a resource name into a resource, by calling the associated API. The - * resource name must have an endpoint. An optional version can be specified to determine in which - * version of the API to call. - */ - public T resolve(Class resourceType, @Nullable String version) { - Preconditions.checkArgument(hasEndpoint(), "Resource name must have an endpoint."); - return resourceNameResolver.resolve(resourceType, this, version); - } - - // Map Interface - // ============= - - @Override - public int size() { - return values.size(); - } - - @Override - public boolean isEmpty() { - return values.isEmpty(); - } - - @Override - public boolean containsKey(Object key) { - return values.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return values.containsValue(value); - } - - @Override - public String get(Object key) { - return values.get(key); - } - - @Override - @Deprecated - public String put(String key, String value) { - return values.put(key, value); - } - - @Override - @Deprecated - public String remove(Object key) { - return values.remove(key); - } - - @Override - @Deprecated - public void putAll(Map m) { - values.putAll(m); - } - - @Override - @Deprecated - public void clear() { - values.clear(); - } - - @Override - public Set keySet() { - return values.keySet(); - } - - @Override - public Collection values() { - return values.values(); - } - - @Override - public Set> entrySet() { - return values.entrySet(); - } -} diff --git a/src/main/java/com/google/api/pathtemplate/ValidationException.java b/src/main/java/com/google/api/pathtemplate/ValidationException.java deleted file mode 100644 index 3efa388f5..000000000 --- a/src/main/java/com/google/api/pathtemplate/ValidationException.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.google.api.pathtemplate; - -import java.util.Stack; - -/** - * Exception thrown if there is a validation problem with a path template, http config, or related - * framework methods. Comes as an illegal argument exception subclass. Allows to globally set a - * thread-local validation context description which each exception inherits. - */ -public class ValidationException extends IllegalArgumentException { - - public interface Supplier { - T get(); - } - - private static ThreadLocal>> contextLocal = new ThreadLocal<>(); - - /** - * Sets the validation context description. Each thread has its own description, so this is thread - * safe. - */ - public static void pushCurrentThreadValidationContext(Supplier supplier) { - Stack> stack = contextLocal.get(); - if (stack == null) { - stack = new Stack<>(); - contextLocal.set(stack); - } - stack.push(supplier); - } - - public static void pushCurrentThreadValidationContext(final String context) { - pushCurrentThreadValidationContext( - new Supplier() { - @Override - public String get() { - return context; - } - }); - } - - /** Clears the validation context. */ - public static void popCurrentThreadValidationContext() { - Stack stack = contextLocal.get(); - if (stack != null) { - stack.pop(); - } - } - - /** Construct validation exception with implicit context. */ - public ValidationException(String format, Object... args) { - super(message(contextLocal.get(), format, args)); - } - - private static String message(Stack> context, String format, Object... args) { - if (context == null || context.isEmpty()) { - return String.format(format, args); - } - StringBuilder result = new StringBuilder(); - for (Supplier supplier : context) { - result.append(supplier.get() + ": "); - } - return result.toString() + String.format(format, args); - } -} diff --git a/src/main/java/com/google/api/resourcenames/ResourceName.java b/src/main/java/com/google/api/resourcenames/ResourceName.java deleted file mode 100644 index e1c54663d..000000000 --- a/src/main/java/com/google/api/resourcenames/ResourceName.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.google.api.resourcenames; - -import java.util.Map; - -/** An interface that generated resource name types must implement. */ -public interface ResourceName { - - /** Return the map of each field name to its value. */ - Map getFieldValuesMap(); - - /** - * Return the String value of the field with name fieldName. Returns null if the fieldName was not - * found. - */ - String getFieldValue(String fieldName); -} diff --git a/src/main/java/com/google/api/resourcenames/ResourceNameFactory.java b/src/main/java/com/google/api/resourcenames/ResourceNameFactory.java deleted file mode 100644 index 8f0099ce4..000000000 --- a/src/main/java/com/google/api/resourcenames/ResourceNameFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2018, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.resourcenames; - -public interface ResourceNameFactory { - - /* Create a new ResourceName from a formatted String representing a ResourceName. */ - T parse(String formattedString); -} diff --git a/src/main/java/com/google/api/resourcenames/UntypedResourceName.java b/src/main/java/com/google/api/resourcenames/UntypedResourceName.java deleted file mode 100644 index 2dcf7fd3d..000000000 --- a/src/main/java/com/google/api/resourcenames/UntypedResourceName.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.google.api.resourcenames; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; -import java.util.Map; - -/** - * A class to represent a {@link ResourceName} with an unknown format. This class in intended to - * support the case of a resource name string in an unexpected format - generated resource name - * classes with known formats should be preferred where possible. - */ -public class UntypedResourceName implements ResourceName { - - private final String rawValue; - - private volatile Map fieldValuesMap; - - private UntypedResourceName(String rawValue) { - this.rawValue = Preconditions.checkNotNull(rawValue); - } - - public static UntypedResourceName of(ResourceName resourceName) { - return new UntypedResourceName(resourceName.toString()); - } - - public static UntypedResourceName parse(String formattedString) { - return new UntypedResourceName(formattedString); - } - - public static boolean isParsableFrom(String formattedString) { - return formattedString != null; - } - - /* Returns a map with an empty String "" as the sole key, which maps to the raw value of this ResourceName. */ - @Override - public Map getFieldValuesMap() { - if (fieldValuesMap == null) { - synchronized (this) { - if (fieldValuesMap == null) { - fieldValuesMap = ImmutableMap.of("", rawValue); - } - } - } - return fieldValuesMap; - } - - /* Returns the raw value of this ResourceName iff fieldName.equals(""), else returns null. */ - @Override - public String getFieldValue(String fieldName) { - return getFieldValuesMap().get(""); - } - - @Override - public String toString() { - return rawValue; - } - - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (o instanceof UntypedResourceName) { - UntypedResourceName that = (UntypedResourceName) o; - return this.rawValue.equals(that.rawValue); - } - return false; - } - - @Override - public int hashCode() { - return rawValue.hashCode(); - } -} diff --git a/src/test/java/com/google/api/core/ApiFuturesTest.java b/src/test/java/com/google/api/core/ApiFuturesTest.java deleted file mode 100644 index 34dc41dda..000000000 --- a/src/test/java/com/google/api/core/ApiFuturesTest.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import static com.google.common.truth.Truth.assertThat; -import static com.google.common.util.concurrent.MoreExecutors.directExecutor; - -import com.google.common.collect.ImmutableList; -import java.util.List; -import java.util.concurrent.CancellationException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicInteger; -import org.junit.Test; - -public class ApiFuturesTest { - - @Test - public void testAddCallback() throws Exception { - final AtomicInteger flag = new AtomicInteger(); - SettableApiFuture future = SettableApiFuture.create(); - ApiFutures.addCallback( - future, - new ApiFutureCallback() { - @Override - public void onSuccess(Integer i) { - flag.set(i + 1); - } - - @Override - public void onFailure(Throwable t) { - flag.set(-1); - } - }, - directExecutor()); - future.set(0); - assertThat(flag.get()).isEqualTo(1); - } - - @Test - public void testCatch() throws Exception { - SettableApiFuture future = SettableApiFuture.create(); - ApiFuture fallback = - ApiFutures.catching( - future, - Exception.class, - new ApiFunction() { - @Override - public Integer apply(Exception ex) { - return 42; - } - }, - directExecutor()); - future.setException(new Exception()); - assertThat(fallback.get()).isEqualTo(42); - } - - @Test - public void testCatchAsync() throws Exception { - SettableApiFuture future = SettableApiFuture.create(); - ApiFuture fallback = - ApiFutures.catchingAsync( - future, - Exception.class, - new ApiAsyncFunction() { - @Override - public ApiFuture apply(Exception ex) { - return ApiFutures.immediateFuture(42); - } - }, - directExecutor()); - future.setException(new Exception()); - assertThat(fallback.get()).isEqualTo(42); - } - - @Test - public void testTransform() throws Exception { - SettableApiFuture inputFuture = SettableApiFuture.create(); - ApiFuture transformedFuture = - ApiFutures.transform( - inputFuture, - new ApiFunction() { - @Override - public String apply(Integer input) { - return input.toString(); - } - }, - directExecutor()); - inputFuture.set(6); - assertThat(transformedFuture.get()).isEqualTo("6"); - } - - @Test - public void testTransformWithExecutor() throws Exception { - SettableApiFuture inputFuture = SettableApiFuture.create(); - final AtomicInteger counter = new AtomicInteger(0); - ApiFuture transformedFuture = - ApiFutures.transform( - inputFuture, - new ApiFunction() { - @Override - public String apply(Integer input) { - return input.toString(); - } - }, - new Executor() { - @Override - public void execute(Runnable command) { - counter.incrementAndGet(); - command.run(); - } - }); - inputFuture.set(6); - assertThat(transformedFuture.get()).isEqualTo("6"); - assertThat(counter.get()).isEqualTo(1); - } - - @Test - public void testAllAsList() throws Exception { - SettableApiFuture inputFuture1 = SettableApiFuture.create(); - SettableApiFuture inputFuture2 = SettableApiFuture.create(); - ApiFuture> listFuture = - ApiFutures.allAsList(ImmutableList.of(inputFuture1, inputFuture2)); - inputFuture1.set(1); - inputFuture2.set(2); - assertThat(listFuture.get()).containsExactly(1, 2).inOrder(); - } - - @Test - public void successfulAllAsList() throws Exception { - SettableApiFuture inputFuture1 = SettableApiFuture.create(); - SettableApiFuture inputFuture2 = SettableApiFuture.create(); - ApiFuture> listFuture = - ApiFutures.successfulAsList(ImmutableList.of(inputFuture1, inputFuture2)); - inputFuture1.set(1); - inputFuture2.setException(new Exception()); - assertThat(listFuture.get()).containsExactly(1, null).inOrder(); - } - - @Test - public void testTransformAsync() throws Exception { - ApiFuture inputFuture = ApiFutures.immediateFuture(0); - ApiFuture outputFuture = - ApiFutures.transformAsync( - inputFuture, - new ApiAsyncFunction() { - @Override - public ApiFuture apply(Integer input) { - return ApiFutures.immediateFuture(input + 1); - } - }, - directExecutor()); - assertThat(outputFuture.get()).isEqualTo(1); - } - - @Test - public void testTransformAsyncWithExecutor() throws Exception { - ApiFuture inputFuture = ApiFutures.immediateFuture(0); - final AtomicInteger counter = new AtomicInteger(0); - ApiFuture outputFuture = - ApiFutures.transformAsync( - inputFuture, - new ApiAsyncFunction() { - @Override - public ApiFuture apply(Integer input) { - return ApiFutures.immediateFuture(input + 1); - } - }, - new Executor() { - @Override - public void execute(Runnable command) { - counter.incrementAndGet(); - command.run(); - } - }); - assertThat(outputFuture.get()).isEqualTo(1); - assertThat(counter.get()).isEqualTo(1); - } - - @Test - public void testImmediateFailedFuture() throws InterruptedException { - ApiFuture future = - ApiFutures.immediateFailedFuture(new IllegalArgumentException("The message")); - IllegalArgumentException exception = null; - try { - future.get(); - } catch (ExecutionException e) { - exception = (IllegalArgumentException) e.getCause(); - } - assertThat(exception).isNotNull(); - assertThat(exception.getMessage()).isEqualTo("The message"); - } - - @Test - public void testImmediateCancelledFuture() throws InterruptedException, ExecutionException { - ApiFuture future = ApiFutures.immediateCancelledFuture(); - CancellationException exception = null; - try { - future.get(); - } catch (CancellationException e) { - exception = e; - } - assertThat(exception).isNotNull(); - } -} diff --git a/src/test/java/com/google/api/core/ApiServiceTest.java b/src/test/java/com/google/api/core/ApiServiceTest.java deleted file mode 100644 index 19b10af47..000000000 --- a/src/test/java/com/google/api/core/ApiServiceTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import com.google.common.util.concurrent.MoreExecutors; -import java.util.concurrent.atomic.AtomicReference; -import org.junit.Assert; -import org.junit.Test; - -public class ApiServiceTest { - @Test - public void testNoopService() { - ApiService service = - new AbstractApiService() { - @Override - protected void doStop() { - notifyStopped(); - } - - @Override - protected void doStart() { - notifyStarted(); - } - }; - service.startAsync().awaitRunning(); - Assert.assertTrue(service.isRunning()); - service.stopAsync().awaitTerminated(); - } - - @Test - public void testFailingService() { - final AtomicReference savedFailure = new AtomicReference<>(); - ApiService service = - new AbstractApiService() { - @Override - protected void doStop() { - // This should never be called. - throw new Error(); - } - - @Override - protected void doStart() { - notifyFailed(new IllegalStateException("this service always fails")); - } - }; - service.addListener( - new ApiService.Listener() { - @Override - public void failed(ApiService.State from, Throwable failure) { - savedFailure.set(failure); - } - }, - MoreExecutors.directExecutor()); - - try { - service.startAsync().awaitRunning(); - throw new RuntimeException("unreachable"); - } catch (IllegalStateException e) { - // Expected - } - - Assert.assertEquals(service.state(), ApiService.State.FAILED); - Assert.assertEquals(savedFailure.get().getMessage(), "this service always fails"); - Assert.assertEquals(service.failureCause().getMessage(), "this service always fails"); - } -} diff --git a/src/test/java/com/google/api/core/ListenableFutureToApiFutureTest.java b/src/test/java/com/google/api/core/ListenableFutureToApiFutureTest.java deleted file mode 100644 index 9bc06dae0..000000000 --- a/src/test/java/com/google/api/core/ListenableFutureToApiFutureTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import com.google.common.truth.Truth; -import com.google.common.util.concurrent.SettableFuture; -import org.junit.Test; - -public class ListenableFutureToApiFutureTest { - - @Test - public void testGet() throws Exception { - SettableFuture future = SettableFuture.create(); - ListenableFutureToApiFuture apiFuture = new ListenableFutureToApiFuture<>(future); - future.set(3); - Truth.assertThat(apiFuture.get()).isEqualTo(3); - } -} diff --git a/src/test/java/com/google/api/core/SettableApiFutureTest.java b/src/test/java/com/google/api/core/SettableApiFutureTest.java deleted file mode 100644 index a4cff9b08..000000000 --- a/src/test/java/com/google/api/core/SettableApiFutureTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2017, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.core; - -import com.google.common.truth.Truth; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import org.junit.Test; - -public class SettableApiFutureTest { - @Test - public void testSet() throws Exception { - SettableApiFuture future = SettableApiFuture.create(); - Truth.assertThat(future.isDone()).isFalse(); - future.set(42); - Truth.assertThat(future.get()).isEqualTo(42); - Truth.assertThat(future.get(1, TimeUnit.HOURS)).isEqualTo(42); - Truth.assertThat(future.isDone()).isTrue(); - } - - @Test - public void testCancel() throws Exception { - SettableApiFuture future = SettableApiFuture.create(); - Truth.assertThat(future.isDone()).isFalse(); - Truth.assertThat(future.isCancelled()).isFalse(); - future.cancel(false); - Truth.assertThat(future.isDone()).isTrue(); - Truth.assertThat(future.isCancelled()).isTrue(); - } - - @Test(expected = ExecutionException.class) - public void testException() throws Exception { - SettableApiFuture future = SettableApiFuture.create(); - future.setException(new Exception()); - future.get(); - } - - @Test - public void testListener() throws Exception { - final AtomicInteger flag = new AtomicInteger(); - SettableApiFuture future = SettableApiFuture.create(); - future.addListener( - new Runnable() { - @Override - public void run() { - flag.set(1); - } - }, - new Executor() { - @Override - public void execute(Runnable r) { - r.run(); - } - }); - future.set(0); - Truth.assertThat(flag.get()).isEqualTo(1); - } -} diff --git a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java b/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java deleted file mode 100644 index 47747a115..000000000 --- a/src/test/java/com/google/api/pathtemplate/PathTemplateTest.java +++ /dev/null @@ -1,851 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.google.api.pathtemplate; - -import com.google.common.collect.ImmutableMap; -import com.google.common.truth.Truth; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for {@link PathTemplate}. */ -@RunWith(JUnit4.class) -public class PathTemplateTest { - - @Rule public ExpectedException thrown = ExpectedException.none(); - - // Match - // ===== - - @Test - public void matchAtomicResourceName() { - PathTemplate template = PathTemplate.create("buckets/*/*/objects/*"); - assertPositionalMatch(template.match("buckets/f/o/objects/bar"), "f", "o", "bar"); - } - - @Test - public void matchTemplateWithUnboundedWildcard() { - PathTemplate template = PathTemplate.create("buckets/*/objects/**"); - assertPositionalMatch(template.match("buckets/foo/objects/bar/baz"), "foo", "bar/baz"); - } - - @Test - public void matchWithForcedHostName() { - PathTemplate template = PathTemplate.create("buckets/*/objects/*"); - Map match = template.matchFromFullName("somewhere.io/buckets/b/objects/o"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("somewhere.io"); - Truth.assertThat(match.get("$0")).isEqualTo("b"); - Truth.assertThat(match.get("$1")).isEqualTo("o"); - } - - @Test - public void matchWithHostName() { - PathTemplate template = PathTemplate.create("buckets/*/objects/*"); - Map match = template.match("//somewhere.io/buckets/b/objects/o"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("//somewhere.io"); - Truth.assertThat(match.get("$0")).isEqualTo("b"); - Truth.assertThat(match.get("$1")).isEqualTo("o"); - } - - @Test - public void matchWithHostNameAndProtocol() { - PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone}"); - Map match = - template.match( - "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone")).isEqualTo("europe-west3-c"); - } - - @Test - public void matchWithHostNameAndProtocolWithTemplateStartWithBinding() { - PathTemplate template = PathTemplate.create("{project}/zones/{zone}"); - Map match = - template.match( - "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone")).isEqualTo("europe-west3-c"); - } - - @Test - public void pathWildcards_matchZeroOrMoreSegments() { - PathTemplate start = PathTemplate.create("{glob=**}/b"); - PathTemplate middle = PathTemplate.create("a/{glob=**}/b"); - PathTemplate end = PathTemplate.create("a/{glob=**}"); - PathTemplate endWithCustomVerb = PathTemplate.create("a/{glob=**}:foo"); - - Truth.assertThat(start.match("b").get("glob")).isEmpty(); - Truth.assertThat(start.match("/b").get("glob")).isEmpty(); - Truth.assertThat(start.match("a/b").get("glob")).isEqualTo("a"); - Truth.assertThat(start.match("a/a/a/b").get("glob")).isEqualTo("a/a/a"); - - Truth.assertThat(middle.match("a/b").get("glob")).isEmpty(); - Truth.assertThat(middle.match("a//b").get("glob")).isEmpty(); - Truth.assertThat(middle.match("a/x/b").get("glob")).isEqualTo("x"); - Truth.assertThat(middle.match("a/x/y/z/b").get("glob")).isEqualTo("x/y/z"); - - Truth.assertThat(end.match("a").get("glob")).isEmpty(); - Truth.assertThat(end.match("a/").get("glob")).isEmpty(); - Truth.assertThat(end.match("a/b").get("glob")).isEqualTo("b"); - Truth.assertThat(end.match("a/b/b/b").get("glob")).isEqualTo("b/b/b"); - - Truth.assertThat(endWithCustomVerb.match("a/:foo").get("glob")).isEmpty(); - Truth.assertThat(endWithCustomVerb.match("a/b:foo").get("glob")).isEqualTo("b"); - Truth.assertThat(endWithCustomVerb.match("a/b/b:foo").get("glob")).isEqualTo("b/b"); - } - - @Test - public void pathWildcard_canMatchTheEmptyString() { - PathTemplate template = PathTemplate.create("{glob=**}"); - - Truth.assertThat(template.match("").get("glob")).isEmpty(); - Truth.assertThat(template.match("a").get("glob")).isEqualTo("a"); - Truth.assertThat(template.match("a/b").get("glob")).isEqualTo("a/b"); - } - - @Test - public void matchWithCustomMethod() { - PathTemplate template = PathTemplate.create("buckets/*/objects/*:custom"); - Map match = template.match("buckets/b/objects/o:custom"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("$0")).isEqualTo("b"); - Truth.assertThat(match.get("$1")).isEqualTo("o"); - } - - @Test - public void matchFailWhenPathMismatch() { - PathTemplate template = PathTemplate.create("buckets/*/*/objects/*"); - Truth.assertThat(template.match("buckets/f/o/o/objects/bar")).isNull(); - } - - @Test - public void matchFailWhenPathTooShort() { - PathTemplate template = PathTemplate.create("buckets/*/*/objects/*"); - Truth.assertThat(template.match("buckets/f/o/objects")).isNull(); - } - - @Test - public void matchFailWhenPathTooLong() { - PathTemplate template = PathTemplate.create("buckets/*/*/objects/*"); - Truth.assertThat(template.match("buckets/f/o/objects/too/long")).isNull(); - } - - @Test - public void matchWithUnboundInMiddle() { - PathTemplate template = PathTemplate.create("bar/**/foo/*"); - assertPositionalMatch(template.match("bar/foo/foo/foo/bar"), "foo/foo", "bar"); - } - - @Test - public void matchWithNamedBindings() { - PathTemplate template = PathTemplate.create("projects/*/{instance_id=instances/*}/**"); - Map actual = - template.match("projects/proj_foo/instances/instance_bar/table/table_baz"); - Truth.assertThat(actual).containsEntry("instance_id", "instances/instance_bar"); - } - - @Test - public void matchFailWithNamedBindingsWhenPathMismatches() { - PathTemplate template = PathTemplate.create("projects/*/{instance_id=instances/*}/**"); - Map actual = - template.match("projects/proj_foo/instances_fail/instance_bar/table/table_baz"); - Truth.assertThat(actual).isNull(); - } - - @Test - public void matchWithNamedBindingsThatHasOnlyWildcard() { - PathTemplate template = PathTemplate.create("profiles/{routing_id=*}"); - Map actual = template.match("profiles/prof_qux"); - Truth.assertThat(actual).containsEntry("routing_id", "prof_qux"); - } - - @Test - public void matchFailWithNamedBindingsThatHasOnlyWildcardWhenPathMismatches() { - PathTemplate template = PathTemplate.create("profiles/{routing_id=*}"); - Map actual = template.match("profiles/prof_qux/fail"); - Truth.assertThat(actual).isNull(); - } - - @Test - public void matchWithCustomVerbs() { - PathTemplate template = PathTemplate.create("**:foo"); - assertPositionalMatch(template.match("a/b/c:foo"), "a/b/c"); - } - - // Complex Resource ID Segments. - // ======== - - @Test - public void complexResourceIdBasicCases() { - // Separate by "~". - PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}"); - Map match = - template.match( - "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c~us-east3-a"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a}~{zone_b")).isNull(); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - - // Separate by "-". - template = PathTemplate.create("projects/{project}/zones/{zone_a}-{zone_b}"); - match = template.match("projects/project-123/zones/europe-west3-c~us-east3-a"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe"); - Truth.assertThat(match.get("zone_b")).isEqualTo("west3-c~us-east3-a"); - - // Separate by ".". - template = PathTemplate.create("projects/{project}/zones/{zone_a}.{zone_b}"); - match = template.match("projects/project-123/zones/europe-west3-c.us-east3-a"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - - // Separate by "_". - template = PathTemplate.create("projects/{project}/zones/{zone_a}_{zone_b}"); - match = template.match("projects/project-123/zones/europe-west3-c_us-east3-a"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - } - - @Test - public void complexResourceIdCustomVerb() { - // Separate by "~". - PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}:hello"); - Map match = - template.match( - "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c~us-east3-a:hello"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a}~{zone_b")).isNull(); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - - // Separate by "-". - template = PathTemplate.create("projects/{project}/zones/{zone_a}-{zone_b}:hello"); - match = template.match("projects/project-123/zones/europe-west3-c~us-east3-a:hello"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe"); - Truth.assertThat(match.get("zone_b")).isEqualTo("west3-c~us-east3-a"); - - // Separate by ".". - template = PathTemplate.create("projects/{project}/zones/{zone_a}.{zone_b}:hello"); - match = template.match("projects/project-123/zones/europe-west3-c.us-east3-a:hello"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - - // Separate by "_". - template = PathTemplate.create("projects/{project}/zones/{zone_a}_{zone_b}:hello"); - match = template.match("projects/project-123/zones/europe-west3-c_us-east3-a:hello"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - } - - @Test - public void complexResourceIdEqualsWildcard() { - PathTemplate template = PathTemplate.create("projects/{project=*}/zones/{zone_a=*}~{zone_b=*}"); - Map match = - template.match("projects/project-123/zones/europe-west3-c~us-east3-a"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a}~{zone_b")).isNull(); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - } - - @Test - public void complexResourceIdEqualsPathWildcard() { - thrown.expect(ValidationException.class); - PathTemplate template = PathTemplate.create("projects/{project=*}/zones/{zone_a=**}~{zone_b}"); - thrown.expectMessage( - String.format( - "parse error: wildcard path not allowed in complex ID resource '%s'", "zone_a")); - - template = PathTemplate.create("projects/{project=*}/zones/{zone_a}.{zone_b=**}"); - thrown.expectMessage( - String.format( - "parse error: wildcard path not allowed in complex ID resource '%s'", "zone_b")); - } - - @Test - public void complexResourceIdMissingMatches() { - PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}"); - Truth.assertThat(template.match("projects/project-123/zones/europe-west3-c")).isNull(); - - template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}.{zone_c}"); - Map match = - template.match("projects/project-123/zones/europe-west3-c~.us-east3-a"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a}~{zone_b")).isNull(); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEmpty(); - Truth.assertThat(match.get("zone_c")).isEqualTo("us-east3-a"); - } - - @Test - public void complexResourceIdNoSeparator() { - thrown.expect(ValidationException.class); - PathTemplate.create("projects/{project}/zones/{zone_a}{zone_b}"); - thrown.expectMessage( - String.format( - "parse error: missing or 2+ consecutive delimiter characters in '%s'", - "{zone_a}{zone_b}")); - - PathTemplate.create("projects/{project}/zones/{zone_a}_{zone_b}{zone_c}"); - thrown.expectMessage( - String.format( - "parse error: missing or 2+ consecutive delimiter characters in '%s'", - "{zone_a}_{zone_b}{zone_c}")); - } - - @Test - public void complexResourceIdInvalidDelimiter() { - thrown.expect(ValidationException.class); - // Not a comprehensive set of invalid delimiters, please check the class's defined pattern. - List someInvalidDelimiters = - new ArrayList<>(Arrays.asList("|", "!", "@", "a", "1", ",", "{", ")")); - for (String invalidDelimiter : someInvalidDelimiters) { - PathTemplate.create( - String.format("projects/{project=*}/zones/{zone_a}%s{zone_b}", invalidDelimiter)); - thrown.expectMessage( - String.format( - "parse error: invalid complex resource ID delimiter character in '%s'", - String.format("{zone_a}%s{zone_b}", invalidDelimiter))); - } - } - - @Test - public void complexResourceIdMixedSeparators() { - // Separate by a mix of delimiters. - PathTemplate template = - PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}.{zone_c}-{zone_d}"); - Map match = - template.match( - "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c~us-east3-a.us-west2-b-europe-west2-b"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - Truth.assertThat(match.get("zone_c")).isEqualTo("us"); - Truth.assertThat(match.get("zone_d")).isEqualTo("west2-b-europe-west2-b"); - - template = PathTemplate.create("projects/{project}/zones/{zone_a}.{zone_b}.{zone_c}~{zone_d}"); - match = - template.match( - "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c.us-east3-a.us-west2-b~europe-west2-b"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe-west3-c"); - Truth.assertThat(match.get("zone_b")).isEqualTo("us-east3-a"); - Truth.assertThat(match.get("zone_c")).isEqualTo("us-west2-b"); - Truth.assertThat(match.get("zone_d")).isEqualTo("europe-west2-b"); - } - - @Test - public void collectionWildcardMatchingInParent() { - PathTemplate template = PathTemplate.create("v1/publishers/-/books/{book}"); - Map match = - template.match( - "https://example.googleapis.com/v1/publishers/publisher-abc/books/blockchain_for_babies"); - Truth.assertThat(match).isNotNull(); - - template = PathTemplate.create("/v1/{parent=rooms/-}/blurbs/{blurb}"); - match = template.match("https://example.googleapis.com/v1/rooms/den/blurbs/asdf"); - Truth.assertThat(match).isNotNull(); - } - - @Test - public void collectionWildcardMatchingInvalid() { - thrown.expect(ValidationException.class); - PathTemplate.create("v1/publishers/{publisher}/books/-"); - } - - @Test - public void complexResourceIdPubSubDeletedTopic() { - PathTemplate template = PathTemplate.create("_deleted-topic_"); - Truth.assertThat(template).isNotNull(); - } - - @Test - public void complexResourceIdInParent() { - // One parent has a complex resource ID. - PathTemplate template = - PathTemplate.create( - "projects/{project}/zones/{zone_a}-{zone_b}_{zone_c}/machines/{machine}"); - Map match = - template.match( - "https://www.googleapis.com/compute/v1/projects/project-123/zones/europe-west3-c-us-east3-a_us-west2-b/machines/roomba"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); - Truth.assertThat(match.get("project")).isEqualTo("project-123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe"); - Truth.assertThat(match.get("zone_b")).isEqualTo("west3-c-us-east3-a"); - Truth.assertThat(match.get("zone_c")).isEqualTo("us-west2-b"); - Truth.assertThat(match.get("machine")).isEqualTo("roomba"); - - // All parents and resource IDs have complex resource IDs. - template = - PathTemplate.create( - "projects/{foo}_{bar}/zones/{zone_a}-{zone_b}_{zone_c}/machines/{cell1}.{cell2}"); - match = - template.match( - "https://www.googleapis.com/compute/v1/projects/project_123/zones/europe-west3-c-us-east3-a_us-west2-b/machines/roomba.broomba"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get(PathTemplate.HOSTNAME_VAR)).isEqualTo("https://www.googleapis.com"); - Truth.assertThat(match.get("foo")).isEqualTo("project"); - Truth.assertThat(match.get("bar")).isEqualTo("123"); - Truth.assertThat(match.get("zone_a")).isEqualTo("europe"); - Truth.assertThat(match.get("zone_b")).isEqualTo("west3-c-us-east3-a"); - Truth.assertThat(match.get("zone_c")).isEqualTo("us-west2-b"); - Truth.assertThat(match.get("cell1")).isEqualTo("roomba"); - Truth.assertThat(match.get("cell2")).isEqualTo("broomba"); - } - - @Test - public void complexResourcePathTemplateVariables() { - String pattern = - "projects/{foo}_{bar}/zones/{zone_a}-{zone_b}_{zone_c}/machines/{cell1}.{cell2}"; - PathTemplate template = PathTemplate.create(pattern); - Set variables = template.vars(); - Truth.assertThat(variables) - .containsExactly("foo", "bar", "zone_a", "zone_b", "zone_c", "cell1", "cell2"); - - pattern = "projects/{foo}_{bar}/zones/*"; - template = PathTemplate.create(pattern); - Map match = - template.match("https://www.googleapis.com/compute/v1/projects/foo1_bar2/zones/azone"); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("foo")).isEqualTo("foo1"); - Truth.assertThat(match.get("bar")).isEqualTo("bar2"); - variables = template.vars(); - System.out.println("DEL: vars: " + variables); - } - - @Test - public void complexResourceBasicInvalidIds() { - thrown.expect(ValidationException.class); - PathTemplate.create("projects/*/zones/~{zone_a}"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", "~{zone_a}")); - - PathTemplate.create("projects/*/zones/{zone_a}~"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", "{zone_a}~")); - - PathTemplate.create("projects/*/zones/.{zone_a}"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", ".{zone_a}")); - - PathTemplate.create("projects/*/zones/{zone_a}."); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", "{zone_a}.")); - - PathTemplate.create("projects/*/zones/-{zone_a}"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", "-{zone_a}")); - - PathTemplate.create("projects/*/zones/{zone_a}-"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", "{zone_a}-")); - - PathTemplate.create("projects/*/zones/_{zone_a}"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", "{zone_a}_")); - - PathTemplate.create("projects/*/zones/{zone_a}_"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", "{zone_a}_")); - } - - @Test - public void complexResourceMultipleDelimiters() { - thrown.expect(ValidationException.class); - - PathTemplate.create("projects/*/zones/{zone_a}~.{zone_b}"); - thrown.expectMessage( - String.format( - "parse error: missing or 2+ consecutive delimiter characters in '%s'", - "{zone_a}~.{zone_b}")); - - PathTemplate.create("projects/*/zones/{zone_a}~{zone_b}..{zone_c}"); - thrown.expectMessage( - String.format( - "parse error: missing or 2+ consecutive delimiter characters in '%s'", - "{zone_a}~{zone_b}..{zone_c}")); - - String pathString = "projects/project_123/zones/lorum~ipsum"; - PathTemplate template = PathTemplate.create("projects/*/zones/{zone_.~-a}~{zone_b}"); - template.validate(pathString, ""); - // No assertion - success is no exception thrown from template.validate(). - Map match = template.match(pathString); - Truth.assertThat(match).isNotNull(); - Truth.assertThat(match.get("zone_.~-a")).isEqualTo("lorum"); - Truth.assertThat(match.get("zone_b")).isEqualTo("ipsum"); - } - - // Validate - // ======== - - @Test - public void validateSuccess() { - String templateString = "buckets/*/objects/*"; - String pathString = "buckets/bucket/objects/object"; - PathTemplate template = PathTemplate.create(templateString); - template.validate(pathString, ""); - // No assertion - success is no exception thrown from template.validate - } - - @Test - public void validateFailure() { - thrown.expect(ValidationException.class); - String templateString = "buckets/*/objects/*"; - String pathString = "buckets/bucket/invalid/object"; - thrown.expectMessage( - String.format("Parameter \"%s\" must be in the form \"%s\"", pathString, templateString)); - PathTemplate template = PathTemplate.create(templateString); - template.validate(pathString, ""); - } - - @Test - public void validateMatchSuccess() { - String templateString = "buckets/*/objects/{object_id}"; - String pathString = "buckets/bucket/objects/object"; - PathTemplate template = PathTemplate.create(templateString); - Map matchMap = template.validatedMatch(pathString, ""); - Truth.assertThat(matchMap.get("$0")).isEqualTo("bucket"); - Truth.assertThat(matchMap.get("object_id")).isEqualTo("object"); - } - - @Test - public void validateMatchFailure() { - thrown.expect(ValidationException.class); - String templateString = "buckets/*/objects/*"; - String pathString = "buckets/bucket/invalid/object"; - thrown.expectMessage( - String.format("Parameter \"%s\" must be in the form \"%s\"", pathString, templateString)); - PathTemplate template = PathTemplate.create(templateString); - template.validatedMatch(pathString, ""); - } - - // Instantiate - // =========== - - @Test - public void instantiateAtomicResource() { - PathTemplate template = PathTemplate.create("buckets/*/*/*/objects/*"); - String url = template.instantiate("$0", "f", "$1", "o", "$2", "o", "$3", "bar"); - Truth.assertThat(url).isEqualTo("buckets/f/o/o/objects/bar"); - } - - @Test - public void instantiateEscapeUnsafeChar() { - PathTemplate template = PathTemplate.create("buckets/*/objects/*"); - Truth.assertThat(template.instantiate("$0", "f/o/o", "$1", "b/a/r")) - .isEqualTo("buckets/f%2Fo%2Fo/objects/b%2Fa%2Fr"); - } - - @Test - public void instantiateNotEscapeForUnboundedWildcard() { - PathTemplate template = PathTemplate.create("buckets/*/objects/**"); - Truth.assertThat(template.instantiate("$0", "f/o/o", "$1", "b/a/r")) - .isEqualTo("buckets/f%2Fo%2Fo/objects/b/a/r"); - } - - @Test - public void instantiateFailWhenTooFewVariables() { - thrown.expect(ValidationException.class); - PathTemplate template = PathTemplate.create("buckets/*/*/*/objects/*"); - template.instantiate("$0", "f", "1", "o"); - } - - @Test - public void instantiateWithUnboundInMiddle() { - PathTemplate template = PathTemplate.create("bar/**/foo/*"); - Truth.assertThat(template.instantiate("$0", "1/2", "$1", "3")).isEqualTo("bar/1/2/foo/3"); - } - - @Test - public void instantiatePartial() { - PathTemplate template = PathTemplate.create("bar/*/foo/*"); - String instance = template.instantiatePartial(ImmutableMap.of("$0", "_1")); - Truth.assertThat(instance).isEqualTo("bar/_1/foo/*"); - } - - @Test - public void instantiateWithHostName() { - PathTemplate template = PathTemplate.create("bar/*"); - String instance = - template.instantiate( - ImmutableMap.of(PathTemplate.HOSTNAME_VAR, "//somewhere.io", "$0", "foo")); - Truth.assertThat(instance).isEqualTo("//somewhere.io/bar/foo"); - } - - @Test - public void instantiateEscapeUnsafeCharNoEncoding() { - thrown.expect(ValidationException.class); - thrown.expectMessage("Invalid character \"/\" in path section \"f/o/o\"."); - PathTemplate template = PathTemplate.createWithoutUrlEncoding("buckets/*/objects/*"); - template.instantiate("$0", "f/o/o", "$1", "b/a/r"); - } - - @Test - public void instantiateNotEscapeForUnboundedWildcardNoEncoding() { - PathTemplate template = PathTemplate.createWithoutUrlEncoding("buckets/*/objects/**"); - Truth.assertThat(template.instantiate("$0", "foo", "$1", "b/a/r")) - .isEqualTo("buckets/foo/objects/b/a/r"); - } - - @Test - public void instantiateWithGoogProject() { - PathTemplate template = PathTemplate.create("projects/{project}"); - String instance = template.instantiate(ImmutableMap.of("project", "google.com:test-proj")); - Truth.assertThat(instance).isEqualTo("projects/google.com%3Atest-proj"); - } - - @Test - public void instantiateWithGoogProjectNoEncoding() { - PathTemplate template = PathTemplate.createWithoutUrlEncoding("projects/{project}"); - String instance = template.instantiate(ImmutableMap.of("project", "google.com:test-proj")); - Truth.assertThat(instance).isEqualTo("projects/google.com:test-proj"); - } - - @Test - public void instantiateWithUnusualCharactersNoEncoding() { - PathTemplate template = PathTemplate.createWithoutUrlEncoding("bar/*"); - String instance = template.instantiate(ImmutableMap.of("$0", "asdf:;`~,.<>[]!@#$%^&*()")); - Truth.assertThat(instance).isEqualTo("bar/asdf:;`~,.<>[]!@#$%^&*()"); - } - - @Test - public void instantiateWithComplexResourceId_basic() { - PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}"); - String instance = - template.instantiate("project", "a/b/c", "zone_a", "apple", "zone_b", "baseball"); - Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc/zones/apple~baseball"); - } - - @Test - public void instantiateWithComplexResourceId_customVerb() { - PathTemplate template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}:hello"); - String instance = - template.instantiate("project", "a/b/c", "zone_a", "apple", "zone_b", "baseball"); - Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc/zones/apple~baseball:hello"); - - template = PathTemplate.create("projects/{project}/zones/{zone_a}~{zone_b}/stuff:hello"); - instance = template.instantiate("project", "a/b/c", "zone_a", "apple", "zone_b", "baseball"); - Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc/zones/apple~baseball/stuff:hello"); - } - - @Test - public void instantiateWithComplexResourceId_mixedSeparators() { - PathTemplate template = - PathTemplate.create( - "projects/{project}/zones/{zone_a}~{zone_b}.{zone_c}-{zone_d}~{zone_e}"); - String instance = - template.instantiate( - "project", - "a/b/c", - "zone_a", - "apple", - "zone_b", - "baseball/basketball", - "zone_c", - "cat/kitty", - "zone_d", - "dog/hound", - "zone_e", - "12345"); - Truth.assertThat(instance) - .isEqualTo( - "projects/a%2Fb%2Fc/zones/apple~baseball%2Fbasketball.cat%2Fkitty-dog%2Fhound~12345"); - } - - @Test - public void instantiateWithComplexResourceId_mixedSeparatorsInParent() { - PathTemplate template = - PathTemplate.create("projects/{project_a}~{project_b}.{project_c}/zones/{zone_a}~{zone_b}"); - String instance = - template.instantiate( - "project_a", - "a/b/c", - "project_b", - "foo", - "project_c", - "bar", - "zone_a", - "apple", - "zone_b", - "baseball"); - Truth.assertThat(instance).isEqualTo("projects/a%2Fb%2Fc~foo.bar/zones/apple~baseball"); - } - - @Test - public void instantiateWithCustomVerbs() { - PathTemplate template = PathTemplate.create("/v1/{name=operations/**}:cancel"); - String templateInstance = template.instantiate("name", "operations/3373707"); - Truth.assertThat(templateInstance).isEqualTo("v1/operations/3373707:cancel"); - Truth.assertThat(template.matches(templateInstance)).isTrue(); - } - - @Test - public void instantiateWithASegmentStartsWithADelimiter() { - PathTemplate pathTemplate = - PathTemplate.create( - "v1beta1/{parent=projects/*/locations/*/clusters/*}/.well-known/openid-configuration"); - String pattern = - "v1beta1/projects/abc/locations/def/clusters/yte/.well-known/openid-configuration"; - Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); - } - - @Test - public void instantiateWithASegmentContainingComplexResourceNamesAndStartsWithADelimiter() { - thrown.expect(ValidationException.class); - PathTemplate.create( - "v1beta1/{parent=projects/*/locations/*/clusters/*}/.{well}-{known}/openid-configuration"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", ".{well}-{known}")); - } - - @Test - public void - instantiateWithASegmentContainingNoComplexResourceNamesAndStartsWithMultipleDelimiters() { - PathTemplate pathTemplate = - PathTemplate.create( - "v1beta1/{parent=projects/*/locations/*/clusters/*}/.-~well-known/openid-configuration"); - String pattern = - "v1beta1/projects/abc/locations/def/clusters/yte/.-~well-known/openid-configuration"; - Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); - } - - @Test - public void instantiateWithASegmentOnlyContainingOneDelimiter() { - thrown.expect(ValidationException.class); - PathTemplate.create("v1/publishers/{publisher}/books/."); - thrown.expectMessage(String.format("parse error: invalid begin or end character in '%s'", ".")); - } - - @Test - public void instantiateWithASegmentOnlyContainingOneCharacter() { - PathTemplate pathTemplate = PathTemplate.create("v1/publishers/{publisher}/books/a"); - String pattern = "v1/publishers/o'reilly/books/a"; - Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); - } - - @Test - public void instantiateWithASegmentEndsWithADelimiter() { - PathTemplate pathTemplate = - PathTemplate.create( - "v1beta1/{parent=projects/*/locations/*/clusters/*}/well-known./openid-configuration"); - String pattern = - "v1beta1/projects/abc/locations/def/clusters/yte/well-known./openid-configuration"; - Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); - } - - @Test - public void instantiateWithASegmentContainingComplexResourceNamesAndEndsWithADelimiter() { - thrown.expect(ValidationException.class); - PathTemplate.create( - "v1beta1/{parent=projects/*/locations/*/clusters/*}/{well}-{known}./openid-configuration"); - thrown.expectMessage( - String.format("parse error: invalid begin or end character in '%s'", "{well}-{known}.")); - } - - @Test - public void - instantiateWithASegmentContainingNoComplexResourceNamesAndEndsWithMultipleDelimiters() { - PathTemplate pathTemplate = - PathTemplate.create( - "v1beta1/{parent=projects/*/locations/*/clusters/*}/well-known.-~/openid-configuration"); - String pattern = - "v1beta1/projects/abc/locations/def/clusters/yte/well-known.-~/openid-configuration"; - Truth.assertThat(pathTemplate.matches(pattern)).isTrue(); - } - - // Other - // ===== - - @Test - public void testMultiplePathWildcardFailure() { - thrown.expect(IllegalArgumentException.class); - PathTemplate.create("bar/**/{name=foo/**}:verb"); - } - - @Test - public void testTemplateWithSimpleBinding() { - PathTemplate template = PathTemplate.create("/v1/messages/{message_id}"); - String url = template.instantiate("message_id", "mymessage"); - Truth.assertThat(url).isEqualTo("v1/messages/mymessage"); - } - - @Test - public void testTemplateWithMultipleSimpleBindings() { - PathTemplate template = PathTemplate.create("v1/shelves/{shelf}/books/{book}"); - String url = template.instantiate("shelf", "s1", "book", "b1"); - Truth.assertThat(url).isEqualTo("v1/shelves/s1/books/b1"); - } - - private static void assertPositionalMatch(Map match, String... expected) { - Truth.assertThat(match).isNotNull(); - int i = 0; - for (; i < expected.length; ++i) { - Truth.assertThat(expected[i]).isEqualTo(match.get("$" + i)); - } - Truth.assertThat(i).isEqualTo(match.size()); - } -} diff --git a/src/test/java/com/google/api/pathtemplate/TemplatedResourceNameTest.java b/src/test/java/com/google/api/pathtemplate/TemplatedResourceNameTest.java deleted file mode 100644 index bb143932f..000000000 --- a/src/test/java/com/google/api/pathtemplate/TemplatedResourceNameTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.google.api.pathtemplate; - -import com.google.common.truth.Truth; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** - * Tests for {@link TemplatedResourceName}. As resource names are mostly a wrapper around path - * templates, not much needs to be done here. - */ -@RunWith(JUnit4.class) -public class TemplatedResourceNameTest { - - @Test - public void resourceNameMethods() { - PathTemplate template = PathTemplate.create("buckets/*/objects/**"); - TemplatedResourceName name = TemplatedResourceName.create(template, "buckets/b/objects/1/2"); - Truth.assertThat(name.toString()).isEqualTo("buckets/b/objects/1/2"); - Truth.assertThat(name.get("$1")).isEqualTo("1/2"); - Truth.assertThat(name.get("$0")).isEqualTo("b"); - Truth.assertThat(name.parentName().toString()).isEqualTo("buckets/b/objects"); - } -} diff --git a/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java b/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java deleted file mode 100644 index c0615da41..000000000 --- a/src/test/java/com/google/api/resourcenames/UntypedResourceNameTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2018, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.google.api.resourcenames; - -import static junit.framework.TestCase.fail; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.Map; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Tests for {@link UntypedResourceNameTest}. */ -@RunWith(JUnit4.class) -public class UntypedResourceNameTest { - private static final String NAME_STRING = "sunshine"; - private static final String EMPTY_STRING = ""; - - @Test - public void testGetFieldValues() { - assertTrue(UntypedResourceName.isParsableFrom(NAME_STRING)); - UntypedResourceName fooName = UntypedResourceName.parse(NAME_STRING); - - Map fieldValuesMap = fooName.getFieldValuesMap(); - assertTrue(fieldValuesMap.containsKey(EMPTY_STRING)); - assertEquals(NAME_STRING, fieldValuesMap.get(EMPTY_STRING)); - assertEquals(1, fieldValuesMap.size()); - assertEquals(null, fieldValuesMap.get(NAME_STRING)); - } - - @Test - public void testInsertIntoFieldValuesMap() { - UntypedResourceName fooName = UntypedResourceName.parse(NAME_STRING); - Map fieldValuesMap = fooName.getFieldValuesMap(); - - try { - fieldValuesMap.put(EMPTY_STRING, "foo"); - fail("fieldValuesMap should prevent insertion into internal map. "); - } catch (UnsupportedOperationException e) { - } - - try { - fieldValuesMap.put(null, "foo"); - fail("fieldValuesMap should prevent insertion into internal map. "); - } catch (UnsupportedOperationException e) { - } - - try { - fieldValuesMap.put(NAME_STRING, NAME_STRING); - fail("fieldValuesMap should prevent insertion into internal map. "); - } catch (UnsupportedOperationException e) { - } - } - - @Test - public void testNullName() { - assertFalse(UntypedResourceName.isParsableFrom(null)); - try { - UntypedResourceName fooName = UntypedResourceName.parse(null); - } catch (NullPointerException e) { - } - } -} diff --git a/synth.metadata b/synth.metadata deleted file mode 100644 index b8bf18aed..000000000 --- a/synth.metadata +++ /dev/null @@ -1,18 +0,0 @@ -{ - "sources": [ - { - "git": { - "name": ".", - "remote": "git@github.com:googleapis/api-common-java.git", - "sha": "7014db17904a165c78fbda1284d433b38e839876" - } - }, - { - "git": { - "name": "synthtool", - "remote": "https://github.com/googleapis/synthtool.git", - "sha": "5a6f30b8bb7672cf237c4f75d5aa96bfba170e7f" - } - } - ] -} \ No newline at end of file diff --git a/templates/apidocs_index.html.template b/templates/apidocs_index.html.template deleted file mode 100644 index 66505a09f..000000000 --- a/templates/apidocs_index.html.template +++ /dev/null @@ -1 +0,0 @@ - diff --git a/versions.txt b/versions.txt deleted file mode 100644 index de847d6ca..000000000 --- a/versions.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Format: -# module:released-version:current-version - -api-common:2.3.1:2.3.2-SNAPSHOT From ab2a266a80664699976422254b24b8769f91ae40 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 18 Jul 2023 15:08:32 -0400 Subject: [PATCH 201/201] chore: bringing back release-please.yml (#453) --- .github/release-please.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/release-please.yml diff --git a/.github/release-please.yml b/.github/release-please.yml new file mode 100644 index 000000000..ecee50f16 --- /dev/null +++ b/.github/release-please.yml @@ -0,0 +1,25 @@ +releaseType: java-yoshi +bumpMinorPreMajor: true +handleGHRelease: true +branches: + - releaseType: java-lts + bumpMinorPreMajor: true + branch: 1.10.1-sp + handleGHRelease: true + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-yoshi + branch: java7 + - releaseType: java-backport + bumpMinorPreMajor: true + handleGHRelease: true + branch: 2.0.x + - releaseType: java-backport + bumpMinorPreMajor: true + handleGHRelease: true + branch: 2.1.x + - releaseType: java-backport + bumpMinorPreMajor: true + handleGHRelease: true + branch: 2.2.x +

- * There are deviations from this if there are failures or if {@link ApiService#stopAsync} is called - * before the {@link ApiService} reaches the {@linkplain State#RUNNING RUNNING} state. The set of - * legal transitions form a DAG, - * therefore every method of the listener will be called at most once. N.B. The {@link State#FAILED} - * and {@link State#TERMINATED} states are terminal states, once a service enters either of these - * states it cannot ever leave them. + *