bot/code_coverage_bot/hgmo.py (74 lines of code) (raw):
# -*- coding: utf-8 -*-
import os
import signal
import subprocess
import requests
import structlog
logger = structlog.get_logger(__name__)
class HGMO(object):
PID_FILE = "hgmo.pid"
SERVER_ADDRESS = "http://localhost:8000"
def __init__(self, repo_dir=None, server_address=None):
assert (repo_dir is not None) ^ (server_address is not None)
if server_address is not None:
self.server_address = server_address
else:
self.server_address = HGMO.SERVER_ADDRESS
self.repo_dir = repo_dir
logger.info(
"Configured HGMO server", address=self.server_address, dir=self.repo_dir
)
self.pid_file = os.path.join(os.getcwd(), HGMO.PID_FILE)
def __get_pid(self):
with open(self.pid_file, "r") as In:
pid = In.read()
return int(pid)
def __enter__(self):
if self.repo_dir is None:
return self
proc = subprocess.Popen(
["hg", "serve", "--hgmo", "--daemon", "--pid-file", self.pid_file],
cwd=self.repo_dir,
stderr=subprocess.STDOUT,
)
proc.wait()
logger.info("hgmo is running", pid=self.__get_pid())
return self
def __exit__(self, type, value, traceback):
if self.repo_dir is None:
return
pid = self.__get_pid()
os.killpg(os.getpgid(pid), signal.SIGTERM)
os.remove(self.pid_file)
logger.info("hgmo has been killed")
def get_pushes(
self, startID=None, startDate=None, changeset=None, full=True, tipsonly=False
):
assert startID is not None or startDate is not None or changeset is not None
params = {"version": 2}
if full:
params["full"] = 1
if tipsonly:
params["tipsonly"] = 1
if startID is not None:
params["startID"] = startID
if startDate is not None:
params["startdate"] = startDate
if changeset is not None:
params["changeset"] = changeset
r = requests.get(
"{}/json-pushes".format(self.server_address),
params=params,
headers={"User-Agent": "code-coverage-bot"},
)
r.raise_for_status()
return r.json()
def get_automation_relevance_changesets(self, changeset):
r = requests.get(
"{}/json-automationrelevance/{}".format(
self.server_address,
changeset,
),
headers={"User-Agent": "code-coverage-bot"},
)
r.raise_for_status()
return r.json()["changesets"]