def run_command(options, args, config_opts, commands, buildroot, state): result = 0 # TODO separate this # Fetch and prepare sources from SCM if config_opts['scm']: try: from mockbuild import scm except ImportError as e: raise mockbuild.exception.BadCmdline( "Mock SCM module not installed: %s. You should install package mock-scm." % e) scmWorker = scm.scmWorker(log, config_opts, config_opts['macros']) with buildroot.uid_manager: scmWorker.get_sources() (options.sources, options.spec) = scmWorker.prepare_sources() if options.mode == 'init': if config_opts['clean']: commands.clean() commands.init() elif options.mode == 'clean': if len(options.scrub) == 0: commands.clean() else: commands.scrub(options.scrub) elif options.mode == 'chain': if len(args) == 0: log.critical("You must specify an SRPM file with --chain") return 50 commands.init(do_log=True) result = commands.chain(args, options, buildroot) elif options.mode == 'shell': if len(args): cmd = args else: cmd = None commands.init(do_log=False) return commands.shell(options, cmd) elif options.mode == 'chroot': if len(args) == 0: log.critical("You must specify a command to run with --chroot") return 50 commands.init(do_log=True) commands.chroot(args, options) elif options.mode == 'installdeps': if len(args) == 0: log.critical("You must specify an SRPM file with --installdeps") return 50 commands.init() rpms = [] for file in args: if os.path.splitext(file)[1] == ".spec": commands.installSpecDeps(file) else: rpms.append(file) if rpms: util.checkSrpmHeaders(rpms, plainRpmOk=1) commands.installSrpmDeps(*rpms) elif options.mode == 'install': if len(args) == 0: log.critical("You must specify a package list to install.") return 50 commands.init() commands.install(*args) elif options.mode == 'update': commands.init() buildroot.pkg_manager.execute('update', *args) elif options.mode == 'remove': if len(args) == 0: log.critical("You must specify a package list to remove.") return 50 commands.init() commands.remove(*args) elif options.mode == 'rebuild': if config_opts['scm'] or (options.spec and options.sources): srpm = mockbuild.rebuild.do_buildsrpm(config_opts, commands, buildroot, options, args) if srpm: args.append(srpm) if config_opts['scm']: scmWorker.clean() options.spec = None options.sources = None else: config_opts['clean'] = False mockbuild.rebuild.do_rebuild(config_opts, commands, buildroot, options, args) elif options.mode == 'buildsrpm': mockbuild.rebuild.do_buildsrpm(config_opts, commands, buildroot, options, args) elif options.mode == 'debugconfig': do_debugconfig(config_opts) elif options.mode == 'orphanskill': util.orphansKill(buildroot.make_chroot_path()) elif options.mode == 'copyin': commands.init() if len(args) < 2: log.critical("Must have source and destinations for copyin") return 50 dest = buildroot.make_chroot_path(args[-1]) if len(args) > 2 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!", dest) return 50 args = args[:-1] for src in args: if not os.path.lexists(src): log.critical("No such file or directory: %s", src) return 50 log.info("copying %s to %s", src, dest) if os.path.isdir(src): dest2 = dest if os.path.exists(dest2): path_suffix = os.path.split(src)[1] dest2 = os.path.join(dest2, path_suffix) if os.path.exists(dest2): log.critical("Destination %s already exists!", dest2) return 50 shutil.copytree(src, dest2) else: shutil.copy(src, dest) buildroot.chown_home_dir() elif options.mode == 'copyout': commands.init() with buildroot.uid_manager: if len(args) < 2: log.critical("Must have source and destinations for copyout") return 50 dest = args[-1] sources = [] for arg in args[:-1]: matches = glob.glob( buildroot.make_chroot_path( arg.replace('~', buildroot.homedir))) if not matches: log.critical("%s not found", arg) return 50 sources += matches if len(sources) > 1 and not os.path.isdir(dest): log.critical( "multiple source files and %s is not a directory!", dest) return 50 for src in sources: log.info("copying %s to %s", src, dest) if os.path.isdir(src): shutil.copytree(src, dest, symlinks=True) else: if os.path.islink(src): linkto = os.readlink(src) os.symlink(linkto, dest) else: shutil.copy(src, dest) elif options.mode in ('pm-cmd', 'yum-cmd', 'dnf-cmd'): log.info('Running %s %s', buildroot.pkg_manager.command, ' '.join(args)) commands.init() buildroot.pkg_manager.execute(*args) elif options.mode == 'snapshot': if len(args) < 1: log.critical("Requires a snapshot name") return 50 buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) elif options.mode == 'rollback-to': if len(args) < 1: log.critical("Requires a snapshot name") return 50 buildroot.plugins.call_hooks('rollback_to', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('rollback_to', args[0], required=True) elif options.mode == 'remove_snapshot': if len(args) < 1: log.critical("Requires a snapshot name") return 50 buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) elif options.mode == 'umount': buildroot.plugins.call_hooks('umount_root') if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('umount_root') elif options.mode == 'mount': buildroot.plugins.call_hooks('mount_root') if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('mount_root') buildroot.nuke_rpm_db() state.finish("run") state.alldone() return result
def run_command(options, args, config_opts, commands, buildroot, state): # TODO separate this # Fetch and prepare sources from SCM if config_opts['scm']: try: import mockbuild.scm as scm except ImportError as e: raise mockbuild.exception.BadCmdline( "Mock SCM module not installed: %s. You should install package mock-scm." % e) scmWorker = scm.scmWorker(log, config_opts['scm_opts'], config_opts['macros']) with buildroot.uid_manager: scmWorker.get_sources() (options.sources, options.spec) = scmWorker.prepare_sources() if options.mode == 'init': if config_opts['clean']: commands.clean() commands.init() elif options.mode == 'clean': if len(options.scrub) == 0: commands.clean() else: commands.scrub(options.scrub) elif options.mode == 'shell': if len(args): cmd = args else: cmd = None commands.init(do_log=False) sys.exit(commands.shell(options, cmd)) elif options.mode == 'chroot': if len(args) == 0: log.critical("You must specify a command to run with --chroot") sys.exit(50) commands.init(do_log=True) commands.chroot(args, options) elif options.mode == 'installdeps': if len(args) == 0: log.critical("You must specify an SRPM file with --installdeps") sys.exit(50) util.checkSrpmHeaders(args, plainRpmOk=1) commands.init() commands.installSrpmDeps(*args) elif options.mode == 'install': if len(args) == 0: log.critical("You must specify a package list to install.") sys.exit(50) commands.init() commands.install(*args) elif options.mode == 'update': commands.init() buildroot.pkg_manager.execute('update', *args) elif options.mode == 'remove': if len(args) == 0: log.critical("You must specify a package list to remove.") sys.exit(50) commands.init() commands.remove(*args) elif options.mode == 'rebuild': if config_opts['scm']: srpm = do_buildsrpm(config_opts, commands, buildroot, options, args) if srpm: args.append(srpm) scmWorker.clean() do_rebuild(config_opts, commands, buildroot, args) elif options.mode == 'buildsrpm': do_buildsrpm(config_opts, commands, buildroot, options, args) elif options.mode == 'orphanskill': util.orphansKill(buildroot.make_chroot_path()) elif options.mode == 'copyin': commands.init() if len(args) < 2: log.critical("Must have source and destinations for copyin") sys.exit(50) dest = buildroot.make_chroot_path(args[-1]) if len(args) > 2 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!", dest) sys.exit(50) args = args[:-1] for src in args: if not os.path.lexists(src): log.critical("No such file or directory: %s", src) sys.exit(50) log.info("copying %s to %s", src, dest) if os.path.isdir(src): dest2 = dest if os.path.exists(dest2): path_suffix = os.path.split(src)[1] dest2 = os.path.join(dest2, path_suffix) if os.path.exists(dest2): log.critical("Destination %s already exists!", dest2) sys.exit(50) shutil.copytree(src, dest2) else: shutil.copy(src, dest) buildroot.chown_home_dir() elif options.mode == 'copyout': commands.init() with buildroot.uid_manager: if len(args) < 2: log.critical("Must have source and destinations for copyout") sys.exit(50) dest = args[-1] sources = [] for arg in args[:-1]: matches = glob.glob(buildroot.make_chroot_path(arg.replace('~', buildroot.homedir))) if not matches: log.critical("%s not found", arg) sys.exit(50) sources += matches if len(sources) > 1 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!", dest) sys.exit(50) for src in sources: log.info("copying %s to %s", src, dest) if os.path.isdir(src): shutil.copytree(src, dest, symlinks=True) else: if os.path.islink(src): linkto = os.readlink(src) os.symlink(linkto, dest) else: shutil.copy(src, dest) elif options.mode in ('pm-cmd', 'yum-cmd', 'dnf-cmd'): log.info('Running %s %s', buildroot.pkg_manager.command, ' '.join(args)) commands.init() buildroot.pkg_manager.execute(*args) elif options.mode == 'snapshot': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) elif options.mode == 'rollback-to': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('rollback_to', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('rollback_to', args[0], required=True) elif options.mode == 'remove_snapshot': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) elif options.mode == 'umount': buildroot.plugins.call_hooks('umount_root') if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('umount_root') elif options.mode == 'mount': buildroot.plugins.call_hooks('mount_root') if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('mount_root') buildroot.nuke_rpm_db() state.finish("run") state.alldone()