Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Package from single platform to multiple platforms #248

Merged
merged 30 commits into from
Aug 6, 2022
Merged

Package from single platform to multiple platforms #248

merged 30 commits into from
Aug 6, 2022

Conversation

Osiris-Team
Copy link
Collaborator

@Osiris-Team Osiris-Team commented Aug 1, 2022

Adds feature #247

I also included an updating feature, which means that if the installed jdk in the temp directory is outdated it gets updated before being used further.

Also integrated maven and gradle hello world projects into unit test:

image

Also was able to merge everything into PackageTask (merged maven and gradle package tasks + plugin extension into one with all the settings included). This makes everythig much simpler and easier to modify settings or add new ones.

Maven is having issues with the new config I think. Doing research on that.

fvarrui and others added 4 commits July 19, 2022 13:44
…anged when modifying or adding new stuff;

iconFile was not present in gradle PackageTask before, added that;
renamed appName to name (gradle);
renamed appDescription to description (gradle);
@fvarrui
Copy link
Owner

fvarrui commented Aug 1, 2022

Please, don't push to master. Use devel instead.

@Osiris-Team
Copy link
Collaborator Author

fuck

@Osiris-Team Osiris-Team closed this Aug 1, 2022
@fvarrui
Copy link
Owner

fvarrui commented Aug 1, 2022

Don't worry! I can rebase before merging. I was referring to future PRs

@fvarrui fvarrui reopened this Aug 1, 2022
@Osiris-Team Osiris-Team changed the base branch from master to devel August 1, 2022 16:15
@Osiris-Team
Copy link
Collaborator Author

Osiris-Team commented Aug 1, 2022

Ok was scared that there would be a lot of changes already that interfere with mine in the devel branch...
Thank god its only the readme.

@Osiris-Team
Copy link
Collaborator Author

Osiris-Team commented Aug 1, 2022

@fvarrui are there tests somewhere, so I can make sure everything works as intended?
I noticed this:
image
But no clue how to use it.

@Osiris-Team Osiris-Team marked this pull request as ready for review August 1, 2022 18:16
@Osiris-Team
Copy link
Collaborator Author

Osiris-Team commented Aug 2, 2022

No offense, but adding new settings is a mess and painful.
You got like 4 different classes for the same thing and I have to do the changes for each of them.
I'm pretty sure that that stuff can be simplified and put into one class.
I didn't do it though since its time intensive bc I have no clue about the project and learning how all plays together would be too much effort and I know that developers' minds are pretty stubborn and resistant to change, especially to their own code.

@Osiris-Team
Copy link
Collaborator Author

Btw, dunno why there are so many whitespace changes, even though I copied the stuff directly from the devel branch...

@fvarrui
Copy link
Owner

fvarrui commented Aug 3, 2022

No offense, but adding new settings is a mess and painful. You got like 4 different classes for the same thing and I have to do the changes for each of them. I'm pretty sure that that stuff can be simplified and put into one class. I didn't do it though since its time intensive bc I have no clue about the project and learning how all plays together would be too much effort and I know that developers' minds are pretty stubborn and resistant to change, especially to their own code.

You don't offend me, don't worry about it! 😄 The best way to grow is listening to the opinions of others, so thank you for your comments (and your contributions). Of course, there is a lot to improve, sometimes I spend some time refactoring, but I always prioritize resolving issues and adding new features. It started as a small personal project, but it has been growing over time, it's getting harder and harder to keep it up to date, but I keep trying as much as possible 😅

@fvarrui
Copy link
Owner

fvarrui commented Aug 3, 2022

Btw, dunno why there are so many whitespace changes, even though I copied the stuff directly from the devel branch...

Sorry! I didn't catch this point ... are you referring to whitespaces/tabs in the source code? (indentation)

@fvarrui
Copy link
Owner

fvarrui commented Aug 3, 2022

@fvarrui are there tests somewhere, so I can make sure everything works as intended? I noticed this: image But no clue how to use it.

No, sorry. I would like it, but there's not unit tests at the moment. I use two projects for testing, depending on the buiding tool:

.generateInstaller(extension.getGenerateInstaller())
.jdkPath(extension.getJdkPath())
.jdkVersion(extension.getJdkVersion())
.jdkVendor(extension.getJdkVendor())
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idk why this file has so many diffs, maybe because it was completely different before, but
the only thing changed are the two lines above.

Copy link
Owner

@fvarrui fvarrui Aug 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No idea 😅 ... Git diff algorithm? Your IDE replacing tabs with whitespaces or new lines style?

@@ -16,44 +16,44 @@
import io.github.fvarrui.javapackager.packagers.PackagerSettings;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file has only whitespace changes...

@@ -26,70 +26,70 @@
import io.github.fvarrui.javapackager.packagers.PackagerFactory;

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also tons of whitespace idk why.
But some additions further below.

jdkPath = new File(System.getProperty("java.home"));
TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(platform);
taskJavaUpdater.execute(jdkVersion, jdkVendor);
jdkPath = taskJavaUpdater.jdkPath;
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if this is the right place to the the updating/downloading...

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also not sure if the default jdkVersion and jdkVendor can be null here.
That should not happen!

@Osiris-Team Osiris-Team marked this pull request as draft August 4, 2022 20:13
@Osiris-Team
Copy link
Collaborator Author

@fvarrui Now im stuck with maven problems. Do you have any idea what this means:

Show exception
[INFO] --- javapackager:1.7.0:package (default) @ HelloWorldMaven ---
[WARNING] The POM for io.github.fvarrui:launch4j:jar:2.5.2 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[WARNING] ClassRealm[plugin>io.github.fvarrui:javapackager:1.7.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@4e0e2f2a]
com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Scope org.apache.maven.execution.scope.internal.MojoExecutionScope@6ad59d92 is already bound to org.apache.maven.execution.scope.MojoExecutionScoped at org.apache.maven.execution.scope.internal.MojoExecutionScopeModule.configure(MojoExecutionScopeModule.java:52) (via modules: org.eclipse.sisu.wire.WireModule -> org.apache.maven.execution.scope.internal.MojoExecutionScopeModule).
 Cannot bind org.apache.maven.execution.scope.internal.MojoExecutionScope@1d226f27.
  at ClassRealm[plugin>io.github.fvarrui:javapackager:1.7.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@4e0e2f2a] (via modules: org.eclipse.sisu.wire.WireModule -> org.eclipse.sisu.plexus.PlexusBindingModule -> org.apache.maven.execution.scope.internal.MojoExecutionScopeCoreModule)

1 error
    at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist (Errors.java:543)
    at com.google.inject.internal.InternalInjectorCreator.initializeStatically (InternalInjectorCreator.java:159)
    at com.google.inject.internal.InternalInjectorCreator.build (InternalInjectorCreator.java:106)
    at com.google.inject.Guice.createInjector (Guice.java:87)
    at com.google.inject.Guice.createInjector (Guice.java:69)
    at com.google.inject.Guice.createInjector (Guice.java:59)
    at org.codehaus.plexus.DefaultPlexusContainer.addPlexusInjector (DefaultPlexusContainer.java:481)
    at org.codehaus.plexus.DefaultPlexusContainer.discoverComponents (DefaultPlexusContainer.java:460)
    at org.apache.maven.plugin.internal.DefaultMavenPluginManager.discoverPluginComponents (DefaultMavenPluginManager.java:436)
    at org.apache.maven.plugin.internal.DefaultMavenPluginManager.createPluginRealm (DefaultMavenPluginManager.java:415)
    at org.apache.maven.plugin.internal.DefaultMavenPluginManager.setupPluginRealm (DefaultMavenPluginManager.java:374)
    at org.apache.maven.plugin.DefaultBuildPluginManager.getPluginRealm (DefaultBuildPluginManager.java:234)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:105)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:64)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:564)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)

@fvarrui
Copy link
Owner

fvarrui commented Aug 5, 2022

Hi @Osiris-Team!

Sorry for being missing in action, but I'm back 😄

I'm going to merge your PR in a new branch and test it. I'll tell you something ASAP.

Thanks so much for your hard work

@Osiris-Team
Copy link
Collaborator Author

Np. Also noticed that shading breaks the gradle plugin somehow.

@fvarrui fvarrui changed the base branch from devel to pr-248 August 6, 2022 17:06
@fvarrui fvarrui marked this pull request as ready for review August 6, 2022 17:08
@fvarrui fvarrui merged commit 67a67aa into fvarrui:pr-248 Aug 6, 2022
@fvarrui
Copy link
Owner

fvarrui commented Aug 6, 2022

Hi @Osiris-Team!
I've been trying to build the plugin, but there are compilation errors ... Maybe I went wrong while resolving conflicts when merging.

@fvarrui
Copy link
Owner

fvarrui commented Aug 6, 2022

All errors are in MacPackager class:

C:\Users\fvarrui\GitHub\JavaPackager>gradlew clean build
Starting a Gradle Daemon, 2 incompatible Daemons could not be reused, use --status for details

> Task :compileJava
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:115: error: cannot find symbol
                if (this.administratorRequired) {
                        ^
  symbol: variable administratorRequired
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:115: error: illegal parenthesized expression
                if (this.administratorRequired) {
                   ^
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:129: error: cannot find symbol
                        File launcher = macConfig.getCustomLauncher();
                                        ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:144: error: cannot find symbol
                classpath = (this.macConfig.isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (classpath != null ? ":" + classpath : "");
                ^
  symbol:   variable classpath
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:144: error: cannot find symbol
                classpath = (this.macConfig.isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (classpath != null ? ":" + classpath : "");
                                 ^
  symbol: variable macConfig
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:144: error: cannot find symbol
                classpath = (this.macConfig.isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (classpath != null ? ":" + classpath : "");
                                                                                                        ^
  symbol:   variable classpath
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:144: error: cannot find symbol
                classpath = (this.macConfig.isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (classpath != null ? ":" + classpath : "");
                                                                                                                                  ^
  symbol:   variable classpath
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:145: error: cannot find symbol
                classpaths = Arrays.asList(classpath.split("[:;]"));
                                           ^
  symbol:   variable classpath
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:146: error: cannot find symbol
                if (!isUseResourcesAsWorkingDir()) {
                     ^
  symbol:   method isUseResourcesAsWorkingDir()
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:152: error: cannot find symbol
                classpath = StringUtils.join(classpaths, ":");
                ^
  symbol:   variable classpath
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:161: error: cannot find symbol
                if(macConfig.getCustomInfoPlist() != null && macConfig.getCustomInfoPlist().isFile() && macConfig.getCustomInfoPlist().canRead()){
                   ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:161: error: cannot find symbol
                if(macConfig.getCustomInfoPlist() != null && macConfig.getCustomInfoPlist().isFile() && macConfig.getCustomInfoPlist().canRead()){
                                                             ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:161: error: cannot find symbol
                if(macConfig.getCustomInfoPlist() != null && macConfig.getCustomInfoPlist().isFile() && macConfig.getCustomInfoPlist().canRead()){
                                                                                                        ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:162: error: cannot find symbol
                        FileUtils.copyFileToFile(macConfig.getCustomInfoPlist(), infoPlistFile);
                                                 ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:181: error: cannot find symbol
                if (macConfig.getProvisionProfile() != null && macConfig.getProvisionProfile().isFile() && macConfig.getProvisionProfile().canRead()) {
                    ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:181: error: cannot find symbol
                if (macConfig.getProvisionProfile() != null && macConfig.getProvisionProfile().isFile() && macConfig.getProvisionProfile().canRead()) {
                                                               ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:181: error: cannot find symbol
                if (macConfig.getProvisionProfile() != null && macConfig.getProvisionProfile().isFile() && macConfig.getProvisionProfile().canRead()) {
                                                                                                           ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:184: error: cannot find symbol
                        FileUtils.copyFileToFile(macConfig.getProvisionProfile(), provisionProfile);
                                                 ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:186: error: cannot find symbol
                                        macConfig.getProvisionProfile() + " to \n" +
                                        ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:195: error: cannot find symbol
                switch (macConfig.getMacStartup()) {
                        ^
  symbol:   variable macConfig
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:196: error: cannot find symbol
                        case UNIVERSAL: universalJavaApplicationStubResource = "universalJavaApplicationStub"; break;
                             ^
  symbol:   variable UNIVERSAL
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:197: error: cannot find symbol
                        case X86_64:    universalJavaApplicationStubResource = "universalJavaApplicationStub.x86_64"; break;
                             ^
  symbol:   variable X86_64
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:198: error: cannot find symbol
                        case ARM64:     universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break;
                             ^
  symbol:   variable ARM64
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:199: error: cannot find symbol
                        case SCRIPT:    universalJavaApplicationStubResource = "universalJavaApplicationStub.sh"; break;
                             ^
  symbol:   variable SCRIPT
  location: class MacPackager
C:\Users\fvarrui\GitHub\JavaPackager\src\main\java\io\github\fvarrui\javapackager\packagers\MacPackager.java:202: error: cannot find symbol
                FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile, macConfig.getMacStartup() == MacStartup.SCRIPT);
                                                                                                          ^
  symbol:   variable macConfig
  location: class MacPackager
25 errors

> Task :compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.8.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 13s
3 actionable tasks: 2 executed, 1 up-to-date

@Osiris-Team
Copy link
Collaborator Author

@fvarrui the plugin compiles fine, guess your errors are related to some additional commits (dc88aa4) you merged into my PR.
You can use the test suit here: https://github.com/Osiris-Team/JavaPackager/blob/dc88aa4317434d4dc60d549ea0b4e00f5c3bedcd/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java

@fvarrui
Copy link
Owner

fvarrui commented Aug 6, 2022

On the other hand, I've been looking at the changes, and I don't like the idea of coupling the plugin to specific JDKs. Wouldn't it cover more possibilities if the programmer only indicated the URL of the JDK?

@Osiris-Team
Copy link
Collaborator Author

What do you mean by URL? The file path? Or the download URL of the JDK?
I don't see the problem, since we provide jdkVendor and jdkVersion properties for devs to customize it.
The jdkPath property still exists if the dev wants to provide his own JDK like before.

@fvarrui
Copy link
Owner

fvarrui commented Aug 6, 2022

What do you mean by URL? The file path? Or the download URL of the JDK?

I mean the download URL

I don't see the problem, since we provide jdkVendor and jdkVersion properties for devs to customize it. The jdkPath property still exists if the dev wants to provide his own JDK like before.

Yes, you are right, but the plugin will depend on external URLs, which can be broken in the future.

@fvarrui
Copy link
Owner

fvarrui commented Aug 6, 2022

By the way, what would you think if I add you as a collaborator? You have contributed a lot to the project lately... no more PRs, just push. I need help like yours to be able to keep this plugin up to date.

@Osiris-Team
Copy link
Collaborator Author

yeah why not ^^

@Osiris-Team
Copy link
Collaborator Author

Osiris-Team commented Aug 6, 2022

well to be exact only the downloading and updating of the packaging JDK will be dependent on external URLs, aka the REST API provided by adoptium, the rest of the plugin will work fine.
If there is an issue with the API, entering another URL wouldn't fix it I think, and the dev could just do it the old way by entering a jdk path. Since normaly an URL change means major changes to the API itself.

@fvarrui
Copy link
Owner

fvarrui commented Aug 6, 2022

Great!! 😄 I just send you an invitation

@fvarrui
Copy link
Owner

fvarrui commented Aug 6, 2022

well to be exact only the downloading and updating of the packaging JDK will be dependent on external URLs, aka the REST API provided by adoptium, the rest of the plugin will work fine. If there is an issue with the API, entering another URL wouldn't fix it I think, and the dev could just do it the old way by entering a jdk path. Since normaly an URL change means major changes to the API itself.

Ok. Do you think it is a good idea to add a task/mojo which shows all available JDK versions?

@Osiris-Team
Copy link
Collaborator Author

I mean that wouldnt hurt, it would just be extra work.
Instead, we could just add a link to this: https://api.adoptium.net/v3/info/available_releases
which shows a list of available jdk versions.

@Osiris-Team
Copy link
Collaborator Author

Resolved conflicts give it a try ;)

@Osiris-Team
Copy link
Collaborator Author

Seems like the test dependencies have also been removed -_-
Fixed that too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants