Skip to content

Commit d455c27

Browse files
authored
Merge pull request #71 from fosslight/develop
Support GO package manager
2 parents b35ceb5 + dafe37a commit d455c27

File tree

4 files changed

+112
-2
lines changed

4 files changed

+112
-2
lines changed

src/fosslight_dependency/_analyze_dependency.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from fosslight_dependency.package_manager.Android import Android
1616
from fosslight_dependency.package_manager.Swift import Swift
1717
from fosslight_dependency.package_manager.Carthage import Carthage
18+
from fosslight_dependency.package_manager.Go import Go
1819
import fosslight_util.constant as constant
1920

2021
logger = logging.getLogger(constant.LOGGER_NAME)
@@ -43,6 +44,8 @@ def analyze_dependency(package_manager_name, input_dir, output_dir, pip_activate
4344
package_manager = Swift(input_dir, output_dir, github_token)
4445
elif package_manager_name == const.CARTHAGE:
4546
package_manager = Carthage(input_dir, output_dir, github_token)
47+
elif package_manager_name == const.GO:
48+
package_manager = Go(input_dir, output_dir)
4649
else:
4750
logger.error("Not supported package manager name: " + package_manager_name)
4851
ret = False

src/fosslight_dependency/_help.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@
2020
Cocoapods (Swift/Obj-C)
2121
Swift (Swift)
2222
Carthage (Swift/Obj-C)
23+
Go (Go)
2324
2425
Options:
2526
Optional
2627
-h\t\t\t\t Print help message.
2728
-v\t\t\t\t Print the version of the script.
2829
-m <package_manager>\t Enter the package manager.
29-
\t(npm, maven, gradle, pip, pub, cocoapods, android, swift, carthage)
30+
\t(npm, maven, gradle, pip, pub, cocoapods, android, swift, carthage, go)
3031
-p <input_path>\t\t Enter the path where the script will be run.
3132
-o <output_path>\t\t Output path
3233
\t\t\t\t\t(If you want to generate the specific file name, add the output path with file name.)

src/fosslight_dependency/constant.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
ANDROID = 'android'
1919
SWIFT = 'swift'
2020
CARTHAGE = 'carthage'
21+
GO = 'go'
2122

2223
# Supported package name and manifest file
2324
SUPPORT_PACKAE = {
@@ -29,7 +30,8 @@
2930
COCOAPODS: 'Podfile.lock',
3031
ANDROID: 'build.gradle',
3132
SWIFT: 'Package.resolved',
32-
CARTHAGE: 'Cartfile.resolved'
33+
CARTHAGE: 'Cartfile.resolved',
34+
GO: 'go.mod'
3335
}
3436

3537
# default android app name
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# Copyright (c) 2021 LG Electronics Inc.
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
import os
7+
import logging
8+
import subprocess
9+
import re
10+
from bs4 import BeautifulSoup
11+
import urllib.request
12+
import fosslight_util.constant as constant
13+
import fosslight_dependency.constant as const
14+
from fosslight_dependency._package_manager import PackageManager
15+
16+
logger = logging.getLogger(constant.LOGGER_NAME)
17+
18+
19+
class Go(PackageManager):
20+
package_manager_name = const.GO
21+
22+
input_file_name = ''
23+
is_run_plugin = False
24+
dn_url = 'https://pkg.go.dev/'
25+
tmp_file_name = 'tmp_go_list.json'
26+
27+
def __init__(self, input_dir, output_dir):
28+
super().__init__(self.package_manager_name, self.dn_url, input_dir, output_dir)
29+
30+
def __del__(self):
31+
if os.path.isfile(self.tmp_file_name):
32+
os.remove(self.tmp_file_name)
33+
34+
def run_plugin(self):
35+
ret = True
36+
37+
logger.info("Execute 'go list -m all' to obtain package info.")
38+
cmd = "go list -m all > " + self.tmp_file_name
39+
40+
ret_cmd = subprocess.call(cmd, shell=True)
41+
if ret_cmd != 0:
42+
logger.error("Failed to make the result: " + cmd)
43+
ret = False
44+
45+
self.append_input_package_list_file(self.tmp_file_name)
46+
47+
return ret
48+
49+
def parse_oss_information(self, f_name):
50+
with open(f_name, 'r', encoding='utf8') as input_fp:
51+
sheet_list = []
52+
for i, line in enumerate(input_fp.readlines()):
53+
54+
re_result = re.findall(r'(\S+)\s?(\S*)', line)
55+
try:
56+
package_path = re_result[0][0]
57+
oss_name = self.package_manager_name + ":" + package_path
58+
oss_version = re_result[0][1]
59+
60+
tmp_dn_loc = self.dn_url + package_path
61+
if oss_version:
62+
dn_loc = tmp_dn_loc + '@' + oss_version
63+
else:
64+
dn_loc = tmp_dn_loc
65+
66+
license_name = ''
67+
homepage = ''
68+
comment = ''
69+
70+
for dn_loc_i in [dn_loc, tmp_dn_loc]:
71+
try:
72+
res = urllib.request.urlopen(dn_loc_i)
73+
if res.getcode() == 200:
74+
urlopen_success = True
75+
if dn_loc_i == tmp_dn_loc:
76+
if oss_version:
77+
comment = 'Cannot connect ' \
78+
+ dn_loc \
79+
+ ', so use the latest version page to get the license, homepage.'
80+
dn_loc = tmp_dn_loc
81+
break
82+
except Exception:
83+
continue
84+
85+
if urlopen_success:
86+
content = res.read().decode('utf8')
87+
bs_obj = BeautifulSoup(content, 'html.parser')
88+
89+
license_data = bs_obj.find('a', {'data-test-id': 'UnitHeader-license'})
90+
if license_data:
91+
license_name = license_data.text
92+
93+
repository_data = bs_obj.find('div', {'class': 'UnitMeta-repo'})
94+
if repository_data:
95+
homepage = repository_data.find('a')['href']
96+
97+
except Exception as e:
98+
logging.warning("Fail to parse " + line + ": " + str(e))
99+
continue
100+
101+
sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
102+
oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment])
103+
104+
return sheet_list

0 commit comments

Comments
 (0)