diff --git a/git/cmd.py b/git/cmd.py index 2048a43fa..2d5ed9bed 100644 --- a/git/cmd.py +++ b/git/cmd.py @@ -32,7 +32,6 @@ from git.util import ( cygpath, expand_path, - is_cygwin_git, patch_env, remove_password_if_present, stream_copy, @@ -661,7 +660,7 @@ def refresh(cls, path: Union[None, PathLike] = None) -> bool: @classmethod def is_cygwin(cls) -> bool: - return is_cygwin_git(cls.GIT_PYTHON_GIT_EXECUTABLE) + return cls.GIT_PYTHON_GIT_EXECUTABLE is not None and sys.platform == "cygwin" @overload @classmethod diff --git a/git/util.py b/git/util.py index 9e8ac821d..118288edf 100644 --- a/git/util.py +++ b/git/util.py @@ -96,7 +96,6 @@ Files_TD, Has_id_attribute, HSH_TD, - Literal, PathLike, Protocol, SupportsIndex, @@ -344,44 +343,6 @@ def _get_exe_extensions() -> Sequence[str]: return () -def py_where(program: str, path: Optional[PathLike] = None) -> List[str]: - """Perform a path search to assist :func:`is_cygwin_git`. - - This is not robust for general use. It is an implementation detail of - :func:`is_cygwin_git`. When a search following all shell rules is needed, - :func:`shutil.which` can be used instead. - - :note: - Neither this function nor :func:`shutil.which` will predict the effect of an - executable search on a native Windows system due to a :class:`subprocess.Popen` - call without ``shell=True``, because shell and non-shell executable search on - Windows differ considerably. - """ - # From: http://stackoverflow.com/a/377028/548792 - winprog_exts = _get_exe_extensions() - - def is_exec(fpath: str) -> bool: - return ( - osp.isfile(fpath) - and os.access(fpath, os.X_OK) - and ( - sys.platform != "win32" or not winprog_exts or any(fpath.upper().endswith(ext) for ext in winprog_exts) - ) - ) - - progs = [] - if not path: - path = os.environ["PATH"] - for folder in str(path).split(os.pathsep): - folder = folder.strip('"') - if folder: - exe_path = osp.join(folder, program) - for f in [exe_path] + ["%s%s" % (exe_path, e) for e in winprog_exts]: - if is_exec(f): - progs.append(f) - return progs - - def _cygexpath(drive: Optional[str], path: str) -> str: if osp.isabs(path) and not drive: # Invoked from `cygpath()` directly with `D:Apps\123`? @@ -447,51 +408,6 @@ def decygpath(path: PathLike) -> str: return path.replace("/", "\\") -#: Store boolean flags denoting if a specific Git executable -#: is from a Cygwin installation (since `cache_lru()` unsupported on PY2). -_is_cygwin_cache: Dict[str, Optional[bool]] = {} - - -def _is_cygwin_git(git_executable: str) -> bool: - is_cygwin = _is_cygwin_cache.get(git_executable) # type: Optional[bool] - if is_cygwin is None: - is_cygwin = False - try: - git_dir = osp.dirname(git_executable) - if not git_dir: - res = py_where(git_executable) - git_dir = osp.dirname(res[0]) if res else "" - - # Just a name given, not a real path. - uname_cmd = osp.join(git_dir, "uname") - process = subprocess.Popen([uname_cmd], stdout=subprocess.PIPE, universal_newlines=True) - uname_out, _ = process.communicate() - # retcode = process.poll() - is_cygwin = "CYGWIN" in uname_out - except Exception as ex: - _logger.debug("Failed checking if running in CYGWIN due to: %r", ex) - _is_cygwin_cache[git_executable] = is_cygwin - - return is_cygwin - - -@overload -def is_cygwin_git(git_executable: None) -> Literal[False]: ... - - -@overload -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"`. - return False - elif git_executable is None: - return False - else: - return _is_cygwin_git(str(git_executable)) - - def get_user_id() -> str: """:return: String identifying the currently active system user as ``name@node``""" return "%s@%s" % (getpass.getuser(), platform.node())