@@ -425,7 +425,7 @@ def create_packages_dict(self, sbom_artifacts: list[SocketArtifact]) -> dict[str
425
425
packages = {}
426
426
top_level_count = {}
427
427
for artifact in sbom_artifacts :
428
- package = Package .from_socket_artifact ( asdict ( artifact ) )
428
+ package = Package .from_diff_artifact ( artifact . __dict__ )
429
429
if package .id in packages :
430
430
print ("Duplicate package?" )
431
431
else :
@@ -534,22 +534,44 @@ def update_package_values(pkg: Package) -> Package:
534
534
pkg .url += f"/{ pkg .name } /overview/{ pkg .version } "
535
535
return pkg
536
536
537
- def get_added_and_removed_packages (self , head_full_scan_id : str , new_full_scan_id : str ) -> Tuple [Dict [str , Package ], Dict [str , Package ]]:
537
+ def get_added_and_removed_packages (
538
+ self ,
539
+ head_full_scan_id : str ,
540
+ new_full_scan_id : str ,
541
+ merge : bool = False ,
542
+ external_href : str = None ,
543
+ ) -> Tuple [Dict [str , Package ], Dict [str , Package ], str , str ]:
538
544
"""
539
545
Get packages that were added and removed between scans.
540
546
541
547
Args:
542
- head_full_scan: Previous scan (may be None if first scan)
543
- head_full_scan_id: New scan just created
544
-
548
+ head_full_scan_id: Previous scan
549
+ new_full_scan_id: New scan just created
550
+ merge: Whether the scan is merged into the default branch
551
+ external_href: External reference
545
552
Returns:
546
553
Tuple of (added_packages, removed_packages) dictionaries
547
554
"""
548
555
549
556
log .info (f"Comparing scans - Head scan ID: { head_full_scan_id } , New scan ID: { new_full_scan_id } " )
550
557
diff_start = time .time ()
551
558
try :
552
- diff_report = self .sdk .fullscans .stream_diff (self .config .org_slug , head_full_scan_id , new_full_scan_id , use_types = True ).data
559
+ params = {
560
+ "before" : head_full_scan_id ,
561
+ "after" : new_full_scan_id ,
562
+ "description" : f"Diff scan between head { head_full_scan_id } and new { new_full_scan_id } scans" ,
563
+ "merge" : merge ,
564
+ }
565
+ if external_href :
566
+ params ["external_href" ] = external_href
567
+ new_diff_scan = self .sdk .diffscans .create_from_ids (self .config .org_slug , params )
568
+ data = new_diff_scan .get ("diff_scan" , {})
569
+ diff_scan_id = data .get ("id" )
570
+ if not diff_scan_id :
571
+ log .error (f"Failed to get diff scan ID for { new_full_scan_id } " )
572
+ log .error (new_diff_scan )
573
+ sys .exit (1 )
574
+ diff_report = self .sdk .diffscans .get (self .config .org_slug , diff_scan_id )
553
575
except APIFailure as e :
554
576
log .error (f"API Error: { e } " )
555
577
sys .exit (1 )
@@ -559,44 +581,63 @@ def get_added_and_removed_packages(self, head_full_scan_id: str, new_full_scan_i
559
581
log .error (f"Stack trace:\n { traceback .format_exc ()} " )
560
582
raise
561
583
584
+ diff_data = diff_report .get ("diff_scan" , {})
562
585
diff_end = time .time ()
586
+ diff_url = diff_data .get ("html_url" )
587
+ after_data = diff_data .get ("after_full_scan" )
588
+ if after_data :
589
+ new_full_scan_url = after_data .get ("html_url" )
590
+ else :
591
+ new_full_scan_url = ""
592
+ artifacts = diff_data .get ("artifacts" , {})
593
+ added = artifacts .get ("added" , [])
594
+ removed = artifacts .get ("removed" , [])
595
+ unchanged = artifacts .get ("unchanged" , [])
596
+ replaced = artifacts .get ("replaced" , [])
597
+ updated = artifacts .get ("updated" , [])
563
598
log .info (f"Diff Report Gathered in { diff_end - diff_start :.2f} seconds" )
564
599
log .info ("Diff report artifact counts:" )
565
- log .info (f"Added: { len (diff_report . artifacts . added )} " )
566
- log .info (f"Removed: { len (diff_report . artifacts . removed )} " )
567
- log .info (f"Unchanged: { len (diff_report . artifacts . unchanged )} " )
568
- log .info (f"Replaced: { len (diff_report . artifacts . replaced )} " )
569
- log .info (f"Updated: { len (diff_report . artifacts . updated )} " )
600
+ log .info (f"Added: { len (added )} " )
601
+ log .info (f"Removed: { len (removed )} " )
602
+ log .info (f"Unchanged: { len (unchanged )} " )
603
+ log .info (f"Replaced: { len (replaced )} " )
604
+ log .info (f"Updated: { len (updated )} " )
570
605
571
- added_artifacts = diff_report . artifacts . added + diff_report . artifacts . updated
572
- removed_artifacts = diff_report . artifacts . removed + diff_report . artifacts . replaced
606
+ added_artifacts = added + updated
607
+ removed_artifacts = removed
573
608
574
609
added_packages : Dict [str , Package ] = {}
575
610
removed_packages : Dict [str , Package ] = {}
576
611
577
612
for artifact in added_artifacts :
613
+ artifact_id = artifact .get ("id" )
614
+ artifact_name = artifact .get ("name" )
615
+ artifact_version = artifact .get ("version" )
578
616
try :
579
- pkg = Package .from_diff_artifact (asdict ( artifact ) )
617
+ pkg = Package .from_diff_artifact (artifact )
580
618
pkg = Core .update_package_values (pkg )
581
- added_packages [artifact .id ] = pkg
619
+ added_packages [pkg .id ] = pkg
582
620
except KeyError :
583
- log .error (f"KeyError: Could not create package from added artifact { artifact . id } " )
584
- log .error (f"Artifact details - name: { artifact . name } , version: { artifact . version } " )
621
+ log .error (f"KeyError: Could not create package from added artifact { artifact_id } " )
622
+ log .error (f"Artifact details - name: { artifact_name } , version: { artifact_version } " )
585
623
log .error ("No matching packages found in new_full_scan" )
586
624
587
625
for artifact in removed_artifacts :
626
+ artifact_id = artifact .get ("id" )
627
+ artifact_name = artifact .get ("name" )
628
+ artifact_version = artifact .get ("version" )
588
629
try :
589
- pkg = Package .from_diff_artifact (asdict ( artifact ) )
630
+ pkg = Package .from_diff_artifact (artifact )
590
631
pkg = Core .update_package_values (pkg )
591
632
if pkg .namespace :
592
633
pkg .purl += f"{ pkg .namespace } /{ pkg .purl } "
593
- removed_packages [artifact .id ] = pkg
634
+ removed_packages [pkg .id ] = pkg
594
635
except KeyError :
595
- log .error (f"KeyError: Could not create package from removed artifact { artifact . id } " )
596
- log .error (f"Artifact details - name: { artifact . name } , version: { artifact . version } " )
636
+ log .error (f"KeyError: Could not create package from removed artifact { artifact_id } " )
637
+ log .error (f"Artifact details - name: { artifact_name } , version: { artifact_version } " )
597
638
log .error ("No matching packages found in head_full_scan" )
598
639
599
- return added_packages , removed_packages
640
+ return added_packages , removed_packages , diff_url , new_full_scan_url
600
641
601
642
def create_new_diff (
602
643
self ,
@@ -642,7 +683,6 @@ def create_new_diff(
642
683
try :
643
684
new_scan_start = time .time ()
644
685
new_full_scan = self .create_full_scan (files_for_sending , params )
645
- new_full_scan .sbom_artifacts = self .get_sbom_data (new_full_scan .id )
646
686
new_scan_end = time .time ()
647
687
log .info (f"Total time to create new full scan: { new_scan_end - new_scan_start :.2f} " )
648
688
except APIFailure as e :
@@ -654,26 +694,15 @@ def create_new_diff(
654
694
log .error (f"Stack trace:\n { traceback .format_exc ()} " )
655
695
raise
656
696
657
- scans_ready = self .check_full_scans_status ( head_full_scan_id , new_full_scan . id )
658
- if scans_ready is False :
659
- log . error ( f"Full scans did not complete within { self . config . timeout } seconds" )
660
- added_packages , removed_packages = self . get_added_and_removed_packages ( head_full_scan_id , new_full_scan . id )
697
+ added_packages , removed_packages , diff_url , report_url = self .get_added_and_removed_packages (
698
+ head_full_scan_id ,
699
+ new_full_scan . id
700
+ )
661
701
662
702
diff = self .create_diff_report (added_packages , removed_packages )
663
-
664
- base_socket = "https://socket.dev/dashboard/org"
665
703
diff .id = new_full_scan .id
666
-
667
- report_url = f"{ base_socket } /{ self .config .org_slug } /sbom/{ diff .id } "
668
- if not params .include_license_details :
669
- report_url += "?include_license_details=false"
670
704
diff .report_url = report_url
671
-
672
- if head_full_scan_id is not None :
673
- diff .diff_url = f"{ base_socket } /{ self .config .org_slug } /diff/{ head_full_scan_id } /{ diff .id } "
674
- else :
675
- diff .diff_url = diff .report_url
676
-
705
+ diff .diff_url = diff_url
677
706
return diff
678
707
679
708
def create_diff_report (
0 commit comments