o
    uJAf<(                     @  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mZ ddl	m
Z
mZmZmZmZmZ d dlmZ ddlmZmZ ejrEd dlZd3ddZd4ddZd4ddZd5ddZd4ddZd6d d!Zd4d"d#Zd4d$d%Zd7d(d)Zd4d*d+Z d4d,d-Z!d4d.d/Z"d8d1d2Z#dS )9    )annotationsN)glob   )open_wrapdburlWrapExceptionget_releasesget_releases_dataupdate_wrap_fileparse_patch_url)Path   )mesonlibmsubprojectsparser'argparse.ArgumentParser'returnNonec                 C  sz  | j ddd}d|_|jddd}|jdd	d
dd |jtd |jddd}|jdd	d
dd |d |jtd |jddd}|jdd	d
dd |d |jtd t	|}|jtj
d |jddd}|jdd	d
dd |d |jtd |jddd}|jdd	d
dd |jtd |jddd}|d |jtd |jddd}|jdd	d
dd |jtd d S )NCommandscommand)titledestTlistzshow all available projects)helpz--allow-insecureF
store_truez"Allow insecure server connections.)defaultactionr   Z	wrap_funcsearchzsearch the db by namenameinstallzinstall the specified projectinfoz$show available versions of a projectstatusz6show installed and available versions of your projectspromotez.bring a subsubproject up to the master projectproject_pathz	update-dbz:Update list of projects available in WrapDB (Since 0.61.0))add_subparsersrequired
add_parseradd_argumentset_defaultslist_projectsr   r   r   add_wrap_update_parserrunr    r!   r"   	update_db)r   
subparsersp r/   =/usr/lib/python3.10/site-packages/mesonbuild/wrap/wraptool.pyadd_arguments!   sP   










r1   options'argparse.Namespace'c                 C  s$   t | j}| D ]}t| q	d S )N)r   allow_insecurekeysprint)r2   releasesr.   r/   r/   r0   r)   M   s   

r)   c                 C  sr   | j }t| j}| D ]*\}}||dkrt| q|dg D ]}||dkr5td| d|  q"qd S )Ndependency_nameszDependency z found in wrap )r   r   r4   itemsfindr6   get)r2   r   r7   r.   r    depr/   r/   r0   r   R   s   

r   r   strr4   boolT.Tuple[str, str]c                 C  sJ   t |}|| }|std|  d|d d }|dd\}}||fS )NWrap  not found in wrapdbversionsr   -r   )r   r<   r   rsplit)r   r4   r7   r    latest_versionversionrevisionr/   r/   r0   get_latest_version]   s   
rI   c              
   C  s   | j }tjdstdtjtjd|rtdtjd|d }tj|r/tdt|| j\}}t	d| d| d| d	| d	| jd
}t
|d}||  W d    n1 sbw   Y  td| d| d|  d S )NsubprojectszISubprojects dir not found. Run this script in your source root directory.z5Subproject directory for this project already exists..wrapzWrap file already exists.z!https://wrapdb.mesonbuild.com/v2/_rD   /Twbz
Installed 	 version 
 revision )r   ospathisdir
SystemExitjoinexistsrI   r4   r   openwritereadr6   )r2   r   wrapfilerG   rH   urlfr/   r/   r0   r   f   s   (r   rZ   ,T.Tuple[str, str, str, str, T.Optional[str]]c                 C  s   t jd d}||  z|d }W n ty   tdw z|d }W n ty7   t|d }d\}}Y nw t|\}}|d }|||d |d |fS )	N)interpolationz	wrap-filez1Not a wrap-file, cannot have come from the wrapdb	patch_urlsource_filename)1Npatch_filename	directory)configparserConfigParserrY   KeyErrorr   r   search_versionr
   )rZ   ZcpZ	wrap_datar_   branchrH   rb   r/   r/   r0   get_current_versionu   s    
ri   c           
      C  s6  | j }tjdstdtjd|d }tj|s$td| d t|\}}}}}t|| j	\}}	||krG|	|krGt
d| d  tt||||	| j	 tjtjd|dd zttjd	| W n	 tyq   Y nw |d urzttjd	| W n	 ty   Y nw t
d
| d| d|	  d S )NrJ   zJSubprojects dir not found. Run this command in your source root directory.rK   zProject z is not in use.z is already up to date.T)ignore_errorszsubprojects/packagecachezUpdated rO   rP   )r   rQ   rR   rS   rT   rU   rV   ri   rI   r4   r6   r	   shutilrmtreeunlinkFileNotFoundError)
r2   r   rZ   rh   rH   subdirsrc_fileZ
patch_file
new_branchnew_revisionr/   r/   r0   update   s2   rs   c                 C  sZ   | j }t| j}||}|std| dtd| d |d D ]}td| q#d S )NrA   rB   zAvailable versions of :rC    )r   r   r4   r<   r   r6   )r2   r   r7   r    vr/   r/   r0   r       s   

r    	from_path
spdir_namec                 C  s   t j| r| dsJ t| | d S t j| rCt j| }t j||}t j	|r6t
d| dtj| |tdd d S d S )NrK   zOutput dir z$ already exists. Will not overwrite.rJ   )ignore)rQ   rR   isfileendswithrk   copyrS   basenamerU   rV   rT   copytreeignore_patterns)rw   rx   Z
sproj_nameZ	outputdirr/   r/   r0   do_promotion   s   r   c                 C  s   | j }d}t|}|dtj}| D ]}||v r#t||  d S q||vr0td| d|| }t	|dkrUt
d| dtjd |D ]	}t
|tjd qGtdt|d	 | d S )
NrJ   rM   zSubproject z not found in directory tree.r   z"There is more than one version of z/ in tree. Please specify which one to promote:
filer   )r#   r   detect_subprojectsreplacerQ   sepvaluesr   rT   lenr6   sysstderr)r2   argumentrx   ZsprojsZsystem_native_path_argumentmatchessr/   r/   r0   r"      s$   

r"   c                 C  s   t d tdD ]p}tj|d d }z
t|| j\}}W n ty0   t d|dtj	d Y qw zt
|\}}}}}W n tyN   t d|dtj	d Y qw ||kre||kret d|d| d	| d
 qt d|d| d| d| d| d	 qd S )NzSubproject statuszsubprojects/*.wrap znot available in wrapdb.r   zWrap file not from wrapdb.zup to date. Branch z, revision .znot up to date. Have ru   z, but z is available.)r6   r   rQ   rR   r}   rI   r4   	Exceptionr   r   ri   )r2   wr   Zlatest_branchZlatest_revisionZcurrent_branchZcurrent_revisionrL   r/   r/   r0   r!      s&   (r!   c                 C  sX   t | j}tdjdd tdd}|| W d    d S 1 s%w   Y  d S )NrJ   T)exist_okzsubprojects/wrapdb.jsonrN   )r   r4   r   mkdirrW   rX   )r2   datar\   r/   r/   r0   r,      s
   
"r,   intc                 C  s   |  |  dS )Nr   r   )r2   r/   r/   r0   r+      s   
r+   )r   r   r   r   )r2   r3   r   r   )r   r>   r4   r?   r   r@   )rZ   r>   r   r]   )rw   r>   rx   r>   r   r   )r2   r3   r   r   )$
__future__r   r   rQ   rd   rk   typingTr   wrapr   r   r   r   r	   r
   pathlibr   r   r   r   TYPE_CHECKINGargparser1   r)   r   rI   r   ri   rs   r    r   r"   r!   r,   r+   r/   r/   r/   r0   <module>   s0    

,


	







