3
;p_)                 @   s  d dl m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Zd dl	Z	d dl
Z
dZej ZdZe	jdkrrdZG dd deZd	d
 Zdd Zdd Zdd Zd%ddZd&ddZdd Zd'ddZdd Zdd Zdd Zd d! Zd"d# Zed$kr e  dS )(    )with_statementNz0.5.4binwin32ZScriptsc               @   s   e Zd ZdS )	UserErrorN)__name__
__module____qualname__ r	   r	   /home/aldo/Documentos/tesis/tesis/device auto/pruebas pulsar/pruebaclonado/envClonado/lib/python3.6/site-packages/clonevirtualenv.pyr      s   r   c             C   s4   t |}| j|r0| ||d  tjdgkr0dS dS )am  Check if path is within matchwith's tree.

    >>> _dirmatch('/home/foo/bar', '/home/foo/bar')
    True
    >>> _dirmatch('/home/foo/bar/', '/home/foo/bar')
    True
    >>> _dirmatch('/home/foo/bar/etc', '/home/foo/bar')
    True
    >>> _dirmatch('/home/foo/bar2', '/home/foo/bar')
    False
    >>> _dirmatch('/home/foo/bar2/etc', '/home/foo/bar')
    False
        TF)len
startswithossep)pathZ	matchwithZmatchlenr	   r	   r
   	_dirmatch   s
    
r   c             C   sp   t jj| td}tj|ddgi tjd}|j \}}|j r@|sDt	|j
dj }|d ttt|dd fS )	z/obtain version and path info from a virtualenv.pythonz-cz?import sys;print (sys.version[:3]);print ("\n".join(sys.path));)envstdoutzutf-8r   r   N)r   r   joinenv_bin_dir
subprocessPopenPIPEcommunicate
returncodeAssertionErrordecode
splitlineslistfilterbool)Z	venv_path
executablepr   errlinesr	   r	   r
   _virtualenv_sys2   s    
r'   c                s   t jj std  t jj|r0td| tjd |f  tj |dtjdd t	|\}}tjd t
 ||  fdd	}||rtjd
 t| | t	|}||d }| st|t | d S )Nzsrc dir %r does not existzdest dir %r existsz"cloning virtualenv '%s' => '%s'...Tz*.pyc)symlinksignorezfixing scripts in bin...c                s   t  fdd| D S )Nc             3   s   | ]}t | r|V  qd S )N)r   ).0i)src_dirr	   r
   	<genexpr>Q   s    z5clone_virtualenv.<locals>.<lambda>.<locals>.<genexpr>)any)s)r,   r	   r
   <lambda>Q   s    z"clone_virtualenv.<locals>.<lambda>zfixing paths in sys.path...r   )r   r   existsr   loggerinfoshutilcopytreeignore_patternsr'   fixup_scriptsfixup_syspath_itemsr   fix_symlink_if_necessary)r,   dst_dirversionsys_pathZhas_oldZv_sys	remainingr	   )r,   r
   clone_virtualenvC   s&    


r>   c       	      C   s   t jd xtj|D ]\}}}xvtj||D ]f}tjj||}tjj|r.tjj	|}|j
| r.|j| |}t jd|f  tj| tj|| q.W qW d S )NzEscanning for internal symlinks that point to the original virtual envzfixing symlink in %s)r2   r3   r   walk	itertoolschainr   r   islinkrealpathr   replacedebugremovesymlink)	r,   r:   dirpathdirnames	filenamesZa_fileZfull_file_pathtarget
new_targetr	   r	   r
   r9   ]   s    


r9   Fc          	   C   s   t jj|t}tt j|\}}}tjd}x|D ]}	t jj||	}
|	dd| dgkrZq2q2|	jdrr|j	|	rrq2q2|	j
drq2q2|	dks|	jdrtt jj||	| | q2t jj|
rt|
| | q2t jj|
r2t||	| |||d q2W d S )	Nz(pythonw?([0-9]+(\.[0-9]+(\.[0-9]+)?)?)?$r   zpython%szactivate_this.pyz.pycactivatez	activate.)rewrite_env_python)r   r   r   r   nextr?   recompiler   matchendswithfixup_activaterB   
fixup_linkisfilefixup_script_)old_dirnew_dirr;   rN   bin_dirrootdirsfilesZpybinrefile_filenamer	   r	   r
   r7   p   s$    


r7   c                s  dt jjt jj| }dt jjt jj| d}t jj| | t d*}|jddkr`d S |jd |j W d Q R X sd S d fdd	}	yd j	d	j
 }
W n tk
r   d S X |
t|d  }|
jd
sd S |
|kr|	  n|
j|r|
t|d  |kr|	| nz|
j|rN|rN|
t|d  |krN|	| nH|r|
j|r|
|krr|	  n|
t|d  |kr|	| nd S d S )Nz#!%s/bin/pythonz#!/usr/bin/env pythonrb   s   #!r   c                sb   t jd   }| r||  }|d jd}t d"}|j| |jdd   W d Q R X d S )Nz	fixing %s
zutf-8wbr   )r2   rE   encodeopenwrite
writelines)r;   shebangf)r_   r&   new_shebangr	   r
   rewrite_shebang   s    
z&fixup_script_.<locals>.rewrite_shebangzutf-8z#!)N)r   r   normcaseabspathr   re   readseek	readlinesr   stripUnicodeDecodeErrorr   r   )r[   r^   rX   rY   r;   rN   Zold_shebangZenv_shebangri   rk   ZbangZshort_versionr	   )r_   r&   rj   r
   rW      sD    






rW   c             C   sh   t jd|   t| d}|j jd}W d Q R X |j||}t| d}|j|jd W d Q R X d S )Nz	fixing %sr`   zutf-8rc   )r2   rE   re   rn   r   rD   rf   rd   )r_   rX   rY   ri   datar	   r	   r
   rT      s    rT   c             C   s   t jd|   |d kr tj| }tjjtjj| j||}tjj|sdtjjtjj	||}d}nd}t
||r|r|t|d  jtj}n|j||d}t| | d S )Nz	fixing %sTFr   )r2   rE   r   readlinkr   dirnamerm   rD   isabsr   r   r   lstripr   _replace_symlink)r_   rX   rY   rK   ZorigdirZrellinkr	   r	   r
   rU      s    

rU   c             C   s$   d|  }t j|| t j||  d S )Nz%s.new)r   rG   rename)r_   Z	newtargetZtmpfnr	   r	   r
   rx      s    rx   c       	      C   s   x| D ]}t jj|sqt jjt jj|}t||rT|j||d}t jj|s`qnt||s`qtt j	|\}}}xH|D ]@}t jj
||}|jdrt||| qz|jdrzt||| qzW qW d S )Nr   z.pthz	.egg-link)r   r   isdirrl   rm   r   rD   r1   rO   r?   r   rS   fixup_pth_filefixup_egglink_file)	ZsyspathrX   rY   r   r[   r\   r]   r^   r_   r	   r	   r
   r8      s"    





r8   c       	      C   s   t jd|   t| d}|j }W d Q R X d}xnt|D ]b\}}t|drV|jdn|j }| s:|jds:|jdr|q:q:t	||r:|j
||d||< d	}q:W |rt| d
,}tjjdd |D tj }|j| W d Q R X d S )Nzfixup_pth_file %srFr   zutf-8#zimport r   Twc             S   s   g | ]}|j  qS r	   )rq   )r*   lr	   r	   r
   
<listcomp>  s    z"fixup_pth_file.<locals>.<listcomp>)r2   rE   re   rp   	enumeratehasattrr   rq   r   r   rD   r   linesepr   rf   )	r_   rX   rY   ri   r&   Z
has_changenumlinepayloadr	   r	   r
   r{     s    
r{   c             C   s   t jd|   t| d}|j jdj }W d Q R X t||r||j||d}t| d}|d jd}|j	| W d Q R X d S )Nz	fixing %sr`   zutf-8r   rc   rb   )
r2   rE   re   rn   r   rq   r   rD   rd   rf   )r_   rX   rY   ri   linkr	   r	   r
   r|     s    
r|   c              C   s   t jd} | jdddddd | j \}}y|\}}W n, tk
rb   tdtf  | jd	 Y nX tj	j
|}tj	j
|}tjtjtjftd
|j }tj|dd yt|| W n. tk
r   tj d }| jt| Y nX d S )NzBusage: %prog [options] /path/to/existing/venv /path/to/cloned/venvz-vcountverboseF	verbosity)actiondestdefaulthelpzvirtualenv-clone %sznot enough arguments given.ra   z%(message)s)levelformatr   )optparseOptionParser
add_option
parse_args
ValueErrorprint__version__errorr   r   rC   loggingWARNINGINFODEBUGminr   basicConfigr>   r   sysexc_infostr)parseroptionsargsrX   rY   Zlogleveler	   r	   r
   main#  s,    

r   __main__)F)F)N) 
__future__r   r   r   r   os.pathrP   r4   r   r   r@   r   	getLoggerr2   r   platform	Exceptionr   r   r'   r>   r9   r7   rW   rT   rU   rx   r8   r{   r|   r   r   r	   r	   r	   r
   <module>   s<   


;


