From 10eb41c201b817342ecba9d761f22a97ffb21946 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 20 Jul 2022 17:17:13 +0200 Subject: [PATCH] Add options to define the repository where we read config files --- .../deployment/GitHubAppProcessor.java | 8 +++- .../ROOT/pages/includes/attributes.adoc | 2 +- .../pages/includes/quarkus-github-app.adoc | 9 ++++ .../io/quarkiverse/githubapp/ConfigFile.java | 8 ++++ .../githubapp/runtime/ConfigFileReader.java | 46 +++++++++++++++++-- .../config/GitHubAppRuntimeConfig.java | 6 +++ 6 files changed, 73 insertions(+), 6 deletions(-) diff --git a/deployment/src/main/java/io/quarkiverse/githubapp/deployment/GitHubAppProcessor.java b/deployment/src/main/java/io/quarkiverse/githubapp/deployment/GitHubAppProcessor.java index aa34de62..ef0a56d5 100644 --- a/deployment/src/main/java/io/quarkiverse/githubapp/deployment/GitHubAppProcessor.java +++ b/deployment/src/main/java/io/quarkiverse/githubapp/deployment/GitHubAppProcessor.java @@ -51,6 +51,7 @@ import org.objectweb.asm.Opcodes; import io.quarkiverse.githubapi.deployment.GitHubApiClassWithBridgeMethodsBuildItem; +import io.quarkiverse.githubapp.ConfigFile; import io.quarkiverse.githubapp.GitHubEvent; import io.quarkiverse.githubapp.deployment.DispatchingConfiguration.EventAnnotation; import io.quarkiverse.githubapp.deployment.DispatchingConfiguration.EventAnnotationLiteral; @@ -237,7 +238,7 @@ void generateClasses(CombinedIndexBuildItem combinedIndex, LaunchModeBuildItem l ClassOutput beanClassOutput = new GeneratedBeanGizmoAdaptor(generatedBeans); generateDispatcher(beanClassOutput, launchMode, dispatchingConfiguration, reflectiveClasses); - generateMultiplexers(beanClassOutput, dispatchingConfiguration, reflectiveClasses); + generateMultiplexers(beanClassOutput, index, dispatchingConfiguration, reflectiveClasses); } @BuildStep @@ -551,6 +552,7 @@ private static void generateDispatcher(ClassOutput beanClassOutput, * */ private static void generateMultiplexers(ClassOutput beanClassOutput, + IndexView index, DispatchingConfiguration dispatchingConfiguration, BuildProducer reflectiveClasses) { for (Entry> eventDispatchingMethodsEntry : dispatchingConfiguration @@ -757,10 +759,12 @@ private static void generateMultiplexers(ClassOutput beanClassOutput, payloadRh); ResultHandle configObject = methodCreator.invokeVirtualMethod( MethodDescriptor.ofMethod(ConfigFileReader.class, "getConfigObject", Object.class, - GHRepository.class, String.class, Class.class), + GHRepository.class, String.class, ConfigFile.Source.class, Class.class), configFileReaderRh, ghRepositoryRh, methodCreator.load(configFileAnnotationInstance.value().asString()), + methodCreator.load(ConfigFile.Source + .valueOf(configFileAnnotationInstance.valueWithDefault(index, "source").asEnum())), methodCreator.loadClass(configObjectType)); configObject = methodCreator.checkCast(configObject, configObjectType); diff --git a/docs/modules/ROOT/pages/includes/attributes.adoc b/docs/modules/ROOT/pages/includes/attributes.adoc index e5d53829..76a883a2 100644 --- a/docs/modules/ROOT/pages/includes/attributes.adoc +++ b/docs/modules/ROOT/pages/includes/attributes.adoc @@ -1,4 +1,4 @@ -:quarkus-version: 2.10.1.Final +:quarkus-version: 2.10.2.Final :quarkus-github-app-version: 1.9.0 :github-api-javadoc-root-url: https://github-api.kohsuke.org/apidocs/org/kohsuke/github diff --git a/docs/modules/ROOT/pages/includes/quarkus-github-app.adoc b/docs/modules/ROOT/pages/includes/quarkus-github-app.adoc index 14e02911..99212ae4 100644 --- a/docs/modules/ROOT/pages/includes/quarkus-github-app.adoc +++ b/docs/modules/ROOT/pages/includes/quarkus-github-app.adoc @@ -27,6 +27,15 @@ The GitHub name of the application. | +a| [[quarkus-github-app_quarkus.github-app.read-config-files-from-source-repository]]`link:#quarkus-github-app_quarkus.github-app.read-config-files-from-source-repository[quarkus.github-app.read-config-files-from-source-repository]` + +[.description] +-- +Read the configuration files from the source repository in case of a fork. +--|boolean +|`false` + + a| [[quarkus-github-app_quarkus.github-app.private-key]]`link:#quarkus-github-app_quarkus.github-app.private-key[quarkus.github-app.private-key]` [.description] diff --git a/runtime/src/main/java/io/quarkiverse/githubapp/ConfigFile.java b/runtime/src/main/java/io/quarkiverse/githubapp/ConfigFile.java index 117e2c62..72d95583 100644 --- a/runtime/src/main/java/io/quarkiverse/githubapp/ConfigFile.java +++ b/runtime/src/main/java/io/quarkiverse/githubapp/ConfigFile.java @@ -11,4 +11,12 @@ public @interface ConfigFile { String value(); + + Source source() default Source.DEFAULT; + + public enum Source { + DEFAULT, + SOURCE_REPOSITORY, + CURRENT_REPOSITORY; + } } \ No newline at end of file diff --git a/runtime/src/main/java/io/quarkiverse/githubapp/runtime/ConfigFileReader.java b/runtime/src/main/java/io/quarkiverse/githubapp/runtime/ConfigFileReader.java index b6c0bcb5..46d3a746 100644 --- a/runtime/src/main/java/io/quarkiverse/githubapp/runtime/ConfigFileReader.java +++ b/runtime/src/main/java/io/quarkiverse/githubapp/runtime/ConfigFileReader.java @@ -1,5 +1,6 @@ package io.quarkiverse.githubapp.runtime; +import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -15,7 +16,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import io.quarkiverse.githubapp.ConfigFile; import io.quarkiverse.githubapp.runtime.UtilsProducer.Yaml; +import io.quarkiverse.githubapp.runtime.config.GitHubAppRuntimeConfig; import io.quarkiverse.githubapp.runtime.github.GitHubFileDownloader; @RequestScoped @@ -31,6 +34,9 @@ public class ConfigFileReader { private final Map cache = new ConcurrentHashMap<>(); + @Inject + GitHubAppRuntimeConfig gitHubAppRuntimeConfig; + @Inject GitHubFileDownloader gitHubFileDownloader; @@ -41,16 +47,19 @@ public class ConfigFileReader { @Yaml ObjectMapper yamlObjectMapper; - public Object getConfigObject(GHRepository ghRepository, String path, Class type) { + public Object getConfigObject(GHRepository ghRepository, String path, ConfigFile.Source source, Class type) { + GHRepository configGHRepository = getConfigRepository(ghRepository, source, + gitHubAppRuntimeConfig.readConfigFilesFromSourceRepository, path); + String fullPath = getFilePath(path.trim()); - String cacheKey = getCacheKey(ghRepository, fullPath); + String cacheKey = getCacheKey(configGHRepository, fullPath); Object cachedObject = cache.get(cacheKey); if (cachedObject != null) { return cachedObject; } - return cache.computeIfAbsent(cacheKey, k -> readConfigFile(ghRepository, fullPath, type)); + return cache.computeIfAbsent(cacheKey, k -> readConfigFile(configGHRepository, fullPath, type)); } private Object readConfigFile(GHRepository ghRepository, String fullPath, Class type) { @@ -79,6 +88,37 @@ private Object readConfigFile(GHRepository ghRepository, String fullPath, Class< } } + private static GHRepository getConfigRepository(GHRepository ghRepository, + ConfigFile.Source source, + boolean readConfigFilesFromSourceRepository, + String path) { + ConfigFile.Source effectiveSource = (source == ConfigFile.Source.DEFAULT) + ? (readConfigFilesFromSourceRepository ? ConfigFile.Source.SOURCE_REPOSITORY + : ConfigFile.Source.CURRENT_REPOSITORY) + : source; + + if (effectiveSource == ConfigFile.Source.CURRENT_REPOSITORY) { + return ghRepository; + } + if (!ghRepository.isFork()) { + return ghRepository; + } + + try { + GHRepository sourceRepository = ghRepository.getSource(); + + if (sourceRepository == null) { + throw new IllegalStateException("Unable to get the source repository for fork " + ghRepository.getFullName() + + ": unable to read config file " + path); + } + + return sourceRepository; + } catch (IOException e) { + throw new IllegalStateException("Unable to get the source repository for fork " + ghRepository.getFullName() + + ": unable to read config file " + path, e); + } + } + private static String getCacheKey(GHRepository ghRepository, String fullPath) { // we should only handle the config files of one repository in a given ConfigFileReader // as it's request scoped but let's be on the safe side diff --git a/runtime/src/main/java/io/quarkiverse/githubapp/runtime/config/GitHubAppRuntimeConfig.java b/runtime/src/main/java/io/quarkiverse/githubapp/runtime/config/GitHubAppRuntimeConfig.java index 2e297fd9..b60c020e 100644 --- a/runtime/src/main/java/io/quarkiverse/githubapp/runtime/config/GitHubAppRuntimeConfig.java +++ b/runtime/src/main/java/io/quarkiverse/githubapp/runtime/config/GitHubAppRuntimeConfig.java @@ -27,6 +27,12 @@ public class GitHubAppRuntimeConfig { @ConfigItem public Optional appName; + /** + * Read the configuration files from the source repository in case of a fork. + */ + @ConfigItem(defaultValue = "false") + public boolean readConfigFilesFromSourceRepository; + /** * The RSA private key. */