o
    ldh8                     @  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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$ g dZ%ddddZ&dd Zdd Z'd:ddZ(dZ)d;ddZ*dd Z+dd Z,d d! Z-d"d# Z.d$d% Z/d&d' Z0d(d) Z1d*d+ Z2d,d- Z3d.d/ Z4d0d1 Z5d2d3 Z6d4d5 Z7d6d7 Z8d8d9 Z9dS )<    )annotationsN)glob)Path)detect_ninja)MesonExceptionRealPathAction	quiet_gitwindows_proof_rmtreesetup_vsenv	OptionKey)add_arguments)wrap)mlogbuildcoredata   )run_exe)gztarxztarzipz.tar.gzz.tar.xz.zipc                 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   )parser r    ohome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/lib/python3.10/site-packages/mesonbuild/mdist.pyr   -   s   

r   c              	   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{} *{}
)hashlibZsha256updateopenreadwriteformat	hexdigestospathbasename)fnameZhashnamemfr    r    r!   create_hash:   s    "r2   HEADc                 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 )Ngitarchivez--formattar   z	--prefix=/z--)cwdstdoutr   )fileobj)r-   )
insertextendtempfileTemporaryFile
subprocess
check_callseektarfiler'   
extractall)srcdistdirrevisionprefixsubdircmdr1   tr    r    r!   copy_gitD   s   

"rL   zPRepository has uncommitted changes that will not be included in the dist tarball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)msgrM   r    r    r!   handle_dirty_optR   s   rU   c                 C  s   t j| d}t j|sd S g d}tj|| dd }|D ]E}|d d }|dd  dd\}}	|	ddd }
|dkrIt	
d	|
d
 q|dv rWtd	|
d|j tt j| |
|||
d qd S )Nz.gitmodules)r4   	submodulestatusz--cachedz--recursiveT)r9   universal_newlinesr    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)rG   rH   )r,   r-   joinexistsr@   check_output
splitlinessplitrsplitr   rP   rU   rM   rL   )rE   rF   optionsmodule_filerJ   ZmodlistrV   rW   Zsha1restsubpathr    r    r!   process_submodulesY   s    rg   c           
   	   C  s   t j|sJ i }||d< | |d< ||d< |D ]_}|jr#|j|vr#q||jd}t j|||d< t j| ||d< t j|||d< d|j}td	| zt||}	|	d
krat	
d W q tyw   td| t	
d Y qw d S )NZMESON_DIST_ROOTZMESON_SOURCE_ROOTZMESON_BUILD_ROOT ZMESON_PROJECT_DIST_ROOTZMESON_PROJECT_SOURCE_ROOTZMESON_PROJECT_BUILD_ROOTrY   zRunning custom dist script r   zDist script errored outzFailed to run dist script r   )r,   r-   isabsZ
subprojectgetr]   Zcmd_argsprintr   rR   rS   OSError)
src_rootbld_rootZ	dist_rootdist_scriptssubprojectsenvdrI   namercr    r    r!   run_dist_scriptsm   s0   

ru   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)rm   rH   Zprefix_levelr    r    r!   git_root   s
   rz   c                 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   rm   r    r    r!   is_git   s   r|   c                 C  s   t dd| dddg}|dkS )z2Check whether there are uncommitted changes in gitr4   r   z
diff-indexz--quietr3   r   )r@   call)rm   retr    r    r!   git_have_dirty_index   s   r   c                 C  s   t | r
tt|j tj|rt| t| }|	| r(t
| t| | n/t| |}|d }tj|r=t| t
| t||t|d t||| t| t| || d S )Nz-tmp)rI   )r   rU   msg_uncommitted_changesrM   r,   r-   r^   r	   rz   samefilemakedirsrL   r   relative_tostrrenamerg   )rm   rF   rc   Z	repo_rootrI   Ztmp_distdirr    r    r!   process_git_project   s"   


r   c                 C  s   t j|| }t||| | D ](}	t j||	}
t j||	}t j|r(qt|
r3t|
|| qt|
| qt	||||| g }|D ]}|t
|  }tj|||| d || qFt| |S )N)root_dirbase_dir)r,   r-   r]   r   valuesr^   r|   shutilcopytreeru   archive_extensionmake_archiveappendr	   )	dist_namearchivesrm   rn   dist_subro   rp   rc   rF   r-   Zsub_src_rootZsub_distdiroutput_namesacompressed_namer    r    r!   create_dist_git   s$   r   c                 C  s   t jt j| dS )Nz.hg)r,   r-   isdirr]   r{   r    r    r!   is_hg   s   r   c                 C  s   t dd| dg}d|vS )z1Check whether there are uncommitted changes in hghg-Rsummarys   commit: (clean))r@   r_   )rm   outr    r    r!   hg_have_dirty_index   s   r   c                 C  s  t |r
tt|j |rtd tj|dd tj	|| d }|d }|d }	tj	|| d }
t
dd	d
|dddd|d |g
 g }d|v rdd l}||d#}t|d}t|| W d    n1 sjw   Y  W d    n1 syw   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
|ddd|
g ||
 |S )Nz4dist scripts are not supported in Mercurial projectsT)exist_okz.tarz.xzz.gzr   r   r5   r   z-Sz-tr6   z-Xz
/.hg[a-z]*r   r   wbr"   r   r   )r   rU   r   rM   r   rP   r,   r   r-   r]   r@   rA   lzmar'   r   copyfileobjr   gzipunlink)r   r   rm   rn   r   ro   rc   ZtarnameZxznameZgznameZzipnamer   r   ZxfZtfzfr    r    r!   create_dist_hg   sB   
	
 
 


r   c                 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   )r9   z)Compiling the distribution package failedtestz5Running unit tests on the distribution package failedZDESTDIRinstall)r9   rq   z*Installing the distribution package failed)r@   r}   rk   r,   environcopy)meson_commandunpacked_src_dirbuilddir
installdir
ninja_argsZmyenvr    r    r!   run_dist_steps   s   
r   c                 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)rk   r,   r-   r]   r^   r	   mkdirr   r   unpack_archiver   rx   create_cmdline_argsr   )Zpackagenamer   extra_meson_argsrn   ZprivdirZ	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 )NZbackendrh   )argparseArgumentParsermsetup_argparse
parse_argsr   Zparse_cmd_line_optionsZread_cmd_line_fileZcmd_line_optionspopr   shlexra   Zformat_cmd_line_options)rn   r   argsr    r    r!   r     s   

r   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.)formatsra   archive_choicesrR   rS   r   rx   )rc   resultir    r    r!   determine_archives_to_generate%  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}tj|d	}|jd
 |j }	t| }
i }g }| jrtj||j}|jD ]}t||}tj|j|||< qg|d t|rt|	|
||||j|| }nt |r|rt!d dS t"|	|
||||j| }nt!d dS |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.rN   Zvsenvr   )get_meson_commandz
meson-distrZ   z-Dwrap_mode=nodownloadzC--include-subprojects option currently not supported with Mercurialr   z5Dist currently only works with Git or Mercurial reposZCreated)&r   r   is_filer   r   loadTcastenvironmentr   Z
get_optionr   r
   mesonbuild.mesonlibr   
source_dir	build_dirr,   r-   r]   project_nameZproject_versionr   Zinclude_subprojectssubproject_dirrp   r   Zget_directoryr   r|   r   ro   r   rk   r   Zno_testsr   r2   )rc   Z	buildfilebZ
need_vsenvr   rm   rn   Zpriv_dirr   r   r   rp   r   r   sub	directorynamesrt   rs   r    r    r!   run/  sP   

r   )r3   NN)rM   rN   ):
__future__r   r   r   r,   rR   r   r   r@   rC   r>   r%   typingr   r   pathlibr   Zmesonbuild.environmentr   r   r   r   r   r	   r
   r   Zmesonbuild.msetupr   r   Zmesonbuild.wrapr   Z
mesonbuildr   r   r   Zscripts.meson_exer   r   r   r2   rL   r   rU   rg   ru   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r    r    r    r!   <module>   sZ    


	%	
