@@ -68,11 +68,12 @@ def __del__(self):
6868 self .package_name = ''
6969
7070 def run_plugin (self ):
71+ ret = True
7172 if self .package_manager_name == const .GRADLE or self .package_manager_name == const .ANDROID :
72- self .run_gradle_task ()
73+ ret = self .run_gradle_task ()
7374 else :
7475 logger .info (f"This package manager({ self .package_manager_name } ) skips the step to run plugin." )
75- return True
76+ return ret
7677
7778 def append_input_package_list_file (self , input_package_file ):
7879 self .input_package_list_file .append (input_package_file )
@@ -87,35 +88,101 @@ def parse_direct_dependencies(self):
8788 pass
8889
8990 def run_gradle_task (self ):
91+ ret_task = True
9092 if os .path .isfile (const .SUPPORT_PACKAE .get (self .package_manager_name )):
9193 gradle_backup = f'{ const .SUPPORT_PACKAE .get (self .package_manager_name )} _bk'
9294
9395 shutil .copy (const .SUPPORT_PACKAE .get (self .package_manager_name ), gradle_backup )
94- ret = self .add_allDeps_in_gradle ()
95- if ret :
96- try :
97- if os .path .isfile ('gradlew' ) or os .path .isfile ('gradlew.bat' ):
98- if self .platform == const .WINDOWS :
99- cmd_gradle = "gradlew.bat"
100- else :
101- cmd_gradle = "./gradlew"
102-
103- cmd = f"{ cmd_gradle } allDeps"
96+ ret_alldeps = self .add_allDeps_in_gradle ()
97+
98+ ret_plugin = False
99+ if (self .package_manager_name == const .ANDROID ):
100+ module_build_gradle = os .path .join (self .app_name , const .SUPPORT_PACKAE .get (self .package_manager_name ))
101+ module_gradle_backup = f'{ module_build_gradle } _bk'
102+ if os .path .isfile (module_build_gradle ) and (not os .path .isfile (self .input_file_name )):
103+ shutil .copy (module_build_gradle , module_gradle_backup )
104+ ret_plugin = self .add_android_plugin_in_gradle (module_build_gradle )
105+
106+ if os .path .isfile ('gradlew' ) or os .path .isfile ('gradlew.bat' ):
107+ if self .platform == const .WINDOWS :
108+ cmd_gradle = "gradlew.bat"
109+ else :
110+ cmd_gradle = "./gradlew"
111+ else :
112+ ret_task = False
113+ logger .warning ('No gradlew file exists. (skip to find dependencies relationship.' )
114+ if ret_plugin :
115+ logger .warning ('Also it cannot run android-dependency-scanning plugin.' )
116+ if ret_task :
117+ if ret_alldeps :
118+ cmd = f"{ cmd_gradle } allDeps"
119+ try :
104120 ret = subprocess .check_output (cmd , shell = True , encoding = 'utf-8' )
105121 if ret != 0 :
106122 self .parse_dependency_tree (ret )
107123 else :
108124 self .set_direct_dependencies (False )
109125 logger .warning ("Failed to run allDeps task." )
110- except Exception as e :
111- self .set_direct_dependencies (False )
112- logger .error (f'Fail to run allDeps: { e } ' )
113- logger .warning ('It cannot print the direct/transitive dependencies relationship.' )
126+ except Exception as e :
127+ self .set_direct_dependencies (False )
128+ logger .error (f'Fail to run { cmd } : { e } ' )
129+ logger .warning ('It cannot print the direct/transitive dependencies relationship.' )
130+
131+ if ret_plugin :
132+ cmd = f"{ cmd_gradle } generateLicenseTxt"
133+ try :
134+ ret = subprocess .check_output (cmd , shell = True , encoding = 'utf-8' )
135+ if ret == 0 :
136+ ret_task = False
137+ logger .error (f'Fail to run { cmd } ' )
138+ if os .path .isfile (self .input_file_name ):
139+ logger .info ('Automatically run android-dependency-scanning plugin and generate output.' )
140+ self .plugin_auto_run = True
141+ else :
142+ logger .warning ('Automatically run android-dependency-scanning plugin, but fail to generate output.' )
143+ except Exception as e :
144+ logger .error (f'Fail to run { cmd } : { e } ' )
145+ ret_task = False
114146
115147 if os .path .isfile (gradle_backup ):
116148 os .remove (const .SUPPORT_PACKAE .get (self .package_manager_name ))
117149 shutil .move (gradle_backup , const .SUPPORT_PACKAE .get (self .package_manager_name ))
118150
151+ if (self .package_manager_name == const .ANDROID ):
152+ if os .path .isfile (module_gradle_backup ):
153+ os .remove (module_build_gradle )
154+ shutil .move (module_gradle_backup , module_build_gradle )
155+ return ret_task
156+
157+ def add_android_plugin_in_gradle (self , module_build_gradle ):
158+ ret = False
159+ build_script = '''buildscript {
160+ repositories {
161+ mavenCentral()
162+ }
163+ dependencies {
164+ //Android dependency scanning Plugin
165+ classpath 'org.fosslight:android-dependency-scanning:+'
166+ }
167+ }'''
168+ apply = "apply plugin: 'org.fosslight'\n "
169+ try :
170+ with open (const .SUPPORT_PACKAE .get (self .package_manager_name ), 'r' , encoding = 'utf-8' ) as original :
171+ data = original .read ()
172+ with open (const .SUPPORT_PACKAE .get (self .package_manager_name ), 'w' , encoding = 'utf-8' ) as modified :
173+ modified .write (f"{ build_script } \n { data } " )
174+ ret = True
175+ except Exception as e :
176+ logging .warning (f"Cannot add the buildscript task in build.gradle: { e } " )
177+
178+ try :
179+ with open (module_build_gradle , 'a' , encoding = 'utf-8' ) as modified :
180+ modified .write (f'\n { apply } \n ' )
181+ ret = True
182+ except Exception as e :
183+ logging .warning (f"Cannot add the apply plugin in { module_build_gradle } : { e } " )
184+ return ret
185+
119186 def add_allDeps_in_gradle (self ):
120187 ret = False
121188 config = android_config if self .package_manager_name == 'android' else gradle_config
0 commit comments