From patchwork Mon Jul 15 14:50:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mete Polat X-Patchwork-Id: 1132069 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45nRNy06JQz9sPv for ; Tue, 16 Jul 2019 00:53:38 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="piEfPNhD"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 45nRNw3TkmzDqBj for ; Tue, 16 Jul 2019 00:53:36 +1000 (AEST) X-Original-To: patchwork@lists.ozlabs.org Delivered-To: patchwork@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gmail.com (client-ip=2a00:1450:4864:20::330; helo=mail-wm1-x330.google.com; envelope-from=metepolat2000@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="piEfPNhD"; dkim-atps=neutral Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 45nRL818lLzDqS1 for ; Tue, 16 Jul 2019 00:51:11 +1000 (AEST) Received: by mail-wm1-x330.google.com with SMTP id p74so15469642wme.4 for ; Mon, 15 Jul 2019 07:51:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=8sNLN5sSm3r8S0DalbStCrnGFBlGFf9JFAkLThtsX9I=; b=piEfPNhD1A/DoKD9phnI0Jd+q5ZxiPWegcyM66QF6cxCQixallFU24uRfyN5P5PV51 elvw5qz+jV/uXW/d304xFfu+YeHdPtF72WLEyculHUULki5yY0bnWUKoWq9ac2jVOCR2 xwNp+z4FLVeRvc6KAjeELvJ/ieiYHHraJEC7oMO8jmx2sLi3eS7Xm9yYPb3LQsfNY1i2 jotufXNFbRJNHNnzzt+/ikWlrrSbCjuad0MglrtKJxTRv6VuR77bG8VcqDpQXBrI/fjp yM5c96eqPriNA1cyiBk0+wysiy+3mZQHU1YVWDimz+3p37UvYfsTwDuGZ3AvjDccMEye 8iaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=8sNLN5sSm3r8S0DalbStCrnGFBlGFf9JFAkLThtsX9I=; b=KbybPNB+In91cBOTE27Sd/dd4Ly4pYWHS5vbRI+GNfvNrsFlzuF2To2yxpID3nj62O FLXC3ys48yNG3PVfctPNP2CMY8odPK7E4fZSbSn82JWVxKfIgFXo8EDxJVIQ9F7dIwdL ThAnCBHI2t6loqyVinNqlmMgF4TsaMj2Rkb/PWZPuPR9QyDPiZcZoWgdIJezWh4UUl65 qjoEI+aVCHb5gvExApcR/72svt3A2dVq6WwoQHVuZE3+t/wrb433eflE09CgnsejHRqW 4kknHFWp2HB6uXxNtaA51VvXLvgf4yCL8W4ejS+pQbVUk0HHM2GhCqBEFXdgjf/VAxn9 5Kbw== X-Gm-Message-State: APjAAAU7yyRPw7MtV0TqRACOI/4hRiG3GezarCpKBC9B4YZcN7At3c1A 3O+sltrUxZ+OGqITT16vBJEiwVAY2YwY6A== X-Google-Smtp-Source: APXvYqy4Iho/dTah/hJr+lANo63qHGpvdVFnsGNWqKQdsKrDDjMuQLrats1p4tKN/4EOHhxJ7g73yw== X-Received: by 2002:a1c:e009:: with SMTP id x9mr24565801wmg.5.1563202264953; Mon, 15 Jul 2019 07:51:04 -0700 (PDT) Received: from localhost.localdomain ([193.23.33.53]) by smtp.gmail.com with ESMTPSA id z6sm13466262wrw.2.2019.07.15.07.51.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 Jul 2019 07:51:04 -0700 (PDT) From: Mete Polat To: patchwork@lists.ozlabs.org Subject: [PATCH 1/3] Add export project as mbox management command Date: Mon, 15 Jul 2019 16:50:28 +0200 Message-Id: <20190715145030.7877-1-metepolat2000@gmail.com> X-Mailer: git-send-email 2.22.0 MIME-Version: 1.0 X-BeenThere: patchwork@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Patchwork development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ralf.ramsauer@oth-regensburg.de, wolfgang.mauerer@oth-regensburg.de Errors-To: patchwork-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Patchwork" 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 --- 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() From patchwork Mon Jul 15 14:50:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mete Polat X-Patchwork-Id: 1132067 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45nRLh2TdSzB3xR for ; Tue, 16 Jul 2019 00:51:40 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="uEE6UEdg"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 45nRLf5NGWzDqVr for ; Tue, 16 Jul 2019 00:51:38 +1000 (AEST) X-Original-To: patchwork@lists.ozlabs.org Delivered-To: patchwork@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gmail.com (client-ip=2a00:1450:4864:20::343; helo=mail-wm1-x343.google.com; envelope-from=metepolat2000@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="uEE6UEdg"; dkim-atps=neutral Received: from mail-wm1-x343.google.com (mail-wm1-x343.google.com [IPv6:2a00:1450:4864:20::343]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 45nRL83TZYzDqVK for ; Tue, 16 Jul 2019 00:51:12 +1000 (AEST) Received: by mail-wm1-x343.google.com with SMTP id v15so15507739wml.0 for ; Mon, 15 Jul 2019 07:51:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WYiYh5iKvEPF/RGKJZuoFYi2y3mJGyDGb1+kbY/Zzx8=; b=uEE6UEdgsEwVKo0L0B+angE+/7jSkhET2dH3D1yuyDQTPp1ccM33YjZAwYqOS7swJN R8OujBiNpoVejCFowEYlDggsFseIzP2Zy3ilrEyJbvvyoS9ICAchTutQcLKl0iKFdD7K ywHzQPbCAFg3DKDUe7n+IcXyAh9u/A0GJRrWiGhyUnKo24CbO5UDjBtyhv4QZTzZRzjv iJ24FMdx1iqCG9sdGIjaH8xvsUARi7NDPO1WyvlGIsnBtx5bBLr0ydGgh6/8hDhTBWn+ 116jbzQG2qif6iKsuekEWMSnXL3S5/hLNkTN0b59r5Z3ZyNTeI7kVSXn52E8cu2kvvSU 4mhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WYiYh5iKvEPF/RGKJZuoFYi2y3mJGyDGb1+kbY/Zzx8=; b=UIwK3iAwo1kW8VNHEipPE7QJAyi4Pf2PVFMKnsTKrbwqaQbkJlMWGJP4vuhyZqXcFa mfImXNqyJVt+whWyojiQYumlwWYv0+Sjoih8AEu58IG/RWMdMpTA+9EksYvA3cdjsDAF z5kXEuWLNYfW7ajJt5ZhVU4WvVLTMSwH8JFkoCFjycdfTffSu4npAqfr8STo5/2/YvsQ pfY+EwYDXwLHP97QeDeg49NwiGjOUZoqx1UjHAg3v/OAK+B7GDg7KDVJBiEMF2J8AoE+ mcl1YSgv13z/kYpjM52qweXb8sZHfMRLx9/wAu22aUy6CyLgc3Syj1SwJc7LPaSIAWhz iIBA== X-Gm-Message-State: APjAAAXokRZ2ajlugIPNEIWOlGjCI2JU4LZhslqpw/oQtI1mt+h8oBMP IJmiuVmMxxfrjY0LWFljdcDLWhaoVdXflg== X-Google-Smtp-Source: APXvYqys+ZsinGt5jwWvhM4Un5u/UpW84c3TXbqQO06rd4XRaFH/VTiT8ZOp5qDpMcrz3e5UnEFoUg== X-Received: by 2002:a7b:cbc6:: with SMTP id n6mr25984213wmi.14.1563202265791; Mon, 15 Jul 2019 07:51:05 -0700 (PDT) Received: from localhost.localdomain ([193.23.33.53]) by smtp.gmail.com with ESMTPSA id z6sm13466262wrw.2.2019.07.15.07.51.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 Jul 2019 07:51:05 -0700 (PDT) From: Mete Polat To: patchwork@lists.ozlabs.org Subject: [PATCH 2/3] Update management documentation Date: Mon, 15 Jul 2019 16:50:29 +0200 Message-Id: <20190715145030.7877-2-metepolat2000@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190715145030.7877-1-metepolat2000@gmail.com> References: <20190715145030.7877-1-metepolat2000@gmail.com> MIME-Version: 1.0 X-BeenThere: patchwork@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Patchwork development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ralf.ramsauer@oth-regensburg.de, wolfgang.mauerer@oth-regensburg.de Errors-To: patchwork-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Patchwork" Signed-off-by: Mete Polat --- docs/deployment/management.rst | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/deployment/management.rst b/docs/deployment/management.rst index c50b7b6..70e926c 100644 --- a/docs/deployment/management.rst +++ b/docs/deployment/management.rst @@ -133,3 +133,31 @@ patches for these new tags. .. option:: patch_id a patch ID number. If not supplied, all patches will be updated. + +exportproject +~~~~~~~~~~~~~ + +.. program:: manage.py exportproject + +Export patchwork projects as mbox files and optionally compress the result. + +.. code-block:: shell + + ./manage.py exportproject [-c | --compress] [-l | --level] [...] + +This is mostly useful for importing the patch dataset of a Patchwork project +into other programs. + +.. option:: -c, --compress + + Bundle given projects into a gzip compressed tar archive. If --level is 0, + bundle the given projects into a tar archive without compression. + +.. option:: -l, --level + + compression level. A value between 0 and 9 (default). 0 is no compression. + Ignored if --compression is not set. + +.. option:: project_link + + a project linkname. If not supplied, all projects will be exported. From patchwork Mon Jul 15 14:50:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mete Polat X-Patchwork-Id: 1132068 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45nRMq2HttzB3xy for ; Tue, 16 Jul 2019 00:52:39 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bHfeBAb+"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 45nRMp2NX6zDqW3 for ; Tue, 16 Jul 2019 00:52:38 +1000 (AEST) X-Original-To: patchwork@lists.ozlabs.org Delivered-To: patchwork@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gmail.com (client-ip=2a00:1450:4864:20::441; helo=mail-wr1-x441.google.com; envelope-from=metepolat2000@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bHfeBAb+"; dkim-atps=neutral Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 45nRL81CcVzDqTg for ; Tue, 16 Jul 2019 00:51:11 +1000 (AEST) Received: by mail-wr1-x441.google.com with SMTP id 31so17470498wrm.1 for ; Mon, 15 Jul 2019 07:51:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ehs0ndd2tW6k40h381OxppTAcJ/BmMGuT8KsgBwAFjY=; b=bHfeBAb+BLVm5qh8s1ArmbBQ7RKezVDG5sq9nVnZoEnsnscg7WhlBVGsTjlMs50tQj fapJMjluKwBRsTSBFRtNW9XHMqNZuXm5CJs5TXAqfMGOo5YghNt8uAVxr957tA36oi1T glDht+Fafn9zUPdDlTJOFLejmwEIb4+r/gE8jeWf8QMaSnYVjjPyFJqS1ZeBAumjBf1i WZY65BOv2z+3UQDa6l5IYeAwW7S/Tjm0vXI39X85RX5GO6D6xitdrmgwxlA4Nh5+wm6s +iK/N8QOSNsQF8yrgMLXN3maKWDCCVkmj/ZaqrgTr7btuhy5c+3sk7kPpAptL7bOCgJ1 UcKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ehs0ndd2tW6k40h381OxppTAcJ/BmMGuT8KsgBwAFjY=; b=OIFojSmun1F0w3n6y54gTWZhVh5STDkQRuoTchQ6MF7CWnUFkp54fLqZQfQtYwrlW+ hvQbVX/O3xicVyd0pT70y3of9J+yecGxnM6WYy54J6h8YZOimuP4mDBnt+T2+ua6gsuZ XIn/8a/mN7ARW6vW4FA83pD9l7VT/SC5Ch0dax66FqNuN3j8C2Kpxx3vIlIMS7xXWbTs 1K5BhSCbm4FGxPbiA6gexaMUe4iYvfvso+6ZkmO50+ooiF5nGvaZ/c3XS1iGoN3oiZkU X00GdNT5FzxsoFZQU+ESt8y3cs9Akrs6X8Df6u0DN5OVjZ64/WIg4ra0PAXoKmX0iUOV HXTw== X-Gm-Message-State: APjAAAWGJ44BJ5LnxiTMU0Rm5kaVw6fRlcVmZy9wgroguaSF9hdsBQdo wwQqHhRKrEVZFpVt87XFcaMfxC5d33GW7Q== X-Google-Smtp-Source: APXvYqweXTspOA8Xx2/jvfCA3drmPCLYox4BpGXLZcdkDUnyJCgcatoEs9rf8uv6ORU4gO1YhE2lGQ== X-Received: by 2002:adf:e28a:: with SMTP id v10mr30309639wri.178.1563202266717; Mon, 15 Jul 2019 07:51:06 -0700 (PDT) Received: from localhost.localdomain ([193.23.33.53]) by smtp.gmail.com with ESMTPSA id z6sm13466262wrw.2.2019.07.15.07.51.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 Jul 2019 07:51:06 -0700 (PDT) From: Mete Polat To: patchwork@lists.ozlabs.org Subject: [PATCH 3/3] Add exportproject cmd release notes Date: Mon, 15 Jul 2019 16:50:30 +0200 Message-Id: <20190715145030.7877-3-metepolat2000@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190715145030.7877-1-metepolat2000@gmail.com> References: <20190715145030.7877-1-metepolat2000@gmail.com> MIME-Version: 1.0 X-BeenThere: patchwork@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Patchwork development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ralf.ramsauer@oth-regensburg.de, wolfgang.mauerer@oth-regensburg.de Errors-To: patchwork-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Patchwork" Signed-off-by: Mete Polat --- .../notes/mbox-export-project-cmd-090cb74c68608aa8.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 releasenotes/notes/mbox-export-project-cmd-090cb74c68608aa8.yaml diff --git a/releasenotes/notes/mbox-export-project-cmd-090cb74c68608aa8.yaml b/releasenotes/notes/mbox-export-project-cmd-090cb74c68608aa8.yaml new file mode 100644 index 0000000..3f3bfa2 --- /dev/null +++ b/releasenotes/notes/mbox-export-project-cmd-090cb74c68608aa8.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Exporting patchwork projects as mbox files and optionally compressing them + is now possible with the ``./manage exportproject`` management command.