o
    Wod:                     @  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,zd dl-Z-dZ.W n e/y   dZ.Y nw dZ0dZ1g dZ2e3dZ4dGddZ5dHdId!d"Z6dJd$d%Z7dKd'd(Z8dLd.d/Z9dMd2d3Z:G d4d5 d5e$Z;G d6d7 d7e;Z<G d8d9 d9Z=dNd<d=Z>dOdPdBdCZ?eddDG dEdF dFZ@dS )Q    )annotations   )mlogN)	dataclass)	b64encode)netrc)PathPurePath   )WrapMode)coredata)	quiet_gitGITProgressBarMesonExceptionwindows_proof_rmtree
Popen_safe)
FeatureNew)
SubProject)mesonlibTFg     @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 r+   shome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/lib/python3.10/site-packages/mesonbuild/wrap/wrap.pywhitelist_wrapdb@   s   r-   	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)   )r-   r(   Tcastr!   requesturlopenr"   
urlunparseREQ_TIMEOUTerrorURLError
isinstancereasonsslZSSLCertVerificationErrorr   warningr%   sys
executable_replace)r.   r/   r1   Zinsecure_msgr*   ZexcpmsgZ	nossl_urlr+   r+   r,   open_wrapdburlK   s6   "	"rI   bytesc                 C  s   t d| d}| S )Nz.https://wrapdb.mesonbuild.com/v2/releases.jsonT)rI   read)r/   r*   r+   r+   r,   get_releases_datak   s   rL   T.Dict[str, T.Any]c                 C  s   t | }tdt| S )NrM   )rL   r9   r:   jsonloadsdecode)r/   datar+   r+   r,   get_releaseso   s   rR   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)rI   openwriterK   )rS   rT   rU   rV   r/   r*   fr+   r+   r,   update_wrap_files   s   "ra   	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 patchr[   r   Zv1Zv2rY   r
   rZ   zInvalid wrapdb URL )	r!   r"   r#   netlocr%   pathstripsplitrsplit)rb   uZarrtagrY   versionrevisionr+   r+   r,   parse_patch_urly   s   
ro   c                   @     e Zd ZdS )r%   N__name__
__module____qualname__r+   r+   r+   r,   r%          r%   c                   @  rp   )WrapNotFoundExceptionNrq   r+   r+   r+   r,   rv      ru   rv   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 )!PackageDefinitionr3   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 )Nr\   Frutf-8encoding	directoryz+Directory key must be a name and not a pathUnknown wrap type packagefiles) filenamer   ry   typevaluesprovided_depsprovided_programs
diff_filesosrg   basenamer&   has_wraprT   lowerZoriginal_filename
redirected
parse_wrapr^   hashlibsha256rK   encode	hexdigestwrapfile_hashgetr   dirnamer%   	ALL_TYPESjoinfilesdir)selfrx   ry   r   r+   r+   r,   __init__   s0   
zPackageDefinition.__init__r   rW   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 ".."ZsubprojectszCwrap-redirect filename must be in the form foo/subprojects/bar.wrapr\   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ConfigParserrK   r   Errorr%   r   parse_wrap_sectionr   r   parentr   	enumeratepartssuffixis_filer   r   r   parse_provide_sectionr   usery   )r   configer   rx   ipwhatr+   r+   r,   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   ry   ri   r   rh   is_absoluter   r   append)r   r   srg   r+   r+   r,   r      s$   

z$PackageDefinition.parse_wrap_sectionc                 C  s   | drP|d  D ]F\}}|dkr$dd |dD }| j| q|dkr:dd |dD }|  j|7  _q|sJd	|d
| j d}t||| j|< qd S d S )NZprovidedependency_namesc                 S  s   i | ]	}|   d qS N)rh   r   .0nr+   r+   r,   
<dictcomp>   s    z;PackageDefinition.parse_provide_section.<locals>.<dictcomp>r   program_namesc                 S  s   g | ]}|  qS r+   )rh   r   r+   r+   r,   
<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_sectionitemsri   r   updater   r   r%   )r   r   kvZ
names_dictZ
names_listmr+   r+   r,   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   r+   r+   r,   r      s
   zPackageDefinition.getsubproject_directoryc                 C  s   t j|dS )Nz.meson-subproject-wrap-hash.txt)r   rg   r   )r   r   r+   r+   r,   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   r^   r   r_   r   )r   r   r   r+   r+   r,   update_hash_cache  s
   "z#PackageDefinition.update_hash_cacheN)r3   )rx   r   ry   r   r   rW   )r   r   r   rW   )r   r   r   r   )r   r   r   r   )r   r   r   rW   )
rr   rs   rt   r   r   r   r   r   r   r   r+   r+   r+   r,   rw      s    

$


rw   subdir_rootpackagenamec                 C  s0   t j| |d }t j|rt|}|jS |S )Nr\   )r   rg   r   isfilerw   r   )r   r   rx   wrapr+   r+   r,   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_gitZGitExceptionr%   r   )r   r   r   r   r+   r+   r,   r     s   r   )eqc                   @  sl  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`ddZ
d`ddZd`ddZdaddZd`ddZdbddZdcdd Zddd#d$Zded'd(Zdfd+d,Zdgd.d/Zd`d0d1Zdhd2d3Zd`d4d5Zd`d6d7Zd`d8d9Zdid;d<Zd`d=d>Zd`d?d@ZdjdCdDZdkdGdHZdldmdMdNZdkdOdPZ dndodSdTZ!dpdUdVZ"d`dWdXZ#d`dYdZZ$dqd]d^Z%d_S )rResolverr   
source_dirsubdirr3   ry   r   	wrap_modeFr0   wrap_frontendr/   r   rW   c                 C  sl   t j| j| j| _t j| jd| _i | _d | _i | _	i | _
i | _i | _i | _|   |   |   d S )Npackagecache)r   rg   r   r   r   r   cachedirwrapsr   r   r   wrapdbwrapdb_provided_depswrapdb_provided_programs
load_wraps
load_netrcload_wrapdb)r   r+   r+   r,   __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: r6   Ffatal)r   FileNotFoundError	Exceptionr   rD   )r   r   r+   r+   r,   r   -  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   r\   )r   rg   isdirr   nextwalkr&   r   rw   ry   r   rT   r   r   add_wrap)r   rootdirsfilesZignore_dirsr   rx   r   r+   r+   r,   r   5  s(   
zResolver.load_wrapsr   rw   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   r+   r+   r,   r   L  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 r+   r+   r   r   rT   r+   r,   r   a      z(Resolver.load_wrapdb.<locals>.<dictcomp>r   c                   r   r+   r+   r   r   r+   r,   r   b  r   r   )r   r   r^   rN   loadr   r   r   r   r   r   r   )r   r`   infor+   r   r,   r   Z  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 )NZversionsr   rZ   r
   rX   rY   r[   r\   r]   z
Installed z	 version z
 revision )r   r   check_can_downloadrj   r!   r;   r<   r   r   r^   r_   rK   r   logrw   r   r   rT   r   )
r   r   r   Zlatest_versionrm   rn   r*   rx   r`   r   r+   r+   r,   get_from_wrapdbd  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   r+   r+   r,   merge_wrapsu  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   rT   r   )r   r   r   Zdep_var	wrap_namer+   r+   r,   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   r+   r+   r,   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   rT   r   )r   r  rT   r   r  r+   r+   r,   find_program_provider  s   
zResolver.find_program_providermethodc           	      C  s  || _ || _| 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	krtj	
| jd
}n|dkrtj	
| jd}ntdtj	|r|   |S |   tj	| jrtj	| jstdnU| jjdkr|    n1| !  | jjdkr| "  n!| jjdkr| #  n| jjdkr#| $  n	td| jjz
| %  | &  W n t'yD   t(| j  w tj	|sXtdtj	| d| j)| j |S )Nz%Neither a subproject directory nor a z.wrap file was found.Usingr   r|   r}   zK                        [wrap-redirect]
                        filename = z
                        Zmesonzmeson.buildZcmakezCMakeLists.txtz2Only the methods "meson" and "cmake" are supportedz*Path already exists but is not a directoryr   r   r   r   r   zSubproject exists but has no z file)*r   r   r   r   r   r  rv   r   r   rg   r   r   r   existsr   r   relpathr   r   r   boldr^   r_   textwrapdedentr	   as_posixr%   validateresolve_git_submoduler   r   get_filer   get_gitget_hgget_svnapply_patchapply_diff_filesr   r   r   )	r   r   r  r   Z
main_fnamerelr`   rel_pathZ	buildfiler+   r+   r,   resolve  sv   
 






zResolver.resolvec                 C  s   | j tju rd}t|d S )Nz7Automatic wrap-based subproject downloading is disabled)r   r   Z
nodownloadr%   )r   r   r+   r+   r,   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statusr6   +z"git submodule might be out of dateTUz!git submodule has merge conflictsrZ   )r!  r   --initr6   zgit submodule failed to init )r!  r   r6   checkoutr6   r3   zUnknown git submodule output: )r   r   rg   r   r   r   r   r   r   r   rD   r%   r   )r   retoutr+   r+   r,   r    s4   




zResolver.resolve_git_submodulec                 C  s>   |  d}| j}d| jjv rt| j | j}t|| d S )Nr   Zlead_directory_missing)	get_file_internalr   r   r   r   mkdirr   shutilunpack_archive)r   rg   extract_dirr+   r+   r,   r    s   
zResolver.get_filec                 C  st  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}|r| |rt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 | jjdd
 dkrtdddddg|| j
dd | jjd}|rtdddd|g| j
dd d S d S |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rtdddddg|| j
dd | jjd}|r8tdddd|g| j
dd d S d S )"Nz'Git program not found, cannot download z.wrap via git.rn   z-czadvice.detachedHead=falser'  z--Fdepthr3   Tz--depthz%init.defaultBranch=meson-dummy-branchinitr   Zremoteaddoriginr*   Zfetchzclone-recursivetruer!  r   r%  z
--checkoutz--recursivezpush-urlzset-urlz--pushcloneheadz--branch)r   r%   r   r   r   r   is_git_full_commit_idr   r   r   r   r   )r   revnoZcheckout_cmdZ
is_shallowZdepth_optionZpush_urlargsr+   r+   r,   r  %  s^    
 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   rg   r   r^   rK   rh   r   r   rD   rT   )r   Zhashfiler   Zexpected_hashZactual_hashr+   r+   r,   r  R  s   zResolver.validater7  c                 C  s&   d}t |dv rtdd |D }|S )NF>   (   @   c                 s  s    | ]}|d v V  qdS )Z0123456789AaBbCcDdEeFfNr+   )r   chr+   r+   r,   	<genexpr>i  s    z1Resolver.is_git_full_commit_id.<locals>.<genexpr>)r   all)r   r7  resultr+   r+   r,   r6  f  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 )	Nrn   r   zMercurial program not found.r4  r*   cwdZtipr'  )r   r   r,  whichr%   
subprocess
check_callr   r   r   r   )r   r7  r   r+   r+   r,   r  l  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 )Nrn   r   zSVN program not found.r'  z-rr*   r?  )	r   r   r,  rA  r%   rB  rC  r   r   )r   r7  r   r+   r+   r,   r  w  s   

zResolver.get_svnrf   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   rf   loginZaccountpasswordr+   r+   r,   get_netrc_credentials  s   zResolver.get_netrc_credentialsr.   rc   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d}	 |*|}|dkr(n|| |+| |t2| q|3  |, }W d    n	1 sNw   Y  W d    n	1 s^w   Y  ||j-fS )Ni (  r]   F)modedirdelete)r/   r1   z" may be a WrapDB-impersonating URLz
User-Agentzmesonbuild/@r    :ZAuthorizationzBasic ftp)rf   zNMeson is not going to use netrc credentials for protocols other than https/ftpr   )headersr4   zcould not get z is the internet available?zContent-Lengthz!Downloading file of unknown size.T    downloadDownloading)Zbar_typetotaldesc)4r   r   tempfileNamedTemporaryFiler   r!   r"   r#   r$   r&   r'   rI   r/   r   r%   r   rm   rG  rf   r)   r   r   rP   r   r=   rG   r   rD   r;   ZRequestr<   r>   r?   r@   r   r   
contextlibclosingintr   	TypeErrorprintrK   r_   r   rT   rE   stdoutflushr   r   close)r   r.   	blocksizehtmpfiler*   ZresprN  ZcredsrE  rF  Z	enc_credsreqr   Zdlsizeblock	hashvalueZprogress_barr+   r+   r,   get_data  s   

(









 
zResolver.get_dataTr   rg   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   r^   r   rK   r   r%   )r   r   rg   re  expectedr_  r`   dhashr+   r+   r,   
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   )rd  r   r   rD   timesleep)r   r.   Zdelaysdr   r+   r+   r,   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   rQ  fromrf  rh  ri  rj  rk  T)rw  z'A fallback URL could be specified usingzkey in the wrap file)r   r   r   r   r   r  r   ru  r   r   remover%   r   rP  rename)r   r   rv  rw  Zsrcurlrm  r`  rl  r+   r+   r,   rP    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)re  )r   r   r   r   rg   r   r   r  rn  r   r   r  r   makedirsrP  r   r   r%   r  )r   r   r   
cache_pathrg   r+   r+   r,   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*  r,  r-  r   r   rT  TemporaryDirectory	copy_treer   rg   r   r   r   r   )r   r   rg   ZworkdirZ	patch_dirsrc_dirr+   r+   r,   r    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r=tdddtt| g}ntrHtdd	d
d|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-fz-p1z-iz--work-treer6   applyz5Missing "patch" or "git" commands to apply diff files)r@  stderrr   zFailed to apply diff file ")r   r   r   r   r   r   r  r%   r   rg   r  r   r   PATCHr  r   r   rB  STDOUT
returncoderh   )r   r   rg   r  r   r   r)  rY   r+   r+   r,   r    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   replacerg   r  r}  r   ry  PermissionErrorchmodstatS_IWUSRr,  copy2)
r   r  r  r  rY   r   Zdst_dirZfile_Zsrc_fileZdst_filer+   r+   r,   r  -  s"   
zResolver.copy_treeNr   )r   rw   r   rW   )r   r   r   rw   )r  r  r   rW   )r   r   r   r  )r   r   r	  r   r   r
  )r  r   r   r
  )r   r   r  r   r   r   )r   r0   )r7  r   r   r0   )rf   r   r   rD  )r.   r   r   rc   )T)r   r   rg   r   re  r0   r   rW   F)r   r   rv  r   rw  r0   r   rW   )r   r   r   r   )r  r   r  r   r   rW   )&rr   rs   rt   __annotations__ry   r   defaultr   r   r/   r   r   r   r   r   r  r  r  r  r  r   r   r  r  r  r  r6  r  r  rG  rd  rn  ru  rP  r*  r  r  r  r+   r+   r+   r,   r     sF   
 













V

(


-





;




r   )r   r   r   r   )FF)r.   r   r/   r0   r1   r0   r   r2   )r/   r0   r   rJ   )r/   r0   r   rM   )rS   r   rT   r   rU   r   rV   r   r/   r0   r   rW   )rb   r   r   rc   )r   r   r   r   r   r   r  )r   r   r   r   r   r0   r   r0   )A
__future__r   r3   r   rV  dataclassesr   Zurllib.requestr!   Zurllib.errorurllib.parser   r   r,  rT  r  rB  rE   r   rr  typingr9   r  rN   base64r   r   pathlibr   r	   r   r   r   r   r   r   r   r   r   Zinterpreterbaser   r   TYPE_CHECKINGZhttp.clientr8   rC   r(   ImportErrorr>   r'   r   rA  r  r-   rI   rL   rR   ra   ro   r%   rv   rw   r   r   r   r+   r+   r+   r,   <module>   sj    


 



v	