99import logging
1010from itertools import groupby
1111from pathlib import Path
12+ from timeit import default_timer as timer
13+ from traceback import format_exc as traceback_format_exc
1214
1315import saneyaml
16+ from aboutcode .pipeline import LoopProgress
17+ from aboutcode .pipeline import humanize_time
1418from django .core .management .base import BaseCommand
1519from django .core .management .base import CommandError
1620from packageurl import PackageURL
@@ -26,7 +30,7 @@ def serialize_severity(sev):
2630 "score" : sev .value ,
2731 "scoring_system" : sev .scoring_system ,
2832 "scoring_elements" : sev .scoring_elements ,
29- "published_at" : sev .published_at ,
33+ "published_at" : str ( sev .published_at ) ,
3034 "url" : sev .url ,
3135 }
3236
@@ -88,8 +92,22 @@ def export_data(self, base_path: Path):
8892 """
8993 i = 0
9094 seen_vcid = set ()
95+ export_start_time = timer ()
9196
92- for i , (purl_without_version , package_versions ) in enumerate (packages_by_type_ns_name (), 1 ):
97+ distinct_packages_count = (
98+ Package .objects .values ("type" , "namespace" , "name" )
99+ .distinct ("type" , "namespace" , "name" )
100+ .count ()
101+ )
102+
103+ progress = LoopProgress (
104+ total_iterations = distinct_packages_count ,
105+ progress_step = 1 ,
106+ logger = self .stdout .write ,
107+ )
108+ for i , (purl_without_version , package_versions ) in enumerate (
109+ progress .iter (packages_by_type_ns_name ()), 1
110+ ):
93111 pkg_version = None
94112 try :
95113 package_urls = []
@@ -131,9 +149,15 @@ def export_data(self, base_path: Path):
131149 self .stdout .write (f"Processed { i } package. Last PURL: { purl_without_version } " )
132150
133151 except Exception as e :
134- raise Exception (f"Failed to process Package: { pkg_version } " ) from e
152+ self .stdout .write (
153+ self .style .ERROR (
154+ f"Failed to process Package { pkg_version } : { e !r} \n { traceback_format_exc ()} "
155+ )
156+ )
135157
136158 self .stdout .write (f"Exported data for: { i } package and { len (seen_vcid )} vulnerabilities." )
159+ export_run_time = timer () - export_start_time
160+ self .stdout .write (f"Export completed in { humanize_time (export_run_time )} " )
137161
138162
139163def by_purl_type_ns_name (package ):
0 commit comments