|
|
|
@ -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) |
|
|
|
|
|
|
|
|
|