diff --git a/build/gradle.go b/build/gradle.go index 87989135..cd261fd1 100644 --- a/build/gradle.go +++ b/build/gradle.go @@ -23,6 +23,8 @@ const ( gradleExtractorRemotePath = "org/jfrog/buildinfo/build-info-extractor-gradle/%s" gradleExtractor4DependencyVersion = "4.33.7" gradleExtractor5DependencyVersion = "5.1.12" + projectPropertiesFlag = "-P" + systemPropertiesFlag = "-D" ) var versionRegex = regexp.MustCompile(`Gradle (\d+\.\d+(?:\.\d+|-\w+-\d+)?)`) @@ -140,7 +142,7 @@ func (gm *GradleModule) downloadGradleExtractor(gradleExecPath string) (err erro func (gm *GradleModule) getExtractorVersionAndInitScript(gradleExecPath string) (string, string, error) { gradleRunConfig := &gradleRunConfig{ gradle: gradleExecPath, - tasks: "--version", + tasks: []string{"--version"}, logger: gm.containingBuild.logger, } @@ -187,7 +189,7 @@ func (gm *GradleModule) createGradleRunConfig(gradleExecPath string) (*gradleRun env: gm.gradleExtractorDetails.props, gradle: gradleExecPath, extractorPropsFile: extractorPropsFile, - tasks: strings.Join(gm.gradleExtractorDetails.tasks, " "), + tasks: gm.gradleExtractorDetails.tasks, initScript: gm.gradleExtractorDetails.initScript, logger: gm.containingBuild.logger, }, nil @@ -243,7 +245,7 @@ func GetGradleExecPath(useWrapper bool) (string, error) { type gradleRunConfig struct { gradle string extractorPropsFile string - tasks string + tasks []string initScript string env map[string]string logger utils.Log @@ -255,11 +257,24 @@ func (config *gradleRunConfig) GetCmd() *exec.Cmd { if config.initScript != "" { cmd = append(cmd, "--init-script", config.initScript) } - cmd = append(cmd, strings.Split(config.tasks, " ")...) + cmd = append(cmd, handleGradleCommandProperties(config.tasks)...) config.logger.Info("Running gradle command:", strings.Join(cmd, " ")) return exec.Command(cmd[0], cmd[1:]...) } +func handleGradleCommandProperties(tasks []string) []string { + var cmdArgs []string + for _, task := range tasks { + if !strings.HasPrefix(task, systemPropertiesFlag) && !strings.HasPrefix(task, projectPropertiesFlag) { + cmdArgs = append(cmdArgs, task) + continue + } + propertyParts := strings.SplitN(task, "=", 2) + cmdArgs = append(cmdArgs, fmt.Sprintf(`%s="%s"`, propertyParts[0], propertyParts[1])) + } + return cmdArgs +} + func (config *gradleRunConfig) runCmd(stdout, stderr io.Writer) error { command := config.GetCmd() command.Env = os.Environ() diff --git a/build/gradle_test.go b/build/gradle_test.go index 5d5179a9..77e01ff1 100644 --- a/build/gradle_test.go +++ b/build/gradle_test.go @@ -102,3 +102,32 @@ func TestParseGradleVersion(t *testing.T) { }) } } + +func TestHandleGradleCommandProperties(t *testing.T) { + tests := []struct { + input []string + expected []string + }{ + { + input: []string{"clean", "-Dparam=value", "build", "-Pkey=value"}, + expected: []string{"clean", `-Dparam="value"`, "build", `-Pkey="value"`}, + }, + { + input: []string{"-Dprop1=value1", "test", "-Dprop2=value2"}, + expected: []string{`-Dprop1="value1"`, "test", `-Dprop2="value2"`}, + }, + { + input: []string{"-Dparam1=value1", "-Pkey1=value1", "-Dparam2=value2", "-Pkey2=value2"}, + expected: []string{`-Dparam1="value1"`, `-Pkey1="value1"`, `-Dparam2="value2"`, `-Pkey2="value2"`}, + }, + { + input: []string{"-Dparam1=value1", "run", "-Pkey2=value2", "-Dparam2=value2"}, + expected: []string{`-Dparam1="value1"`, "run", `-Pkey2="value2"`, `-Dparam2="value2"`}, + }, + } + + for _, test := range tests { + result := handleGradleCommandProperties(test.input) + assert.ElementsMatch(t, test.expected, result) + } +}