Spaces:
Sleeping
Sleeping
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='INFO', logger_name=LOGGER_NAME, logfile=None): | |
"""Do basic logger configuration and set our main logger""" | |
logging.getLogger().setLevel(loglevel) | |
# Set as environment variable so other processes can retrieve it | |
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): | |
# Remove old handler, don't want to double-handle | |
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 | |