Skip to content

Commit 10577b6

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

File tree

2 files changed

+132
-0
lines changed

2 files changed

+132
-0
lines changed
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+
28+
alpm = AlpmAPI()
29+
30+
class Command(BaseCommand):
31+
32+
def process_package(self, pkgdata):
33+
pkgbase = pkgdata['pkgbase']
34+
version = pkgdata['local_version']
35+
upstream_version = pkgdata['upstream_version']
36+
logger.debug("Import new out of date package '%s'", pkgbase)
37+
38+
packages = Package.objects.filter(pkgbase=pkgbase)
39+
found_packages = list(packages)
40+
41+
if len(found_packages) == 0:
42+
logger.error("no matching packages found for pkgbase='%s'", pkgbase)
43+
return
44+
45+
# already flagged
46+
not_flagged_packages = [pkg for pkg in found_packages if pkg.flag_date is None]
47+
if len(not_flagged_packages) == 0:
48+
return
49+
50+
ood_packages = [pkg for pkg in not_flagged_packages if alpm.vercmp(upstream_version, pkg.pkgver) > 0]
51+
if len(ood_packages) == 0:
52+
logger.debug("package is not out of date for pkgbase='%s'", pkgbase)
53+
return
54+
55+
pkg = ood_packages[0]
56+
57+
# find a common version if there is one available to store
58+
versions = {(pkg.pkgver, pkg.pkgrel, pkg.epoch) for pkg in ood_packages}
59+
if len(versions) == 1:
60+
version = versions.pop()
61+
else:
62+
version = ('', '', 0)
63+
64+
current_time = now()
65+
# Compatibility for old json output without issue
66+
if 'issue' in pkgdata:
67+
issue_url = f"{settings.GITLAB_PACKAGES_REPO}/{pkgbase}/-/issues/{pkgdata['issue']}"
68+
message=f"New version {pkgdata['upstream_version']} is available: {issue_url}"
69+
else:
70+
message=f"New version {pkgdata['upstream_version']} is available."
71+
packages.update(flag_date=current_time)
72+
flag_request = FlagRequest(created=current_time,
73+
user_email="bumpbuddy@archlinux.org",
74+
message=message,
75+
ip_address="0.0.0.0",
76+
pkgbase=pkg.pkgbase,
77+
repo=pkg.repo,
78+
pkgver=version[0],
79+
pkgrel=version[1],
80+
epoch=version[2],
81+
num_packages=len(ood_packages))
82+
83+
return flag_request
84+
85+
def handle(self, *args, **options):
86+
v = int(options.get('verbosity', 0))
87+
if v == 0:
88+
logger.level = logging.ERROR
89+
elif v == 1:
90+
logger.level = logging.INFO
91+
elif v >= 2:
92+
logger.level = logging.DEBUG
93+
94+
url = getattr(settings, "BUMPBUDDY_URL", None)
95+
assert url is not None, "BUMPBUDDY_URL not configured"
96+
97+
headers = {}
98+
last_modified = cache.get('bumpbuddy:last-modified')
99+
if last_modified:
100+
logger.debug('Setting If-Modified-Since header')
101+
headers = {'If-Modified-Since': last_modified}
102+
103+
req = requests.get(url, headers)
104+
if req.status_code == 304:
105+
logger.debug('The rebuilderd data has not been updated since we last checked it')
106+
return
107+
108+
if req.status_code != 200:
109+
logger.error("Issues retrieving bumpbuddy data: '%s'", req.status_code)
110+
return
111+
112+
last_modified = req.headers.get('last-modified')
113+
if last_modified:
114+
cache.set('bumpbuddy:last-modified', last_modified, 3600) # cache one hour
115+
116+
flagged_packages = []
117+
for pkgdata in req.json().values():
118+
if not pkgdata['out_of_date']:
119+
continue
120+
121+
package = self.process_package(pkgdata)
122+
if package is not None:
123+
flagged_packages.append(package)
124+
125+
if flagged_packages:
126+
logger.info("Imported %d new out of date packages", len(flagged_packages))
127+
FlagRequest.objects.bulk_create(flagged_packages)
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)