o
    uJAfؘ                     @  s*  d dl mZ ddlmZ d dlZ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Zd dlZd dlZd dlmZ d dlmZ d dlmZ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  ej*rd dl+Z,d dl-m.Z. e.d Z/zd dl0Z0dZ1W n e2y   dZ1Y nw dZ3dZ4g dZ5e6dZ7dIddZ8dJdKd#d$Z9dLd&d'Z:dMd)d*Z;dNd0d1Z<dOd4d5Z=G d6d7 d7e$Z>G d8d9 d9e>Z?G d:d; d;Z@dPd>d?ZAdQdRdDdEZBeddFG dGdH dHZCdS )S    )annotations   )mlogN)	dataclass)	b64encode)netrc)PathPurePath   )WrapMode)coredata)	quiet_gitGITProgressBarMesonExceptionwindows_proof_rmtree
Popen_safe)
FeatureNew)
SubProject)mesonlib)LiteralmesoncmakecargoTFg      >@wrapdb.mesonbuild.com)filegithgsvnpatchurlstrstrreturnurllib.parse.ParseResultc                 C  sZ   t j| }|jst|  d|jtst|  dtr+|jdks+td|  |S )z3 raises WrapException if not whitelisted subdomain z is not a valid URLz  is not a whitelisted WrapDB URLhttpsz8WrapDB did not have expected SSL https url, instead got )	urllibparseurlparsehostnameWrapExceptionendswithWHITELIST_SUBDOMAINhas_sslscheme)r!   url r0   9/usr/lib/python3.10/site-packages/mesonbuild/wrap/wrap.pywhitelist_wrapdbC   s   r2   	urlstringallow_insecureboolhave_opt'http.client.HTTPResponse'c              
   C  sF  |rd}nd}t | }trZztdtjjtj|t	dW S  tj
jyY } z-d|  d| d}t|jtjrK|rCt| d nt| | t|W Y d }~nd }~ww |sgtd	tj d
| tjd	tj ddd |jdd}ztdtjjtj|t	dW S  tj
jy } z
td|  d| d }~ww )Nz:

    To allow connecting anyway, pass `--allow-insecure`. zhttp.client.HTTPResponsetimeoutzWrapDB connection failed to z with error .z(

    Proceeding without authentication.zSSL module not available in z: Cannot contact the WrapDB.z#: WrapDB traffic not authenticated.T)oncehttp)r.   )r2   r-   Tcastr&   requesturlopenr'   
urlunparseREQ_TIMEOUTerrorURLError
isinstancereasonsslZSSLCertVerificationErrorr   warningr*   sys
executable_replace)r3   r4   r6   Zinsecure_msgr/   excpmsgZ	nossl_urlr0   r0   r1   open_wrapdburlN   s6   "	"rO   bytesc                 C  s   t d| d}| S )Nz.https://wrapdb.mesonbuild.com/v2/releases.jsonT)rO   read)r4   r/   r0   r0   r1   get_releases_datan   s   rR   T.Dict[str, T.Any]c                 C  s   t | }tdt| S )NrS   )rR   r>   r?   jsonloadsdecode)r4   datar0   r0   r1   get_releasesr   s   rX   wrapfilenamenew_versionnew_revisionNonec              
   C  sd   t d| d| d| d| d	|d}t| d}||  W d    d S 1 s+w   Y  d S )N!https://wrapdb.mesonbuild.com/v2/_-/.wrapTwb)rO   openwriterQ   )rY   rZ   r[   r\   r4   r/   fr0   r0   r1   update_wrap_filev   s   "rg   	patch_urlT.Tuple[str, str]c                 C  s   t j| }|jdkrtd|  d|jdd}|d dkr*|d |d fS |d d	krH|d }|d
d\}}|dd\}}||fS td|  )Nr   zURL z$ does not seems to be a wrapdb patchra   r   v1v2r_   r
   r`   zInvalid wrapdb URL )	r&   r'   r(   netlocr*   pathstripsplitrsplit)rh   uarrtagr_   versionrevisionr0   r0   r1   parse_patch_url|   s   
rx   c                   @     e Zd ZdS )r*   N__name__
__module____qualname__r0   r0   r0   r1   r*          r*   c                   @  ry   )WrapNotFoundExceptionNrz   r0   r0   r0   r1   r      r~   r   c                   @  sT   e Zd ZddddZdd	d
ZdddZdddZdddZdddZd ddZ	dS )!PackageDefinitionr8   fnamer"   
subprojectc                 C  s>  || _ t|| _d | _i | _i | _g | _g | _tj	
|| _
| j
d| _| jr/| j
d d n| j
| _d | j| j < || _d| _| jrl|   t|ddd}t| d | _W d    n1 sgw   Y  | jd| j| _tj	| jrtd| jr| jtvrtd	| jtj	tj	| j d
| _d S )Nrb   Frutf-8encoding	directoryz+Directory key must be a name and not a pathUnknown wrap type packagefiles) filenamer   r   typevaluesprovided_depsprovided_programs
diff_filesosro   basenamer+   has_wraprZ   lowerZoriginal_filename
redirected
parse_wraprd   hashlibsha256rQ   encode	hexdigestwrapfile_hashgetr   dirnamer*   	ALL_TYPESjoinfilesdir)selfr   r   r   r0   r0   r1   __init__   s0   
zPackageDefinition.__init__r#   r]   c              
   C  s|  zt jd d}|j| jdd W n t jy( } ztd| j d|d }~ww | | | jdkrt	| jj
}t	| jd }t|jD ]\}}|d d	krX|d
krWtdqE|dkr`tdqE|jdkrjtd|| }| sztd| dt|| _|   d| _n| | d| jv rtdd| j dD ]}| d| jv r| d| jvrtd| dd| j qd S )N)interpolationr   r   zFailed to parse z: Zredirectr   r   r   ..z*wrap-redirect filename cannot contain ".."subprojectszCwrap-redirect filename must be in the form foo/subprojects/bar.wraprb   z+wrap-redirect filename must be a .wrap filezwrap-redirect z filename does not existTpatch_directoryzWrap files with patch_directoryz0.55.0)r    source	_filename_urlzLocal wrap patch files without )configparserConfigParserrQ   r   Errorr*   r   parse_wrap_sectionr   r   parentr   	enumeratepartssuffixis_filer"   r   r   parse_provide_sectionr   user   )r   configer   r   ipwhatr0   r0   r1   r      sF   





 zPackageDefinition.parse_wrapr   configparser.ConfigParserc                 C  s   t | dk rtd| j | d | _| jds(t| jd| j | jdd  | _t|| j | _d| jv rnt	dd	
| j | jd d
D ]!}t| }| r^tdd|jv rgtd| j| qNd S d S )Nr
   zMissing sections in r   zwrap-z! is not a valid first section in    r   zWrap files with diff_filesz0.63.0,z#diff_files paths cannot be absoluter   z$diff_files paths cannot contain "..")lensectionsr*   r   Zwrap_section
startswithr   dictr   r   r   r   rq   r   rp   is_absoluter   r   append)r   r   sro   r0   r0   r1   r      s$   

z$PackageDefinition.parse_wrap_sectionc                 C  s   | dr	td| drY|d  D ]F\}}|dkr-dd |dD }| j| q|dkrCd	d
 |dD }|  j|7  _q|sSd|d| j d}t||| j|< qd S d S )NZprovidesz:Unexpected "[provides]" section, did you mean "[provide]"?Zprovidedependency_namesc                 S  s   i | ]	}|   d qS N)rp   r   .0nr0   r0   r1   
<dictcomp>   s    z;PackageDefinition.parse_provide_section.<locals>.<dictcomp>r   program_namesc                 S  s   g | ]}|  qS r0   )rp   r   r0   r0   r1   
<listcomp>   s    z;PackageDefinition.parse_provide_section.<locals>.<listcomp>z#Empty dependency variable name for  in zk. If the subproject uses meson.override_dependency() it can be added in the "dependency_names" special key.)has_sectionr*   itemsrq   r   updater   r   )r   r   kvZ
names_dictZ
names_listmr0   r0   r1   r      s$   

z'PackageDefinition.parse_provide_sectionkeyc                 C  s2   z| j | W S  ty   td|d| j w )NzMissing key r   )r   KeyErrorr*   r   )r   r   r0   r0   r1   r      s
   zPackageDefinition.getsubproject_directoryc                 C  s   t j|dS )Nz.meson-subproject-wrap-hash.txt)r   ro   r   )r   r   r0   r0   r1   get_hashfile  s   zPackageDefinition.get_hashfilec                 C  sT   | j r(t| |ddd}|| jd  W d    d S 1 s!w   Y  d S d S )Nwr   r   
)r   rd   r   re   r   )r   r   r   r0   r0   r1   update_hash_cache  s
   "z#PackageDefinition.update_hash_cacheN)r8   )r   r"   r   r"   r#   r]   )r   r   r#   r]   )r   r"   r#   r"   )r   r"   r#   r"   )r   r"   r#   r]   )
r{   r|   r}   r   r   r   r   r   r   r   r0   r0   r0   r1   r      s    

$


r   subdir_rootpackagenamec                 C  s0   t j| |d }t j|rt|}|jS |S )Nrb   )r   ro   r   isfiler   r   )r   r   r   wrapr0   r0   r1   get_directory  s
   r   cmdT.List[str]
workingdircheckc              
   C  s:   z	t j| ||dW S  t jy } ztt|d}~ww )zQ
    Wrapper to convert GitException to WrapException caught in interpreter.
    r   N)r   verbose_gitGitExceptionr*   r"   )r   r   r   r   r0   r0   r1   r     s   r   )eqc                   @  sz  e Zd ZU ded< ded< dZded< ejZded< dZd	ed
< dZ	d	ed< dZ
d	ed< dcddZdcddZdcddZddddZdcddZdeddZdfd d!Zdgd$d%Zdhd(d)Zdid,d-Zdjdkd2d3Zdcd4d5Zdld6d7Zdcd8d9Zdcd:d;Zdcd<d=Zdmd?d@ZdcdAdBZdcdCdDZdndGdHZdodKdLZdpdqdQdRZ dodSdTZ!drdsdWdXZ"dtdYdZZ#dcd[d\Z$dcd]d^Z%dudadbZ&d.S )vResolverr"   
source_dirsubdirr8   r   r   	wrap_modeFr5   wrap_frontendr4   silentr#   r]   c                 C  sx   t j| j| j| _t jdpt j| jd| _i | _	d | _
i | _i | _i | _i | _i | _|   |   |   d S )NZMESON_PACKAGE_CACHE_DIRpackagecache)r   ro   r   r   r   r   environr   cachedirwrapsr   r   r   wrapdbwrapdb_provided_depswrapdb_provided_programs
load_wraps
load_netrcload_wrapdb)r   r0   r0   r1   __post_init__%  s   zResolver.__post_init__c              
   C  s^   zt  | _ W d S  ty   Y d S  ty. } ztjd| ddd W Y d }~d S d }~ww )Nzfailed to process netrc file: r;   Ffatal)r   FileNotFoundError	Exceptionr   rI   )r   r   r0   r0   r1   r   3  s   $zResolver.load_netrcc                 C  s   t j| js	d S tt | j\}}}ddh}|D ]$}|ds"qt j| j|}t|| j	}|| j
|j< ||j|jhO }q|D ]}||v rHqAt j| j|}t|| j	}|| j
|j< qA| j
 D ]}| | qbd S )Nr   r   rb   )r   ro   isdirr   nextwalkr+   r   r   r   r   rZ   r   r   add_wrap)r   rootdirsfilesZignore_dirsr   r   r   r0   r0   r1   r   ;  s(   
zResolver.load_wrapsr   r   c                 C  s   |j  D ]"}|| j v r"| j | }d|d|j d|j }t||| j |< q|jD ]"}|| jv rH| j| }d|d|j d|j }t||| j|< q+d S )NzMultiple wrap files provide z dependency: z and z
 program: )r   keysr   r*   r   )r   r   r   Z	prev_wrapr   r0   r0   r1   r   R  s   




zResolver.add_wrapc                   s   z#t | jdjddd}t|| _W d    n1 sw   Y  W n
 ty-   Y d S w | j D ]&\ }| j	 fdd|
dg D  | j	 fdd|
d	g D  q3d S )
Nzwrapdb.jsonr   r   r   c                      i | ]}| qS r0   r0   r   r   rZ   r0   r1   r   g      z(Resolver.load_wrapdb.<locals>.<dictcomp>r   c                   r  r0   r0   r  r  r0   r1   r   h  r  r   )r   r   rd   rT   loadr   r   r   r   r   r   r   )r   rf   infor0   r  r1   r   `  s   "$zResolver.load_wrapdb	subp_namec           
      C  s   | j |}|s
d S |   |d d }|dd\}}tjd| d| d| d| d	}t| j| d}|	d	}|
|  W d    n1 sOw   Y  td
| d| d|  tt|}	|	| j|	j< | |	 |	S )Nversionsr   r`   r
   r^   r_   ra   rb   rc   z
Installed z	 version z
 revision )r   r   check_can_downloadrr   r&   r@   rA   r   r   rd   re   rQ   r   logr   r"   r   rZ   r   )
r   r  r
  Zlatest_versionrv   rw   r/   r   rf   r   r0   r0   r1   get_from_wrapdbj  s    &
zResolver.get_from_wrapdbother_resolver
'Resolver'c                 C  sj   |j  D ]\}}| j || q|j D ]\}}| j|| q|j D ]\}}| j|| q'd S r   )r   r   
setdefaultr   r   )r   r  r   r   r0   r0   r1   merge_wraps{  s   zResolver.merge_wrapsr   )T.Tuple[T.Optional[str], T.Optional[str]]c                 C  sB   |  }| j|}|r|j|}|j|fS | j|}|d fS r   )r   r   r   rZ   r   )r   r   r   Zdep_var	wrap_namer0   r0   r1   find_dep_provider  s   
zResolver.find_dep_providerdepnameT.Optional[str]c                 C  s    | j |}|r|j|S d S r   )r   r   r   )r   r  r  r   r0   r0   r1   get_varname  s   zResolver.get_varnamenamesr   c                 C  s@   |D ]}| j |}|r|j  S | j|}|r|  S qd S r   )r   r   rZ   r   )r   r  rZ   r   r  r0   r0   r1   find_program_provider  s   
zResolver.find_program_providerNforce_methodT.Optional[Method]T.Tuple[str, Method]c                   sB  |_ |_j|_js|_js$dj  d}t|jj_jjrtj	
tj	jjjj_tj	jsNtj	
jj_tj	
jjj}jj|krtj	jjj}tdt| t|ddd }|tdttj	jjj  d W d    n1 sw   Y  njj_tj	jj}d	d
ddtdjjd|  r؈ vrd
 }td d| |r |krtd d|  pd d! fdd}	|	 r   | fS !  tj	jrtj	"jstdnntj	
j#j}
tj	"|
r2$|
j n=jj%dkr>&  n1'  jj%dkrN(  n!jj%dkrZ)  njj%dkrf*  n	tdjj%z
+  ,  W n t-y   t.j  w |	 std   d j/j | fS )"Nz%Neither a subproject directory nor a z.wrap file was found.Usingr   r   r   zK                        [wrap-redirect]
                        filename = z
                        zmeson.buildzCMakeLists.txtz
Cargo.tomlr   r  methodz, zWrap method z# is not supported, must be one of: zWrap method is z( but we are trying to configure it with r   r#   r5   c                     s   t jt jj  S r   )r   ro   existsr   r   r0   r   methods_mapr   r0   r1   has_buildfile  s   z'Resolver.resolve.<locals>.has_buildfilez*Path already exists but is not a directoryr   r   r   r   r   zSubproject exists but has no z file.r#   r5   )0r   r   r   r   r   r  r   r   r   ro   r   r   r   r!  r   r   relpathr   r   r  boldrd   re   textwrapdedentr	   as_posixr>   r?   r   r  r*   validateresolve_git_submoduler   r   	copy_treer   get_filer  get_gitget_hgget_svnapply_patchapply_diff_filesr   r   r   )r   r   r  r   Z
main_fnamerelrf   Zrel_pathZallowed_methodsr$  Zcached_directoryr0   r"  r1   resolve  s   
 







zResolver.resolvec                 C  s   | j tju rd}t|d S )Nz7Automatic wrap-based subproject downloading is disabled)r   r   
nodownloadr*   )r   r   r0   r0   r1   r    s   zResolver.check_can_downloadc                 C  s   t sdS tj| jsdS tdgt| jj\}}|sdS tg d| j\}}|s+dS |dr7t	
d dS |dr@td|d	rStg d
| jrOdS td|drjtg d| j tddg| j dS |dkrpdS td|)NFz	rev-parse)	submodulestatusr;   +z"git submodule might be out of dateTUz!git submodule has merge conflictsr`   )r7  r   --initr;   zgit submodule failed to init )r7  r   r;   checkoutr;   r8   zUnknown git submodule output: )r   r   ro   r   r   r   r   r   r   r   rI   r*   r   )r   retoutr0   r0   r1   r,    s4   




zResolver.resolve_git_submodulec              
   C  sn   |  d}| j}d| jjv rt| j | j}z	t|| W d S  t	y6 } z
t
dt| |d }~ww )Nr   Zlead_directory_missingz%failed to unpack archive with error: )get_file_internalr   r   r   r   mkdirr   shutilunpack_archiveOSErrorr*   r"   )r   ro   extract_dirr   r0   r0   r1   r.  5  s   
zResolver.get_filec                 C  s
  t std| j d| jd}ddd|dg}d}g }| jjd	d
d
kr1d}d| jjd	g}|rs| |rstddd| jg| j	dd tddd| jdg| j
dd | jd}tdg|d|| j
dd t|| j
dd n\|std| jd| jg| j	dd | dkrt|| j
std| jd|g| j
dd t|| j
dd n&dddg|}| dkr|d|g7 }|| jd| jg7 }t|| j	dd | jjdd
 dkrtdddddg|| j
dd | jjd}|rtdd d!d|g| j
dd d S d S )"Nz'Git program not found, cannot download z.wrap via git.rw   z-czadvice.detachedHead=falser=  z--Fdepthr8   Tz--depthz%init.defaultBranch=meson-dummy-branchinitr   Zremoteaddoriginr/   fetchcloneheadz--branchzclone-recursivetruer7  r   r;  z
--checkoutz--recursivezpush-urlzset-urlz--push)r   r*   r   r   r   r   is_git_full_commit_idr   r   r   r   r   )r   revnoZcheckout_cmdZ
is_shallowZdepth_optionargsZpush_urlr0   r0   r1   r/  B  sF     zResolver.get_gitc                 C  s   | j jsd S | j | j}tj|r1t|ddd}| 	 }W d    n1 s+w   Y  nd S | j j
}||krHtd| j j d d S d S )Nr   r   r   zSubproject zW's revision may be out of date; its wrap file has changed since it was first configured)r   r   r   r   r   ro   r   rd   rQ   rp   r   r   rI   rZ   )r   Zhashfiler   Zexpected_hashZactual_hashr0   r0   r1   r+  i  s   zResolver.validaterO  c                 C  s&   d}t |dv rtdd |D }|S )NF>   (   @   c                 s  s    | ]}|d v V  qdS )Z0123456789AaBbCcDdEeFfNr0   )r   chr0   r0   r1   	<genexpr>  s    z1Resolver.is_git_full_commit_id.<locals>.<genexpr>)r   all)r   rO  resultr0   r0   r1   rN  }  s   zResolver.is_git_full_commit_idc                 C  sn   | j d}td}|stdtj|d| j d| jg| jd |	 dkr5tj|d|g| j
d d S d S )	Nrw   r   zMercurial program not found.rK  r/   cwdZtipr=  )r   r   rB  whichr*   
subprocess
check_callr   r   r   r   )r   rO  r   r0   r0   r1   r0    s   

zResolver.get_hgc                 C  sL   | j d}td}|stdtj|dd|| j d| jg| jd d S )Nrw   r   zSVN program not found.r=  z-rr/   rW  )	r   r   rB  rY  r*   rZ  r[  r   r   )r   rO  r   r0   r0   r1   r1    s   

zResolver.get_svnrn   T.Optional[T.Tuple[str, str]]c                 C  s@   | j d u s|| j jvrd S | j |\}}}|d ur|}||fS r   )r   ZhostsZauthenticators)r   rn   loginZaccountpasswordr0   r0   r1   get_netrc_credentials  s   zResolver.get_netrc_credentialsr3   ri   c              
   C  s  d}t  }tjd| jdd}tj|}|jr(|j	t
r(t|| j| jd}nt
|v r3t| dddtj i}| |j}|d urd	|jvr|\}	}
|jd
krkt|	 d|
   }|dd| i n |jdkrtj|j|	 d|
 d	|j d}ntjddd ztjj||d}tjj|td}W n tj j!y } zt"t#| td| dd }~ww t$%|}|}z
t&|' d }W n t(y   d }Y nw |d u rt)d 	 |*|}|dkrn|| |+| q|, }||j-fW  d    W  d    S t.j/0  t1d|d| j2pd d}	 |*|}|dkr-n|| |+| |t3| q"|4  |, }W d    n	1 sSw   Y  W d    n	1 scw   Y  ||j-fS )Ni (  rc   F)modedirdelete)r4   r6   z" may be a WrapDB-impersonating URLz
User-Agentzmesonbuild/@r%   :ZAuthorizationzBasic ftp)rn   zNMeson is not going to use netrc credentials for protocols other than https/ftpr   )headersr9   zcould not get z is the internet available?zContent-Lengthz!Downloading file of unknown size.T    downloadDownloading)bar_typetotaldescdisable)5r   r   tempfileNamedTemporaryFiler   r&   r'   r(   r)   r+   r,   rO   r4   r   r*   r   rv   r_  rn   r.   r   r   rV   r   rB   rL   r   rI   r@   ZRequestrA   rC   rD   rE   r  r"   
contextlibclosingintr
  	TypeErrorprintrQ   re   r   rZ   rJ   stdoutflushr   r   r   close)r   r3   	blocksizehtmpfiler/   Zresprf  Zcredsr]  r^  Z	enc_credsreqr   Zdlsizeblock	hashvalueZprogress_barr0   r0   r1   get_data  s   

(










 
zResolver.get_dataTr   ro   hash_requiredc                 C  s   |d | j jvr|sd S | j |d  }t }t|d}||  W d    n1 s1w   Y  |	 }||krLt
d| d| d| dd S )N_hashrbIncorrect hash for :
  expected
  actual.)r   r   r   r   r   r   rd   r   rQ   r   r*   )r   r   ro   r  expectedry  rf   dhashr0   r0   r1   
check_hash  s   zResolver.check_hashc                 C  sp   g d}|D ],}z|  |W   S  ty2 } ztjd| ddd t| W Y d }~qd }~ww |  |S )N)r
   r            zfailed to download with error: z. Trying after a delay...Fr   )r~  r   r   rI   timesleep)r   r3   delaysdr   r0   r0   r1   get_data_with_backoff  s   
zResolver.get_data_with_backoffofnamefallbackc              
   C  s   |    | j||rdnd }tdt| j|dt| z*| |\}}| j|d  }||krIt	
| td| d| d| d	W n( tyr   |sq|d | jjv re| j||d
d Y S tdt|d d  w t	|| d S )NZ_fallback_urlr   ri  fromr  r  r  r  r  T)r  z'A fallback URL could be specified usingzkey in the wrap file)r  r   r   r   r  r'  r   r  r   r   remover*   r   rh  rename)r   r   r  r  Zsrcurlr  rz  r  r0   r0   r1   rh    s(    
zResolver.downloadc                 C  s   | j |d }|d | j jv rBtj| j|}tj|r2| || t	
dt	| j|d |S tj| jdd | || |S t| j j| }| sVtd| d| j|| d	d
 | S )Nr   r   r  zfrom cache.T)exist_okzFile "" does not existF)r  )r   r   r   r   ro   r   r   r!  r  r   r  r'  r   makedirsrh  r   r   r*   r*  )r   r   r   
cache_pathro   r0   r0   r1   r@    s   zResolver.get_file_internalc                 C  s  d| j jv rd| j jv rd| j jd}t|d| j jv r[| d}z
t|| j W d S  tyZ   t	
 }t|| | || j W d    Y d S 1 sRw   Y  Y d S w d| j jv r| j jd }tj| j j|}tj|s}td| | || j d S d S )NZpatch_filenamer   z
Wrap file z: must not have both "patch_filename" and "patch_directory"r    z patch directory does not exist: )r   r   r   r*   r@  rB  rC  r   r   rn  TemporaryDirectoryr-  r   ro   r   r   r   r   )r   r   ro   workdirZ	patch_dirsrc_dirr0   r0   r1   r2    s(   

&zResolver.apply_patchc                 C  s   | j jD ]h}td| d t| j j| }| s#td| dtj	
t|| j}tr8tdddd|g}ntrHtd	dd
tt| g}ntdt|| jtjd\}}}|jdkrlt|  td| dqd S )NzApplying diff file ""zDiff file "r  z--work-treer;   Zapplyz-p1z-fz-iz5Missing "patch" or "git" commands to apply diff files)rX  stderrr   zFailed to apply diff file ")r   r   r   r  r   r   r!  r*   r   ro   r&  r"   r   r   PATCHr*  r   rZ  STDOUT
returncoderp   )r   r   ro   r&  r   r   r?  r_   r0   r0   r1   r3  -  s"   
zResolver.apply_diff_filesroot_src_dirroot_dst_dirc           
   
   C  s   t |D ]S\}}}|||d}t j|st | |D ]9}t j||}t j||}	t j|	rQzt |	 W n tyP   t 	|	t
j t |	 Y nw t|| qqdS )zG
        Copy directory tree. Overwrites also read only files.
        r
   N)r   r   replacero   r!  r  r   r  PermissionErrorchmodstatS_IWUSRrB  copy2)
r   r  r  r  r_   r  Zdst_dirZfile_src_fileZdst_filer0   r0   r1   r-  G  s"   
zResolver.copy_treer   )r   r   r#   r]   )r  r"   r#   r   )r  r  r#   r]   )r   r"   r#   r  )r  r"   r  r"   r#   r  )r  r   r#   r  r   )r   r"   r  r  r#   r  r%  )rO  r"   r#   r5   )rn   r"   r#   r\  )r3   r"   r#   ri   )T)r   r"   ro   r"   r  r5   r#   r]   F)r   r"   r  r"   r  r5   r#   r]   )r   r"   r#   r"   )r  r"   r  r"   r#   r]   )'r{   r|   r}   __annotations__r   r   defaultr   r   r4   r   r   r   r   r   r   r  r  r  r  r  r5  r  r,  r.  r/  r+  rN  r0  r1  r_  r~  r  r  rh  r@  r2  r3  r-  r0   r0   r0   r1   r     sH   
 












j

(

'





<




r   )r!   r"   r#   r$   )FF)r3   r"   r4   r5   r6   r5   r#   r7   )r4   r5   r#   rP   )r4   r5   r#   rS   )rY   r"   rZ   r"   r[   r"   r\   r"   r4   r5   r#   r]   )rh   r"   r#   ri   )r   r"   r   r"   r#   r"   r  )r   r   r   r"   r   r5   r#   r5   )D
__future__r   r8   r   rp  dataclassesr   Zurllib.requestr&   Zurllib.errorurllib.parser   r   rB  rn  r  rZ  rJ   r   r  typingr>   r(  rT   base64r   r   pathlibr   r	   r   r   r   r   r   r   r   r   r   interpreterbaser   r   TYPE_CHECKINGZhttp.clientr=   Ztyping_extensionsr   ZMethodrH   r-   ImportErrorrC   r,   r   rY  r  r2   rO   rR   rX   rg   rx   r*   r   r   r   r   r   r0   r0   r0   r1   <module>   sn    


 



x	