blob: f4c07be25da9d5d168f31841c38e89f411ee6959 [file] [log] [blame] [edit]
#!/usr/bin/python
import optparse, os, re
import common
from autotest_lib.mirror import trigger
default_config_path = os.path.expanduser(
os.path.join(os.path.dirname(__file__), 'config.py'))
options = optparse.Values()
def import_config_file(path):
"""
Import the config file executing it as python code inside a class
instance namespace to isolate the defined names inside it and return
the the namespace (ie it emulates __import__ but does not require
proper packages to the path of the module to import, just a full filename).
"""
class namespace_type(object):
def __init__(self):
# hardcoded default values
self.filter_exprs = ()
self.trigger = trigger.trigger()
self.__file__ = os.path.abspath(path)
namespace = namespace_type()
# execute the file using the given namespace
execfile(path, namespace.__dict__)
return namespace
def filter_kernels(files, exprs):
# don't filter anything if no filtering expressions given
if not exprs:
return files
compiled = [re.compile(r) for r in exprs]
def matches(fname):
for pattern in compiled:
match = pattern.match(fname)
if match:
return match.groupdict().get('arg', fname)
return None
# return a sequence of (possibly transformed) matched filenames
return set(filter(None, map(matches, files)))
def main():
# import configuration file
config = import_config_file(options.config)
new_files = config.source.get_new_files()
if options.verbose:
print 'Found %d new files...' % len(new_files)
if not new_files:
return
# commit the new files to the database
if options.verbose:
print 'Committing to the known files database...'
config.source.store_files(new_files)
if not options.dry_run:
config.trigger.run(filter_kernels(new_files, config.filter_exprs))
if __name__ == '__main__':
usage = 'mirror [options]'
parser = optparse.OptionParser(usage=usage)
parser.add_option('-c', '--config-file', dest='config',
help='Location of the configuration file; defaults \
to %s' % default_config_path, default=default_config_path)
parser.add_option('-n', '--dry-run', dest='dry_run', action='store_true',
default=False,
help='Perform a dry run without scheduling jobs but \
updating the known files database.')
parser.add_option('-q', '--quiet', dest='verbose', action='store_false',
default=True,
help='Do not print anything except errors.')
(options, args) = parser.parse_args()
main()