0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-24 00:17:37 +01:00
mongodb/buildscripts/utils.py
Juan Gu 855dfadef0 SERVER-94077 Use isort in Ruff configs (#27865)
GitOrigin-RevId: e793d662774ccd3ab6c3f356c2287cf1f7ff9805
2024-10-10 19:33:49 +00:00

109 lines
3.1 KiB
Python

"""Various utilities that are handy."""
import codecs
import os
import os.path
import re
import subprocess
import sys
def get_git_branch():
"""Return the git branch version."""
if not os.path.exists(".git") or not os.path.isdir(".git"):
return None
version = open(".git/HEAD", "r").read().strip()
if not version.startswith("ref: "):
return version
version = version.split("/")
version = version[len(version) - 1]
return version
def get_git_branch_string(prefix="", postfix=""):
"""Return the git branch name."""
tt = re.compile(r"[/\\]").split(os.getcwd())
if len(tt) > 2 and tt[len(tt) - 1] == "mongo":
par = tt[len(tt) - 2]
mt = re.compile(r".*_([vV]\d+\.\d+)$").match(par)
if mt is not None:
return prefix + mt.group(1).lower() + postfix
if par.find("Nightly") > 0:
return ""
branch = get_git_branch()
if branch is None or branch == "master":
return ""
return prefix + branch + postfix
def get_git_version():
"""Return the git version."""
if not os.path.exists(".git") or not os.path.isdir(".git"):
return "nogitversion"
version = open(".git/HEAD", "r").read().strip()
if not version.startswith("ref: "):
return version
version = version[5:]
git_ver = ".git/" + version
if not os.path.exists(git_ver):
return version
return open(git_ver, "r").read().strip()
def get_git_describe():
"""Return 'git describe --abbrev=7'."""
with open(os.devnull, "r+") as devnull:
proc = subprocess.Popen(
"git describe --abbrev=7",
stdout=subprocess.PIPE,
stderr=devnull,
stdin=devnull,
shell=True,
)
return proc.communicate()[0].strip().decode("utf-8")
def execsys(args):
"""Execute a subprocess of 'args'."""
if isinstance(args, str):
rc = re.compile(r"\s+")
args = rc.split(args)
proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
res = proc.communicate()
return res
def which(executable):
"""Return full path of 'executable'."""
if sys.platform == "win32":
paths = os.environ.get("Path", "").split(";")
else:
paths = os.environ.get("PATH", "").split(":")
for path in paths:
path = os.path.expandvars(path)
path = os.path.expanduser(path)
path = os.path.abspath(path)
executable_path = os.path.join(path, executable)
if os.path.exists(executable_path):
return executable_path
return executable
def replace_with_repr(unicode_error):
"""Codec error handler replacement."""
# Unicode is a pain, some strings cannot be unicode()'d
# but we want to just preserve the bytes in a human-readable
# fashion. This codec error handler will substitute the
# repr() of the offending bytes into the decoded string
# at the position they occurred
offender = unicode_error.object[unicode_error.start : unicode_error.end]
return (str(repr(offender).strip("'").strip('"')), unicode_error.end)
codecs.register_error("repr", replace_with_repr)