
    @dY                     .   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mZmZmZmZmZmZmZmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZm Z  d d	l!m"Z"  ej#        d
          Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+ G d d          Z,dS )    N)cmp)glob)
lexistsexistsgetsizeisdirislinkjoinrealpathrelpathsplitsplitext)rmtree)ST_MODES_IXUSRS_IXGRPS_IXOTH)MULTIARCH_DIR_TPL)fix_shebangclean_egg_name)Interpreterdhpythonc                    t          |          }|D ]}||_        |                    |           }|                    |           D ]e}t	          |          rTt
                              d||           t          ||||           	 t          j	        |           U# t          $ r Y aw xY wf|                    | d          }|                    | d          D ]e}t	          |          rTt
                              d||           t          ||||           	 t          j	        |           U# t          $ r Y aw xY wf|j        rd| |j        }|rqt	          |          rbd| |j        }t
                              d||           t          ||||           	 t          j	        |           # t          $ r Y w xY wdS )z!Move files to the right location.zmoving files from %s to %sT)gdbzdebian/N)r   versionsitedirold_sitedirsr   logdebugshare_filesos
removedirsOSErrorsymlinked_include_dirinclude_dir)packageinterpreterversionsoptionsr   dstdirsrcdirs          #/usr/share/dh-python/dhpython/fs.pyfix_locationsr-   (   s?    k**K # #%$$W--!..w77 	 	FV}} 		6GGGFFKAAAM&))))   D $$W$$77!..wD.AA 	 	FV}} 		6GGGFFKAAAM&))))   D , 		 		&-g{/P/PQF %--  *1';3J3JK		6GGGFFKAAAM&))))   DE# #s6   B
B('B(D//
D<;D<F55
GGc                 p	    g }t          j                   D ]e}t           |          }t          |          s#|                    d          rt          j        |           M|j        set          |          d         dk    rL|                               }|r5|dur1t          
                    |||          }t          |          d         }                     d          r|dv s|                    d          r4t          j        |           |                    t          |gff           t          |          rZ|dv rV|                    t           fd	t!          t           |d
                    D             ff           t#          |           t          ||          }t          |          s&t%          |          st          j        ||           t)          |          r\t%          |          st          j        ||           t+          |          t+          |          k    rt          j        |           4t          |          rt-          ||||           Wt/          ||d          rt          j        |           |                    d          rG|                               r2t0                              d|            t          j        |           ۉ                     d          r|dk    rBt5          ||          r|                    t6          df           t          j        |           8|dk    r&t9          ||           t          j        |           dt0                              d|           t0                              d||           |j        r|                    d          st?          |          5 }	|	                                 }
ddd           n# 1 swxY w Y   t?          |          5 }|                                 }ddd           n# 1 swxY w Y   tC          j"        |
|||          }tF          j$        %                    |           g|D ]\  }} ||g|R   	 t          j&                    dS # tN          $ r Y dS w xY w)z<Try to move as many files from srcdir to dstdir as possible.z.pyc.soT
.dist-info)COPYINGLICENSE)zCOPYING.zLICENSE.)licenseslicense_filesc                 0    g | ]}t          |          S  )r   ).0licenser+   s     r,   
<listcomp>zshare_files.<locals>.<listcomp>m   s3       #  00      z**F)shallow)z.abi3.soz.abi4.soz2%s differs from previous one, removing anyway (%s)WHEELr7   RECORDz%No merge driver for dist-info file %szPaths differ: %s and %s)r0   z.aN)(r!   listdirr
   r   endswithremoveno_ext_renamer   parse_public_dirScan
rename_extr   
startswithappendremove_from_RECORDr   r   r   r   renamesr	   r   r    cmpfiler   warningmerge_WHEELfix_merged_RECORDmerge_RECORDwarnverboseopen	readlinesdifflibunified_diffsysstderr
writelinesr"   r#   )r+   r*   r'   r)   cleanup_actionsifpath1r   fpath2fp1	fromlinesfp2tolinesdiffactionargss   `               r,   r    r    S   sF   OZ D, D,fav 	::f 	If$ 	&!RE)A)A "226::G &7$..gFF&MM"%??<(( 	***all,/. /.*	&!!!&&(:aSF'CDDDv 	1(E#E#E&&&   '+DD,A,A'B'B   (    vfaV}} 	VF^^ 	Jvv&&&&>> !	,&>> "
66****&!!Xf%5%555	&!!!6]] 	,W====VVU333 	,IfZZ011 	,k6R6RSY6Z6Z 	,KKLaQWXXXIf__\** 	,G||vv.. D#**,=r+BCCC	&!!!!hVV,,,	&!!!!@!DDDD HH.??? ,qzz-'@'@ ,&\\ 0S #I0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&\\ .S!mmooG. . . . . . . . . . . . . . .+IwOO
%%d+++'  v
f   s6    PP	P	P<<Q 	Q 	R' '
R54R5c                 D   t          |          5 }d |                                D             }ddd           n# 1 swxY w Y   g }t          |           5 }|                                D ]}||vr|                    |           	 ddd           n# 1 swxY w Y   |S )z;Find all the lines in the text file src that are not in dstc                     i | ]}|d S Nr7   )r8   ks     r,   
<dictcomp>z!missing_lines.<locals>.<dictcomp>   s    333q1d333r;   N)rQ   rR   rG   )srcdstfhcurrentmissinglines         r,   missing_linesrn      s!   	c 4b33BLLNN3334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 G	c %bLLNN 	% 	%D7""t$$$	%% % % % % % % % % % % % % % %
 Ns   ;??1BBBc                 `   t                               d| |           t          | |          }t          |d          5 }|D ]H}|                    d          r|                    |           -t                               d|           I	 ddd           n# 1 swxY w Y   t          |          S )zMerge the source .dist-info/WHEEL file into the destination

    Note that after editing the WHEEL file, the sha256 included in
    the .dist-info/RECORD file will be incorrect and will need fixing
    using the fix_merged_RECORD() function.
    zMerging WHEEL file %s into %satzTag: zWHEEL merge discarded line %sN)r   r   rn   rQ   rF   writerO   lenrh   ri   rl   rj   rm   s        r,   rL   rL      s     II-sC888C%%G	c4 @B 	@ 	@Dw'' @8$????		@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ w<<s   ABBBc                     t                               d| |           t          | |          }t          |d          5 }|D ]}|                    |           	 ddd           n# 1 swxY w Y   t          |          S )z<Merge the source .dist-info/RECORD file into the destinationzMerging RECORD file %s into %srp   N)r   r   rn   rQ   rq   rr   rs   s        r,   rN   rN      s    II.S999C%%G	c4 B 	 	DHHTNNNN	               w<<s   A%%A),A)c                 d   t                               d|            t          | d          }t          | d          }t          t          |          d                   d         }t          |d          }t	          |d          5 }t          j        |                                                                          }ddd           n# 1 swxY w Y   t          |          }d
                    |||	          g}t	          |          5 }|                                D ],}	|	                    |          s|                    |	           -	 ddd           n# 1 swxY w Y   t	          |d
          5 }|                    t          |                     ddd           dS # 1 swxY w Y   dS )a  Update the checksum for .dist-info/WHEEL in .dist-info/RECORD

    After merging the .dist-info/WHEEL file, the sha256 recorded for it will be
    wrong in .dist-info/RECORD, so edit that file to ensure that it is fixed.
    The output is sorted for reproducibility.
    zFixing RECORD file in %sr>   r=   r      rbNz!{name},sha256={sha256sum},{size}
)name	sha256sumsizewt)r   r   r
   r   rQ   hashlibsha256read	hexdigestr   formatrR   rF   rG   rW   sorted)
distdirrecord_path
wheel_path	wheel_dirwheel_relpathrj   wheel_sha256
wheel_sizecontentsrm   s
             r,   rM   rM      sS    II('222w))Kgw''JeK((+,,Q/IG,,M	j$		 >2~bggii00::<<> > > > > > > > > > > > > > >$$J 	-33" 	4 	
 	
H 
k		 &bLLNN 	& 	&D??=11 &%%%	&& & & & & & & & & & & & & & &
 
k4	 	  (B
fX&&'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s7   9C		CCAEE!E5#F%%F),F)c                    t                               d||            t          | d          }t          |           d         fd|D             g }t	          |          5 }|                                }ddd           n# 1 swxY w Y   fd|D             }||k    rt                               d||            t	          |d          5 }|                    t          |                     ddd           dS # 1 swxY w Y   dS )	z0Remove all specified dist-info files from RECORDzRemoving %r from RECORD in %sr>   rv   c                 0    g | ]}t          |          S r7   )r
   )r8   rx   
parent_dirs     r,   r:   z&remove_from_RECORD.<locals>.<listcomp>   s#    666T*d##666r;   Nc                 P    g | ]"}|                     d d          d         v |#S ),rv   r   )r   )r8   rm   namess     r,   r:   z&remove_from_RECORD.<locals>.<listcomp>   s6    MMMdjja.@.@.Cu.L.L.L.L.Lr;   z0Unable to remove %r from RECORD in %s, not foundr{   )	r   r   r
   r   rQ   rR   rO   rW   r   )r   filesrecordlinesrj   filteredr   r   s         @@r,   rH   rH      s   II-ug>>>'8$$Fw"J6666666EE	f                NMMMMMMHC	! 	! 	! 
fd		 (r
fX&&'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s$   #BBB#C??DDc                      e Zd Z ej        d          Z ej        d          ZddZed             Z	d Z
d Zed             Zed	             Zd
 Zedd            Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )rD   z.*/__pycache__(/.*)?$z.*\.py[co]$Nc                    || _         |j        | _        || _        |sd| j        z  | _        n0|                    d          }t          d| j        |          | _        || _        ~|| _        t                      t                      t                      t                      t                      t                      i dt                      t                      d
| _	        t          j        | j                  D ]7\  }}}|                    |          r|d d = "d x| _        | _        |                    |          }|rd| _        |du rd }n|| _        nd| _        | j        r|                    d          r| | j	        d                             |           |D ]h}	|	d	v s|	                    d
          rMt(                              d|	           t-          t          ||	                     |                    |	           inO|                     |          | _        | j        s.|                     |          r|                     ||           n]|D ]L}	t          ||	          }|                     |          r%t-          |           |                    |	           LM|                     |          r|                     ||           |                     |          r|                     ||           tA          |          D ]}
t          ||
          }| !                    |          r0t(                              d|           t          j        |           X| "                    |          r| #                    |           tI          |          sVtK          |          rFdtM          |          d         v r/t(          '                    d|           t          j        |           tQ          |
          d         dd          }|dk    r| j        j)        s| *                    |||          }| +                    |          }|p|}|r;| j,        -                    dt                                                    |           n:| j,        -                    dt                                                    |           | j        rtI          |          r|dk    rt          j.        |          t^                   }|t`          z  s|tb          z  s
|td          z  r|j3        sti          || j        j5                  r| j        j6        s	 to          j8        |          }| j,        -                    dt                                                    |           n3# tr          $ r&}t(                              d||           Y d }~nd }~ww xY w|dk    r!| :                    |          dur
d| j,        d<   |s/| j        s(	 t          j;        |           &# tx          $ r Y 3w xY w9t(                              d|| j	                   d S )Nz	debian/%s/debianF)
requires.txtegg-info	dist-infonsp.txtshebangspublic_versprivate_dirscompileext_versext_no_versionTz	-packagesr   )testtests.zremoving dist-packages/%szremoving unwanted: %s.so.r/   zremoving dangling symlink: %srv   sor   r   r   cannot parse shebang %s: %spyr   zpackage %s details = %s)=r'   implr&   prootstripr
   dpathr)   setresultr!   walkshould_ignorecurrent_private_dircurrent_pub_versionrC   current_dir_is_publicr@   addrF   r   r   r   rA   check_private_dir
is_bin_dirhandle_bin_diris_unwanted_diris_dist_dirhandle_dist_dir
is_egg_dirhandle_egg_dirr   is_unwanted_fileis_egg_filehandle_egg_filer   r	   r   infor   rB   rE   
handle_extcurrent_result
setdefaultstatr   r   r   r   no_shebang_rewriter   shebangignore_shebangsr   	from_file	Exceptionhandle_public_moduler"   r#   )selfr'   r&   r   r)   rootdirs
file_namesr   rx   fnfpathfextvermodereses                    r,   __init__zScan.__init__  sx   &$	 	=$t|3DJJKK$$Ehe<<DJ
'*uu#&55$'EE"%%%#&55&)ee')"'#&55),	0 	0 ')gdj&9&9 i	 i	"D$
((.. GBFFD$t'?!22488G 3-1*d??"GG/6D,,-2*) !==-- .*M266w??? $ . .#4448L8L4II&A4HHH"4d#3#3444 KK---+/+A+A$+G+G(/ !t,, !++D*==== !  T4((''.. 5MMMKK%%%
 %% $$T:666t$$ ##D*555 Z(( 0: 0:T2((// II5u===Ie$$$##E** ((///e}} e}} )5<<3C)C)C !@%HHH	%(((||B'+4<<<5 M ${G L L//%00C.C [+66z355IIMMcRRRR+667GOOSSTYZZZ+ _e}} _!wu~~g6'> 	_TG^ 	_tg~ 	_ ' : _ +E4<3G H H_(,(D_!_*5*?*F*FC %)$7$B$B:suu$U$U$Y$YZ]$^$^$^$^ (1 !W !W !W$'II.KUTU$V$V$V$V$V$V$V$V!W
 4<<D$=$=e$D$DE$Q$Q59D'	2  8 M$''''   D 			+WdkBBBBBs*   V!!
W+WWX
X+*X+c                 j    | j         r&| j        d                             | j         i           S | j        S )Nr   )r   r   r   r   s    r,   r   zScan.current_result  s7    # 	X;~.99$:RTVWWW{r;   c                 @    | j         j                            |          S re   )	__class__UNWANTED_DIRSmatch)r   r   s     r,   r   zScan.is_unwanted_dir  s    ~+11%888r;   c                     | j         j                            |          rdS | j        r4| j        r/| j        j        r%t          |          d         dd          dvrdS d S d S d S d S )NTr/   rv   )r   h)r   UNWANTED_FILESr   r   is_dbg_packager)   clean_dbg_pkgr   r   r   s     r,   r   zScan.is_unwanted_file  s    >(..u55 	4% 	$*= 	L.	UOOB'+;>>4	 	 	 	 	 	>>r;   c                 Z      j         r j         gS  j         du rg }n fddD             }|S )NFc                 $    g | ]}|j         z  S r7   )r&   )r8   rY   r   s     r,   r:   z.Scan.private_dirs_to_check.<locals>.<listcomp>  s,     - - -1a$,& - - -r;   )z
usr/lib/%szusr/lib/games/%szusr/share/%szusr/share/games/%s)r   )r   r   s   ` r,   private_dirs_to_checkzScan.private_dirs_to_check  s\    : 	 J<:FF- - - - 1, - - -F
 r;   c                 6    | j                             d          S )Nz-dbg)r&   r@   r   s    r,   r   zScan.is_dbg_package  s     |$$V,,,r;   c                 z    | j         D ]2}|                    t          d| j        |                    rd|z   c S 3dS )z0Return private dir's root if it's a private dir.r   r   N)r   rF   r
   r&   )r   r   rY   s      r,   r   zScan.check_private_dir  sT    + 	 	AXt|Q ? ?@@ Qw	 	r;   c                 t   |                      dd          \  }}|t          |           r| }t                      }t          |          rF|                    |           t	          |t          j        |                    }t          |          Ft          |          r|dt          |          d         v re|D ]1}t          
                    d|           t          j        |           2t          
                    d||           t          j        ||            t          j        |           r| S |                    ||          }|rot	          ||          }	t          |	          rt                              d||           n1t          
                    d||           t          j        | |	           |	S | S )	zAdd multiarch triplet, etc. Return new name.

        This method is invoked for all .so files in public or private directories.
        r   rv   Nr   r/   zremoving symlink: %srenaming %s to %sz.destination file exist, cannot rename %s to %s)rsplitr	   r   r   r
   r!   readlinkr   r   r   r   rA   renamer   r   check_extnamerO   )
r   r'   r   pathfnamedstfpathlinkslpathnew_fn	new_fpaths
             r,   rE   zScan.rename_ext  s    ll3**e*ve}}*HEEE"" =		(###bk(&;&;<< "" = h +FeHoob.A$A$A" % %EHH3U;;;Ie$$$$,h>>>	(E***"5)) 	L**52EFF 		T6**Ii   , 238&B B B B ,eV<<<	%+++r;   c                     dS )z0Handle .so file, return its version if detected.Nr7   r   s     r,   r   zScan.handle_ext  s      r;   c                     d S re   r7   r   s     r,   r   zScan.handle_public_module  s    r;   c                     |                     d                              dd          }t          |          dk    rdS |                    d          rdS dS )z#Check if dir is one from PATH ones.r      F)z/sbinz/binz
/usr/gamesTN)r   r   rr   r@   )r   r   spaths      r,   r   zScan.is_bin_dir  s]     C  &&sA..u::>>5>>9:: 	4	 	r;   c                 j   | j         j        s| j         j        rd S |D ]}t          ||          }t	          || j         j                  ri	 t          j        |          }| j        d         	                    |           b# t          $ r&}t                              d||           Y d }~d }~ww xY wd S )Nr   r   )r)   r   r   r
   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   s          r,   r   zScan.handle_bin_dir  s    <* 	dl.J 	F 	5 	5BOOE5$,"677 55%/66C K
+//4444 ! G G GII;UAFFFFFFFFG5	5 	5s   
A??
B/	B**B/c                 ,    |                     d          S )z+Check if given directory contains egg-info.	.egg-infor@   r   dnames     r,   r   zScan.is_egg_dir      ~~k***r;   c                 *   |                     dd          \  }}| j        r| j        j        rt	          |           d S t          |          }||k    rt          t          ||                    r-t          	                    d||           t	          |           d S t          	                    d||           t          j        |t          ||                     |}t          ||          }|rd|v r.| j        d                             t          |d                     d|v r.| j        d                             t          |d                     d|v r;t          j        t          |d                     |                    d           d S d S d S )	Nr   rv   %removing %s (%s is already available)r   r   znamespace_packages.txtr   zSOURCES.txt)r   r   r)   r   r   r   r   r
   r   r   r!   r   r   r   rA   )r   r   r   r   r   
clean_names         r,   r   zScan.handle_egg_dir	  s   ll3**e 	4<#= 	5MMMF#E**
d4,,-- *@%TTTu,eZ@@@	%dJ!7!7888"T5)) 	1++N+//UN0K0KLLL':55I&**47O+P+PQQQ
**	$um44555!!-00000	1 	1
 +*r;   c                 ,    |                     d          S )z&Check if given file contains egg-info.r   r   r   s     r,   r   zScan.is_egg_file#  r   r;   c                    |                     dd          \  }}t          |          }||k    rt          t          ||                    r1t                              d||           t          j        |           n?t                              d||           t          j        |t          ||                     | j	        d         
                    t          ||                     d S )Nr   rv   r  r   r   )r   r   r   r
   r   r   r!   rA   r   r   r   )r   r   r   rx   r  s        r,   r   zScan.handle_egg_file'  s    \\#q))
d#D))
d4,,-- 9@z+ + +	%    ,dJ???	%dJ!7!7888J##Dz$:$:;;;;;r;   c                 ,    |                     d          S )z,Check if given directory contains dist-info.r1   r   r   s     r,   r   zScan.is_dist_dir4  s    ~~l+++r;   c                     |                     dd          \  }}| j        r| j        j        rt	          |           d S |r4d|v r2| j        d                             t          |d                     d S d S d S )Nr   rv   METADATAr   )r   r   r)   r   r   r   r   r
   )r   r   r   r   r   s        r,   r   zScan.handle_dist_dir8  s    ll3**e 	4<#= 	5MMMF 	FZ''K(,,T%-D-DEEEEE	F 	F''r;   c                     | j         r_| j        j        rU| j        dz   }t	          j        |d          D ]6\  }}}d|v r(|s&	 t	          j        |           "# t          $ r Y .w xY w3d S d S d S )Nz/usr/libF)topdownz
-packages/)r   r)   r   r   r!   r   r"   r   )r   r   r   r   r   s        r,   cleanupzScan.cleanupB  s     	4<#= 	J+E*,'%*G*G*G  &dJ4''
'd++++$   	 	 	 	 s   A
A#"A#)NNre   )__name__
__module____qualname__rer   r   r   r   propertyr   r   r   r   r   r   staticmethodrE   r   r   r   r   r   r   r   r   r   r   r  r7   r;   r,   rD   rD     s       BJ788MRZ//NEC EC EC ECN   X
9 9 9     X - - X-   ' ' ' \'R? ? ?    5 5 5+ + +1 1 14+ + +< < <, , ,F F F	 	 	 	 	r;   rD   )-rS   r|   loggingr!   r  rU   filecmpr   rJ   r   os.pathr   r   r   r   r	   r
   r   r   r   r   shutilr   r   r   r   r   r   r   r   dhpython.toolsr   r   dhpython.interpreterr   	getLoggerr   r-   r    rn   rL   rN   rM   rH   rD   r7   r;   r,   <module>r     s  *    				 				 



 " " " " " "      / / / / / / / / / / / / / / / / / / / / / / / /       3 3 3 3 3 3 3 3 3 3 3 3 & & & & & & 6 6 6 6 6 6 6 6 , , , , , ,g
##( ( (VN N Nf    &	 	 	( ( (@( ( ((D D D D D D D D D Dr;   