Skip to content
Snippets Groups Projects
Commit 3832f06a authored by Lorenz Huedepohl's avatar Lorenz Huedepohl
Browse files

Command mpcdf_push as replacement for submitreqs

parent cf7621ae
No related branches found
No related tags found
No related merge requests found
Pipeline #
#!/usr/bin/python2
from __future__ import print_function
from six.moves import input
import time
import mpcdf_common
import os
import osc
import osc.conf
import osc.core
import osc.cmdln
from xml.etree import ElementTree
@osc.cmdln.option('-b', "--batch", action="store_true",
help="do not ask for confirmation")
@osc.cmdln.option('-m', "--message", nargs=1,
help="message to include in the submit request")
def do_mpcdf_push(self, subcmd, opts, *args):
"""${cmd_name}: Branch all packages from one project to another
"""${cmd_name}: Push packages from a home project to a general project
All packages from FROM_PROJECT (that do not yet exist in the target
project) are branched into TO_PROJECT.
You would typically use this to push your home project package into the
"software" project.
Packages that already exist are not branched/modified but the repository
configuration is updated to match the attribute settings from FROM_PROJECT.
If the package does not yet exist on the target project, it is created
there and your source project is connected to that as a branch (by using
the osc mpcdf_set_as_branch command)
Usage:
osc mpcdf_push FROM_PROJECT TO_PROJECT
osc mpcdf_push FROM_PROJECT PACKAGE TO_PROJECT
osc mpcdf_push TO_PROJECT (from within a package checkout)
osc mpcdf_push PACKAGE TO_PROJECT (from within a project checkout)
osc mpcdf_push FROM_PROJECT PACKAGE TO_PROJECT (anywhere)
Examples:
- Add a new package from your home:project to software:
#> osc mpcdf_push home:$USER newpkg_1_2 software
${cmd_option_list}
"""
if len(args) < 2:
if len(args) < 1:
raise osc.oscerr.WrongArgs("Not enough arguments")
elif len(args) == 1:
to_project, = args
if osc.core.is_package_dir(os.curdir):
package = osc.core.store_read_package(os.curdir)
from_project = osc.core.store_read_project(os.curdir)
else:
raise osc.oscerr.WrongArgs('Specify FROM_PROJECT and/or PACKAGE or run command in a package or project checkout directory')
elif len(args) == 2:
from_project, to_project = args
package = None
package, to_project = args
if osc.core.is_project_dir(os.curdir):
from_project = osc.core.store_read_project(os.curdir)
else:
raise osc.oscerr.WrongArgs('Specify FROM_PROJECT or run command in an osc package or project checkout directory')
elif len(args) == 3:
from_project, package, to_project = args
else:
......@@ -36,53 +61,37 @@ def do_mpcdf_push(self, subcmd, opts, *args):
api_url = self.get_api_url()
if package is None:
from_packages = osc.core.meta_get_packagelist(api_url, from_project)
else:
from_packages = [package]
to_packages = osc.core.meta_get_packagelist(api_url, to_project)
project_attributes = ["MPCDF:compiler_modules", "MPCDF:cuda_modules", "MPCDF:mpi_modules"]
package_attributes = ["MPCDF:enable_repositories"] + project_attributes
for attribute in project_attributes:
try:
mpcdf_common.get_attribute(api_url, to_project, None, attribute)
except Exception:
attr = mpcdf_common.get_attribute(api_url, from_project, None, attribute)
print("Setting attribute", attribute)
mpcdf_common.set_attribute(api_url, (to_project,), attr)
for orig_package in from_packages:
if orig_package not in to_packages:
filelist = osc.core.meta_get_filelist(api_url, from_project, orig_package)
if "_link" in filelist:
print("Not branching package {0}, is a link".format(orig_package))
else:
print("Branching package {0}".format(orig_package))
exists, targetprj, targetpkg, srcprj, srcpkg = \
osc.core.branch_pkg(api_url, from_project, orig_package, target_project=to_project, nodevelproject=True)
else:
print("Not branching package {0}, already present in target".format(orig_package))
req_id = osc.core.create_submit_request(api_url, from_project, package, dst_project=to_project,
message="Update {0} from {1}".format(package, from_project) if not opts.message else opts.message)
print("Submitted package {0} to {1} in request {2}".format(package, to_project, req_id))
if not opts.batch:
print(" PLEASE review the request by 'osc request show {0} --diff', or in the web interface".format(req_id))
print(" Do you want to accept the request right away? [y/N] ", end="")
response = input().lower()
if response == "y":
result = osc.core.change_request_state(api_url, req_id, 'accepted', "Accepted on the command line via 'osc mpcdf_push'")
print(" Accepting request {0}:".format(req_id), result)
# Give the system some time, sadly there is no transactional guarantee
time.sleep(2)
url = osc.core.makeurl(api_url, ["source", to_project])
entries = ElementTree.fromstringlist(osc.core.streamfile(url, osc.core.http_GET))
if entries.find('./entry[@name="{0}"]'.format(package)) is not None:
for attribute in package_attributes:
try:
attr = mpcdf_common.get_attribute(api_url, from_project, orig_package, attribute)
except Exception:
continue
mpcdf_common.set_attribute(api_url, (to_project, orig_package), attr)
if package is None:
# Check if distribution is already set in to_project
to_prj_meta = mpcdf_common.project_meta(api_url, to_project)
sys_repo = to_prj_meta.find('./repository[@name="System"]')
if sys_repo is None:
distribution = mpcdf_common.project_meta(api_url, from_project).find('./repository[@name="System"]/path[@project="distributions"]').get("repository")
else:
distribution = sys_repo.find('./path[@project="distributions"]').get("repository")
if mpcdf_common.has_attribute(api_url, from_project, package, attribute):
print("Setting attribute", attribute)
attr = mpcdf_common.get_attribute(api_url, from_project, package, attribute)
mpcdf_common.set_attribute(api_url, to_project, package, attr)
print("Creating repository configuration")
mpcdf_common.mpcdf_setup_repos(api_url, to_project, distribution)
else:
if not mpcdf_common.mpcdf_enable_repositories(api_url, to_project, package):
print("ATTENTION: Not changing unmanaged package {0}".format(package))
filelist = osc.core.meta_get_filelist(api_url, from_project, package)
if "_link" not in filelist:
print("Setting branch relationship")
mpcdf_common.set_as_branch(api_url, from_project, package, to_project, package)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment