1313from urllib .parse import urlparse
1414from pathlib import Path
1515
16+ from debsbom .download import Compression , SourceArchiveMerger
17+
1618from .dpkg import package
1719from .generate import Debsbom , SBOMType
1820from .download import PackageDownloader , PackageResolver , PersistentResolverCache
@@ -198,6 +200,42 @@ def setup_parser(parser):
198200 parser .add_argument ("--binaries" , help = "download binary packages" , action = "store_true" )
199201
200202
203+ class MergeCmd :
204+ """
205+ Processes an SBOM and merges the .orig and .debian tarballs. The tarballs have to be
206+ downloaded first.
207+ """
208+
209+ @staticmethod
210+ def run (args ):
211+ pkgdir = Path (args .pkgdir )
212+ outdir = Path (args .outdir or args .pkgdir )
213+ compress = Compression .from_tool (args .compress if args .compress != "no" else None )
214+ resolver = PackageResolver .create (Path (args .bomfile ))
215+ merger = SourceArchiveMerger (pkgdir , outdir , compress )
216+ pkgs = list (resolver .sources ())
217+ for idx , pkg in enumerate (pkgs ):
218+ if args .progress :
219+ progress_cb (idx , len (pkgs ), pkg .name )
220+ merger .merge (pkg )
221+
222+ @staticmethod
223+ def setup_parser (parser ):
224+ parser .add_argument ("bomfile" , help = "sbom file to process" )
225+ parser .add_argument (
226+ "--pkgdir" , default = "downloads" , help = "directory with downloaded packages"
227+ )
228+ parser .add_argument (
229+ "--outdir" , default = "downloads" , help = "directory to store the merged files"
230+ )
231+ parser .add_argument (
232+ "--compress" ,
233+ help = "compress merged tarballs (default: gzip)" ,
234+ choices = ["no" ] + [c .tool for c in Compression .formats ()],
235+ default = "gzip" ,
236+ )
237+
238+
201239def main ():
202240 parser = argparse .ArgumentParser (
203241 prog = "debsbom" ,
@@ -217,13 +255,16 @@ def main():
217255 subparser .add_parser ("generate" , help = "generate a SBOM for a Debian system" )
218256 )
219257 DownloadCmd .setup_parser (subparser .add_parser ("download" , help = "download referenced packages" ))
258+ MergeCmd .setup_parser (subparser .add_parser ("merge" , help = "merge referenced source packages" ))
220259 args = parser .parse_args ()
221260
222261 try :
223262 if args .cmd == "generate" :
224263 GenerateCmd .run (args )
225264 elif args .cmd == "download" :
226265 DownloadCmd .run (args )
266+ elif args .cmd == "merge" :
267+ MergeCmd .run (args )
227268 except Exception as e :
228269 print ("debsbom: error: {}" .format (e ))
229270 if args .verbose >= 1 :
0 commit comments