Clean-up get_version_string (#11468)
parent
153194c771
commit
7b62791e00
|
@ -0,0 +1 @@
|
|||
Refactor `get_version_string` to fix-up types and duplicated code.
|
|
@ -1,4 +1,5 @@
|
|||
# Copyright 2016 OpenMarket Ltd
|
||||
# Copyright 2021 The Matrix.org Foundation C.I.C.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
|
@ -29,10 +30,11 @@ def get_version_string(module: ModuleType) -> str:
|
|||
If called on a module not in a git checkout will return `__version__`.
|
||||
|
||||
Args:
|
||||
module (module)
|
||||
module: The module to check the version of. Must declare a __version__
|
||||
attribute.
|
||||
|
||||
Returns:
|
||||
str
|
||||
The module version (as a string).
|
||||
"""
|
||||
|
||||
cached_version = version_cache.get(module)
|
||||
|
@ -44,71 +46,37 @@ def get_version_string(module: ModuleType) -> str:
|
|||
version_string = module.__version__ # type: ignore[attr-defined]
|
||||
|
||||
try:
|
||||
null = open(os.devnull, "w")
|
||||
cwd = os.path.dirname(os.path.abspath(module.__file__))
|
||||
|
||||
def _run_git_command(prefix: str, *params: str) -> str:
|
||||
try:
|
||||
git_branch = (
|
||||
result = (
|
||||
subprocess.check_output(
|
||||
["git", "rev-parse", "--abbrev-ref", "HEAD"], stderr=null, cwd=cwd
|
||||
["git", *params], stderr=subprocess.DEVNULL, cwd=cwd
|
||||
)
|
||||
.strip()
|
||||
.decode("ascii")
|
||||
)
|
||||
git_branch = "b=" + git_branch
|
||||
return prefix + result
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
# FileNotFoundError can arise when git is not installed
|
||||
git_branch = ""
|
||||
return ""
|
||||
|
||||
try:
|
||||
git_tag = (
|
||||
subprocess.check_output(
|
||||
["git", "describe", "--exact-match"], stderr=null, cwd=cwd
|
||||
)
|
||||
.strip()
|
||||
.decode("ascii")
|
||||
)
|
||||
git_tag = "t=" + git_tag
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
git_tag = ""
|
||||
git_branch = _run_git_command("b=", "rev-parse", "--abbrev-ref", "HEAD")
|
||||
git_tag = _run_git_command("t=", "describe", "--exact-match")
|
||||
git_commit = _run_git_command("", "rev-parse", "--short", "HEAD")
|
||||
|
||||
try:
|
||||
git_commit = (
|
||||
subprocess.check_output(
|
||||
["git", "rev-parse", "--short", "HEAD"], stderr=null, cwd=cwd
|
||||
)
|
||||
.strip()
|
||||
.decode("ascii")
|
||||
)
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
git_commit = ""
|
||||
|
||||
try:
|
||||
dirty_string = "-this_is_a_dirty_checkout"
|
||||
is_dirty = (
|
||||
subprocess.check_output(
|
||||
["git", "describe", "--dirty=" + dirty_string], stderr=null, cwd=cwd
|
||||
is_dirty = _run_git_command("", "describe", "--dirty=" + dirty_string).endswith(
|
||||
dirty_string
|
||||
)
|
||||
.strip()
|
||||
.decode("ascii")
|
||||
.endswith(dirty_string)
|
||||
)
|
||||
|
||||
git_dirty = "dirty" if is_dirty else ""
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
git_dirty = ""
|
||||
|
||||
if git_branch or git_tag or git_commit or git_dirty:
|
||||
git_version = ",".join(
|
||||
s for s in (git_branch, git_tag, git_commit, git_dirty) if s
|
||||
)
|
||||
|
||||
version_string = "%s (%s)" % (
|
||||
# If the __version__ attribute doesn't exist, we'll have failed
|
||||
# loudly above.
|
||||
module.__version__, # type: ignore[attr-defined]
|
||||
git_version,
|
||||
)
|
||||
version_string = f"{version_string} ({git_version})"
|
||||
except Exception as e:
|
||||
logger.info("Failed to check for git repository: %s", e)
|
||||
|
||||
|
|
Loading…
Reference in New Issue