4343# typing ---------------------------------------------------------------------------
4444
4545from typing import (Any ,AnyStr ,BinaryIO ,Callable ,Dict ,IO ,List ,Mapping ,
46- Sequence ,TYPE_CHECKING ,Tuple ,Union ,cast ,overload )
46+ Sequence ,TYPE_CHECKING ,TextIO , Tuple ,Union ,cast ,overload )
4747
4848from git .types import PathLike ,Literal ,TBD
4949
@@ -98,14 +98,17 @@ def handle_process_output(process: subprocess.Popen,
9898 or if decoding must happen later (i.e. for Diffs).
9999 """
100100# Use 2 "pump" threads and wait for both to finish.
101- def pump_stream (cmdline :str ,name :str ,stream :BinaryIO ,is_decode :bool ,
102- handler :Union [None ,Callable [[str ],None ]])-> None :
101+ def pump_stream (cmdline :str ,name :str ,stream :Union [ BinaryIO , TextIO ] ,is_decode :bool ,
102+ handler :Union [None ,Callable [[Union [ bytes , str ] ],None ]])-> None :
103103try :
104104for line in stream :
105105if handler :
106106if is_decode :
107+ assert isinstance (line ,bytes )
107108line_str = line .decode (defenc )
108- handler (line_str )
109+ handler (line_str )
110+ else :
111+ handler (line )
109112except Exception as ex :
110113log .error ("Pumping %r of cmd(%s) failed due to: %r" ,name ,remove_password_if_present (cmdline ),ex )
111114raise CommandError (['<%s-pump>' % name ]+ remove_password_if_present (cmdline ),ex )from ex
@@ -337,12 +340,12 @@ def is_cygwin(cls) -> bool:
337340
338341@overload
339342@classmethod
340- def polish_url (cls ,url :str ,is_cygwin :Union [ None , bool ]= None )-> str :
343+ def polish_url (cls ,url :str ,is_cygwin :Literal [ False ]= ... )-> str :
341344 ...
342345
343346@overload
344347@classmethod
345- def polish_url (cls ,url :PathLike ,is_cygwin :Union [None ,bool ]= None )-> PathLike :
348+ def polish_url (cls ,url :PathLike ,is_cygwin :Union [None ,bool ]= None )-> str :
346349 ...
347350
348351@classmethod
@@ -628,16 +631,16 @@ def version_info(self) -> Tuple[int, int, int, int]:
628631def execute (self ,
629632command :Union [str ,Sequence [Any ]],
630633* ,
631- as_process :Literal [True ],
632- )-> AutoInterrupt :
634+ as_process :Literal [True ]
635+ )-> ' AutoInterrupt' :
633636 ...
634637
635638@overload
636639def execute (self ,
637640command :Union [str ,Sequence [Any ]],
638641* ,
639642as_process :Literal [False ]= False ,
640- stdout_as_string :Literal [True ],
643+ stdout_as_string :Literal [True ]
641644 )-> Union [str ,Tuple [int ,str ,str ]]:
642645 ...
643646
@@ -646,7 +649,7 @@ def execute(self,
646649command :Union [str ,Sequence [Any ]],
647650* ,
648651as_process :Literal [False ]= False ,
649- stdout_as_string :Literal [False ]= False ,
652+ stdout_as_string :Literal [False ]= False
650653 )-> Union [bytes ,Tuple [int ,bytes ,str ]]:
651654 ...
652655
@@ -656,8 +659,7 @@ def execute(self,
656659* ,
657660with_extended_output :Literal [False ],
658661as_process :Literal [False ],
659- stdout_as_string :Literal [True ],
660-
662+ stdout_as_string :Literal [True ]
661663 )-> str :
662664 ...
663665
@@ -667,8 +669,7 @@ def execute(self,
667669* ,
668670with_extended_output :Literal [False ],
669671as_process :Literal [False ],
670- stdout_as_string :Literal [False ],
671-
672+ stdout_as_string :Literal [False ]
672673 )-> bytes :
673674 ...
674675
@@ -829,16 +830,13 @@ def execute(self,
829830creationflags = PROC_CREATIONFLAGS ,
830831** subprocess_kwargs
831832 )
832- proc = cast (Popen [bytes ],proc )
833833
834- proc .stdout = cast (BinaryIO ,proc .stdout )
835834except cmd_not_found_exception as err :
836835raise GitCommandNotFound (redacted_command ,err )from err
837836else :
838- assert isinstance (proc .stdout ,BinaryIO )
839- assert isinstance (proc .stderr ,BinaryIO )
840- # proc.stdout = cast(BinaryIO, proc.stdout)
841- # proc.stderr = cast(BinaryIO, proc.stderr)
837+ proc = cast (Popen ,proc )
838+ proc .stdout = cast (BinaryIO ,proc .stdout )
839+ proc .stderr = cast (BinaryIO ,proc .stderr )
842840
843841if as_process :
844842return self .AutoInterrupt (proc ,command )
@@ -1164,6 +1162,8 @@ def _prepare_ref(self, ref: AnyStr) -> bytes:
11641162refstr = ref .decode ('ascii' )# type: str
11651163elif not isinstance (ref ,str ):
11661164refstr = str (ref )# could be ref-object
1165+ else :
1166+ refstr = ref
11671167
11681168if not refstr .endswith ("\n " ):
11691169refstr += "\n "