diff --git a/synapse/util/versionstring.py b/synapse/util/versionstring.py
index 899ee0adc8..c144ff62c1 100644
--- a/synapse/util/versionstring.py
+++ b/synapse/util/versionstring.py
@@ -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__))
- try:
- git_branch = (
- subprocess.check_output(
- ["git", "rev-parse", "--abbrev-ref", "HEAD"], stderr=null, cwd=cwd
+ def _run_git_command(prefix: str, *params: str) -> str:
+ try:
+ result = (
+ subprocess.check_output(
+ ["git", *params], stderr=subprocess.DEVNULL, cwd=cwd
+ )
+ .strip()
+ .decode("ascii")
)
- .strip()
- .decode("ascii")
- )
- git_branch = "b=" + git_branch
- except (subprocess.CalledProcessError, FileNotFoundError):
- # FileNotFoundError can arise when git is not installed
- git_branch = ""
-
- 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 = ""
-
- 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
- )
- .strip()
- .decode("ascii")
- .endswith(dirty_string)
- )
+ return prefix + result
+ except (subprocess.CalledProcessError, FileNotFoundError):
+ return ""
- git_dirty = "dirty" if is_dirty else ""
- except (subprocess.CalledProcessError, FileNotFoundError):
- git_dirty = ""
+ 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")
+
+ dirty_string = "-this_is_a_dirty_checkout"
+ is_dirty = _run_git_command("", "describe", "--dirty=" + dirty_string).endswith(
+ dirty_string
+ )
+ git_dirty = "dirty" if is_dirty else ""
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)
|