backend/code_coverage_backend/hgmo.py (47 lines of code) (raw):

# -*- coding: utf-8 -*- # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. from typing import Dict from typing import Tuple import requests import structlog logger = structlog.get_logger(__name__) __hgmo: Dict[str, Tuple[int, float]] = {} HGMO_REVISION_URL = ( "https://hg.mozilla.org/{repository}/json-automationrelevance/{revision}" ) HGMO_PUSHES_URL = "https://hg.mozilla.org/{repository}/json-pushes" def hgmo_revision_details(repository, changeset): """ HGMO helper to retrieve details for a changeset """ # Check cache first key = (repository, changeset) if key in __hgmo: return __hgmo[key] url = HGMO_REVISION_URL.format(repository=repository, revision=changeset) resp = requests.get(url, headers={"User-Agent": "code-coverage-backend"}) resp.raise_for_status() assert "changesets" in resp.json(), "Missing changesets" data = resp.json()["changesets"][-1] assert "pushid" in data, "Missing pushid" out = data["pushid"], data["date"][0] # Store in cache __hgmo[key] = out return out def hgmo_pushes(repository, min_push_id, nb_pages, chunk_size=8): """ HGMO helper to list all pushes in a limited number of pages """ params = {"version": 2} if min_push_id is not None: assert isinstance(min_push_id, int) params["startID"] = min_push_id params["endID"] = min_push_id + chunk_size for page in range(nb_pages): r = requests.get( HGMO_PUSHES_URL.format(repository=repository), params=params, headers={"User-Agent": "code-coverage-backend"}, ) data = r.json() # Sort pushes to go from oldest to newest pushes = sorted( [(int(push_id), push) for push_id, push in data["pushes"].items()], key=lambda p: p[0], ) if not pushes: return for push in pushes: yield push newest = pushes[-1][0] params["startID"] = newest params["endID"] = newest + chunk_size