MT#56231 gerrit: cleanup tool

* add dry-run option

checks gerrit review status and if merged, will trigger removal
of PPA if necessary

NOTE: this will not trigger removal of projects from PPA, just
removal of full PPA if no reviews are left

Change-Id: Iddebc80a92615d99ff8cd2f643ea49b5bfc106d6
master
Victor Seva 2 years ago
parent 44e869875d
commit 3d8ea950b6

@ -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

@ -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)

@ -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)

Loading…
Cancel
Save