|
|
import logging |
|
|
import multiprocessing |
|
|
import os |
|
|
import subprocess |
|
|
|
|
|
|
|
|
LOGGER_NAME = "DiffDock" |
|
|
LOGLEVEL_KEY = "DIFFDOCK_LOGLEVEL" |
|
|
|
|
|
|
|
|
def _get_formatter(loglevel="INFO"): |
|
|
warn_fmt = "[%(asctime)s] %(levelname)s -%(message)s" |
|
|
debug_fmt = "[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s - %(message)s" |
|
|
fmt = debug_fmt if loglevel.upper() in {"DEBUG", "INFO"} else warn_fmt |
|
|
return logging.Formatter( |
|
|
fmt=fmt, |
|
|
datefmt="%Y-%b-%d %H:%M:%S %Z", |
|
|
) |
|
|
|
|
|
|
|
|
def remove_all_handlers(logger): |
|
|
while logger.hasHandlers(): |
|
|
logger.removeHandler(logger.handlers[0]) |
|
|
|
|
|
|
|
|
def configure_logger(loglevel=None, logger_name=LOGGER_NAME, logfile=None): |
|
|
"""Do basic logger configuration and set our main logger""" |
|
|
|
|
|
|
|
|
if loglevel is None: |
|
|
loglevel = os.environ.get(LOGLEVEL_KEY, "WARNING") |
|
|
else: |
|
|
os.environ[LOGLEVEL_KEY] = loglevel |
|
|
|
|
|
logger = logging.getLogger(logger_name) |
|
|
logger.setLevel(loglevel) |
|
|
remove_all_handlers(logger) |
|
|
logger.propagate = False |
|
|
|
|
|
formatter = _get_formatter(loglevel) |
|
|
def _prep_handler(handler): |
|
|
for ex_handler in logger.handlers: |
|
|
if type(ex_handler) == type(handler): |
|
|
|
|
|
logger.removeHandler(ex_handler) |
|
|
handler.setLevel(loglevel) |
|
|
handler.setFormatter(formatter) |
|
|
logger.addHandler(handler) |
|
|
|
|
|
sh = logging.StreamHandler() |
|
|
_prep_handler(sh) |
|
|
|
|
|
if logfile is not None: |
|
|
fh = logging.FileHandler(logfile, mode="a") |
|
|
_prep_handler(fh) |
|
|
|
|
|
|
|
|
def get_logger(base_name=LOGGER_NAME): |
|
|
""" |
|
|
Return a logger. |
|
|
Use a different logger in each subprocess, though they should all have the same log level. |
|
|
""" |
|
|
pid = os.getpid() |
|
|
logger_name = f"{base_name}-process-{pid}" |
|
|
logger = logging.getLogger(logger_name) |
|
|
if not logger.hasHandlers(): |
|
|
configure_logger(logger_name=logger_name) |
|
|
return logger |
|
|
|
|
|
|
|
|
def get_git_revision_hash() -> str: |
|
|
""" |
|
|
Get the full git revision of the latest HEAD. |
|
|
Note: This only works if run from git directory. |
|
|
""" |
|
|
return subprocess.check_output(["git", "rev-parse", "HEAD"]).decode("ascii").strip() |
|
|
|
|
|
|
|
|
def get_git_revision_short_hash() -> str: |
|
|
""" |
|
|
Get the short git revision of the latest HEAD. |
|
|
Note: This only works if run from git directory. |
|
|
Returns: |
|
|
|
|
|
""" |
|
|
return ( |
|
|
subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]) |
|
|
.decode("ascii") |
|
|
.strip() |
|
|
) |
|
|
|
|
|
|
|
|
def check_git_uncommitted() -> bool: |
|
|
changed_files = ( |
|
|
subprocess.check_output(["git", "status", "-suno"]).decode("ascii").strip() |
|
|
) |
|
|
lines = list(filter(lambda x: x, changed_files.split("\n"))) |
|
|
return len(lines) > 0 |
|
|
|
|
|
|