forked from chaoss/grimoirelab-graal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscancode.py
89 lines (73 loc) · 3 KB
/
scancode.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# -*- coding: utf-8 -*- the Graal backend.
#
# Copyright (C) 2015-2019 Bitergia
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA.
#
# Authors:
# Valerio Cosentino <[email protected]>
#
import json
import subprocess
from graal.graal import (GraalError,
GraalRepository)
from .analyzer import Analyzer
class ScanCode(Analyzer):
"""A wrapper for nexB/scancode-toolkit.
This class allows to call scancode-toolkit over a file, parses
the result of the analysis and returns it as a dict.
:param exec_path: path of the scancode executable
"""
version = '0.1.0'
def __init__(self, exec_path):
if not GraalRepository.exists(exec_path):
raise GraalError(cause="executable path %s not valid" % exec_path)
self.exec_path = exec_path
_ = subprocess.check_output([self.exec_path, '--help']).decode("utf-8")
def analyze(self, **kwargs):
"""Add information about license
:param file_path: file path
:returns result: dict of the results of the analysis
"""
result = {'files': []}
try:
exec_path = self.exec_path.replace('scancode-toolkit/scancode', 'scancode-toolkit/etc/scripts/scancli.py')
cmd_scancli = ['python3', exec_path]
cmd_scancli.extend(kwargs['file_paths'])
msg = subprocess.check_output(cmd_scancli).decode("utf-8")
except subprocess.CalledProcessError as e:
raise GraalError(cause="Scancode failed at %s, %s" % (' '.join(kwargs['file_paths']),
e.output.decode("utf-8")))
finally:
subprocess._cleanup()
output_content = ''
outputs_json = []
for line in msg.split('\n'):
if line == '':
if output_content:
output_json = json.loads(output_content)[1:]
outputs_json.append(output_json)
output_content = ''
else:
continue
else:
output_content += line
if output_content:
output_json = json.loads(output_content)[1:]
outputs_json.append(output_json)
for output_json in outputs_json:
file_info = output_json[0]['files'][0]
result['files'].append(file_info)
return result