o
    i                     @   s  d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZmZmZ ddlmZ eeZed	eeddf fd
dZ		ddeeee f deeee	f  d	ejfddZe	ddeeee f deeee	f  d	eeee ee f ddf fddZdS )zFContains utilities to easily handle subprocesses in `huggingface_hub`.    N)contextmanager)StringIO)Path)IO	GeneratorOptionalUnion   )
get_loggerreturnc                  c   s0    t  } tj}| t_z	| V  W |t_dS |t_w )a  Capture output that is printed to terminal.

    Taken from https://stackoverflow.com/a/34738440

    Example:
    ```py
    >>> with capture_output() as output:
    ...     print("hello world")
    >>> assert output.getvalue() == "hello world
"
    ```
    N)r   sysstdout)outputprevious_output r   g/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/huggingface_hub/utils/_subprocess.pycapture_output   s   r   Tcommandfolderc              	   K   sP   t | tr	|  } t |trt|}tj| ftjtj|dd|p"t d|S )aX  
    Method to run subprocesses. Calling this will capture the `stderr` and `stdout`,
    please call `subprocess.run` manually in case you would like for them not to
    be captured.

    Args:
        command (`str` or `list[str]`):
            The command to execute as a string or list of strings.
        folder (`str`, *optional*):
            The folder in which to run the command. Defaults to current working
            directory (from `os.getcwd()`).
        check (`bool`, *optional*, defaults to `True`):
            Setting `check` to `True` will raise a `subprocess.CalledProcessError`
            when the subprocess has a non-zero exit code.
        kwargs (`dict[str]`):
            Keyword arguments to be passed to the `subprocess.run` underlying command.

    Returns:
        `subprocess.CompletedProcess`: The completed process.
    utf-8replace)stderrr   checkencodingerrorscwd)	
isinstancestrsplitr   
subprocessrunPIPEosgetcwd)r   r   r   kwargsr   r   r   run_subprocess5   s    


r%   c              	   k   s    t | tr
|  } tj| ftjtjtjdd|pt d|"}|j	dus+J d|j
dus4J d|j	|j
fV  W d   dS 1 sFw   Y  dS )a  Run a subprocess in an interactive mode in a context manager.

    Args:
        command (`str` or `list[str]`):
            The command to execute as a string or list of strings.
        folder (`str`, *optional*):
            The folder in which to run the command. Defaults to current working
            directory (from `os.getcwd()`).
        kwargs (`dict[str]`):
            Keyword arguments to be passed to the `subprocess.run` underlying command.

    Returns:
        `tuple[IO[str], IO[str]]`: A tuple with `stdin` and `stdout` to interact
        with the process (input and output are utf-8 encoded).

    Example:
    ```python
    with _interactive_subprocess("git credential-store get") as (stdin, stdout):
        # Write to stdin
        stdin.write("url=hf.co
username=obama
".encode("utf-8"))
        stdin.flush()

        # Read from stdout
        output = stdout.read().decode("utf-8")
    ```
    r   r   )stdinr   r   r   r   r   Nz'subprocess is opened as subprocess.PIPE)r   r   r   r   Popenr!   STDOUTr"   r#   r&   r   )r   r   r$   processr   r   r   run_interactive_subprocessa   s(   
 
	"r*   )NT)N)__doc__r"   r   r   
contextlibr   ior   pathlibr   typingr   r   r   r   loggingr
   __name__loggerr   r   listCompletedProcessr%   tupler*   r   r   r   r   <module>   s<   
,