
U]C                 @   s  d  d l  Z  d  d l Z d  d l Z d  d l m Z d  d l 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
 d   Z d d   Z Gd d   d  Z  d S)    N)cmp)existsdirnameisdirislinkjoinsplitsplitext)rmtree)ST_MODES_IXUSRS_IXGRPS_IXOTH)MULTIARCH_DIR_TPL)fix_shebangclean_egg_name)Interpreterdhpythonc             C   s  t  |  } x| D]} | | _ | j |   } x | j |   D] } t |  rA t j d | |  t | | | |  d j | j	 d  d d   } x? | r t
 |  r t j |  r Pt j |  t |  } q WqA W| j |  d d } x | j |  d d D] } t |  rt j d | |  t | | | |  d j | j	 d  d d   } x? | rt
 |  rt j |  rPt j |  t |  } qiWqWq Wd S)	z!Move files to the right location.zmoving files from %s to %s/N   ZgdbTr   )r   versionsitedirZold_sitedirsr   logdebugshare_filesr   r   r   oslistdirrmdirr   )packageinterpreterZversionsoptionsr   dstdirsrcdirZ
parent_dir r$   #/usr/share/dh-python/dhpython/fs.pyfix_locations#   s6    	"	"	r&   c       
      C   s  x_t  j |   D]N} t |  |  } | j r t |  d	 d k r | j |   } | r | d k	 r | } | j | |  } | r t |  |  } t |  r t j	 d | |  n) t j
 d | |  t  j | |  | } t | |  }	 t |  rt |	  rt  j | |	  q t |  r<t | |	 | |  q t | |	 d d r t  j |  q Wt |   rt  j |   rt  j |   d S)
z<Try to move as many files from srcdir to dstdir as possible.r   z.soTz.destination file exist, cannot rename %s to %szrenaming %s to %sZshallowFNr   )r   r   r   no_ext_renamer	   parse_public_dircheck_extnamer   r   warninforenamesr   r   cmpfileremover   )
r#   r"   r    r!   iZfpath1r   Zfpath1_orignew_nameZfpath2r$   r$   r%   r   H   s2     	r   c               @   s  e  Z d  Z e j d  Z e j d  Z d d d d  Z e d d    Z	 d d	   Z
 d
 d   Z e d d    Z e d d    Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d%   Z d S)&Scanz.*/__pycache__(/.*)?$z.*\.py[co]$Nc             C   s  | |  _  | j |  _ | |  _ | s7 d |  j |  _ n' | j d  } t d |  j |  |  _ | |  _ ~ | |  _ d t   d t   d t   d t   d t   d	 i  d
 d d t   d t   i	 |  _	 xt
 j |  j  D]\ } } } | j |  r| d  d   =q d  |  _ |  _ | j |  } | rWd |  _ | d k rKd  } q`| |  _ n	 d |  _ |  j r| j d  r.| d  k	 r|  j	 d j |  x d D]B }	 |	 | k rt j d |	  t t | |	   | j |	  qWnF |  j |  |  _ |  j s.|  j |  }
 |
 r |  j | |  n q xF | D]> }	 t | |	  } |  j |  r5t |  | j |	  q5q5W|  j |  r|  j | |  q xzt |  D]l} t | |  } |  j |  rt j d |  t
 j |  q|  j |  r	|  j  |  qt! |  sWt" |  rd t# |  d k rt j$ d |  t
 j |  qt% |  d d d   } | d k r|  j j& s|  j' |  } |  j( |  } | p| } | r|  j) j* d t    j |  n |  j) j* d t    j |  |  j rt! |  r| d k rt
 j+ |  t, } | t- @sL| t. @sL| t/ @r| j0 sjt1 | |  j j2  r|  j j3 ry t4 j5 |  } Wn8 t6 k
 r} z t j d | |  WYd  d  } ~ Xn  X|  j) j* d t    j |  | d k r|  j7 |  d k	 rd |  j) d
 <qW| s xj | ry! t
 j8 |  t j d |  Wn t6 k
 r[PYn X| j9 d d  d } | j: |  j  sPqWq Wt j d | |  j	  d  S) Nz	debian/%sr   debianzrequires.txtzegg-infoznsp.txtshebangsZpublic_versprivate_dirscompileFZext_versZext_no_versionTz	-packagestesttestsz+removing dist-packages/%s (too common name)zremoving unwanted: %sz.so.r   zremoving dangling symlink: %ssozcannot parse shebang %s: %spyzremoving empty directory: %sr   zpackage %s details = %s)r6   r7   r   r   );r    implr   prootstripr   dpathr!   setresultr   walkZshould_ignorecurrent_private_dircurrent_pub_versionr(   current_dir_is_publicendswithaddr   r   r
   r.   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_filer   r   r   r+   r	   r'   
rename_ext
handle_extcurrent_result
setdefaultstatr   r   r   r   no_shebang_rewriter   shebangignore_shebangsr   	from_file	Exceptionhandle_public_moduler   rsplit
startswith)selfr    r   r=   r!   rootdirs
file_namesr   namerG   fnfpathZfextZvermodereser$   r$   r%   __init__q   s    										"					
""		&!		zScan.__init__c             C   s*   |  j  r# |  j d j |  j  i   S|  j S)Nr4   )rA   r?   rS   )r]   r$   r$   r%   rR      s    	zScan.current_resultc             C   s   |  j  j j |  S)N)	__class__UNWANTED_DIRSmatch)r]   r=   r$   r$   r%   rI     s    zScan.is_unwanted_dirc             C   s_   |  j  j j |  r d S|  j r[ |  j r[ |  j j r[ t |  d d d   d k r[ d Sd  S)NTr   r8   hr   )zsork   )rh   UNWANTED_FILESrj   rC   is_dbg_packager!   clean_dbg_pkgr	   )r]   rc   r$   r$   r%   rM     s     zScan.is_unwanted_filec                sH     j  r   j  g S  j  d k r+ g  } n   f d d   d D } | S)	NFc                s   g  |  ] } |   j   q Sr$   )r   ).0r/   )r]   r$   r%   
<listcomp>  s   	 z.Scan.private_dirs_to_check.<locals>.<listcomp>
usr/lib/%susr/lib/games/%susr/share/%susr/share/games/%s)rq   rr   rs   rt   )r=   )r]   r?   r$   )r]   r%   private_dirs_to_check  s    	
	   
zScan.private_dirs_to_checkc             C   s   |  j  j d  S)Nz-dbg)r   rD   )r]   r$   r$   r%   rm     s    zScan.is_dbg_packagec             C   s>   x7 |  j  D], } | j t d |  j |   r
 d | Sq
 Wd S)z0Return private dir's root if it's a private dir.r2   r   N)ru   r\   r   r   )r]   r=   r/   r$   r$   r%   rF   !  s    zScan.check_private_dirc       	      C   st  | j  d d  \ } } |  j r t |  r | } t   } x5 t |  rs | j |  t | t j |   } q? Wt |  r d t	 |  d k r x+ | D]# } t
 j d |  t j |  q Wt
 j d | |  t j | |  t j |  r | S|  j j | |  j  } | rpt | |  } t |  rIt
 j d | |  n# t
 j 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   r   z.so.zremoving symlink: %szrenaming %s to %sz.destination file exist, cannot rename %s to %sr   )r[   rC   r   r>   rE   r   r   readlinkr   r   r   r+   r.   renamer   rj   r    r)   rB   r*   )	r]   rc   pathfnameZdstfpathZlinksZlpathZnew_fnZ	new_fpathr$   r$   r%   rP   '  s2    	"	zScan.rename_extc             C   s   d S)z0Handle .so file, return its version if detected.Nr$   )r]   rc   r$   r$   r%   rQ   M  s    zScan.handle_extc             C   s   d  S)Nr$   )r]   rc   r$   r$   r%   rZ   P  s    zScan.handle_public_modulec             C   sH   | j  d  j d d  } t |  d k r1 d S| j d	  rD d Sd S)
z#Check if dir is one from PATH ones.r      F/sbin/bin
/usr/gamesTN)r{   r|   r}   )r<   r   lenrD   )r]   r=   Zspathr$   r$   r%   rG   S  s
    zScan.is_bin_dirc             C   s   |  j  j s |  j  j r d  Sx | D] } t | |  } t | |  j  j  r# y t j |  } Wn8 t k
 r } z t	 j
 d | |  WYd  d  } ~ Xq# X|  j d j |  q# Wd  S)Nzcannot parse shebang %s: %sr3   )r!   rU   rW   r   r   rV   r   rX   rY   r   r   r?   rE   )r]   r=   r`   rb   rc   re   rf   r$   r$   r%   rH   ]  s    &zScan.handle_bin_dirc             C   s   | j  d  S)z+Check if given directory contains egg-info.z	.egg-info)rD   )r]   dnamer$   r$   r%   rJ   j  s    zScan.is_egg_dirc             C   sU  | j  d d  \ } } |  j r; |  j j r; t |  d  St |  } | | k r t t | |   r t j	 d | |  t |  d  St j	 d | |  t
 j | t | |   | } t | |  } | rQd | k r |  j d j t | d   d | k r"|  j d j t | d   d | k rQt
 j t | d   | j d  d  S)	Nr   r   z%removing %s (%s is already available)zrenaming %s to %szrequires.txtznamespace_packages.txtznsp.txtzSOURCES.txt)r[   rm   r!   rn   r
   r   r   r   r   r+   r   rw   r?   rE   r.   )r]   r=   r`   rx   r   
clean_namer$   r$   r%   rK   n  s,    

zScan.handle_egg_dirc             C   s   | j  d  S)z&Check if given file contains egg-info.z	.egg-info)rD   )r]   rc   r$   r$   r%   rN     s    zScan.is_egg_filec             C   s   | j  d d  \ } } t |  } | | k r t t | |   rh t j d | |  t j |  n, t j d | |  t j | t | |   |  j	 d j
 t | |   d  S)Nr   r   z%removing %s (%s is already available)zrenaming %s to %szegg-info)r[   r   r   r   r   r+   r   r.   rw   r?   rE   )r]   rc   r^   ra   r   r$   r$   r%   rO     s    	
zScan.handle_egg_filec             C   s   |  j  r |  j j r |  j d } x_ t j | d d D]H \ } } } d | k r8 | r8 y t j |  Wq8 t k
 r Yq8 Xq8 Wd  S)Nz/usr/libtopdownFz
-packages/)rm   r!   rn   r;   r   r@   r   rY   )r]   r;   r^   r_   r`   r$   r$   r%   cleanup  s    %zScan.cleanup)__name__
__module____qualname__rer5   ri   rl   rg   propertyrR   rI   rM   ru   rm   rF   rP   rQ   rZ   rG   rH   rJ   rK   rN   rO   r   r$   r$   r$   r%   r1   m   s&   &
r1   )!Zloggingr   r   Zfilecmpr   r-   os.pathr   r   r   r   r   r   r	   Zshutilr
   rT   r   r   r   r   r   r   Zdhpython.toolsr   r   Zdhpython.interpreterr   Z	getLoggerr   r&   r   r1   r$   r$   r$   r%   <module>   s   4"%%