33import typer
44
55from cycode .cli import consts
6+ from cycode .cli .files_collector .repository_documents import get_file_content_from_commit_path
67from cycode .cli .files_collector .sca .base_restore_dependencies import BaseRestoreDependencies
78from cycode .cli .files_collector .sca .go .restore_go_dependencies import RestoreGoDependencies
89from cycode .cli .files_collector .sca .maven .restore_gradle_dependencies import RestoreGradleDependencies
1718from cycode .logger import get_logger
1819
1920if TYPE_CHECKING :
20- from git import Diff , Repo
21+ from git import Repo
2122
2223BUILD_DEP_TREE_TIMEOUT = 180
2324
2425
25- logger = get_logger ('SCA Code Scanner' )
26+ logger = get_logger ('SCA File Collector' )
27+
28+
29+ def _add_ecosystem_related_files_if_exists (
30+ documents : list [Document ], repo : Optional ['Repo' ] = None , commit_rev : Optional [str ] = None
31+ ) -> None :
32+ documents_to_add : list [Document ] = []
33+ for doc in documents :
34+ ecosystem = _get_project_file_ecosystem (doc )
35+ if ecosystem is None :
36+ logger .debug ('Failed to resolve project file ecosystem: %s' , doc .path )
37+ continue
38+
39+ documents_to_add .extend (_get_doc_ecosystem_related_project_files (doc , documents , ecosystem , commit_rev , repo ))
40+
41+ documents .extend (documents_to_add )
2642
2743
2844def perform_pre_commit_range_scan_actions (
@@ -33,40 +49,25 @@ def perform_pre_commit_range_scan_actions(
3349 to_commit_rev : str ,
3450) -> None :
3551 repo = git_proxy .get_repo (path )
36- add_ecosystem_related_files_if_exists (from_commit_documents , repo , from_commit_rev )
37- add_ecosystem_related_files_if_exists (to_commit_documents , repo , to_commit_rev )
52+ _add_ecosystem_related_files_if_exists (from_commit_documents , repo , from_commit_rev )
53+ _add_ecosystem_related_files_if_exists (to_commit_documents , repo , to_commit_rev )
3854
3955
4056def perform_pre_hook_range_scan_actions (
4157 repo_path : str , git_head_documents : list [Document ], pre_committed_documents : list [Document ]
4258) -> None :
4359 repo = git_proxy .get_repo (repo_path )
44- add_ecosystem_related_files_if_exists (git_head_documents , repo , consts .GIT_HEAD_COMMIT_REV )
45- add_ecosystem_related_files_if_exists (pre_committed_documents )
46-
47-
48- def add_ecosystem_related_files_if_exists (
49- documents : list [Document ], repo : Optional ['Repo' ] = None , commit_rev : Optional [str ] = None
50- ) -> None :
51- documents_to_add : list [Document ] = []
52- for doc in documents :
53- ecosystem = get_project_file_ecosystem (doc )
54- if ecosystem is None :
55- logger .debug ('Failed to resolve project file ecosystem: %s' , doc .path )
56- continue
60+ _add_ecosystem_related_files_if_exists (git_head_documents , repo , consts .GIT_HEAD_COMMIT_REV )
61+ _add_ecosystem_related_files_if_exists (pre_committed_documents )
5762
58- documents_to_add .extend (get_doc_ecosystem_related_project_files (doc , documents , ecosystem , commit_rev , repo ))
59-
60- documents .extend (documents_to_add )
6163
62-
63- def get_doc_ecosystem_related_project_files (
64+ def _get_doc_ecosystem_related_project_files (
6465 doc : Document , documents : list [Document ], ecosystem : str , commit_rev : Optional [str ], repo : Optional ['Repo' ]
6566) -> list [Document ]:
6667 documents_to_add : list [Document ] = []
6768 for ecosystem_project_file in consts .PROJECT_FILES_BY_ECOSYSTEM_MAP .get (ecosystem ):
6869 file_to_search = join_paths (get_file_dir (doc .path ), ecosystem_project_file )
69- if not is_project_file_exists_in_documents (documents , file_to_search ):
70+ if not _is_project_file_exists_in_documents (documents , file_to_search ):
7071 if repo :
7172 file_content = get_file_content_from_commit_path (repo , commit_rev , file_to_search )
7273 else :
@@ -78,19 +79,23 @@ def get_doc_ecosystem_related_project_files(
7879 return documents_to_add
7980
8081
81- def is_project_file_exists_in_documents (documents : list [Document ], file : str ) -> bool :
82+ def _is_project_file_exists_in_documents (documents : list [Document ], file : str ) -> bool :
8283 return any (doc for doc in documents if file == doc .path )
8384
8485
85- def get_project_file_ecosystem (document : Document ) -> Optional [str ]:
86+ def _get_project_file_ecosystem (document : Document ) -> Optional [str ]:
8687 for ecosystem , project_files in consts .PROJECT_FILES_BY_ECOSYSTEM_MAP .items ():
8788 for project_file in project_files :
8889 if document .path .endswith (project_file ):
8990 return ecosystem
9091 return None
9192
9293
93- def try_restore_dependencies (
94+ def _get_manifest_file_path (document : Document , is_monitor_action : bool , project_path : str ) -> str :
95+ return join_paths (project_path , document .path ) if is_monitor_action else document .path
96+
97+
98+ def _try_restore_dependencies (
9499 ctx : typer .Context ,
95100 restore_dependencies : 'BaseRestoreDependencies' ,
96101 document : Document ,
@@ -110,34 +115,13 @@ def try_restore_dependencies(
110115 is_monitor_action = ctx .obj .get ('monitor' , False )
111116 project_path = get_path_from_context (ctx )
112117
113- manifest_file_path = get_manifest_file_path (document , is_monitor_action , project_path )
118+ manifest_file_path = _get_manifest_file_path (document , is_monitor_action , project_path )
114119 logger .debug ('Succeeded to generate dependencies tree on path: %s' , manifest_file_path )
115120
116121 return restore_dependencies_document
117122
118123
119- def add_dependencies_tree_document (
120- ctx : typer .Context , documents_to_scan : list [Document ], is_git_diff : bool = False
121- ) -> None :
122- documents_to_add : dict [str , Document ] = {document .path : document for document in documents_to_scan }
123- restore_dependencies_list = restore_handlers (ctx , is_git_diff )
124-
125- for restore_dependencies in restore_dependencies_list :
126- for document in documents_to_scan :
127- restore_dependencies_document = try_restore_dependencies (ctx , restore_dependencies , document )
128- if restore_dependencies_document is None :
129- continue
130-
131- if restore_dependencies_document .path in documents_to_add :
132- logger .debug ('Duplicate document on restore for path: %s' , restore_dependencies_document .path )
133- else :
134- documents_to_add [restore_dependencies_document .path ] = restore_dependencies_document
135-
136- # mutate original list using slice assignment
137- documents_to_scan [:] = list (documents_to_add .values ())
138-
139-
140- def restore_handlers (ctx : typer .Context , is_git_diff : bool ) -> list [BaseRestoreDependencies ]:
124+ def _get_restore_handlers (ctx : typer .Context , is_git_diff : bool ) -> list [BaseRestoreDependencies ]:
141125 return [
142126 RestoreGradleDependencies (ctx , is_git_diff , BUILD_DEP_TREE_TIMEOUT ),
143127 RestoreMavenDependencies (ctx , is_git_diff , BUILD_DEP_TREE_TIMEOUT ),
@@ -149,28 +133,38 @@ def restore_handlers(ctx: typer.Context, is_git_diff: bool) -> list[BaseRestoreD
149133 ]
150134
151135
152- def get_manifest_file_path (document : Document , is_monitor_action : bool , project_path : str ) -> str :
153- return join_paths (project_path , document .path ) if is_monitor_action else document .path
136+ def _add_dependencies_tree_documents (
137+ ctx : typer .Context , documents_to_scan : list [Document ], is_git_diff : bool = False
138+ ) -> None :
139+ logger .debug (
140+ 'Adding dependencies tree documents, %s' ,
141+ {'documents_count' : len (documents_to_scan ), 'is_git_diff' : is_git_diff },
142+ )
154143
144+ documents_to_add : dict [str , Document ] = {document .path : document for document in documents_to_scan }
145+ restore_dependencies_list = _get_restore_handlers (ctx , is_git_diff )
155146
156- def get_file_content_from_commit_path ( repo : 'Repo' , commit : str , file_path : str ) -> Optional [ str ] :
157- try :
158- return repo . git . show ( f' { commit } : { file_path } ' )
159- except git_proxy . get_git_command_error () :
160- return None
147+ for restore_dependencies in restore_dependencies_list :
148+ for document in documents_to_scan :
149+ restore_dependencies_document = _try_restore_dependencies ( ctx , restore_dependencies , document )
150+ if restore_dependencies_document is None :
151+ continue
161152
153+ if restore_dependencies_document .path in documents_to_add :
154+ logger .debug ('Duplicate document on restore for path: %s' , restore_dependencies_document .path )
155+ else :
156+ logger .debug ('Adding dependencies tree document, %s' , restore_dependencies_document .path )
157+ documents_to_add [restore_dependencies_document .path ] = restore_dependencies_document
162158
163- def get_file_content_from_commit_diff (repo : 'Repo' , commit : str , diff : 'Diff' ) -> Optional [str ]:
164- from cycode .cli .files_collector .repository_documents import get_diff_file_path
159+ logger .debug ('Finished adding dependencies tree documents, %s' , {'documents_count' : len (documents_to_add )})
165160
166- file_path = get_diff_file_path ( diff , relative = True )
167- return get_file_content_from_commit_path ( repo , commit , file_path )
161+ # mutate original list using slice assignment
162+ documents_to_scan [:] = list ( documents_to_add . values () )
168163
169164
170- def perform_pre_scan_documents_actions (
165+ def add_sca_dependencies_tree_documents_if_needed (
171166 ctx : typer .Context , scan_type : str , documents_to_scan : list [Document ], is_git_diff : bool = False
172167) -> None :
173168 no_restore = ctx .params .get ('no-restore' , False )
174169 if scan_type == consts .SCA_SCAN_TYPE and not no_restore :
175- logger .debug ('Perform pre-scan document add_dependencies_tree_document action' )
176- add_dependencies_tree_document (ctx , documents_to_scan , is_git_diff )
170+ _add_dependencies_tree_documents (ctx , documents_to_scan , is_git_diff )
0 commit comments