about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/networking/browsers/microsoft-edge/update.py
blob: f32b669f0360d8f8ad588b21f766d261822f5c93 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3Packages.packaging python3Packages.debian

import base64
import textwrap
from urllib import request

from collections import OrderedDict
from debian.deb822 import Packages
from debian.debian_support import Version
from os.path import abspath, dirname

PIN_PATH = dirname(abspath(__file__)) + '/default.nix'

def packages():
    packages_url = 'https://packages.microsoft.com/repos/edge/dists/stable/main/binary-amd64/Packages'
    handle = request.urlopen(packages_url)
    return handle


def latest_packages(packages: bytes):
    latest_packages: OrderedDict[str, Packages] = {}
    for package in Packages.iter_paragraphs(packages, use_apt_pkg=False):
        name: str = package['Package']
        if not name.startswith('microsoft-edge-'):
            continue
        channel = name.replace('microsoft-edge-', '')
        if channel not in latest_packages:
            latest_packages[channel] = package
        else:
            old_package = latest_packages[channel]
            if old_package.get_version() < package.get_version():  # type: ignore
                latest_packages[channel] = package
    return latest_packages


def nix_expressions(latest: dict[str, Packages]):
    channel_strs: list[str] = []
    for channel, package in latest.items():
        print(f"Processing {channel} {package['Version']}")
        match = Version.re_valid_version.match(package['Version'])
        assert match is not None

        version = match.group('upstream_version')
        revision = match.group('debian_revision')
        sri = 'sha256-' + \
            base64.b64encode(bytes.fromhex(package['SHA256'])).decode('ascii')

        channel_str = textwrap.dedent(
            f'''\
            {channel} = import ./browser.nix {{
              channel = "{channel}";
              version = "{version}";
              revision = "{revision}";
              sha256 = "{sri}";
            }};'''
        )
        channel_strs.append(channel_str)
    return channel_strs


def write_expression():
    latest = latest_packages(packages())
    channel_strs = nix_expressions(latest)
    nix_expr = '{\n' + textwrap.indent('\n'.join(channel_strs), '  ') + '\n}\n'
    with open(PIN_PATH, 'w') as f:
        f.write(nix_expr)


write_expression()