o
    年fU                     @   s   zd dl m Z  W n ey   dZ Y nw d dlZd dlZd dlmZmZ d dlmZ e	e
ZedZG dd dZd
dd	ZdS )    )datetimeN)PIPEPopen)dumpsz4.*?/usr/lib/python(\d(?:.\d+)?)/(site|dist)-packagesc                   @   s   e Zd Zdd Zdd ZdS )memoizec                 C   s   || _ i | _d S N)funccache)selfr    r   (/usr/share/python3/debpython/__init__.py__init__   s   
zmemoize.__init__c                 O   s6   t ||f}|| jvr| j|i || j|< | j| S r   )r   r	   r   )r
   argskwargskeyr   r   r   __call__   s   

zmemoize.__call__N)__name__
__module____qualname__r   r   r   r   r   r   r      s    r   c           	      C   s  d||d}d}|du rn;|du r|j ttd n/|rHt|tr'd}t|d}tr5|dt 	  |d|  |
  |j ||d td	|  t| fi |&}| \}}|ob|  t|j|olt|d
|ort|d
dW  d   S 1 sw   Y  dS )a<  Execute external shell commad.

    :param cdw: currennt working directory
    :param env: environment
    :param log_output:
        * opened log file or path to this file, or
        * None if output should be included in the returned dict, or
        * False if output should be redirectored to stdout/stderr
    T)shellcwdenvFN)stdoutstderraz
# command executed on {}z
$ {}
zinvoking: %szutf-8)
returncoder   r   )updater   
isinstancestropenr   writeformatnow	isoformatflushlogdebugr   communicateclosedictr   )	commandr   r   
log_outputr   r(   processr   r   r   r   r   execute   s2   



$r-   )NNN)r   ImportErrorloggingre
subprocessr   r   pickler   	getLoggerr   r%   compilePUBLIC_DIR_REr   r-   r   r   r   r   <module>   s    

