@@ -369,7 +369,7 @@ func parseWebwmlFiles(advisories Advisories, webwmlRepoPath, wmlFileSubPath stri
369369}
370370
371371func generateVulnerabilities (advisories Advisories ) ([]* osvschema.Vulnerability , error ) {
372- var vulnerabilities []* osvschema.Vulnerability
372+ vulnerabilities := make ( []* osvschema.Vulnerability , 0 , len ( advisories ))
373373 for dsaID , advisory := range advisories {
374374 if len (advisory .Affected ) == 0 {
375375 slog .Info ("Skipping because no affected versions" , "dsaID" , dsaID )
@@ -420,6 +420,7 @@ func generateVulnerabilities(advisories Advisories) ([]*osvschema.Vulnerability,
420420
421421 vulnerabilities = append (vulnerabilities , osv )
422422 }
423+
423424 return vulnerabilities , nil
424425}
425426
@@ -454,10 +455,11 @@ func convertDebian(webwmlRepo, securityTrackerRepo string, advType AdvisoryType)
454455
455456func cloneRepo (url , dest string ) error {
456457 slog .Info ("Cloning repository" , "url" , url , "dest" , dest )
457- //nolint:gosec // url and dest are safe
458+
458459 cmd := exec .Command ("git" , "clone" , "--quiet" , url , dest , "--depth=1" )
459460 cmd .Stdout = os .Stdout
460461 cmd .Stderr = os .Stderr
462+
461463 return cmd .Run ()
462464}
463465
@@ -477,32 +479,35 @@ func main() {
477479 os .Exit (1 )
478480 }
479481
480- if * webwmlRepo == "" {
482+ if err := run (* webwmlRepo , * securityTrackerRepo , * outputDir , * outputBucket , * uploadToGCS , * doDeletions , * numWorkers ); err != nil {
483+ slog .Error ("Execution failed" , "err" , err )
484+ os .Exit (1 )
485+ }
486+ }
487+
488+ func run (webwmlRepo , securityTrackerRepo , outputDir , outputBucket string , uploadToGCS , doDeletions bool , numWorkers int ) error {
489+ if webwmlRepo == "" {
481490 tempDir , err := os .MkdirTemp ("" , "webwml-*" )
482491 if err != nil {
483- slog .Error ("Failed to create temp dir for webwml" , "err" , err )
484- os .Exit (1 )
492+ return fmt .Errorf ("failed to create temp dir for webwml: %w" , err )
485493 }
486494 defer os .RemoveAll (tempDir )
487495 if err := cloneRepo ("https://salsa.debian.org/webmaster-team/webwml.git" , tempDir ); err != nil {
488- slog .Error ("Failed to clone webwml" , "err" , err )
489- os .Exit (1 )
496+ return fmt .Errorf ("failed to clone webwml: %w" , err )
490497 }
491- * webwmlRepo = tempDir
498+ webwmlRepo = tempDir
492499 }
493500
494- if * securityTrackerRepo == "" {
501+ if securityTrackerRepo == "" {
495502 tempDir , err := os .MkdirTemp ("" , "security-tracker-*" )
496503 if err != nil {
497- slog .Error ("Failed to create temp dir for security-tracker" , "err" , err )
498- os .Exit (1 )
504+ return fmt .Errorf ("failed to create temp dir for security-tracker: %w" , err )
499505 }
500506 defer os .RemoveAll (tempDir )
501507 if err := cloneRepo ("https://salsa.debian.org/security-tracker-team/security-tracker.git" , tempDir ); err != nil {
502- slog .Error ("Failed to clone security-tracker" , "err" , err )
503- os .Exit (1 )
508+ return fmt .Errorf ("failed to clone security-tracker: %w" , err )
504509 }
505- * securityTrackerRepo = tempDir
510+ securityTrackerRepo = tempDir
506511 }
507512
508513 advisoryTypes := []AdvisoryType {AdvisoryTypeDSA , AdvisoryTypeDLA , AdvisoryTypeDTSA }
@@ -511,44 +516,44 @@ func main() {
511516 for _ , advType := range advisoryTypes {
512517 slog .Info ("Converting advisories" , "type" , advType )
513518
514- vulns , err := convertDebian (* webwmlRepo , * securityTrackerRepo , advType )
519+ vulns , err := convertDebian (webwmlRepo , securityTrackerRepo , advType )
515520 if err != nil {
516- slog .Error ("Error converting" , "type" , advType , "err" , err )
517- os .Exit (1 )
521+ return fmt .Errorf ("error converting type %s: %w" , advType , err )
518522 }
519523
520524 allVulnerabilities = append (allVulnerabilities , vulns ... )
521525
522- if ! * uploadToGCS {
523- advOutputDir := filepath .Join (* outputDir , strings .ToLower (string (advType )))
526+ if ! uploadToGCS {
527+ advOutputDir := filepath .Join (outputDir , strings .ToLower (string (advType )))
524528 if err := os .MkdirAll (advOutputDir , 0755 ); err != nil {
525- slog .Error ("Failed to create output dir" , "dir" , advOutputDir , "err" , err )
526- os .Exit (1 )
529+ return fmt .Errorf ("failed to create output dir %s: %w" , advOutputDir , err )
527530 }
528531
529532 for _ , vuln := range vulns {
530533 b , err := marshaler .Marshal (vuln )
531534 if err != nil {
532- slog .Error ("Failed to marshal vulnerability" , "id" , vuln .Id , "err" , err )
535+ slog .Error ("Failed to marshal vulnerability" , "id" , vuln .GetId () , "err" , err )
533536 continue
534537 }
535538
536- outPath := filepath .Join (advOutputDir , vuln .Id + ".json" )
539+ outPath := filepath .Join (advOutputDir , vuln .GetId () + ".json" )
537540 //nolint:gosec // 0644 is fine for public vulnerability data
538541 if err := os .WriteFile (outPath , b , 0644 ); err != nil {
539- slog .Error ("Failed to write vulnerability" , "id" , vuln .Id , "err" , err )
542+ slog .Error ("Failed to write vulnerability" , "id" , vuln .GetId () , "err" , err )
540543 continue
541544 }
542545 slog .Info ("Writing" , "path" , outPath )
543546 }
544547 }
545548 }
546549
547- if * uploadToGCS {
548- slog .Info ("Uploading to GCS" , "bucket" , * outputBucket )
550+ if uploadToGCS {
551+ slog .Info ("Uploading to GCS" , "bucket" , outputBucket )
549552 ctx := context .Background ()
550- upload .Upload (ctx , "debian-osv" , * uploadToGCS , * outputBucket , "" , * numWorkers , * outputDir , allVulnerabilities , * doDeletions )
553+ upload .Upload (ctx , "debian-osv" , uploadToGCS , outputBucket , "" , numWorkers , outputDir , allVulnerabilities , doDeletions )
551554 } else {
552555 slog .Info ("Skipping GCS upload" )
553556 }
557+
558+ return nil
554559}
0 commit comments