U
    ”Ê¹j  ã                	   @   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mZmZ ddlmZ eeƒZeeeddf d	œd
d„ƒZdeeee f eeee	f  ejdœdd„Zedeeee f eeee	f  eeee ee f ddf dœdd„ƒZdS )zFContains utilities to easily handle subprocesses in `huggingface_hub`.é    N)Úcontextmanager)ÚStringIO)ÚPath)ÚIOÚ	GeneratorÚListÚOptionalÚTupleÚUnioné   )Ú
get_logger)Úreturnc                  c   s*   t ƒ } tj}| t_z
| V  W 5 |t_X dS )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)ÚoutputZprevious_output© r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/huggingface_hub/utils/_subprocess.pyÚcapture_output   s    
r   T)ÚcommandÚfolderr   c              	   K   sP   t | tƒr|  ¡ } t |tƒr$t|ƒ}tj| ftjtj|dd|pDt ¡ 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|p4t ¡ dœ|—Ž�8}|j	dk	sTt
dƒ‚|jdk	sft
dƒ‚|j	|jfV  W 5 Q R X 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'   ÚAssertionErrorr   )r   r   r%   Úprocessr   r   r   Úrun_interactive_subprocessa   s$     
ÿ
ùø	r,   )NT)N)Ú__doc__r#   r    r   Ú
contextlibr   Úior   Úpathlibr   Útypingr   r   r   r   r	   r
   Úloggingr   Ú__name__Úloggerr   r   ÚCompletedProcessr&   r,   r   r   r   r   Ú<module>   s2      ýû, þü