From 76793cc0ac34523aa237cad407cb8dcb816dac7b Mon Sep 17 00:00:00 2001
From: lethliel <mstrigl@suse.de>
Date: Wed, 11 Dec 2019 14:20:54 +0100
Subject: [PATCH] fix regression in osc chroot
This fixes some regressions with osc chroot:
- osc chroot --wipe --root=/dir/ can now be called outside
a working copy
- osc chroot --noinit --root=/dir/ can now be called outside
a working copy and behaves like the old code (Just entering
the chroot without any modifications)
- The confirmation of the deletion is implemented again and thus
the --force option was implemented too.
---
osc/build.py | 32 ++++++++++++++++++++++++++------
osc/commandline.py | 32 +++++++++++++++++++++++++++++---
2 files changed, 55 insertions(+), 9 deletions(-)
diff --git a/osc/build.py b/osc/build.py
index 8f599b85..46bd61f0 100644
--- a/osc/build.py
+++ b/osc/build.py
@@ -524,6 +524,32 @@ def get_kiwipath_from_buildinfo(apiurl, bi_filename, prj, repo):
kiwipath.insert(0, myprp)
return kiwipath
+def calculate_prj_pac(opts, descr):
+ project = opts.alternative_project or store_read_project('.')
+ if opts.local_package:
+ package = os.path.splitext(os.path.basename(descr))[0]
+ else:
+ package = store_read_package('.')
+ return project, package
+
+def calculate_build_root(apihost, prj, pac, repo, arch):
+ buildroot = os.environ.get('OSC_BUILD_ROOT', config['build-root']) \
+ % {'repo': repo, 'arch': arch, 'project': prj, 'package': pac, 'apihost': apihost}
+ return buildroot
+
+def run_build(*args):
+ cmd = [config['build-cmd']]
+ cmd += args
+
+ sucmd = os.environ.get('OSC_SU_WRAPPER', config['su-wrapper']).split()
+ if sucmd[0] == 'su':
+ if sucmd[-1] == '-c':
+ sucmd.pop()
+ cmd = sucmd + ['-s', cmd[0], 'root', '--'] + cmd[1:]
+ else:
+ cmd = sucmd + cmd
+ return run_external(cmd[0], *cmd[1:])
+
def main(apiurl, opts, argv):
repo = argv[0]
@@ -696,12 +722,6 @@ def main(apiurl, opts, argv):
if opts.shell:
buildargs.append("--shell")
- if os.path.exists(build_root) and os.path.exists(bi_filename) and not opts.clean and not opts.extra_pkgs:
- opts.noinit = True
- opts.offline = True
- # we should check if the service did run before and only skip it then,
- # but we have no save point for this atm
- opts.noservice = True
if opts.noinit:
buildargs.append('--noinit')
diff --git a/osc/commandline.py b/osc/commandline.py
index 78e66e02..cbb8dfe0 100644
--- a/osc/commandline.py
+++ b/osc/commandline.py
@@ -6341,6 +6341,8 @@ Please submit there instead, or use --nodevelproject to force direct submission.
help=SUPPRESS_HELP)
@cmdln.option('--shell-cmd', metavar='COMMAND',
help='run specified command instead of bash')
+ @cmdln.option('-f', '--force', action='store_true',
+ help='Do not ask for confirmation to wipe')
@cmdln.option('--host', metavar='HOST',
help='perform the build on a remote server - user@server:~/remote/directory')
@cmdln.option('--trust-all-projects', action='store_true',
@@ -6425,9 +6427,6 @@ Please submit there instead, or use --nodevelproject to force direct submission.
if opts.debuginfo and opts.disable_debuginfo:
raise oscerr.WrongOptions('osc: --debuginfo and --disable-debuginfo are mutual exclusive')
- if subcmd == 'chroot' or subcmd == 'shell':
- opts.shell = True
-
if subcmd == 'wipe':
opts.wipe = True
@@ -6450,6 +6449,33 @@ Please submit there instead, or use --nodevelproject to force direct submission.
if not opts.vm_type:
opts.vm_type = lastbuildroot[2]
+ vm_chroot = opts.vm_type or conf.config['build-type']
+ if (subcmd in ('shell', 'chroot') or opts.shell or opts.wipe) and not vm_chroot:
+ if opts.root:
+ build_root = opts.root
+ else:
+ args = self.parse_repoarchdescr(args, opts.noinit or opts.offline, opts.alternative_project, False, opts.vm_type, opts.multibuild_package)
+ repo, arch, build_descr = args
+ prj, pac = osc.build.calculate_prj_pac(opts, build_descr)
+ apihost = urlsplit(self.get_api_url())[1]
+ build_root = osc.build.calculate_build_root(apihost, prj, pac, repo,
+ arch)
+ if opts.wipe and not opts.force:
+ # Confirm delete
+ print("Really wipe '%s'? [y/N]: " % build_root)
+ choice = raw_input().lower()
+ if choice != 'y':
+ print('Aborting')
+ sys.exit(0)
+ build_args = ['--root=' + build_root, '--noinit', '--shell']
+ if opts.wipe:
+ build_args.append('--wipe')
+ sys.exit(osc.build.run_build(*build_args))
+ elif subcmd in ('shell', 'chroot') or opts.shell:
+ print('--shell in combination with build-type %s is experimental.' % vm_chroot)
+ print('The semantics may change at any time!')
+ opts.shell = True
+
args = self.parse_repoarchdescr(args, opts.noinit or opts.offline, opts.alternative_project, False, opts.vm_type, opts.multibuild_package)
if not opts.local_package:
--
2.23.0