def handler(error): """handler(error) Handle GLError and, if it was just a warning, continue to work.""" message = "" warning = False if (error.errno == 1): message += ("cannot find %s" % (error.args[1])) message += " - make sure you run gnulib-tool from within your package's directory" elif (error.errno == 2): message += "invalid LGPL version number for --lgpl" elif (error.errno == 3): message += ("file %s not found" % (error.args[1])) elif (error.errno == 4): message += ("patch file %s didn\'t apply cleanly" % (error.args[1])) elif (error.errno == 5): message += "minimum supported autoconf version is 2.59. " message += " Try adding AC_PREREQ" message += ("([%s])" % (constants.DEFAULT_AUTOCONF_MINVERSION)) message += " to your configure.ac." elif (error.errno == 6): message += ("%s/gnulib-cache.m4" (functions.joinpath(error.args[1], "gnulib-comp.m4"))) message += (" is expected to contain gl_M4_BASE([%s])" % (error.args[1])) elif (error.errno == 7): message += "missing --source-base option" elif (error.errno == 8): message = "missing --doc-base option. --doc-base has been introduced on 2006-07-11;" message += " if your last invocation of \'gnulib-tool --import\' is before that date," message += " you need to run \'gnulib-tool --import\' once, with a --doc-base option." elif (error.errno == 9): message += "missing --tests-base option" elif (error.errno == 10): message += "missing --lib option" elif (error.errno == 11): message += ("%s: option --conditional-dependencies" % (system["SCRIPT"])) message += " is not supported with --with-tests" sys.stderr.write(message) sys.exit(1) elif (error.errno == 12): licenses = str() message += "incompatible license on modules:\n" for pair in error.args[0]: licenses += pair[0] licenses += " " licenses += pair[1] licenses += "\n" tempname = os.path.join(system["TEMPDIR"], "temp") with codecs.open(tempname, "wb", "UTF-8") as stream: stream.write(licenses) sed_table = ("s,^\\([^ ]*\\) ,\\1" + (" " * 51) + ",\n") sed_table += ("s,^\\(" + ("." * 49) +"[^ ]*\\) *," + (" " * 17) +"\\1 ,") licenses = bytes(sp.check_output(["sed", "-e", sed_table, tempname])) message += licenses.decode("UTF-8") os.remove(tempname) elif (error.errno == 13): warning = True message += ("module %s doesn't exist" % (error.args[1])) elif (error.errno == 14): warning = True message += ("module %s lacks a License\n" % (error.args[1])) elif (error.errno == 15): message += "refusing to do nothing" elif (error.errno == 16): message += "failed" if not (warning): system.error(message) try: sys.exc_clear() except GLError as newerror: handler(newerror)
def execute(mode, system, config): """execute(mode, system, config) -> int Execute gnulib-tool script.""" if mode in ['list']: filesystem = GLFileSystem(system, config) modulesystem = GLModuleSystem(filesystem) listing = modulesystem.listing() result = '\n'.join(listing) print(result) elif mode in ['import', 'add-import', 'remove-import', 'update']: modes = \ { 'import' : constants.MODE_IMPORT, 'add-import' : constants.MODE_ADD_IMPORT, 'remove-import' : constants.MODE_DEL_IMPORT, 'update' : constants.MODE_UPDATE, } mode = modes[mode] m4dirs = list() if (mode == constants.MODE_IMPORT): # Apply import to a particular gnulib directory. # The command line contains the complete specification; # don't look at the contents of gnulib-cache.m4. m4dirs = [["m4", config["m4base"]][bool(config["m4base"])]] config["sourcebase"] = ["lib", config["sourcebase"]][bool(config["sourcebase"])] config["docbase"] = ["doc", config["docbase"]][bool(config["docbase"])] config["testsbase"] = ["tests", config["testsbase"]][bool(config["testsbase"])] config["macroprefix"] = ["gl", config["macroprefix"]][bool(config["macroprefix"])] else: if (config["m4base"]): # Apply import to a particular gnulib directory. # Any number of additional modules can be given. m4dirs = [config["m4base"]] config["sourcebase"] = ["lib", config["sourcebase"]][bool(config["sourcebase"])] config["docbase"] = ["doc", config["docbase"]][bool(config["docbase"])] config["testsbase"] = ["tests", config["testsbase"]][bool(config["testsbase"])] config["macroprefix"] = ["gl", config["macroprefix"]][bool(config["macroprefix"])] else: m4dirs = functions.m4base_find(config["destdir"]) if ((len(m4dirs) > 1) and (len(sys.argv) > 2)): message = "Ambiguity: to which directory should the modules be added?" message += " Please specify at least --m4-base=..." system.error(message) # For every found m4dir try to make import. for m4base in m4dirs: config["m4base"] = m4base config["destdir"] = [".", config["destdir"]][bool(config["destdir"])] importer = GLImporter(system, config, mode) fl_remove = importer.filelist("remove") fl_create = importer.filelist("create") fl_update = importer.filelist("update") importer.execute(fl_remove, fl_create, fl_update) elif (mode == "create-testdir"): if (not(config["destdir"])): system.error("please specify --dir option") config["auxdir"] = ["build-aux", config["auxdir"]][bool(config["auxdir"])] testdir = GLTestDir(system, config) filelist = testdir.filelist() testdir.execute(filelist) elif (mode == "create-megatestdir"): if (not(config["destdir"])): system.error("please specify --dir option") config["auxdir"] = ["build-aux", config["auxdir"]][bool(config["auxdir"])] megatestdir = GLMegaTestDir(system, config) megatestdir.execute() elif (mode in ["test", "megatest"]): if (not(config["destdir"])): config["destdir"] = ('testdir %04d' % (random.randrange(0, 9999))) config["auxdir"] = ["build-aux", config["auxdir"]][bool(config["auxdir"])] if (mode == "test"): testdir = GLTestDir(system, config) filelist = testdir.filelist() testdir.execute(filelist) else: megatestdir = GLMegaTestDir(config, destdir) megatestdir.execute() os.chdir(config["destdir"]) os.mkdir('build') os.chdir('build') try: sp.call(['../configure'], shell=True) sp.call([system['make']], shell=True) sp.call([system['make'], 'check'], shell=True) sp.call([system['make'], 'distclean'], shell=True) except Exception as error: args = ["find", ".", "-type", "f", "-print"] remaining = bytes(sp.check_output(args, shell=True)) remaining = remaining.decode("UTF-8") remaining = [i.strip() for i in remaining.split("\n") if i.strip()] if (remaining): message = ("Remaining files: %s\n" % (" ".join(remaining))) message += 'gnulib-tool: *** Stop.\n' sys.stderr.write(message) sys.exit(1) os.chdir('../..') sp.call(['rm', '-rf', config["destdir"]], shell=True) elif (mode == "extract-description"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.description) elif (mode == "extract-comment"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.comment) elif (mode == "extract-status"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print("\n".join(module.status)) elif (mode == "extract-notice"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.notice) elif (mode == "extract-applicability"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.applicability) elif (mode == "extract-filelist"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print("\n".join(module.files)) elif (mode == "extract-dependencies"): result = str() if (config["avoids"]): message = '%s: *** ' % constants.APP['name'] message += 'cannot combine --avoid and --extract-dependencies\n' message += '%s: *** Exit.\n' % constants.APP['name'] sys.stderr.write(message) sys.exit(1) modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: dependencies = module.dependencies if (dependencies): for depmodule, condition in dependencies: if (condition == None): result += ('%s\n' % (depmodule.name)) else: result += ('%s\t%s' % (depmodule.name, condition)) print(result) elif (mode == "extract-autoconf-snippet"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.ac_snippet) elif (mode == "extract-automake-snippet"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.am_snippet) elif (mode == "extract-include-directive"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.include) elif (mode == "extract-link-directive"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.link) elif (mode == "extract-license"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.license) elif (mode == "extract-maintainer"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.maintainer) elif (mode == "extract-tests-module"): modulesystem = GLModuleSystem(system, config) for module in modulesystem["modules/base"]: print(module.tests_name) elif (mode == "copy-file"): src = config["files"][0] argc = len(config["files"]) if (argc == 1): dest = "." elif (argc == 2): dest = config["files"][1] else: system.error("invalid number of arguments for --copy-file") config["auxdir"] = ["build-aux", config["auxdir"]][bool(config["auxdir"])] config["sourcebase"] = ["lib", config["sourcebase"]][bool(config["sourcebase"])] config["m4base"] = ["m4", config["m4base"]][bool(config["m4base"])] config["docbase"] = ["doc", config["docbase"]][bool(config["docbase"])] config["testsbase"] = ["tests", config["testsbase"]][bool(config["testsbase"])] config["macroprefix"] = ["gl", config["macroprefix"]][bool(config["macroprefix"])] filesystem = GLFileSystem(system, config) lookedup, flag = filesystem.lookup(src) if (os.path.isdir(dest)): destdir = dest dest = config.filename(src) else: destdir = os.path.dirname(dest) dest = os.path.basename(dest) if (not(os.path.isdir(destdir))): os.makedirs(destdir) if (not(config["dryrun"])): dirname = os.path.dirname(dest) if (dirname and (not(os.path.isdir(dirname)))): os.makedirs(dirname) # Copy the file. tmpfile = filesystem.tmpfile(src) shutil.copy(lookedup, tmpfile) path = functions.joinpath(destdir, dest) if (os.path.isfile(path)): filesystem.update(dest, lookedup, flag, tmpfile, True) else: filesystem.create(dest, lookedup, flag, tmpfile)