
    Jj#                     `   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 	 d dl
Z
d dlZd dlZd dlZdZn# e$ r dZY nw xY w	 d dlmZ dZn# e$ r dZY nw xY w G d de          Z G d d	e          Z G d
 de          Z G d de          Z	 ddededz  dedz  dedz  def
dZdS )    N)ABCabstractmethodTF)
PtyProcessc                       e Zd ZdZedd            Zededdfd            Zeddeddfd	            Z	ede
fd
            Zedd            Zeede
fd                        ZdS )ProcessRunnerz<Unified interface for running a subprocess via PTY or pipes.returnNc                 
   K   dS )z=Read output from the process and write entries to *log_file*.N )selflog_files     n/home/rurouni/.cache/uv/archive-v0/6mr0qdqUAO9GXgnL/lib/python3.11/site-packages/open_terminal/utils/runner.pyread_outputzProcessRunner.read_output   
            datac                     dS )z)Send *data* to the process's stdin / PTY.Nr
   r   r   s     r   write_inputzProcessRunner.write_input#         r   Fforcec                     dS )z2Terminate (SIGTERM) or kill (SIGKILL) the process.Nr
   r   r   s     r   killzProcessRunner.kill'   r   r   c                 
   K   dS )z6Wait for the process to exit and return the exit code.Nr
   r   s    r   waitzProcessRunner.wait+   r   r   c                     dS )z-Release file descriptors and other resources.Nr
   r   s    r   closezProcessRunner.close/   r   r   c                     dS )zPID of the child process.Nr
   r   s    r   pidzProcessRunner.pid3   r   r   r   NF)__name__
__module____qualname____doc__r   r   bytesr   boolr   intr   r   propertyr    r
   r   r   r   r      s!       FFL L L ^L 8 8$ 8 8 8 ^8 A A$ A4 A A A ^A EC E E E ^E < < < ^< (S ( ( ( ^ X( ( (r   r   c            
           e Zd ZdZddededz  dedz  dedz  fdZdd	Zd
eddfdZ	de
ddfdZddeddfdZde
fdZddZede
fd            ZdS )	PtyRunnerz/Spawn a command under a pseudo-terminal (Unix).Ncommandcwdenvrun_as_userc                 $   |rL|rdt          j        |           d| n|}dt          j        |           dt          j        |           }d }t          j                    \  }}	 t	          j        |t          j        t          j	        ddddd                     t          j        |d	|||||d	
          | _        n7# t          $ r* t          j        |           t          j        |            w xY wt          j        |           || _        d S )Nzcd z && zsudo -u z -- bash -c HHHH   P   r   T)shellstdinstdoutstderrr.   r/   start_new_session)shlexquoteptyopenptyfcntlioctltermios
TIOCSWINSZstructpack
subprocessPopen_process	Exceptionosr   
_master_fd)r   r-   r.   r/   r0   inner	master_fdslave_fds           r   __init__zPtyRunner.__init__<   s3    	=@M9%+c**99999gE[[!9!9[[u{SXGYGY[[GC!kmm	8	K'"4fk&"bRSUV6W6WXXX&,"&	 	 	DMM  	 	 	HXHY	 	#s   &AB> >4C2r   c                 n  K   t          j                    }	 	 |                    d t          j        | j        d           d {V }|sd S n# t          $ r Y d S w xY w|rY|                    t          j	        d|
                    d          t          j                    d          dz              d {V  )NT   outputreplaceerrorstyper   ts
)asyncioget_event_looprun_in_executorrH   readrI   OSErrorwritejsondumpsdecodetime)r   r   loopr   s       r   r   zPtyRunner.read_outputW   s     %''	!11$RVWWWWWWWW E    
nnJ$,$(KKyK$A$A"&)++   	 	 	 	 	 	 	 	 		s   /A
 

AAr   c                 :    t          j        | j        |           d S N)rH   r]   rI   r   s     r   r   zPtyRunner.write_inputl   s    
$'''''r   sigc                     	 t          j        | j        j        |           dS # t          t
          f$ r1 	 | j                            |           Y dS # t          $ r Y Y dS w xY ww xY w)zSend *sig* to the child's entire process group.

        Falls back to signalling just the leader if the group is already gone.
        N)rH   killpgrF   r    ProcessLookupErrorPermissionErrorsend_signal)r   re   s     r   _signal_groupzPtyRunner._signal_groupo   s    
	Idm'-----"O4 	 	 	))#......%   	s&   # A%A
A!A% A!!A%Fr   c                 `    |                      |rt          j        nt          j                   d S rd   )rk   signalSIGKILLSIGTERMr   s     r   r   zPtyRunner.kill|   s)    UF6>>GGGGGr   c                 N   K   t          j        | j        j                   d {V S rd   )rX   	to_threadrF   r   r   s    r   r   zPtyRunner.wait   s.      &t}'9:::::::::r   c                 \    	 t          j        | j                   d S # t          $ r Y d S w xY wrd   )rH   r   rI   r\   r   s    r   r   zPtyRunner.close   sA    	HT_%%%%% 	 	 	DD	s    
++c                     | j         j        S rd   rF   r    r   s    r   r    zPtyRunner.pid       }  r   rd   r!   r"   )r#   r$   r%   r&   strdictrM   r   r'   r   r)   rk   r(   r   r   r   r*   r    r
   r   r   r,   r,   9   s:       99$ $ $#* $4$; $UX[_U_ $ $ $ $6   *( ($ ( ( ( (     H H$ H4 H H H H;C ; ; ; ;    !S ! ! ! X! ! !r   r,   c                       e Zd ZdZdededz  dedz  fdZddZdd	Zd
e	ddfdZ
ddZddeddfdZdefdZddZedefd            ZdS )
PipeRunnerzISpawn a command with stdin/stdout/stderr pipes (cross-platform fallback).r-   r.   Nr/   c                 >    d | _         || _        || _        || _        d S rd   )rF   _command_cwd_env)r   r-   r.   r/   s       r   rM   zPipeRunner.__init__   s"    48				r   r   c                    K   t          j        | j        t           j        j        t           j        j        t           j        j        | j        | j                   d {V | _        d S )N)r7   r8   r6   r.   r/   )rX   create_subprocess_shellr{   rD   PIPEr|   r}   rF   r   s    r   startzPipeRunner.start   sk      %=M%*%*$)		
 
 
 
 
 
 
 
 
r   c                    K   fd}t          j         || j        j        d           || j        j        d                     d {V  d S )Nc           	         K   | 2 3 d {V }rY                     t          j        ||                    d          t	          j                    d          dz              d {V  c6 d S )NrQ   rR   rT   rW   )r]   r^   r_   r`   ra   )streamlabelliner   s      r   read_streamz+PipeRunner.read_output.<locals>.read_stream   s      $       d 
"..
(-(,9(E(E&*ikk   	 	 	 	 	 	 	 	 	 %ffs   A)r7   r8   )rX   gatherrF   r7   r8   )r   r   r   s    ` r   r   zPipeRunner.read_output   s      	 	 	 	 	 nK,h77K,h77
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r   r   c                 D    | j         j                            |           d S rd   )rF   r6   r]   r   s     r   r   zPipeRunner.write_input   s!    !!$'''''r   c                 R   K   | j         j                                         d {V  d S rd   )rF   r6   drainr   s    r   drain_inputzPipeRunner.drain_input   s5      m!'')))))))))))r   Fr   c                     |rt           j        nt           j        }	 t          j        | j        j        |           d S # t          t          t          f$ r | j        
                    |           Y d S w xY wrd   )rm   rn   ro   rH   rg   rF   r    rh   ri   r\   rj   )r   r   re   s      r   r   zPipeRunner.kill   sw     %9fnn6>	+Idm'-----"OW= 	+ 	+ 	+M%%c******	+s   = 1A21A2c                 \   K   | j                                          d {V  | j         j        S rd   )rF   r   
returncoder   s    r   r   zPipeRunner.wait   s7      m  """""""""}''r   c                     d S rd   r
   r   s    r   r   zPipeRunner.close   s    r   c                     | j         j        S rd   rt   r   s    r   r    zPipeRunner.pid   ru   r   r!   r"   )r#   r$   r%   r&   rv   rw   rM   r   r   r'   r   r   r(   r   r)   r   r   r*   r    r
   r   r   ry   ry      s&       SS #* 4$;    
 
 
 

 
 
 
(( ($ ( ( ( (* * * *+ +$ +4 + + + +(C ( ( ( (    !S ! ! ! X! ! !r   ry   c                       e Zd ZdZdededz  dedz  fdZddZd	eddfd
Z	dde
ddfdZdefdZddZedefd            ZdededdfdZdS )WinPtyRunnerzFSpawn a command under a Windows pseudo-terminal (ConPTY via pywinpty).r-   r.   Nr/   c                     t           j                                        }|r|                    |           |                    dd          }|r|d|gn|g}t          j        |||d          | _        d S )NCOMSPECzcmd.exez/c)r3   r4   )r.   r/   
dimensions)rH   environcopyupdategetWinPtyProcessspawn_pty)r   r-   r.   r/   	spawn_envr5   cmd_argss          r   rM   zWinPtyRunner.__init__   s    JOO%%	 	"S!!! i33-4AE4))5'!'	
 
 
			r   r   c                 r   K   t          j                    } fd}	 |                    d |           d {V }|s6 j                                        sd S t          j        d           d {V  U|rE|                    t          j        d|t          j	                    d          dz              d {V  )Nc                  t    	  j                             d          S # t          $ r Y dS t          $ r Y dS w xY w)NrO    )r   r[   EOFErrorrG   r   s   r   _read_blockingz0WinPtyRunner.read_output.<locals>._read_blocking   sW    y~~d+++   rr   rrs    
7	77Tg?rP   rT   rW   )
rX   rY   rZ   r   isalivesleepr]   r^   r_   ra   )r   r   rb   r   r   s   `    r   r   zWinPtyRunner.read_output   s     %''	 	 	 	 		--dNCCCCCCCCD y((** EmD))))))))) 
nnJ$,$("&)++   	 	 	 	 	 	 	 	 		r   r   c                 b    | j                             |                    d                     d S )NrQ   rR   )r   r]   r`   r   s     r   r   zWinPtyRunner.write_input   s*    	95566666r   Fr   c                     |r&| j                             t          j                   d S | j                                          d S rd   )r   r   rm   rn   	terminater   s     r   r   zWinPtyRunner.kill  s@     	"INN6>*****I!!!!!r   c                    K   | j                                         r3t          j        d           d {V  | j                                         3| j         j        pdS )Ng?r   )r   r   rX   r   
exitstatusr   s    r   r   zWinPtyRunner.wait	  sf      i!! 	%-$$$$$$$$$ i!! 	%y#(q(r   c                 n    | j                                         r| j                                          d S d S rd   )r   r   r   r   s    r   r   zWinPtyRunner.close  s<    9 	"I!!!!!	" 	"r   c                     | j         j        S rd   )r   r    r   s    r   r    zWinPtyRunner.pid  s    y}r   rowscolsc                 <    | j                             ||           dS )z"Resize the pseudo-terminal window.N)r   
setwinsize)r   r   r   s      r   set_sizezWinPtyRunner.set_size  s     	T4(((((r   r!   r"   )r#   r$   r%   r&   rv   rw   rM   r   r'   r   r(   r   r)   r   r   r*   r    r   r
   r   r   r   r      s'       PP
 
#* 
4$; 
 
 
 
"   <7 7$ 7 7 7 7" "$ "4 " " " ")C ) ) ) )
" " " " S    X)S ) ) ) ) ) ) ) )r   r   r-   r.   r/   r0   r   c                    K   t           rt          | |||          S t          rt          | ||          S t	          | ||          }|                                 d{V  |S )zQFactory: create a PTY runner on Unix, WinPTY runner on Windows, or pipe fallback.)r0   N)_PTY_AVAILABLEr,   _WINPTY_AVAILABLEr   ry   r   )r-   r.   r/   r0   runners        r   create_runnerr     sx        E#sDDDD /GS#...c**F
,,..Mr   rd   )rX   r^   rH   r:   rm   rD   ra   abcr   r   r>   r<   rB   r@   r   ImportErrorwinptyr   r   r   r   r,   ry   r   rv   rw   r   r
   r   r   <module>r      s     				        # # # # # # # #LLLJJJMMMNNNNN   NNN222222   ( ( ( ( (C ( ( (:Q! Q! Q! Q! Q! Q! Q! Q!h>! >! >! >! >! >! >! >!BJ) J) J) J) J)= J) J) J)b #	 	t 
 t	
      s!   9 AAA AA