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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 d dlmZ d dlm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! d d
l"m#Z#m$Z$m%Z% ddl&m'Z' ej(rddl)m*Z* ddl+m,Z, g dZ-ddddZ.dGddZdHddZ/dZ0dId!d"Z1dJd$d%Z2dJd&d'Z3eG d(d) d)ej4d*Z5G d+d, d,e5Z6G d-d. d.e5Z7dKd6d7Z8dLd=d>Z9dMd?d@Z:dNdCdDZ;dOdEdFZ<dS )P    )annotationsN)	dataclass)glob)Path)detect_ninja)MesonExceptionRealPathAction	quiet_gitwindows_proof_rmtreesetup_vsenv	OptionKey)add_arguments)wrap)mlogbuildcoredata   )run_exe)ImmutableListProtocol)ExecutableSerialisation)gztarxztarzipz.tar.gzz.tar.xz.zipparserargparse.ArgumentParserreturnNonec                 C  sV   | j ddtdd | j dddd | j d	d
dd | j dddd | j dddd d S )N-Cwdz#directory to cd into before running)destactionhelpz--allow-dirty
store_truez8Allow even when repository contains uncommitted changes.)r!   r"   z	--formatsr   zZComma separated list of archive types to create. Supports xztar (default), gztar, and zip.)defaultr"   z--include-subprojectszEInclude source code of subprojects that have been used for the build.z
--no-testsz)Do not build and test generated packages.)add_argumentr   )r    r&   5/usr/lib/python3.10/site-packages/mesonbuild/mdist.pyr   5   s   

r   fnamestrc              	   C  sv   | d }t  }|t| d  t|ddd}|d| tj	
|  W d    d S 1 s4w   Y  d S )Nz
.sha256sumrbwzutf-8)encodingz{} *{}
)hashlibsha256updateopenreadwriteformat	hexdigestospathbasename)r(   Zhashnamemfr&   r&   r'   create_hashB   s    "r:   zPRepository has uncommitted changes that will not be included in the dist tarballmsgallow_dirtyboolc                 C  s2   |r	t |  d S t | d d  td d S )N
z:Use --allow-dirty to ignore the warning and proceed anywayr   )r   warningerrorsysexit)r;   r<   r&   r&   r'   handle_dirty_optN   s   rC   src_rootc                 C  s   t g d| d S )z
    Checks if meson.build file at the root source directory is tracked by git.
    It could be a subproject part of the parent project git repository.
    )zls-filesz--error-unmatchzmeson.buildr   )r	   rD   r&   r&   r'   is_gitU   s   rF   c                 C  s   t jt j| dS )Nz.hg)r5   r6   isdirjoinrE   r&   r&   r'   is_hg\   s   rI   c                   @  sb   e Zd ZU ded< ded< ded< ded< ded< d	ed
< dddZejdddZdddZdS )Distr)   	dist_namerD   bld_rootzT.List[ExecutableSerialisation]dist_scriptszT.Dict[str, str]subprojectsargparse.Namespaceoptionsr   r   c                 C  s*   t j| jd| _t j| j| j| _d S )Nz
meson-dist)r5   r6   rH   rL   dist_subrK   distdir)selfr&   r&   r'   __post_init__i   s   zDist.__post_init__archivesT.List[str]c                 C  s   d S )Nr&   )rS   rU   r&   r&   r'   create_distm   s   zDist.create_distc              	   C  s  t j| js	J i }| j|d< | j|d< | j|d< | jD ]d}|jr)|j| jvr)q| j	|jd}t j
| j||d< t j
| j||d< t j
| j||d< d
|j}td	| zt||}|d
krktd W q ty   td| td Y qw d S )NZMESON_DIST_ROOTMESON_SOURCE_ROOTMESON_BUILD_ROOT ZMESON_PROJECT_DIST_ROOTZMESON_PROJECT_SOURCE_ROOTZMESON_PROJECT_BUILD_ROOT zRunning custom dist script r   zDist script errored outzFailed to run dist script r   )r5   r6   isabsrR   rD   rL   rM   
subprojectrN   getrH   cmd_argsprintr   rA   rB   OSError)rS   envdsubdirnamercr&   r&   r'   run_dist_scriptsq   s0   





zDist.run_dist_scriptsN)r   r   rU   rV   r   rV   )	__name__
__module____qualname____annotations__rT   abcabstractmethodrW   rg   r&   r&   r&   r'   rJ   `   s   
 
rJ   )	metaclassc                   @  sN   e Zd Z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dS )&GitDistdir_r)   r   r   c                 C  sF   t ddg|ddd  }|st|S tt|j}t|j|d  S )Nz	rev-parsez--show-prefixT)checkr   )r	   stripr   lenparents)rS   rq   prefixZprefix_levelr&   r&   r'   git_root   s
   zGitDist.git_rootr=   c                 C  s    t dd| jdddg}|dkS )z2Check whether there are uncommitted changes in gitgitr   z
diff-indexz--quietHEADr   )
subprocesscallrD   )rS   retr&   r&   r'   have_dirty_index   s   zGitDist.have_dirty_indexry   NsrcT.Union[str, os.PathLike]rR   revisionrv   T.Optional[str]rd   r   c           	      C  s   dddd|g}|d ur| dd| d |d ur |d|g t "}tj|||d	 |d
 tj|d}|j	|d W d    d S 1 sIw   Y  d S )Nrx   archivez--formattar   z	--prefix=/z--)cwdstdoutr   )fileobj)r6   )
insertextendtempfileTemporaryFilerz   
check_callseektarfiler0   
extractall)	rS   r~   rR   r   rv   rd   cmdr9   tr&   r&   r'   copy_git   s   

"zGitDist.copy_gitrD   c                 C  s   |   rtt| jj tj|rt| | 	|}|
|r+t| | || n0t||}|d }tj|r@t| t| | j||t|d t||| t| | || d S )Nz-tmp)rd   )r}   rC   msg_uncommitted_changesrP   r<   r5   r6   existsr
   rw   samefilemakedirsr   r   relative_tor)   renameprocess_submodules)rS   rD   rR   Z	repo_rootrd   Ztmp_distdirr&   r&   r'   process_git_project   s"   



zGitDist.process_git_projectc                 C  s   t j|d}t j|sd S g d}tj||dd }|D ]G}|d d }|dd  dd\}}	|	ddd }
|dkrIt	
d	|
d
 q|dv rXtd	|
d| jj | jt j||
|||
d qd S )Nz.gitmodules)rx   	submodulestatusz--cachedz--recursiveT)r   universal_newlinesr   r[   r   -z
Submodule z3 is not checked out and cannot be added to the dist>   +UzF has uncommitted changes that will not be included in the dist tarball)r   rv   )r5   r6   rH   r   rz   check_output
splitlinessplitrsplitr   r?   rC   rP   r<   r   )rS   r~   rR   Zmodule_filer   Zmodlistr   r   sha1restsubpathr&   r&   r'   r      s    zGitDist.process_submodulesrU   rV   c                 C  s   |  | j| j | j D ]*}tj| j|}tj| j|}tj|r&qt	|r1|  || qt
|| q|   g }|D ]}| jt|  }t
j| j|| j| jd || q@t| j |S )N)root_dirbase_dir)r   rD   rR   rN   valuesr5   r6   rH   r   rF   shutilcopytreerg   archive_extensionmake_archiverQ   rK   appendr
   )rS   rU   r6   Zsub_src_rootZsub_distdiroutput_namesaZcompressed_namer&   r&   r'   rW      s"   
zGitDist.create_dist)rq   r)   r   r   r   r=   )ry   NN)r~   r   rR   r)   r   r)   rv   r   rd   r   r   r   )rD   r)   rR   r)   r   r   )r~   r)   rR   r)   r   r   rh   )	ri   rj   rk   rw   r}   r   r   r   rW   r&   r&   r&   r'   rp      s    

	

rp   c                   @  s    e Zd Zd
ddZdddZd	S )HgDistr   r=   c                 C  s   t dd| jdg}d|vS )z1Check whether there are uncommitted changes in hghg-Rsummarys   commit: (clean))rz   r   rD   )rS   outr&   r&   r'   r}      s   zHgDist.have_dirty_indexrU   rV   c                 C  s  |   rtt| jj | jrtd tj	| j
dd tj| j
| jd }|d }|d }tj| j
| jd }tdd	d
| jdddd| jd |g
 g }d|v rdd l}||d#}t|d}	t|	| W d    n1 ssw   Y  W d    n1 sw   Y  || d|v rt|d#}
t|d}	t|	|
 W d    n1 sw   Y  W d    n1 sw   Y  || t| d|v rtdd	d
| jddd|g || |S )Nz4dist scripts are not supported in Mercurial projectsT)exist_okz.tarz.xzz.gzr   r   r   r   z-Sz-tr   z-Xz
/.hg[a-z]*r   r   wbr*   r   r   )r}   rC   r   rP   r<   rM   r   r?   r5   r   rQ   r6   rH   rK   rz   r   rD   lzmar0   r   copyfileobjr   gzipunlink)rS   rU   ZtarnameZxznameZgznameZzipnamer   r   ZxfZtfzfr&   r&   r'   rW      sB   
	 
 


zHgDist.create_distNr   rh   )ri   rj   rk   r}   rW   r&   r&   r&   r'   r      s    
r   meson_commandrV   unpacked_src_dirbuilddir
installdir
ninja_argsintc                 C  s   t | d||g dkrtd dS t j||ddkr!td dS t j|dg |ddkr3td dS tj }||d	< t j|d
g ||ddkrOtd dS dS )Nz--backend=ninjar   z,Running Meson on distribution package failedr   )r   z)Compiling the distribution package failedtestz5Running unit tests on the distribution package failedZDESTDIRinstall)r   rb   z*Installing the distribution package failed)rz   r{   r`   r5   environcopy)r   r   r   r   r   myenvr&   r&   r'   run_dist_steps  s   
r   packagenameImmutableListProtocol[str]extra_meson_argsrL   privdirc                 C  s  t d|   tj|d}tj|d}tj|d}|||fD ]}tj|r-t| t| q!t }	t	| | t
tj|d}
t|
dksMJ |
d }|dg7 }|t|7 }||7 }t|||||	}|dkrut d	|  |S t| t| t| t d
|  d |S )NzTesting distribution package zdist-unpackz
dist-buildzdist-install*r   r   setupzDist check build directory was zDistribution package z tested)r`   r5   r6   rH   r   r
   mkdirr   r   unpack_archiver   rt   create_cmdline_argsr   )r   r   r   rL   r   Z	unpackdirr   r   pr   Zunpacked_filesr   r|   r&   r&   r'   
check_dist  s2   
r   c                 C  sR   t  }t| |g }t| t| | |jt	dd t
t|S )NbackendrZ   )argparseArgumentParsermsetup_argparse
parse_argsr   parse_cmd_line_optionsread_cmd_line_filecmd_line_optionspopr   shlexr   format_cmd_line_options)rL   r   argsr&   r&   r'   r   :  s   

r   rP   rO   c                 C  sZ   g }| j dD ]}|tvrtd| dt d || qt|dkr+td |S )N,zValue "z" not one of permitted values .r   zNo archive types specified.)formatsr   archive_choicesrA   rB   r   rt   )rP   resultir&   r&   r'   determine_archives_to_generateC  s   
r   c                 C  s  t | jd d }| std| jdt| j}td|jj	
td}t| ddlm} |jj}|jj}tj|d}|jd	 |j }t| }	i }
g }| jrxtj||j}|jD ]}t||}tj|j||
|< q`|d
 t|rt}nt|r|
rt d dS t!}nt d dS |||||j"|
| }|#|	}|d u rdS d}| j$st%|d | |||}|dkr|D ]}t&| t d| q|S )Nzmeson-privatez	build.datz
Directory z- does not seem to be a Meson build directory.r=   vsenvr   )get_meson_commandr   z-Dwrap_mode=nodownloadzC--include-subprojects option currently not supported with Mercurialr   z5Dist currently only works with Git or Mercurial reposCreated)'r   r   is_filer   r   loadTcastenvironmentr   
get_optionr   r   mesonbuild.mesonlibr   
source_dir	build_dirr5   r6   rH   project_nameproject_versionr   Zinclude_subprojectssubproject_dirrN   r   get_directoryr   rF   rp   rI   r`   r   rM   rW   Zno_testsr   r:   )rP   Z	buildfilebZ
need_vsenvr   rD   rL   priv_dirrK   rU   rN   r   r   sub	directoryclsprojectnamesrf   re   r&   r&   r'   runM  sR   


r  )r   r   r   r   )r(   r)   r   r   )r;   r)   r<   r=   r   r   )rD   r)   r   r=   )r   rV   r   r)   r   r)   r   r)   r   rV   r   r   )r   r)   r   r   r   rV   rL   r)   r   r)   r   r   )rL   r)   r   rV   )rP   rO   r   rV   )rP   rO   r   r   )=
__future__r   rm   r   r   r5   rA   r   r   rz   r   r   r-   typingr   dataclassesr   r   pathlibr   Zmesonbuild.environmentr   r   r   r   r	   r
   r   r   Zmesonbuild.msetupr   r   Zmesonbuild.wrapr   
mesonbuildr   r   r   scripts.meson_exer   TYPE_CHECKINGZ_typingr   mesonlibr   r   r   r:   r   rC   rF   rI   ABCMetarJ   rp   r   r   r   r   r   r  r&   r&   r&   r'   <module>   sZ    





(X
,


	
