o
    $¼"b<  ã                   @   sÔ  d Z ddlmZ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
m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZm Z  ddl!m"Z" ddl#m$Z$ er†zddl%Z%W n	 e&y…   Y nw edd�Z'edd�Z(edd�Z)edd�Z*dd„ Z+dd„ Z,dd„ Z-dZ.dd„ Z/d d!„ Z0G d"d#„ d#e1ƒZ2G d$d%„ d%e1ƒZ3d&d'„ Z4d(d)„ Z5d*d+„ Z6d,d-„ Z7d.d/„ Z8i Z9d0d1„ Z:d2d3„ Z;d4d5„ Z<d6d7„ Z=d8Z>dS )9z'
Periodically update bundled versions.
é    )Úabsolute_importÚunicode_literalsN)ÚdatetimeÚ	timedelta)Úgroupby)Úcopy2)Údedent)ÚThread)ÚURLError)Úurlopen)ÚAppDataDiskFolder)ÚPY2)ÚPath)ÚCREATE_NO_WINDOWÚPopené   )ÚBUNDLE_SUPPORT)ÚWheelé   )Úhoursé   )Údaysé   c                    sò   |rt | |||ˆ |ƒ t ¡ ‰‡ fdd„}t ˆ | |¡}	|d u ret|	jdd„ d�D ]9\}
}t|ƒ}t‡fdd„|D ƒƒ}|D ]#}|d urSt	|j
ƒj|jkrS|    S | ˆ|¡ra||ƒ    S q>q)|S |	jD ]}|jj|krv||ƒ  S qh|S )Nc                    s*   t ˆ j| j ƒ}t d|rdnd|¡ |S )Nzusing %supdated wheel %szperiodically Ú )r   ÚhouseÚfilenameÚloggingÚdebug)ÚverÚupdated_wheel)Úapp_data© úH/usr/lib/python3/dist-packages/virtualenv/seed/wheels/periodic_update.pyÚ_update_wheel3   s   z&periodic_update.<locals>._update_wheelc                 S   s   | j jdd… S )Nr   r   )ÚwheelÚversion_tuple)Úvr!   r!   r"   Ú<lambda>:   s    z!periodic_update.<locals>.<lambda>)Úkeyc                 3   s   � | ]
}|  ˆ ¡r|V  qd S ©N)Úuse©Ú.0Úversion)Únowr!   r"   Ú	<genexpr>=   s   € z"periodic_update.<locals>.<genexpr>)Úhandle_auto_updater   r.   Ú	UpdateLogÚfrom_app_datar   ÚversionsÚlistÚanyr   r   Únamer*   r$   r-   )ÚdistributionÚ
of_versionÚfor_py_versionr$   Úsearch_dirsr    Údo_periodic_updateÚenvr#   Úu_logÚ_ÚgroupÚall_patchesÚignore_grace_period_minorr-   r!   )r    r.   r"   Úperiodic_update-   s,   ÿý

üÿrB   c              	   C   s\   |  | |¡}t | ¡ ¡}|jr,d|_t ¡ |_| 	| 
¡ ¡ t| ||||d|d� d S d S )NT)Úperiodicr<   )Úembed_update_logr1   Ú	from_dictÚreadÚneeds_updaterC   r   r.   ÚstartedÚwriteÚto_dictÚtrigger_update)r7   r9   r$   r:   r    r<   rD   r=   r!   r!   r"   r0   K   s   
ür0   c                    sŽ   |  ˆ j|¡}t dˆ j|j¡ t | ¡ ¡}t	‡ fdd„|j
D ƒƒr.t dˆ j|j¡ d S tˆ jt ¡ d dƒ}|j
 |¡ | | ¡ ¡ d S )Nzadding %s information to %sc                 3   s   � | ]	}|j ˆ jkV  qd S r)   )r   r6   r+   ©r$   r!   r"   r/   Y   s   € z*add_wheel_to_update_log.<locals>.<genexpr>z%s already present in %sÚdownload)rD   r7   r   r   r6   Úfiler1   rE   rF   r5   r3   ÚwarningÚ
NewVersionr   r.   ÚappendrI   rJ   )r$   r9   r    rD   r=   r-   r!   rL   r"   Úadd_wheel_to_update_logU   s   rR   z%Y-%m-%dT%H:%M:%S.%fZc                 C   s   | d u rd S |   t¡S r)   )ÚstrftimeÚDATETIME_FMT©Úvaluer!   r!   r"   Údump_datetimee   s   rW   c                 C   s   | d u rd S t  | t¡S r)   )r   ÚstrptimerT   rU   r!   r!   r"   Úload_datetimei   ó   rY   c                   @   sV   e Zd Zdd„ Zedd„ ƒZdd„ Zddd	„Zd
d„ Zdd„ Z	dd„ Z
edd„ ƒZdS )rP   c                 C   ó   || _ || _|| _|| _d S r)   ©r   Ú
found_dateÚrelease_dateÚsource)Úselfr   r]   r^   r_   r!   r!   r"   Ú__init__n   ó   
zNewVersion.__init__c                 C   s(   | |d t |d ƒt |d ƒ|d d�S )Nr   r]   r^   r_   r\   )rY   ©ÚclsÚ
dictionaryr!   r!   r"   rE   t   s   

üzNewVersion.from_dictc                 C   s   | j t| jƒt| jƒ| jdœS )N©r   r^   r]   r_   )r   rW   r^   r]   r_   ©r`   r!   r!   r"   rJ   }   s
   üzNewVersion.to_dictFc                 C   sN   | j dkrdS | j dkr%| j|t k s|r%|s#| jp| j}|| tkS dS dS )NÚmanualTrC   F)r_   r]   ÚGRACE_PERIOD_CIr^   ÚGRACE_PERIOD_MINOR)r`   r.   rA   Úignore_grace_period_ciÚcompare_fromr!   r!   r"   r*   …   s   

zNewVersion.usec                 C   s   d  | jj| j| j| j| j¡S )Nz;{}(filename={}), found_date={}, release_date={}, source={}))ÚformatÚ	__class__Ú__name__r   r]   r^   r_   rg   r!   r!   r"   Ú__repr__�   s   ûzNewVersion.__repr__c                    s(   t ˆƒt ˆ ƒkot‡ ‡fdd„dD ƒƒS )Nc                 3   s$   � | ]}t ˆ|ƒt ˆ |ƒkV  qd S r)   )Úgetattr)r,   Úk©Úotherr`   r!   r"   r/   š   s   € 
ÿz$NewVersion.__eq__.<locals>.<genexpr>rf   )ÚtypeÚall©r`   rt   r!   rs   r"   Ú__eq__™   s   ÿzNewVersion.__eq__c                 C   s
   | |k S r)   r!   rw   r!   r!   r"   Ú__ne__ž   s   
zNewVersion.__ne__c                 C   s   t t| jƒƒS r)   )r   r   r   rg   r!   r!   r"   r$   ¡   s   zNewVersion.wheelN)FF)ro   Ú
__module__Ú__qualname__ra   ÚclassmethodrE   rJ   r*   rp   rx   ry   Úpropertyr$   r!   r!   r!   r"   rP   m   s    

	rP   c                   @   sH   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zed	d
„ ƒZ	dd„ Z
dS )r1   c                 C   r[   r)   )rH   Ú	completedr3   rC   )r`   rH   r~   r3   rC   r!   r!   r"   ra   §   rb   zUpdateLog.__init__c                 C   sF   |d u ri }| t | d¡ƒt | d¡ƒdd„ | dg ¡D ƒ| d¡ƒS )NrH   r~   c                 S   s   g | ]}t  |¡‘qS r!   )rP   rE   ©r,   r&   r!   r!   r"   Ú
<listcomp>´   s    z'UpdateLog.from_dict.<locals>.<listcomp>r3   rC   )rY   Úgetrc   r!   r!   r"   rE   ­   s   üzUpdateLog.from_dictc                 C   s   |  ||¡ ¡ }|  |¡S r)   )rD   rF   rE   )rd   r    r7   r9   Úraw_jsonr!   r!   r"   r2   ¸   s   
zUpdateLog.from_app_datac                 C   s(   t | jƒt | jƒ| jdd„ | jD ƒdœS )Nc                 S   s   g | ]}|  ¡ ‘qS r!   )rJ   )r,   Úrr!   r!   r"   r€   Â   ó    z%UpdateLog.to_dict.<locals>.<listcomp>)rH   r~   rC   r3   )rW   rH   r~   rC   r3   rg   r!   r!   r"   rJ   ½   s
   üzUpdateLog.to_dictc                 C   s8   t  ¡ }| jd u r|  |¡S || j tkrdS |  |¡S )NF)r   r.   r~   Ú_check_startÚUPDATE_PERIOD©r`   r.   r!   r!   r"   rG   Å   s   


zUpdateLog.needs_updatec                 C   s   | j d u p|| j  tkS r)   )rH   ÚUPDATE_ABORTED_DELAYr‡   r!   r!   r"   r…   Ï   rZ   zUpdateLog._check_startN)ro   rz   r{   ra   r|   rE   r2   rJ   r}   rG   r…   r!   r!   r!   r"   r1   ¦   s    



	r1   c              
   C   sØ   |d u rd nt |jƒ}tjdtdƒ ¡  | ||t |ƒdd„ |D ƒ|¡g}| t dƒ¡t dƒk}	|	r3d ntj	}
|
|
dœ}|	sFtj
dkrFt|d	< t|fi |¤Ž}t d
| |d u rXdnd |j¡||j¡ |	rj| ¡  d S d S )Nz-czñ
        from virtualenv.report import setup_report, MAX_LEVEL
        from virtualenv.seed.wheels.periodic_update import do_update
        setup_report(MAX_LEVEL, show_pid=True)
        do_update({!r}, {!r}, {!r}, {!r}, {!r}, {!r})
        c                 S   s   g | ]}t |ƒ‘qS r!   )Ústr©r,   Úpr!   r!   r"   r€   á   r„   z"trigger_update.<locals>.<listcomp>Ú"_VIRTUALENV_PERIODIC_UPDATE_INLINEÚ1)ÚstdoutÚstderrÚwin32ÚcreationflagszWtriggered periodic upgrade of %s%s (for python %s) via background process having PID %dr   z=={})r‰   ÚpathÚsysÚ
executabler   Ústriprm   r�   Ú
subprocessÚPIPEÚplatformr   r   r   Úinfor-   ÚpidÚcommunicate)r7   r9   r$   r:   r    r<   rC   Ú
wheel_pathÚcmdr   ÚpipeÚkwargsÚprocessr!   r!   r"   rK   Ó   s2   ÿô
ûÿrK   c                 C   s@   d }zt || ||||ƒ}W t d| ||¡ |S t d| ||¡ w )Nzdone %s %s with %s)Ú_run_do_updater   r   )r7   r9   Úembed_filenamer    r:   rC   r3   r!   r!   r"   Ú	do_updateô   s   ÿr£   c              	      sN  ddl m} |d u rd nt|ƒ}|d u rd nt|ƒj}t| tƒr$t| ƒn| } dd„ |D ƒ}| j}	|  	||¡}
t
 |
 ¡ ¡}t ¡ }g g }}|jD ]}|jdv rV| |¡ qI| |¡ qI|rad}n	d}|rj||d _|d ur€|	|j }| ¡ s€tt|ƒt|	ƒƒ d d g tƒ f\}}}‰ |d u s–|j|dd	�sÿt ¡ }|j||d u r£d nd
 |¡||| |	tjd�}|d u s¾|r¿|d j|jkr¿n@t|jƒ}t|jj|||d�}t  d|t ¡ | ¡ | |¡ ˆ  !|j¡ |j"}|j#}|d urô||jkrôn|d u s–|j|dd	�r–||_$|j$�s	||_%‡ fdd„|D ƒ}|| | |_t ¡ |_&|
 '| (¡ ¡ |S )Nr   )Úacquirec                 S   s"   g | ]}t |tƒrt|ƒn|‘qS r!   )Ú
isinstancer‰   r   rŠ   r!   r!   r"   r€     s   " z"_run_do_update.<locals>.<listcomp>>   rh   rC   rC   rh   T)rk   z<{})r7   Úversion_specr9   r:   r    Ú	to_folderr<   rf   zdetected %s in %sc                    s   g | ]	}|j ˆ vr|‘qS r!   )r   r+   ©Ú	filenamesr!   r"   r€   8  s    ))Úvirtualenv.seed.wheelsr¤   r   r   r%   r¥   r‰   r   r   rD   r1   rE   rF   r   r.   r3   r_   rQ   r6   Úexistsr   Úsetr*   Údownload_wheelrm   ÚosÚenvironr   Úrelease_date_for_wheel_pathr’   rP   r   r™   Úaddr$   r-   rC   rH   r~   rI   rJ   )r    r7   r¢   r9   rC   r:   r¤   Úwheel_filenameÚembed_versionÚ
wheelhouserD   r=   r.   Úupdate_versionsÚother_versionsr-   r_   ÚdestÚlastÚlast_versionr3   Údownload_timer^   Ú
last_wheelr!   r¨   r"   r¡   ý   sp   




ù	


ê
r¡   c              
   C   sx   t | ƒ}t|jƒ}|d ur:z|d |j d d }t |d¡W S  ty9 } zt d||¡ W Y d }~d S d }~ww d S )NÚreleasesr   Úupload_timez%Y-%m-%dT%H:%M:%Sz)could not load release date %s because %r)	r   Ú"_pypi_get_distribution_info_cachedr7   r-   r   rX   Ú	Exceptionr   Úerror)r·   r$   Úcontentr½   Ú	exceptionr!   r!   r"   r°   ?  s   
€þr°   c                   c   s   � d V  t  ¡ V  d S r)   )ÚsslÚ_create_unverified_contextr!   r!   r!   r"   Ú_request_contextM  s   €rÅ   c                 C   s   | t vr
t| ƒt | < t |  S r)   )Ú_PYPI_CACHEÚ_pypi_get_distribution_info)r7   r!   r!   r"   r¾   V  s   r¾   c                 C   sÊ   d d  | ¡}}zBtƒ D ];}z t||d��}t |¡}W d   ƒ n1 s%w   Y  W  W |S  tyG } zt d||¡ W Y d }~qd }~ww W |S  tyd } zt d||¡ W Y d }~|S d }~ww )Nzhttps://pypi.org/pypi/{}/json)Úcontextzfailed to access %s because %r)	rm   rÅ   r   ÚjsonÚloadr
   r   rÀ   r¿   )r7   rÁ   ÚurlrÈ   Úfile_handlerrÂ   r!   r!   r"   rÇ   \  s(   
ÿü€ÿû	þ€þrÇ   c                 C   s`   g }t  ¡ D ]\}}| ¡ D ]}tt| |||fd�}| ¡  | |¡ qq|D ]}| ¡  q'd S )N)ÚtargetÚargs)r   ÚitemsÚkeysr	   Ú_run_manual_upgradeÚstartrQ   Újoin)r    r<   Úthreadsr9   Údistribution_to_packager7   Úthreadr!   r!   r"   Úmanual_upgradek  s   ý
ÿr×   c           
   	   C   s¶   t  ¡ }ddlm} ||d |g | d|d�}t d|||d u r dn|j¡ t|||j| g dd�}d 	|r5d	nd
¡}||t  ¡ | g}	|rP|	 
d dd„ |D ƒ¡¡ tj|g|	¢R Ž  d S )Nr   )Úfrom_bundleF)r7   r-   r9   r:   r    r;   r<   z(upgrade %s for python %s with current %sr   )r7   r9   r¢   r    r:   rC   z"upgraded %s for python %s in %s {}znew entries found:
%szno new versions foundÚ
c                 s   s   � | ]}d   |¡V  qdS )z	{}N)rm   r   r!   r!   r"   r/   �  s   € z&_run_manual_upgrade.<locals>.<genexpr>)r   r.   ÚbundlerØ   r   rO   r6   r£   r’   rm   rQ   rÓ   )
r    r7   r9   r<   rÒ   rØ   Úcurrentr3   ÚmsgrÎ   r!   r!   r"   rÑ   y  sF   ù	üú
ÿ
ýrÑ   )
rR   rB   r£   r×   rP   r1   rY   rW   rK   r°   )?Ú__doc__Ú
__future__r   r   rÉ   r   r®   rÃ   r–   r“   r   r   Ú	itertoolsr   Úshutilr   Útextwrapr   Ú	threadingr	   Úsix.moves.urllib.errorr
   Úsix.moves.urllib.requestr   Úvirtualenv.app_datar   Úvirtualenv.infor   Úvirtualenv.util.pathr   Úvirtualenv.util.subprocessr   r   Úwheels.embedr   Úwheels.utilr   Ú	_strptimeÚImportErrorri   rj   r†   rˆ   rB   r0   rR   rT   rW   rY   ÚobjectrP   r1   rK   r£   r¡   r°   rÅ   rÆ   r¾   rÇ   r×   rÑ   Ú__all__r!   r!   r!   r"   Ú<module>   sd    ÿ




9-!	B(