Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Clean-up get_version_string #11468

Merged
merged 7 commits into from
Dec 1, 2021
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/11468.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Refactor `get_version_string` to fix-up types and duplicated code.
93 changes: 30 additions & 63 deletions synapse/util/versionstring.py
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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)
Expand All @@ -44,71 +46,36 @@ 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__))
with open(os.devnull, "w") as null:
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=null, cwd=cwd)
clokep marked this conversation as resolved.
Show resolved Hide resolved
.strip()
.decode("ascii")
)
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")

try:
git_branch = (
subprocess.check_output(
["git", "rev-parse", "--abbrev-ref", "HEAD"], stderr=null, cwd=cwd
)
.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
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
)
.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)

Expand Down