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

[NETBEANS-1793] Gradle Support #1077

Merged
merged 45 commits into from Jan 22, 2019

Conversation

Projects
None yet
6 participants
@lkishalmi
Copy link
Contributor

lkishalmi commented Jan 8, 2019

Well, let's see how far this goes.

@geertjanw
Copy link
Member

geertjanw left a comment

Awesome. I have used this code while in your repo and loved it.

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 8, 2019

Well, not that far. Travis got freaked out when the Gradle NetBeans Tooling build.

@lkishalmi lkishalmi force-pushed the lkishalmi:gradle-support branch from fc951ed to 7e10504 Jan 10, 2019

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 10, 2019

Well commit tests are passing now. The next round is for the sages.

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 10, 2019

Also there is something fishy around the ergonomics, like the groovy editor support is not being activated, so the gradle files could not be opened.

@JaroslavTulach
Copy link
Contributor

JaroslavTulach left a comment

Huge change. Some additional work on the APIs and their documentation wouldn't hurt.

</dependency>
</module-dependencies>
<public-packages>
<package>org.netbeans.modules.gradle.java.api</package>

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

Exporting public packages should be associated with adding arch.xml and apichanges.xml documents. No need to fill all the arch.xml questions. The most important action is to use <api/> tag and make sure various APIs (properties, files, etc.) are listed in the generated Javadoc.

This comment has been minimized.

@lkishalmi

lkishalmi Jan 12, 2019

Author Contributor

Documentation will be provided.

under the License.
-->
<!DOCTYPE actions SYSTEM "action-mapping.dtd">

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

I guess the action-mapping.dtd is a kind of API that would be mentioned in the arch.xml.

*
* @author Laszlo Kishalmi
*/
public interface ProjectSourcesClassPathProvider {

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

Some Javadoc wouldn't hurt...

Adding @since x.y tag might be good idea as well. The x.y version should be the same as the one in the apichanges.xml entry describing the initial introduction of this API.


javac.source=1.8
javac.compilerargs=-Xlint -Xlint:-serial
nbm.module.author=Laszlo Kishalmi

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

Modules with API are usually autoloads. This one isn't. Why?

This comment has been minimized.

@lkishalmi

lkishalmi Jan 12, 2019

Author Contributor

The reason is: Lack of knowledge. Will fix it. thanks!

*
* @author Laszlo Kishalmi
*/
public class LocationOpener {

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

This class is subclassable. Is that really your use-case?

This comment has been minimized.

@lkishalmi

lkishalmi Jan 12, 2019

Author Contributor

My bad. It was'n an api by design, moved into this folder when the unittest support started to use it.


/**
*
* @author mkleint

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

Copy based programming again.

This comment has been minimized.

@lkishalmi

lkishalmi Jan 12, 2019

Author Contributor

Plugin Mentality. Maven project use the same code. Could be added somewhere else later.

*
* @author Laszlo Kishalmi
*/
public class DefaultActionMappingTest {

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

Tests. That is nice.

@@ -187,6 +187,7 @@
</dependency>
</module-dependencies>
<friend-packages>
<friend>org.netbeans.modules.gradle.java</friend>

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

Unrelated to this PR, but maybe this is a nice opportunity to turn this & co. friend APIs needed by this PR to "under development" ones.

This comment has been minimized.

@lkishalmi

lkishalmi Jan 12, 2019

Author Contributor

That would be nice.

gradle.java,\
gradle.persistence,\
gradle.spring,\
gradle.test,\

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

groovy cluster seems like a good fit.

gradle.java,\
gradle.persistence,\
gradle.spring,\
gradle.test,\
groovy.antproject,\
groovy.editor,\
groovy.gsp,\

This comment has been minimized.

@JaroslavTulach

JaroslavTulach Jan 10, 2019

Contributor

Also change the javadoc config and make sure ant build-javadoc includes the new modules with APIs.

This comment has been minimized.

@lkishalmi

lkishalmi Jan 12, 2019

Author Contributor

Ok. Found how to do it. It will be added.

@mcdonnell-john

This comment has been minimized.

Copy link
Contributor

mcdonnell-john commented Jan 13, 2019

Checked out the branch and built locally.

When attempting to open a gradle based project I got the following error:

java.lang.ClassNotFoundException: org.netbeans.modules.gradle.api.NbProjectInfo
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at org.netbeans.ProxyClassLoader.loadClass(ProxyClassLoader.java:197)
Caused: java.lang.ClassNotFoundException: org.netbeans.modules.gradle.api.NbProjectInfo starting from ModuleCL@1d55d5ed[org.netbeans.modules.gradle] with possible defining loaders [ModuleCL@1d55d5ed[org.netbeans.modules.gradle]] and declared parents [ModuleCL@4f953edd[org.netbeans.api.java.classpath], ModuleCL@2977b2ba[org.openide.explorer], ModuleCL@45092aea[org.netbeans.modules.java.platform], ModuleCL@7a98463b[org.netbeans.modules.extexecution], org.netbeans.JarClassLoader@1930bb4b, ModuleCL@28c0d7cd[org.netbeans.libs.json_simple], ModuleCL@43d60107[org.netbeans.api.progress], ModuleCL@f11d8ce[org.openide.windows], ModuleCL@a52efd7[org.netbeans.modules.editor.mimelookup], ModuleCL@12db9df[org.netbeans.modules.editor], ...22 more]
	at org.netbeans.ProxyClassLoader.loadClass(ProxyClassLoader.java:199)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Caused: java.lang.NoClassDefFoundError: org/netbeans/modules/gradle/api/NbProjectInfo
	at org.netbeans.modules.gradle.NbGradleProjectImpl.loadProject(NbGradleProjectImpl.java:252)
	at org.netbeans.modules.gradle.NbGradleProjectImpl.loadProject(NbGradleProjectImpl.java:248)
	at org.netbeans.modules.gradle.NbGradleProjectImpl.getGradleProject(NbGradleProjectImpl.java:178)
	at org.netbeans.modules.gradle.api.NbGradleProject.projectLookup(NbGradleProject.java:173)
	at org.netbeans.modules.gradle.api.GradleBaseProject.get(GradleBaseProject.java:265)
	at org.netbeans.modules.gradle.NbGradleProjectImpl$PluginDependentLookup.check(NbGradleProjectImpl.java:352)
	at org.netbeans.modules.gradle.NbGradleProjectImpl$PluginDependentLookup.<init>(NbGradleProjectImpl.java:343)
	at org.netbeans.modules.gradle.NbGradleProjectImpl.<init>(NbGradleProjectImpl.java:143)
	at org.netbeans.modules.gradle.NbGradleProjectFactory.loadProject(NbGradleProjectFactory.java:65)
	at org.netbeans.modules.projectapi.nb.NbProjectManager.createProject(NbProjectManager.java:376)
	at org.netbeans.modules.projectapi.nb.NbProjectManager.access$300(NbProjectManager.java:69)
	at org.netbeans.modules.projectapi.nb.NbProjectManager$2.run(NbProjectManager.java:289)
	at org.netbeans.modules.projectapi.nb.NbProjectManager$2.run(NbProjectManager.java:218)
	at org.netbeans.modules.openide.util.DefaultMutexImplementation.readAccess(DefaultMutexImplementation.java:188)
	at org.openide.util.Mutex.readAccess(Mutex.java:225)
	at org.netbeans.modules.projectapi.nb.NbProjectManager.findProject(NbProjectManager.java:218)
	at org.netbeans.api.project.ProjectManager.findProject(ProjectManager.java:142)
	at org.netbeans.modules.project.ui.OpenProjectList.fileToProject(OpenProjectList.java:1209)
	at org.netbeans.modules.project.ui.ProjectChooserAccessory.getProject(ProjectChooserAccessory.java:327)
	at org.netbeans.modules.project.ui.ProjectChooserAccessory.access$000(ProjectChooserAccessory.java:64)
	at org.netbeans.modules.project.ui.ProjectChooserAccessory$1.run(ProjectChooserAccessory.java:216)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1418)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:278)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2033)
Caused: org.openide.util.RequestProcessor$SlowItem: task failed due to
	at org.openide.util.RequestProcessor.post(RequestProcessor.java:424)
	at org.netbeans.modules.project.ui.ProjectChooserAccessory.propertyChange(ProjectChooserAccessory.java:204)
	at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
	at java.awt.Component.firePropertyChange(Component.java:8434)
	at javax.swing.JFileChooser.setSelectedFiles(JFileChooser.java:541)
	at org.netbeans.swing.dirchooser.DirectoryChooserUI.setSelected(DirectoryChooserUI.java:1676)
	at org.netbeans.swing.dirchooser.DirectoryChooserUI.access$2500(DirectoryChooserUI.java:87)
	at org.netbeans.swing.dirchooser.DirectoryChooserUI$DirectoryHandler.valueChanged(DirectoryChooserUI.java:2231)
	at javax.swing.JTree.fireValueChanged(JTree.java:2934)
	at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3398)
	at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:635)
	at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1093)
	at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:294)
	at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:188)
	at javax.swing.JTree.setSelectionPath(JTree.java:1641)
	at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2393)
	at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3609)
	at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3548)
	at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:279)
	at java.awt.Component.processMouseEvent(Component.java:6536)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at org.netbeans.swing.dirchooser.DirectoryChooserUI$8.processMouseEvent(DirectoryChooserUI.java:703)
	at java.awt.Component.processEvent(Component.java:6304)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4532)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)
	at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190)
	at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235)
	at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233)
	at java.awt.Dialog.show(Dialog.java:1084)
	at javax.swing.JFileChooser.showDialog(JFileChooser.java:758)
	at javax.swing.JFileChooser.showOpenDialog(JFileChooser.java:656)
	at org.netbeans.modules.project.ui.actions.OpenProject.show(OpenProject.java:105)
	at org.netbeans.modules.project.ui.actions.OpenProject.actionPerformed(OpenProject.java:78)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:842)
	at com.apple.laf.AquaMenuItemUI.doClick(AquaMenuItemUI.java:157)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:886)
	at java.awt.Component.processMouseEvent(Component.java:6539)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6304)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
[catch] at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
<zip compress="9" basedir="templates/multi-project" zipfile="${templates.dir}/multi-project.zip"/>
</target>

<target name="clean" depends="projectized.clean">

This comment has been minimized.

@jlahoda

jlahoda Jan 13, 2019

Contributor

So, I wonder if the tooling build could all happen under the build directory? That would simplify cleaning, would allow to remove some ignores, etc.

For nb.org modules (which is this case), there's an enhancement to the standard "release" directory mechanism: if there's a property in nbproject/project.properties in the form:
release.=
then it is as if it was under the release directory. (But IIRC there may be some problem that the file may need to be available very soon after the module's build start - not sure if "compile" will be OK, if not I'd try build-init.)

@lkishalmi lkishalmi force-pushed the lkishalmi:gradle-support branch from fe154a1 to 3128a2d Jan 14, 2019

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 14, 2019

As of now, I'm fighting with ergonomics. If I open the IDE with a clean userdir and enable only the groovy cluster, I got a bunch of modules enabled, almost all my Gradle ones, but the main gradle module is actually not loading. I can open the Tools > Options > Java > Gradle tab opened, but have no content there. If I'd try to open a project in that state I get a flood of:

WARNING [org.netbeans.modules.projectapi.nb.NbProjectManager]: An attempt to call notifyDeleted more than once. Project: /home/lkishalmi/NetBeansProjects/Darcula@bb39e886:2a121f0c

@lkishalmi lkishalmi force-pushed the lkishalmi:gradle-support branch from 9748cf9 to b0e86a1 Jan 16, 2019

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 16, 2019

@JaroslavTulach please help with ergonomics. There might be a bug there, or my modules are set up wrong (e.g. none of them has Display Category: Groovy, or something else).

FYI: I had similar symptoms on nb-darcula (plugin/my branch as I try to help Hamit), I could only enable that module when I've disabled the ergonomics.

@lkishalmi lkishalmi force-pushed the lkishalmi:gradle-support branch from b0e86a1 to d31bd4c Jan 20, 2019

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 20, 2019

Managed to get the required modules to load by adding them to the Groovy kit. Also renamed Groovy feature to Groovy & Gradle. If the automated build says Ok, I'm going to squash and merge this one to master.

@JaroslavTulach

This comment has been minimized.

Copy link
Contributor

JaroslavTulach commented Jan 20, 2019

Kit modules get special treatment in ergonomics. You are on right track.

@geertjanw

This comment has been minimized.

Copy link
Member

geertjanw commented Jan 20, 2019

I would recommend to keep the name at Groovy, because otherwise when we re-add support for Grails, we’ll need to call it ‘Groovy, Gradle, and Grails’. And anyway both Gradle and Grails derive from Groovy, so keeping the name Groovy makes sense.

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 20, 2019

I try to create a Separate feature for Gradle, that would be the best. I still have some fears messing with the ergonomics module.
FYI: Gradle modules are actually independent from the Groovy stuff, all it uses from there is the Groovy editor for gradle files, and that comes through the Layer files. So Groovy could be an Optional Dependency to the Gradle feature.

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 21, 2019

Finally moved Gradle as a separate Feature, which means a separate cluster.

@lkishalmi lkishalmi force-pushed the lkishalmi:gradle-support branch from 4f8e250 to 0d4171f Jan 21, 2019

@geertjanw

This comment has been minimized.

Copy link
Member

geertjanw commented Jan 21, 2019

Personally, if we can avoid it, I'd prefer not creating new clusters, unless we really need to. What is your opinion on this @JaroslavTulach and @jlahoda?

@JaroslavTulach

This comment has been minimized.

Copy link
Contributor

JaroslavTulach commented Jan 21, 2019

More kit modules is OK. More clusters isn't. I liked when the support ended up in groovy cluster.

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 21, 2019

No problem. I'm reverting my changes on the cluster.

lkishalmi added some commits Nov 30, 2018

Finished the major code rework of the execution dialog.
It is based on the GradleCommandLine class.
Fixed SLF4J Checksums.
gradle-tooling-api has now moved back to use OSUOSL
Added version number and license for gradle-wrapper download, to be a…
…ligned with the NetBeans checks, though gradle-wrapper usually has no version.

@lkishalmi lkishalmi force-pushed the lkishalmi:gradle-support branch from 0d4171f to 6c9b873 Jan 22, 2019

Rename GradleVersion -> NbGradleVersion to
be less confusing when using Gradle's GradleVersion

@lkishalmi lkishalmi force-pushed the lkishalmi:gradle-support branch from 6c9b873 to 1916d75 Jan 22, 2019

@lkishalmi

This comment has been minimized.

Copy link
Contributor Author

lkishalmi commented Jan 22, 2019

Cluster is Groovy again, Gradle modules are hiding behind the kit. So far the ergonomics seems to work as well. Made Gradle and Gradle Java Project auto load, they have API-s. Unittest, Persistence and Spring support modules are Eager.
I hope even Travis will like it finally.
Otherwise please review while I am sleeping...

@geertjanw

This comment has been minimized.

Copy link
Member

geertjanw commented Jan 22, 2019

I like it. I think also that NetCAT needs to be updated to include Gradle.

@lkishalmi lkishalmi merged commit bda613c into apache:master Jan 22, 2019

1 check passed

continuous-integration/travis-ci/pr The Travis CI build passed
Details
@breskeby

This comment has been minimized.

Copy link

breskeby commented Jan 22, 2019

awesome work guys. will try it out soonish

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.