Skip to content

Commit

Permalink
chore: classes created via ObjectFactory
Browse files Browse the repository at this point in the history
  • Loading branch information
augi committed Jul 27, 2021
1 parent 4178917 commit d935036
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -1,23 +1,34 @@
package com.avast.gradle.dockercompose

import org.gradle.api.Project
import org.gradle.api.internal.file.FileOperations
import org.gradle.api.invocation.Gradle
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.gradle.internal.UncheckedException
import org.gradle.process.ExecOperations
import org.gradle.process.ExecSpec
import org.gradle.util.VersionNumber
import org.yaml.snakeyaml.Yaml

import javax.inject.Inject
import java.util.concurrent.Executors

class ComposeExecutor {
private final ComposeSettings settings
private final Project project
private final Logger logger
private final File projectDir
private final ExecOperations exec
private final FileOperations fileOps
private final Gradle gradle

ComposeExecutor(ComposeSettings settings) {
private static final Logger logger = Logging.getLogger(ComposeExecutor.class);

@Inject
ComposeExecutor(ComposeSettings settings, File projectDir, ExecOperations exec, FileOperations fileOps, Gradle gradle) {
this.settings = settings
this.project = settings.project
this.logger = settings.project.logger
this.projectDir = projectDir
this.exec = exec
this.fileOps = fileOps
this.gradle = gradle
}

void executeWithCustomOutputWithExitValue(OutputStream os, String... args) {
Expand All @@ -29,23 +40,23 @@ class ComposeExecutor {
}

void executeWithCustomOutput(OutputStream os, Boolean ignoreExitValue, Boolean noAnsi, Boolean captureStderr, String... args) {
def ex = this.settings
def er = project.exec { ExecSpec e ->
def settings = this.settings
def er = exec.exec { ExecSpec e ->
if (settings.dockerComposeWorkingDirectory) {
e.setWorkingDir(settings.dockerComposeWorkingDirectory)
}
e.environment = ex.environment
def finalArgs = [ex.executable]
finalArgs.addAll(ex.composeAdditionalArgs)
e.environment = settings.environment
def finalArgs = [settings.executable]
finalArgs.addAll(settings.composeAdditionalArgs)
if (noAnsi) {
if (version >= VersionNumber.parse('1.28.0')) {
finalArgs.addAll(['--ansi', 'never'])
} else if (version >= VersionNumber.parse('1.16.0')) {
finalArgs.add('--no-ansi')
}
}
finalArgs.addAll(ex.useComposeFiles.collectMany { ['-f', it].asCollection() })
String pn = ex.projectName
finalArgs.addAll(settings.useComposeFiles.collectMany { ['-f', it].asCollection() })
String pn = settings.projectName
if (pn) {
finalArgs.addAll(['-p', pn])
}
Expand Down Expand Up @@ -132,7 +143,7 @@ class ComposeExecutor {
})
t.daemon = true
t.start()
project.gradle.buildFinished { t.interrupt() }
gradle.buildFinished { t.interrupt() }
}

Iterable<String> getServiceNames() {
Expand All @@ -151,7 +162,7 @@ class ComposeExecutor {
} else {
def composeFiles = settings.useComposeFiles.empty ? getStandardComposeFiles() : getCustomComposeFiles()
composeFiles.collectMany { composeFile ->
def compose = (Map<String, Object>) (new Yaml().load(project.file(composeFile).text))
def compose = (Map<String, Object>) (new Yaml().load(fileOps.file(composeFile).text))
// if there is 'version' on top-level then information about services is in 'services' sub-tree
compose.containsKey('version') ? ((Map) compose.get('services')).keySet() : compose.keySet()
}.unique()
Expand All @@ -171,16 +182,16 @@ class ComposeExecutor {

Iterable<File> getStandardComposeFiles() {
def res = []
def f = findInParentDirectories('docker-compose.yml', project.projectDir)
def f = findInParentDirectories('docker-compose.yml', projectDir)
if (f != null) res.add(f)
f = findInParentDirectories('docker-compose.override.yml', project.projectDir)
f = findInParentDirectories('docker-compose.override.yml', projectDir)
if (f != null) res.add(f)
res
}

Iterable<File> getCustomComposeFiles() {
settings.useComposeFiles.collect {
def f = project.file(it)
def f = fileOps.file(it)
if (!f.exists()) {
throw new IllegalArgumentException("Custom Docker Compose file not found: $f")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ package com.avast.gradle.dockercompose
import org.gradle.api.Project
import org.gradle.util.ConfigureUtil

import javax.inject.Inject

class ComposeExtension extends ComposeSettings {
@Inject
ComposeExtension(Project project) {
super(project, '', '')
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import org.gradle.process.JavaForkOptions
import org.gradle.process.ProcessForkOptions
import org.gradle.util.VersionNumber

import javax.inject.Inject
import java.nio.charset.StandardCharsets
import java.security.MessageDigest
import java.time.Duration
Expand Down Expand Up @@ -107,6 +108,7 @@ class ComposeSettings {
String dockerComposeWorkingDirectory = null
Duration dockerComposeStopTimeout = Duration.ofSeconds(10)

@Inject
ComposeSettings(Project project, String name = '', String parentName = '') {
this.project = project
this.nestedName = parentName + name
Expand All @@ -119,8 +121,8 @@ class ComposeSettings {
logsTask = project.tasks.register(name ? "${name}ComposeLogs".toString() : 'composeLogs', ComposeLogs, { it.settings = this })
pushTask = project.tasks.register(name ? "${name}ComposePush".toString() : 'composePush', ComposePush, { it.settings = this })

this.dockerExecutor = new DockerExecutor(this)
this.composeExecutor = new ComposeExecutor(this)
this.dockerExecutor = project.objects.newInstance(DockerExecutor, this)
this.composeExecutor = project.objects.newInstance(ComposeExecutor, this, project.projectDir)
this.serviceInfoCache = new ServiceInfoCache(this)

this.containerLogToDir = project.buildDir.toPath().resolve('containers-logs').toFile()
Expand All @@ -139,7 +141,7 @@ class ComposeSettings {
}

protected ComposeSettings cloneAsNested(String name) {
def r = new ComposeSettings(project, name, this.nestedName)
def r = project.objects.newInstance(ComposeSettings, project, name, this.nestedName)
r.buildBeforeUp = this.buildBeforeUp
r.buildBeforePull = this.buildBeforePull

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ import org.gradle.api.Project
class DockerComposePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create('dockerCompose', ComposeExtension, project)
project.extensions.create('dockerCompose', ComposeExtension)
}
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
package com.avast.gradle.dockercompose

import org.gradle.api.Project
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.gradle.process.ExecOperations
import org.gradle.process.ExecSpec
import org.yaml.snakeyaml.Yaml

import javax.inject.Inject

class DockerExecutor {
private final ComposeSettings settings
private final Project project
private final Logger logger
private final ExecOperations exec

private static final Logger logger = Logging.getLogger(DockerExecutor.class);

DockerExecutor(ComposeSettings settings) {
@Inject
DockerExecutor(ComposeSettings settings, ExecOperations exec) {
this.settings = settings
this.project = settings.project
this.logger = settings.project.logger
this.exec = exec
}

String execute(String... args) {
def exec = this.exec
def settings = this.settings
new ByteArrayOutputStream().withStream { os ->
def er = project.exec { ExecSpec e ->
def er = exec.exec { ExecSpec e ->
e.environment = settings.environment
def finalArgs = [settings.dockerExecutable]
finalArgs.addAll(args)
Expand Down

0 comments on commit d935036

Please # to comment.