Skip to content

Commit db92acb

Browse files
authored
Support unity package manager (#197)
Signed-off-by: jiyeong.seok <[email protected]>
1 parent 244434f commit db92acb

File tree

5 files changed

+109
-2
lines changed

5 files changed

+109
-2
lines changed

src/fosslight_dependency/_analyze_dependency.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from fosslight_dependency.package_manager.Go import Go
1919
from fosslight_dependency.package_manager.Nuget import Nuget
2020
from fosslight_dependency.package_manager.Helm import Helm
21+
from fosslight_dependency.package_manager.Unity import Unity
2122
import fosslight_util.constant as constant
2223

2324
logger = logging.getLogger(constant.LOGGER_NAME)
@@ -53,6 +54,8 @@ def analyze_dependency(package_manager_name, input_dir, output_dir, pip_activate
5354
package_manager = Nuget(input_dir, output_dir)
5455
elif package_manager_name == const.HELM:
5556
package_manager = Helm(input_dir, output_dir)
57+
elif package_manager_name == const.UNITY:
58+
package_manager = Unity(input_dir, output_dir)
5659
else:
5760
logger.error(f"Not supported package manager name: {package_manager_name}")
5861
ret = False

src/fosslight_dependency/_help.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
Go (Go)
2424
Nuget (.NET)
2525
Helm (Kubernetes)
26+
Unity (Unity)
2627
2728
Options:
2829
Optional

src/fosslight_dependency/constant.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
GO = 'go'
2323
NUGET = 'nuget'
2424
HELM = 'helm'
25+
UNITY = 'unity'
2526

2627
# Supported package name and manifest file
2728
SUPPORT_PACKAE = {
@@ -36,7 +37,8 @@
3637
CARTHAGE: 'Cartfile.resolved',
3738
GO: 'go.mod',
3839
NUGET: ['packages.config', os.path.join('obj', 'project.assets.json')],
39-
HELM: 'Chart.yaml'
40+
HELM: 'Chart.yaml',
41+
UNITY: os.path.join('Library', 'PackageManager', 'ProjectCache')
4042
}
4143

4244
# default android app name
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# Copyright (c) 2024 LG Electronics Inc.
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
import os
7+
import logging
8+
import re
9+
import yaml
10+
import fosslight_util.constant as constant
11+
import fosslight_dependency.constant as const
12+
from fosslight_dependency._package_manager import PackageManager
13+
from fosslight_dependency._package_manager import check_and_run_license_scanner, get_url_to_purl
14+
15+
logger = logging.getLogger(constant.LOGGER_NAME)
16+
proprietary_license = 'Proprietary License'
17+
unclassifed_license = 'UnclassifiedLicense'
18+
license_md = 'LICENSE.md'
19+
third_party_md = 'Third Party Notices.md'
20+
21+
22+
class Unity(PackageManager):
23+
package_manager_name = const.UNITY
24+
25+
input_file_name = const.SUPPORT_PACKAE.get(package_manager_name)
26+
packageCache_dir = os.path.join('Library', 'PackageCache')
27+
mirror_url = 'https://github.com/needle-mirror/'
28+
unity_internal_url = 'https://github.cds.internal.unity3d.com'
29+
third_notice_txt = 'third_party_notice.txt'
30+
31+
def __init__(self, input_dir, output_dir):
32+
super().__init__(self.package_manager_name, '', input_dir, output_dir)
33+
self.append_input_package_list_file(self.input_file_name)
34+
35+
def parse_oss_information(self, f_name):
36+
comment = ''
37+
38+
with open(f_name, 'r', encoding='utf8') as f:
39+
f_yml = yaml.safe_load(f)
40+
resolvedPkg = f_yml['m_ResolvedPackages']
41+
42+
try:
43+
sheet_list = []
44+
45+
for pkg_data in resolvedPkg:
46+
oss_name = pkg_data['name']
47+
oss_version = pkg_data['version']
48+
49+
oss_packagecache_dir = os.path.join(self.packageCache_dir, f'{oss_name}@{oss_version}')
50+
license_f = os.path.join(oss_packagecache_dir, license_md)
51+
if os.path.isfile(license_f):
52+
license_name = check_and_run_license_scanner(self.platform,
53+
self.license_scanner_bin,
54+
license_f)
55+
if license_name == unclassifed_license or license_name == '':
56+
with open(license_f, 'r', encoding='utf-8') as f:
57+
for line in f:
58+
matched_l = re.search(r'Unity\s[\s\w]*\sLicense', line)
59+
if matched_l:
60+
license_name = matched_l[0]
61+
break
62+
else:
63+
license_name = proprietary_license
64+
65+
third_f = os.path.join(oss_packagecache_dir, third_party_md)
66+
if os.path.isfile(third_f):
67+
with open(third_f, 'r', encoding='utf-8') as f:
68+
third_notice = f.readlines()
69+
with open(self.third_notice_txt, 'a+', encoding='utf-8') as tf:
70+
for line in third_notice:
71+
tf.write(line)
72+
tf.flush()
73+
74+
homepage = pkg_data['repository']['url']
75+
if homepage and homepage.startswith('git@'):
76+
homepage = homepage.replace('git@', 'https://')
77+
if homepage is None or homepage.startswith(self.unity_internal_url):
78+
if license_name != proprietary_license:
79+
homepage = f'{self.mirror_url}{oss_name}'
80+
if homepage is None:
81+
homepage = ''
82+
83+
dn_loc = homepage
84+
purl = get_url_to_purl(dn_loc, self.package_manager_name)
85+
if purl == 'None':
86+
purl = ''
87+
88+
comment_list = []
89+
if self.direct_dep:
90+
if pkg_data['isDirectDependency']:
91+
comment_list.append('direct')
92+
else:
93+
comment_list.append('transitive')
94+
95+
comment = ','.join(comment_list)
96+
sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
97+
'', '', comment, ''])
98+
except Exception as e:
99+
logger.error(f"Fail to parse unity oss information: {e}")
100+
101+
return sheet_list

src/fosslight_dependency/run_dependency_scanner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ def run_dependency_scanner(package_manager='', input_dir='', output_dir_file='',
161161
logger.warning("Dependency scanning terminated because the package manager was not found.")
162162
ret = False
163163
else:
164-
found_package_manager[package_manager] = ''
164+
found_package_manager[package_manager] = ["manual detect ('-m option')"]
165165

166166
pass_key = 'PASS'
167167
success_pm = []

0 commit comments

Comments
 (0)