[FIX] migration: allow debugging of migration scripts + avoid useless copies

This commit is contained in:
Christophe Simonis 2014-10-01 16:34:13 +02:00
parent 19da7b708c
commit a1eb27b8ef
1 changed files with 10 additions and 14 deletions

View File

@ -131,11 +131,6 @@ class MigrationManager(object):
lst.sort() lst.sort()
return lst return lst
def mergedict(a, b):
a = a.copy()
a.update(b)
return a
parsed_installed_version = parse_version(pkg.installed_version or '') parsed_installed_version = parse_version(pkg.installed_version or '')
current_version = parse_version(convert_version(pkg.data['version'])) current_version = parse_version(convert_version(pkg.data['version']))
@ -155,19 +150,20 @@ class MigrationManager(object):
continue continue
mod = fp = fp2 = None mod = fp = fp2 = None
try: try:
fp = tools.file_open(pyfile) fp, fname = tools.file_open(pyfile, pathinfo=True)
# imp.load_source need a real file object, so we create if not isinstance(fp, file):
# one from the file-like object we get from file_open # imp.load_source need a real file object, so we create
fp2 = os.tmpfile() # one from the file-like object we get from file_open
fp2.write(fp.read()) fp2 = os.tmpfile()
fp2.seek(0) fp2.write(fp.read())
fp2.seek(0)
try: try:
mod = imp.load_source(name, pyfile, fp2) mod = imp.load_source(name, fname, fp2 or fp)
_logger.info('module %(addon)s: Running migration %(version)s %(name)s' % mergedict({'name': mod.__name__}, strfmt)) _logger.info('module %(addon)s: Running migration %(version)s %(name)s' % dict(strfmt, name=mod.__name__))
migrate = mod.migrate migrate = mod.migrate
except ImportError: except ImportError:
_logger.exception('module %(addon)s: Unable to load %(stage)s-migration file %(file)s' % mergedict({'file': pyfile}, strfmt)) _logger.exception('module %(addon)s: Unable to load %(stage)s-migration file %(file)s' % dict(strfmt, file=pyfile))
raise raise
except AttributeError: except AttributeError:
_logger.error('module %(addon)s: Each %(stage)s-migration file must have a "migrate(cr, installed_version)" function' % strfmt) _logger.error('module %(addon)s: Each %(stage)s-migration file must have a "migrate(cr, installed_version)" function' % strfmt)