openubmc-bingo 0.6.48__py3-none-any.whl → 0.6.51__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 CHANGED
@@ -9,4 +9,4 @@
9
9
  # MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
10
  # See the Mulan PSL v2 for more details.
11
11
 
12
- __version__ = '0.6.48'
12
+ __version__ = '0.6.51'
@@ -119,18 +119,22 @@ class AnalysisComp():
119
119
  excluded_str = "/dev" if misc.conan_v1() else "openubmc"
120
120
  if node.package_name == "busybox" and excluded_str in node.ref:
121
121
  continue
122
+ if node.is_build_tool:
123
+ continue
122
124
  packages[node.index] = node
123
125
  requires[node.index] = node_data.get("requires", [])
124
126
  if misc.conan_v2():
125
127
  dependencies_data = node_data.get("dependencies", [])
126
- dependencies_keys = list(dependencies_data.keys())
128
+ dependencies_keys = [key for key, dep in dependencies_data.items() if dep["direct"]]
127
129
  requires[node.index] = dependencies_keys
128
130
  comm_name = misc.community_name()
129
131
  for index, pkg in packages.items():
130
132
  if not pkg.name.startswith(comm_name):
131
133
  self.set_node_subsys(pkg)
132
134
  for require_id in requires.get(index, []):
133
- pkg.requires.append(packages.get(int(require_id), None))
135
+ require_package = packages.get(int(require_id), None)
136
+ if require_package:
137
+ pkg.requires.append(require_package)
134
138
  if not pkg.name.startswith(comm_name):
135
139
  self.nodes.append(pkg)
136
140
 
@@ -1,7 +1,11 @@
1
1
  {
2
- "Version": "0.0.46",
2
+ "Version": "0.0.47",
3
3
  "Description": "此文件对iBMCV3子系统与子系统、组件与组件的依赖关系约束进行了描述, 只有子系统架构师/领域专家才能修改",
4
4
  "Changelog": {
5
+ "0.0.47": [
6
+ "1、framework子系统增加设备驱动管理组件devmon",
7
+ "2、framework子系统增加设备驱动管理库component_drivers, libmcpp"
8
+ ],
5
9
  "0.0.46": [
6
10
  "1、om子系统增加可观测组件observability",
7
11
  "2、opensource增加可观测需要的开源软件, 包括fluent-bit, libyaml, opentelemetry, grpc, abseil, protobuf, re2, c_ares,opentelemetry-proto",
@@ -42,7 +46,6 @@
42
46
  "libyaml",
43
47
  "opentelemetry",
44
48
  "grpc",
45
- "grpc_tool",
46
49
  "abseil",
47
50
  "protobuf",
48
51
  "re2",
@@ -103,7 +106,8 @@
103
106
  "persistence",
104
107
  "key_mgmt",
105
108
  "hwdiscovery",
106
- "hwproxy"
109
+ "hwproxy",
110
+ "devmon"
107
111
  ],
108
112
  "Libraries": [
109
113
  "persistence",
@@ -117,7 +121,9 @@
117
121
  "libmcc",
118
122
  "libmgmt_protocol",
119
123
  "libkvs",
120
- "liblogger"
124
+ "liblogger",
125
+ "component_drivers",
126
+ "libmcpp"
121
127
  ],
122
128
  "Configurations": [
123
129
  "rootfs_user"
@@ -51,7 +51,9 @@ class DepNode():
51
51
  self.local_tables = {}
52
52
  self.remote_tables = {}
53
53
  self.table_conflict = False
54
+ self.is_build_tool = False
54
55
  if misc.conan_v2():
56
+ self.is_build_tool = node.get("context") == "build"
55
57
  self.recipe_folder = node.get("recipe_folder")
56
58
  self.binary = node.get("binary", "")
57
59
  if self.binary == "Skip":
@@ -34,15 +34,13 @@ class InterfaceValidation:
34
34
  self.intf_hardcoded: Dict[str, Set[str]] = defaultdict(set)
35
35
  self.all_predefined_intfs: Set[str] = set()
36
36
  self.remote = remote
37
- self._parse_mds_interfaces()
38
- self._parse_hardcoded_interfaces()
39
- self._pull_all_interfaces()
37
+ self.mdb_interface_repo_url = "https://gitcode.com/openUBMC/mdb_interface.git"
40
38
 
41
39
  @staticmethod
42
40
  def extract_dbus_intf_in_file(file_path):
43
41
  all_intfs = list()
44
42
  with open(file_path, "r") as file_descriptor:
45
- # iBMC d-bus interface pattern: bmc.(kepler|dev).[A-Z]
43
+ # d-bus interface pattern: bmc.(kepler|dev).[A-Z]
46
44
  pattern = "[\"\']bmc\.(?:kepler|dev)(?:\.[A-Z].*?)?[\"\']"
47
45
  intf_match = re.findall(pattern, file_descriptor.read())
48
46
  for intf in intf_match:
@@ -96,6 +94,10 @@ class InterfaceValidation:
96
94
  return package
97
95
 
98
96
  def run(self):
97
+ self._parse_mds_interfaces()
98
+ self._parse_hardcoded_interfaces()
99
+ self._pull_all_interfaces()
100
+
99
101
  intf_validation_passed = self._validate_mds_intf() and self._validate_hardcoded_intf() and \
100
102
  self._check_dbus_call()
101
103
  if intf_validation_passed:
@@ -142,7 +144,6 @@ class InterfaceValidation:
142
144
  self.intf_hardcoded[intf].update([file_path])
143
145
 
144
146
  def _pull_interfaces_from_repo(self):
145
- mdb_interface_repo_url = "https://gitcode.com/openUBMC/mdb_interface.git"
146
147
  mktemp_cmd = subprocess.run(["/usr/bin/mktemp", "-d", "--suffix", "_mdb_interface"], capture_output=True)
147
148
  if mktemp_cmd.returncode != 0:
148
149
  raise OSError(f"创建文件夹失败, 错误消息: {mktemp_cmd.stderr}")
@@ -150,10 +151,10 @@ class InterfaceValidation:
150
151
 
151
152
  git_cmd = Helper.get_git_path()
152
153
  repo_fetch = subprocess.run(
153
- [git_cmd, "clone", mdb_interface_repo_url, temp_dir, "--depth=1"],
154
+ [git_cmd, "clone", self.mdb_interface_repo_url, temp_dir, "--depth=1"],
154
155
  stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
155
156
  if repo_fetch.returncode != 0:
156
- log.error("克隆远端仓库 %s 失败, 错误信息: %s", mdb_interface_repo_url, repo_fetch.stderr)
157
+ log.error("克隆远端仓库 %s 失败, 错误信息: %s", self.mdb_interface_repo_url, repo_fetch.stderr)
157
158
  intf_dir = os.path.join(temp_dir, "json/intf/mdb/bmc")
158
159
 
159
160
  for root, _, files in os.walk(intf_dir):
@@ -22,6 +22,7 @@ from bmcgo.logger import Logger
22
22
 
23
23
  global log
24
24
  log = Logger()
25
+ script_dir = os.path.split(os.path.realpath(__file__))[0]
25
26
 
26
27
  SOFT_SR_SUFFIX = "_soft.sr"
27
28
  SOFTWARE_SUFFIX = "software"
@@ -194,7 +195,7 @@ class SrValidate(SrParser):
194
195
  self.is_product_sr_repo = False
195
196
  self.check_repo_type()
196
197
  self.smc_dfx_whitelist: Dict[str, Set[Tuple[int, int]]] = defaultdict(set)
197
- self.load_smc_dfx_whitelist()
198
+ self.whitelist_file = os.path.join(script_dir, "smc_dfx_whitelist.json")
198
199
 
199
200
  @staticmethod
200
201
  def merge_sr_objects(hardware_sr_objects: Dict[str, Dict], software_sr_objects: Dict[str, Dict]):
@@ -227,11 +228,10 @@ class SrValidate(SrParser):
227
228
  log.error('mds/service.json 文件解析失败: %s', e)
228
229
 
229
230
  def load_smc_dfx_whitelist(self):
230
- whitelist_file = Path(__file__).parent.joinpath("smc_dfx_whitelist.json")
231
- if not os.path.exists(whitelist_file):
231
+ if not os.path.exists(self.whitelist_file):
232
232
  return
233
233
  try:
234
- with open(whitelist_file, 'r') as file_descriptor:
234
+ with open(self.whitelist_file, 'r') as file_descriptor:
235
235
  content = json.load(file_descriptor)
236
236
  for item in content:
237
237
  chip_type = item.get("ChipType")
@@ -245,6 +245,7 @@ class SrValidate(SrParser):
245
245
  def run(self):
246
246
  if not self.is_sr_repo:
247
247
  return True
248
+ self.load_smc_dfx_whitelist()
248
249
  self.find_soft_sr_files()
249
250
  self.walk_sr_dir()
250
251
  file_count, problems_total, issues_count = self.log_issues()
@@ -12,7 +12,6 @@
12
12
  # See the Mulan PSL v2 for more details.
13
13
  import os
14
14
  import argparse
15
- from multiprocessing import Process
16
15
  import urllib3
17
16
  from bmcgo.frame import Frame
18
17
  from bmcgo.misc import CommandInfo
@@ -60,23 +59,30 @@ class BmcgoCommand:
60
59
  self.out_dir = pre_parsed_args.out_dir
61
60
  self.lock_file = pre_parsed_args.lock_file
62
61
  self.board_name = pre_parsed_args.board_name
62
+
63
+ def component_analysis(self):
64
+ if not InterfaceValidation(self.remote).run() or not SrValidate(os.getcwd()).run():
65
+ return -1
66
+ return 0
63
67
 
68
+ def product_analysis(self, custom_sr_dir):
69
+ analysis_task = AnalysisComp(self.board_name, self.out_dir, self.lock_file, custom_sr_dir)
70
+ result = analysis_task.run()
71
+ return result
72
+
64
73
  def run(self):
65
74
  is_integrated, work_dir = self._is_integrated_project()
66
75
  if is_integrated:
67
76
  os.chdir(work_dir)
68
77
  else:
69
78
  os.chdir(self.bconfig.component.folder)
70
- # 组件级构建
79
+ # 组件级
71
80
  if not is_integrated:
72
- if not InterfaceValidation(self.remote).run() or not SrValidate(os.getcwd()).run():
73
- return -1
74
- return 0
75
- custom_sr_dir = None
76
- # 非集成环境
77
- if not is_integrated:
78
- custom_sr_dir = os.getcwd()
79
- elif self.rebuild:
81
+ return self.component_analysis()
82
+
83
+ # 产品级
84
+ custom_sr_dir = os.getcwd()
85
+ if self.rebuild:
80
86
  parsed = []
81
87
  if self.board_name:
82
88
  parsed.append("-b")
@@ -85,9 +91,9 @@ class BmcgoCommand:
85
91
  frame = Frame(self.bconfig, config)
86
92
  frame.parse(parsed)
87
93
  frame.run()
94
+
88
95
  os.chdir(os.path.join(work_dir, misc.BUILD))
89
- analysis_task = AnalysisComp(self.board_name, self.out_dir, self.lock_file, custom_sr_dir)
90
- rc = analysis_task.run()
96
+ rc = self.product_analysis(custom_sr_dir)
91
97
  if not rc:
92
98
  return -1
93
99
  log.success("BMC 构建分析成功")
@@ -251,8 +251,8 @@ class ConanLockParse:
251
251
  for com, entry_degree in entry_degree_temp_dict.items():
252
252
  if entry_degree != 0:
253
253
  continue
254
- # openubmc作为一个最终组件,不推送(远端没有,直接弹出)
255
- if com.startswith("openubmc/"):
254
+ # 最终组件,不推送(远端没有,直接弹出)
255
+ if com.startswith(f"{misc.community_name()}/"):
256
256
  self._degree.pop(com)
257
257
  break
258
258
  cmd_tmp = cmd.replace("com_name", f"{com}")
@@ -459,7 +459,7 @@ class TaskClass(Task):
459
459
  self.component_check = ComponentVersionCheck(
460
460
  manifest_yml="manifest.yml",
461
461
  ibmc_lock=self.lockfile,
462
- community_name="openubmc",
462
+ community_name=misc.community_name(),
463
463
  openubmcsdk=openubmcsdk
464
464
  )
465
465
  for dep in deps:
@@ -521,7 +521,7 @@ class TaskClass(Task):
521
521
  self.component_check = ComponentVersionCheck(
522
522
  manifest_yml="manifest.yml",
523
523
  ibmc_lock=self.lockfile,
524
- community_name="openubmc",
524
+ community_name=misc.community_name(),
525
525
  openubmcsdk=openubmcsdk
526
526
  )
527
527
  for dep in deps:
@@ -582,7 +582,7 @@ class TaskClass(Task):
582
582
  with os.fdopen(os.open(self.package_info, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, stat.S_IWUSR | stat.S_IRUSR |
583
583
  stat.S_IWGRP | stat.S_IRGRP | stat.S_IWOTH | stat.S_IROTH), 'w') as fp:
584
584
  for package in require_list:
585
- if "openubmc/" not in package:
585
+ if f"{misc.community_name()}/" not in package:
586
586
  fp.write(f"{package.split('#')[0]}\n")
587
587
  else:
588
588
  package_info_list.remove(package)
@@ -813,6 +813,9 @@ class TaskClass(Task):
813
813
  os.makedirs(openubmc_dir, exist_ok=True)
814
814
  shutil.copytree(conanfile_dir, openubmc_dir, dirs_exist_ok=True)
815
815
  self.chdir(openubmc_dir)
816
+ # 替换默认的根组件名为实际的community name
817
+ tools.run_command(f"sed -i 's/openubmc/{misc.community_name()}/g' conanfile.py")
818
+
816
819
  # 复制manifest.yml文件
817
820
  if misc.conan_v2():
818
821
  self.merge_manifest_v2()
@@ -1061,7 +1064,7 @@ class TaskClass(Task):
1061
1064
  for dirname in os.listdir("."):
1062
1065
  if not os.path.isdir(dirname):
1063
1066
  continue
1064
- if dirname != "rootfs" and dirname != "openubmc":
1067
+ if dirname != "rootfs" and dirname != misc.community_name():
1065
1068
  comps.append(dirname)
1066
1069
 
1067
1070
  self.copy_components(comps, profile)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openubmc-bingo
3
- Version: 0.6.48
3
+ Version: 0.6.51
4
4
  Summary: Tools provided by openubmc
5
5
  Home-page: https://openubmc.cn
6
6
  Classifier: Programming Language :: Python :: 3
@@ -1,4 +1,4 @@
1
- bmcgo/__init__.py,sha256=zNLxZCPEhBXktWdUgwGoCSS4a83Mu_1gVP-esK_r0YY,562
1
+ bmcgo/__init__.py,sha256=gPR11fdu-7LXVTAiD7rNONaYFEKBD8FQRCv_fHBZFg4,562
2
2
  bmcgo/bmcgo.py,sha256=uD4TsfjrFB5aQPIS6WRUVc9ShXX-dSImY9ezkB13g1w,685
3
3
  bmcgo/bmcgo_config.py,sha256=-HZcTsnccE5wUsgGJ59kq8sDdu8feftIbpyoFvyvBhU,11264
4
4
  bmcgo/errors.py,sha256=QW1ndrJcJ2Ws7riOznPKVvZsNlrYk73eZol7w8gJTPU,3076
@@ -175,16 +175,16 @@ bmcgo/component/deploy.py,sha256=Iy5CsiolKS1h5jDg13nYkfy6--BtbBZ8FLou2oVuoLQ,654
175
175
  bmcgo/component/gen.py,sha256=lhPe_VV08CDFSydSLCX7IC5m8obNvYZSSzIp9o84nd0,7248
176
176
  bmcgo/component/package_info.py,sha256=pYgubJ-564JXQmEaSlYfGnoVgrNlY3O5jJP1vxZe-Qc,14844
177
177
  bmcgo/component/test.py,sha256=Kpg5fmcJ-F2lDlHsKTBXjhB00T-IOr5QWGfHsRXVgA0,45260
178
- bmcgo/component/analysis/analysis.py,sha256=flNkGn468I0wi6mAIuygyPK7eA5PWBw3Ks56B5rrhmc,9179
178
+ bmcgo/component/analysis/analysis.py,sha256=oc5m6qGWZm6G3n8cVENs86DAWywMNuxTqhO5QIb9fX8,9363
179
179
  bmcgo/component/analysis/build_deps.py,sha256=cyQh5D3R1syQfMJcNxEIKKSJGanPMNRFPGlJRitDAa0,7324
180
180
  bmcgo/component/analysis/data_deps.py,sha256=lDCVZ1B56pOW3BApCroujEaak4I07tN9mDOWruhuDkc,16431
181
- bmcgo/component/analysis/dep-rules.json,sha256=Na1FoRkdcDpT5nlMR3EfdG-xFND4ghZk5Xr_g-fgynk,34995
182
- bmcgo/component/analysis/dep_node.py,sha256=i3BRg2iHRy-qv653--ckEJbl_sr-TdIhoEmGuTgZRBg,5168
181
+ bmcgo/component/analysis/dep-rules.json,sha256=fLNK_MN7plr9WYLzlla56geGBreYQ_3t9xZSIX0beag,35251
182
+ bmcgo/component/analysis/dep_node.py,sha256=1ZfSElBPfreuugPclQPgQcTq-LlshYLlDVwzgr1lHVY,5267
183
183
  bmcgo/component/analysis/intf_deps.py,sha256=IlcPixdaBpXpb6U4M-I1hRRGHCg5SCUg07V6kAosacE,7382
184
- bmcgo/component/analysis/intf_validation.py,sha256=hAY9pB3_-2gkAyCE2aazW_twoAmlU3ePEg4oJHFgCh4,11422
184
+ bmcgo/component/analysis/intf_validation.py,sha256=CIfyc8AWIm5z2SnjhoNQEppIkaJoOxDtQc3eynI2Oa4,11437
185
185
  bmcgo/component/analysis/rule.py,sha256=xvntmvFdGa0J8WBlrHDdJ5bcl3jr4pXezR3KKvOg4Ag,7549
186
186
  bmcgo/component/analysis/smc_dfx_whitelist.json,sha256=ur8WLSSDM696_PtbSOYciMV50TzbUgP2voVt_QbTCw0,202
187
- bmcgo/component/analysis/sr_validation.py,sha256=OrgPPjlOoLgRQyD_J6VZXAY0I6gtqGVOAhpGj0IY11Q,14876
187
+ bmcgo/component/analysis/sr_validation.py,sha256=8fmTGw_UyhvySQ2ASSMMA1w2jNMXihya97TJJa5GY8Y,14943
188
188
  bmcgo/component/coverage/__init__.py,sha256=ZgUEyI86FTlOdBzcuTzz7UqTtfWcz416Gx4BCqcQlhA,557
189
189
  bmcgo/component/coverage/c_incremental_cov_report.template,sha256=FPhK1DZtmWsjDxa32R1ViH3IGCtNHcx0zFfgRo0s2nI,1576
190
190
  bmcgo/component/coverage/incremental_cov.py,sha256=Uf-UdY4CW9rpP4sbURkCXBWyYMXWaG3R1Pyo3cDNvcQ,16859
@@ -193,7 +193,7 @@ bmcgo/component/template/conanfile.deploy.py.mako,sha256=zpxluBjUFmJHfFrnBknxZ3c
193
193
  bmcgo/component/template_v2/conanbase.py.mako,sha256=H0yO-uijpENtujj_1u037U2mZyy_ykdkV9hkj3mFuV4,15748
194
194
  bmcgo/component/template_v2/conanfile.deploy.py.mako,sha256=Xbd-PlfVHOWeRFLfvzINeykiZzzSHsgO_yUUvYrKqTw,512
195
195
  bmcgo/functional/__init__.py,sha256=BDXz8BcSlCkfo5UYt6j2rm89-HiYA1ZzfpFhy99MH-0,538
196
- bmcgo/functional/analysis.py,sha256=pXakxSojBH-dULngbmgMHR3bq9tphOaAN4euGKgEYoc,4016
196
+ bmcgo/functional/analysis.py,sha256=4FaJlz7CbupHAdCdhdrRZCTlnHZ0bz7Cy32FNg9Ik_0,4097
197
197
  bmcgo/functional/bmc_studio_action.py,sha256=Gg96UB8QtnhsaqSdMhXuS9fddzAFPhR6UYCpto9UOYA,3605
198
198
  bmcgo/functional/check.py,sha256=ReGN_8RRM6isX_r7XXEuHzkooh8pasky5_GpAml5d_g,8356
199
199
  bmcgo/functional/conan_index_build.py,sha256=Mp1fDpZVvecn5lUCsWZqq3mKSx9yu5pznQrDZr4Liuk,13443
@@ -224,7 +224,7 @@ bmcgo/tasks/__init__.py,sha256=VapgzhPMmB7dzPIRohoVm1jjfVn_v97cYNCRmkxScaU,539
224
224
  bmcgo/tasks/download_buildtools_hm.py,sha256=f4UxStARc8Z8DnT_5O6ONajQ7P0sKyJ8brixr43fHVQ,5988
225
225
  bmcgo/tasks/misc.py,sha256=GK_bSDLGZW0FxywB2ICG1iIEz2y2QoCb1YQQk8SYOIA,711
226
226
  bmcgo/tasks/task.py,sha256=95nKxTe5PW3rfhpm5YFasPtmP8oCraeWJKq0D5mbl6A,18578
227
- bmcgo/tasks/task_build_conan.py,sha256=5VXdm6kyuX93C-ZazDcQ2KCfJFnYRgkzLFJFSPs0OzU,53028
227
+ bmcgo/tasks/task_build_conan.py,sha256=XYK2Ge6sDE8lQI4AOh2StVXq045-LdvNVnxw848EG70,53227
228
228
  bmcgo/tasks/task_build_rootfs_img.py,sha256=jRw-psICpACRspQOJ4e6zatG1a63V7yTpajnBmRL59E,28937
229
229
  bmcgo/tasks/task_build_wbd_up.py,sha256=X9-0Qqad-s3mGfJBMeBQvfZ99KlWcgaMluDr_zv6Z-o,3122
230
230
  bmcgo/tasks/task_buildgppbin.py,sha256=epBxxrYFPgoTzpBgPzSRXcUs-ia_BJWsLGflylEJS7I,6614
@@ -264,8 +264,8 @@ bmcgo/utils/installations/install_plans/qemu.yml,sha256=lT7aKag60QUH6hTGFKa3hGRq
264
264
  bmcgo/utils/installations/install_plans/studio.yml,sha256=APR3GM-3Q11LFfe8vh7t3LztDn4LLEpNHRUNjkaVekA,143
265
265
  bmcgo/utils/installations/installers/apt_installer.py,sha256=nPaCb4cobSi9InN_aHsEPtQ0k4FgsCUWE5_VgBPvcRE,3769
266
266
  bmcgo/utils/installations/installers/pip_installer.py,sha256=dDdios1EQ7fzt90r02pZeoM3jCmjslLzkSvzd2hgRVM,3241
267
- openubmc_bingo-0.6.48.dist-info/METADATA,sha256=XiUcm7N7ZJ5iFH5oUKmfzCQvDA3v5oD8qZchf24pZ_s,1010
268
- openubmc_bingo-0.6.48.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
269
- openubmc_bingo-0.6.48.dist-info/entry_points.txt,sha256=UUoUP-vAWTgg9vEYbRwYqOBHgpRtkngdzMPb-ocz90g,42
270
- openubmc_bingo-0.6.48.dist-info/top_level.txt,sha256=9AcvCAt1nZcOgMsGt6T07mg2Bgtdet-3mHTwg91axgI,6
271
- openubmc_bingo-0.6.48.dist-info/RECORD,,
267
+ openubmc_bingo-0.6.51.dist-info/METADATA,sha256=LhSm0RCzavLoRo86bOwXimNKy7gEFCurUCor5ak9dnw,1010
268
+ openubmc_bingo-0.6.51.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
269
+ openubmc_bingo-0.6.51.dist-info/entry_points.txt,sha256=UUoUP-vAWTgg9vEYbRwYqOBHgpRtkngdzMPb-ocz90g,42
270
+ openubmc_bingo-0.6.51.dist-info/top_level.txt,sha256=9AcvCAt1nZcOgMsGt6T07mg2Bgtdet-3mHTwg91axgI,6
271
+ openubmc_bingo-0.6.51.dist-info/RECORD,,