@@ -129,22 +129,49 @@ def get_inputs(self):
129129
130130 def extract_inputs_to_codebase_directory (self ):
131131 """Extract input files to the project's codebase/ directory."""
132- inputs_with_codebase_path_destination = [
133- (self .from_files , self .project .codebase_path / d2d .FROM ),
134- (self .to_files , self .project .codebase_path / d2d .TO ),
135- ]
136-
137- for input_files , codebase_path in inputs_with_codebase_path_destination :
138- for input_file_path in input_files :
139- if input .is_archive (input_file_path ):
140- self .extract_archive (input_file_path , codebase_path )
141- else :
142- input .copy_input (input_file_path , codebase_path )
132+ # Extract from files to FROM
133+ from_path = self .project .codebase_path / d2d .FROM
134+ for input_file_path in self .from_files :
135+ if input .is_archive (input_file_path ):
136+ self .extract_archive (input_file_path , from_path )
137+ else :
138+ input .copy_input (input_file_path , from_path )
139+
140+ # Extract each to file to a separate subdirectory under TO
141+ self .to_paths = []
142+ for i , input_file_path in enumerate (self .to_files ):
143+ if len (self .to_files ) > 1 :
144+ to_subpath = self .project .codebase_path / d2d .TO / str (i )
145+ else :
146+ to_subpath = self .project .codebase_path / d2d .TO
147+
148+ self .to_paths .append (
149+ str (to_subpath .relative_to (self .project .codebase_path )) + "/"
150+ )
151+
152+ if input .is_archive (input_file_path ):
153+ self .extract_archive (input_file_path , to_subpath )
154+ else :
155+ input .copy_input (input_file_path , to_subpath )
143156
144157 # Reload the project env post-extraction as the scancode-config.yml file
145158 # may be located in one of the extracted archives.
146159 self .env = self .project .get_env ()
147160
161+ def run_d2d_step (self , func , * args , ** kwargs ):
162+ """Run a d2d mapping step for each to_path."""
163+ to_paths = getattr (self , "to_paths" , [None ])
164+ for to_path in to_paths :
165+ if to_path :
166+ kwargs ["to_queryset" ] = self .project .codebaseresources .filter (
167+ path__startswith = to_path
168+ )
169+ kwargs ["to_path" ] = to_path
170+ if len (to_paths ) > 1 :
171+ self .log (f"Running { func .__name__ } for { to_path } " )
172+
173+ func (project = self .project , logger = self .log , * args , ** kwargs )
174+
148175 def collect_and_create_codebase_resources (self ):
149176 """Collect and create codebase resources."""
150177 pipes .collect_and_create_codebase_resources (self .project )
@@ -168,23 +195,22 @@ def map_ruby(self):
168195
169196 def map_about_files (self ):
170197 """Map ``from/`` .ABOUT files to their related ``to/`` resources."""
171- d2d . map_about_files ( project = self . project , logger = self . log )
198+ self . run_d2d_step ( d2d . map_about_files )
172199
173200 def map_checksum (self ):
174201 """Map using SHA1 checksum."""
175- d2d . map_checksum ( project = self . project , checksum_field = "sha1" , logger = self . log )
202+ self . run_d2d_step ( d2d . map_checksum , checksum_field = "sha1" )
176203
177204 def match_archives_to_purldb (self ):
178205 """Match selected package archives by extension to PurlDB."""
179206 if not purldb .is_available ():
180207 self .log ("PurlDB is not available. Skipping." )
181208 return
182209
183- d2d . match_purldb_resources (
184- project = self . project ,
210+ self . run_d2d_step (
211+ d2d . match_purldb_resources ,
185212 extensions = self .ecosystem_config .matchable_package_extensions ,
186213 matcher_func = d2d .match_purldb_package ,
187- logger = self .log ,
188214 )
189215
190216 @optional_step ("Java" )
@@ -197,16 +223,12 @@ def find_java_packages(self):
197223 @optional_step ("Java" )
198224 def map_java_to_class (self ):
199225 """Map a .class compiled file to its .java source."""
200- d2d .map_jvm_to_class (
201- project = self .project , jvm_lang = jvm .JavaLanguage , logger = self .log
202- )
226+ self .run_d2d_step (d2d .map_jvm_to_class , jvm_lang = jvm .JavaLanguage )
203227
204228 @optional_step ("Java" )
205229 def map_jar_to_java_source (self ):
206230 """Map .jar files to their related source directory."""
207- d2d .map_jar_to_jvm_source (
208- project = self .project , jvm_lang = jvm .JavaLanguage , logger = self .log
209- )
231+ self .run_d2d_step (d2d .map_jar_to_jvm_source , jvm_lang = jvm .JavaLanguage )
210232
211233 @optional_step ("Scala" )
212234 def find_scala_packages (self ):
@@ -218,16 +240,12 @@ def find_scala_packages(self):
218240 @optional_step ("Scala" )
219241 def map_scala_to_class (self ):
220242 """Map a .class compiled file to its .scala source."""
221- d2d .map_jvm_to_class (
222- project = self .project , jvm_lang = jvm .ScalaLanguage , logger = self .log
223- )
243+ self .run_d2d_step (d2d .map_jvm_to_class , jvm_lang = jvm .ScalaLanguage )
224244
225245 @optional_step ("Scala" )
226246 def map_jar_to_scala_source (self ):
227247 """Map .jar files to their related source directory."""
228- d2d .map_jar_to_jvm_source (
229- project = self .project , jvm_lang = jvm .ScalaLanguage , logger = self .log
230- )
248+ self .run_d2d_step (d2d .map_jar_to_jvm_source , jvm_lang = jvm .ScalaLanguage )
231249
232250 @optional_step ("Kotlin" )
233251 def find_kotlin_packages (self ):
@@ -239,16 +257,12 @@ def find_kotlin_packages(self):
239257 @optional_step ("Kotlin" )
240258 def map_kotlin_to_class (self ):
241259 """Map a .class compiled file to its kotlin source."""
242- d2d .map_jvm_to_class (
243- project = self .project , jvm_lang = jvm .KotlinLanguage , logger = self .log
244- )
260+ self .run_d2d_step (d2d .map_jvm_to_class , jvm_lang = jvm .KotlinLanguage )
245261
246262 @optional_step ("Kotlin" )
247263 def map_jar_to_kotlin_source (self ):
248264 """Map .jar files to their related source directory."""
249- d2d .map_jar_to_jvm_source (
250- project = self .project , jvm_lang = jvm .KotlinLanguage , logger = self .log
251- )
265+ self .run_d2d_step (d2d .map_jar_to_jvm_source , jvm_lang = jvm .KotlinLanguage )
252266
253267 @optional_step ("Grammar" )
254268 def find_grammar_packages (self ):
@@ -260,16 +274,12 @@ def find_grammar_packages(self):
260274 @optional_step ("Grammar" )
261275 def map_grammar_to_class (self ):
262276 """Map a .class compiled file to its .g/.g4 source."""
263- d2d .map_jvm_to_class (
264- project = self .project , jvm_lang = jvm .GrammarLanguage , logger = self .log
265- )
277+ self .run_d2d_step (d2d .map_jvm_to_class , jvm_lang = jvm .GrammarLanguage )
266278
267279 @optional_step ("Grammar" )
268280 def map_jar_to_grammar_source (self ):
269281 """Map .jar files to their related source directory."""
270- d2d .map_jar_to_jvm_source (
271- project = self .project , jvm_lang = jvm .GrammarLanguage , logger = self .log
272- )
282+ self .run_d2d_step (d2d .map_jar_to_jvm_source , jvm_lang = jvm .GrammarLanguage )
273283
274284 @optional_step ("Groovy" )
275285 def find_groovy_packages (self ):
@@ -344,125 +354,115 @@ def find_xtend_packages(self):
344354 @optional_step ("Xtend" )
345355 def map_xtend_to_class (self ):
346356 """Map a .class compiled file to its xtend source."""
347- d2d .map_jvm_to_class (
348- project = self .project , jvm_lang = jvm .XtendLanguage , logger = self .log
349- )
357+ self .run_d2d_step (d2d .map_jvm_to_class , jvm_lang = jvm .XtendLanguage )
350358
351359 @optional_step ("JavaScript" )
352360 def map_javascript (self ):
353361 """
354362 Map a packed or minified JavaScript, TypeScript, CSS and SCSS
355363 to its source.
356364 """
357- d2d . map_javascript ( project = self . project , logger = self . log )
365+ self . run_d2d_step ( d2d . map_javascript )
358366
359367 @optional_step ("JavaScript" )
360368 def map_javascript_symbols (self ):
361369 """Map deployed JavaScript, TypeScript to its sources using symbols."""
362- d2d . map_javascript_symbols ( project = self . project , logger = self . log )
370+ self . run_d2d_step ( d2d . map_javascript_symbols )
363371
364372 @optional_step ("JavaScript" )
365373 def map_javascript_strings (self ):
366374 """Map deployed JavaScript, TypeScript to its sources using string literals."""
367- d2d . map_javascript_strings ( project = self . project , logger = self . log )
375+ self . run_d2d_step ( d2d . map_javascript_strings )
368376
369377 def get_symbols_from_binaries (self ):
370378 """Extract symbols from Elf, Mach0 and windows binaries for mapping."""
371- d2d .extract_binary_symbols (
372- project = self .project ,
373- options = self .selected_groups ,
374- logger = self .log ,
375- )
379+ self .run_d2d_step (d2d .extract_binary_symbols , options = self .selected_groups )
376380
377381 @optional_step ("Elf" )
378382 def map_elf (self ):
379383 """Map ELF binaries to their sources using dwarf paths and symbols."""
380- d2d . map_elfs_with_dwarf_paths ( project = self . project , logger = self . log )
381- d2d . map_elfs_binaries_with_symbols ( project = self . project , logger = self . log )
384+ self . run_d2d_step ( d2d . map_elfs_with_dwarf_paths )
385+ self . run_d2d_step ( d2d . map_elfs_binaries_with_symbols )
382386
383387 @optional_step ("MacOS" )
384388 def map_macho (self ):
385389 """Map mach0 binaries to their sources using symbols."""
386- d2d . map_macho_binaries_with_symbols ( project = self . project , logger = self . log )
390+ self . run_d2d_step ( d2d . map_macho_binaries_with_symbols )
387391
388392 @optional_step ("Windows" )
389393 def map_winpe (self ):
390394 """Map winpe binaries to their sources using symbols."""
391- d2d . map_winpe_binaries_with_symbols ( project = self . project , logger = self . log )
395+ self . run_d2d_step ( d2d . map_winpe_binaries_with_symbols )
392396
393397 @optional_step ("Go" )
394398 def map_go (self ):
395399 """Map Go binaries to their sources using paths and symbols."""
396- d2d . map_go_paths ( project = self . project , logger = self . log )
397- d2d . map_go_binaries_with_symbols ( project = self . project , logger = self . log )
400+ self . run_d2d_step ( d2d . map_go_paths )
401+ self . run_d2d_step ( d2d . map_go_binaries_with_symbols )
398402
399403 @optional_step ("Rust" )
400404 def map_rust (self ):
401405 """Map Rust binaries to their sources using symbols."""
402- d2d . map_rust_binaries_with_symbols ( project = self . project , logger = self . log )
406+ self . run_d2d_step ( d2d . map_rust_binaries_with_symbols )
403407
404408 @optional_step ("Python" )
405409 def map_python (self ):
406410 """
407411 Map binaries from Python packages to their sources using dwarf paths and
408412 symbols.
409413 """
410- d2d . map_python_pyx_to_binaries ( project = self . project , logger = self . log )
411- d2d . map_python_protobuf_files ( project = self . project , logger = self . log )
414+ self . run_d2d_step ( d2d . map_python_pyx_to_binaries )
415+ self . run_d2d_step ( d2d . map_python_protobuf_files )
412416
413417 def match_directories_to_purldb (self ):
414418 """Match selected directories in PurlDB."""
415419 if not purldb .is_available ():
416420 self .log ("PurlDB is not available. Skipping." )
417421 return
418422
419- d2d .match_purldb_directories (
420- project = self .project ,
421- logger = self .log ,
422- )
423+ self .run_d2d_step (d2d .match_purldb_directories )
423424
424425 def match_resources_to_purldb (self ):
425426 """Match selected files by extension in PurlDB."""
426427 if not purldb .is_available ():
427428 self .log ("PurlDB is not available. Skipping." )
428429 return
429430
430- d2d . match_purldb_resources (
431- project = self . project ,
431+ self . run_d2d_step (
432+ d2d . match_purldb_resources ,
432433 extensions = self .ecosystem_config .matchable_resource_extensions ,
433434 matcher_func = d2d .match_purldb_resource ,
434- logger = self .log ,
435435 )
436436
437437 @optional_step ("JavaScript" )
438438 def map_javascript_post_purldb_match (self ):
439439 """Map minified javascript file based on existing PurlDB match."""
440- d2d . map_javascript_post_purldb_match ( project = self . project , logger = self . log )
440+ self . run_d2d_step ( d2d . map_javascript_post_purldb_match )
441441
442442 @optional_step ("JavaScript" )
443443 def map_javascript_path (self ):
444444 """Map javascript file based on path."""
445- d2d . map_javascript_path ( project = self . project , logger = self . log )
445+ self . run_d2d_step ( d2d . map_javascript_path )
446446
447447 @optional_step ("JavaScript" )
448448 def map_javascript_colocation (self ):
449449 """Map JavaScript files based on neighborhood file mapping."""
450- d2d . map_javascript_colocation ( project = self . project , logger = self . log )
450+ self . run_d2d_step ( d2d . map_javascript_colocation )
451451
452452 @optional_step ("JavaScript" )
453453 def map_thirdparty_npm_packages (self ):
454454 """Map thirdparty package using package.json metadata."""
455- d2d . map_thirdparty_npm_packages ( project = self . project , logger = self . log )
455+ self . run_d2d_step ( d2d . map_thirdparty_npm_packages )
456456
457457 def map_path (self ):
458458 """Map using path similarities."""
459- d2d . map_path ( project = self . project , logger = self . log )
459+ self . run_d2d_step ( d2d . map_path )
460460
461461 def flag_mapped_resources_archives_and_ignored_directories (self ):
462462 """Flag all codebase resources that were mapped during the pipeline."""
463463 flag .flag_mapped_resources (self .project )
464464 flag .flag_ignored_directories (self .project )
465- d2d . flag_processed_archives ( self . project )
465+ self . run_d2d_step ( d2d . flag_processed_archives )
466466
467467 def perform_house_keeping_tasks (self ):
468468 """
@@ -476,17 +476,15 @@ def perform_house_keeping_tasks(self):
476476 On devel side
477477 - Update status for not deployed files.
478478 """
479- d2d . match_resources_with_no_java_source ( project = self . project , logger = self . log )
480- d2d . handle_dangling_deployed_legal_files ( project = self . project , logger = self . log )
481- d2d . ignore_unmapped_resources_from_config (
482- project = self . project ,
479+ self . run_d2d_step ( d2d . match_resources_with_no_java_source )
480+ self . run_d2d_step ( d2d . handle_dangling_deployed_legal_files )
481+ self . run_d2d_step (
482+ d2d . ignore_unmapped_resources_from_config ,
483483 patterns_to_ignore = self .ecosystem_config .deployed_resource_path_exclusions ,
484- logger = self .log ,
485484 )
486- d2d . match_unmapped_resources (
487- project = self . project ,
485+ self . run_d2d_step (
486+ d2d . match_unmapped_resources ,
488487 matched_extensions = self .ecosystem_config .matchable_resource_extensions ,
489- logger = self .log ,
490488 )
491489 d2d .flag_undeployed_resources (project = self .project )
492490
0 commit comments