diff options
author | Dmitry Selyutin <ghostmansd@gmail.com> | 2017-09-08 18:34:58 +0300 |
---|---|---|
committer | Dmitry Selyutin <ghostmansd@gmail.com> | 2017-09-08 18:34:58 +0300 |
commit | 21c52a82444a2f5f3307c7e2c1212beac42b9938 (patch) | |
tree | e8e23e3cf3377bf8f202cd661b0a8f87c7ef07ad /pygnulib/GLImport.py | |
parent | 4be624beba67fb2e6afd981be32b45fe73ecafb2 (diff) | |
download | gnulib-21c52a82444a2f5f3307c7e2c1212beac42b9938.tar.gz |
[pygnulib] autopep8 (fixing indentation, style, etc.)
Diffstat (limited to 'pygnulib/GLImport.py')
-rw-r--r-- | pygnulib/GLImport.py | 2609 |
1 files changed, 1313 insertions, 1296 deletions
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py index 2859a22005..0e85a9a50d 100644 --- a/pygnulib/GLImport.py +++ b/pygnulib/GLImport.py @@ -59,423 +59,428 @@ normpath = os.path.normpath # Define GLImport class #=============================================================================== class GLImport(object): - '''GLImport class is used to provide methods for --import, --add-import, - --remove-import and --update actions. This is a high-level class, so - developers may have to use lower-level classes to create their own - scripts. However, if user needs just to use power of gnulib-tool, this class - is a very good choice.''' - - def __init__(self, config, mode): - '''Create GLImport instance. - The first variable, mode, must be one of the values of the MODES dict - object, which is accessible from constants module. The second one, config, - must be a GLConfig object.''' - if type(config) is not GLConfig: - raise(TypeError('config must have GLConfig type, not %s' % \ - repr(config))) - if type(mode) is int and \ - MODES['import'] <= mode <= MODES['update']: - self.mode = mode - else: # if mode is not int or is not 0-3 - raise(TypeError('mode must be 0 <= mode <= 3, not %s' % \ - repr(mode))) - - # Initialize some values. - self.cache = GLConfig() - self.config = config.copy() - os.rmdir(self.cache['tempdir']) - - # Get cached auxdir and libtool from configure.ac/in. - self.cache.setAuxDir('.') - path = joinpath(self.config['destdir'], 'configure.ac') - if not isfile(path): - path = joinpath(self.config['destdir'], 'configure.in') - if not isfile(path): - raise(GLError(3, path)) - self.config.setAutoconfFile(path) - with codecs.open(path, 'rb', 'UTF-8') as file: - data = file.read() - pattern = compiler(r'^AC_CONFIG_AUX_DIR\((.*?)\)$', re.S | re.M) - match = pattern.findall(data) - if match: - result = cleaner(match)[0] - self.cache.setAuxDir(joinpath(result, self.config['destdir'])) - pattern = compiler(r'A[CM]_PROG_LIBTOOL', re.S | re.M) - guessed_libtool = bool(pattern.findall(data)) - if self.config['auxdir'] == None: - self.config.setAuxDir(self.cache['auxdir']) - - # Guess autoconf version. - pattern = compiler('.*AC_PREREQ\((.*?)\)', re.S | re.M) - versions = cleaner(pattern.findall(data)) - if versions: - version = sorted(set([float(version) for version in versions]))[-1] - self.config.setAutoconfVersion(version) - if version < 2.59: - raise(GLError(4, version)) - - # Get other cached variables. - path = joinpath(self.config['m4base'], 'gnulib-cache.m4') - if isfile(joinpath(self.config['m4base'], 'gnulib-cache.m4')): - with codecs.open(path, 'rb', 'UTF-8') as file: - data = file.read() - - # Create regex object and keys. - pattern = compiler('^(gl_.*?)\\((.*?)\\)$', re.S | re.M) - keys = \ - [ - 'gl_LOCAL_DIR', 'gl_MODULES', 'gl_AVOID', 'gl_SOURCE_BASE', - 'gl_M4_BASE', 'gl_PO_BASE', 'gl_DOC_BASE', 'gl_TESTS_BASE', - 'gl_MAKEFILE_NAME', 'gl_MACRO_PREFIX', 'gl_PO_DOMAIN', - 'gl_WITNESS_C_MACRO', 'gl_VC_FILES', 'gl_LIB', - ] - - # Find bool values. - if 'gl_LGPL(' in data: - keys.append('gl_LGPL') - self.cache.setLGPL(True) - if 'gl_LIBTOOL' in data: - self.cache.enableLibtool() - data = data.replace('gl_LIBTOOL', '') - if 'gl_CONDITIONAL_DEPENDENCIES' in data: - self.cache.enableCondDeps() - data = data.replace('gl_CONDITIONAL_DEPENDENCIES', '') - if 'gl_VC_FILES' in data: - self.cache.enableVCFiles() - data = data.replace('gl_VC_FILES', '') - if 'gl_WITH_TESTS' in data: - self.cache.enableTestFlag(TESTS['tests']) - data = data.replace('gl_WITH_TESTS', '') - if 'gl_WITH_OBSOLETE' in data: - self.cache.enableTestFlag(TESTS['obsolete']) - data = data.replace('gl_WITH_OBSOLETE', '') - if 'gl_WITH_CXX_TESTS' in data: - self.cache.enableTestFlag(TESTS['c++-test']) - data = data.replace('gl_WITH_CXX_TESTS', '') - if 'gl_WITH_LONGRUNNING_TESTS' in data: - self.cache.enableTestFlag(TESTS['longrunning-test']) - data = data.replace('gl_WITH_LONGRUNNING_TESTS', '') - if 'gl_WITH_PRIVILEGED_TESTS' in data: - self.cache.enableTestFlag(TESTS['privileged-test']) - data = data.replace('gl_WITH_PRIVILEGED_TESTS', '') - if 'gl_WITH_UNPORTABLE_TESTS' in data: - self.cache.enableTestFlag(TESTS['unportable-test']) - data = data.replace('gl_WITH_UNPORTABLE_TESTS', '') - if 'gl_WITH_ALL_TESTS' in data: - self.cache.enableTestFlag(TESTS['all-test']) - data = data.replace('gl_WITH_ALL_TESTS', '') - # Find string values - result = dict(pattern.findall(data)) - values = cleaner([result.get(key, '') for key in keys]) - tempdict = dict(zip(keys, values)) - if 'gl_LGPL' in tempdict: - lgpl = cleaner(tempdict['gl_LGPL']) - if lgpl.isdecimal(): - self.cache.setLGPL(int(self.cache['lgpl'])) - else: # if 'gl_LGPL' not in tempdict - self.cache.setLGPL(False) - if tempdict['gl_LIB']: - self.cache.setLibName(cleaner(tempdict['gl_LIB'])) - if tempdict['gl_LOCAL_DIR']: - self.cache.setLocalDir(cleaner(tempdict['gl_LOCAL_DIR'])) - if tempdict['gl_MODULES']: - self.cache.setModules(cleaner(tempdict['gl_MODULES'].split())) - if tempdict['gl_AVOID']: - self.cache.setAvoids(cleaner(tempdict['gl_AVOID'].split())) - if tempdict['gl_SOURCE_BASE']: - self.cache.setSourceBase(cleaner(tempdict['gl_SOURCE_BASE'])) - if tempdict['gl_M4_BASE']: - self.cache.setM4Base(cleaner(tempdict['gl_M4_BASE'])) - if tempdict['gl_PO_BASE']: - self.cache.setPoBase(cleaner(tempdict['gl_PO_BASE'])) - if tempdict['gl_DOC_BASE']: - self.cache.setDocBase(cleaner(tempdict['gl_DOC_BASE'])) - if tempdict['gl_TESTS_BASE']: - self.cache.setTestsBase(cleaner(tempdict['gl_TESTS_BASE'])) - if tempdict['gl_MAKEFILE_NAME']: - self.cache.setMakefile(cleaner(tempdict['gl_MAKEFILE_NAME'])) - if tempdict['gl_MACRO_PREFIX']: - self.cache.setMacroPrefix(cleaner(tempdict['gl_MACRO_PREFIX'])) - if tempdict['gl_PO_DOMAIN']: - self.cache.setPoDomain(cleaner(tempdict['gl_PO_DOMAIN'])) - if tempdict['gl_WITNESS_C_MACRO']: - self.cache.setWitnessCMacro(cleaner(tempdict['gl_WITNESS_C_MACRO'])) - - # Get cached filelist from gnulib-comp.m4. - destdir, m4base = self.config.getDestDir(), self.config.getM4Base() - path = joinpath(destdir, m4base, 'gnulib-comp.m4') - if isfile(path): + '''GLImport class is used to provide methods for --import, --add-import, + --remove-import and --update actions. This is a high-level class, so + developers may have to use lower-level classes to create their own + scripts. However, if user needs just to use power of gnulib-tool, this class + is a very good choice.''' + + def __init__(self, config, mode): + '''Create GLImport instance. + The first variable, mode, must be one of the values of the MODES dict + object, which is accessible from constants module. The second one, config, + must be a GLConfig object.''' + if type(config) is not GLConfig: + raise(TypeError('config must have GLConfig type, not %s' % + repr(config))) + if type(mode) is int and \ + MODES['import'] <= mode <= MODES['update']: + self.mode = mode + else: # if mode is not int or is not 0-3 + raise(TypeError('mode must be 0 <= mode <= 3, not %s' % + repr(mode))) + + # Initialize some values. + self.cache = GLConfig() + self.config = config.copy() + os.rmdir(self.cache['tempdir']) + + # Get cached auxdir and libtool from configure.ac/in. + self.cache.setAuxDir('.') + path = joinpath(self.config['destdir'], 'configure.ac') + if not isfile(path): + path = joinpath(self.config['destdir'], 'configure.in') + if not isfile(path): + raise(GLError(3, path)) + self.config.setAutoconfFile(path) with codecs.open(path, 'rb', 'UTF-8') as file: - data = file.read() - regex = 'AC_DEFUN\\(\\[%s_FILE_LIST\\], \\[(.*?)\\]\\)' % \ - self.cache['macro_prefix'] - pattern = compiler(regex, re.S | re.M) - self.cache.setFiles(pattern.findall(data)[-1].strip().split()) - - # The self.config['localdir'] defaults to the cached one. Recall that the - # cached one is relative to $destdir, whereas the one we use is relative - # to . or absolute. - if not self.config['localdir']: - if self.cache['localdir']: - if isabs(self.config['destdir']): - localdir = joinpath(self.config['destdir'], self.cache['localdir']) - else: # if not isabs(self.config['destdir']) - if isabs(self.cache['localdir']): - localdir = joinpath(self.config['destdir'], self.cache['localdir']) - else: # if not isabs(self.cache['localdir']) - # NOTE: I NEED TO IMPLEMENT RELATIVE_CONCAT - localdir = os.path.relpath(joinpath(self.config['destdir'], - self.cache['localdir'])) - self.config.setLocalDir(localdir) - - if self.mode != MODES['import']: - if self.cache['m4base'] and \ - (self.config['m4base'] != self.cache['m4base']): - raise(GLError(5, m4base)) - - # Perform actions with modules. In --add-import, append each given module - # to the list of cached modules; in --remove-import, remove each given - # module from the list of cached modules; in --update, simply set - # self.config['modules'] to its cached version. - new, old = self.config.getModules(), self.cache.getModules() - if self.mode == MODES['add-import']: - modules = sorted(set(new +old)) - elif self.mode == MODES['remove-import']: - modules = [module for module in old if module in new] - elif self.mode == MODES['update']: - modules = self.cache.getModules() - - # If user tries to apply conddeps and testflag['tests'] together. - if self.config['tests'] and self.config['conddeps']: - raise(GLError(10, None)) - - # Update configuration dictionary. - self.config.update(self.cache) - for key in config.keys(): - value = config[key] - if not config.isdefault(key, value): - self.config.update_key(config, key) - self.config.setModules(modules) - - # Check if conddeps is enabled together with inctests. - inctests = self.config.checkTestFlag(TESTS['tests']) - if self.config['conddeps'] and inctests: - raise(GLError(10, None)) - - # Define GLImport attributes. - self.emiter = GLEmiter(self.config) - self.filesystem = GLFileSystem(self.config) - self.modulesystem = GLModuleSystem(self.config) - self.moduletable = GLModuleTable(self.config, list()) - self.makefiletable = GLMakefileTable(self.config) - - def __repr__(self): - '''x.__repr__ <==> repr(x)''' - result = '<pygnulib.GLImport %s>' % hex(id(self)) - return(result) - - def rewrite_old_files(self, files): - '''GLImport.rewrite_old_files(files) -> list - - Replace auxdir, docbase, sourcebase, m4base and testsbase from default - to their version from cached config.''' - if type(files) is not list: - raise(TypeError( - 'files argument must has list type, not %s' % type(files).__name__)) - files = \ - [ # Begin to convert bytes to string - file.decode(ENCS['default']) \ - if type(file) is bytes else file \ - for file in files - ] # Finish to convert bytes to string - for file in files: - if type(file) is not string: - raise(TypeError('each file must be a string instance')) - files = sorted(set(files)) - files = ['%s%s' % (file, os.path.sep) for file in files] - auxdir = self.cache['auxdir'] - docbase = self.cache['docbase'] - sourcebase = self.cache['sourcebase'] - m4base = self.cache['m4base'] - testsbase = self.cache['testsbase'] - result = list() - for file in files: - if file.startswith('build-aux/'): - path = constants.substart('build-aux/', '%s/' % auxdir, file) - elif file.startswith('doc/'): - path = constants.substart('doc/', '%s/' % docbase, file) - elif file.startswith('lib/'): - path = constants.substart('lib/', '%s/' % sourcebase, file) - elif file.startswith('m4/'): - path = constants.substart('m4/', '%s/' % m4base, file) - elif file.startswith('tests/'): - path = constants.substart('tests/', '%s/' % testsbase, file) - elif file.startswith('tests=lib/'): - path = constants.substart('tests=lib/', '%s/' % testsbase, file) - elif file.startswith('top/'): - path = constants.substart('top/', '', file) - else: # file is not a special file - path = file - result += [os.path.normpath(path)] - result = sorted(set(result)) - return(list(result)) - - def rewrite_new_files(self, files): - '''GLImport.rewrite_new_files(files) - - Replace auxdir, docbase, sourcebase, m4base and testsbase from default - to their version from config.''' - if type(files) is not list: - raise(TypeError( - 'files argument must has list type, not %s' % type(files).__name__)) - files = \ - [ # Begin to convert bytes to string - file.decode(ENCS['default']) \ - if type(file) is bytes else file \ - for file in files - ] # Finish to convert bytes to string - for file in files: - if type(file) is not string: - raise(TypeError('each file must be a string instance')) - files = sorted(set(files)) - auxdir = self.config['auxdir'] - docbase = self.config['docbase'] - sourcebase = self.config['sourcebase'] - m4base = self.config['m4base'] - testsbase = self.config['testsbase'] - result = list() - for file in files: - if file.startswith('build-aux/'): - path = constants.substart('build-aux/', '%s/' % auxdir, file) - elif file.startswith('doc/'): - path = constants.substart('doc/', '%s/' % docbase, file) - elif file.startswith('lib/'): - path = constants.substart('lib/', '%s/' % sourcebase, file) - elif file.startswith('m4/'): - path = constants.substart('m4/', '%s/' % m4base, file) - elif file.startswith('tests/'): - path = constants.substart('tests/', '%s/' % testsbase, file) - elif file.startswith('tests=lib/'): - path = constants.substart('tests=lib/', '%s/' % testsbase, file) - elif file.startswith('top/'): - path = constants.substart('top/', '', file) - else: # file is not a special file - path = file - result += [os.path.normpath(path)] - result = sorted(set(result)) - return(list(result)) - - def actioncmd(self): - '''Return command-line invocation comment.''' - modules = self.config.getModules() - avoids = self.config.getAvoids() - destdir = self.config.getDestDir() - localdir = self.config.getLocalDir() - auxdir = self.config.getAuxDir() - sourcebase = self.config.getSourceBase() - m4base = self.config.getM4Base() - docbase = self.config.getDocBase() - pobase = self.config.getPoBase() - testsbase = self.config.getTestsBase() - testflags = self.config.getTestFlags() - conddeps = self.config.checkCondDeps() - libname = self.config.getLibName() - lgpl = self.config.getLGPL() - makefile = self.config.getMakefile() - libtool = self.config.checkLibtool() - macro_prefix = self.config.getMacroPrefix() - witness_c_macro = self.config.getWitnessCMacro() - podomain = self.config.getPoDomain() - vc_files = self.config.checkVCFiles() - verbose = self.config.getVerbosity() - - # Create command-line invocation comment. - actioncmd = 'gnulib-tool --import' - actioncmd += ' --dir=%s' % destdir - if localdir: - actioncmd += ' --local-dir=%s' % localdir - actioncmd += ' --lib=%s' % libname - actioncmd += ' --source-base=%s' % sourcebase - actioncmd += ' --m4-base=%s' % m4base - if pobase: - actioncmd += ' --po-base=%s' % pobase - actioncmd += ' --doc-base=%s' % docbase - actioncmd += ' --tests-base=%s' % testsbase - actioncmd += ' --aux-dir=%s' % auxdir - if self.config.checkTestFlag(TESTS['tests']): - actioncmd += ' --with-tests' - if self.config.checkTestFlag(TESTS['obsolete']): - actioncmd += ' --with-obsolete' - if self.config.checkTestFlag(TESTS['c++-test']): - actioncmd += ' --with-c++-tests' - if self.config.checkTestFlag(TESTS['longrunning-test']): - actioncmd += ' --with-longrunning-tests' - if self.config.checkTestFlag(TESTS['privileged-test']): - actioncmd += ' --with-privileged-test' - if self.config.checkTestFlag(TESTS['unportable-test']): - actioncmd += ' --with-unportable-tests' - if self.config.checkTestFlag(TESTS['all-test']): - actioncmd += ' --with-all-tests' - for module in avoids: - actioncmd += ' --avoid=%s' % module - if lgpl: - if lgpl == True: - actioncmd += ' --lgpl' - else: # if lgpl != True - actioncmd += ' --lgpl=%s' % lgpl - if makefile: - actioncmd += ' --makefile-name=%s' % makefile - if conddeps: - actioncmd += ' --conditional-dependencies' - else: # if not conddeps - actioncmd += ' --no-conditional-dependencies' - if libtool: - actioncmd += ' --libtool' - else: # if not libtool - actioncmd += ' --no-libtool' - actioncmd += ' --macro-prefix=%s' % macro_prefix - if podomain: - actioncmd = ' --podomain=%s' % podomain - if witness_c_macro: - actioncmd += ' --witness_c_macro=%s' % witness_c_macro - if vc_files == True: - actioncmd += ' --vc-files' - elif vc_files == False: - actioncmd += ' --no-vc-files' - actioncmd += ' ' # Add a space - actioncmd += ' '.join(modules) - return(actioncmd) - - def gnulib_cache(self): - '''GLImport.gnulib_cache() -> string - - Emit the contents of generated $m4base/gnulib-cache.m4 file. - GLConfig: destdir, localdir, tests, sourcebase, m4base, pobase, docbase, - testsbase, conddeps, libtool, macro_prefix, podomain, vc_files.''' - emit = string() - moduletable = self.moduletable - actioncmd = self.actioncmd() - destdir = self.config['destdir'] - localdir = self.config['localdir'] - testflags = list(self.config['testflags']) - sourcebase = self.config['sourcebase'] - m4base = self.config['m4base'] - pobase = self.config['pobase'] - docbase = self.config['docbase'] - testsbase = self.config['testsbase'] - lgpl = self.config['lgpl'] - libname = self.config['libname'] - makefile = self.config['makefile'] - conddeps = self.config['conddeps'] - libtool = self.config['libtool'] - macro_prefix = self.config['macro_prefix'] - podomain = self.config['podomain'] - witness_c_macro = self.config['witness_c_macro'] - vc_files = self.config['vc_files'] - modules = [str(module) for module in moduletable['base']] - avoids = [str(avoid) for avoid in moduletable['avoids']] - emit += self.emiter.copyright_notice() - emit += '''# + data = file.read() + pattern = compiler(r'^AC_CONFIG_AUX_DIR\((.*?)\)$', re.S | re.M) + match = pattern.findall(data) + if match: + result = cleaner(match)[0] + self.cache.setAuxDir(joinpath(result, self.config['destdir'])) + pattern = compiler(r'A[CM]_PROG_LIBTOOL', re.S | re.M) + guessed_libtool = bool(pattern.findall(data)) + if self.config['auxdir'] == None: + self.config.setAuxDir(self.cache['auxdir']) + + # Guess autoconf version. + pattern = compiler('.*AC_PREREQ\((.*?)\)', re.S | re.M) + versions = cleaner(pattern.findall(data)) + if versions: + version = sorted(set([float(version) for version in versions]))[-1] + self.config.setAutoconfVersion(version) + if version < 2.59: + raise(GLError(4, version)) + + # Get other cached variables. + path = joinpath(self.config['m4base'], 'gnulib-cache.m4') + if isfile(joinpath(self.config['m4base'], 'gnulib-cache.m4')): + with codecs.open(path, 'rb', 'UTF-8') as file: + data = file.read() + + # Create regex object and keys. + pattern = compiler('^(gl_.*?)\\((.*?)\\)$', re.S | re.M) + keys = \ + [ + 'gl_LOCAL_DIR', 'gl_MODULES', 'gl_AVOID', 'gl_SOURCE_BASE', + 'gl_M4_BASE', 'gl_PO_BASE', 'gl_DOC_BASE', 'gl_TESTS_BASE', + 'gl_MAKEFILE_NAME', 'gl_MACRO_PREFIX', 'gl_PO_DOMAIN', + 'gl_WITNESS_C_MACRO', 'gl_VC_FILES', 'gl_LIB', + ] + + # Find bool values. + if 'gl_LGPL(' in data: + keys.append('gl_LGPL') + self.cache.setLGPL(True) + if 'gl_LIBTOOL' in data: + self.cache.enableLibtool() + data = data.replace('gl_LIBTOOL', '') + if 'gl_CONDITIONAL_DEPENDENCIES' in data: + self.cache.enableCondDeps() + data = data.replace('gl_CONDITIONAL_DEPENDENCIES', '') + if 'gl_VC_FILES' in data: + self.cache.enableVCFiles() + data = data.replace('gl_VC_FILES', '') + if 'gl_WITH_TESTS' in data: + self.cache.enableTestFlag(TESTS['tests']) + data = data.replace('gl_WITH_TESTS', '') + if 'gl_WITH_OBSOLETE' in data: + self.cache.enableTestFlag(TESTS['obsolete']) + data = data.replace('gl_WITH_OBSOLETE', '') + if 'gl_WITH_CXX_TESTS' in data: + self.cache.enableTestFlag(TESTS['c++-test']) + data = data.replace('gl_WITH_CXX_TESTS', '') + if 'gl_WITH_LONGRUNNING_TESTS' in data: + self.cache.enableTestFlag(TESTS['longrunning-test']) + data = data.replace('gl_WITH_LONGRUNNING_TESTS', '') + if 'gl_WITH_PRIVILEGED_TESTS' in data: + self.cache.enableTestFlag(TESTS['privileged-test']) + data = data.replace('gl_WITH_PRIVILEGED_TESTS', '') + if 'gl_WITH_UNPORTABLE_TESTS' in data: + self.cache.enableTestFlag(TESTS['unportable-test']) + data = data.replace('gl_WITH_UNPORTABLE_TESTS', '') + if 'gl_WITH_ALL_TESTS' in data: + self.cache.enableTestFlag(TESTS['all-test']) + data = data.replace('gl_WITH_ALL_TESTS', '') + # Find string values + result = dict(pattern.findall(data)) + values = cleaner([result.get(key, '') for key in keys]) + tempdict = dict(zip(keys, values)) + if 'gl_LGPL' in tempdict: + lgpl = cleaner(tempdict['gl_LGPL']) + if lgpl.isdecimal(): + self.cache.setLGPL(int(self.cache['lgpl'])) + else: # if 'gl_LGPL' not in tempdict + self.cache.setLGPL(False) + if tempdict['gl_LIB']: + self.cache.setLibName(cleaner(tempdict['gl_LIB'])) + if tempdict['gl_LOCAL_DIR']: + self.cache.setLocalDir(cleaner(tempdict['gl_LOCAL_DIR'])) + if tempdict['gl_MODULES']: + self.cache.setModules(cleaner(tempdict['gl_MODULES'].split())) + if tempdict['gl_AVOID']: + self.cache.setAvoids(cleaner(tempdict['gl_AVOID'].split())) + if tempdict['gl_SOURCE_BASE']: + self.cache.setSourceBase(cleaner(tempdict['gl_SOURCE_BASE'])) + if tempdict['gl_M4_BASE']: + self.cache.setM4Base(cleaner(tempdict['gl_M4_BASE'])) + if tempdict['gl_PO_BASE']: + self.cache.setPoBase(cleaner(tempdict['gl_PO_BASE'])) + if tempdict['gl_DOC_BASE']: + self.cache.setDocBase(cleaner(tempdict['gl_DOC_BASE'])) + if tempdict['gl_TESTS_BASE']: + self.cache.setTestsBase(cleaner(tempdict['gl_TESTS_BASE'])) + if tempdict['gl_MAKEFILE_NAME']: + self.cache.setMakefile(cleaner(tempdict['gl_MAKEFILE_NAME'])) + if tempdict['gl_MACRO_PREFIX']: + self.cache.setMacroPrefix(cleaner(tempdict['gl_MACRO_PREFIX'])) + if tempdict['gl_PO_DOMAIN']: + self.cache.setPoDomain(cleaner(tempdict['gl_PO_DOMAIN'])) + if tempdict['gl_WITNESS_C_MACRO']: + self.cache.setWitnessCMacro( + cleaner(tempdict['gl_WITNESS_C_MACRO'])) + + # Get cached filelist from gnulib-comp.m4. + destdir, m4base = self.config.getDestDir(), self.config.getM4Base() + path = joinpath(destdir, m4base, 'gnulib-comp.m4') + if isfile(path): + with codecs.open(path, 'rb', 'UTF-8') as file: + data = file.read() + regex = 'AC_DEFUN\\(\\[%s_FILE_LIST\\], \\[(.*?)\\]\\)' % \ + self.cache['macro_prefix'] + pattern = compiler(regex, re.S | re.M) + self.cache.setFiles(pattern.findall(data)[-1].strip().split()) + + # The self.config['localdir'] defaults to the cached one. Recall that the + # cached one is relative to $destdir, whereas the one we use is relative + # to . or absolute. + if not self.config['localdir']: + if self.cache['localdir']: + if isabs(self.config['destdir']): + localdir = joinpath( + self.config['destdir'], self.cache['localdir']) + else: # if not isabs(self.config['destdir']) + if isabs(self.cache['localdir']): + localdir = joinpath( + self.config['destdir'], self.cache['localdir']) + else: # if not isabs(self.cache['localdir']) + # NOTE: I NEED TO IMPLEMENT RELATIVE_CONCAT + localdir = os.path.relpath(joinpath(self.config['destdir'], + self.cache['localdir'])) + self.config.setLocalDir(localdir) + + if self.mode != MODES['import']: + if self.cache['m4base'] and \ + (self.config['m4base'] != self.cache['m4base']): + raise(GLError(5, m4base)) + + # Perform actions with modules. In --add-import, append each given module + # to the list of cached modules; in --remove-import, remove each given + # module from the list of cached modules; in --update, simply set + # self.config['modules'] to its cached version. + new, old = self.config.getModules(), self.cache.getModules() + if self.mode == MODES['add-import']: + modules = sorted(set(new + old)) + elif self.mode == MODES['remove-import']: + modules = [module for module in old if module in new] + elif self.mode == MODES['update']: + modules = self.cache.getModules() + + # If user tries to apply conddeps and testflag['tests'] together. + if self.config['tests'] and self.config['conddeps']: + raise(GLError(10, None)) + + # Update configuration dictionary. + self.config.update(self.cache) + for key in config.keys(): + value = config[key] + if not config.isdefault(key, value): + self.config.update_key(config, key) + self.config.setModules(modules) + + # Check if conddeps is enabled together with inctests. + inctests = self.config.checkTestFlag(TESTS['tests']) + if self.config['conddeps'] and inctests: + raise(GLError(10, None)) + + # Define GLImport attributes. + self.emiter = GLEmiter(self.config) + self.filesystem = GLFileSystem(self.config) + self.modulesystem = GLModuleSystem(self.config) + self.moduletable = GLModuleTable(self.config, list()) + self.makefiletable = GLMakefileTable(self.config) + + def __repr__(self): + '''x.__repr__ <==> repr(x)''' + result = '<pygnulib.GLImport %s>' % hex(id(self)) + return(result) + + def rewrite_old_files(self, files): + '''GLImport.rewrite_old_files(files) -> list + + Replace auxdir, docbase, sourcebase, m4base and testsbase from default + to their version from cached config.''' + if type(files) is not list: + raise(TypeError( + 'files argument must has list type, not %s' % type(files).__name__)) + files = \ + [ # Begin to convert bytes to string + file.decode(ENCS['default']) \ + if type(file) is bytes else file \ + for file in files + ] # Finish to convert bytes to string + for file in files: + if type(file) is not string: + raise(TypeError('each file must be a string instance')) + files = sorted(set(files)) + files = ['%s%s' % (file, os.path.sep) for file in files] + auxdir = self.cache['auxdir'] + docbase = self.cache['docbase'] + sourcebase = self.cache['sourcebase'] + m4base = self.cache['m4base'] + testsbase = self.cache['testsbase'] + result = list() + for file in files: + if file.startswith('build-aux/'): + path = constants.substart('build-aux/', '%s/' % auxdir, file) + elif file.startswith('doc/'): + path = constants.substart('doc/', '%s/' % docbase, file) + elif file.startswith('lib/'): + path = constants.substart('lib/', '%s/' % sourcebase, file) + elif file.startswith('m4/'): + path = constants.substart('m4/', '%s/' % m4base, file) + elif file.startswith('tests/'): + path = constants.substart('tests/', '%s/' % testsbase, file) + elif file.startswith('tests=lib/'): + path = constants.substart( + 'tests=lib/', '%s/' % testsbase, file) + elif file.startswith('top/'): + path = constants.substart('top/', '', file) + else: # file is not a special file + path = file + result += [os.path.normpath(path)] + result = sorted(set(result)) + return(list(result)) + + def rewrite_new_files(self, files): + '''GLImport.rewrite_new_files(files) + + Replace auxdir, docbase, sourcebase, m4base and testsbase from default + to their version from config.''' + if type(files) is not list: + raise(TypeError( + 'files argument must has list type, not %s' % type(files).__name__)) + files = \ + [ # Begin to convert bytes to string + file.decode(ENCS['default']) \ + if type(file) is bytes else file \ + for file in files + ] # Finish to convert bytes to string + for file in files: + if type(file) is not string: + raise(TypeError('each file must be a string instance')) + files = sorted(set(files)) + auxdir = self.config['auxdir'] + docbase = self.config['docbase'] + sourcebase = self.config['sourcebase'] + m4base = self.config['m4base'] + testsbase = self.config['testsbase'] + result = list() + for file in files: + if file.startswith('build-aux/'): + path = constants.substart('build-aux/', '%s/' % auxdir, file) + elif file.startswith('doc/'): + path = constants.substart('doc/', '%s/' % docbase, file) + elif file.startswith('lib/'): + path = constants.substart('lib/', '%s/' % sourcebase, file) + elif file.startswith('m4/'): + path = constants.substart('m4/', '%s/' % m4base, file) + elif file.startswith('tests/'): + path = constants.substart('tests/', '%s/' % testsbase, file) + elif file.startswith('tests=lib/'): + path = constants.substart( + 'tests=lib/', '%s/' % testsbase, file) + elif file.startswith('top/'): + path = constants.substart('top/', '', file) + else: # file is not a special file + path = file + result += [os.path.normpath(path)] + result = sorted(set(result)) + return(list(result)) + + def actioncmd(self): + '''Return command-line invocation comment.''' + modules = self.config.getModules() + avoids = self.config.getAvoids() + destdir = self.config.getDestDir() + localdir = self.config.getLocalDir() + auxdir = self.config.getAuxDir() + sourcebase = self.config.getSourceBase() + m4base = self.config.getM4Base() + docbase = self.config.getDocBase() + pobase = self.config.getPoBase() + testsbase = self.config.getTestsBase() + testflags = self.config.getTestFlags() + conddeps = self.config.checkCondDeps() + libname = self.config.getLibName() + lgpl = self.config.getLGPL() + makefile = self.config.getMakefile() + libtool = self.config.checkLibtool() + macro_prefix = self.config.getMacroPrefix() + witness_c_macro = self.config.getWitnessCMacro() + podomain = self.config.getPoDomain() + vc_files = self.config.checkVCFiles() + verbose = self.config.getVerbosity() + + # Create command-line invocation comment. + actioncmd = 'gnulib-tool --import' + actioncmd += ' --dir=%s' % destdir + if localdir: + actioncmd += ' --local-dir=%s' % localdir + actioncmd += ' --lib=%s' % libname + actioncmd += ' --source-base=%s' % sourcebase + actioncmd += ' --m4-base=%s' % m4base + if pobase: + actioncmd += ' --po-base=%s' % pobase + actioncmd += ' --doc-base=%s' % docbase + actioncmd += ' --tests-base=%s' % testsbase + actioncmd += ' --aux-dir=%s' % auxdir + if self.config.checkTestFlag(TESTS['tests']): + actioncmd += ' --with-tests' + if self.config.checkTestFlag(TESTS['obsolete']): + actioncmd += ' --with-obsolete' + if self.config.checkTestFlag(TESTS['c++-test']): + actioncmd += ' --with-c++-tests' + if self.config.checkTestFlag(TESTS['longrunning-test']): + actioncmd += ' --with-longrunning-tests' + if self.config.checkTestFlag(TESTS['privileged-test']): + actioncmd += ' --with-privileged-test' + if self.config.checkTestFlag(TESTS['unportable-test']): + actioncmd += ' --with-unportable-tests' + if self.config.checkTestFlag(TESTS['all-test']): + actioncmd += ' --with-all-tests' + for module in avoids: + actioncmd += ' --avoid=%s' % module + if lgpl: + if lgpl == True: + actioncmd += ' --lgpl' + else: # if lgpl != True + actioncmd += ' --lgpl=%s' % lgpl + if makefile: + actioncmd += ' --makefile-name=%s' % makefile + if conddeps: + actioncmd += ' --conditional-dependencies' + else: # if not conddeps + actioncmd += ' --no-conditional-dependencies' + if libtool: + actioncmd += ' --libtool' + else: # if not libtool + actioncmd += ' --no-libtool' + actioncmd += ' --macro-prefix=%s' % macro_prefix + if podomain: + actioncmd = ' --podomain=%s' % podomain + if witness_c_macro: + actioncmd += ' --witness_c_macro=%s' % witness_c_macro + if vc_files == True: + actioncmd += ' --vc-files' + elif vc_files == False: + actioncmd += ' --no-vc-files' + actioncmd += ' ' # Add a space + actioncmd += ' '.join(modules) + return(actioncmd) + + def gnulib_cache(self): + '''GLImport.gnulib_cache() -> string + + Emit the contents of generated $m4base/gnulib-cache.m4 file. + GLConfig: destdir, localdir, tests, sourcebase, m4base, pobase, docbase, + testsbase, conddeps, libtool, macro_prefix, podomain, vc_files.''' + emit = string() + moduletable = self.moduletable + actioncmd = self.actioncmd() + destdir = self.config['destdir'] + localdir = self.config['localdir'] + testflags = list(self.config['testflags']) + sourcebase = self.config['sourcebase'] + m4base = self.config['m4base'] + pobase = self.config['pobase'] + docbase = self.config['docbase'] + testsbase = self.config['testsbase'] + lgpl = self.config['lgpl'] + libname = self.config['libname'] + makefile = self.config['makefile'] + conddeps = self.config['conddeps'] + libtool = self.config['libtool'] + macro_prefix = self.config['macro_prefix'] + podomain = self.config['podomain'] + witness_c_macro = self.config['witness_c_macro'] + vc_files = self.config['vc_files'] + modules = [str(module) for module in moduletable['base']] + avoids = [str(avoid) for avoid in moduletable['avoids']] + emit += self.emiter.copyright_notice() + emit += '''# # This file represents the specification of how gnulib-tool is used. # It acts as a cache: It is written and read by gnulib-tool. # In projects that use version control, this file is meant to be put under @@ -487,86 +492,86 @@ class GLImport(object): # Specification in the form of a few \ gnulib-tool.m4 macro invocations:\n''' % actioncmd - if not localdir or localdir.startswith('/'): - relative_localdir = localdir - else: # if localdir or not localdir.startswith('/') - relative_localdir = constants.relativize(destdir, localdir) - emit += 'gl_LOCAL_DIR([%s])\n' % relative_localdir - emit += 'gl_MODULES([\n' - emit += ' %s\n' % '\n '.join(modules) - emit += '])\n' - if self.config.checkTestFlag(TESTS['obsolete']): - emit += 'gl_WITH_OBSOLETE\n' - if self.config.checkTestFlag(TESTS['cxx-tests']): - emit += 'gl_WITH_CXX_TESTS\n' - if self.config.checkTestFlag(TESTS['privileged-tests']): - emit += 'gl_WITH_PRIVILEGED_TESTS\n' - if self.config.checkTestFlag(TESTS['unportable-tests']): - emit += 'gl_WITH_UNPORTABLE_TESTS\n' - if self.config.checkTestFlag(TESTS['all-tests']): - emit += 'gl_WITH_ALL_TESTS\n' - emit += 'gl_AVOID([%s])\n' % ' '.join(avoids) - emit += 'gl_SOURCE_BASE([%s])\n' % sourcebase - emit += 'gl_M4_BASE([%s])\n' % m4base - emit += 'gl_PO_BASE([%s])\n' % pobase - emit += 'gl_DOC_BASE([%s])\n' % docbase - emit += 'gl_TESTS_BASE([%s])\n' % testsbase - if self.config.checkTestFlag(TESTS['tests']): - emit += 'gl_WITH_TESTS\n' - emit += 'gl_LIB([%s])\n' % libname - if lgpl != False: - if lgpl == True: - emit += 'gl_LGPL\n' - else: # if lgpl != True - emit += 'gl_LGPL([%d])\n' % lgpl - emit += 'gl_MAKEFILE_NAME([%s])\n' % makefile - if conddeps: - emit += 'gl_CONDITIONAL_DEPENDENCIES\n' - if libtool: - emit += 'gl_LIBTOOL\n' - emit += 'gl_MACRO_PREFIX([%s])\n' % macro_prefix - emit += 'gl_PO_DOMAIN([%s])\n' % podomain - emit += 'gl_WITNESS_C_DOMAIN([%s])\n' % witness_c_macro - if vc_files: - emit += 'gl_VC_FILES([%s])\n' % vc_files - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(constants.nlconvert(emit)) - - def gnulib_comp(self, files): - '''GLImport.gnulib_comp(files) -> string - - Emit the contents of generated $m4base/gnulib-comp.m4 file. - GLConfig: destdir, localdir, tests, sourcebase, m4base, pobase, docbase, - testsbase, conddeps, libtool, macro_prefix, podomain, vc_files.''' - emit = string() - assistant = self.assistant - moduletable = self.moduletable - destdir = self.config['destdir'] - localdir = self.config['localdir'] - auxdir = self.config['auxdir'] - testflags = list(self.config['testflags']) - sourcebase = self.config['sourcebase'] - m4base = self.config['m4base'] - pobase = self.config['pobase'] - docbase = self.config['docbase'] - testsbase = self.config['testsbase'] - lgpl = self.config['lgpl'] - libname = self.config['libname'] - makefile = self.config['makefile'] - conddeps = self.config['conddeps'] - libtool = self.config['libtool'] - macro_prefix = self.config['macro_prefix'] - podomain = self.config['podomain'] - witness_c_macro = self.config['witness_c_macro'] - configure_ac = self.config['configure_ac'] - vc_files = self.config['vc_files'] - libtests = self.config['libtests'] - modules = [str(module) for module in moduletable['base']] - avoids = [str(avoid) for avoid in moduletable['avoids']] - emit += '# DO NOT EDIT! GENERATED AUTOMATICALLY!\n' - emit += self.emiter.copyright_notice() - emit += '''# + if not localdir or localdir.startswith('/'): + relative_localdir = localdir + else: # if localdir or not localdir.startswith('/') + relative_localdir = constants.relativize(destdir, localdir) + emit += 'gl_LOCAL_DIR([%s])\n' % relative_localdir + emit += 'gl_MODULES([\n' + emit += ' %s\n' % '\n '.join(modules) + emit += '])\n' + if self.config.checkTestFlag(TESTS['obsolete']): + emit += 'gl_WITH_OBSOLETE\n' + if self.config.checkTestFlag(TESTS['cxx-tests']): + emit += 'gl_WITH_CXX_TESTS\n' + if self.config.checkTestFlag(TESTS['privileged-tests']): + emit += 'gl_WITH_PRIVILEGED_TESTS\n' + if self.config.checkTestFlag(TESTS['unportable-tests']): + emit += 'gl_WITH_UNPORTABLE_TESTS\n' + if self.config.checkTestFlag(TESTS['all-tests']): + emit += 'gl_WITH_ALL_TESTS\n' + emit += 'gl_AVOID([%s])\n' % ' '.join(avoids) + emit += 'gl_SOURCE_BASE([%s])\n' % sourcebase + emit += 'gl_M4_BASE([%s])\n' % m4base + emit += 'gl_PO_BASE([%s])\n' % pobase + emit += 'gl_DOC_BASE([%s])\n' % docbase + emit += 'gl_TESTS_BASE([%s])\n' % testsbase + if self.config.checkTestFlag(TESTS['tests']): + emit += 'gl_WITH_TESTS\n' + emit += 'gl_LIB([%s])\n' % libname + if lgpl != False: + if lgpl == True: + emit += 'gl_LGPL\n' + else: # if lgpl != True + emit += 'gl_LGPL([%d])\n' % lgpl + emit += 'gl_MAKEFILE_NAME([%s])\n' % makefile + if conddeps: + emit += 'gl_CONDITIONAL_DEPENDENCIES\n' + if libtool: + emit += 'gl_LIBTOOL\n' + emit += 'gl_MACRO_PREFIX([%s])\n' % macro_prefix + emit += 'gl_PO_DOMAIN([%s])\n' % podomain + emit += 'gl_WITNESS_C_DOMAIN([%s])\n' % witness_c_macro + if vc_files: + emit += 'gl_VC_FILES([%s])\n' % vc_files + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(constants.nlconvert(emit)) + + def gnulib_comp(self, files): + '''GLImport.gnulib_comp(files) -> string + + Emit the contents of generated $m4base/gnulib-comp.m4 file. + GLConfig: destdir, localdir, tests, sourcebase, m4base, pobase, docbase, + testsbase, conddeps, libtool, macro_prefix, podomain, vc_files.''' + emit = string() + assistant = self.assistant + moduletable = self.moduletable + destdir = self.config['destdir'] + localdir = self.config['localdir'] + auxdir = self.config['auxdir'] + testflags = list(self.config['testflags']) + sourcebase = self.config['sourcebase'] + m4base = self.config['m4base'] + pobase = self.config['pobase'] + docbase = self.config['docbase'] + testsbase = self.config['testsbase'] + lgpl = self.config['lgpl'] + libname = self.config['libname'] + makefile = self.config['makefile'] + conddeps = self.config['conddeps'] + libtool = self.config['libtool'] + macro_prefix = self.config['macro_prefix'] + podomain = self.config['podomain'] + witness_c_macro = self.config['witness_c_macro'] + configure_ac = self.config['configure_ac'] + vc_files = self.config['vc_files'] + libtests = self.config['libtests'] + modules = [str(module) for module in moduletable['base']] + avoids = [str(avoid) for avoid in moduletable['avoids']] + emit += '# DO NOT EDIT! GENERATED AUTOMATICALLY!\n' + emit += self.emiter.copyright_notice() + emit += '''# # This file represents the compiled summary of the specification in # gnulib-cache.m4. It lists the computed macro invocations that need # to be invoked from configure.ac. @@ -584,842 +589,854 @@ AC_DEFUN([%s_EARLY], m4_pattern_allow([^gl_LIBOBJS$])dnl a variable m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable AC_REQUIRE([gl_PROG_AR_RANLIB])\n''' % (configure_ac, macro_prefix) - uses_subdirs = False - for module in moduletable['main']: - # Test whether there are some source files in subdirectories. - for file in module.getFiles(): - if file.startswith('lib/') and file.endswith('.c') and \ - file.count('/') > 1: - uses_subdirs = True - break - if uses_subdirs: - emit += ' AC_REQUIRE([AM_PROG_CC_C_O])\n' - for module in moduletable['final']: - emit += ' # Code from module %s:\n' % str(module) - snippet = module.getAutoconfSnippet_Early() - lines = [line for line in snippet.split(constants.NL) if line != ''] - if lines: - emit += ' %s\n' % '\n '.join(lines) - emit += '])\n' - emit += ''' + uses_subdirs = False + for module in moduletable['main']: + # Test whether there are some source files in subdirectories. + for file in module.getFiles(): + if file.startswith('lib/') and file.endswith('.c') and \ + file.count('/') > 1: + uses_subdirs = True + break + if uses_subdirs: + emit += ' AC_REQUIRE([AM_PROG_CC_C_O])\n' + for module in moduletable['final']: + emit += ' # Code from module %s:\n' % str(module) + snippet = module.getAutoconfSnippet_Early() + lines = [line for line in snippet.split( + constants.NL) if line != ''] + if lines: + emit += ' %s\n' % '\n '.join(lines) + emit += '])\n' + emit += ''' # This macro should be invoked from %s, in the section # "Check for header files, types and library functions". AC_DEFUN([%s_INIT], [\n''' % (configure_ac, macro_prefix) - if libtool: - emit += ' AM_CONDITIONAL([GL_COND_LIBTOOL], [true])\n' - emit += ' gl_cond_libtool=true\n' - else: # if not libtool - emit += ' AM_CONDITIONAL([GL_COND_LIBTOOL], [false])\n' - emit += ' gl_cond_libtool=false\n' - emit += ' gl_libdeps=\n' - emit += ' gl_ltlibdeps=\n' - replace_auxdir = False - if auxdir != 'build-aux': - replace_auxdir = True - emit += ' gl_m4_base=\'%s\'\n' % m4base - emit += self.emiter.initmacro_start(macro_prefix) - emit += ' gl_source_base=\'%s\'\n' % sourcebase - if witness_c_macro: - emit += ' m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [%s])\n' % \ - witness_c_macro - # Emit main autoconf snippets. - emit += self.emiter.autoconfSnippets(moduletable['main'], - moduletable, assistant, 0, True, False, True, replace_auxdir) - if witness_c_macro: - emit += ' m4_popdef([gl_MODULE_INDICATOR_CONDITION])\n' - emit += ' # End of code from modules\n' - emit += self.emiter.initmacro_end(macro_prefix) - emit += ' gltests_libdeps=\n' - emit += ' gltests_ltlibdeps=\n' - emit += self.emiter.initmacro_start('%stests' % macro_prefix) - emit += ' gl_source_base=\'%s\'\n' % testsbase - # Define a tests witness macro that depends on the package. - # PACKAGE is defined by AM_INIT_AUTOMAKE, PACKAGE_TARNAME is defined by - # AC_INIT. - # See <http://lists.gnu.org/archive/html/automake/2009-05/msg00145.html>. - emit += 'changequote(,)dnl\n' - emit += ' %stests_WITNESS=' % macro_prefix - emit += 'IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr \ + if libtool: + emit += ' AM_CONDITIONAL([GL_COND_LIBTOOL], [true])\n' + emit += ' gl_cond_libtool=true\n' + else: # if not libtool + emit += ' AM_CONDITIONAL([GL_COND_LIBTOOL], [false])\n' + emit += ' gl_cond_libtool=false\n' + emit += ' gl_libdeps=\n' + emit += ' gl_ltlibdeps=\n' + replace_auxdir = False + if auxdir != 'build-aux': + replace_auxdir = True + emit += ' gl_m4_base=\'%s\'\n' % m4base + emit += self.emiter.initmacro_start(macro_prefix) + emit += ' gl_source_base=\'%s\'\n' % sourcebase + if witness_c_macro: + emit += ' m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [%s])\n' % \ + witness_c_macro + # Emit main autoconf snippets. + emit += self.emiter.autoconfSnippets(moduletable['main'], + moduletable, assistant, 0, True, False, True, replace_auxdir) + if witness_c_macro: + emit += ' m4_popdef([gl_MODULE_INDICATOR_CONDITION])\n' + emit += ' # End of code from modules\n' + emit += self.emiter.initmacro_end(macro_prefix) + emit += ' gltests_libdeps=\n' + emit += ' gltests_ltlibdeps=\n' + emit += self.emiter.initmacro_start('%stests' % macro_prefix) + emit += ' gl_source_base=\'%s\'\n' % testsbase + # Define a tests witness macro that depends on the package. + # PACKAGE is defined by AM_INIT_AUTOMAKE, PACKAGE_TARNAME is defined by + # AC_INIT. + # See <http://lists.gnu.org/archive/html/automake/2009-05/msg00145.html>. + emit += 'changequote(,)dnl\n' + emit += ' %stests_WITNESS=' % macro_prefix + emit += 'IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr \ abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e \ \'s/[^A-Z0-9_]/_/g\'`_GNULIB_TESTS\n' - emit += 'changequote([, ])dnl\n' - emit += ' AC_SUBST([%stests_WITNESS])\n' % macro_prefix - emit += ' gl_module_indicator_condition=$%stests_WITNESS\n' % macro_prefix - emit += ' m4_pushdef([gl_MODULE_INDICATOR_CONDITION], ' - emit += '[$gl_module_indicator_condition])\n' - # Emit tests autoconf snippets. - emit += self.emiter.autoconfSnippets(moduletable['tests'], - moduletable, assistant, 0, True, True, True, replace_auxdir) - emit += ' m4_popdef([gl_MODULE_INDICATOR_CONDITION])\n' - emit += self.emiter.initmacro_end('%stests' % macro_prefix) - # _LIBDEPS and _LTLIBDEPS variables are not needed if this library is - # created using libtool, because libtool already handles the dependencies. - if not libtool: - libname_upper = libname.upper().replace('-', '_') - emit += ' %s_LIBDEPS="$gl_libdeps"\n' % libname_upper - emit += ' AC_SUBST([%s_LIBDEPS])\n' % libname_upper - emit += ' %s_LTLIBDEPS="$gl_ltlibdeps"\n' % libname_upper - emit += ' AC_SUBST([%s_LTLIBDEPS])\n' % libname_upper - if libtests: - emit += ' LIBTESTS_LIBDEPS="$gltests_libdeps"\n' - emit += ' AC_SUBST([LIBTESTS_LIBDEPS])\n' - emit += '])\n' - emit += self.emiter.initmacro_done(macro_prefix, sourcebase) - emit += self.emiter.initmacro_done('%stests' % macro_prefix, testsbase) - emit += ''' + emit += 'changequote([, ])dnl\n' + emit += ' AC_SUBST([%stests_WITNESS])\n' % macro_prefix + emit += ' gl_module_indicator_condition=$%stests_WITNESS\n' % macro_prefix + emit += ' m4_pushdef([gl_MODULE_INDICATOR_CONDITION], ' + emit += '[$gl_module_indicator_condition])\n' + # Emit tests autoconf snippets. + emit += self.emiter.autoconfSnippets(moduletable['tests'], + moduletable, assistant, 0, True, True, True, replace_auxdir) + emit += ' m4_popdef([gl_MODULE_INDICATOR_CONDITION])\n' + emit += self.emiter.initmacro_end('%stests' % macro_prefix) + # _LIBDEPS and _LTLIBDEPS variables are not needed if this library is + # created using libtool, because libtool already handles the dependencies. + if not libtool: + libname_upper = libname.upper().replace('-', '_') + emit += ' %s_LIBDEPS="$gl_libdeps"\n' % libname_upper + emit += ' AC_SUBST([%s_LIBDEPS])\n' % libname_upper + emit += ' %s_LTLIBDEPS="$gl_ltlibdeps"\n' % libname_upper + emit += ' AC_SUBST([%s_LTLIBDEPS])\n' % libname_upper + if libtests: + emit += ' LIBTESTS_LIBDEPS="$gltests_libdeps"\n' + emit += ' AC_SUBST([LIBTESTS_LIBDEPS])\n' + emit += '])\n' + emit += self.emiter.initmacro_done(macro_prefix, sourcebase) + emit += self.emiter.initmacro_done('%stests' % macro_prefix, testsbase) + emit += ''' # This macro records the list of files which have been installed by # gnulib-tool and may be removed by future gnulib-tool invocations. AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix - emit += ' %s\n' % '\n '.join(files) - emit += '])\n' - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(emit) - - def _done_dir_(self, directory, dirs_added, dirs_removed): - '''GLImport._done_dir_(directory, dirs_added, dirs_removed) - - This method is used to determine ignore argument for _update_ignorelist_ - method and then call it.''' - destdir = self.config['destdir'] - if isdir(joinpath(destdir, 'CVS')) or \ - isdir(joinpath(destdir, directory, 'CVS')) or \ - isfile(joinpath(destdir, directory, '.cvsignore')): - self._update_ignorelist_(directory, '.cvsignore', - dirs_added, dirs_removed) - if isdir(joinpath(destdir, '.git')) or \ - isfile(joinpath(destdir, directory, '.gitignore')): - self._update_ignorelist_(directory, '.gitignore', - dirs_added, dirs_removed) - - - def _update_ignorelist_(self, directory, ignore, dirs_added, dirs_removed): - '''GLImport._update_ignorelist_(directory, ignore, dirs_added, dirs_removed) - - Update .gitignore or .cvsignore files.''' - result = string() - destdir = self.config['destdir'] - if ignore == '.gitignore': - anchor = '/' - else: - anchor = '' - srcpath = joinpath(destdir, directory, ignore) - backupname = '%s~' % srcpath - if isfile(srcpath): - if dirs_added or dirs_removed: - with codecs.open(srcpath, 'rb', 'UTF-8') as file: - srcdata = file.read() - dirs_ignore = sorted(set(srcdata.split('\n'))) - dirs_ignore = [line for line in dirs_ignore if line.strip()] - srcdata = '\n'.join(sorted(set(dirs_ignore))).strip() - dirs_ignore += [d for d in dirs_added if d not in dirs_ignore] - dirs_ignore = [d for d in dirs_ignore if d in dirs_removed] - dirs_ignore = ['%s%s' % (anchor, d) for d in dirs_ignore] - dirs_ignore = sorted(set(dirs_ignore)) - destdata = '\n'.join(sorted(set(dirs_ignore))).strip() - if srcdata != destdata: - if not self.config['dryrun']: - print('Updating %s (backup in %s)' % (srcpath, backupname)) - shutil.move(srcpath, backupname) - result = string() - with codecs.open(srcpath, 'wb', 'UTF-8') as file: - file.write(destdata) - else: # if self.config['dryrun'] - print('Updating %s (backup in %s)' % (srcpath, backupname)) - else: # if not isfile(srcpath) - if dirs_added: - if not self.config['dryrun']: - print('Creating %s' % srcpath) - dirs_added = sorted(set(dirs_added)) - dirs_added = ['%s%s' % (anchor, d) for d in dirs_added] - if ignore == '.cvsignore': - dirs_added = ['.deps', '.dirstamp'] +dirs_added - with codecs.open(srcpath, 'wb', 'UTF-8') as file: - file.write('\n'.join(dirs_added)) - file.write('\n') - else: # if self.config['dryrun'] - print('Create %s' % srcpath) - - def prepare(self): - '''Make all preparations before the execution of the code. - Returns filetable and sed transformers, which change the license.''' - destdir = self.config['destdir'] - localdir = self.config['localdir'] - auxdir = self.config['auxdir'] - modules = list(self.config['modules']) - avoids = list(self.config['avoids']) - testflags = list(self.config['testflags']) - sourcebase = self.config['sourcebase'] - m4base = self.config['m4base'] - pobase = self.config['pobase'] - docbase = self.config['docbase'] - testsbase = self.config['testsbase'] - lgpl = self.config['lgpl'] - copyrights = self.config['copyrights'] - libname = self.config['libname'] - makefile = self.config['makefile'] - conddeps = self.config['conddeps'] - libtool = self.config['libtool'] - macro_prefix = self.config['macro_prefix'] - podomain = self.config['podomain'] - witness_c_macro = self.config['witness_c_macro'] - vc_files = self.config['vc_files'] - configure_ac = self.config['configure_ac'] - ac_version = self.config['ac_version'] - verbose = self.config['verbosity'] - base_modules = sorted(set([self.modulesystem.find(m) for m in modules])) - avoids = sorted(set([self.modulesystem.find(a) for a in avoids])) - - # Perform transitive closure. - self.moduletable.setAvoids(avoids) - final_modules = self.moduletable.transitive_closure(base_modules) - - # Show final module list. - if verbose >= 0: - bold_on = '' - bold_off = '' - term = os.getenv('TERM') - if term == 'xterm': - bold_on = '\x1b[1m' - bold_off = '\x1b[0m' - print('Module list with included dependencies (indented):') - for module in final_modules: - if str(module) in self.config.getModules(): - print(' %s%s%s' % (bold_on, module, bold_off)) - else: # if str(module) not in self.config.getModules() - print(' %s' % module) - - # Separate modules into main_modules and tests_modules. - modules = self.moduletable.transitive_closure_separately( - base_modules, final_modules) - main_modules, tests_modules = modules - - # Transmit base_modules, final_modules, main_modules and tests_modules. - self.moduletable.setBaseModules(base_modules) - self.moduletable.setFinalModules(final_modules) - self.moduletable.setMainModules(main_modules) - self.moduletable.setTestsModules(tests_modules) - - # Print main_modules and tests_modules. - if verbose >= 1: - print('Main module list:') - for module in main_modules: - print(' %s' % str(module)) - print('Tests-related module list:') - for module in tests_modules: - print(' %s' % str(module)) - - # Determine whether a $testsbase/libtests.a is needed. - libtests = False - for module in tests_modules: - files = module.getFiles() - for file in files: - if file.startswith('lib/'): - libtests = True - break - if libtests: - self.config.enableLibtests() - - # Add dummy package if it is needed. - main_modules = self.moduletable.add_dummy(main_modules) - if libtests: # if we need to use libtests.a - tests_modules = self.moduletable.add_dummy(tests_modules) - - # Check license incompatibilities. - listing = list() - compatibilities = dict() - incompatibilities = string() - compatibilities['all'] = ['GPLed build tool', 'public domain', 'unlimited', - 'unmodifiable license text'] - compatibilities[3] = ['LGPL', 'LGPLv2+', 'LGPLv3+'] - compatibilities[2] = ['LGPLv2+'] - if lgpl: - for module in main_modules: - license = module.getLicense() - if license not in compatibilities['all']: - if lgpl == 3 or lgpl == True: - if license not in compatibilities[3]: - listing.append(tuple([str(module), license])) - elif lgpl == 2: - if license not in compatibilities[2]: - listing.append(tuple([str(module), license])) - if listing: - raise(GLError(11, listing)) - - # Print notices from modules. - for module in main_modules: - notice = module.getNotice() - notice = notice.strip() - if notice: - print('Notice from module %s:' % str(module)) - pattern = compiler('^(.*?)$', re.S | re.M) - notice = pattern.sub(' \\1', notice) - print(notice) - - # Determine script to apply to imported library files. - lgpl2gpl = ''' + emit += ' %s\n' % '\n '.join(files) + emit += '])\n' + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(emit) + + def _done_dir_(self, directory, dirs_added, dirs_removed): + '''GLImport._done_dir_(directory, dirs_added, dirs_removed) + + This method is used to determine ignore argument for _update_ignorelist_ + method and then call it.''' + destdir = self.config['destdir'] + if isdir(joinpath(destdir, 'CVS')) or \ + isdir(joinpath(destdir, directory, 'CVS')) or \ + isfile(joinpath(destdir, directory, '.cvsignore')): + self._update_ignorelist_(directory, '.cvsignore', + dirs_added, dirs_removed) + if isdir(joinpath(destdir, '.git')) or \ + isfile(joinpath(destdir, directory, '.gitignore')): + self._update_ignorelist_(directory, '.gitignore', + dirs_added, dirs_removed) + + def _update_ignorelist_(self, directory, ignore, dirs_added, dirs_removed): + '''GLImport._update_ignorelist_(directory, ignore, dirs_added, dirs_removed) + + Update .gitignore or .cvsignore files.''' + result = string() + destdir = self.config['destdir'] + if ignore == '.gitignore': + anchor = '/' + else: + anchor = '' + srcpath = joinpath(destdir, directory, ignore) + backupname = '%s~' % srcpath + if isfile(srcpath): + if dirs_added or dirs_removed: + with codecs.open(srcpath, 'rb', 'UTF-8') as file: + srcdata = file.read() + dirs_ignore = sorted(set(srcdata.split('\n'))) + dirs_ignore = [line for line in dirs_ignore if line.strip()] + srcdata = '\n'.join(sorted(set(dirs_ignore))).strip() + dirs_ignore += [d for d in dirs_added if d not in dirs_ignore] + dirs_ignore = [d for d in dirs_ignore if d in dirs_removed] + dirs_ignore = ['%s%s' % (anchor, d) for d in dirs_ignore] + dirs_ignore = sorted(set(dirs_ignore)) + destdata = '\n'.join(sorted(set(dirs_ignore))).strip() + if srcdata != destdata: + if not self.config['dryrun']: + print('Updating %s (backup in %s)' % + (srcpath, backupname)) + shutil.move(srcpath, backupname) + result = string() + with codecs.open(srcpath, 'wb', 'UTF-8') as file: + file.write(destdata) + else: # if self.config['dryrun'] + print('Updating %s (backup in %s)' % + (srcpath, backupname)) + else: # if not isfile(srcpath) + if dirs_added: + if not self.config['dryrun']: + print('Creating %s' % srcpath) + dirs_added = sorted(set(dirs_added)) + dirs_added = ['%s%s' % (anchor, d) for d in dirs_added] + if ignore == '.cvsignore': + dirs_added = ['.deps', '.dirstamp'] + dirs_added + with codecs.open(srcpath, 'wb', 'UTF-8') as file: + file.write('\n'.join(dirs_added)) + file.write('\n') + else: # if self.config['dryrun'] + print('Create %s' % srcpath) + + def prepare(self): + '''Make all preparations before the execution of the code. + Returns filetable and sed transformers, which change the license.''' + destdir = self.config['destdir'] + localdir = self.config['localdir'] + auxdir = self.config['auxdir'] + modules = list(self.config['modules']) + avoids = list(self.config['avoids']) + testflags = list(self.config['testflags']) + sourcebase = self.config['sourcebase'] + m4base = self.config['m4base'] + pobase = self.config['pobase'] + docbase = self.config['docbase'] + testsbase = self.config['testsbase'] + lgpl = self.config['lgpl'] + copyrights = self.config['copyrights'] + libname = self.config['libname'] + makefile = self.config['makefile'] + conddeps = self.config['conddeps'] + libtool = self.config['libtool'] + macro_prefix = self.config['macro_prefix'] + podomain = self.config['podomain'] + witness_c_macro = self.config['witness_c_macro'] + vc_files = self.config['vc_files'] + configure_ac = self.config['configure_ac'] + ac_version = self.config['ac_version'] + verbose = self.config['verbosity'] + base_modules = sorted( + set([self.modulesystem.find(m) for m in modules])) + avoids = sorted(set([self.modulesystem.find(a) for a in avoids])) + + # Perform transitive closure. + self.moduletable.setAvoids(avoids) + final_modules = self.moduletable.transitive_closure(base_modules) + + # Show final module list. + if verbose >= 0: + bold_on = '' + bold_off = '' + term = os.getenv('TERM') + if term == 'xterm': + bold_on = '\x1b[1m' + bold_off = '\x1b[0m' + print('Module list with included dependencies (indented):') + for module in final_modules: + if str(module) in self.config.getModules(): + print(' %s%s%s' % (bold_on, module, bold_off)) + else: # if str(module) not in self.config.getModules() + print(' %s' % module) + + # Separate modules into main_modules and tests_modules. + modules = self.moduletable.transitive_closure_separately( + base_modules, final_modules) + main_modules, tests_modules = modules + + # Transmit base_modules, final_modules, main_modules and tests_modules. + self.moduletable.setBaseModules(base_modules) + self.moduletable.setFinalModules(final_modules) + self.moduletable.setMainModules(main_modules) + self.moduletable.setTestsModules(tests_modules) + + # Print main_modules and tests_modules. + if verbose >= 1: + print('Main module list:') + for module in main_modules: + print(' %s' % str(module)) + print('Tests-related module list:') + for module in tests_modules: + print(' %s' % str(module)) + + # Determine whether a $testsbase/libtests.a is needed. + libtests = False + for module in tests_modules: + files = module.getFiles() + for file in files: + if file.startswith('lib/'): + libtests = True + break + if libtests: + self.config.enableLibtests() + + # Add dummy package if it is needed. + main_modules = self.moduletable.add_dummy(main_modules) + if libtests: # if we need to use libtests.a + tests_modules = self.moduletable.add_dummy(tests_modules) + + # Check license incompatibilities. + listing = list() + compatibilities = dict() + incompatibilities = string() + compatibilities['all'] = ['GPLed build tool', 'public domain', 'unlimited', + 'unmodifiable license text'] + compatibilities[3] = ['LGPL', 'LGPLv2+', 'LGPLv3+'] + compatibilities[2] = ['LGPLv2+'] + if lgpl: + for module in main_modules: + license = module.getLicense() + if license not in compatibilities['all']: + if lgpl == 3 or lgpl == True: + if license not in compatibilities[3]: + listing.append(tuple([str(module), license])) + elif lgpl == 2: + if license not in compatibilities[2]: + listing.append(tuple([str(module), license])) + if listing: + raise(GLError(11, listing)) + + # Print notices from modules. + for module in main_modules: + notice = module.getNotice() + notice = notice.strip() + if notice: + print('Notice from module %s:' % str(module)) + pattern = compiler('^(.*?)$', re.S | re.M) + notice = pattern.sub(' \\1', notice) + print(notice) + + # Determine script to apply to imported library files. + lgpl2gpl = ''' s/GNU Lesser General/GNU General/g s/Lesser General Public License/General Public License/g s/GNU Library General/GNU General/g s/Library General Public License/General Public License/g s/version 2\\(.1\\)\\{0,1\\}\\([ ,]\\)/version 3\\2/g''' - sed_transform_lib_file = string() - if 'config-h' in [str(module) for module in main_modules]: - sed_transform_lib_file += ''' + sed_transform_lib_file = string() + if 'config-h' in [str(module) for module in main_modules]: + sed_transform_lib_file += ''' s/^#ifdef[\t ]*HAVE_CONFIG_H[\t ]*$/#if 1/ ''' - sed_transform_main_lib_file = sed_transform_lib_file - if copyrights: - if lgpl: # if lgpl is enabled - if lgpl == 3: - sed_transform_main_lib_file += ''' + sed_transform_main_lib_file = sed_transform_lib_file + if copyrights: + if lgpl: # if lgpl is enabled + if lgpl == 3: + sed_transform_main_lib_file += ''' s/GNU General/GNU Lesser General/g s/General Public License/Lesser General Public License/g s/Lesser Lesser General Public License/Lesser General Public''' \ - +' License/g' - elif lgpl == 2: - sed_transform_main_lib_file += ''' + + ' License/g' + elif lgpl == 2: + sed_transform_main_lib_file += ''' s/GNU General/GNU Lesser General/g s/General Public License/Lesser General Public License/g s/Lesser Lesser General Public License/Lesser General Public''' \ - +'''License/g + + '''License/g s/version [23]\\([ ,]\\)/version 2.1\\1/g''' - else: # if lgpl is disabled - sed_transform_main_lib_file += lgpl2gpl - - # Determine script to apply to auxiliary files that go into $auxdir/. - sed_transform_build_aux_file = string() - if copyrights: - sed_transform_build_aux_file += lgpl2gpl - - # Determine script to apply to library files that go into $testsbase/. - sed_transform_testsrelated_lib_file = sed_transform_lib_file - if copyrights: - sed_transform_testsrelated_lib_file += lgpl2gpl - - # Determine the final file lists. - main_filelist, tests_filelist = \ - self.moduletable.filelist_separately(main_modules, tests_modules) - filelist = sorted(set(main_filelist +tests_filelist), key=string.lower) - if not filelist: - raise(GLError(12, None)) - - # Print list of files. - if verbose >= 0: - print('File list:') - for file in filelist: - if file.startswith('tests=lib/'): - rest = file[10:] - print(' lib/%s -> tests/%s' % (rest, rest)) - else: - print(' %s' % file) - - # Prepare basic filelist and basic old_files/new_files variables. - filelist = sorted(set(filelist)) - new_files = filelist +['m4/gnulib-tool.m4'] - old_files = list(self.cache['files']) - path = joinpath(destdir, m4base, 'gnulib-tool.m4') - if isfile(path): - old_files += [joinpath('m4', 'gnulib-tool.m4')] - - # Construct tables and transformers. - transformers = dict() - transformers['lib'] = string(sed_transform_lib_file) - transformers['aux'] = string(sed_transform_build_aux_file) - transformers['main'] = string(sed_transform_main_lib_file) - transformers['tests'] = string(sed_transform_testsrelated_lib_file) - old_table = list() - new_table = list() - for src in old_files: - dest = self.rewrite_old_files([src])[-1] - old_table += [tuple([dest, src])] - for src in new_files: - dest = self.rewrite_new_files([src])[-1] - new_table += [tuple([dest, src])] - old_table = sorted(set(old_table)) - new_table = sorted(set(new_table)) - - # Prepare the filetable. - filetable = dict() - filetable['all'] = sorted(set(filelist)) - filetable['old'] = \ - sorted(set(old_table), key=lambda t: tuple(t[0].lower())) - filetable['new'] = \ - sorted(set(new_table), key=lambda t: tuple(t[0].lower())) - filetable['added'] = list() - filetable['removed'] = list() - - # Return the result. - result = tuple([filetable, transformers]) - return(result) - - def execute(self, filetable, transformers): - '''Perform operations on the lists of files, which are given in a special - format except filelist argument. Such lists of files can be created using - GLImport.prepare() function.''' - if type(filetable) is not dict: - raise(TypeError('filetable must be a dict, not %s' % \ - type(filetable).__name__)) - for key in ['all', 'old', 'new', 'added', 'removed']: - if key not in filetable: - raise(KeyError('filetable must contain key %s' % repr(key))) - destdir = self.config['destdir'] - localdir = self.config['localdir'] - auxdir = self.config['auxdir'] - modules = list(self.config['modules']) - avoids = list(self.config['avoids']) - testflags = list(self.config['testflags']) - sourcebase = self.config['sourcebase'] - m4base = self.config['m4base'] - pobase = self.config['pobase'] - docbase = self.config['docbase'] - testsbase = self.config['testsbase'] - lgpl = self.config['lgpl'] - copyrights = self.config['copyrights'] - libname = self.config['libname'] - makefile = self.config['makefile'] - conddeps = self.config['conddeps'] - libtool = self.config['libtool'] - macro_prefix = self.config['macro_prefix'] - podomain = self.config['podomain'] - witness_c_macro = self.config['witness_c_macro'] - vc_files = self.config['vc_files'] - configure_ac = self.config['configure_ac'] - ac_version = self.config['ac_version'] - verbose = self.config['verbosity'] - actioncmd = self.actioncmd() - - # Create all necessary directories. - dirs = list() - if pobase: - dirs += [pobase] - if [file for file in filetable['all'] if file.startswith('doc/')]: - dirs += [docbase] - dirs += [sourcebase, m4base, auxdir] - dirs += [os.path.dirname(pair[0]) for pair in filetable['new']] - dirs = sorted(set([joinpath(destdir, d) for d in dirs])) - for directory in dirs: - if not isdir(directory): - print('Creating directory %s' % directory) - if not self.config['dryrun']: - try: # Try to create directory - os.makedirs(directory) - except Exception as error: - raise(GLError(13, directory)) - else: # if self.config['dryrun'] - print('Create directory %s' % directory) - - # Create GLFileAssistant instance to process files. - self.assistant = GLFileAssistant(self.config, transformers) - - # Files which are in filetable['old'] and not in filetable['new']. - # They will be removed and added to filetable['removed'] list. - pairs = [f for f in filetable['old'] if f not in filetable['old']] - pairs = sorted(set(pairs), key=lambda t: tuple(t[0].lower())) - files = sorted(set(pair[0] for pair in pairs)) - for file in files: - path = joinpath(destdir, file) - if isfile(path) or os.path.islink(path): - if not self.config['dryrun']: - backup = string('%s~' % path) - print('Removing file %s (backup in )' % (path, backup)) - try: # Try to move file - if os.path.exists(backup): - os.remove(backup) - shutil.move(path, '%s~' % path) - except Exception as error: - raise(GLError(14, file)) - else: # if self.config['dryrun'] - print('Remove file %s (backup in %s~)' % (path, path)) - filetable['removed'] += [file] - - # Files which are in filetable['new'] and not in filetable['old']. - # They will be added/updated and added to filetable['added'] list. - already_present = False - pairs = [f for f in filetable['new'] if f not in filetable['old']] - pairs = sorted(set(pairs)) - for pair in pairs: - original = pair[1] - rewritten = pair[0] - self.assistant.setOriginal(original) - self.assistant.setRewritten(rewritten) - self.assistant.add_or_update(already_present) - - # Files which are in filetable['new'] and in filetable['old']. - # They will be added/updated and added to filetable['added'] list. - already_present = True - pairs = [f for f in filetable['new'] if f in filetable['old']] - pairs = sorted(set(pairs)) - for pair in pairs: - original = pair[1] - rewritten = pair[0] - self.assistant.setOriginal(original) - self.assistant.setRewritten(rewritten) - self.assistant.add_or_update(already_present) - - # Add files which were added to the list of filetable['added']. - filetable['added'] += self.assistant.getFiles() - filetable['added'] = sorted(set(filetable['added'])) - - # Determine include_guard_prefix. - include_guard_prefix = self.config['include_guard_prefix'] - - # Determine makefile name. - if not makefile: - makefile_am = string('Makefile.am') - else: # if makefile - makefile_am = makefile - - # Create normal Makefile.ams. - for_test = False - - # Setup list of Makefile.am edits that are to be performed afterwards. - # Some of these edits apply to files that we will generate; others are - # under the responsibility of the developer. - makefile_am_edits = dict() - if makefile_am == 'Makefile.am': - sourcebase_dir = os.path.dirname(sourcebase) - sourcebase_base = os.path.basename(sourcebase) - self.makefiletable.editor(sourcebase_dir, 'SUBDIRS', sourcebase_base) - if pobase: - pobase_dir = os.path.dirname(pobase) - pobase_base = os.path.basename(pobase) - self.makefiletable.editor(pobase_dir, 'SUBDIRS', pobase_base) - if self.config.checkTestFlag(TESTS['tests']): - if makefile_am == 'Makefile.am': - testsbase_dir = os.path.dirname(testsbase) - testsbase_base = os.path.basename(testsbase) - self.makefiletable.editor(testsbase_dir, 'SUBDIRS', testsbase_base) - self.makefiletable.editor('', 'ACLOCAL_AMFLAGS', '-I %s' % m4base) - self.makefiletable.parent() - - # Create library makefile. - basename = joinpath(sourcebase, makefile_am) - tmpfile = self.assistant.tmpfilename(basename) - emit, uses_subdirs = self.emiter.lib_Makefile_am(basename, - self.moduletable['main'], self.moduletable, self.makefiletable, - actioncmd, for_test) - with codecs.open(tmpfile, 'wb', 'UTF-8') as file: - file.write(emit) - filename, backup, flag = self.assistant.super_update(basename, tmpfile) - if flag == 1: - if not self.config['dryrun']: - print('Updating %s (backup in %s)' % (filename, backup)) - else: # if self.config['dryrun'] - print('Update %s (backup in %s)' % (filename, backup)) - elif flag == 2: - if not self.config['dryrun']: - print('Creating %s' % filename) - else: # if self.config['dryrun']: - print('Create %s' % filename) - filetable['added'] += [filename] - if isfile(tmpfile): - os.remove(tmpfile) - - # Create po/ directory. - filesystem = GLFileSystem(self.config) - if pobase: - # Create po makefile and auxiliary files. - for file in ['Makefile.in.in', 'remove-potcdate.sin']: - tmpfile = self.assistant.tmpfilename(joinpath(pobase, file)) - path = joinpath('build-aux', 'po', file) - lookedup, flag = filesystem.lookup(path) - shutil.move(lookedup, tmpfile) - basename = joinpath(pobase, file) + else: # if lgpl is disabled + sed_transform_main_lib_file += lgpl2gpl + + # Determine script to apply to auxiliary files that go into $auxdir/. + sed_transform_build_aux_file = string() + if copyrights: + sed_transform_build_aux_file += lgpl2gpl + + # Determine script to apply to library files that go into $testsbase/. + sed_transform_testsrelated_lib_file = sed_transform_lib_file + if copyrights: + sed_transform_testsrelated_lib_file += lgpl2gpl + + # Determine the final file lists. + main_filelist, tests_filelist = \ + self.moduletable.filelist_separately(main_modules, tests_modules) + filelist = sorted( + set(main_filelist + tests_filelist), key=string.lower) + if not filelist: + raise(GLError(12, None)) + + # Print list of files. + if verbose >= 0: + print('File list:') + for file in filelist: + if file.startswith('tests=lib/'): + rest = file[10:] + print(' lib/%s -> tests/%s' % (rest, rest)) + else: + print(' %s' % file) + + # Prepare basic filelist and basic old_files/new_files variables. + filelist = sorted(set(filelist)) + new_files = filelist + ['m4/gnulib-tool.m4'] + old_files = list(self.cache['files']) + path = joinpath(destdir, m4base, 'gnulib-tool.m4') + if isfile(path): + old_files += [joinpath('m4', 'gnulib-tool.m4')] + + # Construct tables and transformers. + transformers = dict() + transformers['lib'] = string(sed_transform_lib_file) + transformers['aux'] = string(sed_transform_build_aux_file) + transformers['main'] = string(sed_transform_main_lib_file) + transformers['tests'] = string(sed_transform_testsrelated_lib_file) + old_table = list() + new_table = list() + for src in old_files: + dest = self.rewrite_old_files([src])[-1] + old_table += [tuple([dest, src])] + for src in new_files: + dest = self.rewrite_new_files([src])[-1] + new_table += [tuple([dest, src])] + old_table = sorted(set(old_table)) + new_table = sorted(set(new_table)) + + # Prepare the filetable. + filetable = dict() + filetable['all'] = sorted(set(filelist)) + filetable['old'] = \ + sorted(set(old_table), key=lambda t: tuple(t[0].lower())) + filetable['new'] = \ + sorted(set(new_table), key=lambda t: tuple(t[0].lower())) + filetable['added'] = list() + filetable['removed'] = list() + + # Return the result. + result = tuple([filetable, transformers]) + return(result) + + def execute(self, filetable, transformers): + '''Perform operations on the lists of files, which are given in a special + format except filelist argument. Such lists of files can be created using + GLImport.prepare() function.''' + if type(filetable) is not dict: + raise(TypeError('filetable must be a dict, not %s' % + type(filetable).__name__)) + for key in ['all', 'old', 'new', 'added', 'removed']: + if key not in filetable: + raise(KeyError('filetable must contain key %s' % repr(key))) + destdir = self.config['destdir'] + localdir = self.config['localdir'] + auxdir = self.config['auxdir'] + modules = list(self.config['modules']) + avoids = list(self.config['avoids']) + testflags = list(self.config['testflags']) + sourcebase = self.config['sourcebase'] + m4base = self.config['m4base'] + pobase = self.config['pobase'] + docbase = self.config['docbase'] + testsbase = self.config['testsbase'] + lgpl = self.config['lgpl'] + copyrights = self.config['copyrights'] + libname = self.config['libname'] + makefile = self.config['makefile'] + conddeps = self.config['conddeps'] + libtool = self.config['libtool'] + macro_prefix = self.config['macro_prefix'] + podomain = self.config['podomain'] + witness_c_macro = self.config['witness_c_macro'] + vc_files = self.config['vc_files'] + configure_ac = self.config['configure_ac'] + ac_version = self.config['ac_version'] + verbose = self.config['verbosity'] + actioncmd = self.actioncmd() + + # Create all necessary directories. + dirs = list() + if pobase: + dirs += [pobase] + if [file for file in filetable['all'] if file.startswith('doc/')]: + dirs += [docbase] + dirs += [sourcebase, m4base, auxdir] + dirs += [os.path.dirname(pair[0]) for pair in filetable['new']] + dirs = sorted(set([joinpath(destdir, d) for d in dirs])) + for directory in dirs: + if not isdir(directory): + print('Creating directory %s' % directory) + if not self.config['dryrun']: + try: # Try to create directory + os.makedirs(directory) + except Exception as error: + raise(GLError(13, directory)) + else: # if self.config['dryrun'] + print('Create directory %s' % directory) + + # Create GLFileAssistant instance to process files. + self.assistant = GLFileAssistant(self.config, transformers) + + # Files which are in filetable['old'] and not in filetable['new']. + # They will be removed and added to filetable['removed'] list. + pairs = [f for f in filetable['old'] if f not in filetable['old']] + pairs = sorted(set(pairs), key=lambda t: tuple(t[0].lower())) + files = sorted(set(pair[0] for pair in pairs)) + for file in files: + path = joinpath(destdir, file) + if isfile(path) or os.path.islink(path): + if not self.config['dryrun']: + backup = string('%s~' % path) + print('Removing file %s (backup in )' % (path, backup)) + try: # Try to move file + if os.path.exists(backup): + os.remove(backup) + shutil.move(path, '%s~' % path) + except Exception as error: + raise(GLError(14, file)) + else: # if self.config['dryrun'] + print('Remove file %s (backup in %s~)' % (path, path)) + filetable['removed'] += [file] + + # Files which are in filetable['new'] and not in filetable['old']. + # They will be added/updated and added to filetable['added'] list. + already_present = False + pairs = [f for f in filetable['new'] if f not in filetable['old']] + pairs = sorted(set(pairs)) + for pair in pairs: + original = pair[1] + rewritten = pair[0] + self.assistant.setOriginal(original) + self.assistant.setRewritten(rewritten) + self.assistant.add_or_update(already_present) + + # Files which are in filetable['new'] and in filetable['old']. + # They will be added/updated and added to filetable['added'] list. + already_present = True + pairs = [f for f in filetable['new'] if f in filetable['old']] + pairs = sorted(set(pairs)) + for pair in pairs: + original = pair[1] + rewritten = pair[0] + self.assistant.setOriginal(original) + self.assistant.setRewritten(rewritten) + self.assistant.add_or_update(already_present) + + # Add files which were added to the list of filetable['added']. + filetable['added'] += self.assistant.getFiles() + filetable['added'] = sorted(set(filetable['added'])) + + # Determine include_guard_prefix. + include_guard_prefix = self.config['include_guard_prefix'] + + # Determine makefile name. + if not makefile: + makefile_am = string('Makefile.am') + else: # if makefile + makefile_am = makefile + + # Create normal Makefile.ams. + for_test = False + + # Setup list of Makefile.am edits that are to be performed afterwards. + # Some of these edits apply to files that we will generate; others are + # under the responsibility of the developer. + makefile_am_edits = dict() + if makefile_am == 'Makefile.am': + sourcebase_dir = os.path.dirname(sourcebase) + sourcebase_base = os.path.basename(sourcebase) + self.makefiletable.editor( + sourcebase_dir, 'SUBDIRS', sourcebase_base) + if pobase: + pobase_dir = os.path.dirname(pobase) + pobase_base = os.path.basename(pobase) + self.makefiletable.editor(pobase_dir, 'SUBDIRS', pobase_base) + if self.config.checkTestFlag(TESTS['tests']): + if makefile_am == 'Makefile.am': + testsbase_dir = os.path.dirname(testsbase) + testsbase_base = os.path.basename(testsbase) + self.makefiletable.editor( + testsbase_dir, 'SUBDIRS', testsbase_base) + self.makefiletable.editor('', 'ACLOCAL_AMFLAGS', '-I %s' % m4base) + self.makefiletable.parent() + + # Create library makefile. + basename = joinpath(sourcebase, makefile_am) + tmpfile = self.assistant.tmpfilename(basename) + emit, uses_subdirs = self.emiter.lib_Makefile_am(basename, + self.moduletable['main'], self.moduletable, self.makefiletable, + actioncmd, for_test) + with codecs.open(tmpfile, 'wb', 'UTF-8') as file: + file.write(emit) filename, backup, flag = self.assistant.super_update(basename, tmpfile) if flag == 1: - if not self.config['dryrun']: - print('Updating %s (backup in %s)' % (filename, backup)) - else: # if self.config['dryrun'] - print('Update %s (backup in %s)' % (filename, backup)) + if not self.config['dryrun']: + print('Updating %s (backup in %s)' % (filename, backup)) + else: # if self.config['dryrun'] + print('Update %s (backup in %s)' % (filename, backup)) elif flag == 2: - if not self.config['dryrun']: - print('Creating %s' % filename) - else: # if self.config['dryrun']: - print('Create %s' % filename) - filetable['added'] += [filename] - if isfile(tmpfile): - os.remove(tmpfile) - - # Create po makefile parameterization, part 1. - basename = joinpath(pobase, 'Makevars') - tmpfile = self.assistant.tmpfilename(basename) - emit = self.emiter.po_Makevars() - with codecs.open(tmpfile, 'wb', 'UTF-8') as file: - file.write(emit) - filename, backup, flag = self.assistant.super_update(basename, tmpfile) - if flag == 1: - if not self.config['dryrun']: - print('Updating %s (backup in %s)' % (filename, backup)) - else: # if self.config['dryrun'] - print('Update %s (backup in %s)' % (filename, backup)) - elif flag == 2: - if not self.config['dryrun']: - print('Creating %s' % filename) - else: # if self.config['dryrun']: - print('Create %s' % filename) - filetable['added'] += [filename] - if isfile(tmpfile): - os.remove(tmpfile) - - # Create po makefile parameterization, part 2. - basename = joinpath(pobase, 'POTFILES.in') - tmpfile = self.assistant.tmpfilename(basename) - with codecs.open(tmpfile, 'wb', 'UTF-8') as file: - file.write(self.emiter.po_POTFILES_in(filetable['all'])) - basename = joinpath(pobase, 'POTFILES.in') - filename, backup, flag = self.assistant.super_update(basename, tmpfile) - if flag == 1: - if not self.config['dryrun']: - print('Updating %s (backup in %s)' % (filename, backup)) - else: # if self.config['dryrun'] - print('Update %s (backup in %s)' % (filename, backup)) - elif flag == 2: - if not self.config['dryrun']: - print('Creating %s' % filename) - else: # if self.config['dryrun']: - print('Create %s' % filename) - filetable['added'] += [filename] - if isfile(tmpfile): - os.remove(tmpfile) - - # Fetch PO files. - TP_URL = 'http://translationproject.org/latest/' - TP_RSYNC_URI = 'translationproject.org::tp/latest/' - if not self.config['dryrun']: - print('Fetching gnulib PO files from %s' % TP_URL) - os.chdir(joinpath(destdir, pobase)) - cmd = 'if type rsync 2>/dev/null | grep / > /dev/null; ' - cmd += 'then echo 1; else echo 0; fi' - result = sp.check_output(cmd, shell=True) - result = bool(int(result)) - if result: # use rsync - args = ['rsync', '-Lrtz', '%sgulib/' % TP_RSYNC_URI, '.'] - else: # use wget - args = ['wget', '--quiet', '-r', '-l1', '-nd', '-np', 'A.po', - '%sgnulib' % TP_URL] - sp.call(args, shell=True) - else: # if self.config['dryrun'] - print('Fetch gnulib PO files from %s' % TP_URL) - - # Create po/LINGUAS. - basename = joinpath(pobase, 'LINGUAS') - if not self.config['dryrun']: + if not self.config['dryrun']: + print('Creating %s' % filename) + else: # if self.config['dryrun']: + print('Create %s' % filename) + filetable['added'] += [filename] + if isfile(tmpfile): + os.remove(tmpfile) + + # Create po/ directory. + filesystem = GLFileSystem(self.config) + if pobase: + # Create po makefile and auxiliary files. + for file in ['Makefile.in.in', 'remove-potcdate.sin']: + tmpfile = self.assistant.tmpfilename(joinpath(pobase, file)) + path = joinpath('build-aux', 'po', file) + lookedup, flag = filesystem.lookup(path) + shutil.move(lookedup, tmpfile) + basename = joinpath(pobase, file) + filename, backup, flag = self.assistant.super_update( + basename, tmpfile) + if flag == 1: + if not self.config['dryrun']: + print('Updating %s (backup in %s)' % + (filename, backup)) + else: # if self.config['dryrun'] + print('Update %s (backup in %s)' % (filename, backup)) + elif flag == 2: + if not self.config['dryrun']: + print('Creating %s' % filename) + else: # if self.config['dryrun']: + print('Create %s' % filename) + filetable['added'] += [filename] + if isfile(tmpfile): + os.remove(tmpfile) + + # Create po makefile parameterization, part 1. + basename = joinpath(pobase, 'Makevars') + tmpfile = self.assistant.tmpfilename(basename) + emit = self.emiter.po_Makevars() + with codecs.open(tmpfile, 'wb', 'UTF-8') as file: + file.write(emit) + filename, backup, flag = self.assistant.super_update( + basename, tmpfile) + if flag == 1: + if not self.config['dryrun']: + print('Updating %s (backup in %s)' % (filename, backup)) + else: # if self.config['dryrun'] + print('Update %s (backup in %s)' % (filename, backup)) + elif flag == 2: + if not self.config['dryrun']: + print('Creating %s' % filename) + else: # if self.config['dryrun']: + print('Create %s' % filename) + filetable['added'] += [filename] + if isfile(tmpfile): + os.remove(tmpfile) + + # Create po makefile parameterization, part 2. + basename = joinpath(pobase, 'POTFILES.in') + tmpfile = self.assistant.tmpfilename(basename) + with codecs.open(tmpfile, 'wb', 'UTF-8') as file: + file.write(self.emiter.po_POTFILES_in(filetable['all'])) + basename = joinpath(pobase, 'POTFILES.in') + filename, backup, flag = self.assistant.super_update( + basename, tmpfile) + if flag == 1: + if not self.config['dryrun']: + print('Updating %s (backup in %s)' % (filename, backup)) + else: # if self.config['dryrun'] + print('Update %s (backup in %s)' % (filename, backup)) + elif flag == 2: + if not self.config['dryrun']: + print('Creating %s' % filename) + else: # if self.config['dryrun']: + print('Create %s' % filename) + filetable['added'] += [filename] + if isfile(tmpfile): + os.remove(tmpfile) + + # Fetch PO files. + TP_URL = 'http://translationproject.org/latest/' + TP_RSYNC_URI = 'translationproject.org::tp/latest/' + if not self.config['dryrun']: + print('Fetching gnulib PO files from %s' % TP_URL) + os.chdir(joinpath(destdir, pobase)) + cmd = 'if type rsync 2>/dev/null | grep / > /dev/null; ' + cmd += 'then echo 1; else echo 0; fi' + result = sp.check_output(cmd, shell=True) + result = bool(int(result)) + if result: # use rsync + args = ['rsync', '-Lrtz', '%sgulib/' % TP_RSYNC_URI, '.'] + else: # use wget + args = ['wget', '--quiet', '-r', '-l1', '-nd', '-np', 'A.po', + '%sgnulib' % TP_URL] + sp.call(args, shell=True) + else: # if self.config['dryrun'] + print('Fetch gnulib PO files from %s' % TP_URL) + + # Create po/LINGUAS. + basename = joinpath(pobase, 'LINGUAS') + if not self.config['dryrun']: + tmpfile = self.assistant.tmpfilename(basename) + data = string('# Set of available languages.\n') + files = [constants.subend('.po', '', file) + for file in os.listdir(joinpath(destdir, pobase))] + files = [file.decode(ENCS['default']) if type(file) is bytes + else file for file in files] + data += '\n'.join(files) + with codecs.open(tmpfile, 'wb', 'UTF-8') as file: + file.write(data) + filename, backup, flag = self.assistant.super_update( + basename, tmpfile) + if flag == 1: + print('Updating %s (backup in %s)' % (filename, backup)) + elif flag == 2: + print('Creating %s' % filename) + filetable['added'] += [filename] + if isfile(tmpfile): + os.remove(tmpfile) + else: # if not self.config['dryrun'] + backupname = '%s~' % basename + if isfile(destdir, basename): + print('Update %s (backup in %s)' % (basename, backupname)) + else: # if not isfile(destdir, basename) + print('Create %s' % basename) + + # Create m4/gnulib-cache.m4. + basename = joinpath(m4base, 'gnulib-cache.m4') tmpfile = self.assistant.tmpfilename(basename) - data = string('# Set of available languages.\n') - files = [constants.subend('.po', '', file) \ - for file in os.listdir(joinpath(destdir, pobase))] - files = [file.decode(ENCS['default']) if type(file) is bytes \ - else file for file in files] - data += '\n'.join(files) + emit = self.gnulib_cache() with codecs.open(tmpfile, 'wb', 'UTF-8') as file: - file.write(data) + file.write(emit) filename, backup, flag = self.assistant.super_update(basename, tmpfile) if flag == 1: - print('Updating %s (backup in %s)' % (filename, backup)) + if not self.config['dryrun']: + print('Updating %s (backup in %s)' % (filename, backup)) + else: # if self.config['dryrun'] + print('Update %s (backup in %s)' % (filename, backup)) elif flag == 2: - print('Creating %s' % filename) - filetable['added'] += [filename] + if not self.config['dryrun']: + print('Creating %s' % filename) + else: # if self.config['dryrun']: + print('Create %s' % filename) + if emit[-2:] == '\r\n': + emit = emit[:-2] + elif emit[-1:] == '\n': + emit = emit[:-1] + print(emit) if isfile(tmpfile): - os.remove(tmpfile) - else: # if not self.config['dryrun'] - backupname = '%s~' % basename - if isfile(destdir, basename): - print('Update %s (backup in %s)' % (basename, backupname)) - else: # if not isfile(destdir, basename) - print('Create %s' % basename) - - # Create m4/gnulib-cache.m4. - basename = joinpath(m4base, 'gnulib-cache.m4') - tmpfile = self.assistant.tmpfilename(basename) - emit = self.gnulib_cache() - with codecs.open(tmpfile, 'wb', 'UTF-8') as file: - file.write(emit) - filename, backup, flag = self.assistant.super_update(basename, tmpfile) - if flag == 1: - if not self.config['dryrun']: - print('Updating %s (backup in %s)' % (filename, backup)) - else: # if self.config['dryrun'] - print('Update %s (backup in %s)' % (filename, backup)) - elif flag == 2: - if not self.config['dryrun']: - print('Creating %s' % filename) - else: # if self.config['dryrun']: - print('Create %s' % filename) - if emit[-2:] == '\r\n': - emit = emit[:-2] - elif emit[-1:] == '\n': - emit = emit[:-1] - print(emit) - if isfile(tmpfile): - os.remove(tmpfile) - - # Create m4/gnulib-comp.m4. - basename = joinpath(m4base, 'gnulib-comp.m4') - tmpfile = self.assistant.tmpfilename(basename) - emit = self.gnulib_comp(filetable['all']) - with codecs.open(tmpfile, 'wb', 'UTF-8') as file: - file.write(emit) - filename, backup, flag = self.assistant.super_update(basename, tmpfile) - if flag == 1: - if not self.config['dryrun']: - print('Updating %s (backup in %s)' % (filename, backup)) - else: # if self.config['dryrun'] - print('Update %s (backup in %s)' % (filename, backup)) - elif flag == 2: - if not self.config['dryrun']: - print('Creating %s' % filename) - else: # if self.config['dryrun']: - print('Create %s' % filename) - if emit[-2:] == '\r\n': - emit = emit[:-2] - elif emit[-1:] == '\n': - emit = emit[:-1] - print(emit) - if isfile(tmpfile): - os.remove(tmpfile) - - # Create tests Makefile. - inctests = self.config.checkTestFlag(TESTS['tests']) - if inctests: - basename = joinpath(testsbase, makefile_am) - tmpfile = self.assistant.tmpfilename(basename) - emit, uses_subdirs = self.emiter.lib_Makefile_am(basename, - self.moduletable['tests'], self.moduletable, self.makefiletable, - actioncmd, for_test) - with codecs.open(tmpfile, 'wb', 'UTF-8') as file: - file.write(emit) - filename, backup, flag = self.assistant.super_update(basename, tmpfile) - if flag == 1: - if not self.config['dryrun']: - print('Updating %s (backup in %s)' % (filename, backup)) - else: # if self.config['dryrun'] - print('Update %s (backup in %s)' % (filename, backup)) - elif flag == 2: - if not self.config['dryrun']: - print('Creating %s' % filename) - else: # if self.config['dryrun']: - print('Create %s' % filename) - filetable['added'] += [filename] - if isfile(tmpfile): - os.remove(tmpfile) - - # Update the .cvsignore and .gitignore files. - ignorelist = list() - filetable['added'] = sorted(set(filetable['added'])) - filetable['removed'] = sorted(set(filetable['added'])) - for file in filetable['added']: - directory, basename = os.path.split(file) - ignorelist += [tuple([directory, '|A|', basename])] - for file in filetable['removed']: - directory, basename = os.path.split(file) - ignorelist += [tuple([directory, '|R|', basename])] - last_dir = string() - last_dirs_added = list() - last_dirs_removed = list() - for row in ignorelist: - next_dir = row[0] - operand = row[1] - filename = row[2] - if next_dir != last_dir: - self._done_dir_(last_dir, last_dirs_added, last_dirs_removed) - last_dir = next_dir + os.remove(tmpfile) + + # Create m4/gnulib-comp.m4. + basename = joinpath(m4base, 'gnulib-comp.m4') + tmpfile = self.assistant.tmpfilename(basename) + emit = self.gnulib_comp(filetable['all']) + with codecs.open(tmpfile, 'wb', 'UTF-8') as file: + file.write(emit) + filename, backup, flag = self.assistant.super_update(basename, tmpfile) + if flag == 1: + if not self.config['dryrun']: + print('Updating %s (backup in %s)' % (filename, backup)) + else: # if self.config['dryrun'] + print('Update %s (backup in %s)' % (filename, backup)) + elif flag == 2: + if not self.config['dryrun']: + print('Creating %s' % filename) + else: # if self.config['dryrun']: + print('Create %s' % filename) + if emit[-2:] == '\r\n': + emit = emit[:-2] + elif emit[-1:] == '\n': + emit = emit[:-1] + print(emit) + if isfile(tmpfile): + os.remove(tmpfile) + + # Create tests Makefile. + inctests = self.config.checkTestFlag(TESTS['tests']) + if inctests: + basename = joinpath(testsbase, makefile_am) + tmpfile = self.assistant.tmpfilename(basename) + emit, uses_subdirs = self.emiter.lib_Makefile_am(basename, + self.moduletable['tests'], self.moduletable, self.makefiletable, + actioncmd, for_test) + with codecs.open(tmpfile, 'wb', 'UTF-8') as file: + file.write(emit) + filename, backup, flag = self.assistant.super_update( + basename, tmpfile) + if flag == 1: + if not self.config['dryrun']: + print('Updating %s (backup in %s)' % (filename, backup)) + else: # if self.config['dryrun'] + print('Update %s (backup in %s)' % (filename, backup)) + elif flag == 2: + if not self.config['dryrun']: + print('Creating %s' % filename) + else: # if self.config['dryrun']: + print('Create %s' % filename) + filetable['added'] += [filename] + if isfile(tmpfile): + os.remove(tmpfile) + + # Update the .cvsignore and .gitignore files. + ignorelist = list() + filetable['added'] = sorted(set(filetable['added'])) + filetable['removed'] = sorted(set(filetable['added'])) + for file in filetable['added']: + directory, basename = os.path.split(file) + ignorelist += [tuple([directory, '|A|', basename])] + for file in filetable['removed']: + directory, basename = os.path.split(file) + ignorelist += [tuple([directory, '|R|', basename])] + last_dir = string() last_dirs_added = list() last_dirs_removed = list() - if operand == '|A|': - last_dirs_added += [filename] - elif operand == '|R|': - last_dirs_removed += [filename] - self._done_dir_(last_dir, last_dirs_added, last_dirs_removed) - exit() - - # Finish the work. - print('Finished.\n') - print('You may need to add #include directives \ + for row in ignorelist: + next_dir = row[0] + operand = row[1] + filename = row[2] + if next_dir != last_dir: + self._done_dir_(last_dir, last_dirs_added, last_dirs_removed) + last_dir = next_dir + last_dirs_added = list() + last_dirs_removed = list() + if operand == '|A|': + last_dirs_added += [filename] + elif operand == '|R|': + last_dirs_removed += [filename] + self._done_dir_(last_dir, last_dirs_added, last_dirs_removed) + exit() + + # Finish the work. + print('Finished.\n') + print('You may need to add #include directives \ for the following .h files.') - modules = sorted(set([module for module in self.moduletable['base'] \ - if module in self.moduletable['main']])) - # First the #include <...> directives without #ifs, sorted for convenience, - # then the #include "..." directives without #ifs, sorted for convenience, - # then the #include directives that are surrounded by #ifs. Not sorted. - includes_angles = list() - includes_quotes = list() - includes_if = list() - for module in modules: - include = module.getInclude() - for include in include.split('\n'): - if '%s#if' % constants.NL in '%s%s' % (constants.NL, include): - includes_if += [include] - else: # if '%s#if' % constants.NL in '%s%s' % (constants.NL, include) - if 'include "' in include: - includes_quotes += [include] - else: # if 'include "' not in include - includes_angles += [include] - includes_angles = sorted(set(includes_angles)) - includes_quotes = sorted(set(includes_quotes)) - includes = includes_angles +includes_quotes +includes_if - includes = [include for include in includes if include.split()] - for include in includes: - print(' %s' % include) - - # Get link directives. - links = [module.getLink() for module in self.moduletable['main']] - links = sorted(set([link for link in links if link.strip()])) - if links: - print(''' + modules = sorted(set([module for module in self.moduletable['base'] + if module in self.moduletable['main']])) + # First the #include <...> directives without #ifs, sorted for convenience, + # then the #include "..." directives without #ifs, sorted for convenience, + # then the #include directives that are surrounded by #ifs. Not sorted. + includes_angles = list() + includes_quotes = list() + includes_if = list() + for module in modules: + include = module.getInclude() + for include in include.split('\n'): + if '%s#if' % constants.NL in '%s%s' % (constants.NL, include): + includes_if += [include] + # if '%s#if' % constants.NL in '%s%s' % (constants.NL, include) + else: + if 'include "' in include: + includes_quotes += [include] + else: # if 'include "' not in include + includes_angles += [include] + includes_angles = sorted(set(includes_angles)) + includes_quotes = sorted(set(includes_quotes)) + includes = includes_angles + includes_quotes + includes_if + includes = [include for include in includes if include.split()] + for include in includes: + print(' %s' % include) + + # Get link directives. + links = [module.getLink() for module in self.moduletable['main']] + links = sorted(set([link for link in links if link.strip()])) + if links: + print(''' You may need to use the following Makefile variables when linking. Use them in <program>_LDADD when linking a program, or in <library>_a_LDFLAGS or <library>_la_LDFLAGS when linking a library.''') - for link in links: - print(' %s' % link) - - # Print reminders. - print('') - print('Don\'t forget to') - if makefile_am == 'Makefile.am': - print(' - add "%s/Makefile" to AC_CONFIG_FILES in %s,' % \ - (sourcebase, configure_ac)) - else: # if makefile_am != 'Makefile.am' - print(' - "include %s" from within "%s/Makefile.am",' % \ - (makefile, sourcebase)) - if pobase: - print(' - add "%s/Makefile.in to AC_CONFIG_FILES in %s,' % \ - (pobase, configure_ac)) - if inctests: - if makefile_am == 'Makefile.am': - print(' - add "%s/Makefile" to AC_CONFIG_FILES in %s,' % \ - (testsbase, configure_ac)) - else: # if makefile_am != 'Makefile.am' - print(' - "include %s" from within "%s/Makefile.am",' % \ - (makefile, testsbase)) - # Print makefile edits. - current_edit = int() - makefile_am_edits = self.makefiletable.count() - while current_edit != makefile_am_edits: - dictionary = self.makefiletable[current_edit] - if dictionary['var']: - print(' - mention "%s" in %s in %s,' % \ - (dictionary['val'], dictionary['var'], - joinpath(dictionary['dir'], 'Makefile.am'))) - current_edit += 1 - - # Detect position_early_after. - with codecs.open(configure_ac, 'rb', 'UTF-8') as file: - data = file.read() - match_result1 = \ - bool(compiler('^ *AC_PROG_CC_STDC', re.S | re.M).findall(data)) - match_result2 = \ - bool(compiler('^ *AC_PROG_CC_C99', re.S | re.M).findall(data)) - if match_result1: - position_early_after = 'AC_PROG_CC_STDC' - elif match_result2: - position_early_after = 'AC_PROG_CC_C99' - else: # if not any([match_result1, match_result2]) - position_early_after = 'AC_PROG_CC' - print(' - invoke %s_EARLY in %s, right after %s,' % \ - (macro_prefix, configure_ac, position_early_after)) - print(' - invoke %s_INIT in %s.' % \ - (macro_prefix, configure_ac)) - sp.call(['rm', '-rf', self.config['tempdir']], shell=False) + for link in links: + print(' %s' % link) + + # Print reminders. + print('') + print('Don\'t forget to') + if makefile_am == 'Makefile.am': + print(' - add "%s/Makefile" to AC_CONFIG_FILES in %s,' % + (sourcebase, configure_ac)) + else: # if makefile_am != 'Makefile.am' + print(' - "include %s" from within "%s/Makefile.am",' % + (makefile, sourcebase)) + if pobase: + print(' - add "%s/Makefile.in to AC_CONFIG_FILES in %s,' % + (pobase, configure_ac)) + if inctests: + if makefile_am == 'Makefile.am': + print(' - add "%s/Makefile" to AC_CONFIG_FILES in %s,' % + (testsbase, configure_ac)) + else: # if makefile_am != 'Makefile.am' + print(' - "include %s" from within "%s/Makefile.am",' % + (makefile, testsbase)) + # Print makefile edits. + current_edit = int() + makefile_am_edits = self.makefiletable.count() + while current_edit != makefile_am_edits: + dictionary = self.makefiletable[current_edit] + if dictionary['var']: + print(' - mention "%s" in %s in %s,' % + (dictionary['val'], dictionary['var'], + joinpath(dictionary['dir'], 'Makefile.am'))) + current_edit += 1 + # Detect position_early_after. + with codecs.open(configure_ac, 'rb', 'UTF-8') as file: + data = file.read() + match_result1 = \ + bool(compiler('^ *AC_PROG_CC_STDC', re.S | re.M).findall(data)) + match_result2 = \ + bool(compiler('^ *AC_PROG_CC_C99', re.S | re.M).findall(data)) + if match_result1: + position_early_after = 'AC_PROG_CC_STDC' + elif match_result2: + position_early_after = 'AC_PROG_CC_C99' + else: # if not any([match_result1, match_result2]) + position_early_after = 'AC_PROG_CC' + print(' - invoke %s_EARLY in %s, right after %s,' % + (macro_prefix, configure_ac, position_early_after)) + print(' - invoke %s_INIT in %s.' % + (macro_prefix, configure_ac)) + sp.call(['rm', '-rf', self.config['tempdir']], shell=False) |