
    e>                       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(        rddl)m*Z* ddl+m,Z, g dZ-ddddZ.d=dZd>dZ/dZ0d?dZ1d@d!Z2d@d"Z3e G d# d$ej4        %                      Z5 G d& d'e5          Z6 G d( d)e5          Z7dAd1Z8dBd7Z9dCd8Z:dDd;Z;dEd<Z<dS )F    )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                   |                      ddt          d           |                      ddd           |                      d	d
d           |                      dd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   s    5/usr/lib/python3.11/site-packages/mesonbuild/mdist.pyr   r   5   s    
4B  D D D
W  Y Y Y
Wy  { { {
/d  f f f
\H  J J J J J    fnamestrc           	        | dz   }t          j                    }|                    t          | d                                                     t          |dd          5 }|                    d                    |                                t          j	        
                    |                                d d d            d S # 1 swxY w Y   d S )Nz
.sha256sumrbwzutf-8)encodingz{} *{}
)hashlibsha256updateopenreadwriteformat	hexdigestospathbasename)r*   hashnamemfs       r(   create_hashr>   B   s   |#HAHHT%##%%&&&	hg	.	.	. K! 	

!!!++--1A1A%1H1HIIJJJK K K K K K K K K K K K K K K K K Ks    ACC
C
zPRepository has uncommitted changes that will not be included in the dist tarballmsgallow_dirtyboolc                    |rt          j        |            d S t          j        | dz   dz              t          j        d           d S )N
z:Use --allow-dirty to ignore the warning and proceed anywayr   )r   warningerrorsysexit)r?   r@   s     r(   handle_dirty_optrH   N   sK     S
3: \\]]]r)   src_rootc                2    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
   rI   s    r(   is_gitrL   U   s     
 CCCXNNqQQr)   c                |    t           j                            t           j                            | d                    S )Nz.hg)r8   r9   isdirjoinrK   s    r(   is_hgrP   \   s&    7==h66777r)   c                  ~    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Zej        dd            ZddZdS )Distr+   	dist_namerI   bld_rootzT.List[ExecutableSerialisation]dist_scriptszT.Dict[str, str]subprojectsargparse.Namespaceoptionsr   r   c                    t           j                            | j        d          | _        t           j                            | j        | j                  | _        d S )Nz
meson-dist)r8   r9   rO   rT   dist_subrS   distdir)selfs    r(   __post_init__zDist.__post_init__i   s:    T]LAAw||DM4>BBr)   archivesT.List[str]c                    d S )N )r\   r^   s     r(   create_distzDist.create_distm   s    r)   c                "   t           j                            | j                  sJ i }| j        |d<   | j        |d<   | j        |d<   | j        D ]?}|j        r|j        | j        vr| j        	                    |j        d          }t           j        
                    | j        |          |d<   t           j        
                    | j        |          |d<   t           j        
                    | j        |          |d<   d
                    |j                  }t          d	|           	 t          ||          }|d
k    rt          j        d           
# t           $ r* t          d|           t          j        d           Y =w xY wd S )NMESON_DIST_ROOTMESON_SOURCE_ROOTMESON_BUILD_ROOT MESON_PROJECT_DIST_ROOTMESON_PROJECT_SOURCE_ROOTMESON_PROJECT_BUILD_ROOT zRunning custom dist script r   zDist script errored outzFailed to run dist script r   )r8   r9   isabsr[   rI   rT   rU   
subprojectrV   getrO   cmd_argsprintr   rF   rG   OSError)r\   envdsubdirnamercs         r(   run_dist_scriptszDist.run_dist_scriptsq   s   w}}T\*****!%#'= "&-" 	 	A| D4D D D%))!,;;F-/W\\$,-O-OC)*/1w||DM6/R/RC+,.0gll4=&.Q.QC*+88AJ''D888999Q__77H6777   ;4;;<<<	 	s   ,*E0FFN)r   r   r^   r_   r   r_   )	__name__
__module____qualname____annotations__r]   abcabstractmethodrb   rw   ra   r)   r(   rR   rR   `   s         NNNMMMMMM1111!!!!C C C C 	        r)   rR   )	metaclassc                  D    e Zd ZddZddZ	 	 dddZddZddZddZd	S ) GitDistdir_r+   r   r   c                    t          ddg|d          d                                         }|st          |          S t          t          |          j                  }t          |          j        |dz
           S )Nz	rev-parsez--show-prefixT)checkr   )r
   stripr   lenparents)r\   r   prefixprefix_levels       r(   git_rootzGitDist.git_root   sq     K94tLLLQOUUWW 	::4<</00Dzz!,"233r)   rA   c                L    t          j        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callrI   )r\   rets     r(   have_dirty_indexzGitDist.have_dirty_index   s*    oudDM<TZ[\\axr)   r   NsrcT.Union[str, os.PathLike]r[   revisionr   T.Optional[str]rt   r   c                   dddd|g}||                     dd| d           ||                    d|g           t          j                    5 }t	          j        |||	           |                    d
           t          j        |          }|	                    |           d d d            d S # 1 swxY w Y   d S )Nr   archivez--formattar   z	--prefix=/z--)cwdstdoutr   )fileobj)r9   )
insertextendtempfileTemporaryFiler   
check_callseektarfiler3   
extractall)	r\   r   r[   r   r   rt   cmdr=   ts	            r(   copy_gitzGitDist.copy_git   s   iUH=JJq/f///000JJf~&&&#%% 	'!#3q9999FF1IIIQ'''ALLgL&&&		' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   AB55B9<B9rI   c                   |                                  rt          t          | j        j                   t
          j                            |          rt          |           | 	                    |          }|
                    |          r+t          j        |           |                     ||           nt          |                              |          }|dz   }t
          j                            |          rt          |           t          j        |           |                     ||t          |                     t          ||                              |           t          |           |                     ||           d S )Nz-tmp)rt   )r   rH   msg_uncommitted_changesrX   r@   r8   r9   existsr   r   samefilemakedirsr   r   relative_tor+   renameprocess_submodules)r\   rI   r[   	repo_rootrt   tmp_distdirs         r(   process_git_projectzGitDist.process_git_project   s\     "" 	P4dl6NOOO7>>'"" 	* )))MM(++	h'' 	.K   MM(G,,,,(^^//	::F!F*Kw~~k** 2$[111K$$$MM)[VMEEEf%%,,W555 ---'22222r)   c                j   t           j                            |d          }t           j                            |          sd S g d}t	          j        ||d                                          }|D ]}|d d         }|dd                              dd          \  }}	|	                    dd          d         }
|dk    rt          j
        d	|
d
           h|dv rt          d	|
d| j        j                   |                     t           j                            ||
          |||
           d S )Nz.gitmodules)r   	submodulestatusz--cachedz--recursiveT)r   universal_newlinesr   rk   r   -z
Submodule z3 is not checked out and cannot be added to the dist>   U+zF has uncommitted changes that will not be included in the dist tarball)r   r   )r8   r9   rO   r   r   check_output
splitlinessplitrsplitr   rD   rH   rX   r@   r   )r\   r   r[   module_filer   modlistr   r   sha1restsubpaths              r(   r   zGitDist.process_submodules   s\   gll366w~~k** 	FGGG)#34PPP[[]]  	^ 	^Irr]F"122,,S!44JD$kk#q))!,G}}h'hhhiii:%% !g!!!  BF  BN  BZ  [  [  [MM"',,sG44gU\M]]]]	^ 	^r)   r^   r_   c                   |                      | j        | j                   | j                                        D ]}t
          j                            | j        |          }t
          j                            | j        |          }t
          j                            |          rlt          |          r|                      ||           t          j        ||           |                                  g }|D ]S}| j        t          |         z   }t          j        | j        || j        | j                   |                    |           Tt%          | j                   |S )N)root_dirbase_dir)r   rI   r[   rV   valuesr8   r9   rO   r   rL   shutilcopytreerw   archive_extensionmake_archiverZ   rS   appendr   )r\   r^   r9   sub_src_rootsub_distdiroutput_namesacompressed_names           r(   rb   zGitDist.create_dist   sF     ===$++-- 	; 	;D7<<t<<L',,t|T::Kw~~k** l## ;(({CCCCk:::: 	1 	1A"l->q-AAOa$-RVR`aaaa0000T\***r)   )r   r+   r   r   r   rA   )r   NN)r   r   r[   r+   r   r+   r   r   rt   r   r   r   )rI   r+   r[   r+   r   r   )r   r+   r[   r+   r   r   rx   )	ry   rz   r{   r   r   r   r   r   rb   ra   r)   r(   r   r      s        4 4 4 4   
 V\KO' ' ' ' '3 3 3 3(^ ^ ^ ^&     r)   r   c                      e Zd ZddZd	dZdS )
HgDistr   rA   c                D    t          j        dd| j        dg          }d|vS )z1Check whether there are uncommitted changes in hghg-Rsummarys   commit: (clean))r   r   rI   )r\   outs     r(   r   zHgDist.have_dirty_index   s(    %tT4=)&LMM!,,r)   r^   r_   c                   |                                  rt          t          | j        j                   | j        rt          j        d           t          j	        | j
        d           t          j                            | j
        | j        dz             }|dz   }|dz   }t          j                            | j
        | j        dz             }t          j        dd	d
| j        dddd| j        dz   |g
           g }d|v rdd l}|                    |d          5 }t%          |d          5 }	t'          j        |	|           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                    |           d|v rt-          j        |d          5 }
t%          |d          5 }	t'          j        |	|
           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                    |           t          j        |           d|v r6t          j        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   rH   r   rX   r@   rU   r   rD   r8   r   rZ   r9   rO   rS   r   r   rI   lzmar3   r   copyfileobjr   gzipunlink)r\   r^   tarnamexznamegznamezipnamer   r   xftfzfs              r(   rb   zHgDist.create_dist   sG     "" 	P4dl6NOOO 	QLOPPP
DMD1111',,t}dnv.EFF55',,t}dnv.EFF 	tYdmT4QV#T]\%A7L 	M 	M 	MhKKK64(( +BWd0C0C +r"2r***+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'''h64(( +BWd0C0C +r"2r***+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'''
	'H!4D$-tUZ\c"deee(((sl   E#*E E#E	E#E	E##E'*E'G&-GG&G	G&G	G&&G*-G*Nr   rx   )ry   rz   r{   r   rb   ra   r)   r(   r   r      s<        - - - -
# # # # # #r)   r   meson_commandr_   unpacked_src_dirbuilddir
installdir
ninja_argsintc                   t          j        | d||gz             dk    rt          d           dS t          j        ||          dk    rt          d           dS t          j        |dgz   |          dk    rt          d           dS t          j                                        }||d	<   t          j        |d
gz   ||          dk    rt          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 failedDESTDIRinstall)r   rr   z*Installing the distribution package failed)r   r   rp   r8   environcopy)r   r   r   r   r   myenvs         r(   run_dist_stepsr     s    }(9;KX'VVWW[\\\<===qzx000A559:::qzVH,(;;;q@@EFFFqJOOE!E)zYK/X5IIIQNN:;;;q1r)   packagenameImmutableListProtocol[str]extra_meson_argsrT   privdirc                j   t          d|             t          j                            |d          }t          j                            |d          }t          j                            |d          }|||fD ]D}t          j                            |          rt          |           t          j        |           Et                      }	t          j	        | |           t          t          j                            |d                    }
t          |
          dk    sJ |
d         }|dgz  }|t          |          z  }||z  }t          |||||	          }|dk    rt          d	|            n@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)rp   r8   r9   rO   r   r   mkdirr   r   unpack_archiver   r   create_cmdline_argsr   )r   r   r   rT   r   	unpackdirr   r   pr   unpacked_filesr   r   s                r(   
check_distr    s   	
7+
7
7888Wm44Iw||G\22Hg~66J:.  7>>! 	$ ###
J
+y111"',,y#6677N~!####%a(gYM(222M%%M
(8(JPZ
[
[C
Qww:::;;;;Y'''X&&&Z(((:k:::;;;Jr)   c                ^   t          j                    }t          |           |                    g           }t	          j        |           t	          j        | |           |j                            t          d          d           t          j        t	          j        |                    S )Nbackendrg   )argparseArgumentParsermsetup_argparse
parse_argsr   parse_cmd_line_optionsread_cmd_line_filecmd_line_optionspopr   shlexr   format_cmd_line_options)rT   r   argss      r(   r   r   :  s    $&&FFR  D#D)))$///i	22B777;x7==>>>r)   rX   rW   c                   g }| j                             d          D ]@}|t          vr t          j        d| dt           d           |                    |           At          |          dk    rt          j        d           |S )N,zValue "z" not one of permitted values .r   zNo archive types specified.)formatsr   archive_choicesrF   rG   r   r   )rX   resultis      r(   determine_archives_to_generater  C  s    F_""3''  O##HRqRRRRRSSSa
1vv{{.///Mr)   c                   t          | j                  dz  dz  }|                                st          d| j        d          t	          j        | j                  }t          j        d|j        j	        
                    t          d                              }t          |           ddlm} |j        j        }|j        j        }t"          j                            |d          }|j        d	z   |j        z   }t-          |           }	i }
g }| j        rt"          j                            ||j                  }|j        D ]?}t5          j        ||          }t"          j                            |j        |          |
|<   @|                    d
           t;          |          rt<          }n;t?          |          r|
rtA          d           dS tB          }ntA          d           dS  |||||j"        |
|           }|#                    |	          }|dS d}| j$        s!tK          |d          |            |||          }|dk    r$|D ]!}tM          |           tA          d|           "|S )Nzmeson-privatez	build.datz
Directory z- does not seem to be a Meson build directory.rA   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_dirr8   r9   rO   project_nameproject_versionr  include_subprojectssubproject_dirrV   r   get_directoryr   rL   r   rP   rp   r   rU   rb   no_testsr  r>   )rX   	buildfileb
need_vsenvr  rI   rT   priv_dirrS   r^   rV   r   r)  sub	directoryclsprojectnamesrv   ru   s                       r(   runr5  M  s   WZ  ?2[@I ge'*eeefff
7:A 6 A A)GBTBT U UVVJ
 655555}'H}&Hw||Ho66H$q'88I-g66HK" :h0@AA= 	I 	IC*>3??I!w||A,<iHHK 8999 h 		x  	WXXX1EFFFqc)XxgVVG))E}q	
B ]a"3"3"5"57GS[\\	Qww 	# 	#D)T""""Ir)   )r   r   r   r   )r*   r+   r   r   )r?   r+   r@   rA   r   r   )rI   r+   r   rA   )r   r_   r   r+   r   r+   r   r+   r   r_   r   r   )r   r+   r   r   r   r_   rT   r+   r   r+   r   r   )rT   r+   r   r_   )rX   rW   r   r_   )rX   rW   r   r   )=
__future__r   r}   r  r   r8   rF   r  r   r   r   r   r0   typingr  dataclassesr   r   pathlibr   mesonbuild.environmentr   r#  r   r	   r
   r   r   r   mesonbuild.msetupr   r  mesonbuild.wrapr   
mesonbuildr   r   r   scripts.meson_exer   TYPE_CHECKING_typingr   mesonlibr   r  r   r>   r   rH   rL   rP   ABCMetarR   r   r   r   r  r   r  r5  ra   r)   r(   <module>rC     s[   # " " " " " 


   				 



              ! ! ! ! ! !             / / / / / /O O O O O O O O O O O O O O O O > > > > > >             , , , , , , , , , , & & & & & &? 2......111111+++''"$ $ 
J 
J 
J 
JK K K K m    R R R R8 8 8 8 % % % % %S[ % % % %PU U U U Ud U U Up) ) ) ) )T ) ) )X   "   8? ? ? ?   4 4 4 4 4 4r)   