Introduces a new management command which can export all patches in a project as one mbox file. Export of multiple projects is supported. Additionaly allows to compress the output.
Signed-off-by: Mete Polat <metepolat2...@gmail.com> --- Also supports python2 with the force_bytes() function. .../management/commands/exportproject.py | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 patchwork/management/commands/exportproject.py diff --git a/patchwork/management/commands/exportproject.py b/patchwork/management/commands/exportproject.py new file mode 100644 index 0000000..7e18234 --- /dev/null +++ b/patchwork/management/commands/exportproject.py @@ -0,0 +1,71 @@ +# Patchwork - automated patch tracking system +# Copyright (C) 2019, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import os +import tarfile +from uuid import uuid4 + +from django.core.management import BaseCommand, CommandError +from django.utils.encoding import force_bytes + +from patchwork.models import Project, Patch +from patchwork.views.utils import patch_to_mbox + + +class Command(BaseCommand): + help = 'Export patchwork projects as mbox files and optionally compress ' + 'the result.' + + def add_arguments(self, parser): + parser.add_argument( + '-c', '--compress', action='store_true', + help='Bundle and compress projects.' + ) + parser.add_argument( + '-l', '--level', action='store', type=int, default=9, + help='Set a compression level between 0 and 9 (default). 0 is no ' + 'compression. ' + ) + parser.add_argument( + 'project_linkname', nargs='*', + help='Project linknames. Export all projects if none specified.' + ) + + def handle(self, *args, **options): + if options['project_linkname']: + projects = [] + for p_linkname in options['project_linkname']: + try: + projects.append(Project.objects.get(linkname=p_linkname)) + except Project.DoesNotExist: + raise CommandError('%s: Project not found' % p_linkname) + else: + projects = Project.objects.all() + + compress = options['compress'] + level = options['level'] + + tar = None + if compress: + name = projects[0].linkname if len(projects) == 1 else 'patchwork' + name += '.tar' if level == 0 else '.tar.gz' + tar = tarfile.open(name, 'w:gz', compresslevel=level) + + try: + for project in projects: + name = project.linkname + '.mbox' + tmp_name = '%s_%s' % (project.linkname, uuid4().hex) + with open(tmp_name, 'wb') as mbox: + for patch in Patch.objects.filter(patch_project=project): + mbox.write(force_bytes(patch_to_mbox(patch) + '\n')) + mbox.close() + if compress: + tar.add(tmp_name, arcname=name) + os.remove(tmp_name) + else: + os.rename(tmp_name, name) + finally: + if tar is not None: + tar.close() -- 2.22.0 _______________________________________________ Patchwork mailing list Patchwork@lists.ozlabs.org https://lists.ozlabs.org/listinfo/patchwork