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

Make directories that will be included in check, configurable #9

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## 1.1.0
- Made directories that will be checked under pom (child) projects configurable. It is possible to use * to include all directories. Default if not set, is `src` directory as before. See [README.md](README.md)
```xml
<includeTopDirectories>*</includeTopDirectories>
- Also made it possible to exclude directories. * can not be used. Default if not set, nothing will be excluded.
```xml
<excludeTopDirectories>target,node_modules</excludeTopDirectories>
- Fix so that `ignoreChangesInFiles` can contain more than one file (comma separated).

## 1.0.0
- Initial version
30 changes: 25 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ A maven plugin that turbo charges your Maven build by only building the projects
## Usage
The plugin has the following parameters:

|parameter name| description |default value|
|------------------------------------------------------------------------------------------------------------------------------|------------|-------------|
| enabled | Enables of disables the plugin. | true |
| alwaysBuildModules | Always build the specified modules. Comma separated. Checked only by doing a contains of the file name in this string | empty string |
| ignoreChangesInFiles | Skips build even these files have changed. Comma separated. Checked only by doing a contains of the file name in this string | empty string |
|parameter name| description | default value |
|------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|
| enabled | Enables of disables the plugin. | true |
| alwaysBuildModules | Always build the specified modules. Comma separated. Checked only by doing a contains of the file name in this string | empty string |
| ignoreChangesInFiles | Skips build even these files have changed. Comma separated. | empty string |
| includeTopDirectories | Specify which top directories under pom (child) project that will be included in check. Use * to include all. Comma separated. If not used, only src directory will be included | src |
| excludeTopDirectories | Specify which top directories under pom (child) project that will be excluded in check. Comma separated. If not used, nothing explicit will be excluded | empty string |

### Command line parameters
The parameters can be set on the command line. They will have precedence over the parameters in the plugin configuration.
Expand All @@ -38,6 +40,24 @@ mvn clean install -Dturbo.enabled=false
</configuration>
</plugin>
```

### Example of more advanced plugin configuration:
```
<plugin>
<groupId>no.sparebank1</groupId>
<artifactId>turbo-maven-plugin</artifactId>
<version>${maven-turbo-plugin.version}</version>
<extensions>true</extensions>
<configuration>
<enabled>true</enabled>
<ignoreChangesInFiles>swagger.json,.versionsBackup,.jar</ignoreChangesInFiles>
<alwaysBuildModules>distribution</alwaysBuildModules>
<includeTopDirectories>*</includeTopDirectories>
<excludeTopDirectories>target,node_modules</excludeTopDirectories>
</configuration>
</plugin>
```

You typically add the plugin to the plugins section of your root pom.

#### Building with the plugin enabled
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<groupId>no.sparebank1</groupId>
<artifactId>turbo-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<version>1.0.0</version>
<version>1.1.0-SNAPSHOT</version>

<name>turbo-maven-plugin Maven Mojo</name>
<description>
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/no/sparebank1/turbo/ProjectsAnalyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ public ProjectsAnalyzer(ArtifactAnalyzer artifactAnalyzer, SourceFileFinder sour
this.sourceFileFinder = sourceFileFinder;
}

public List<MavenProject> calculateProjectsToBuild(final String m2Repository, final List<MavenProject> projects, final ProjectDependencyGraph projectDependencyGraph, final String ignoreChangesInFiles, final String alwaysBuildModules) {
public List<MavenProject> calculateProjectsToBuild(final String m2Repository, final List<MavenProject> projects, final ProjectDependencyGraph projectDependencyGraph, final String ignoreChangesInFiles, final String alwaysBuildModules, final String includeTopDirectories, final String excludeTopDirectories) {

//Get the projects that require a new build:
List<MavenProject> projectsToBuild = projects.stream()
.filter(project -> shallBuildProject(m2Repository, project, ignoreChangesInFiles, alwaysBuildModules))
.filter(project -> shallBuildProject(m2Repository, project, ignoreChangesInFiles, alwaysBuildModules, includeTopDirectories, excludeTopDirectories))
.distinct()
.collect(Collectors.toList());

Expand All @@ -36,8 +36,8 @@ public List<MavenProject> calculateProjectsToBuild(final String m2Repository, fi
.collect(Collectors.toList());
}

protected boolean shallBuildProject(final String m2Repository, final MavenProject project, final String ignoreChangesInFiles, final String alwaysBuildModules) {
List<String> sourceFiles = sourceFileFinder.getSourceFiles(project.getBasedir().getAbsolutePath(), ignoreChangesInFiles);
protected boolean shallBuildProject(final String m2Repository, final MavenProject project, final String ignoreChangesInFiles, final String alwaysBuildModules, final String includeTopDirectories, final String excludeTopDirectories) {
List<String> sourceFiles = sourceFileFinder.getSourceFiles(project.getBasedir().getAbsolutePath(), project.getModules(), ignoreChangesInFiles, includeTopDirectories, excludeTopDirectories);
return artifactAnalyzer.shallBuild(m2Repository, sourceFiles, project.getGroupId(), project.getArtifactId(), project.getVersion(), project.getPackaging(), alwaysBuildModules);
}
}
40 changes: 34 additions & 6 deletions src/main/java/no/sparebank1/turbo/SourceFileFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,45 @@

public class SourceFileFinder {

public List<String> getSourceFiles(final String projectRoot, final String ignoreChangesInFiles) {
public List<String> getSourceFiles(final String projectRoot, final List<String> mvnChildModules, final String ignoreChangesInFiles, final String includeTopDirectories, final String excludeTopDirectories) {
List<String> sourceFiles = new ArrayList<>();
List<String> ignoreFiles = Arrays.asList(ignoreChangesInFiles.split("\\s*,\\s*")); // Split string on comma, ignore spaces
List<String> includeTopDirs = Arrays.asList(includeTopDirectories.split("\\s*,\\s*"));
List<String> excludeTopDirs = Arrays.asList(excludeTopDirectories.split("\\s*,\\s*"));

//Add all files in projectRoot:
List<String> filesInProjectRoot = findFilesInDir(projectRoot);
sourceFiles.addAll(filesInProjectRoot);
//Add all files in src recursively:
List<String> filesInSrc = findFilesInDirRecursively(projectRoot + "/src");
sourceFiles.addAll(filesInSrc);

//Find all top directories under pom (child) project:
List<String> directoriesInDir = findDirectoriesInDir(projectRoot);
directoriesInDir.stream()
// Include directory if in includedTopDirs or if set to asterix or empty
.filter(dir -> includeTopDirs.contains(dir) || includeTopDirs.contains("*"))
.filter(dir -> !excludeTopDirs.contains(dir)) // Exclude if in excludeTopDirs
.filter(dir -> !mvnChildModules.contains(dir)) // Exclude mvn child modules. I.e. only evaluate current module
// Exclude if directory starts with "."
.filter(dir -> !dir.startsWith("."))
.forEach((dir) -> {
//Add all files in dir recursively
List<String> filesInSrc = findFilesInDirRecursively(projectRoot + "/" + dir);
sourceFiles.addAll(filesInSrc);
});

//Remove files that are configured not to be included:
List<String> prunedSourcefiles = pruneSourefiles(sourceFiles, ignoreChangesInFiles);
List<String> prunedSourcefiles = pruneSourefiles(sourceFiles, ignoreFiles);

return prunedSourcefiles;
}

List<String> pruneSourefiles(final List<String> sourcefiles, final String ignoreChangesInFiles) {
List<String> pruneSourefiles(final List<String> sourcefiles, final List<String> ignoreFiles) {
List<String> prunedSourcefiles = new ArrayList<>(sourcefiles);
sourcefiles.forEach(sourcefile -> {
if (sourcefile.contains("swagger.json") ||
sourcefile.contains(".iml") ||
sourcefile.contains("editorconfig") ||
ignoreFiles.stream()
.anyMatch(ignoreFile -> !ignoreFile.equals("") && sourcefile.endsWith(ignoreFile)) ||
sourcefile.contains("docker-image-id")) {
prunedSourcefiles.remove(sourcefile);
}
Expand All @@ -44,6 +63,15 @@ List<String> findFilesInDir(final String dir) {
collect(Collectors.toList());
}

List<String> findDirectoriesInDir(final String dir) {
File dirFile = new File(dir);
List<File> list = Arrays.asList(dirFile.listFiles());
return list.stream()
.filter(file -> file.isDirectory())
.map(file -> file.getName())
.collect(Collectors.toList());
}

List<String> findFilesInDirRecursively(final String dir) {
File file = new File(dir);
File[] filesInDir = file.listFiles();
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/no/sparebank1/turbo/TurboConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.inject.Inject;

import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;

Expand All @@ -21,6 +18,8 @@ public class TurboConfig {

public final boolean enabled;
public final String ignoreChangesInFiles;
public final String includeTopDirectories;
public final String excludeTopDirectories;

public final String alwaysBuildModules;
public final String m2Repository;
Expand All @@ -31,6 +30,8 @@ public TurboConfig(MavenSession session) {
String configAsXml = plugin.getConfiguration() != null ? plugin.getConfiguration().toString() : "";
ignoreChangesInFiles = getParameter(configAsXml, "ignoreChangesInFiles", "");
alwaysBuildModules = getParameter(configAsXml, "alwaysBuildModules", "");
includeTopDirectories = getParameter(configAsXml, "includeTopDirectories", "src");
excludeTopDirectories = getParameter(configAsXml, "excludeTopDirectories", "");

m2Repository = session.getLocalRepository().getBasedir();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public void afterProjectsRead(MavenSession session) throws MavenExecutionExcepti

List<MavenProject> projects = session.getProjects();

List<MavenProject> projectsToBuild = projectsAnalyzer.calculateProjectsToBuild(config.m2Repository, projects, session.getProjectDependencyGraph(), config.ignoreChangesInFiles, config.alwaysBuildModules);
List<MavenProject> projectsToBuild = projectsAnalyzer.calculateProjectsToBuild(config.m2Repository, projects, session.getProjectDependencyGraph(), config.ignoreChangesInFiles, config.alwaysBuildModules, config.includeTopDirectories, config.excludeTopDirectories);

session.setProjects(projectsToBuild);

Expand Down Expand Up @@ -92,7 +92,7 @@ public void afterSessionEnd(MavenSession session) throws MavenExecutionException
projects.forEach(project -> {
//Write the checksums when we have a successful build:
if(session.getResult().getBuildSummary(project).toString().toLowerCase().contains("success")) {
List<String> sourceFiles = new SourceFileFinder().getSourceFiles(project.getBasedir().getAbsolutePath(), config.ignoreChangesInFiles);
List<String> sourceFiles = new SourceFileFinder().getSourceFiles(project.getBasedir().getAbsolutePath(), project.getModules(), config.ignoreChangesInFiles, config.includeTopDirectories, config.excludeTopDirectories);
new Checksums().createAndWriteChecksums(config.m2Repository, sourceFiles, project.getGroupId(), project.getArtifactId(), project.getVersion());
}
});
Expand Down
8 changes: 4 additions & 4 deletions src/test/java/no/sparebank1/turbo/ProjectsAnalyzerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class ProjectsAnalyzerTest {
@Test
public void project_D_shall_have_A_B_C_as_downstream_dependencies() {

List<MavenProject> projectsToBuild = projectAnalyzer.calculateProjectsToBuild("", getProjects(), projectDependencyGraph, "", "D");
List<MavenProject> projectsToBuild = projectAnalyzer.calculateProjectsToBuild("", getProjects(), projectDependencyGraph, "", "D", "src", "");
assertEquals(4, projectsToBuild.size());
assertTrue(projectsToBuild.contains(getMavenProjectWithArtifactId("A")) &&
projectsToBuild.contains(getMavenProjectWithArtifactId("B")) &&
Expand All @@ -37,23 +37,23 @@ public void project_D_shall_have_A_B_C_as_downstream_dependencies() {

@Test
public void project_C_shall_have_A_as_downstream_dependency() {
List<MavenProject> projectsToBuild = projectAnalyzer.calculateProjectsToBuild("", getProjects(), projectDependencyGraph, "", "C");
List<MavenProject> projectsToBuild = projectAnalyzer.calculateProjectsToBuild("", getProjects(), projectDependencyGraph, "", "C", "src", "");
assertEquals(2, projectsToBuild.size());
assertTrue(projectsToBuild.contains(getMavenProjectWithArtifactId("A")) &&
projectsToBuild.contains(getMavenProjectWithArtifactId("C")));
}

@Test
public void project_B_shall_have_A_as_downstream_dependency() {
List<MavenProject> projectsToBuild = projectAnalyzer.calculateProjectsToBuild("", getProjects(), projectDependencyGraph, "", "B");
List<MavenProject> projectsToBuild = projectAnalyzer.calculateProjectsToBuild("", getProjects(), projectDependencyGraph, "", "B", "src", "");
assertEquals(2, projectsToBuild.size());
assertTrue(projectsToBuild.contains(getMavenProjectWithArtifactId("A")) &&
projectsToBuild.contains(getMavenProjectWithArtifactId("B")));
}

@Test
public void project_A_shall_have_no_downstream_dependencies() {
List<MavenProject> projectsToBuild = projectAnalyzer.calculateProjectsToBuild("", getProjects(), projectDependencyGraph, "", "A");
List<MavenProject> projectsToBuild = projectAnalyzer.calculateProjectsToBuild("", getProjects(), projectDependencyGraph, "", "A", "src", "");
assertEquals(1, projectsToBuild.size());
assertTrue(projectsToBuild.contains(getMavenProjectWithArtifactId("A")));
}
Expand Down
5 changes: 3 additions & 2 deletions src/test/java/no/sparebank1/turbo/SourceFileFinderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.Test;
Expand All @@ -11,7 +12,7 @@ class SourceFileFinderTest {
@Test
public void shall_find_all_files_in_subdirectories() {
String path = new File(".").getAbsolutePath() + "/src/test/foo";
List<String> sourcefiles = new SourceFileFinder().getSourceFiles(path, "");
List<String> sourcefiles = new SourceFileFinder().getSourceFiles(path, new ArrayList<String>(), ".jar", "", "");
assertTrue(true);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public ProjectsAnalyzerStub(ArtifactAnalyzer artifactAnalyzer, SourceFileFinder
}

@Override
protected boolean shallBuildProject(final String m2Repository, final MavenProject project, final String ignoreChangesInFiles, final String alwaysBuildModules) {
protected boolean shallBuildProject(final String m2Repository, final MavenProject project, final String ignoreChangesInFiles, final String alwaysBuildModules, final String includeTopDirectories, final String excludeTopDirectories) {
if (alwaysBuildModules.contains(project.getArtifactId())) {
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

public class SourceFileFinderStub extends SourceFileFinder {
@Override
public List<String> getSourceFiles(final String projectRoot, final String ignoreChangesInFiles) {
public List<String> getSourceFiles(final String projectRoot, final List<String> mvnChildModules, final String ignoreChangesInFiles, final String includeTopDirectories, final String excludeTopDirectories) {
return new ArrayList<String>();
}
}
}