diff options
Diffstat (limited to 'bm')
-rwxr-xr-x | bm | 200 |
1 files changed, 200 insertions, 0 deletions
@@ -0,0 +1,200 @@ +#!/usr/bin/python +from BuildManager.optionparser import * +from BuildManager.build import * +from BuildManager import * +import fnmatch +import logging +import sys, os +import pwd + +AUTHOR = "Gustavo Niemeyer <niemeyer@conectiva.com>" +VERSION = "2.1" + +def passtrough(option, opt, val, parser): + opts = parser.values + if opt == "--define": + assert option.nargs == 1 + opts.options.insert(0, opt) + opts.options.insert(1, "'%s'" % parser.rargs[0].replace("'", r"\'")) + else: + opts.options.append(opt) + for val in parser.rargs[:option.nargs]: + opts.options.append("'%s'" % val.replace("'", r"\'")) + del parser.rargs[:option.nargs] + +def parse_options(): + parser = OptionParser("%prog [OPTIONS] [<rpm dir>] [<spec file>] [<srpm file>]", + version="%prog "+VERSION) + parser.add_option("-a", dest="mode", action="store_const", const="all", + help="do everything and build source and binary packages" + " (default)", default="all") + parser.add_option("-u", dest="mode", action="store_const", const="unpack", + help="just unpack") + parser.add_option("-p", dest="mode", action="store_const", const="prep", + help="unpack and run %prep stage") + parser.add_option("-c", dest="mode", action="store_const", const="compile", + help="unpack, run %prep, and compile") + parser.add_option("-i", dest="mode", action="store_const", const="install", + help="unpack, run %prep, compile and install"), + parser.add_option("-s", dest="mode", action="store_const", const="source", + help="do everything and build source packages") + parser.add_option("-b", dest="mode", action="store_const", const="binary", + help="do everything and build binary packages") + parser.add_option("-l", dest="show_log", action="store_true", + help="show rpm output, besides copying to the log file") + parser.add_option("-j", dest="parallel", metavar="N", type="int", default=1, + help="specify number of packages to build in parallel") + parser.add_option("-o", dest="options", action="append", + metavar="OPT", default=[], + help="pass given parameters directly to rpm") + parser.add_option("--unpack-dir", metavar="DIR", default="/var/tmp", + help="specify directory where to unpack file(s)") + parser.add_option("--build-log", metavar="FILE", + help="specify where to put the build log for each package") + parser.add_option("--move-srpm", metavar="DIR", + help="move built srpm packages to given directory") + parser.add_option("--move-rpm", metavar="DIR", + help="move built rpm packages to given directory") + parser.add_option("--move-failed-srpm", metavar="DIR", + help="move original srpm packages to given directory, if failed") + parser.add_option("--copy-failed-srpm", metavar="DIR", + help="copy original srpm packages to given directory, if failed") + parser.add_option("--remove-failed-srpm", action="store_true", + help="remove original srpm packages, if failed") + parser.add_option("--move-succeeded-srpm", metavar="DIR", + help="move original srpm packages to given directory, if succeeded") + parser.add_option("--copy-succeeded-srpm", metavar="DIR", + help="copy original srpm packages to given directory, if succeeded") + parser.add_option("--remove-succeeded-srpm", action="store_true", + help="remove original srpm packages, if succeeded") + parser.add_option("--move-log", metavar="DIR", + help="move log files to given directory") + parser.add_option("--move-failed-log", metavar="DIR", + help="move log files to given directory, if failed") + parser.add_option("--filter-renew", metavar="DIR", action="append", default=[], + help="don't build packages if a newer version exists in given directory") + parser.add_option("--filter-refresh", metavar="DIR", action="append", default=[], + help="only build packages if an older version exists in given directory") + parser.add_option("--clean", action="store_true", + help="recursively remove directory used as topdir after the build process") + parser.add_option("--clean-on-success", action="store_true", + help="same as --clean, but only remove if build has succeeded") + parser.add_option("--ignore", metavar="PKGNAME", action="append", default=[], + help="ignore given package names (shell globbing allowed)") + + # Passtrough options + parser.add_option("--sign", action="callback", nargs=0, callback=passtrough, + help="pass this option to rpm") + parser.add_option("--nodeps", action="callback", nargs=0, callback=passtrough, + help="pass this option to rpm") + parser.add_option("--debug", action="callback", nargs=0, callback=passtrough, + help="pass this option to rpm") + parser.add_option("--short-circuit", action="callback", nargs=0, callback=passtrough, + help="pass this option to rpm") + parser.add_option("--with", action="callback", nargs=1, callback=passtrough, + help="pass this option to rpm") + parser.add_option("--without", action="callback", nargs=1, callback=passtrough, + help="pass this option to rpm") + parser.add_option("--define", action="callback", nargs=1, callback=passtrough, + help="pass this option to rpm") + parser.add_option("--target", action="callback", nargs=1, callback=passtrough, + help="pass this option to rpm") + + parser.add_option("--dryrun", dest="dryrun", action="store_true", + help="do not commit changes to the system") + parser.add_option("--log", dest="loglevel", metavar="LEVEL", + help="set logging level to LEVEL (debug, info, " + "warning, error)", default="info") + opts, args = parser.parse_args() + opts.args = args + + if not opts.args: + # Let's try to find a spec file by ourselves + dir = os.getcwd() + if dir[-6:] == "/SPECS": + dir = "./" + elif os.path.isdir("./SPECS"): + dir = "./SPECS" + else: + while dir != "/": + dir = os.path.dirname(dir) + tmpdir = dir+"/SPECS" + if os.path.isdir(tmpdir): + dir = tmpdir + break + else: + raise Error, "couldn't guess SPECS directory" + filelist = os.listdir(dir) + for file in filelist[:]: + if file[-5:] != ".spec": + filelist.remove(file) + if len(filelist) != 1: + raise Error, "couldn't guess spec file in "+dir + opts.args = [os.path.join(dir, filelist[0])] + else: + # Detect directories with a SPECS/ directory inside it + for i in range(len(opts.args)): + specsdir = os.path.join(opts.args[i]+"/SPECS") + if os.path.isdir(specsdir): + filelist = os.listdir(specsdir) + for file in filelist[:]: + if file[-5:] != ".spec": + filelist.remove(file) + if len(filelist) != 1: + raise Error, "couldn't guess spec file in "+specsdir + opts.args[i] = os.path.join(specsdir, filelist[0]) + + opts.filter_renew = [y for x in opts.filter_renew + for y in x.split()] + opts.filter_refresh = [y for x in opts.filter_refresh + for y in x.split()] + + for attr in ["unpack_dir", "move_srpm", "move_rpm", + "move_failed_srpm", "copy_failed_srpm", + "move_succeeded_srpm", "copy_succeeded_srpm", + "move_log", "move_failed_log", + "filter_renew", "filter_refresh"]: + attrval = getattr(opts, attr) + error = False + if type(attrval) is list: + for attrval in attrval: + if attrval and not os.path.isdir(attrval): + error = True + break + else: + if attrval and not os.path.isdir(attrval): + error = True + if error: + raise Error, "value of --%s must be a directory" \ + % attr.replace("_", "-") + + old_ignore = opts.ignore + opts.ignore = [] + for ignore in old_ignore: + for item in ignore.split(): + opts.ignore.append(re.compile(fnmatch.translate(item))) + + return opts + +def main(): + # Get the right $HOME, even when using sudo. + if os.getuid() == 0: + os.environ["HOME"] = pwd.getpwuid(0)[5] + try: + opts = parse_options() + logger.setLevel(logging.getLevelName(opts.loglevel.upper())) + logger.debug("starting bm") + builder = PackageBuilder(opts) + status = builder.run() + except Error, e: + logger.error(str(e)) + logger.debug("finishing bm with error") + sys.exit(1) + else: + logger.debug("finishing bm") + sys.exit(int(not status)) + +if __name__ == "__main__": + main() + +# vim:et:ts=4:sw=4 |