4040import java .util .List ;
4141import java .util .Map ;
4242import java .util .Objects ;
43+ import java .util .Optional ;
4344import java .util .TreeMap ;
4445import java .util .logging .Logger ;
4546import java .util .regex .Pattern ;
5253public final class GoModulesProvider extends Provider {
5354
5455 public static final String PROP_EXHORT_GO_MVS_LOGIC_ENABLED = "EXHORT_GO_MVS_LOGIC_ENABLED" ;
56+ private static final String GO_BINARY = "go" ;
5557 private static final Logger log = LoggersFactory .getLogger (GoModulesProvider .class .getName ());
5658 private static final String GO_HOST_ARCHITECTURE_ENV_NAME = "GOHOSTARCH" ;
5759 private static final String GO_HOST_OPERATION_SYSTEM_ENV_NAME = "GOHOSTOS" ;
@@ -67,8 +69,8 @@ public String getMainModuleVersion() {
6769
6870 public GoModulesProvider (Path manifest ) {
6971 super (Type .GOLANG , manifest );
70- this .goExecutable = Operations .getExecutable ("go" , "version" );
71- this .goEnvironmentVariableForPurl = getQualifiers (true );
72+ this .goExecutable = Operations .getExecutable (GO_BINARY , "version" );
73+ this .goEnvironmentVariableForPurl = getQualifiers ();
7274 this .mainModuleVersion = getDefaultMainModuleVersion ();
7375 }
7476
@@ -320,9 +322,9 @@ private Sbom buildSbomFromGraph(
320322
321323 private Map <String , List <String >> getFinalPackagesVersionsForModule (
322324 Map <String , List <String >> edges , Path manifestPath ) {
323- Operations .runProcessGetOutput (manifestPath .getParent (), "go" , "mod" , "download" );
325+ Operations .runProcessGetOutput (manifestPath .getParent (), GO_BINARY , "mod" , "download" );
324326 String finalVersionsForAllModules =
325- Operations .runProcessGetOutput (manifestPath .getParent (), "go" , "list" , "-m" , "all" );
327+ Operations .runProcessGetOutput (manifestPath .getParent (), GO_BINARY , "list" , "-m" , "all" );
326328 Map <String , String > finalModulesVersions =
327329 Arrays .stream (finalVersionsForAllModules .split (System .lineSeparator ()))
328330 .filter (string -> string .trim ().split (" " ).length == 2 )
@@ -378,26 +380,60 @@ private static List<String> collectAllDirectDependencies(List<String> targetLine
378380 .collect (Collectors .toList ());
379381 }
380382
381- private TreeMap <String , String > getQualifiers (boolean includeOsAndArch ) {
382- if (includeOsAndArch ) {
383- String goEnvironmentVariables = Operations .runProcessGetOutput (null , goExecutable , "env" );
384- String hostArch =
385- getEnvironmentVariable (goEnvironmentVariables , GO_HOST_ARCHITECTURE_ENV_NAME );
386- String hostOS =
387- getEnvironmentVariable (goEnvironmentVariables , GO_HOST_OPERATION_SYSTEM_ENV_NAME );
388- return new TreeMap <>(Map .of ("type" , "module" , "goos" , hostOS , "goarch" , hostArch ));
383+ private TreeMap <String , String > getQualifiers () {
384+ String goEnvironmentVariables ;
385+ try {
386+ goEnvironmentVariables = Operations .runProcessGetOutput (null , goExecutable , "env" );
387+ } catch (Exception e ) {
388+ log .warning ("Failed to get Go environment variables: " + e .getMessage ());
389+ goEnvironmentVariables = null ;
390+ }
391+
392+ var hostArch = getEnvironmentVariable (goEnvironmentVariables , GO_HOST_ARCHITECTURE_ENV_NAME );
393+ var hostOS = getEnvironmentVariable (goEnvironmentVariables , GO_HOST_OPERATION_SYSTEM_ENV_NAME );
394+
395+ var qualifiers = new TreeMap <String , String >();
396+ qualifiers .put ("type" , "module" );
397+
398+ if (hostOS .isPresent ()) {
399+ qualifiers .put ("goos" , hostOS .get ());
400+ }
401+ if (hostArch .isPresent ()) {
402+ qualifiers .put ("goarch" , hostArch .get ());
389403 }
390404
391- return new TreeMap <>( Map . of ( "type" , "module" )) ;
405+ return qualifiers ;
392406 }
393407
394- private static String getEnvironmentVariable (String goEnvironmentVariables , String envName ) {
395- int i = goEnvironmentVariables .indexOf (String .format ("%s=" , envName ));
396- int beginIndex = i + String .format ("%s=" , envName ).length ();
397- int endOfLineIndex =
398- goEnvironmentVariables .substring (beginIndex ).indexOf (System .lineSeparator ());
399- String envValue = goEnvironmentVariables .substring (beginIndex ).substring (0 , endOfLineIndex );
400- return envValue .replaceAll ("\" " , "" );
408+ private static Optional <String > getEnvironmentVariable (
409+ String goEnvironmentVariables , String envName ) {
410+ if (goEnvironmentVariables == null || goEnvironmentVariables .isEmpty ()) {
411+ return Optional .empty ();
412+ }
413+
414+ String searchPattern = String .format ("%s=" , envName );
415+ int i = goEnvironmentVariables .indexOf (searchPattern );
416+ if (i == -1 ) {
417+ return Optional .empty ();
418+ }
419+
420+ int beginIndex = i + searchPattern .length ();
421+ if (beginIndex >= goEnvironmentVariables .length ()) {
422+ return Optional .empty ();
423+ }
424+
425+ String remaining = goEnvironmentVariables .substring (beginIndex );
426+ int endOfLineIndex = remaining .indexOf (System .lineSeparator ());
427+
428+ String envValue ;
429+ if (endOfLineIndex == -1 ) {
430+ // Handle case where this is the last variable without trailing newline
431+ envValue = remaining .replaceAll ("\" " , "" ).trim ();
432+ } else {
433+ envValue = remaining .substring (0 , endOfLineIndex ).replaceAll ("\" " , "" ).trim ();
434+ }
435+
436+ return envValue .isEmpty () ? Optional .empty () : Optional .of (envValue );
401437 }
402438
403439 private String buildGoModulesDependencies (Path manifestPath ) {
0 commit comments