o
    Uh<                     @  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# e$e%Z&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"Z1G d#d$ d$Z2d%d& Z3d'd( Z4d)d* Z5d+d, Z6d-d. Z7i Z8d/d0 Z9d1d2 Z:d3d4 Z;d5d6 Z<g d7Z=dS )8z%Periodically update bundled versions.    )annotationsN)datetime	timedeltatimezone)groupby)Path)copy2)DEVNULLPopen)dedent)Thread)URLError)urlopen)AppDataDiskFolder)BUNDLE_SUPPORT)Wheel)CREATE_NO_WINDOW   )hours   )days   c                   s   |rt | ||| | tjtjd fdd}t | |}	|d u rht|	jdd dD ]9\}
}t	|}t
fdd|D }|D ]#}|d urVt|jj|jkrV|    S ||rd||    S qAq,|S |	jD ]}|jj|kry||  S qk|S )	Ntzc                   s*   t  j| j }td|rdnd| |S )Nzusing %supdated wheel %szperiodically  )r   housefilenameLOGGERdebug)verupdated_wheel)app_data z/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/virtualenv/seed/wheels/periodic_update.py_update_wheel/   s   z&periodic_update.<locals>._update_wheelc                 S  s   | j jdd S )Nr      )wheelversion_tuple)vr"   r"   r#   <lambda>6   s    z!periodic_update.<locals>.<lambda>)keyc                 3  s    | ]
}|  r|V  qd S N)use.0version)nowr"   r#   	<genexpr>9   s    z"periodic_update.<locals>.<genexpr>)handle_auto_updater   r0   r   utc	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!   r0   r#   periodic_update    s,   


rE   c              	   C  sb   | | |}t| }|jr/d|_tjtj	d|_
||  t| ||||d|d d S d S )NTr   )periodicr?   )embed_update_logr4   	from_dictreadneeds_updaterF   r   r0   r   r3   startedwriteto_dicttrigger_update)r:   r<   r&   r=   r!   r?   rG   r@   r"   r"   r#   r2   G   s   r2   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+   )r   r9   r-   r&   r"   r#   r1   U   s    z*add_wheel_to_update_log.<locals>.<genexpr>z%s already present in %sr   download)rG   r:   r   r   r9   filer4   rH   rI   r8   r6   warning
NewVersionr   r0   r   r3   appendrL   rM   )r&   r<   r!   rG   r@   r/   r"   rO   r#   add_wheel_to_update_logQ   s   rU   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_datetimea   s   rZ   c                 C  s"   | d u rd S t | tjtjdS )Ntzinfo)r   strptimerW   replacer   r3   rX   r"   r"   r#   load_datetimee   s   "r_   c                   @  sZ   e Zd ZdddZedd Zdd Zdd
dZdddZdd Z	dd Z
edd ZdS )rS   returnNonec                 C     || _ || _|| _|| _d S r+   r   
found_daterelease_datesource)selfr   rd   re   rf   r"   r"   r#   __init__j      
zNewVersion.__init__c                 C  s(   | |d t |d t |d |d dS )Nr   rd   re   rf   rc   )r_   cls
dictionaryr"   r"   r#   rH   p   s   

zNewVersion.from_dictc                 C  s   | j t| jt| j| jdS )Nr   re   rd   rf   )r   rZ   re   rd   rf   rg   r"   r"   r#   rM   y   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manualTrF   F)rf   rd   GRACE_PERIOD_CIre   GRACE_PERIOD_MINOR)rg   r0   rD   ignore_grace_period_cicompare_fromr"   r"   r#   r,      s   
zNewVersion.usestrc              
   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__r   rd   re   rf   rn   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otherrg   r"   r#   r1      s    
z$NewVersion.__eq__.<locals>.<genexpr>rm   )typeallrg   r|   r"   r{   r#   __eq__   s   zNewVersion.__eq__c                 C  s
   | |k S r+   r"   r   r"   r"   r#   __ne__   s   
zNewVersion.__ne__c                 C  s   t t| jS r+   )r   r   r   rn   r"   r"   r#   r&      s   zNewVersion.wheelNr`   ra   )FF)r`   rt   )rw   
__module____qualname__rh   classmethodrH   rM   r,   rx   r   r   propertyr&   r"   r"   r"   r#   rS   i   s    




rS   c                   @  sJ   e Zd ZdddZedd Zedd Zd	d
 Zedd Z	dd Z
dS )r4   r`   ra   c                 C  rb   r+   )rK   	completedr6   rF   )rg   rK   r   r6   rF   r"   r"   r#   rh      ri   zUpdateLog.__init__c                 C  sF   |d u ri }| t |dt |ddd |dg D |dS )NrK   r   c                 S  s   g | ]}t |qS r"   )rS   rH   r.   r(   r"   r"   r#   
<listcomp>   s    z'UpdateLog.from_dict.<locals>.<listcomp>r6   rF   )r_   getrj   r"   r"   r#   rH      s   zUpdateLog.from_dictc                 C  s   | || }| |S r+   )rG   rI   rH   )rk   r!   r:   r<   raw_jsonr"   r"   r#   r5      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"   )rM   )r.   rr"   r"   r#   r          z%UpdateLog.to_dict.<locals>.<listcomp>)rK   r   rF   r6   )rZ   rK   r   rF   r6   rn   r"   r"   r#   rM      s
   zUpdateLog.to_dictc                 C  s>   t jtjd}| jd u r| |S || j tkrdS | |S )Nr   F)r   r0   r   r3   r   _check_startUPDATE_PERIODrg   r0   r"   r"   r#   rJ      s   


zUpdateLog.needs_updatec                 C  s   | j d u p|| j  tkS r+   )rK   UPDATE_ABORTED_DELAYr   r"   r"   r#   r      s   zUpdateLog._check_startNr   )rw   r   r   rh   r   rH   r5   rM   r   rJ   r   r"   r"   r"   r#   r4      s    




r4   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 r"   )rt   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   )rt   pathsys
executabler   stripformatr   r	   platformr   r
   r   infor/   pidcommunicate
returncode)r:   r<   r&   r=   r!   r?   rF   
wheel_pathcmdr   pipekwargsprocessr"   r"   r#   rN      s2   

rN   c                 C  s@   d }zt || ||||}W td| || |S td| || w )Nzdone %s %s with %s)_run_do_updater   r   )r:   r<   embed_filenamer!   r=   rF   r6   r"   r"   r#   	do_update   s   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 r"   )
isinstancert   r   r   r"   r"   r#   r     s   " z"_run_do_update.<locals>.<listcomp>r   >   ro   rF   rF   ro   T)rr   <)r:   version_specr<   r=   r!   	to_folderr?   rm   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   rt   r   r   rG   r4   rH   rI   r   r0   r   r3   r6   rf   rT   r9   existsr   setr,   download_wheelosenvironr   release_date_for_wheel_pathr   rS   r   r   addr&   r/   rF   rK   r   rL   rM   )r!   r:   r   r<   rF   r=   r   wheel_filenameembed_version
wheelhouserG   r@   r0   update_versionsother_versionsr/   rf   destlastlast_versionr6   download_timere   
last_wheelr"   r   r#   r      sn   




	

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:%Sr[   z)could not load release date %s because %r)r   "_pypi_get_distribution_info_cachedr:   r/   r   r]   r^   r   r3   	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)r:   r"   r"   r#   r   V  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   r   r   r   )r:   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   itemsr   _run_manual_upgradestartrT   join)r!   r?   threadsr<   distribution_to_packager:   threadr"   r"   r#   manual_upgradek  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=   rF   
c                 s  s    | ]}d | V  qdS )	Nr"   r   r"   r"   r#   r1     s    z&_run_manual_upgrade.<locals>.<genexpr>znew entries found:
%szno new versions foundz upgraded %s for python %s in %s )r   r0   r   r3   bundler   r   rR   r9   r   r   rT   r   )r!   r:   r<   r?   r   r   currentr6   r   
ver_updatemsgr"   r"   r#   r   y  sD   	

r   )
rS   r4   rU   r   rZ   r_   r   rE   r   rN   )>__doc__
__future__r   r   loggingr   r   r   r   r   r   	itertoolsr   pathlibr   shutilr   
subprocessr	   r
   textwrapr   	threadingr   urllib.errorr   urllib.requestr   virtualenv.app_datar   virtualenv.seed.wheels.embedr   virtualenv.seed.wheels.utilr   virtualenv.util.subprocessr   	getLoggerrw   r   rp   rq   r   r   rE   r2   rU   rW   rZ   r_   rS   r4   rN   r   r   r   r   r   r   r   r   r   __all__r"   r"   r"   r#   <module>   sX    




'
5,$	H(