9
9
import shutil
10
10
from bs4 import BeautifulSoup as bs
11
11
from xml .etree .ElementTree import parse
12
+ import re
12
13
import fosslight_util .constant as constant
13
14
import fosslight_dependency .constant as const
14
15
from fosslight_dependency ._package_manager import PackageManager
@@ -24,6 +25,7 @@ class Maven(PackageManager):
24
25
input_file_name = os .path .join ('target' , 'generated-resources' , 'licenses.xml' )
25
26
is_run_plugin = False
26
27
output_custom_dir = ''
28
+ dependency_tree = {}
27
29
28
30
def __init__ (self , input_dir , output_dir , output_custom_dir ):
29
31
super ().__init__ (self .package_manager_name , self .dn_url , input_dir , output_dir )
@@ -127,20 +129,41 @@ def clean_run_maven_plugin_output(self):
127
129
shutil .rmtree (top_path )
128
130
129
131
def run_maven_plugin (self ):
132
+ dependency_tree_fname = 'tmp_dependency_tree.txt'
133
+
130
134
logger .info ('Run maven license scanning plugin with temporary pom.xml' )
131
135
if os .path .isfile ('mvnw' ) or os .path .isfile ('mvnw.cmd' ):
132
136
if self .platform == const .WINDOWS :
133
- cmd = "mvnw.cmd"
137
+ cmd_mvn = "mvnw.cmd"
134
138
else :
135
- cmd = "./mvnw"
139
+ cmd_mvn = "./mvnw"
136
140
else :
137
- cmd = "mvn"
138
- cmd += " license:aggregate-download-licenses"
141
+ cmd_mvn = "mvn"
142
+ cmd = cmd_mvn + " license:aggregate-download-licenses"
139
143
140
144
ret = subprocess .call (cmd , shell = True )
141
145
if ret != 0 :
142
146
logger .error ("Failed to run maven plugin: " + cmd )
143
147
148
+ cmd = cmd_mvn + " dependency:tree > " + dependency_tree_fname
149
+ ret = subprocess .call (cmd , shell = True )
150
+ if ret != 0 :
151
+ logger .error ("Failed to run: " + cmd )
152
+ else :
153
+ self .parse_dependency_tree (dependency_tree_fname )
154
+ os .remove (dependency_tree_fname )
155
+
156
+ def parse_dependency_tree (self , f_name ):
157
+ with open (f_name , 'r' , encoding = 'utf8' ) as input_fp :
158
+ for i , line in enumerate (input_fp .readlines ()):
159
+ try :
160
+ re_result = re .findall (r'[\+|\\]\-\s([^\:\s]+\:[^\:\s]+)\:(?:[^\:\s]+)\:([^\:\s]+)\:([^\:\s]+)' , line )
161
+ if re_result :
162
+ dependency_key = re_result [0 ][0 ] + ':' + re_result [0 ][1 ]
163
+ self .dependency_tree [dependency_key ] = re_result [0 ][2 ]
164
+ except Exception as e :
165
+ logger .error ("Failed to parse dependency tree: " + str (e ))
166
+
144
167
def parse_oss_information (self , f_name ):
145
168
with open (f_name , 'r' , encoding = 'utf8' ) as input_fp :
146
169
tree = parse (input_fp )
@@ -171,7 +194,15 @@ def parse_oss_information(self, f_name):
171
194
# Case that doesn't include License tag value.
172
195
license_name = ''
173
196
197
+ try :
198
+ comment = ''
199
+ dependency_tree_key = oss_name + ':' + version
200
+ if dependency_tree_key in self .dependency_tree .keys ():
201
+ comment = self .dependency_tree [dependency_tree_key ]
202
+ except Exception as e :
203
+ logger .error ("Fail to find oss scope in dependency tree: " + str (e ))
204
+
174
205
sheet_list .append ([const .SUPPORT_PACKAE .get (self .package_manager_name ),
175
- oss_name , oss_version , license_name , dn_loc , homepage , '' , '' , '' ])
206
+ oss_name , oss_version , license_name , dn_loc , homepage , '' , '' , comment ])
176
207
177
208
return sheet_list
0 commit comments