Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
8a07c58
start using datetimes with fractional seconds with mysql
bpkroth May 28, 2025
d6fc9e2
adjust tests to also check for fractional time
bpkroth May 28, 2025
65e7f08
Revert "start using datetimes with fractional seconds with mysql"
bpkroth May 28, 2025
b7dad42
Reapply "start using datetimes with fractional seconds with mysql"
bpkroth May 28, 2025
4bf0c5f
apply black on alembic commit
bpkroth May 28, 2025
8088734
preparing to support testing multiple backend engines for schema changes
bpkroth May 28, 2025
a2c3256
refactoring storage tests to check other db engines
bpkroth May 28, 2025
5d3f0d3
change column lengths for mysql
bpkroth May 28, 2025
01b9df4
more refactor of storage tests
bpkroth May 28, 2025
d578176
preparing to support testing multiple backend engines for schema changes
bpkroth May 28, 2025
3b3bf6c
refactoring storage tests to check other db engines
bpkroth May 28, 2025
1c9633c
change column lengths for mysql
bpkroth May 28, 2025
f5b7bf3
fixups
bpkroth May 28, 2025
7fdf06d
fixup
bpkroth May 28, 2025
1bf3c30
fixup
bpkroth May 28, 2025
bd5862f
cleanup
bpkroth May 28, 2025
a5e9c05
Merge branch 'refactor/storage-tests' into feature/mysql-schema-chang…
bpkroth May 28, 2025
67f84ea
fixup
bpkroth May 28, 2025
41199fc
format
bpkroth May 28, 2025
ef33825
Merge branch 'refactor/storage-tests' into feature/mysql-schema-chang…
bpkroth May 28, 2025
ee4a900
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 28, 2025
82220ec
fixup
bpkroth May 28, 2025
aa2621b
fixup
bpkroth May 28, 2025
a84d30b
switch to interprocesslock - already using that
bpkroth May 29, 2025
2341a10
address a lint issue
bpkroth May 29, 2025
45ad11f
restore the original alembic comments - moving to separate PR
bpkroth May 29, 2025
cfa07ea
Merge branch 'refactor/storage-tests' into feature/mysql-schema-chang…
bpkroth May 29, 2025
bbcf689
Revert "restore the original alembic comments - moving to separate PR"
bpkroth May 29, 2025
53ee6e2
more comments
bpkroth May 29, 2025
994a32a
mypy
bpkroth May 29, 2025
2faf643
pylint
bpkroth May 29, 2025
a6b8941
allow retrieving storage url from the environment
bpkroth May 29, 2025
9c5ac14
more alembic tweaks
bpkroth May 29, 2025
988bc90
remove env
bpkroth May 29, 2025
f720d0d
temporarily revert back to something like the original schema
bpkroth May 29, 2025
f250e61
Revert "temporarily revert back to something like the original schema"
bpkroth May 29, 2025
793c2e5
Reapply "temporarily revert back to something like the original schema"
bpkroth May 29, 2025
952fba0
include timezone
bpkroth May 29, 2025
d6617ba
make mysql datetimes support fractional seconds
bpkroth May 29, 2025
2f28d79
log the alembic target engine url
bpkroth May 29, 2025
1b0fb2c
engine no longer optional
bpkroth May 29, 2025
928f491
Revert "make mysql datetimes support fractional seconds"
bpkroth May 29, 2025
4863a5b
Enable alembic to detect datetime precision issues with MySQL
bpkroth Jun 2, 2025
6a697a0
Enable floating point seconds with mysql
bpkroth Jun 2, 2025
f7ccf26
Alembic script to add floating point seconds precision
bpkroth Jun 2, 2025
40374c2
fixup
bpkroth Jun 2, 2025
fe4171a
rework to only apply to mysql
bpkroth Jun 2, 2025
5a42a14
be sure to mark that version as required
bpkroth Jun 2, 2025
f273ea3
add that refactor too
bpkroth Jun 2, 2025
b1b3733
Fixups and refactors to allow two things
bpkroth Jun 2, 2025
f632f90
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 2, 2025
565ac4d
Merge branch 'main' into fixup-refactor/allow-git-repo-root-env-resol…
bpkroth Jun 5, 2025
bf13366
copilot fixups
bpkroth Jun 5, 2025
9df032c
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 5, 2025
07140b6
Merge branch 'main' into fixup-refactor/allow-git-repo-root-env-resol…
bpkroth Jun 13, 2025
e001d9a
merge cleanup
bpkroth Jun 13, 2025
c46f16a
unused-imnport
bpkroth Jun 13, 2025
8560416
bad merge
bpkroth Jun 23, 2025
f451e2b
add a test for non-git dirs, refactor to reduce duplicate code
bpkroth Jun 23, 2025
32a18fe
docs
bpkroth Jun 23, 2025
19fefde
test
bpkroth Jun 23, 2025
4041723
improvements on git info handling
bpkroth Jun 23, 2025
1757b7e
cleanup
bpkroth Jun 23, 2025
38ed63e
style
bpkroth Jun 23, 2025
7903c41
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 23, 2025
6838d45
mypy
bpkroth Jun 24, 2025
e9bf5f2
test tweak
bpkroth Jun 24, 2025
8263484
fixup
bpkroth Jun 24, 2025
3c10846
refactor
bpkroth Jun 24, 2025
0cb5948
fixup
bpkroth Jun 24, 2025
59050ce
start to disable the lookup logic for abs config path
bpkroth Jun 24, 2025
062fad7
error handling
bpkroth Jun 24, 2025
4bf6b88
remove resolution logic
bpkroth Jun 24, 2025
e5374e0
docs
bpkroth Jun 24, 2025
81dcea0
imports
bpkroth Jun 24, 2025
948c3d5
mypy
bpkroth Jun 24, 2025
7179301
cleanup
bpkroth Jun 24, 2025
43c5887
notes
bpkroth Jun 24, 2025
82c6b8b
rename
bpkroth Jun 24, 2025
a1eb6de
Fixups and improvements to git info retrieval
bpkroth Jun 24, 2025
d0f8e74
comments
bpkroth Jun 24, 2025
f7d91a7
tweaks
bpkroth Jun 24, 2025
739c3ce
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 24, 2025
a0dd7b7
tweak
bpkroth Jun 24, 2025
942d57b
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 24, 2025
6d563a8
refactor
bpkroth Jun 24, 2025
4e33efb
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 24, 2025
a93b93e
Merge branch 'fixup/git-info' into fixup-refactor/allow-git-repo-root…
bpkroth Jun 24, 2025
5f13ff9
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 24, 2025
8f8f0bb
comment
bpkroth Jun 24, 2025
d009fe8
Merge branch 'fixup/git-info' into fixup-refactor/allow-git-repo-root…
bpkroth Jun 24, 2025
2257e17
format
bpkroth Jun 24, 2025
718f66e
Merge branch 'fixup/git-info' into fixup-refactor/allow-git-repo-root…
bpkroth Jun 24, 2025
01e844a
comments
bpkroth Jun 24, 2025
0357849
fixup
bpkroth Jun 24, 2025
8119ef4
Merge branch 'fixup/git-info' into fixup-refactor/allow-git-repo-root…
bpkroth Jun 24, 2025
c7245a2
fix docs
bpkroth Jun 24, 2025
1874b0e
Merge branch 'fixup/git-info' into fixup-refactor/allow-git-repo-root…
bpkroth Jun 24, 2025
3ea913e
Merge branch 'main' into fixup-refactor/allow-git-repo-root-env-resol…
motus Oct 23, 2025
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
Prev Previous commit
Next Next commit
Fixups and improvements to git info retrieval
  • Loading branch information
bpkroth committed Jun 24, 2025
commit a1eb6de19cbf9cd591e37b84acbe9900e4057071
72 changes: 69 additions & 3 deletions mlos_bench/mlos_bench/tests/util_git_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,80 @@
# Licensed under the MIT License.
#
"""Unit tests for get_git_info utility function."""
import os
import re
import tempfile
from pathlib import Path
from subprocess import CalledProcessError

from mlos_bench.util import get_git_info
import pytest

from mlos_bench.util import get_git_info, get_git_root, path_join


def test_get_git_info() -> None:
"""Check that we can retrieve git info about the current repository correctly."""
(git_repo, git_commit, rel_path) = get_git_info(__file__)
"""Check that we can retrieve git info about the current repository correctly from a
file.
"""
(git_repo, git_commit, rel_path, abs_path) = get_git_info(__file__)
assert "mlos" in git_repo.lower()
assert re.match(r"[0-9a-f]{40}", git_commit) is not None
assert rel_path == "mlos_bench/mlos_bench/tests/util_git_test.py"
assert abs_path == path_join(__file__, abs_path=True)


def test_get_git_info_dir() -> None:
"""Check that we can retrieve git info about the current repository correctly from a
directory.
"""
dirname = os.path.dirname(__file__)
(git_repo, git_commit, rel_path, abs_path) = get_git_info(dirname)
assert "mlos" in git_repo.lower()
assert re.match(r"[0-9a-f]{40}", git_commit) is not None
assert rel_path == "mlos_bench/mlos_bench/tests"
assert abs_path == path_join(dirname, abs_path=True)


def test_non_git_dir() -> None:
"""Check that we can handle a non-git directory."""
with tempfile.TemporaryDirectory() as non_git_dir:
with pytest.raises(CalledProcessError):
# This should raise an error because the directory is not a git repository.
get_git_root(non_git_dir)


def test_non_upstream_git() -> None:
"""Check that we can handle a git directory without an upstream."""
with tempfile.TemporaryDirectory() as non_upstream_git_dir:
non_upstream_git_dir = path_join(non_upstream_git_dir, abs_path=True)
# Initialize a new git repository.
os.system(f"git init {non_upstream_git_dir} -b main")
os.system(f"git -C {non_upstream_git_dir} config --local user.email '[email protected]'")
os.system(f"git -C {non_upstream_git_dir} config --local user.name 'PyTest User'")
Path(non_upstream_git_dir).joinpath("README.md").touch()
os.system(f"git -C {non_upstream_git_dir} add README.md")
os.system(f"git -C {non_upstream_git_dir} commit -m 'Initial commit'")
# This should raise an error because the repository has no upstream.
(git_repo, _git_commit, rel_path, abs_path) = get_git_info(non_upstream_git_dir)
assert git_repo == f"file://{non_upstream_git_dir}"
assert abs_path == non_upstream_git_dir
assert rel_path == "."


@pytest.mark.skipif(
os.environ.get("GITHUB_ACTIONS") != "true",
reason="Not running in GitHub Actions CI.",
)
def test_github_actions_git_info() -> None:
"""Test that get_git_info matches GitHub Actions environment variables if running in
CI.
"""
repo_env = os.environ.get("GITHUB_REPOSITORY") # "owner/repo" format
sha_env = os.environ.get("GITHUB_SHA")
assert repo_env, "GITHUB_REPOSITORY not set in environment."
assert sha_env, "GITHUB_SHA not set in environment."
git_repo, git_commit, _rel_path, _abs_path = get_git_info(__file__)
assert git_repo.endswith(repo_env), f"git_repo '{git_repo}' does not end with '{repo_env}'"
assert (
git_commit == sha_env
), f"git_commit '{git_commit}' does not match GITHUB_SHA '{sha_env}'"
142 changes: 128 additions & 14 deletions mlos_bench/mlos_bench/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ def path_join(*args: str, abs_path: bool = False) -> str:
"""
path = os.path.join(*args)
if abs_path:
path = os.path.abspath(path)
path = os.path.realpath(path)
return os.path.normpath(path).replace("\\", "/")


Expand Down Expand Up @@ -274,33 +274,147 @@ def check_required_params(config: Mapping[str, Any], required_params: Iterable[s
)


def get_git_info(path: str = __file__) -> tuple[str, str, str]:
def get_git_root(path: str = __file__) -> str:
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The git changes should be merged in #991 first to make it easier to review this PR.

"""
Get the git repository, commit hash, and local path of the given file.
Get the root dir of the git repository.

Parameters
----------
path : str, optional
Path to the file in git repository.

Raises
------
subprocess.CalledProcessError
If the path is not a git repository or the command fails.

Returns
-------
str
The absolute path to the root directory of the git repository.
"""
abspath = path_join(path, abs_path=True)
if not os.path.exists(abspath) or not os.path.isdir(abspath):
dirname = os.path.dirname(abspath)
else:
dirname = abspath
git_root = subprocess.check_output(
["git", "-C", dirname, "rev-parse", "--show-toplevel"],
text=True,
).strip()
return path_join(git_root, abs_path=True)


def get_git_remote_info(path: str, remote: str) -> str:
"""
Gets the remote URL for the given remote name in the git repository.

Parameters
----------
path : str
Path to the file in git repository.
remote : str
The name of the remote (e.g., "origin").

Raises
------
subprocess.CalledProcessError
If the command fails or the remote does not exist.

Returns
-------
(git_repo, git_commit, git_path) : tuple[str, str, str]
Git repository URL, last commit hash, and relative file path.
str
The URL of the remote repository.
"""
dirname = os.path.dirname(path)
git_repo = subprocess.check_output(
["git", "-C", dirname, "remote", "get-url", "origin"], text=True
return subprocess.check_output(
["git", "-C", path, "remote", "get-url", remote], text=True
).strip()


def get_git_repo_info(path: str) -> str:
"""
Get the git repository URL for the given git repo.

Tries to get the upstream branch URL, falling back to the "origin" remote
if the upstream branch is not set or does not exist. If that also fails,
it returns a file URL pointing to the local path.

Parameters
----------
path : str
Path to the git repository.

Raises
------
subprocess.CalledProcessError
If the command fails or the git repository does not exist.

Returns
-------
str
The upstream URL of the git repository.
"""
# In case "origin" remote is not set, or this branch has a different
# upstream, we should handle it gracefully.
# (e.g., fallback to the first one we find?)
path = path_join(path, abs_path=True)
cmd = ["git", "-C", path, "rev-parse", "--abbrev-ref", "--symbolic-full-name", "HEAD@{u}"]
try:
git_remote = subprocess.check_output(cmd, text=True).strip()
git_remote = git_remote.split("/", 1)[0]
git_repo = get_git_remote_info(path, git_remote)
except subprocess.CalledProcessError:
git_remote = "origin"
_LOG.warning(
"Failed to get the upstream branch for %s. Falling back to '%s' remote.",
path,
git_remote,
)
try:
git_repo = get_git_remote_info(path, git_remote)
except subprocess.CalledProcessError:
git_repo = "file://" + path
_LOG.warning(
"Failed to get the upstream branch for %s. Falling back to '%s'.",
path,
git_repo,
)
return git_repo


def get_git_info(path: str = __file__) -> tuple[str, str, str, str]:
"""
Get the git repository, commit hash, and local path of the given file.

Parameters
----------
path : str
Path to the file in git repository.

Raises
------
subprocess.CalledProcessError
If the path is not a git repository or the command fails.

Returns
-------
(git_repo, git_commit, rel_path, abs_path) : tuple[str, str, str, str]
Git repository URL, last commit hash, and relative file path and current
absolute path.
"""
abspath = path_join(path, abs_path=True)
if not os.path.exists(abspath) or not os.path.isdir(abspath):
dirname = os.path.dirname(abspath)
else:
dirname = abspath
git_root = get_git_root(path=abspath)
git_repo = get_git_repo_info(git_root)
git_commit = subprocess.check_output(
["git", "-C", dirname, "rev-parse", "HEAD"], text=True
).strip()
git_root = subprocess.check_output(
["git", "-C", dirname, "rev-parse", "--show-toplevel"], text=True
).strip()
_LOG.debug("Current git branch: %s %s", git_repo, git_commit)
rel_path = os.path.relpath(os.path.abspath(path), os.path.abspath(git_root))
return (git_repo, git_commit, rel_path.replace("\\", "/"))
_LOG.debug("Current git branch for %s: %s %s", git_root, git_repo, git_commit)
rel_path = os.path.relpath(abspath, os.path.abspath(git_root))
return (git_repo, git_commit, rel_path.replace("\\", "/"), abspath)


# Note: to avoid circular imports, we don't specify TunableValue here.
Expand Down