Skip to content

Commit 75ffeb1

Browse files
committed
feat(1949): enable mapping multiple binaries with single source
Signed-off-by: rejzzzz <hoquerejwanulrh@gmail.com>
1 parent df61c28 commit 75ffeb1

2 files changed

Lines changed: 351 additions & 234 deletions

File tree

scanpipe/pipelines/deploy_to_develop.py

Lines changed: 79 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)