From d61bf18fa2b7703783ae5315f431afaf5c1d2876 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 20 Sep 2016 18:12:17 +0200 Subject: [PATCH] Generate .gitignore This commit improves the generator so that a `.gitignore` is added to every project. The basic content of that file is determined by the build system. If an agent is recognized, specific build tool settings are added as well. This commit adds support for STS, IntelliJ IDEA and NetBeans. Closes gh-131 --- .../generator/ProjectGenerator.groovy | 26 ++++++ .../main/resources/templates/gitignore.tmpl | 23 +++++ .../ProjectGeneratorGitIgnoreTests.groovy | 84 +++++++++++++++++++ .../project/gradle/gitignore-httpie.gen | 3 + .../project/gradle/gitignore-intellijidea.gen | 9 ++ .../project/gradle/gitignore-netbeans.gen | 11 +++ .../project/gradle/gitignore-none.gen | 3 + .../project/gradle/gitignore-sts.gen | 8 ++ .../project/maven/gitignore-httpie.gen | 2 + .../project/maven/gitignore-intellijidea.gen | 8 ++ .../project/maven/gitignore-netbeans.gen | 10 +++ .../project/maven/gitignore-none.gen | 2 + .../resources/project/maven/gitignore-sts.gen | 7 ++ .../web/project/MainController.groovy | 4 +- .../MainControllerIntegrationTests.groovy | 8 +- 15 files changed, 204 insertions(+), 4 deletions(-) create mode 100644 initializr-generator/src/main/resources/templates/gitignore.tmpl create mode 100644 initializr-generator/src/test/groovy/io/spring/initializr/generator/ProjectGeneratorGitIgnoreTests.groovy create mode 100644 initializr-generator/src/test/resources/project/gradle/gitignore-httpie.gen create mode 100644 initializr-generator/src/test/resources/project/gradle/gitignore-intellijidea.gen create mode 100644 initializr-generator/src/test/resources/project/gradle/gitignore-netbeans.gen create mode 100644 initializr-generator/src/test/resources/project/gradle/gitignore-none.gen create mode 100644 initializr-generator/src/test/resources/project/gradle/gitignore-sts.gen create mode 100644 initializr-generator/src/test/resources/project/maven/gitignore-httpie.gen create mode 100644 initializr-generator/src/test/resources/project/maven/gitignore-intellijidea.gen create mode 100644 initializr-generator/src/test/resources/project/maven/gitignore-netbeans.gen create mode 100644 initializr-generator/src/test/resources/project/maven/gitignore-none.gen create mode 100644 initializr-generator/src/test/resources/project/maven/gitignore-sts.gen diff --git a/initializr-generator/src/main/groovy/io/spring/initializr/generator/ProjectGenerator.groovy b/initializr-generator/src/main/groovy/io/spring/initializr/generator/ProjectGenerator.groovy index 97bdb0e3..9e39e012 100644 --- a/initializr-generator/src/main/groovy/io/spring/initializr/generator/ProjectGenerator.groovy +++ b/initializr-generator/src/main/groovy/io/spring/initializr/generator/ProjectGenerator.groovy @@ -20,6 +20,7 @@ import groovy.util.logging.Slf4j import io.spring.initializr.InitializrException import io.spring.initializr.metadata.Dependency import io.spring.initializr.metadata.InitializrMetadataProvider +import io.spring.initializr.util.Agent import io.spring.initializr.util.GroovyTemplate import io.spring.initializr.util.Version @@ -140,6 +141,8 @@ class ProjectGenerator { writeMavenWrapper(dir) } + generateGitIgnore(dir, request) + def applicationName = request.applicationName def language = request.language @@ -210,6 +213,19 @@ class ProjectGenerator { eventPublisher.publishEvent(event) } + /** + * Generate a {@code .gitignore} file for the specified {@link ProjectRequest} + * @param dir the root directory of the project + * @param request the request to handle + */ + protected void generateGitIgnore(File dir, ProjectRequest request) { + def model = [:] + def agent = extractAgent(request) + model['agent'] = agent ? agent.id.id : null + model['build'] = isGradleBuild(request) ? 'gradle' : 'maven' + write(new File(dir, '.gitignore'), 'gitignore.tmpl', model) + } + /** * Resolve the specified {@link ProjectRequest} and return the model to use * to generate the project @@ -305,6 +321,16 @@ class ProjectGenerator { "import $type$end" } + private static Agent extractAgent(ProjectRequest request) { + if (request.parameters['user-agent']) { + Agent agent = Agent.fromUserAgent(request.parameters['user-agent']) + if (agent) { + return agent + } + } + null + } + private static isGradleBuild(ProjectRequest request) { return 'gradle'.equals(request.build) } diff --git a/initializr-generator/src/main/resources/templates/gitignore.tmpl b/initializr-generator/src/main/resources/templates/gitignore.tmpl new file mode 100644 index 00000000..fcd85aeb --- /dev/null +++ b/initializr-generator/src/main/resources/templates/gitignore.tmpl @@ -0,0 +1,23 @@ +<% if (build=='maven') { %>target/ +!.mvn/wrapper/maven-wrapper.jar<% } else { %>.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar<% } %><% if ('sts'==agent) { %> + +### STS ### +.classpath +.project +.settings<% } %><% if ('intellijidea'==agent) { %> + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr<% } %><% if ('netbeans'==agent) { %> + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/<% } %> \ No newline at end of file diff --git a/initializr-generator/src/test/groovy/io/spring/initializr/generator/ProjectGeneratorGitIgnoreTests.groovy b/initializr-generator/src/test/groovy/io/spring/initializr/generator/ProjectGeneratorGitIgnoreTests.groovy new file mode 100644 index 00000000..06e47994 --- /dev/null +++ b/initializr-generator/src/test/groovy/io/spring/initializr/generator/ProjectGeneratorGitIgnoreTests.groovy @@ -0,0 +1,84 @@ +/* + * Copyright 2012-2016 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 + * + * 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. + */ + +package io.spring.initializr.generator + +import io.spring.initializr.util.Agent +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized + +import org.springframework.core.io.ClassPathResource +import org.springframework.core.io.Resource + +/** + * Project generator tests for {@code .gitignore}. + * + * @author Stephane Nicoll + */ +@RunWith(Parameterized.class) +class ProjectGeneratorGitIgnoreTests extends AbstractProjectGeneratorTests { + + @Parameterized.Parameters(name = "{0}") + static Object[] parameters() { + def list = [] + list << 'STS 3.7.2' + list << 'IntelliJ IDEA' + list << 'nb-springboot-plugin/0.1' + list << 'HTTPie/0.8.0' + list << 'Googlebot-Mobile' + list + } + + private final String userAgent + private final Agent agent + + ProjectGeneratorGitIgnoreTests(String userAgent) { + this.userAgent = userAgent + this.agent = Agent.fromUserAgent(userAgent) + } + + @Test + void gitIgnoreMaven() { + def request = createProjectRequest() + request.type = 'maven-project' + def project = generateProject(request) + project.sourceCodeAssert(".gitignore") + .equalsTo(getResourceFor('maven')) + } + + @Test + void gitIgnoreGradle() { + def request = createProjectRequest() + request.type = 'gradle-project' + def project = generateProject(request) + project.sourceCodeAssert(".gitignore") + .equalsTo(getResourceFor('gradle')) + } + + private Resource getResourceFor(String build) { + String id = agent ? agent.id.id : 'none' + return new ClassPathResource("project/$build/gitignore-${id}.gen") + } + + @Override + ProjectRequest createProjectRequest(String... styles) { + def request = super.createProjectRequest(styles) + request.parameters['user-agent'] = this.userAgent + request + } + +} diff --git a/initializr-generator/src/test/resources/project/gradle/gitignore-httpie.gen b/initializr-generator/src/test/resources/project/gradle/gitignore-httpie.gen new file mode 100644 index 00000000..e7178c38 --- /dev/null +++ b/initializr-generator/src/test/resources/project/gradle/gitignore-httpie.gen @@ -0,0 +1,3 @@ +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/gradle/gitignore-intellijidea.gen b/initializr-generator/src/test/resources/project/gradle/gitignore-intellijidea.gen new file mode 100644 index 00000000..c2ca0368 --- /dev/null +++ b/initializr-generator/src/test/resources/project/gradle/gitignore-intellijidea.gen @@ -0,0 +1,9 @@ +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/gradle/gitignore-netbeans.gen b/initializr-generator/src/test/resources/project/gradle/gitignore-netbeans.gen new file mode 100644 index 00000000..48dd75ce --- /dev/null +++ b/initializr-generator/src/test/resources/project/gradle/gitignore-netbeans.gen @@ -0,0 +1,11 @@ +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/gradle/gitignore-none.gen b/initializr-generator/src/test/resources/project/gradle/gitignore-none.gen new file mode 100644 index 00000000..e7178c38 --- /dev/null +++ b/initializr-generator/src/test/resources/project/gradle/gitignore-none.gen @@ -0,0 +1,3 @@ +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/gradle/gitignore-sts.gen b/initializr-generator/src/test/resources/project/gradle/gitignore-sts.gen new file mode 100644 index 00000000..39ed21c7 --- /dev/null +++ b/initializr-generator/src/test/resources/project/gradle/gitignore-sts.gen @@ -0,0 +1,8 @@ +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +### STS ### +.classpath +.project +.settings \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/maven/gitignore-httpie.gen b/initializr-generator/src/test/resources/project/maven/gitignore-httpie.gen new file mode 100644 index 00000000..fd839db8 --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/gitignore-httpie.gen @@ -0,0 +1,2 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/maven/gitignore-intellijidea.gen b/initializr-generator/src/test/resources/project/maven/gitignore-intellijidea.gen new file mode 100644 index 00000000..0264cb93 --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/gitignore-intellijidea.gen @@ -0,0 +1,8 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/maven/gitignore-netbeans.gen b/initializr-generator/src/test/resources/project/maven/gitignore-netbeans.gen new file mode 100644 index 00000000..0c3c59cb --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/gitignore-netbeans.gen @@ -0,0 +1,10 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/maven/gitignore-none.gen b/initializr-generator/src/test/resources/project/maven/gitignore-none.gen new file mode 100644 index 00000000..fd839db8 --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/gitignore-none.gen @@ -0,0 +1,2 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/maven/gitignore-sts.gen b/initializr-generator/src/test/resources/project/maven/gitignore-sts.gen new file mode 100644 index 00000000..d54f91d2 --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/gitignore-sts.gen @@ -0,0 +1,7 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.classpath +.project +.settings \ No newline at end of file diff --git a/initializr-web/src/main/groovy/io/spring/initializr/web/project/MainController.groovy b/initializr-web/src/main/groovy/io/spring/initializr/web/project/MainController.groovy index c36283ec..c7767843 100644 --- a/initializr-web/src/main/groovy/io/spring/initializr/web/project/MainController.groovy +++ b/initializr-web/src/main/groovy/io/spring/initializr/web/project/MainController.groovy @@ -221,7 +221,7 @@ class MainController extends AbstractInitializrController { new AntBuilder().zip(destfile: download) { zipfileset(dir: dir, includes: wrapperScript, filemode: 755) - zipfileset(dir: dir, includes: '**', excludes: wrapperScript) + zipfileset(dir: dir, includes: '**,', excludes: wrapperScript, defaultexcludes: 'no') } upload(download, dir, generateFileName(request, 'zip'), 'application/zip') } @@ -238,7 +238,7 @@ class MainController extends AbstractInitializrController { new AntBuilder().tar(destfile: download, compression: 'gzip') { zipfileset(dir: dir, includes: wrapperScript, filemode: 755) - zipfileset(dir: dir, includes: '**', excludes: wrapperScript) + zipfileset(dir: dir, includes: '**', excludes: wrapperScript, defaultexcludes: 'no') } upload(download, dir, generateFileName(request, 'tgz'), 'application/x-compress') } diff --git a/initializr-web/src/test/groovy/io/spring/initializr/web/project/MainControllerIntegrationTests.groovy b/initializr-web/src/test/groovy/io/spring/initializr/web/project/MainControllerIntegrationTests.groovy index 7f63b9c4..fe9c403d 100644 --- a/initializr-web/src/test/groovy/io/spring/initializr/web/project/MainControllerIntegrationTests.groovy +++ b/initializr-web/src/test/groovy/io/spring/initializr/web/project/MainControllerIntegrationTests.groovy @@ -51,7 +51,9 @@ class MainControllerIntegrationTests extends AbstractInitializrControllerIntegra @Test void simpleZipProject() { - downloadZip('/starter.zip?style=web&style=jpa').isJavaProject().isMavenProject() + downloadZip('/starter.zip?style=web&style=jpa').isJavaProject() + .hasFile('.gitignore') + .isMavenProject() .hasStaticAndTemplatesResources(true).pomAssert() .hasDependenciesCount(3) .hasSpringBootStarterDependency('web') @@ -61,7 +63,9 @@ class MainControllerIntegrationTests extends AbstractInitializrControllerIntegra @Test void simpleTgzProject() { - downloadTgz('/starter.tgz?style=org.acme:foo').isJavaProject().isMavenProject() + downloadTgz('/starter.tgz?style=org.acme:foo').isJavaProject() + .hasFile('.gitignore') + .isMavenProject() .hasStaticAndTemplatesResources(false).pomAssert() .hasDependenciesCount(2) .hasDependency('org.acme', 'foo', '1.3.5')