o
    b²“iÚ*  ã                   @   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 ¡ ZdZe	jdkr<dZdZnd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 dS )(é    )Úwith_statementNz0.5.7ÚbinÚwin32ÚScriptsTFc                   @   s   e Zd ZdS )Ú	UserErrorN)Ú__name__Ú
__module__Ú__qualname__© r
   r
   ú]/home/ubuntu/.local/lib/python3.10/site-packages/ray/_private/runtime_env/_clonevirtualenv.pyr      s    r   c                 C   s4   t |ƒ}|  |¡r| ||d … tjdfv rdS dS )al  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)ÚpathÚ	matchwithÚmatchlenr
   r
   r   Ú	_dirmatch!   s   $r   c                 C   s‚   t j | td¡}trt j ¡ }ni }tj|ddg|tj	d}| 
¡ \}}|js)|s+J ‚| d¡ ¡ }|d ttt|dd… ƒƒfS )	z/obtain version and path info from a virtualenv.Úpythonz-czjimport sys;print ("%d.%d" % (sys.version_info.major, sys.version_info.minor));print ("\n".join(sys.path));)ÚenvÚstdoutúutf-8r   r   N)r   r   ÚjoinÚenv_bin_dirÚ_WIN32ÚenvironÚcopyÚ
subprocessÚPopenÚPIPEÚcommunicateÚ
returncodeÚdecodeÚ
splitlinesÚlistÚfilterÚbool)Ú	venv_pathÚ
executabler   Úpr   ÚerrÚlinesr
   r
   r   Ú_virtualenv_sys4   s    ý÷r.   c                    sÔ   t j ˆ ¡stdˆ  ƒ‚t j |¡rtd| ƒ‚t dˆ |f ¡ tjˆ |dt d¡d t	|ƒ\}}t d¡ t
ˆ ||ƒ ‡ fdd	„}||ƒrSt d
¡ t|ˆ |ƒ t	|ƒ}||d ƒ}|rcJ |ƒ‚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>\   s   € z5clone_virtualenv.<locals>.<lambda>.<locals>.<genexpr>)Úany)Úsr4   r
   r   Ú<lambda>\   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_itemsÚfix_symlink_if_necessary)r5   Údst_dirÚversionÚsys_pathÚhas_oldÚv_sysÚ	remainingr
   r4   r   Úclone_virtualenvN   s&   ÿ

rI   c           	      C   s˜   t  d¡ t |¡D ]?\}}}t ||¡D ]3}tj ||¡}tj |¡rHtj 	|¡}| 
| ¡rH| | |¡}t  d|f ¡ t |¡ t ||¡ qq
d S )NzEscanning for internal symlinks that point to the original virtual envzfixing symlink in %s)r;   r<   r   ÚwalkÚ	itertoolsÚchainr   r   ÚislinkÚrealpathr   ÚreplaceÚdebugÚremoveÚsymlink)	r5   rC   ÚdirpathÚdirnamesÚ	filenamesÚa_fileÚfull_file_pathÚtargetÚ
new_targetr
   r
   r   rB   i   s   


€øÿrB   c              	   C   sâ   t j |t¡}tt  |¡ƒ\}}}t d¡}|D ]V}	t j ||	¡}
|	dd| dfv r+q|	 d¡r6| 	|	¡r6q|	 
d¡r<q|	dksE|	 d¡rQtt j ||	¡| |ƒ qt j |
¡r^t|
| |ƒ qt j |
¡rnt||	| |||d q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   ÚnextrJ   ÚreÚcompiler   ÚmatchÚendswithÚfixup_activaterM   Ú
fixup_linkÚisfileÚfixup_script_)Úold_dirÚnew_dirrD   r[   Úbin_dirÚrootÚdirsÚfilesÚpybinreÚfile_Úfilenamer
   r
   r   r@   }   s4   

ú€ñr@   c                    s´  dt j t j |¡¡ }dt j t j |¡¡ ‰d}t j | |¡‰ tˆ dƒ!}| d¡dkr7	 W d   ƒ d S | d¡ | ¡ ‰W d   ƒ n1 sJw   Y  ˆsSd S d‡ ‡‡fdd„	}	zˆd  	d	¡ 
¡ }
W n
 tyq   Y d S w |
t|ƒd … }|
 d
¡sd S |
|krŠ|	ƒ  d S |
 |¡rŸ|
t|ƒd … |krŸ|	|ƒ d S |
 |¡r¶|r¶|
t|ƒd … |kr¶|	|ƒ d S |rØ|
 |¡rØ|
|krÆ|	ƒ  d S |
t|ƒd … |krÖ|	|ƒ d S d S d S )Nz#!%s/bin/pythonz#!/usr/bin/env pythonÚrbé   s   #!r   c                    sx   t  dˆ  ¡ ˆ}| r||  }|d  d¡}tˆ dƒ}| |¡ | ˆdd … ¡ W d   ƒ d S 1 s5w   Y  d S )Nú	fixing %sÚ
r   Úwbr   )r;   rP   ÚencodeÚopenÚwriteÚ
writelines)rD   ÚshebangÚf©rm   r-   Únew_shebangr
   r   Úrewrite_shebang«   s   
"þz&fixup_script_.<locals>.rewrite_shebangr   z#!r1   )r   r   ÚnormcaseÚabspathr   rt   ÚreadÚseekÚ	readlinesr$   ÚstripÚUnicodeDecodeErrorr   r   )rh   rl   re   rf   rD   r[   Úold_shebangÚenv_shebangrx   r{   ÚbangÚshort_versionr
   ry   r   rd   š   sN   ý

û
þ

ÿþ
ÿrd   c                 C   s’   t  d|  ¡ t| dƒ}| ¡  d¡}W d   ƒ n1 sw   Y  | ||¡}t| dƒ}| | d¡¡ W d   ƒ d S 1 sBw   Y  d S )Nrp   rn   r   rr   )r;   rP   rt   r~   r$   rO   ru   rs   )rm   re   rf   rx   Údatar
   r
   r   ra   Ö   s   ÿ"ÿra   c                 C   s¬   t  d|  ¡ |d u rt | ¡}tj tj | ¡¡ ||¡}tj |¡s2tj tj 	||¡¡}d}nd}t
||ƒrO|rH|t|ƒd …  tj¡}n| ||d¡}t| |ƒ d S )Nrp   TFr   )r;   rP   r   Úreadlinkr   Údirnamer}   rO   Úisabsr   r   r   Úlstripr   Ú_replace_symlink)rm   re   rf   rX   ÚorigdirÚrellinkr
   r
   r   rb   à   s   

rb   c                 C   s$   d|  }t  ||¡ t  || ¡ d S )Nz%s.new)r   rR   Úrename)rm   Ú	newtargetÚtmpfnr
   r
   r   rŒ   ù   s   rŒ   c           	      C   s¾   | D ]Z}t j |¡sqt j t j |¡¡}t||ƒr)| ||d¡}t j |¡s(qnt||ƒs/qtt  	|¡ƒ\}}}|D ] }t j 
||¡}| d¡rPt|||ƒ q;| d¡r[t|||ƒ q;qd S )Nr   z.pthz	.egg-link)r   r   Úisdirr|   r}   r   rO   r:   r\   rJ   r   r`   Úfixup_pth_fileÚfixup_egglink_file)	Úsyspathre   rf   r   rh   ri   rj   rl   rm   r
   r
   r   rA   ÿ   s*   
ÿ


€ûõrA   c           	      C   s
  t  d|  ¡ t| dƒ}| ¡ }W d   ƒ n1 sw   Y  d}t|ƒD ]/\}}t|dƒr4| d¡n| ¡ }|rD| d¡sD| d¡rEq&t	||ƒrU| 
||d¡||< d	}q&|rƒt| d
ƒ}tj dd„ |D ƒ¡tj }| |¡ W d   ƒ d S 1 s|w   Y  d S d S )Nzfixup_pth_file %sÚrFr$   r   ú#zimport r   TÚwc                 S   s   g | ]}|  ¡ ‘qS r
   )r   )r2   Úliner
   r
   r   Ú
<listcomp>&  s    z"fixup_pth_file.<locals>.<listcomp>)r;   rP   rt   r€   Ú	enumerateÚhasattrr$   r   r   r   rO   r   Úlinesepr   ru   )	rm   re   rf   rx   r-   Ú
has_changeÚnumr™   Úpayloadr
   r
   r   r“     s&   
ÿ
€"þÿr“   c                 C   s®   t  d|  ¡ t| dƒ}| ¡  d¡ ¡ }W d   ƒ n1 s w   Y  t||ƒrU| ||d¡}t| dƒ}|d  d¡}| 	|¡ W d   ƒ d S 1 sNw   Y  d S d S )Nrp   rn   r   r   rr   rq   )
r;   rP   rt   r~   r$   r   r   rO   rs   ru   )rm   re   rf   rx   Úlinkr
   r
   r   r”   *  s   ÿ
"þþr”   c                  C   sä   t  d¡} | jdddddd |  ¡ \}}z|\}}W n ty0   tdtf ƒ |  d	¡ Y nw tj	 
|¡}tj	 
|¡}tjtjtjftd
|jƒ }tj|dd zt||ƒ W d S  tyq   t ¡ d }|  t|ƒ¡ Y d S w )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.ro   z%(message)s)ÚlevelÚformatr   )ÚoptparseÚOptionParserÚ
add_optionÚ
parse_argsÚ
ValueErrorÚprintÚ__version__Úerrorr   r   rN   ÚloggingÚWARNINGÚINFOÚDEBUGÚminr£   ÚbasicConfigrI   r   ÚsysÚexc_infoÚstr)ÚparserÚoptionsÚargsre   rf   ÚloglevelÚer
   r
   r   Úmain5  s.   ÿ
ÿþþrÁ   Ú__main__)Fr1   )!Ú
__future__r   r³   r«   r   Úos.pathr]   r=   r   r¹   rK   r±   Ú	getLoggerr;   r   Úplatformr   Ú	Exceptionr   r   r.   rI   rB   r@   rd   ra   rb   rŒ   rA   r“   r”   rÁ   r   r
   r
   r
   r   Ú<module>   sD   


<


ÿ