openubmc-bingo 0.6.24__py3-none-any.whl → 0.6.27__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.24'
12
+ __version__ = '0.6.27'
bmcgo/cli/cli.py CHANGED
@@ -342,6 +342,8 @@ class Command(object):
342
342
  if not rtos_version:
343
343
  log.info(f"未检测到/opt/RTOS目录下的构建工具,可能未安装构建工具,请正确安装构建工具(可以manifest仓执行init.py或{misc.tool_name()} build)")
344
344
  return
345
+ if not os.path.isdir(bingo_profiles):
346
+ return
345
347
  for file in os.listdir(bingo_profiles):
346
348
  os.makedirs(profile_dir, exist_ok=True)
347
349
  src_file = os.path.join(bingo_profiles, file)
bmcgo/component/build.py CHANGED
@@ -79,7 +79,7 @@ class BuildComp():
79
79
  options = ""
80
80
  if self.info.enable_luajit:
81
81
  luac_path = os.path.join(conan_bin, "luajit")
82
- options = "-0 skynet:enable_luajit=True"
82
+ options = "-o skynet:enable_luajit=True"
83
83
  skynet_flag += "_luajit"
84
84
  else:
85
85
  skynet_flag += "luac"
@@ -25,6 +25,7 @@ import time
25
25
  import subprocess
26
26
  import random
27
27
  import pathlib
28
+ from tempfile import NamedTemporaryFile
28
29
  from multiprocessing import Process, Queue
29
30
  from copy import deepcopy
30
31
  from collections import Counter
@@ -407,6 +408,21 @@ class TaskClass(Task):
407
408
  file_handler.write(" - conan: \"{}\"\n".format(conan))
408
409
  self.success(f"获取到依赖: {conan}")
409
410
  self.depdencies.append(conan)
411
+ self.profile_tools_change(conan)
412
+
413
+ def profile_tools_change(self, pkg):
414
+ if pkg.startswith("luajit/"):
415
+ cmd = f"sed -i 's|^user.tools:luajit=.*|user.tools:luajit={pkg}|g'"
416
+ elif pkg.startswith("skynet/"):
417
+ cmd = f"sed -i 's|^user.tools:skynet=.*|user.tools:skynet={pkg}|g'"
418
+ else:
419
+ return
420
+ profile_file = os.path.join(self.tools.conan_profiles_dir, "profile.ini")
421
+ if os.path.isfile(profile_file):
422
+ self.run_command(f"{cmd} {profile_file}")
423
+ profile_file = os.path.join(self.tools.conan_profiles_dir, "profile.luajit.ini")
424
+ if os.path.isfile(profile_file):
425
+ self.run_command(f"{cmd} {profile_file}")
410
426
 
411
427
  def merge_manifest_v2(self):
412
428
  comps = []
@@ -684,6 +700,30 @@ class TaskClass(Task):
684
700
  options += " -o */*:gcov=True"
685
701
  return options
686
702
 
703
+ def clean_folder_not_exist_packages(self):
704
+ """
705
+ 检查缓存的所有包路径是否存在,不存在的删除对应的包
706
+ 缓解"folder must exist"错误
707
+ """
708
+ tmp = NamedTemporaryFile(suffix=".json")
709
+ cmd = f"conan list -f json '*/*@*/*#*:*' --out-file={tmp.name}"
710
+ self.run_command(cmd)
711
+ with open(tmp.name, "r") as fd:
712
+ cache = json.load(fd)
713
+ for name, recipe in cache.get("Local Cache", {}).items():
714
+ for rrid, revision in recipe.get("revisions", {}).items():
715
+ for pid, _ in revision.get("packages", {}).items():
716
+ cmd = f"conan cache path {name}#{rrid}:{pid}"
717
+ path = self.run_command(cmd, capture_output=True).stdout.strip()
718
+ if not os.path.isdir(path):
719
+ cmd = f"conan remove {name}#{rrid}:{pid} -c"
720
+ self.run_command(cmd)
721
+ cmd = f"conan cache path {name}#{rrid}"
722
+ path = self.run_command(cmd, capture_output=True).stdout.strip()
723
+ if not os.path.isdir(path):
724
+ cmd = f"conan remove {name}#{rrid} -c"
725
+ self.run_command(cmd)
726
+
687
727
  def install_openubmc_v2(self):
688
728
  profile_file = os.path.join(self.tools.conan_profiles_dir, self.config.profile)
689
729
  if not os.path.isfile(profile_file):
@@ -701,12 +741,17 @@ class TaskClass(Task):
701
741
  self.success(f"start build dependency packages of {self.config.board_name}")
702
742
  if self.skip_install_comp:
703
743
  return
704
- bcp = BuildConans(self.graphfile, self.lockfile, base_cmd, self.config.from_source, self.config.log_path)
705
- bcp.build()
706
-
744
+ if self.config.from_source:
745
+ """
746
+ 多进程并行构建组件
747
+ conan原生不支持多组件并行构建,BuildConans会尝试构建所有组件但忽略构建失败
748
+ """
749
+ bcp = BuildConans(self.graphfile, self.lockfile, base_cmd, self.config.from_source, self.config.log_path)
750
+ bcp.build()
751
+ self.clean_folder_not_exist_packages()
707
752
  cmd = f"conan create . {base_cmd} --build=missing"
708
753
  self.info(f"start build {self.config.board_name}: {cmd}")
709
- self.run_command(cmd, capture_output=False)
754
+ self.run_command(cmd)
710
755
 
711
756
  # 检查使用到的组件是否都在单板目录 manifest.yml 中配置了
712
757
  self.component_check.run()
@@ -975,9 +1020,7 @@ class TaskClass(Task):
975
1020
  for name, node in self.graph_nodes.items():
976
1021
  if node.package_folder.startswith(self.conan_install):
977
1022
  continue
978
- cust = os.path.join(node.package_folder, "include", "customization.py")
979
- if not os.path.isfile(cust):
980
- continue
1023
+
981
1024
  comp_dir = os.path.join(self.conan_install, name)
982
1025
  shutil.copytree(node.package_folder, comp_dir)
983
1026
 
@@ -37,8 +37,6 @@ class GraphNode():
37
37
  self.pkg = self.ref.split("#")[0] + "-" + self.context
38
38
  self.is_host = self.context == "host"
39
39
  self.building = False
40
- binary = node.get("binary")
41
- self.binary_exist = (binary in ["Cache"])
42
40
  self.builded = False
43
41
 
44
42
  @property
@@ -79,7 +77,6 @@ class BuildConans(object):
79
77
  skip = True
80
78
  continue
81
79
  self.cmd += f"{arg} "
82
- self.exception = None
83
80
  self.force_build = force_build
84
81
  self.log_dir = log_dir
85
82
  if not os.path.isdir(log_dir):
@@ -93,38 +90,35 @@ class BuildConans(object):
93
90
  cmd += f" --build=missing -f json --lockfile={self.lockfile}"
94
91
  if self.force_build:
95
92
  cmd += f" --build=\"{node.name}/*\""
96
- try:
97
- for i in range(1, 2):
98
- logfile = f"{self.log_dir}/conan_build_{node.name}.log"
99
- log.debug(f">>>> {cmd}")
100
- log.info(f">>>> build {node.ref} start, logfile: {logfile}")
101
- with os.fdopen(os.open(logfile, os.O_RDWR | os.O_CREAT, stat.S_IWUSR | stat.S_IRUSR), "a+") as f:
102
- real_cmd = shlex.split(cmd)
103
- pipe = subprocess.Popen(real_cmd, stdout=f, stderr=f)
104
- start_time = time.time()
105
- while True:
106
- if pipe.poll() is not None:
107
- break
108
- # 1800秒超时
109
- if time.time() - start_time > 1800:
110
- pipe.kill()
111
- raise errors.BmcGoException(f"================== {node.name} 构建超时 ==================")
112
- time.sleep(1)
113
- if pipe.returncode != 0:
114
- # 首次增量构建失败时切换到源码构建模式
115
- if i == 1 and not self.force_build:
116
- cmd += f" --build=\"{node.name}/*\""
117
- continue
118
-
119
- log.error(f"================== {node.name} 构建失败日志起始位置 ==================")
120
- f.seek(0)
121
- conan_log = f.read()
122
- log.error(conan_log)
123
- log.error(f"================== {node.name} 构建失败日志结束位置 ==================")
124
- raise errors.BmcGoException(f"================== {node.name} 构建失败 ==================")
125
- log.success(f"<<<< build {node.ref} finished")
126
- except Exception as e:
127
- self.exception = e
93
+ logfile = f"{self.log_dir}/conan_build_{node.name}.log"
94
+ logfd = os.fdopen(os.open(logfile, os.O_RDWR | os.O_CREAT, stat.S_IWUSR | stat.S_IRUSR), "a+")
95
+ # 最多重试3次
96
+ max_cnt = 3
97
+ for i in range(0, max_cnt):
98
+ log.debug(f">>>> {cmd}")
99
+ log.info(f">>>> build {node.ref} start, logfile: {logfile}")
100
+ real_cmd = shlex.split(cmd)
101
+ pipe = subprocess.Popen(real_cmd, stdout=logfd, stderr=logfd)
102
+ start_time = time.time()
103
+ while True:
104
+ if pipe.poll() is not None:
105
+ break
106
+ # 1800秒超时
107
+ if time.time() - start_time > 1800:
108
+ pipe.kill()
109
+ log.info(f"================== {node.name} 构建超时 ==================")
110
+ self.queue.put(node)
111
+ return
112
+ time.sleep(1)
113
+ if pipe.returncode != 0:
114
+ log.info(f"<<<< build {node.ref} not ok")
115
+ # 首次增量构建失败时切换到源码构建模式
116
+ if i == 0 and not self.force_build:
117
+ cmd += f" --build=\"{node.name}/*\""
118
+ continue
119
+ else:
120
+ break
121
+ log.success(f"<<<< build {node.ref} finished")
128
122
  self.queue.put(node)
129
123
 
130
124
  def build(self):
@@ -206,28 +200,25 @@ class BuildConans(object):
206
200
  continue
207
201
  if dep.builded:
208
202
  continue
209
- if not dep.binary_exist or self.force_build:
210
- # 当依赖的构建工具存在正在构建的组件时不能构建
211
- skip_build = False
212
- for _, build_dep in dep.build_packages.items():
213
- # 正在构建且未构建出制品时
214
- if build_dep.building and not build_dep.builded:
215
- skip_build = True
216
- break
217
- if skip_build:
218
- continue
219
- # 启动构建前将其依赖的构建工具置为正在构建
220
- for _, build_dep in dep.build_packages.items():
221
- build_dep.building = True
222
- tasks_cnt += 1
223
- thread = Thread(target=self.build_task, args=(dep, options,))
224
- thread.start()
203
+ # 当依赖的构建工具存在正在构建的组件时不能构建
204
+ skip_build = False
205
+ for _, build_dep in dep.build_packages.items():
206
+ # 正在构建且未构建出制品时
207
+ if build_dep.building and not build_dep.builded:
208
+ skip_build = True
209
+ break
210
+ if skip_build:
211
+ continue
212
+ # 启动构建前将其依赖的构建工具置为正在构建
213
+ for _, build_dep in dep.build_packages.items():
214
+ build_dep.building = True
215
+ tasks_cnt += 1
216
+ thread = Thread(target=self.build_task, args=(dep, options,))
217
+ thread.start()
225
218
  build_tasks[dep.name] = True
226
219
  if not tasks_cnt:
227
220
  return
228
221
  dep = self.queue.get()
229
- if not dep or self.exception:
230
- raise self.exception
231
222
  dep.builded = True
232
223
  build_tasks[dep.name] = False
233
224
  tasks_cnt -= 1
bmcgo/utils/tools.py CHANGED
@@ -77,6 +77,7 @@ class Tools():
77
77
  file_handle = os.fdopen(os.open(self.lock_file, os.O_WRONLY | os.O_CREAT,
78
78
  stat.S_IWUSR | stat.S_IRUSR), 'a')
79
79
  file_handle.close()
80
+ self.last_succ_remote = ""
80
81
 
81
82
  @property
82
83
  def user_home(self):
@@ -488,19 +489,20 @@ class Tools():
488
489
  return conan_remote_list
489
490
 
490
491
  def download_conan_recipes(self, conan_version, conan_remote_list):
491
- download_flag = False
492
492
  args = "--only-recipe" if misc.conan_v2() else "--recipe"
493
- for remote in conan_remote_list:
493
+ remote_list = conan_remote_list
494
+ if self.last_succ_remote:
495
+ remote_list.insert(0, self.last_succ_remote)
496
+ for remote in remote_list:
494
497
  # 重试3次
495
498
  for _ in range(1, 3):
496
499
  try:
497
500
  self.run_command(f"conan download {conan_version} -r {remote} {args}", show_error_log=False)
498
- download_flag = True
499
- break
501
+ self.last_succ_remote = remote
502
+ return
500
503
  except Exception as e:
501
504
  self.log.info(f"Recipe not fount in {remote}: {conan_version}")
502
- if not download_flag:
503
- raise BmcGoException(f"Download {conan_version} failed")
505
+ raise BmcGoException(f"Download {conan_version} failed")
504
506
 
505
507
  def yaml_load_template(self, yaml_name: str, template: dict, need_validate=True):
506
508
  with open(yaml_name, "r", encoding="utf-8") as fp:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openubmc-bingo
3
- Version: 0.6.24
3
+ Version: 0.6.27
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=BXSf7vrJJ8RdepowzFwMLtfu3srWxlFdp6BQdVXPvQ0,562
1
+ bmcgo/__init__.py,sha256=oqZ8oOARtejTeAecTilQ7hon25T3svORSMnhnL6HQwY,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
@@ -7,7 +7,7 @@ bmcgo/logger.py,sha256=rcMqJnyQ5Ag3k04KLEskrG8ZJ508OOU_JH4fMFiGOqQ,6644
7
7
  bmcgo/misc.py,sha256=w0vzsD7uzrsxTly5Y1viLgYTKHhLP4sxa499XwbqHnU,6986
8
8
  bmcgo/worker.py,sha256=OXz5Gam3pmZjgQeoGJrYy73ZrQszCOxk9X19nbeBI_A,15710
9
9
  bmcgo/cli/__init__.py,sha256=BDXz8BcSlCkfo5UYt6j2rm89-HiYA1ZzfpFhy99MH-0,538
10
- bmcgo/cli/cli.py,sha256=MY-DIvJ4q0roWfshZHkPaG1VGoWWrQcKDYx5ahE-IRg,27116
10
+ bmcgo/cli/cli.py,sha256=pgkIjjo3owY3tNbujIUGxJshanVElrwJ0gsXj8X3BXI,27181
11
11
  bmcgo/cli/config.conan2.yaml,sha256=SAtM_6_qOjZbkgUT5fzWbhbq4aWCayqE8o4xJ2vBRww,261
12
12
  bmcgo/cli/config.yaml,sha256=tbnFhz2TTrl2-ALpHHujbXB1ymZpjGC4f0zTfqfUZfM,194
13
13
  bmcgo/codegen/__init__.py,sha256=eplRBfR_obzVWMQtIeX1RRq6DOEezBx_l1EqcZYLRPM,775
@@ -168,7 +168,7 @@ bmcgo/codegen/lua/v1/templates/apps/service.lua.mako,sha256=wd_NJtiSSMbR-lxEqv-r
168
168
  bmcgo/codegen/lua/v1/templates/apps/utils/mdb_intf.lua.mako,sha256=msdj2SygZvV3RIEHLeVDfZvOzZ99Yy27SwPVrFVVcpc,1242
169
169
  bmcgo/codegen/lua/v1/templates/apps/utils/mdb_obj.lua.mako,sha256=oCzx2u3bjvCdNKX5oC8j6Q-Zb21q6SFCqd14_VzrWvo,349
170
170
  bmcgo/component/__init__.py,sha256=BDXz8BcSlCkfo5UYt6j2rm89-HiYA1ZzfpFhy99MH-0,538
171
- bmcgo/component/build.py,sha256=7ZYTxVOVO6T1caP3KCmyJ8yWE992g8gc6yU2f-bZx5s,12851
171
+ bmcgo/component/build.py,sha256=HWjgY1L1AXL7ndA35PKMFfweGSd8xXTRjY-ULW9ngGw,12851
172
172
  bmcgo/component/component_dt_version_parse.py,sha256=-Rt6i2fZrmYNZGoMqB21D_T9fC7fhhtUFIFvdPsMICM,14188
173
173
  bmcgo/component/component_helper.py,sha256=rNwfhagfz6E3BjKERq9oOPLRfeKQlqhLojb6oJLXcEA,7933
174
174
  bmcgo/component/deploy.py,sha256=Iy5CsiolKS1h5jDg13nYkfy6--BtbBZ8FLou2oVuoLQ,6544
@@ -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=w8tdU5NwoUfVF4xKFvSzcCWCf0FGTBHJAToNLlP0p4w,18424
227
- bmcgo/tasks/task_build_conan.py,sha256=kzUcYhXN5ItQrWLmzNBkhiaA5NzO7KbW8PNtm-Nrw5g,50458
227
+ bmcgo/tasks/task_build_conan.py,sha256=EpxDBOSmj9YIDSF8ifG0lREIAhOfQbWjt29lmO6mI1g,52546
228
228
  bmcgo/tasks/task_build_rootfs_img.py,sha256=JKEvldJnLWu2IdVSntuVowocQwdVtBQUpxzhplYauPI,29209
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
@@ -241,7 +241,7 @@ bmcgo/tasks/conan/conanfile.py,sha256=MI6c2QNKixrkA5Tx4i9EKw7bZ20GVDIKgkaMwNHQKc
241
241
  bmcgo/utils/__init__.py,sha256=BDXz8BcSlCkfo5UYt6j2rm89-HiYA1ZzfpFhy99MH-0,538
242
242
  bmcgo/utils/basic_enums.py,sha256=L5VtHtzSvs6duAnphgqDGXX80Wit3Y7DjMlpi9MCxyI,1348
243
243
  bmcgo/utils/buffer.py,sha256=t1SkWntWksboNFMPsltslwRdXZi3FAe8eV0JAAE7Vto,4004
244
- bmcgo/utils/build_conans.py,sha256=lEaZFCTjRc8pLWXWw71n7zl4zwmWg1s561Atn-Y32HA,9748
244
+ bmcgo/utils/build_conans.py,sha256=27aPzS7Q6e6xNlK9pkGgqJBe_pIs8YJHJXxqbaPoCN8,8920
245
245
  bmcgo/utils/combine_json_schemas.py,sha256=08JrAlLeo_JgUqzYcZNgSwJZPLfjbWVJ4esPPt9bPMY,7967
246
246
  bmcgo/utils/component_post.py,sha256=rTSMv36geI6rbm6ZFQenZfG0mn1nVPpdJqn7g8bYtKA,2330
247
247
  bmcgo/utils/component_version_check.py,sha256=nKfav7EnJ_JWfCvH_SiyhhIapGXUzhFs1QvLb58MPBs,6266
@@ -252,7 +252,7 @@ bmcgo/utils/json_validator.py,sha256=_k5wU78wfYGrzvSDaqOEtT4otgKUjquVhZNpVf2PW_c
252
252
  bmcgo/utils/mapping_config_patch.py,sha256=_gKfZnrvsLPgHn1yXhEJRVTAeuGpeGD9T-Pqyw5Ydys,16827
253
253
  bmcgo/utils/merge_csr.py,sha256=JNxHCfW1au84WQshdz0aQy8wMTEOHonjQT3s6LjlZN4,4580
254
254
  bmcgo/utils/perf_analysis.py,sha256=fh6lV9AAKVhpPkGPwAJ8EWfGfUoHjqGYQxrvc32Xiac,4767
255
- bmcgo/utils/tools.py,sha256=NrYd4bNzRiBGu7FklN6PT1gj-sdqUWB_lj11Q7TjI8Y,32480
255
+ bmcgo/utils/tools.py,sha256=dB7lX0jv-mE6pBalzm-VUZEnxPSbYkgC9soD_FAAnFg,32587
256
256
  bmcgo/utils/installations/README.md,sha256=hKXnFYmeHEuROFMFE-vzlGLSHg71bei5ZYwyYZphWNk,2
257
257
  bmcgo/utils/installations/__init__.py,sha256=BDXz8BcSlCkfo5UYt6j2rm89-HiYA1ZzfpFhy99MH-0,538
258
258
  bmcgo/utils/installations/base_installer.py,sha256=3UZiKWoa41ygRbLD3QsE2FTp-VFp79V0I53QLRIf4E8,5902
@@ -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.24.dist-info/METADATA,sha256=aVekPJxRxrfTvjLNpuaqdu3ziQW4GxLomcFhfw0zX8Q,1010
268
- openubmc_bingo-0.6.24.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
269
- openubmc_bingo-0.6.24.dist-info/entry_points.txt,sha256=UUoUP-vAWTgg9vEYbRwYqOBHgpRtkngdzMPb-ocz90g,42
270
- openubmc_bingo-0.6.24.dist-info/top_level.txt,sha256=9AcvCAt1nZcOgMsGt6T07mg2Bgtdet-3mHTwg91axgI,6
271
- openubmc_bingo-0.6.24.dist-info/RECORD,,
267
+ openubmc_bingo-0.6.27.dist-info/METADATA,sha256=RJul5-nRe2BswGFKly97xf_nQAlfpNu2_AeO1OOOAs0,1010
268
+ openubmc_bingo-0.6.27.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
269
+ openubmc_bingo-0.6.27.dist-info/entry_points.txt,sha256=UUoUP-vAWTgg9vEYbRwYqOBHgpRtkngdzMPb-ocz90g,42
270
+ openubmc_bingo-0.6.27.dist-info/top_level.txt,sha256=9AcvCAt1nZcOgMsGt6T07mg2Bgtdet-3mHTwg91axgI,6
271
+ openubmc_bingo-0.6.27.dist-info/RECORD,,