
    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jP                  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jh                               Z5 G d de5      Z6 G d de5      Z7d)d Z8d*d!Z9d+d"Z:d,d#Z;d-d$Z<y).    )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.zipc                    | j                  ddt        d       | j                  ddd       | j                  d	d
d       | j                  ddd       | j                  ddd       y )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	   )parsers    2/usr/lib/python3/dist-packages/mesonbuild/mdist.pyr   r   5   s    
4B  D
W  Y
Wy  {
/d  f
\H  J    c           	     f   | dz   }t        j                         }|j                  t        | d      j	                                t        |dd      5 }|j                  dj                  |j                         t        j                  j                  |                    d d d        y # 1 sw Y   y xY w)Nz
.sha256sumrbwzutf-8)encodingz{} *{}
)hashlibsha256updateopenreadwriteformat	hexdigestospathbasename)fnamehashnamemfs       r%   create_hashr:   B   s    |#HAHHT%##%&	hg	. K! 	

!!!++-1A1A%1HIJK K Ks   AB''B0zPRepository has uncommitted changes that will not be included in the dist tarballc                    |rt        j                  |        y t        j                  | dz   dz          t        j                  d       y )N
z:Use --allow-dirty to ignore the warning and proceed anywayr   )r   warningerrorsysexit)msgallow_dirtys     r%   handle_dirty_optrC   N   s2    S

3: \\]r&   c                $    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
   src_roots    r%   is_gitrG   U   s    
 CXNqQQr&   c                |    t         j                  j                  t         j                  j                  | d            S )Nz.hg)r3   r4   isdirjoinrE   s    r%   is_hgrK   \   s$    77==h6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y)Diststr	dist_namerF   bld_rootzT.List[ExecutableSerialisation]dist_scriptszT.Dict[str, str]subprojectsargparse.Namespaceoptionsc                    t         j                  j                  | j                  d      | _        t         j                  j                  | j                  | j
                        | _        y )Nz
meson-dist)r3   r4   rJ   rP   dist_subrO   distdir)selfs    r%   __post_init__zDist.__post_init__i   s:    T]]LAww||DMM4>>Br&   c                     y )N )rX   archivess     r%   create_distzDist.create_distm   s    r&   c                   t         j                  j                  | j                        sJ i }| j                  |d<   | j                  |d<   | j
                  |d<   | j                  D ]%  }|j                  r|j                  | j                  vr)| j                  j                  |j                  d      }t         j                  j                  | j                  |      |d<   t         j                  j                  | j                  |      |d<   t         j                  j                  | j
                  |      |d<   dj                  |j                        }t        d	|       	 t        ||      }|d
k7  rt        j                  d       ( y # t         $ r' t        d|       t        j                  d       Y Yw xY w)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   )r3   r4   isabsrW   rF   rP   rQ   
subprojectrR   getrJ   cmd_argsprintr   r?   r@   OSError)rX   envdsubdirnamercs         r%   run_dist_scriptszDist.run_dist_scriptsq   sg   ww}}T\\***!%#'== "&--"" 	A||D4D4D D%%))!,,;F-/WW\\$,,-OC)*/1ww||DMM6/RC+,.0ggll4==&.QC*+88AJJ'D/x89Q_7HH67	  24(;<s   '&F,G GN)returnNoner\   T.List[str]rs   rv   )	__name__
__module____qualname____annotations__rY   abcabstractmethodr]   rr   r[   r&   r%   rM   rM   `   sH    NMM11!!C 	 r&   rM   )	metaclassc                  L    e Zd ZddZd	dZ	 	 d
	 	 	 	 	 ddZddZddZddZy)GitDistc                    t        ddg|d      d   j                         }|st        |      S t        t        |      j                        }t        |      j                  |dz
     S )Nz	rev-parsez--show-prefixT)checkr   )r
   stripr   lenparents)rX   dir_prefixprefix_levels       r%   git_rootzGitDist.git_root   s`     K94tLQOUUW:4<//0Dz!!,"233r&   c                V    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callrF   )rX   rets     r%   have_dirty_indexzGitDist.have_dirty_index   s+    ooudDMM<TZ[\axr&   Nc                `   dddd|g}||j                  dd| d       ||j                  d|g       t        j                         5 }t	        j
                  |||	       |j                  d
       t        j                  |      }|j                  |       d d d        y # 1 sw Y   y xY w)Nr   archivez--formattar   z	--prefix=/z--)cwdstdoutr   )fileobj)r4   )
insertextendtempfileTemporaryFiler   
check_callseektarfiler.   
extractall)	rX   srcrW   revisionr   ro   cmdr9   ts	            r%   copy_gitzGitDist.copy_git   s    iUH=JJqIfXQ/0JJf~&##% 	'!!#3q9FF1IQ'ALLgL&		' 	' 	's   	AB$$B-c                   | j                         r$t        t        | j                  j                         t
        j                  j                  |      rt        |       | j                  |      }|j                  |      r(t        j                  |       | j                  ||       nt        |      j                  |      }|dz   }t
        j                  j                  |      rt        |       t        j                  |       | j                  ||t        |             t        ||      j!                  |       t        |       | j#                  ||       y )Nz-tmp)ro   )r   rC   msg_uncommitted_changesrT   rB   r3   r4   existsr   r   samefilemakedirsr   r   relative_torN   renameprocess_submodules)rX   rF   rW   	repo_rootro   tmp_distdirs         r%   process_git_projectzGitDist.process_git_project   s      "4dll6N6NO77>>'" )MM(+	h'KK MM(G,(^//	:F!F*Kww~~k*$[1KK$MM)[VMEf%,,W5 -'2r&   c                >   t         j                  j                  |d      }t         j                  j                  |      sy g d}t	        j
                  ||d      j                         }|D ]  }|d d }|dd  j                  dd      \  }}	|	j                  dd      d   }
|dk(  rt        j                  d	|
d
       T|dv r$t        d	|
d| j                  j                         | j                  t         j                  j                  ||
      |||
        y )Nz.gitmodules)r   	submodulestatusz--cachedz--recursiveT)r   universal_newlinesr   rf   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   )r3   r4   rJ   r   r   check_output
splitlinessplitrsplitr   r=   rC   rT   rB   r   )rX   r   rW   module_filer   modlistr   r   sha1restsubpaths              r%   r   zGitDist.process_submodules   s   ggll36ww~~k*G))#34P[[]  	^Ir]F"12,,S!4JD$kk#q)!,G}z'4ghi:% :g[8~!  BF  BN  BN  BZ  BZ  [MM"'',,sG4gU\M]	^r&   c                   | j                  | j                  | j                         | j                  j	                         D ]  }t
        j                  j                  | j                  |      }t
        j                  j                  | j                  |      }t
        j                  j                  |      rwt        |      r| j                  ||       t        j                  ||        | j                          g }|D ]`  }| j                  t        |   z   }t        j                  | j                  || j                  | j                          |j#                  |       b t%        | j                         |S )N)root_dirbase_dir)r   rF   rW   rR   valuesr3   r4   rJ   r   rG   shutilcopytreerr   archive_extensionmake_archiverV   rO   appendr   )rX   r\   r4   sub_src_rootsub_distdiroutput_namesacompressed_names           r%   r]   zGitDist.create_dist   s     =$$++- 	;D77<<t<L'',,t||T:Kww~~k*l#(({Ck:	; 	 	1A"ll->q-AAOa$--RVR`R`a0	1 	T\\*r&   )r   rN   rs   r   rs   bool)r   NN)r   zT.Union[str, os.PathLike]rW   rN   r   rN   r   T.Optional[str]ro   r   rs   rt   )rF   rN   rW   rN   rs   rt   )r   rN   rW   rN   rs   rt   ru   )	rw   rx   ry   r   r   r   r   r   r]   r[   r&   r%   r   r      sC    4
 V\KO'('9H'TX'3(^&r&   r   c                      e Zd ZddZddZy)HgDistc                P    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   rF   )rX   outs     r%   r   zHgDist.have_dirty_index   s*    %%tT4==)&LM!,,r&   c                   | j                         r$t        t        | j                  j                         | j
                  rt        j                  d       t        j                  | j                  d       t        j                  j                  | j                  | j                  dz         }|dz   }|dz   }t        j                  j                  | j                  | j                  dz         }t        j                  dd	d
| j                   dddd| j                   dz   |g
       g }d|v r[dd l}|j%                  |d      5 }t%        |d      5 }	t'        j(                  |	|       d d d        d d d        |j+                  |       d|v r[t-        j$                  |d      5 }
t%        |d      5 }	t'        j(                  |	|
       d d d        d d d        |j+                  |       t        j.                  |       d|v r8t        j                  dd	d
| j                   ddd|g       |j+                  |       |S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)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   rT   rB   rQ   r   r=   r3   r   rV   r4   rJ   rO   r   r   rF   lzmar.   r   copyfileobjr   gzipunlink)rX   r\   tarnamexznamegznamezipnamer   r   xftfzfs              r%   r]   zHgDist.create_dist   s     "4dll6N6NOLLOP
DMMD1'',,t}}dnnv.EF55'',,t}}dnnv.EF 	tYdmmT4QV#T]]\%A7L 	Mh64( +BWd0C +r""2r*+ +'h64( +BWd0C +r""2r*+ +'
		'H!!4D$--tUZ\c"de(+ + + ++ + + +sH   IH8%I I-II8I	=III	II%Nr   ru   )rw   rx   ry   r   r]   r[   r&   r%   r   r      s    -
#r&   r   c                   t        j                  | d||gz         dk7  rt        d       yt        j                  ||      dk7  rt        d       yt        j                  |dgz   |      dk7  rt        d       yt        j                  j                         }||d	<   t        j                  |d
gz   ||      dk7  rt        d       yy)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   rm   z*Installing the distribution package failed)r   r   rk   r3   environcopy)meson_commandunpacked_src_dirbuilddir
installdir
ninja_argsmyenvs         r%   run_dist_stepsr     s    }(9;KX'VVW[\\<=zx0A59:zVH,(;q@EFJJOOE!E)zYK/X5IQN:;r&   c                
   t        d|         t        j                  j                  |d      }t        j                  j                  |d      }t        j                  j                  |d      }|||fD ]A  }t        j                  j	                  |      rt        |       t        j                  |       C t               }	t        j                  | |       t        t        j                  j                  |d            }
t        |
      dk(  sJ |
d   }|dgz  }|t        |      z  }||z  }t        |||||	      }|dkD  rt        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   r3   r4   rJ   r   r   mkdirr   r   unpack_archiver   r   create_cmdline_argsr   )packagenamer   extra_meson_argsrP   privdir	unpackdirr   r   pr   unpacked_filesr   r   s                r%   
check_distr     sa   	)+
78Wm4Iww||G\2Hg~6J:. 77>>! #
 J
+y1"'',,y#67N~!###%a(gYM(22M%%M
(8(JPZ
[C
Qw/z:; J	 	Y'X&Z(%k]':;Jr&   c                R   t        j                         }t        |       |j                  g       }t	        j
                  |       t	        j                  | |       |j                  j                  t        d      d       t        j                  t	        j                  |            S )Nbackendrb   )argparseArgumentParsermsetup_argparse
parse_argsr   parse_cmd_line_optionsread_cmd_line_filecmd_line_optionspopr   shlexr   format_cmd_line_options)rP   r$   argss      r%   r   r   :  s{    $$&FFR D##D)$/i	2B7;;x77=>>r&   c                   g }| j                   j                  d      D ];  }|t        vr t        j                  d| dt         d       |j                  |       = t              dk(  rt        j                  d       |S )N,zValue "z" not one of permitted values .r   zNo archive types specified.)formatsr   archive_choicesr?   r@   r   r   )rT   resultis      r%   determine_archives_to_generater  C  sv    F__""3' O#HHwqc!??PPQRSa 1v{./Mr&   c                   t        | j                        dz  dz  }|j                         st        d| j                  d      t	        j
                  | j                        }t        j                  d|j                  j                  j                  t        d                  }t        |       ddlm} |j                  j                  }|j                  j                   }t"        j$                  j'                  |d      }|j(                  d	z   |j*                  z   }t-        |       }	i }
g }| j.                  rt"        j$                  j'                  ||j0                        }|j2                  D ]E  }t5        j6                  ||      }t"        j$                  j'                  |j0                  |      |
|<   G |j9                  d
       t;        |      rt<        }n,t?        |      r|
rtA        d       ytB        }ntA        d       y |||||jD                  |
|       }|jG                  |	      }|yd}| jH                  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.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_dirr3   r4   rJ   project_nameproject_versionr  include_subprojectssubproject_dirrR   r   get_directoryr   rG   r   rK   rk   r   rQ   r]   no_testsr   r:   )rT   	buildfileb
need_vsenvr  rF   rP   priv_dirrO   r\   rR   r   r%  sub	directoryclsprojectnamesrq   rp   s                       r%   runr1  M  s!   WZZ ?2[@Iz'**7deff

7::A 6 6 A A)GBT UVJ
 6}}''H}}&&Hww||Ho6H$q'8'88I-g6HK""h0@0@A== 	IC**>3?I!ww||A,<,<iHK	I 	 89 h	xWXEF)XxgVG)E}	
Ba"3"57GS[\	Qw 	#D)T"	# Ir&   )r$   zargparse.ArgumentParserrs   rt   )r6   rN   rs   rt   )rA   rN   rB   r   rs   rt   )rF   rN   rs   r   )r   rv   r   rN   r   rN   r   rN   r   rv   rs   int)r   rN   r   zImmutableListProtocol[str]r   rv   rP   rN   r   rN   rs   r2  )rP   rN   rs   rv   )rT   rS   rs   rv   )rT   rS   rs   r2  )=
__future__r   r{   r  r   r3   r?   r
  r   r   r   r   r+   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   rC   rG   rK   ABCMetarM   r   r   r   r   r   r  r1  r[   r&   r%   <module>r@     s    #    	 
        !   /O O >   , , &??.1+''"$ 
JK m R8 %S[[ % %PUd Up)T )X"8?4r&   