diff --git a/gerrit/fixtures/test_gerrit_commands.yaml b/gerrit/fixtures/test_gerrit_commands.yaml index 755ba5b..11ae968 100644 --- a/gerrit/fixtures/test_gerrit_commands.yaml +++ b/gerrit/fixtures/test_gerrit_commands.yaml @@ -4,14 +4,14 @@ created: '2023-03-03 08:46:17' gerrit_change: '67631' modified: '2023-03-03 09:09:25' - param_ppa: gerrit_alessio_56718_bis_10_5_1, + param_ppa: gerrit_alessio_56718_bis_10_5_1 projectname: templates - model: repoapi.gerritrepoinfo pk: 47877 fields: created: '1977-01-01 00:00:00' gerrit_change: '67510' - modified: '2023-03-02 16:24:25' + modified: '2022-03-02 16:24:25' param_ppa: gerrit_alessio_56718_bis_11_1 projectname: sems-pbx - model: repoapi.gerritrepoinfo @@ -19,6 +19,6 @@ fields: created: '1977-01-01 00:00:00' gerrit_change: '13200' - modified: '2023-03-02 07:57:21' + modified: '2022-03-02 07:57:21' param_ppa: gerrit_pu_collectd-abolition projectname: unknown diff --git a/gerrit/management/commands/gerrit.py b/gerrit/management/commands/gerrit.py index 32b5e06..7fba949 100644 --- a/gerrit/management/commands/gerrit.py +++ b/gerrit/management/commands/gerrit.py @@ -13,7 +13,10 @@ # You should have received a copy of the GNU General Public License along # with this program. If not, see <http://www.gnu.org/licenses/>. from datetime import date +from datetime import datetime +from datetime import timedelta +from django.conf import settings from django.core.management.base import BaseCommand from requests.exceptions import HTTPError @@ -26,7 +29,20 @@ class Command(BaseCommand): help = "gerrit actions" def add_arguments(self, parser): - parser.add_argument("action", choices=["refresh"]) + parser.add_argument("action", choices=["refresh", "cleanup"]) + parser.add_argument("--dry-run", type=bool, default=False) + parser.add_argument( + "--weeks", + type=int, + default=6, + help="filter reviews older than this value in weeks", + ) + parser.add_argument( + "--today", + type=date.fromisoformat, + default=datetime.today(), + help="set today value in isoformat 'YYYY-MM-DD'", + ) def refresh(self, *args, **options): qs = GerritRepoInfo.objects.filter(created__date=date(1977, 1, 1)) @@ -37,11 +53,38 @@ class Command(BaseCommand): gri.modified = get_datetime(info["updated"]) # don't update modified field on save gri.update_modified = False - gri.save() + if options["dry_run"]: + self.stdout.write( + f"{gri} would be changed to " + f" created:{gri.created}" + f" modified:{gri.modified}" + ) + else: + gri.save() except HTTPError: self.stderr.write(f"{gri} not found, remove it from db") gri.delete() + def cleanup(self, *args, **options): + max_date = options["today"] - timedelta(weeks=options["weeks"]) + self.stderr.write(f"max_date:{max_date}") + if settings.DEBUG: + self.stderr.write("debug ON") + manager = GerritRepoInfo.objects + qs = manager.filter(modified__lt=max_date) + for gri in qs.iterator(): + info = get_change_info(gri.gerrit_change) + if info["status"] == "MERGED": + if options["dry_run"]: + self.stdout.write( + f"{gri} merged, remove from db, [dry-run]" + ) + else: + self.stdout.write(f"{gri} merged, remove from db") + manager.review_removed( + gri.param_ppa, gri.gerrit_change, gri.projectname + ) + def handle(self, *args, **options): action = getattr(self, options["action"]) action(*args, **options) diff --git a/gerrit/test_commands.py b/gerrit/test_commands.py index 3db88f6..45a196b 100644 --- a/gerrit/test_commands.py +++ b/gerrit/test_commands.py @@ -14,6 +14,7 @@ # with this program. If not, see <http://www.gnu.org/licenses/>. import datetime import json +from unittest.mock import call from unittest.mock import patch from django.core.management import call_command @@ -66,3 +67,22 @@ class refreshTest(TestCase): qs_filter = qs.filter(modified__time=datetime.time(9, 9, 25)) self.assertEqual(qs_filter.count(), 3) + + @patch("repoapi.models.gri.jenkins_remove_ppa") + @patch("gerrit.management.commands.gerrit.get_change_info") + def test_cleanup(self, gci, jrp): + value["status"] = "MERGED" + gci.return_value = value + qs = GerritRepoInfo.objects + self.assertEqual(qs.count(), 3) + call_command( + "gerrit", + "cleanup", + "--today=2023-03-03", + ) + calls = [ + call("gerrit_pu_collectd-abolition"), + call("gerrit_alessio_56718_bis_11_1"), + ] + self.assertListEqual(jrp.mock_calls, calls) + self.assertEqual(qs.count(), 1)