HEX
Server: Apache/2.4.65 (Debian)
System: Linux kubikelcreative 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64
User: www-data (33)
PHP: 8.4.13
Disabled: NONE
Upload Files
File: //usr/share/dh-python/dhpython/__pycache__/fs.cpython-39.pyc
a

��:`�D�@s�ddlZddlZddlZddlZddlZddlmZddlm	Z	m
Z
mZmZm
Z
mZmZmZddlmZddlmZmZmZmZddlmZddlmZmZddlmZe�d	�Z d
d�Z!dd
�Z"Gdd�d�Z#dS)�N)�cmp)�lexists�exists�isdir�islink�join�realpath�split�splitext)�rmtree)�ST_MODE�S_IXUSR�S_IXGRP�S_IXOTH)�MULTIARCH_DIR_TPL)�fix_shebang�clean_egg_name)�Interpreter�dhpythonc
CsTt|�}|D�]@}||_|�|�}|�|�D]J}t|�r,t�d||�t||||�zt�	|�Wq,t
ytYq,0q,|j|dd�}|j|dd�D]J}t|�r�t�d||�t||||�zt�	|�Wq�t
y�Yq�0q�|jrd||jf}|rt|�rd||jf}t�d||�t||||�zt�	|�Wqt
�yLYq0qdS)z!Move files to the right location.zmoving files from %s to %sT)Zgdbzdebian/%s%sN)
r�version�sitedirZold_sitedirsr�log�debug�share_files�os�
removedirs�OSErrorZsymlinked_include_dirZinclude_dir)�package�interpreterZversions�optionsr�dstdir�srcdir�r"�#/usr/share/dh-python/dhpython/fs.py�
fix_locations%s>

r$c
	Cs�t�|�D�]�}t||�}t|�s$q
|�d�r:t�|�q
|js�t|�ddkr�|�|�}|r�|dur�t	�
|||�}t|�d}t||�}t|�s�t
|�s�t�||�q
t|�r�t
|�s�t�||�nt|�t|�kr�t�|�q
t|�r�t||||�q
t||dd��rt�|�q
t�d||�|jr
|�d�s
t|��}|��}	Wd�n1�s\0Yt|��}
|
��}Wd�n1�s�0Yt�|	|||�}tj�|�q
zt�|�Wnt�y�Yn0dS)	z<Try to move as many files from srcdir to dstdir as possible.z.pyc���z.soTF)ZshallowzPaths differ: %s and %sN)r�listdirrr�endswith�remove�
no_ext_renamer
�parse_public_dir�Scan�
rename_extr	rr�renamesrrr�cmpfiler�warn�verbose�open�	readlines�difflibZunified_diff�sys�stderr�
writelinesrr)
r!r rr�iZfpath1rZfpath2�fp1Z	fromlines�fp2ZtolinesZdiffr"r"r#rPsJ





(
(rc@s�eZdZe�d�Ze�d�Zd&dd�Zedd��Z	dd	�Z
d
d�Zedd
��Zedd��Z
dd�Zed'dd��Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�ZdS)(r+z.*/__pycache__(/.*)?$z.*\.py[co]$NcCs||_|j|_||_|s&d|j|_n|�d�}td|j|�|_||_~||_t�t�t�t�t�idt�t�d�	|_	t
�|j�D�]|\}}}|�|�r�|dd�=q�d|_
|_|�|�}|r�d|_|dur�d}q�||_nd|_|j�rV|�d��r�|du�r|j	d�|�|D]@}	|	d	v�s,|	�d
��rt�d|	�tt||	��|�|	��qn.|�|�|_
|j
�s�|�|�r�|�||�nq�|D]2}	t||	�}|�|��r�t|�|�|	��q��q�|�|��r�|�||�q�t|�D�]�}
t||
�}|�|��rt�d|�t
�|��q�|� |��r.|�!|��q�t"|��snt#|��r�d
t$|�dv�r�t�%d|�t
�|��q�t&|
�ddd�}|dk�r�|jj'�s�|�(|||�}|�)|�}
|
�p�|}
|
�r�|j*�+dt���|
�n|j*�+dt���|�|j
�r�t"|��r�|dk�r�t
�,|�t-}|t.@�s4|t/@�s4|t0@�r�|j1�sLt2||jj3��r�|jj4�s�zt5�6|�}Wn4t7�y�}zt�d||�WYd}~n d}~00|j*�+dt���|�|dk�r�|�8|�du�r�d|j*d<�q�|s�zt
�9|�Wq�t:�y�Yq�0q�t�d||j	�dS)Nz	debian/%s�/�debianF)	�requires.txt�egg-info�nsp.txt�shebangs�public_vers�private_dirs�compile�ext_vers�ext_no_versionTz	-packagesr@)�testZtests�.zremoving dist-packages/%szremoving unwanted: %s�.so.r%zremoving dangling symlink: %s��sorCrD�cannot parse shebang %s: %sr?�pyrBzpackage %s details = %s);r�implr�proot�stripr�dpathr�set�resultr�walkZ
should_ignore�current_private_dir�current_pub_versionr*�current_dir_is_publicr'�add�
startswithrrrr(�check_private_dir�
is_bin_dir�handle_bin_dir�is_unwanted_dir�
is_egg_dir�handle_egg_dir�sorted�is_unwanted_file�is_egg_file�handle_egg_filerrr	�infor
r)r,�
handle_ext�current_result�
setdefault�statrr
rr�no_shebang_rewriter�shebang�ignore_shebangsr�	from_file�	Exception�handle_public_modulerr)�selfrrrOr�root�dirs�
file_namesr�name�fn�fpathZfextZver�mode�res�er"r"r#�__init__�s�
�
















��$z
Scan.__init__cCs |jr|jd�|ji�S|jS)NrA)rSrQre�rmr"r"r#rdszScan.current_resultcCs|jj�|�S�N)�	__class__�
UNWANTED_DIRS�match)rmrOr"r"r#r[szScan.is_unwanted_dircCsF|jj�|�rdS|jrB|jrB|jjrBt|�ddd�dvrBdSdS)NTr%rH)rI�h)rz�UNWANTED_FILESr|rU�is_dbg_packager�
clean_dbg_pkgr
�rmrsr"r"r#r_s��zScan.is_unwanted_filecs4�jr�jgS�jdurg}n�fdd�dD�}|S)NFcsg|]}|�j�qSr")r)�.0r7rxr"r#�
<listcomp> �z.Scan.private_dirs_to_check.<locals>.<listcomp>)z
usr/lib/%szusr/lib/games/%szusr/share/%szusr/share/games/%s)rO)rmrQr"rxr#�private_dirs_to_checks
zScan.private_dirs_to_checkcCs|j�d�S)Nz-dbg)rr'rxr"r"r#r'szScan.is_dbg_packagecCs0|jD]$}|�td|j|��rd|SqdS)z0Return private dir's root if it's a private dir.r;r:N)r�rWrr)rmrOr7r"r"r#rX,s
zScan.check_private_dirc
Cs|�dd�\}}|dur�t|�r�|}t�}t|�rN|�|�t|t�|��}q*t|�r�dt|�dvr�|D]}t	�
d|�t�|�qjt	�
d||�t�||�t
�|�r�|S|�||�}|r�t||�}	t|	�r�t	�d||�nt	�
d||�t�||	�|	S|S)	z�Add multiarch triplet, etc. Return new name.

        This method is invoked for all .so files in public or private directories.
        r:rHNrGr%zremoving symlink: %s�renaming %s to %sz.destination file exist, cannot rename %s to %s)�rsplitrrPrVrr�readlinkrr	rrbr(�renamerr|Z
check_extnamer/)
rsrrT�path�fnameZdstfpathZlinksZlpathZnew_fnZ	new_fpathr"r"r#r,2s4	


�zScan.rename_extcCsdS)z0Handle .so file, return its version if detected.Nr"r�r"r"r#rc\szScan.handle_extcCsdSryr"r�r"r"r#rl_szScan.handle_public_modulecCs4|�d��dd�}t|�dkr"dS|�d�r0dSdS)z#Check if dir is one from PATH ones.r:�F)z/sbinz/binz
/usr/gamesTN)rNr	�lenr')rmrOZspathr"r"r#rYbs

zScan.is_bin_dircCs�|jjs|jjrdS|D]n}t||�}t||jj�rzt�|�}Wn2tyt}zt	�
d||�WYd}~qd}~00|jd�|�qdS)NrJr?)
rrgrirrrhrrjrkrrrQrV)rmrOrprrrsrurvr"r"r#rZls
$zScan.handle_bin_dircCs
|�d�S)z+Check if given directory contains egg-info.�	.egg-info�r')rm�dnamer"r"r#r\yszScan.is_egg_dircCs�|�dd�\}}|jr*|jjr*t|�dSt|�}||kr�tt||��rbt�	d||�t|�dSt�	d||�t
�|t||��|}t||�}|r�d|vr�|jd�
t|d��d|vr�|jd�
t|d��d|vr�t
�t|d��|�d�dS)	Nr:rH�%removing %s (%s is already available)r�r<znamespace_packages.txtr>zSOURCES.txt)r�rrr�rrrrrrbrr�rQrVr()rmrOrpr�r��
clean_namer"r"r#r]}s,
zScan.handle_egg_dircCs
|�d�S)z&Check if given file contains egg-info.r�r�r�r"r"r#r`�szScan.is_egg_filecCs�|�dd�\}}t|�}||krhtt||��rHt�d||�t�|�n t�d||�t�|t||��|j	d�
t||��dS)Nr:rHr�r�r=)r�rrrrrbrr(r�rQrV)rmrsrnrqr�r"r"r#ra�s�zScan.handle_egg_filec	Csd|jr`|jjr`|jd}tj|dd�D]8\}}}d|vr&|s&zt�|�Wq&ty\Yq&0q&dS)Nz/usr/libF)�topdownz
-packages/)rrr�rMrrRrrk)rmrMrnrorpr"r"r#�cleanup�s
zScan.cleanup)NN)N)�__name__�
__module__�__qualname__�rerBr{r~rw�propertyrdr[r_r�rrX�staticmethodr,rcrlrYrZr\r]r`rar�r"r"r"r#r+�s0





)


r+)$r3Zloggingrr�r4Zfilecmprr.�os.pathrrrrrrr	r
Zshutilrrfrr
rrrrZdhpython.toolsrrZdhpython.interpreterrZ	getLoggerrr$rr+r"r"r"r#�<module>s(
+0