diff options
Diffstat (limited to 'synapse/util/versionstring.py')
-rw-r--r-- | synapse/util/versionstring.py | 82 |
1 files changed, 57 insertions, 25 deletions
diff --git a/synapse/util/versionstring.py b/synapse/util/versionstring.py index c144ff62c1..899ee0adc8 100644 --- a/synapse/util/versionstring.py +++ b/synapse/util/versionstring.py @@ -1,5 +1,4 @@ # 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. @@ -30,11 +29,10 @@ def get_version_string(module: ModuleType) -> str: If called on a module not in a git checkout will return `__version__`. Args: - module: The module to check the version of. Must declare a __version__ - attribute. + module (module) Returns: - The module version (as a string). + str """ cached_version = version_cache.get(module) @@ -46,37 +44,71 @@ 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: - result = ( - subprocess.check_output( - ["git", *params], stderr=subprocess.DEVNULL, cwd=cwd - ) - .strip() - .decode("ascii") + try: + git_branch = ( + subprocess.check_output( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], stderr=null, cwd=cwd ) - return prefix + result - except (subprocess.CalledProcessError, FileNotFoundError): - return "" - - 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") + .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) + ) - 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 "" + 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 = f"{version_string} ({git_version})" + 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, + ) except Exception as e: logger.info("Failed to check for git repository: %s", e) |