Skip to content

Commit cd4f5e3

Browse files
committed
devel: import bumpbuddy out of date information
1 parent 59229f2 commit cd4f5e3

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
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.models import FlagRequest
21+
22+
logger = logging.getLogger("command")
23+
logger.setLevel(logging.WARNING)
24+
25+
26+
class Command(BaseCommand):
27+
28+
def process_package(self, pkgdata):
29+
pkgbase = pkgdata['pkgbase']
30+
version = pkgdata['local_version']
31+
logger.debug("Import new out of date package '%s'", pkgbase)
32+
print(pkgdata)
33+
34+
# TODO: testing/staging packages, verify if should be flagged?
35+
packages = Package.objects.filter(pkgbase=pkgbase)
36+
flagged_packages = list(packages)
37+
38+
if len(flagged_packages) == 0:
39+
logger.warning("no matching packages found for pkgbase='%s', pkgver='%s'", pkgbase, version)
40+
return
41+
42+
43+
pkg = packages[0]
44+
if pkg.flag_date is not None:
45+
logger.debug("package is already flagged pkgbase='%d'", pkgbase)
46+
return
47+
48+
versions = {(pkg.pkgver, pkg.pkgrel, pkg.epoch) for pkg in flagged_packages}
49+
if len(versions) == 1:
50+
version = versions.pop()
51+
else:
52+
version = ('', '', 0)
53+
current_time = now()
54+
55+
flag_request = FlagRequest(created=current_time,
56+
user_email="bumpbuddy@archlinux.org",
57+
message=f"New version {pkgdata['upstream_version']} is available",
58+
ip_address="0.0.0.0",
59+
pkgbase=pkg.pkgbase,
60+
repo=pkg.repo,
61+
pkgver=version[0],
62+
pkgrel=version[1],
63+
epoch=version[2],
64+
num_packages=len(packages))
65+
66+
return flag_request
67+
68+
def handle(self, *args, **options):
69+
v = int(options.get('verbosity', 0))
70+
if v == 0:
71+
logger.level = logging.ERROR
72+
elif v == 1:
73+
logger.level = logging.INFO
74+
elif v >= 2:
75+
logger.level = logging.DEBUG
76+
77+
url = getattr(settings, "BUMPBUDDY_URL", None)
78+
headers = {}
79+
last_modified = cache.get('bumpbuddy:last-modified')
80+
if last_modified:
81+
logger.debug('Setting If-Modified-Since header')
82+
headers = {'If-Modified-Since': last_modified}
83+
84+
req = requests.get(url, headers)
85+
if req.status_code == 304:
86+
logger.debug('The rebuilderd data has not been updated since we last checked it')
87+
return
88+
89+
if req.status_code != 200:
90+
logger.error("Issues retrieving bumpbuddy data: '%s'", req.status_code)
91+
return
92+
93+
last_modified = req.headers.get('last-modified')
94+
if last_modified:
95+
cache.set('bumpbuddy:last-modified', last_modified, 3600) # cache one hour
96+
97+
flagged_packages = []
98+
for pkgdata in req.json().values():
99+
if not pkgdata['out_of_date']:
100+
continue
101+
102+
package = self.process_package(pkgdata)
103+
if package is not None:
104+
flagged_packages.append(package)
105+
106+
# if flagged_packages:
107+
# FlagRequest.objects.bulk_create(flagged_packages)
108+
109+
# 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)