o
    WiC                     @  s  d Z 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mZm	Z	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 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% erddl&m'Z' ddl(m)Z) e*e+Z,e	ddZ-e	ddZ.e	ddZ/e	ddZ0dYd)d*Z1dZd,d-Z2d[d/d0Z3d1Z4d\d4d5Z5d]d6d7Z6G d8d9 d9Z7G d:d; d;Z8d^d=d>Z9d_dCdDZ:d`dFdGZ;dadJdKZ<dbdMdNZ=i Z>dcdPdQZ?dcdRdSZ@dddTdUZAdedVdWZBg dXZCdS )fz%Periodically update bundled versions.    )annotationsN)datetime	timedeltatimezone)groupby)Path)copy2)DEVNULLPopen)dedent)Thread)TYPE_CHECKING)URLError)urlopen)AppDataDiskFolder)BUNDLE_SUPPORT)Wheel)CREATE_NO_WINDOW)	Generator)AppData   )hours   )days   distributionstr
of_version
str | Nonefor_py_versionwheelWheel | Nonesearch_dirs
list[Path]app_datar   do_periodic_updateboolenvdict[str, str]returnc                   s   |rt | ||| | tjtjdd fdd}t | |}	|d u rit|	jdd	 d
D ]9\}
}t	|}t
fdd|D }|D ]#}|d urWt|jj|jkrW|    S ||re||    S qBq-|S |	jD ]}|jj|krz||  S ql|S )Ntzver
NewVersionr)   r   c                   s*   t  j| j }td|rdnd| |S )Nzusing %supdated wheel %szperiodically  )r   housefilenameLOGGERdebug)r,   updated_wheel)r$    Z/home/ubuntu/.local/lib/python3.10/site-packages/virtualenv/seed/wheels/periodic_update.py_update_wheel5   s   z&periodic_update.<locals>._update_wheelc                 S  s   | j jdd S )Nr      )r    version_tuple)vr4   r4   r5   <lambda><   s    z!periodic_update.<locals>.<lambda>)keyc                 3  s    | ]
}|  r|V  qd S N)use.0version)nowr4   r5   	<genexpr>?   s    z"periodic_update.<locals>.<genexpr>)r,   r-   r)   r   )handle_auto_updater   rA   r   utc	UpdateLogfrom_app_datar   versionslistanyr   r0   namer=   r    r@   )r   r   r   r    r"   r$   r%   r'   r6   u_log_groupall_patchesignore_grace_period_minorr@   r4   )r$   rA   r5   periodic_update&   s,   


rP   Nonec              	   C  sb   | | |}t| }|jr/d|_tjtj	d|_
||  t| ||||d|d d S d S )NTr*   )periodicr'   )embed_update_logrE   	from_dictreadneeds_updaterR   r   rA   r   rD   startedwriteto_dicttrigger_update)r   r   r    r"   r$   r'   rS   rK   r4   r4   r5   rC   M   s   rC   r   c                   s   |  j|}td j|j t| }t	 fdd|j
D r.td j|j d S t jtjtjdd d}|j
| ||  d S )Nzadding %s information to %sc                 3  s    | ]	}|j  jkV  qd S r<   )r0   rJ   r>   r    r4   r5   rB   b   s    z*add_wheel_to_update_log.<locals>.<genexpr>z%s already present in %sr*   download)rS   r   r1   r2   rJ   filerE   rT   rU   rI   rG   warningr-   r   rA   r   rD   appendrX   rY   )r    r   r$   rS   rK   r@   r4   r[   r5   add_wheel_to_update_log^   s   r`   z%Y-%m-%dT%H:%M:%S.%fZvaluedatetime | Nonec                 C  s   | d u rd S |  tS r<   )strftimeDATETIME_FMTra   r4   r4   r5   dump_datetimen   s   rf   c                 C  s"   | d u rd S t | tjtjdS )Ntzinfo)r   strptimerd   replacer   rD   re   r4   r4   r5   load_datetimer   s   "rk   c                   @  sf   e Zd Zd%d
dZed&ddZd'ddZd(d)ddZd*ddZd+ddZ	d+dd Z
ed,d"d#Zd$S )-r-   r0   r   
found_dater   release_daterb   sourcer)   rQ   c                 C     || _ || _|| _|| _d S r<   r0   rl   rm   rn   )selfr0   rl   rm   rn   r4   r4   r5   __init__w   s   
zNewVersion.__init__
dictionarydict[str, str | None]c                 C  s(   | |d t |d t |d |d dS )Nr0   rl   rm   rn   rp   )rk   clsrs   r4   r4   r5   rT   }   s   

zNewVersion.from_dictc                 C  s   | j t| jt| j| jdS )Nr0   rm   rl   rn   )r0   rf   rm   rl   rn   rq   r4   r4   r5   rY      s
   zNewVersion.to_dictFrA   rO   r&   ignore_grace_period_cic                 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manualTrR   F)rn   rl   GRACE_PERIOD_CIrm   GRACE_PERIOD_MINOR)rq   rA   rO   ry   compare_fromr4   r4   r5   r=      s   
zNewVersion.usec              
   C  s.   | j j d| j d| j d| j d| j d
S )Nz
(filename=z), found_date=z, release_date=z	, source=))	__class____name__r0   rl   rm   rn   rx   r4   r4   r5   __repr__   s   zNewVersion.__repr__otherobjectc                   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r   rq   r4   r5   rB      s    
z$NewVersion.__eq__.<locals>.<genexpr>rw   )typeallrq   r   r4   r   r5   __eq__   s   zNewVersion.__eq__c                 C  s
   | |k S r<   r4   r   r4   r4   r5   __ne__   s   
zNewVersion.__ne__r   c                 C  s   t t| jS r<   )r   r   r0   rx   r4   r4   r5   r       s   zNewVersion.wheelN)
r0   r   rl   r   rm   rb   rn   r   r)   rQ   )rs   rt   r)   r-   )r)   rt   )FF)rA   r   rO   r&   ry   r&   r)   r&   )r)   r   )r   r   r)   r&   )r)   r   )r   
__module____qualname__rr   classmethodrT   rY   r=   r   r   r   propertyr    r4   r4   r4   r5   r-   v   s    





r-   c                   @  sT   e Zd Zd"d
dZed#ddZed$ddZd%ddZed&ddZ	d'dd Z
d!S )(rE   rW   rb   	completedrG   list[NewVersion]rR   bool | Noner)   rQ   c                 C  ro   r<   )rW   r   rG   rR   )rq   rW   r   rG   rR   r4   r4   r5   rr      s   
zUpdateLog.__init__rs   dict[str, object] | Nonec                 C  sF   |d u ri }| t |dt |ddd |dg D |dS )NrW   r   c                 S  s   g | ]}t |qS r4   )r-   rT   r?   r9   r4   r4   r5   
<listcomp>   s    z'UpdateLog.from_dict.<locals>.<listcomp>rG   rR   )rk   getru   r4   r4   r5   rT      s   zUpdateLog.from_dictr$   r   r   r   r   c                 C  s   | || }| |S r<   )rS   rU   rT   )rv   r$   r   r   raw_jsonr4   r4   r5   rF      s   
zUpdateLog.from_app_datadict[str, object]c                 C  s(   t | jt | j| jdd | jD dS )Nc                 S  s   g | ]}|  qS r4   )rY   )r?   rr4   r4   r5   r          z%UpdateLog.to_dict.<locals>.<listcomp>)rW   r   rR   rG   )rf   rW   r   rR   rG   rx   r4   r4   r5   rY      s
   zUpdateLog.to_dictr&   c                 C  s>   t jtjd}| jd u r| |S || j tkrdS | |S )Nr*   F)r   rA   r   rD   r   _check_startUPDATE_PERIODrq   rA   r4   r4   r5   rV      s   


zUpdateLog.needs_updaterA   r   c                 C  s   | j d u p|| j  tkS r<   )rW   UPDATE_ABORTED_DELAYr   r4   r4   r5   r      s   zUpdateLog._check_startN)
rW   rb   r   rb   rG   r   rR   r   r)   rQ   )rs   r   r)   rE   )r$   r   r   r   r   r   r)   rE   )r)   r   )r)   r&   )rA   r   r)   r&   )r   r   r   rr   r   rT   rF   rY   r   rV   r   r4   r4   r4   r5   rE      s    


rE   rR   c              
   C  s   |d u rd nt |j}tjdtd | ||t |dd |D |g}|ddk}	|	r/d nt}
|
|
d}|	sAtj	dkrAt
|d	< t|fi |}td
| |d u rSdnd|j ||j |	re|  d S d|_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 r4   )r   r?   pr4   r4   r5   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   )r   pathsys
executabler   stripformatr   r	   platformr   r
   r1   infor@   pidcommunicate
returncode)r   r   r    r"   r$   r'   rR   
wheel_pathcmdr2   pipekwargsprocessr4   r4   r5   rZ      s2   	

rZ   embed_filenamestr | AppDatalist[str] | list[Path]list[NewVersion] | Nonec                 C  s@   d }zt || ||||}W td| || |S td| || w )Nzdone %s %s with %s)_run_do_updater1   r2   )r   r   r   r$   r"   rR   rG   r4   r4   r5   	do_update  s   r   r   c              	     sh  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jtjd}g g }}|jD ]}|jdv rY|| qL|| qL|rdd}n	d}|rm||d _|d ur|	|j }| stt|t|	 d d g t f\}}} |d u s|j|d	d
s	tjtjd}|j||d u rd nd| ||| |	tjd}|d u s|r|d j|jkrnCt|j}t|jj|||d}t !d|tjtjd|  ||  "|j |j#}|j$}|d ur||jkrn|d u s|j|d	d
r||_%|j%s||_& fdd|D }|| | |_tjtjd|_'|
(|)  |S )Nr   )acquirec                 S  s"   g | ]}t |trt|n|qS r4   )
isinstancer   r   r   r4   r4   r5   r   "  s   " z"_run_do_update.<locals>.<listcomp>r*   >   rz   rR   rR   rz   T)ry   <)r   version_specr   r"   r$   	to_folderr'   rw   zdetected %s in %sc                   s   g | ]	}|j  vr|qS r4   )r0   r>   	filenamesr4   r5   r   V  s    )*virtualenv.seed.wheelsr   r   r   r8   r   r   r   r/   rS   rE   rT   rU   r   rA   r   rD   rG   rn   r_   rJ   existsr   setr=   download_wheelosenvironr0   release_date_for_wheel_pathr   r-   r1   r   addr    r@   rR   rW   r   rX   rY   )r$   r   r   r   rR   r"   r   wheel_filenameembed_version
wheelhouserS   rK   rA   update_versionsother_versionsr@   rn   destlastlast_versionrG   download_timerm   
last_wheelr4   r   r5   r     sn   




	

r   r   r   c              
   C  s   t | }t|j}|d ur?z|d |j d d }t|djtjdW S  t	y> } zt
d|| W Y d }~d S d }~ww d S )Nreleasesr   upload_timez%Y-%m-%dT%H:%M:%Srg   z)could not load release date %s because %r)r   "_pypi_get_distribution_info_cachedr   r@   r   ri   rj   r   rD   	Exceptionr1   error)r   r    contentr   	exceptionr4   r4   r5   r   ]  s   
r   ,Generator[ssl.SSLContext | None, None, None]c                   c  s    d V  t  V  d S r<   )ssl_create_unverified_contextr4   r4   r4   r5   _request_contextk  s   r   r   c                 C  s   | t vr
t| t | < t |  S r<   )_PYPI_CACHE_pypi_get_distribution_info)r   r4   r4   r5   r   t  s   r   c                 C  s   d d|  d}}zBt  D ];}z t||d}t|}W d    n1 s&w   Y  W  W |S  tyH } ztd|| W Y d }~qd }~ww W |S  tye } ztd|| W Y d }~|S d }~ww )Nzhttps://pypi.org/pypi/z/json)contextzfailed to access %s because %r)r   r   jsonloadr   r1   r   r   )r   r   urlr   file_handlerr   r4   r4   r5   r   z  s(   
	r   c                 C  s\   g }t  D ]\}}|D ]}tt| |||fd}|  || qq|D ]}|  q%d S )N)targetargs)r   itemsr   _run_manual_upgradestartr_   join)r$   r'   threadsr   distribution_to_packager   threadr4   r4   r5   manual_upgrade  s   
r   c              	   C  s   t jtjd}ddlm} ||d |g | d|d}td|||d u r#dn|j t	|||j
| g dd}||t jtjd| g}|rM|d	d
d |D  |rQdnd}	d|	 }
tj|
g|R   d S )Nr*   r   )from_bundleF)r   r@   r   r"   r$   r%   r'   z(upgrade %s for python %s with current %sr.   )r   r   r   r$   r"   rR   
c                 s  s    | ]}d | V  qdS )	Nr4   r   r4   r4   r5   rB     s    z&_run_manual_upgrade.<locals>.<genexpr>znew entries found:
%szno new versions foundz upgraded %s for python %s in %s )r   rA   r   rD   bundler   r1   r^   rJ   r   r   r_   r   )r$   r   r   r'   r   r   currentrG   r   
ver_updatemsgr4   r4   r5   r     sD   	

r   )
r-   rE   r`   r   rf   rk   r   rP   r   rZ   )r   r   r   r   r   r   r    r!   r"   r#   r$   r   r%   r&   r'   r(   r)   r!   )r   r   r   r   r    r!   r"   r#   r$   r   r'   r(   r)   rQ   )r    r   r   r   r$   r   r)   rQ   )ra   rb   r)   r   )ra   r   r)   rb   )r   r   r   r   r    r!   r"   r#   r$   r   r'   r(   rR   r&   r)   rQ   )r   r   r   r   r   r   r$   r   r"   r   rR   r&   r)   r   )r$   r   r   r   r   r   r   r   rR   r&   r"   r   r)   r   )r   r   r)   rb   )r)   r   )r   r   r)   r   )r$   r   r'   r(   r)   rQ   )
r$   r   r   r   r   r   r'   r(   r)   rQ   )D__doc__
__future__r   r   loggingr   r   r   r   r   r   	itertoolsr   pathlibr   shutilr   
subprocessr	   r
   textwrapr   	threadingr   typingr   urllib.errorr   urllib.requestr   virtualenv.app_datar   virtualenv.seed.wheels.embedr   virtualenv.seed.wheels.utilr   virtualenv.util.subprocessr   collections.abcr   virtualenv.app_data.baser   	getLoggerr   r1   r{   r|   r   r   rP   rC   r`   rd   rf   rk   r-   rE   rZ   r   r   r   r   r   r   r   r   r   __all__r4   r4   r4   r5   <module>   s`    






'


5
.
,

H




(