diff --git a/common/parser_config.py b/common/parser_config.py
index d3ff9fdd58d5abaad4386286e75ef37172f0ac0a..5a37c52b3a1810cefa530d04fc3f72f14b79493c 100644
--- a/common/parser_config.py
+++ b/common/parser_config.py
@@ -69,6 +69,7 @@ class ParserConfigIni(object):
self._init_obs_ignored_package()
self._init_obs_include_project()
self._init_kernel_branch()
+ self._init_release_maintenance_branch()
def _init_branch_list(self):
"""
@@ -141,6 +142,20 @@ class ParserConfigIni(object):
"""
return self.obs_include_projects
+ def _init_release_maintenance_branch(self):
+ """
+ init release maintenance branch list
+ return: None
+ """
+ self.release_maintenance_branchs = self.config.get("release_maintenance_branch", "name").split(" ")
+
+ def get_release_maintenance_branch(self):
+ """
+ get release maintenance branchs
+ return: release maintenance branch list
+ """
+ return self.release_maintenance_branchs
+
def _init_package_info_file(self):
"""
init package info file for store package which is not be updated
diff --git a/config/config.ini b/config/config.ini
index f032e06a885ef657dfb660f2dea6879328e20c53..a64f3c0523331788451dc407ff71cdb17187e902 100644
--- a/config/config.ini
+++ b/config/config.ini
@@ -128,3 +128,5 @@ name = kernel kata-containers runc openEuler-release openEuler-logos openEuler-i
name = openEuler:Factory openEuler:Epol openEuler:Mainline bringInRely openEuler:BaseTools openEuler:C openEuler:Common_Languages_Dependent_Tools openEuler:Erlang openEuler:Golang openEuler:Java openEuler:KernelSpace openEuler:Lua openEuler:Meson openEuler:MultiLanguage openEuler:Nodejs openEuler:Ocaml openEuler:Testing:Perl openEuler:Python openEuler:Qt openEuler:Ruby
[openEuler_kernel_branch]
hck_branch = openEuler-22.09-HCK
+[release_maintenance_branch]
+name = master multi_version openEuler-20.03-LTS-SP1 openEuler-20.03-LTS-SP3 openEuler-22.03-LTS-Next openEuler-22.03-LTS openEuler-22.09
\ No newline at end of file
diff --git a/core/meta_service_manager.py b/core/meta_service_manager.py
new file mode 100644
index 0000000000000000000000000000000000000000..a82a2e06962502e342ae65807e17a6089526c5e0
--- /dev/null
+++ b/core/meta_service_manager.py
@@ -0,0 +1,223 @@
+#!/bin/env python3
+# -*- encoding=utf8 -*-
+#******************************************************************************
+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+# licensed under the Mulan PSL v2.
+# You can use this software according to the terms and conditions of the Mulan PSL v2.
+# You may obtain a copy of Mulan PSL v2 at:
+# http://license.coscl.org.cn/MulanPSL2
+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# PURPOSE.
+# See the Mulan PSL v2 for more details.
+# Author: dongjie
+# Create: 2022-09-04
+# ******************************************************************************
+
+"""
+align obs_meta pkg service and release_management yaml pkg
+"""
+import os
+import re
+import sys
+import yaml
+import shutil
+import datetime
+now_path = os.path.join(os.path.split(os.path.realpath(__file__))[0])
+sys.path.append(os.path.join(now_path, ".."))
+from common.log_obs import log
+from common.parser_config import ParserConfigIni
+
+
+
+class MetaServiceManager(object):
+ def __init__(self, **kwargs):
+ """
+ giteeuser: gitee user name
+ giteeuserpwd: gitee password
+ branch: need check branchs
+ obs_meta_path: repo obs_meta path
+ release_management_path: repo release_management path
+ """
+ self.kwargs = kwargs
+ self.giteeuser = self.kwargs['gitee_user']
+ self.giteeuserpwd = self.kwargs['gitee_pwd']
+ self.branch = self.kwargs['align_meta_service_branch']
+ self.obs_meta_path = self.kwargs['obs_meta_path']
+ self.release_management_path = self.kwargs['release_management_path']
+ par = ParserConfigIni()
+ self.release_maintenance_branchs = par.get_release_maintenance_branch()
+
+ def get_pkgs_from_yaml(self, branch):
+ """
+ branch: branch name
+ return: branch pkgs dict
+ """
+ all_branch_pkgs = []
+ project_pkgs = {}
+ if os.path.exists(os.path.join(self.release_management_path, branch)):
+ standard_dirs = os.listdir(os.path.join(self.release_management_path, branch))
+ for standard_dir in standard_dirs:
+ file_path = os.path.join(self.release_management_path, branch, standard_dir)
+ if not os.path.isdir(file_path) or standard_dir == 'delete':
+ standard_dirs.remove(standard_dir)
+ for c_dir in standard_dirs:
+ release_path = os.path.join(self.release_management_path, branch, c_dir, 'pckg-mgmt.yaml')
+ if os.path.exists(release_path):
+ with open(release_path, 'r', encoding='utf-8') as f:
+ result = yaml.load(f, Loader=yaml.FullLoader)
+ all_branch_pkgs.extend(result['packages'])
+ if branch == 'multi_version':
+ for pkg in all_branch_pkgs:
+ temp_key = '{}/{}'.format(pkg['destination_dir'], pkg['obs_to'])
+ project_pkgs.setdefault(temp_key, []).append(pkg['name'])
+ else:
+ for pkg in all_branch_pkgs:
+ project_pkgs.setdefault(pkg['obs_to'], []).append(pkg['name'])
+ else:
+ log.error("this branch {} not exist in repo release_management".format(branch))
+ return project_pkgs
+
+ def get_pkgs_from_meta(self, branch, project):
+ """
+ branch: branch name
+ project: project name
+ return: none
+ """
+ meta_pkglist = os.listdir(os.path.join(self.obs_meta_path, branch, project))
+ if 'README.md' in meta_pkglist:
+ meta_pkglist.remove('README.md')
+ return meta_pkglist
+
+ def compare_with_meta_yaml(self, branch, yaml_pkgs):
+ """
+ branch: branch name
+ yaml_pkgs: branch pkgs info
+ return: none
+ """
+ for project, yamlpkgs in yaml_pkgs.items():
+ meta_pkglist = self.get_pkgs_from_meta(branch, project)
+ need_del_pkg = set(meta_pkglist) - set(yamlpkgs)
+ need_add_pkg = set(yamlpkgs) - set(meta_pkglist)
+ log.info("obs_meta {} {} redundant pkg:{}".format(branch, project, list(need_del_pkg)))
+ log.info("obs_meta {} {} lack pkg:{}".format(branch, project, list(need_add_pkg)))
+ self.add_pkg_to_meta(branch, project, need_add_pkg)
+ self.del_pkg_from_meta(branch, project, need_del_pkg)
+
+ def add_pkg_to_meta(self, branch, project, add_pkgs):
+ """
+ branch: branch name
+ project: project name
+ add_pkgs: need add pkgs list
+ return: none
+ """
+ if add_pkgs:
+ if branch == 'multi_version':
+ branch = project.split('/')[0]
+ project_path = os.path.join(self.obs_meta_path, 'multi_version', project)
+ else:
+ project_path = os.path.join(self.obs_meta_path, branch, project)
+ for add_pkg in add_pkgs:
+ pkg_path = os.path.join(project_path, add_pkg)
+ pkg_service_path = os.path.join(pkg_path, "_service")
+ if not os.path.exists(pkg_path):
+ os.makedirs(pkg_path)
+ self._write_service_file(pkg_path, add_pkg, branch)
+ if os.path.exists(pkg_service_path):
+ log.info("add {} {} {} _service succeed!".format(branch, project, add_pkg))
+ else:
+ log.error("add {} {} {} _service failed!".format(branch, project, add_pkg))
+
+
+
+ def del_pkg_from_meta(self, branch, project, del_pkgs):
+ """
+ branch: branch name
+ project: project name
+ del_pkgs: need delete pkgs list
+ return: none
+ """
+ if del_pkgs:
+ for del_pkg in del_pkgs:
+ if 'Multi-Version' in branch:
+ dir_name = '{}/{}'.format(branch, project)
+ pkg_path = os.path.join(self.obs_meta_path, 'multi_version', dir_name, del_pkg)
+ else:
+ pkg_path = os.path.join(self.obs_meta_path, branch, project, del_pkg)
+ if os.path.exists(pkg_path):
+ shutil.rmtree(pkg_path)
+ log.info("delete {} {} {} succeed!".format(branch, project, del_pkg))
+
+ def _write_service_file(self, filepath, package, pkg_branch):
+ '''
+ write service file
+ '''
+ if pkg_branch == 'master':
+ file_msg = """
+
+ git
+ git@gitee.com:src-openeuler/{}.git
+ *
+ *
+ master
+
+""".format(package)
+ else:
+ file_msg = """
+
+ repo
+ next/{}/{}
+
+ """.format(pkg_branch, package)
+ try:
+ with open(os.path.join(filepath, '_service'), 'w') as f:
+ f.write(file_msg)
+ except Exception as e:
+ log.info(e)
+
+ def align_meta_yaml(self, branch):
+ """
+ branch: branch name
+ return: code of status
+ """
+ project_pkgs = self.get_pkgs_from_yaml(branch)
+ self.compare_with_meta_yaml(branch, project_pkgs)
+
+ def run(self):
+ """
+ Function entry
+ """
+ if self.branch == 'all':
+ need_align_branchs = self.release_maintenance_branchs
+ else:
+ need_align_branchs = self.branch.split(' ')
+ log.info("align meta service by release_management pckg-mgmt.yaml {}".format(need_align_branchs))
+ for branch in need_align_branchs:
+ self.align_meta_yaml(branch)
+ ret = self._push_code(self.obs_meta_path)
+ return ret
+
+ def _push_code(self, repo):
+ """
+ push code to gitee repo
+ """
+ if os.path.exists(repo):
+ os.chdir(repo)
+ cmd = "git status -s"
+ if os.popen(cmd).read():
+ cmd = "git pull && git add -A && git commit -m \"synchronize with pckg-mgmt.yaml file contents\""
+ if os.system(cmd) == 0:
+ cmd = "git push -f"
+ for i in range(5):
+ if os.system(cmd) == 0:
+ log.info("push code to gitee repo succeed!")
+ return 0
+ else:
+ log.error("push code failed, try again...")
+ raise SystemExit("push code to gitee repo Failed!")
+ else:
+ log.info("No change, nothing to commit!")
+ return "nothing to push"
+ else:
+ log.error("%s not exist!" % repo)
+ return -1
\ No newline at end of file
diff --git a/core/runner.py b/core/runner.py
index 7a853484f8286aa8d0a2a2ab5a7ae4f95e2384e1..ab9bb0286032ed23168db680be23f20ea5edf2c1 100644
--- a/core/runner.py
+++ b/core/runner.py
@@ -30,6 +30,7 @@ from core.update_obs_repos import RPMManager
from core.obs_mail_notice import ObsMailNotice
from core.sync_pckg_mgmt import SyncPckgMgmt
from core.check_release_management import CheckReleaseManagement
+from core.meta_service_manager import MetaServiceManager
import os
class Runner(object):
@@ -136,6 +137,15 @@ class Runner(object):
check_mgmt = CheckReleaseManagement(**self.kwargs)
check_mgmt.check_pckg_yaml()
+ def _align_meta_service(self):
+ """
+ align meta pkg service
+ return:
+ """
+ log.debug("align meta pkg service")
+ msm = MetaServiceManager(**self.kwargs)
+ msm.run()
+
def run(self):
"""
run main
@@ -169,3 +179,5 @@ class Runner(object):
self._pckg_mgmt()
elif self.kwargs["check_pckg_mgmt"] == "true":
self._check_release_mgmt()
+ elif self.kwargs["align_meta_service"] == "true":
+ self._align_meta_service()
diff --git a/openeuler_obs.py b/openeuler_obs.py
index 30328c086517064906edea932ba697f60dd90700..073e256dff466a7501ab27cb09cb38ef0d6601ac 100644
--- a/openeuler_obs.py
+++ b/openeuler_obs.py
@@ -113,6 +113,10 @@ par.add_argument("-a", "--ALL_", default=False, help="update all obs repo rpms",
par.add_argument("-cmp", "--compare", default=False, help="compare rpm", required=False)
par.add_argument("-cpm", "--check_pckg_mgmt", default=False,
help="check if there are any problems with the commi for release-management", required=False)
+par.add_argument("-ams", "--align_meta_service", default=False,
+ help="compare with repo obs_meta and release-management add or delete pkg", required=False)
+par.add_argument("-amsb", "--align_meta_service_branch", default=None,
+ help="need compare with repo obs_meta and release-management pkgs branchs", required=False)
args = par.parse_args()
#apply
@@ -158,7 +162,9 @@ kw = {
"pckg_mgmt": args.pckg_mgmt,
"release_management_path": args.remt,
"check_pckg_mgmt": args.check_pckg_mgmt,
- "compare": args.compare
+ "compare": args.compare,
+ "align_meta_service": args.align_meta_service,
+ "align_meta_service_branch": args.align_meta_service_branch
}
run = Runner(**kw)