From 01f2c5c9d262a3c7a7584badc4f71d5b244ef928 Mon Sep 17 00:00:00 2001 From: Dharmraj Jhala Date: Mon, 9 Mar 2015 10:48:20 +0530 Subject: [PATCH] [IMP] Allow custom ordering of files contained in zip dumps This will allow to speed up our migration platform: as funzip can pipe the output of the first file of the archive, even if the file is not fully unzipped yet. This is useful to plays with dump.sql without waiting for the full archive decompression. --- openerp/service/db.py | 4 ++-- openerp/tools/osutil.py | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/openerp/service/db.py b/openerp/service/db.py index 0dbc50e2747..485a35c4abd 100644 --- a/openerp/service/db.py +++ b/openerp/service/db.py @@ -195,10 +195,10 @@ def dump_db(db_name, stream, backup_format='zip'): cmd.insert(-1, '--file=' + os.path.join(dump_dir, 'dump.sql')) openerp.tools.exec_pg_command(*cmd) if stream: - openerp.tools.osutil.zip_dir(dump_dir, stream, include_dir=False) + openerp.tools.osutil.zip_dir(dump_dir, stream, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql') else: t=tempfile.TemporaryFile() - openerp.tools.osutil.zip_dir(dump_dir, t, include_dir=False) + openerp.tools.osutil.zip_dir(dump_dir, t, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql') t.seek(0) return t else: diff --git a/openerp/tools/osutil.py b/openerp/tools/osutil.py index afe3fc459f3..a71b6ccbd54 100644 --- a/openerp/tools/osutil.py +++ b/openerp/tools/osutil.py @@ -73,7 +73,12 @@ def tempdir(): finally: shutil.rmtree(tmpdir) -def zip_dir(path, stream, include_dir=True): # TODO add ignore list +def zip_dir(path, stream, include_dir=True, fnct_sort=None): # TODO add ignore list + """ + : param fnct_sort : Function to be passed to "key" parameter of built-in + python sorted() to provide flexibility of sorting files + inside ZIP archive according to specific requirements. + """ path = os.path.normpath(path) len_prefix = len(os.path.dirname(path)) if include_dir else len(path) if len_prefix: @@ -81,6 +86,7 @@ def zip_dir(path, stream, include_dir=True): # TODO add ignore list with zipfile.ZipFile(stream, 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True) as zipf: for dirpath, dirnames, filenames in os.walk(path): + filenames = sorted(filenames, key=fnct_sort) for fname in filenames: bname, ext = os.path.splitext(fname) ext = ext or bname