Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ __pycache__/
# Transient editor files
*.swp
*~
\#*#
.#*#

# Editor configuration
nbproject
Expand Down
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,6 @@ Contributors are:
-Eliah Kagan <eliah.kagan _at_ gmail.com>
-Ethan Lin <et.repositories _at_ gmail.com>
-Jonas Scharpf <jonas.scharpf _at_ checkmk.com>
-Gordon Marx

Portions derived from other open source works and are clearly marked.
10 changes: 9 additions & 1 deletion git/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,12 @@ def _is_cygwin_git(git_executable: str) -> bool:

# Just a name given, not a real path.
uname_cmd = osp.join(git_dir, "uname")

if not (pathlib.Path(uname_cmd).is_file() and os.access(uname_cmd, os.X_OK)):
_logger.debug(f"Failed checking if running in CYGWIN: {uname_cmd} is not an executable")
_is_cygwin_cache[git_executable] = is_cygwin
return is_cygwin

process = subprocess.Popen([uname_cmd], stdout=subprocess.PIPE, universal_newlines=True)
uname_out, _ = process.communicate()
# retcode = process.poll()
Expand All @@ -484,7 +490,9 @@ def is_cygwin_git(git_executable: PathLike) -> bool: ...


def is_cygwin_git(git_executable: Union[None, PathLike]) -> bool:
if sys.platform == "win32": # TODO: See if we can use `sys.platform != "cygwin"`.
# TODO: when py3.7 support is dropped, use the new interpolation f"{variable=}"
_logger.debug(f"sys.platform={sys.platform!r}, git_executable={git_executable!r}")
if sys.platform != "cygwin":
return False
elif git_executable is None:
return False
Expand Down
19 changes: 19 additions & 0 deletions test/test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
LockFile,
cygpath,
decygpath,
is_cygwin_git,
get_user_id,
remove_password_if_present,
rmtree,
Expand Down Expand Up @@ -349,6 +350,24 @@ def test_decygpath(self, wpath, cpath):
assert wcpath == wpath.replace("/", "\\"), cpath


class TestIsCygwinGit:
"""Tests for :func:`is_cygwin_git`"""

def test_on_path_executable(self):
# Currently we assume tests run on Cygwin use Cygwin git. See #533 and #1455 for background.
if sys.platform == "cygwin":
assert is_cygwin_git("git")
else:
assert not is_cygwin_git("git")

def test_none_executable(self):
assert not is_cygwin_git(None)

def test_with_missing_uname(self):
"""Test for handling when `uname` isn't in the same directory as `git`"""
assert not is_cygwin_git("/bogus_path/git")


class _Member:
"""A member of an IterableList."""

Expand Down
Loading