;iDddlZddlZddlZddlmZddlmZddlm Z ej e Z dZ GddeZGdd ZGd d eeZd Zd ZdfdZdZdZdS)N)log)_check_guts_eq)misccX|\}}}|dvrtj|}|S)z Return the filename used to enforce uniqueness for the given TOC entry. Parameters ---------- entry : tuple Returns ------- unique_name: str )BINARYDATA EXTENSION DEPENDENCY)ospathnormcase)entrynamer typecodes SC:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\PyInstaller/building/datastruct.py unique_namers6!D$@@@w%% KcfeZdZdZd fd ZfdZfdZdZdZdZ d Z d Z d Z fd Z xZS)TOCa TOC (Table of Contents) class is a list of tuples of the form (name, path, typecode). typecode name path description -------------------------------------------------------------------------------------- EXTENSION Python internal name. Full path name in build. Extension module. PYSOURCE Python internal name. Full path name in build. Script. PYMODULE Python internal name. Full path name in build. Pure Python module (including __init__ modules). PYZ Runtime name. Full path name in build. A .pyz archive (ZlibArchive data structure). PKG Runtime name. Full path name in build. A .pkg archive (Carchive data structure). BINARY Runtime name. Full path name in build. Shared library. DATA Runtime name. Full path name in build. Arbitrary files. OPTION The option. Unused. Python runtime option (frozen into executable). A TOC contains various types of files. A TOC contains no duplicates and preserves order. PyInstaller uses TOC data type to collect necessary files bundle them into an executable. Ncttjdtdt |_|r|D]}||dSdS)NzFTOC class is deprecated. Use a plain list of 3-element tuples instead.) stacklevel)super__init__warningswarnDeprecationWarningset filenamesappend)selfinitlistr __class__s rrz TOC.__init__>s   T       #! # # E"""" # # # #rcZt|ts?td|t dt |jzt|}||jvr=|j |t |dSdSNzTOC found a %s, not a tuplezExpected tuple, not %s.) isinstancetupleloggerinfo TypeErrortype__name__rraddrr )r!runiquer#s rr z TOC.appendMs%'' N KK5u = = =5U 8LLMM MU##  ' ' N  v & & & GGNN5 ! ! ! ! ! ( 'rc\t|ts?td|t dt |jzt|}||jvr>|j |t ||dSdSr%) r&r'r(r)r*r+r,rrr-rinsert)r!posrr.r#s rr0z TOC.insertXs%'' N KK5u = = =5U 8LLMM MU##  ' ' N  v & & & GGNN3 & & & & & ( 'rcNt|}|||SNrextendr!otherresults r__add__z TOC.__add__bs$T e rcNt|}|||Sr3r4r6s r__radd__z TOC.__radd__gs$U d rc:|D]}|||Sr3r r!r7rs r__iadd__z TOC.__iadd__ls+  E KK     rc:|D]}||dSr3r=r>s rr5z TOC.extendqs0  E KK      rcXttfd|DS)Nc@g|]}t|jv|S)rr).0rr7s r zTOC.__sub__..ys-YYYe{5/A/A/X/XE/X/X/Xr)r)r!r7s `r__sub__z TOC.__sub__vs1E YYYYtYYYZZZrcJt|}||Sr3)rrFr6s r__rsub__z TOC.__rsub__{sU~~d###rct|trb|tdddkr>t|_|||dSt d||}t|}|j|t|}||jvrE|j |tt| ||dSdS)Nz%TOC.__setitem__ doesn't handle slices) r&slicerrclearr5KeyErrorrremover-rr __setitem__)r!keyvalue old_valueold_namenew_namer#s rrNzTOC.__setitem__s c5 ! ! 9eD$----!$  E"""FGGGS I"9--H N ! !( + + +"5))Ht~--""8,,,c4  ,,S%88888.-rr3)r, __module__ __qualname____doc__rr r0r9r;r?r5rFrHrN __classcell__r#s@rrr,s" # # # # # # " " " " "'''''    [[[ $$$999999999rrc.eZdZdZdZdZgZdZdZdS)Targetrc<ddlm}|jj|_|jxjdz c_tj|dd|jj|jfz|_tj |j|_ g|_ dS)Nr)CONFworkpathz %s-%02d.toc) PyInstaller.configr\r#invcnumr r joinr, tocfilenamebasename tocbasename dependencies)r!r\s rrzTarget.__init__s++++++~-  !#7<<Z(8-4>KbdhdpJq:qrr7++D,<==rc\td|jjd}t j|j}|dkr,td|jj|jnw t j|j}ttd|j D|}n0#t$r#td|jYnwxYw|r| ||r*||dSdS)a7 Check if the target need to be rebuild and if so, re-assemble. `__postinit__` is to be called at the end of `__init__` of every subclass of Target. `__init__` is meant to setup the parameters and `__postinit__` is checking if rebuild is required and in case calls `assemble()` z checking %sNrz&Building %s because %s is non existentc3&K|] }|dV dSrNrC)rDgs r z&Target.__postinit__..s& : :!1 : : : : : :rBuilding because %s is bad)r(r)r#r,rmtimerbrdload_py_data_structdictzip_GUTS Exception _check_gutsassemble _save_guts)r!data last_builds r __postinit__zTarget.__postinit__s2  M4>#:;;;Z 011 ?? KK@$.BY[_[k l l l l C/0@AA C : :tz : : :DAABB  L L L 8$:JKKKKK L  t''j99  MMOOO OO       s4B::*C'&C'c t|t|jkr"td|jdS|jD]-\}}|||||t |||rdS.dS)z? Returns True if rebuild/assemble is required. rkTNF)lenrpr(r)rdgetattr)r!rurvattrfuncs rrrzTarget._check_gutss t99DJ ' ' KK4d6F G G G4*  JD$|tD$t*gdD&9&9:FF tt urc|tfdjD}tjj|dS)zr Save the input parameters and the work-product of this run to maybe avoid regenerating it later. c3DK|]}t|dVdSrh)rz)rDrir!s rrjz$Target._save_guts..s1==QWT1Q4((======rN)r'rprsave_py_data_structrb)r!rus` rrtzTarget._save_gutssE====$*=====  !1488888rN) r,rTrUr`rrwrprrrtrCrrrZrZs\G2 E   99999rrZcTeZdZdZd dZdefdefdefdefd fZd Zfd Zd Z xZ S)Treez This class is a way of creating a TOC (Table of Contents) list that describes some or all of the files within a directory. Nrct|t|||_||_||_||_|g|_|dS)az root The root of the tree (on the build system). prefix Optional prefix to the names of the target system. excludes A list of names to exclude. Two forms are allowed: name Files with this basename will be excluded (do not include the path). *.ext Any file with the given extension will be excluded. typecode The typecode to be used for all files found in this tree. See the TOC class for for information about the typcodes. N)rZrlistrootprefixexcludesrrw)r!rrrrs rrz Tree.__init__si"  d       DM rrrrr)ruNct|||rdS|dg}|r|}tj||kr#t d|j|dStj |D]V}tj ||}tj |r| |W||d|dd<dS)NTrz(Building %s because directory %s changedruF)rZrrpoprrlr(r)rdr listdirr raisdirr )r!rurvstackdnmr s rrrzTree._check_gutss   dD* 5 5 4f ' Az!}}z)) FHXZ[\\\tjmm ' 'w||Ar**7==&&'LL&&& 'v,QQQurcZ||_t|`dSr3)rurrt)r!r#s rrtzTree._save_gutss)   IIIrcFtd|j|j|jfg}t }t }|jD]J}|dr||dd5||Kg}|r| \}}tj |D]}||vrtj |d} | |vr1tj ||} |r!tj ||} n|} tj | r|| | f|| | |jf|||dd<dS)NzBuilding Tree %s*r])r(r)rdrrrr startswithr-rr rr splitextrarr r) r!rr xexcludesrr8dirrfilenameext fullfilename resfilenames rrsz Tree.assembles &(8999)T[)*55EE M # #Ds## # d122h'''' T"""" N))++KCJsOO N Nx''g&&x003)##!w||C:: +"$',,vx"@"@KK"*K7==..NLL, !<====MM; dm"LMMMM! N"QQQr)NNNr) r,rTrUrVrrrprrrtrsrWrXs@rrrs8  >" ^$ ^$  E& rrc8ddddd}d}t|||S)Nrr])r SYMLINKrr c |dvS)N>OPTIONrCrs r_type_case_normalization_fcnz3normalize_toc.._type_case_normalization_fcnAs   r_normalize_toc)toc_TOC_TYPE_PRIORITIESrs r normalize_tocr5sB   #35Q R RRrc.dddd}t||S)Nrr]r)z PYMODULE-2z PYMODULE-1PYMODULEr)rrs rnormalize_pyz_tocrJs-  #3 4 44rcdS)NFrCrs rrVsZ_rcg}t}|D]\}}}|dkr||||f%tj|}||rt j|}n|}||} | |||f||<| \} } } ||d|| dkr|||f||<|t| zS)Nrr) rnr r r normpathpathlibPurePathgetrvalues) rtoc_type_prioritiestype_case_normalization_fcn options_toctmp_toc dest_namesrc_namer entry_keyexisting_entry_existing_typecodes rrrVs-KffG),EE% 8X x     Hh ? A A A G$$Y//  ' &x 0 0 "(33II!I Y//  !"+Xx!@GI  '5 #Aq#"&&x336I6M6MN_ab6c6ccc&/8%D " gnn..// //rctd|D}g}|D]}|\}}}|dkr||$|s||.sMMM(E 8X)MMMrr)rr r r islink_try_preserving_symbolic_link)rall_dest_filesnew_tocrrrr symlink_entrys rtoc_process_symbolic_linksrys MMMMMNNNG""(-% 8X y NN5 ! ! !   NN5 ! ! ! w~~h''  NN5 ! ! ! 6i>ZZ  " NN= ) ) ) ) NN5 ! ! ! ! Nrct}|}|} ||vrn||tj|snutj|}tj|rn@tjtj||}tj |}tjtj||}tj |}||vrtj |tj |krBtj |tj|}||dfSdS)NTr) rr-r r rreadlinkisabsradirnamerrealpathrelpath)rrrseen_src_files ref_src_file ref_dest_filesymlink_targetrel_links rrrslUUNLM6 > ) ) <(((w~~l++   \22 7== ( (   RW__]%C%C^TT ((77 w||BGOOL$A$A>RR w'' 55  N * *w))RW-=-=l-K-KKK7??="'//):T:TUU (I55?6H 4r)r rr PyInstallerrloggingPyInstaller.building.utilsrPyInstaller.utilsr getLoggerr,r(rrrrZrrrrrrrCrrrss &&&&&&555555""""""  8 $ $*f9f9f9f9f9$f9f9f9R<9<9<9<9<9<9<9<9~^^^^^64^^^BSSS* 5 5 5J`I_ 0 0 0 0F$$$N+++++r