Skip to content

Commit d060bd0

Browse files
committed
devel: import bumpbuddy out of date information
1 parent 5bee260 commit d060bd0

2 files changed

Lines changed: 132 additions & 0 deletions

File tree

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
#!/usr/bin/python
2+
3+
4+
"""
5+
read_bumpbuddy_status
6+
7+
Usage: ./manage.py read_bumpbuddy_status
8+
"""
9+
10+
11+
import logging
12+
13+
import requests
14+
from django.conf import settings
15+
from django.core.cache import cache
16+
from django.core.management.base import BaseCommand
17+
from django.utils.timezone import now
18+
19+
from main.models import Package
20+
from packages.alpm import AlpmAPI
21+
from packages.models import FlagRequest
22+
23+
logger = logging.getLogger("command")
24+
logger.setLevel(logging.WARNING)
25+
26+
27+
alpm = AlpmAPI()
28+
29+
30+
class Command(BaseCommand):
31+
def process_package(self, pkgdata):
32+
pkgbase = pkgdata['pkgbase']
33+
version = pkgdata['local_version']
34+
upstream_version = pkgdata['upstream_version']
35+
logger.debug("Import new out of date package '%s'", pkgbase)
36+
37+
packages = Package.objects.filter(pkgbase=pkgbase)
38+
found_packages = list(packages)
39+
40+
if len(found_packages) == 0:
41+
logger.error("no matching packages found for pkgbase='%s'", pkgbase)
42+
return
43+
44+
# already flagged
45+
not_flagged_packages = [pkg for pkg in found_packages if pkg.flag_date is None]
46+
if len(not_flagged_packages) == 0:
47+
return
48+
49+
ood_packages = [pkg for pkg in not_flagged_packages if alpm.vercmp(upstream_version, pkg.pkgver) > 0]
50+
if len(ood_packages) == 0:
51+
logger.debug("package is not out of date for pkgbase='%s'", pkgbase)
52+
return
53+
54+
pkg = ood_packages[0]
55+
56+
# find a common version if there is one available to store
57+
versions = {(pkg.pkgver, pkg.pkgrel, pkg.epoch) for pkg in ood_packages}
58+
if len(versions) == 1:
59+
version = versions.pop()
60+
else:
61+
version = ('', '', 0)
62+
63+
current_time = now()
64+
# Compatibility for old json output without issue
65+
if 'issue' in pkgdata:
66+
issue_url = f"{settings.GITLAB_PACKAGES_REPO}/{pkgbase}/-/issues/{pkgdata['issue']}"
67+
message = f"New version {pkgdata['upstream_version']} is available: {issue_url}"
68+
else:
69+
message = f"New version {pkgdata['upstream_version']} is available."
70+
packages.update(flag_date=current_time)
71+
flag_request = FlagRequest(created=current_time,
72+
user_email="bumpbuddy@archlinux.org",
73+
message=message,
74+
ip_address="0.0.0.0",
75+
pkgbase=pkg.pkgbase,
76+
repo=pkg.repo,
77+
pkgver=version[0],
78+
pkgrel=version[1],
79+
epoch=version[2],
80+
num_packages=len(ood_packages))
81+
82+
return flag_request
83+
84+
def handle(self, *args, **options):
85+
v = int(options.get('verbosity', 0))
86+
if v == 0:
87+
logger.level = logging.ERROR
88+
elif v == 1:
89+
logger.level = logging.INFO
90+
elif v >= 2:
91+
logger.level = logging.DEBUG
92+
93+
url = getattr(settings, "BUMPBUDDY_URL", None)
94+
assert url is not None, "BUMPBUDDY_URL not configured"
95+
96+
headers = {}
97+
last_modified = cache.get('bumpbuddy:last-modified')
98+
if last_modified:
99+
logger.debug('Setting If-Modified-Since header')
100+
headers = {'If-Modified-Since': last_modified}
101+
102+
req = requests.get(url, headers)
103+
if req.status_code == 304:
104+
logger.debug('The rebuilderd data has not been updated since we last checked it')
105+
return
106+
107+
if req.status_code != 200:
108+
logger.error("Issues retrieving bumpbuddy data: '%s'", req.status_code)
109+
return
110+
111+
last_modified = req.headers.get('last-modified')
112+
if last_modified:
113+
cache.set('bumpbuddy:last-modified', last_modified, 3600) # cache one hour
114+
115+
flagged_packages = []
116+
for pkgdata in req.json().values():
117+
if not pkgdata['out_of_date']:
118+
continue
119+
120+
package = self.process_package(pkgdata)
121+
if package is not None:
122+
flagged_packages.append(package)
123+
124+
if flagged_packages:
125+
logger.info("Imported %d new out of date packages", len(flagged_packages))
126+
FlagRequest.objects.bulk_create(flagged_packages)
127+
128+
129+
# vim: set ts=4 sw=4 et:

settings.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,9 @@
225225
# Rebuilderd API endpoint
226226
REBUILDERD_URL = 'https://reproducible.archlinux.org/api/v0/pkgs/list'
227227

228+
# Bumpbuddy json endpoint
229+
BUMPBUDDY_URL = "https://bumpbuddy.archlinux.org/data.json"
230+
228231
# Protected TIER0 Mirror
229232
TIER0_MIRROR_DOMAIN = 'repos.archlinux.org'
230233
# TIER0_MIRROR_SECRET = ''

0 commit comments

Comments
 (0)