示例#1
0
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)
示例#2
0
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)