openubmc-bingo 0.5.275__py3-none-any.whl → 0.5.277__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of openubmc-bingo might be problematic. Click here for more details.
- bmcgo/__init__.py +1 -1
- bmcgo/functional/csr_build.py +10 -2
- bmcgo/tasks/task_build_conan.py +34 -13
- bmcgo/utils/installations/install_plans/qemu.yml +6 -0
- bmcgo/utils/installations/install_plans/studio.yml +6 -0
- bmcgo/utils/installations/install_workflow.py +28 -2
- bmcgo/utils/merge_csr.py +124 -0
- {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.5.277.dist-info}/METADATA +1 -1
- {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.5.277.dist-info}/RECORD +12 -9
- {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.5.277.dist-info}/WHEEL +0 -0
- {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.5.277.dist-info}/entry_points.txt +0 -0
- {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.5.277.dist-info}/top_level.txt +0 -0
bmcgo/__init__.py
CHANGED
bmcgo/functional/csr_build.py
CHANGED
|
@@ -35,6 +35,7 @@ from bmcgo import errors
|
|
|
35
35
|
from bmcgo.misc import CommandInfo
|
|
36
36
|
from bmcgo.utils.tools import Tools
|
|
37
37
|
from bmcgo.utils.buffer import Buffer
|
|
38
|
+
from bmcgo.utils.merge_csr import Merger
|
|
38
39
|
from bmcgo.bmcgo_config import BmcgoConfig
|
|
39
40
|
from bmcgo.functional.simple_sign import BmcgoCommand as SimpleSign
|
|
40
41
|
|
|
@@ -205,6 +206,8 @@ class BmcgoCommand:
|
|
|
205
206
|
self.target_dir = None
|
|
206
207
|
self.eeprom_sign_strategy = None
|
|
207
208
|
self.hpm_sign_strategy = None
|
|
209
|
+
self.tmp_dir = None
|
|
210
|
+
self.merger = Merger(self.output_path)
|
|
208
211
|
|
|
209
212
|
@staticmethod
|
|
210
213
|
def get_oem_data(dir_path: str, comp_name: str):
|
|
@@ -294,6 +297,9 @@ class BmcgoCommand:
|
|
|
294
297
|
|
|
295
298
|
def run(self):
|
|
296
299
|
self.check_args()
|
|
300
|
+
tmp = tempfile.TemporaryDirectory()
|
|
301
|
+
self.tmp_dir = tmp.name
|
|
302
|
+
self.merger.update_tmp_dir(self.tmp_dir)
|
|
297
303
|
if not os.path.exists(self.output_path):
|
|
298
304
|
raise Exception(f"输出路径{self.output_path}不存在")
|
|
299
305
|
sr_make_options_list = []
|
|
@@ -338,6 +344,8 @@ class BmcgoCommand:
|
|
|
338
344
|
finally:
|
|
339
345
|
if os.path.exists(self.work_dir):
|
|
340
346
|
shutil.rmtree(self.work_dir)
|
|
347
|
+
if os.path.exists(self.tmp_dir):
|
|
348
|
+
shutil.rmtree(self.tmp_dir)
|
|
341
349
|
|
|
342
350
|
def check_args(self):
|
|
343
351
|
has_single_need_arg = self.bin or self.json or self.hpm or self.all
|
|
@@ -351,7 +359,7 @@ class BmcgoCommand:
|
|
|
351
359
|
|
|
352
360
|
def get_sr_file_and_oem(self):
|
|
353
361
|
sr_make_options_list = []
|
|
354
|
-
csr_path = self.csr_path
|
|
362
|
+
csr_path = self.merger.get_single_csr(self.csr_path)
|
|
355
363
|
oem_path = self.oem_path
|
|
356
364
|
oem_data = bytearray()
|
|
357
365
|
if not os.path.exists(csr_path):
|
|
@@ -382,7 +390,7 @@ class BmcgoCommand:
|
|
|
382
390
|
|
|
383
391
|
def get_sr_files(self):
|
|
384
392
|
dir_path = Path(self.csr_path)
|
|
385
|
-
sr_files =
|
|
393
|
+
sr_files = self.merger.get_multi_files(dir_path)
|
|
386
394
|
sr_num = len(sr_files)
|
|
387
395
|
if sr_num == 1:
|
|
388
396
|
log.info("开始执行CSR出包任务...")
|
bmcgo/tasks/task_build_conan.py
CHANGED
|
@@ -44,6 +44,16 @@ from bmcgo.component.component_helper import ComponentHelper
|
|
|
44
44
|
IBMC_LOCK_FILE = "openubmc.lock"
|
|
45
45
|
SDK_ROOT = "/opt/hi1711sdk"
|
|
46
46
|
SDK_ROOT_MODULE_SYMVERS = os.path.join(SDK_ROOT, "Module.symvers")
|
|
47
|
+
PERSIST_TYPES = {
|
|
48
|
+
"TemporaryPer": "TemporaryPer",
|
|
49
|
+
"TemporaryPerRetain": "TemporaryPer",
|
|
50
|
+
"ResetPer": "ResetPer",
|
|
51
|
+
"ResetPerRetain": "ResetPer",
|
|
52
|
+
"PoweroffPer": "PoweroffPer",
|
|
53
|
+
"PoweroffPerRetain": "PoweroffPer",
|
|
54
|
+
"PermanentPer": "PermanentPer"
|
|
55
|
+
}
|
|
56
|
+
PRIMARY_KEYS = "PrimaryKeys"
|
|
47
57
|
tools = Tools()
|
|
48
58
|
|
|
49
59
|
|
|
@@ -244,6 +254,13 @@ class TaskClass(Task):
|
|
|
244
254
|
subsys = os.path.join(subsys, misc.StageEnum.STAGE_RC.value)
|
|
245
255
|
return subsys
|
|
246
256
|
|
|
257
|
+
@staticmethod
|
|
258
|
+
def match_persist_type(usage):
|
|
259
|
+
for item in usage:
|
|
260
|
+
if item in PERSIST_TYPES:
|
|
261
|
+
return PERSIST_TYPES[item]
|
|
262
|
+
return None
|
|
263
|
+
|
|
247
264
|
def find_conan_package_and_write(self, search, comps, file_handler, stage):
|
|
248
265
|
if search.find("/") < 0:
|
|
249
266
|
search += "/"
|
|
@@ -421,7 +438,8 @@ class TaskClass(Task):
|
|
|
421
438
|
"TemporaryPer": {},
|
|
422
439
|
"ResetPer": {},
|
|
423
440
|
"PoweroffPer": {},
|
|
424
|
-
"PermanentPer": {}
|
|
441
|
+
"PermanentPer": {},
|
|
442
|
+
"PrimaryKeys": {}
|
|
425
443
|
}
|
|
426
444
|
for comp in comps:
|
|
427
445
|
try:
|
|
@@ -435,17 +453,20 @@ class TaskClass(Task):
|
|
|
435
453
|
self.run_command(f"cp -df {temp_dst_file} {dst_file}", sudo=True)
|
|
436
454
|
self.run_command(f"rm -rf {temp_dst_file}", sudo=True)
|
|
437
455
|
|
|
438
|
-
def proc_sensitive(self,
|
|
439
|
-
for
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
456
|
+
def proc_sensitive(self, table_type, props, table_name, output):
|
|
457
|
+
for prop_key, prop_data in props.items():
|
|
458
|
+
prop_name = prop_key
|
|
459
|
+
if "alias" in prop_data:
|
|
460
|
+
prop_name = prop_data.get("alias")
|
|
461
|
+
if prop_data.get("primaryKey"):
|
|
462
|
+
output[PRIMARY_KEYS][table_name] = output[PRIMARY_KEYS].get(table_name, {})
|
|
463
|
+
output[PRIMARY_KEYS][table_name][prop_name] = prop_data.get("sensitive", False)
|
|
464
|
+
continue
|
|
465
|
+
per_type = self.match_persist_type(prop_data.get("usage", [])) or table_type
|
|
466
|
+
if not per_type:
|
|
446
467
|
continue
|
|
447
468
|
output[per_type][table_name] = output[per_type].get(table_name, {})
|
|
448
|
-
output[per_type][table_name][prop_name] =
|
|
469
|
+
output[per_type][table_name][prop_name] = prop_data.get("sensitive", False)
|
|
449
470
|
return output
|
|
450
471
|
|
|
451
472
|
def proc_comp(self, comp, output):
|
|
@@ -455,15 +476,15 @@ class TaskClass(Task):
|
|
|
455
476
|
with open(model_file, "r") as fp:
|
|
456
477
|
content = json.load(fp)
|
|
457
478
|
for class_data in content.values():
|
|
458
|
-
|
|
479
|
+
table_type = PERSIST_TYPES.get(class_data.get("tableType", ""))
|
|
459
480
|
table_name = class_data.get("tableName", "")
|
|
460
|
-
if not table_name:
|
|
481
|
+
if not table_name or class_data.get("tableLocation") == "Local":
|
|
461
482
|
continue
|
|
462
483
|
class_props = [class_data.get("properties", {})]
|
|
463
484
|
for intf_data in class_data.get("interfaces", {}).values():
|
|
464
485
|
class_props.append(intf_data.get("properties", {}))
|
|
465
486
|
for props in class_props:
|
|
466
|
-
output = self.proc_sensitive(
|
|
487
|
+
output = self.proc_sensitive(table_type, props, table_name, output)
|
|
467
488
|
return output
|
|
468
489
|
|
|
469
490
|
def calc_options(self):
|
|
@@ -26,6 +26,20 @@ class InstallWorkflow:
|
|
|
26
26
|
_workflows: Dict[str, List[str]] = {}
|
|
27
27
|
search_paths: List[Path] = [Path(__file__).resolve().parent / install_consts.PLUGIN_INSTALL_PLAN_PATH]
|
|
28
28
|
|
|
29
|
+
@staticmethod
|
|
30
|
+
def tool_exists(tool_name: str, install_type: str):
|
|
31
|
+
try:
|
|
32
|
+
if install_type == "pip":
|
|
33
|
+
ret = tools.run_command(f"pip show {tool_name}", capture_output=True, ignore_error=True)
|
|
34
|
+
return ret.returncode == 0
|
|
35
|
+
if install_type == "apt":
|
|
36
|
+
ret = tools.run_command(f"dpkg -s {tool_name}", capture_output=True, ignore_error=True)
|
|
37
|
+
return "Status: install ok installed" in ret.stdout
|
|
38
|
+
except Exception as e:
|
|
39
|
+
tools.log.info(f"校验工具存在性时报错:{str(e)}")
|
|
40
|
+
|
|
41
|
+
return False
|
|
42
|
+
|
|
29
43
|
@classmethod
|
|
30
44
|
def discover_workflows(cls):
|
|
31
45
|
for path in cls.search_paths:
|
|
@@ -35,7 +49,8 @@ class InstallWorkflow:
|
|
|
35
49
|
|
|
36
50
|
for yml_file in path.glob("*.yml"):
|
|
37
51
|
with open(yml_file) as conf:
|
|
38
|
-
|
|
52
|
+
file_content = yaml.safe_load(conf)
|
|
53
|
+
cls._register_workflows(yml_file=yml_file, file_content=file_content)
|
|
39
54
|
|
|
40
55
|
@classmethod
|
|
41
56
|
def parse(cls, name: str) -> List[str]:
|
|
@@ -51,4 +66,15 @@ class InstallWorkflow:
|
|
|
51
66
|
|
|
52
67
|
@classmethod
|
|
53
68
|
def get_all_plans(cls):
|
|
54
|
-
return cls._workflows.keys()
|
|
69
|
+
return cls._workflows.keys()
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def _register_workflows(cls, yml_file, file_content):
|
|
73
|
+
plans = file_content.get(install_consts.PLAN_STEPS, [])
|
|
74
|
+
for plan in plans:
|
|
75
|
+
inst_type = plan.get(install_consts.PLAN_INSTALL_TYPE)
|
|
76
|
+
if not inst_type:
|
|
77
|
+
raise ValueError(f"未配置 {yml_file}/{install_consts.PLAN_STEPS}/{install_consts.PLAN_INSTALL_TYPE}")
|
|
78
|
+
package_name = plan.get(install_consts.PLAN_PACKAGE_NAME)
|
|
79
|
+
if cls.tool_exists(package_name, inst_type): # 未安装的工具不加入_workflows
|
|
80
|
+
cls._workflows[yml_file.stem] = file_content
|
bmcgo/utils/merge_csr.py
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
|
3
|
+
# openUBMC is licensed under Mulan PSL v2.
|
|
4
|
+
# You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
5
|
+
# You may obtain a copy of Mulan PSL v2 at:
|
|
6
|
+
# http://license.coscl.org.cn/MulanPSL2
|
|
7
|
+
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
8
|
+
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
9
|
+
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
10
|
+
# See the Mulan PSL v2 for more details.
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
import os
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from bmcgo.utils.tools import Tools
|
|
17
|
+
|
|
18
|
+
tools = Tools("bmcgo_config")
|
|
19
|
+
log = tools.log
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Merger():
|
|
23
|
+
def __init__(self, output_dir):
|
|
24
|
+
self.output_dir = output_dir
|
|
25
|
+
self.special_suffix = ("_basic_info", "_mgmt_model", "_version")
|
|
26
|
+
self.tmp_dir = None
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def remove_json5_comments(text):
|
|
30
|
+
pattern = r"""
|
|
31
|
+
("(?:\\.|[^"\\])*"
|
|
32
|
+
|'(?:\\.|[^'\\])*'
|
|
33
|
+
)
|
|
34
|
+
|(/\*[\s\S]*?\*/
|
|
35
|
+
|//[^\n]*
|
|
36
|
+
)
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def replacer(match):
|
|
40
|
+
if match.group(1):
|
|
41
|
+
return match.group(1)
|
|
42
|
+
else:
|
|
43
|
+
return ''
|
|
44
|
+
return json.loads(re.sub(pattern, replacer, text, flags=re.VERBOSE))
|
|
45
|
+
|
|
46
|
+
def merge_json(self, dict1, dict2, is_top_level=True, path=None):
|
|
47
|
+
if path is None:
|
|
48
|
+
path = []
|
|
49
|
+
if not isinstance(dict1, dict) or not isinstance(dict2, dict):
|
|
50
|
+
if dict1 != dict2:
|
|
51
|
+
raise ValueError(f"字段冲突,路径{'/'.join(path)}的值不一致:{dict1} vs {dict2}")
|
|
52
|
+
return dict1
|
|
53
|
+
for key, value in dict2.items():
|
|
54
|
+
if key in dict1:
|
|
55
|
+
if is_top_level:
|
|
56
|
+
_ = self.merge_json(dict1[key], value, is_top_level=False, path=path + [key])
|
|
57
|
+
else:
|
|
58
|
+
raise ValueError(f"字段冲突:路径 {'/'.join(path + [key])} 在多个文件中重复出现")
|
|
59
|
+
else:
|
|
60
|
+
dict1[key] = value
|
|
61
|
+
return dict1
|
|
62
|
+
|
|
63
|
+
def generate_csr(self, filelist, csr_path):
|
|
64
|
+
log.info(f"正在创建临时csr文件")
|
|
65
|
+
merged = {}
|
|
66
|
+
for file_path in filelist:
|
|
67
|
+
p = Path(file_path)
|
|
68
|
+
if not p.exists():
|
|
69
|
+
raise FileNotFoundError(f"文件不存在:{file_path}")
|
|
70
|
+
with open(p, "r", encoding="utf-8") as fp:
|
|
71
|
+
content = self.remove_json5_comments(fp.read())
|
|
72
|
+
merged = self.merge_json(merged, content)
|
|
73
|
+
with open(csr_path, "w") as f:
|
|
74
|
+
json.dump(merged, f)
|
|
75
|
+
log.info(f"临时文件创建成功")
|
|
76
|
+
|
|
77
|
+
def update_tmp_dir(self, tmp_dir):
|
|
78
|
+
self.tmp_dir = tmp_dir
|
|
79
|
+
|
|
80
|
+
def get_single_csr(self, csr_path):
|
|
81
|
+
if os.path.exists(csr_path):
|
|
82
|
+
return csr_path
|
|
83
|
+
name, ext = os.path.splitext(csr_path)
|
|
84
|
+
modularize_csr = []
|
|
85
|
+
for suffix in self.special_suffix:
|
|
86
|
+
new_path = f"{name}{suffix}{ext}"
|
|
87
|
+
if not os.path.exists(new_path):
|
|
88
|
+
raise FileNotFoundError(f"路径 {new_path} 不存在")
|
|
89
|
+
modularize_csr.append(new_path)
|
|
90
|
+
csr_path = os.path.join(self.tmp_dir, os.path.basename(csr_path))
|
|
91
|
+
self.generate_csr(modularize_csr, csr_path)
|
|
92
|
+
return csr_path
|
|
93
|
+
|
|
94
|
+
def get_multi_files(self, dir_path):
|
|
95
|
+
srs = list(dir_path.glob("*.sr"))
|
|
96
|
+
stem_to_path = {p.stem: p for p in srs}
|
|
97
|
+
special_by_base = {}
|
|
98
|
+
for p in srs:
|
|
99
|
+
stem = p.stem
|
|
100
|
+
for suf in self.special_suffix:
|
|
101
|
+
if not stem.endswith(suf):
|
|
102
|
+
continue
|
|
103
|
+
base = stem.removesuffix(suf)
|
|
104
|
+
if base:
|
|
105
|
+
special_by_base.setdefault(base, {})[suf] = p
|
|
106
|
+
break
|
|
107
|
+
to_skip = set()
|
|
108
|
+
to_create = []
|
|
109
|
+
for base, mod_path in special_by_base.items():
|
|
110
|
+
if base in stem_to_path:
|
|
111
|
+
to_skip.update(mod_path.values())
|
|
112
|
+
else:
|
|
113
|
+
if not all(s in mod_path for s in self.special_suffix):
|
|
114
|
+
continue
|
|
115
|
+
plain = dir_path / f"{base}.sr"
|
|
116
|
+
if not plain.exists():
|
|
117
|
+
plain = os.path.join(self.tmp_dir, f"{base}.sr")
|
|
118
|
+
self.generate_csr([mod_path[s] for s in self.special_suffix], plain)
|
|
119
|
+
to_create.append(plain)
|
|
120
|
+
to_skip.update(mod_path.values())
|
|
121
|
+
res = [p for p in srs if p not in to_skip]
|
|
122
|
+
res.extend(to_create)
|
|
123
|
+
log.info(res)
|
|
124
|
+
return res
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
bmcgo/__init__.py,sha256=
|
|
1
|
+
bmcgo/__init__.py,sha256=SE0k3y8-A9Ww0-Mkf-KEYBYaGigM3CfrxZ3Kmh-f7Mo,563
|
|
2
2
|
bmcgo/bmcgo.py,sha256=uD4TsfjrFB5aQPIS6WRUVc9ShXX-dSImY9ezkB13g1w,685
|
|
3
3
|
bmcgo/bmcgo_config.py,sha256=zPghH-W8vNK1bAc5PjfwnWzkHYT499PlGbhUWhPKT5U,10888
|
|
4
4
|
bmcgo/errors.py,sha256=QW1ndrJcJ2Ws7riOznPKVvZsNlrYk73eZol7w8gJTPU,3076
|
|
@@ -195,7 +195,7 @@ bmcgo/functional/bmc_studio_action.py,sha256=Gg96UB8QtnhsaqSdMhXuS9fddzAFPhR6UYC
|
|
|
195
195
|
bmcgo/functional/check.py,sha256=LWoDAtEB2p65FemLEoNGz33ldtkbcJlc-uz8hwJl89U,8183
|
|
196
196
|
bmcgo/functional/conan_index_build.py,sha256=cYpv83DFnsbUJri_dKyThLo7-SDRQ4253P4Nud-HYFY,9074
|
|
197
197
|
bmcgo/functional/config.py,sha256=ZQ-a9hegI0cV41iTo7t49ryBeUH4wPJ-qkVvWp8toV4,10824
|
|
198
|
-
bmcgo/functional/csr_build.py,sha256=
|
|
198
|
+
bmcgo/functional/csr_build.py,sha256=h1kyvTEdIbtcSDRCgc70xjChE-sat_SJXltxlulc2xU,41146
|
|
199
199
|
bmcgo/functional/deploy.py,sha256=2NsxCpoZjL4jTyRpbIp20-EKKbQkQe-Hsm20uxHK2Xc,10677
|
|
200
200
|
bmcgo/functional/diff.py,sha256=WBH6aRVyVInzyvqQrmslqpItKncFbB2Z9WIBE1_O6bo,10558
|
|
201
201
|
bmcgo/functional/fetch.py,sha256=JE4iZt6a-vjuCrDg9RYDCTyLf5TvXZQvs0PgD3VBvtQ,10767
|
|
@@ -220,7 +220,7 @@ bmcgo/tasks/__init__.py,sha256=VapgzhPMmB7dzPIRohoVm1jjfVn_v97cYNCRmkxScaU,539
|
|
|
220
220
|
bmcgo/tasks/download_buildtools_hm.py,sha256=f4UxStARc8Z8DnT_5O6ONajQ7P0sKyJ8brixr43fHVQ,5988
|
|
221
221
|
bmcgo/tasks/misc.py,sha256=GK_bSDLGZW0FxywB2ICG1iIEz2y2QoCb1YQQk8SYOIA,711
|
|
222
222
|
bmcgo/tasks/task.py,sha256=n7EhquD3FQeT8LHk0tREKOG9t1BcbMge_TY6ekGFydk,17064
|
|
223
|
-
bmcgo/tasks/task_build_conan.py,sha256=
|
|
223
|
+
bmcgo/tasks/task_build_conan.py,sha256=C6zGBSa3ai8p0_5timmfcqRh7sn6lNMdXl9Fi-TUEPA,33799
|
|
224
224
|
bmcgo/tasks/task_build_rootfs_img.py,sha256=JKEvldJnLWu2IdVSntuVowocQwdVtBQUpxzhplYauPI,29209
|
|
225
225
|
bmcgo/tasks/task_build_wbd_up.py,sha256=X9-0Qqad-s3mGfJBMeBQvfZ99KlWcgaMluDr_zv6Z-o,3122
|
|
226
226
|
bmcgo/tasks/task_buildgppbin.py,sha256=Xjfw6j8OsyS_XRiOt4vqIK1rDQ4sNKG__eurDu-M9bo,6341
|
|
@@ -243,19 +243,22 @@ bmcgo/utils/fetch_component_code.py,sha256=vH9rY2YcXK5tBUEK7fLmKVxK9cYDM39FHmMan
|
|
|
243
243
|
bmcgo/utils/install_manager.py,sha256=XMZUuIHm7_DWRdLV4dAevsyamQ6rt8lb_7OqGWzNBC8,4927
|
|
244
244
|
bmcgo/utils/json_validator.py,sha256=_k5wU78wfYGrzvSDaqOEtT4otgKUjquVhZNpVf2PW_c,7524
|
|
245
245
|
bmcgo/utils/mapping_config_patch.py,sha256=_gKfZnrvsLPgHn1yXhEJRVTAeuGpeGD9T-Pqyw5Ydys,16827
|
|
246
|
+
bmcgo/utils/merge_csr.py,sha256=JNxHCfW1au84WQshdz0aQy8wMTEOHonjQT3s6LjlZN4,4580
|
|
246
247
|
bmcgo/utils/perf_analysis.py,sha256=fh6lV9AAKVhpPkGPwAJ8EWfGfUoHjqGYQxrvc32Xiac,4767
|
|
247
248
|
bmcgo/utils/tools.py,sha256=athCcqcHgtIZY23GxziWdFjgjEhjGqTwbnezXjmg94Y,27421
|
|
248
249
|
bmcgo/utils/installations/README.md,sha256=hKXnFYmeHEuROFMFE-vzlGLSHg71bei5ZYwyYZphWNk,2
|
|
249
250
|
bmcgo/utils/installations/__init__.py,sha256=BDXz8BcSlCkfo5UYt6j2rm89-HiYA1ZzfpFhy99MH-0,538
|
|
250
251
|
bmcgo/utils/installations/base_installer.py,sha256=3UZiKWoa41ygRbLD3QsE2FTp-VFp79V0I53QLRIf4E8,5902
|
|
251
252
|
bmcgo/utils/installations/install_consts.py,sha256=QrRYfjw-rkwRllXDvC-pqoAH3Ii_tXsj590gzYxnAFA,1104
|
|
252
|
-
bmcgo/utils/installations/install_workflow.py,sha256=
|
|
253
|
+
bmcgo/utils/installations/install_workflow.py,sha256=wT6lTE_s-NZP8LSZR1xlu4dXTtPTEai1dsq3D5-kLzE,3162
|
|
253
254
|
bmcgo/utils/installations/version_util.py,sha256=dOwvLZ7iOmnzSeyD6_pRm7NS7I13Um5mSD_y0dVyO6M,3212
|
|
254
255
|
bmcgo/utils/installations/install_plans/bingo.yml,sha256=Zw1HnAyNJdEwkE3fnd-_GCe9bwv1m6bmMlaQTJXaFa8,210
|
|
256
|
+
bmcgo/utils/installations/install_plans/qemu.yml,sha256=lT7aKag60QUH6hTGFKa3hGRqTlcaMxErxjnSaCMkQ9A,138
|
|
257
|
+
bmcgo/utils/installations/install_plans/studio.yml,sha256=APR3GM-3Q11LFfe8vh7t3LztDn4LLEpNHRUNjkaVekA,143
|
|
255
258
|
bmcgo/utils/installations/installers/apt_installer.py,sha256=nPaCb4cobSi9InN_aHsEPtQ0k4FgsCUWE5_VgBPvcRE,3769
|
|
256
259
|
bmcgo/utils/installations/installers/pip_installer.py,sha256=dDdios1EQ7fzt90r02pZeoM3jCmjslLzkSvzd2hgRVM,3241
|
|
257
|
-
openubmc_bingo-0.5.
|
|
258
|
-
openubmc_bingo-0.5.
|
|
259
|
-
openubmc_bingo-0.5.
|
|
260
|
-
openubmc_bingo-0.5.
|
|
261
|
-
openubmc_bingo-0.5.
|
|
260
|
+
openubmc_bingo-0.5.277.dist-info/METADATA,sha256=A4lw7rAE8BogjZR_XLW2b_sVcoTZD478JX_PYHNBIFw,956
|
|
261
|
+
openubmc_bingo-0.5.277.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
262
|
+
openubmc_bingo-0.5.277.dist-info/entry_points.txt,sha256=UUoUP-vAWTgg9vEYbRwYqOBHgpRtkngdzMPb-ocz90g,42
|
|
263
|
+
openubmc_bingo-0.5.277.dist-info/top_level.txt,sha256=9AcvCAt1nZcOgMsGt6T07mg2Bgtdet-3mHTwg91axgI,6
|
|
264
|
+
openubmc_bingo-0.5.277.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|