mirror of
https://github.com/odoo/runbot.git
synced 2025-03-15 23:45:44 +07:00

The weekly maintenance would not prune refs. This is not an issue on odoo/odoo because development branches are in a separate repository, thus never fetched (we push to them but only using local commits and remote refs). However on repos like odoo/documentation the reference and development branches are collocated, the lack of pruning thus keeps every development branch alive locally, even years after the branch has been deleted in the repository. By pruning remote-tracking refs before GC-ing, we should have cleaner local clones, and better packing.
45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
import logging
|
|
import subprocess
|
|
|
|
from odoo import models
|
|
from ...git import get_local
|
|
|
|
|
|
_gc = logging.getLogger(__name__)
|
|
class GC(models.TransientModel):
|
|
_name = 'runbot_merge.maintenance'
|
|
_description = "Weekly maintenance of... cache repos?"
|
|
|
|
def _run(self):
|
|
# lock out crons which use the local repo cache to avoid concurrency
|
|
# issues while we're GC-ing it
|
|
Stagings = self.env['runbot_merge.stagings']
|
|
crons = self.env.ref('runbot_merge.staging_cron', Stagings) | self.env.ref('forwardport.port_forward', Stagings)
|
|
if crons:
|
|
self.env.cr.execute("""
|
|
SELECT 1 FROM ir_cron
|
|
WHERE id = any(%s)
|
|
FOR UPDATE
|
|
""", [crons.ids])
|
|
|
|
# run on all repos with a forwardport target (~ forwardport enabled)
|
|
for repo in self.env['runbot_merge.repository'].search([]):
|
|
repo_git = get_local(repo, clone=False)
|
|
if not repo_git:
|
|
continue
|
|
|
|
_gc.info('Running maintenance on %s', repo.name)
|
|
r = repo_git\
|
|
.stdout(True)\
|
|
.with_config(stderr=subprocess.STDOUT, text=True, check=False)\
|
|
.remote('prune', 'origin')
|
|
if r.returncode:
|
|
_gc.warning("Prune failure (status=%d):\n%s", r.returncode, r.stdout)
|
|
|
|
r = repo_git\
|
|
.stdout(True)\
|
|
.with_config(stderr=subprocess.STDOUT, text=True, check=False)\
|
|
.gc('--prune=now', aggressive=True)
|
|
if r.returncode:
|
|
_gc.warning("GC failure (status=%d):\n%s", r.returncode, r.stdout)
|