Skip to content

Commit

Permalink
feat(go): GoMod extractor now retrieves and applies replacement data …
Browse files Browse the repository at this point in the history
…(IDETECT-1966)
  • Loading branch information
crowleySynopsys committed May 26, 2020
1 parent 1719098 commit 079d4a6
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,15 @@
package com.synopsys.integration.detectable.detectables.go.gomod;

import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.synopsys.integration.blackduck.service.BlackDuckServicesFactory;
import com.synopsys.integration.detectable.Extraction;
import com.synopsys.integration.detectable.detectable.codelocation.CodeLocation;
import com.synopsys.integration.detectable.detectable.exception.DetectableException;
Expand All @@ -35,6 +42,9 @@
public class GoModCliExtractor {
private final ExecutableRunner executableRunner;
private final GoModGraphParser goModGraphParser;
private final Gson gson = BlackDuckServicesFactory.createDefaultGsonBuilder().setPrettyPrinting().setLenient().create();
private final Map<String, String> replacementData = new HashMap<>();
private final static String PATHS = "paths";

public GoModCliExtractor(final ExecutableRunner executableRunner, final GoModGraphParser goModGraphParser) {
this.executableRunner = executableRunner;
Expand All @@ -44,7 +54,8 @@ public GoModCliExtractor(final ExecutableRunner executableRunner, final GoModGra
public Extraction extract(final File directory, final File goExe) {
try {
final List<String> listOutput = execute(directory, goExe, "Querying go for the list of modules failed: ", "list", "-m");
final List<String> modGraphOutput = execute(directory, goExe, "Querying for the go mod graph failed:", "mod", "graph");
final List<String> listUJsonOutput = execute(directory, goExe, "Querying for the go mod graph failed:", "list", "-m", "-u", "-json", "all");
final List<String> modGraphOutput = modGraphOutputWithReplacements(directory, goExe, listUJsonOutput);
final List<CodeLocation> codeLocations = goModGraphParser.parseListAndGoModGraph(listOutput, modGraphOutput);
return new Extraction.Builder().success(codeLocations).build();//no project info - hoping git can help with that.
} catch (final Exception e) {
Expand All @@ -61,4 +72,48 @@ private List<String> execute(final File directory, final File goExe, final Strin
throw new DetectableException(failureMessage + output.getReturnCode());
}
}

private List<String> modGraphOutputWithReplacements(File directory, File goExe, List<String> listUJsonOutput) throws ExecutableRunnerException, DetectableException {
final List<String> modGraphOutput = execute(directory, goExe, "Querying for the go mod graph failed:", "mod", "graph");
String jsonString = convertOutputToJsonString(listUJsonOutput);
JsonObject json = gson.fromJson(jsonString, JsonObject.class);

for (final JsonElement jsonElement : json.getAsJsonArray(PATHS)) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
JsonObject replace = jsonObject.getAsJsonObject("Replace");
if (replace != null) {
String path = jsonObject.get("Path").getAsString();
String originalVersion = jsonObject.get("Version").getAsString();
String replaceVersion = replace.get("Version").getAsString();
replacementData.put(String.format("%s@%s", path, originalVersion), String.format("%s@%s", path, replaceVersion));
}
}

for (String line : modGraphOutput) {
for (String original : replacementData.keySet()) {
if (line.contains("ocsql@v0.1.5")) {
System.out.println("");
}
String newLine = line.replace(original, replacementData.get(original));
int indexOfLine = modGraphOutput.indexOf(line);
modGraphOutput.set(indexOfLine, newLine);
}
}
return modGraphOutput;
}

private String convertOutputToJsonString(List<String> listUJsonOutput) {
// go list -u -json does not provide data in a format that can be consumed by gson
Collections.replaceAll(listUJsonOutput, "}", "},");
String goModGraphAsString = String.join(System.lineSeparator(), listUJsonOutput);
int lastCloseBrace = goModGraphAsString.lastIndexOf("},");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format("{%n %s: [%n", PATHS));
stringBuilder.append(goModGraphAsString.substring(0, lastCloseBrace));
stringBuilder.append("}");
stringBuilder.append(goModGraphAsString.substring(lastCloseBrace + 2));
stringBuilder.append("\n] \n}");

return stringBuilder.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,24 @@ protected void setup() throws IOException {
);
addExecutableOutput(goListOutput, "go", "list", "-m");

ExecutableOutput goListUJsonOutput = createStandardOutput(
"{",
"\t\"Path\": \"github.com/codegangsta/negroni\",",
"\t\"Version\": \"v1.0.0\"",
"}",
"",
"{",
"\t\"Path\": \"github.com/sirupsen/logrus\",",
"\t\"Version\": \"v1.1.1\"",
"}",
"",
"{",
"\t\"Path\": \"github.com/davecgh/go-spew\",",
"\t\"Version\": \"v1.1.1\"",
"}"
);
addExecutableOutput(goListUJsonOutput, "go", "list", "-m", "-u", "-json", "all");

ExecutableOutput goModGraphOutput = createStandardOutput(
"github.com/gomods/athens github.com/codegangsta/negroni@v1.0.0",
"github.com/gomods/athens github.com/sirupsen/logrus@v1.1.1",
Expand Down

0 comments on commit 079d4a6

Please sign in to comment.