
    iD                         S SK r S SKrS SKrS SKJr  S SKJr  S SKJ	r	  \R                  " \5      rS r " S S\5      r " S S	5      r " S
 S\\5      rS rS rS 4S jrS rS rg)    N)log)_check_guts_eq)miscc                 Z    U u  pnUS;   a  [         R                  R                  U5      nU$ )z
Return the filename used to enforce uniqueness for the given TOC entry.

Parameters
----------
entry : tuple

Returns
-------
unique_name: str
)BINARYDATA	EXTENSION
DEPENDENCY)ospathnormcase)entrynamer   typecodes       LC:\des-py\RoboSAPF\venv\Lib\site-packages\PyInstaller\building\datastruct.pyunique_namer      s0     !D@@ww%K    c                   x   ^  \ rS rSrSrSU 4S jjrU 4S jrU 4S jrS rS r	S r
S	 rS
 rS rU 4S jrSrU =r$ )TOC,   a  
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.
c                    > [         TU ]  5         [        R                  " S[        SS9  [        5       U l        U(       a  U H  nU R                  U5        M     g g )NzFTOC class is deprecated. Use a plain list of 3-element tuples instead.   )
stacklevel)super__init__warningswarnDeprecationWarningset	filenamesappend)selfinitlistr   	__class__s      r   r   TOC.__init__>   sN     	T	
 !E" " r   c                 (  > [        U[        5      (       d7  [        R                  SU5        [	        S[        U5      R                  -  5      e[        U5      nX R                  ;  a+  U R                  R                  U5        [        TU ]-  U5        g g NzTOC found a %s, not a tuplezExpected tuple, not %s.)
isinstancetupleloggerinfo	TypeErrortype__name__r   r    addr   r!   )r"   r   uniquer$   s      r   r!   
TOC.appendM   sq    %''KK5u=5U8L8LLMMU#'NNv&GN5! (r   c                 (  > [        U[        5      (       d7  [        R                  SU5        [	        S[        U5      R                  -  5      e[        U5      nX0R                  ;  a+  U R                  R                  U5        [        TU ]-  X5        g g r'   )r(   r)   r*   r+   r,   r-   r.   r   r    r/   r   insert)r"   posr   r0   r$   s       r   r3   
TOC.insertX   sq    %''KK5u=5U8L8LLMMU#'NNv&GN3& (r   c                 >    [        U 5      nUR                  U5        U$ Nr   extendr"   otherresults      r   __add__TOC.__add__b   s    Ter   c                 >    [        U5      nUR                  U 5        U$ r7   r8   r:   s      r   __radd__TOC.__radd__g   s    Udr   c                 :    U H  nU R                  U5        M     U $ r7   r!   r"   r;   r   s      r   __iadd__TOC.__iadd__l   s    EKK r   c                 8    U H  nU R                  U5        M     g r7   rC   rD   s      r   r9   
TOC.extendq   s    EKK r   c                     [        U5      n[        U  Vs/ s H   n[        U5      UR                  ;  d  M  UPM"     sn5      $ s  snf r7   )r   r   r    rD   s      r   __sub__TOC.__sub__v   s8    E
tYte{5/A/XEtYZZYs
   AAc                 :    [        U5      nUR                  U 5      $ r7   )r   rJ   r:   s      r   __rsub__TOC.__rsub__{   s    U~~d##r   c                   > [        U[        5      (       aM  U[        S S S 5      :X  a1  [        5       U l        U R	                  5         U R                  U5        g [        S5      eX   n[        U5      nU R                  R                  U5        [        U5      nXPR                  ;  a/  U R                  R                  U5        [        [        U ]3  X5        g g )Nz%TOC.__setitem__ doesn't handle slices)r(   slicer   r    clearr9   KeyErrorr   remover/   r   r   __setitem__)r"   keyvalue	old_valueold_namenew_namer$   s         r   rT   TOC.__setitem__   s    c5!!eD$--!$

E"FGG 	I"9-HNN!!(+"5)H~~-""8,c4,S8 .r   )r    r7   )r.   
__module____qualname____firstlineno____doc__r   r!   r3   r=   r@   rE   r9   rJ   rM   rT   __static_attributes____classcell__r$   s   @r   r   r   ,   s@    "#	"'



[
$9 9r   r   c                   4    \ rS rSrSrS rS r/ rS rS r	Sr
g)	Target   r   c                    SSK Jn  U R                  R                  U l        U R                  =R                  S-  sl        [        R
                  R                  US   SU R                  R                  U R                  4-  5      U l        [        R
                  R                  U R                  5      U l
        / U l        g )Nr   )CONF   workpathz%s-%02d.toc)PyInstaller.configrf   r$   invcnumr   r   joinr.   tocfilenamebasenametocbasenamedependencies)r"   rf   s     r   r   Target.__init__   s    + ~~--!#77<<Z(8-4>>KbKbdhdpdpJq:qr77++D,<,<=r   c                 ~   [         R                  SU R                  R                  5        Sn[        R
                  " U R                  5      nUS:X  a6  [         R                  SU R                  R                  U R                  5        OG [        R                  " U R                  5      n[        [        S U R                   5       U5      5      nU(       a  U R                  X5      (       a!  U R                  5         U R                  5         gg! [         a#    [         R                  SU R                  5         Nkf = f)a  
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 %sNr   z&Building %s because %s is non existentc              3   *   #    U  H	  oS    v   M     g7fr   N ).0gs     r   	<genexpr>&Target.__postinit__.<locals>.<genexpr>   s      :z!1zs   Building because %s is bad)r*   r+   r$   r.   r   mtimerl   rn   load_py_data_structdictzip_GUTS	Exception_check_gutsassemble
_save_guts)r"   data
last_builds      r   __postinit__Target.__postinit__   s     	M4>>#:#:;ZZ 0 01
?KK@$..BYBY[_[k[klC//0@0@A
 C :tzz :DABt''99MMOOO :  L8$:J:JKLs   
 D *D<;D<c           	          [        U5      [        U R                  5      :w  a!  [        R                  SU R                  5        gU R                   H'  u  p4Uc  M
  U" X1U   [        X5      U5      (       d  M'    g   g)z/
Returns True if rebuild/assemble is required.
ry   TF)lenr~   r*   r+   rn   getattr)r"   r   r   attrfuncs        r   r   Target._check_guts   sh     t9DJJ'KK4d6F6FG**JD|Dt*gd&9:FF % r   c                    ^  [        U 4S jT R                   5       5      n[        R                  " T R                  U5        g)zb
Save the input parameters and the work-product of this run to maybe avoid regenerating it later.
c              3   B   >#    U  H  n[        TUS    5      v   M     g7frs   )r   )ru   rv   r"   s     r   rw   $Target._save_guts.<locals>.<genexpr>   s     =*QWT1Q4((*s   N)r)   r~   r   save_py_data_structrl   )r"   r   s   ` r   r   Target._save_guts   s/     =$**==  !1!148r   )ro   rj   rn   rl   N)r.   r[   r\   r]   rj   r   r   r~   r   r   r_   rt   r   r   rc   rc      s"    G2 E9r   rc   c                   `   ^  \ rS rSrSrSS jrS\4S\4S\4S\4S4rS	 rU 4S
 jr	S r
SrU =r$ )Tree   z|
This class is a way of creating a TOC (Table of Contents) list that describes some or all of the files within a
directory.
c                     [         R                  U 5        [        R                  U 5        Xl        X l        X0l        X@l        Uc  / U l        U R                  5         g)a
  
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)rc   r   listrootprefixexcludesr   r   )r"   r   r   r   r   s        r   r   Tree.__init__   sI    " 	d	  DMr   r   r   r   r   )r   Nc                    [         R                  XU5      (       a  gUS   /nU(       a  UR                  5       n[        R                  " U5      U:  a"  [
        R                  SU R                  U5        g[        R                  " U5       HY  n[        R                  R                  XE5      n[        R                  R                  U5      (       d  MH  UR                  U5        M[     U(       a  M  US   U S S & g)NTr   z(Building %s because directory %s changedr   F)rc   r   popr   rz   r*   r+   rn   r   listdirr   rk   isdirr!   )r"   r   r   stackdnmr   s          r   r   Tree._check_guts   s    d*55 f		Azz!}z)FHXHXZ[\jjmww||A*77==&&LL& $ e v,Qr   c                 2   > X l         [        TU ]	  5         U ? g r7   )r   r   r   )r"   r$   s    r   r   Tree._save_guts  s    	Ir   c                 f   [         R                  SU R                  5        U R                  U R                  4/n[        5       n[        5       nU R                   H@  nUR                  S5      (       a  UR                  USS  5        M/  UR                  U5        MB     / nU(       Ga  UR                  5       u  pg[        R                  " U5       H  nX;   a  M
  [        R                  R                  U5      S   n	X;   a  M3  [        R                  R                  Xh5      n
U(       a   [        R                  R                  Xx5      nOUn[        R                  R                  U
5      (       a  UR!                  X45        M  UR!                  XU R"                  45        M     U(       a  GM  XPS S & g )NzBuilding Tree %s*rg   )r*   r+   rn   r   r   r   r   
startswithr/   r   r   r   r   splitextrk   r   r!   r   )r"   r   r   	xexcludesr   r<   dirr   filenameextfullfilenameresfilenames               r   r   Tree.assemble  s<   &(8(89))T[[)*5E	MMDs##d12h'T"	 "
 ))+KCJJsO'gg&&x03#!ww||C:"$'',,v"@K"*K77==..LL,!<=MM;dmm"LM , e" Qr   )r   r   r   r   r   )NNNr   )r.   r[   r\   r]   r^   r   r   r~   r   r   r   r_   r`   ra   s   @r   r   r      sM    8 
 	>"	^$	^$E& r   r   c                 .    SSSSS.nS n[        XU5      $ )N   r   rg   )r
   SYMLINKr   r	   c                     U S;  $ )N>   OPTIONrt   r   s    r   _type_case_normalization_fcn3normalize_toc.<locals>._type_case_normalization_fcnA  s      
 
 	
r   _normalize_toc)toc_TOC_TYPE_PRIORITIESr   s      r   normalize_tocr   5  s-     
 #5QRRr   c                 $    SSSS.n[        X5      $ )Nr   rg   r   )z
PYMODULE-2z
PYMODULE-1PYMODULEr   )r   r   s     r   normalize_pyz_tocr   J  s"     	 #44r   c                     g)NFrt   r   s    r   <lambda>r   V  s    Z_r   c                    / n[        5       nU  H  u  pVnUS:X  a  UR                  XVU45        M!  [        R                  R	                  U5      nU" U5      (       a  [
        R                  " U5      nOUnUR                  U5      n	U	c  XVU4XH'   M  U	u    pUR                  US5      UR                  US5      :  d  M  XVU4XH'   M     U[        UR                  5       5      -   $ )Nr   r   )
r|   r!   r   r   normpathpathlibPurePathgetr   values)r   toc_type_prioritiestype_case_normalization_fcnoptions_toctmp_toc	dest_namesrc_namer   	entry_keyexisting_entry_existing_typecodes               r   r   r   V  s    KfG),%	Xxh ?A GG$$Y/	 'x00((3I!I Y/!"+x!@G '5#Aq"&&x36I6M6MN_ab6cc&/8%D"3 *-: gnn.///r   c           
         [        U  VVVs/ s H  u  po1PM	     snnn5      n/ nU  H  nUu  pnUS:X  a  UR                  U5        M!  U(       d  UR                  U5        M;  [        R                  R	                  U5      (       d  UR                  U5        Mr  [        XU5      nU(       a  UR                  U5        M  UR                  U5        M     U$ s  snnnf )z
Process TOC entries and replace entries whose files are symbolic links with SYMLINK entries (provided original file
is also being collected).
r   )r   r!   r   r   islink_try_preserving_symbolic_link)r   r   r   r   all_dest_filesnew_tocr   symlink_entrys           r   toc_process_symbolic_linksr   y  s     M(E	X)MNN G(-%	X y NN5! NN5! ww~~h''NN5! 6i>ZNN=)NN5!1 4 N= Ns   Cc                    [        5       nUnU n XC;   a   g UR                  U5        [        R                  R	                  U5      (       d   g [        R
                  " U5      n[        R                  R                  U5      (       a   g [        R                  R                  [        R                  R                  U5      U5      n[        R                  R                  U5      n[        R                  R                  [        R                  R                  U5      U5      n[        R                  R                  U5      nXR;   a  [        R                  R                  U5      [        R                  R                  U5      :X  aA  [        R                  R                  U[        R                  R                  U 5      5      nXS4$ GM  )Nr   )r   r/   r   r   r   readlinkisabsrk   dirnamer   realpathrelpath)r   r   r   seen_src_filesref_src_fileref_dest_filesymlink_targetrel_links           r   r   r     sO   UN LM
)B A 	<( ww~~l++8 / \277==((* ' RWW__]%C^T((7ww||BGGOOL$A>Rww''5 * ww)RWW-=-=l-KK 77??="''//):TU I55? r   )r   r   r   PyInstallerr   loggingPyInstaller.building.utilsr   PyInstaller.utilsr   	getLoggerr.   r*   r   r   r   rc   r   r   r   r   r   r   rt   r   r   <module>r      s|    
   & 5 "			8	$*f9$ f9R<9 <9~^64 ^BS*	5 J`  0F$N+r   