U
    „zk^U  ã                   @   s†   zd dl m Z  W n ek
r(   dZ Y nX 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   s2   t ||fƒ}|| jkr(| j||Ž| 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krnv|dkr2|j ttd n^|rt|tƒrNd}t|dƒ}trj| d t ¡  	¡ ¡¡ | d | ¡¡ | 
¡  |j ||d t d	| ¡ t| f|ŽJ}| ¡ \}}|oÀ| ¡  t|j|oÔt|d
ƒ|oàt|d
ƒdW  5 Q R £ S Q R X 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ÚformatZnowZ	isoformatÚflushÚlogÚdebugr   ZcommunicateÚcloseÚdictr   )	Zcommandr   r   Z
log_outputr   r%   Zprocessr   r   r   r   r   Úexecute   s.    


þr'   )NNN)r   ÚImportErrorZloggingÚreÚ
subprocessr   r   Úpickler   Z	getLoggerr   r#   ÚcompileZPUBLIC_DIR_REr   r'   r   r   r   r   Ú<module>   s   


