
>gTo>                 @   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   } xH | r t
 |  r t j |  r Pn  t j |  n  t |  } q WqA qA W| j |  d d } x | j |  d d D] } t |  rt j d | |  t | | | |  d j | j	 d  d d   } xH | rt
 |  rt j |  rPn  t j |  n  t |  } qrWqq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  xbt  j |   D]Q} t |  |  } | j r t |  d d k r | j |   } | r | } | j | |  } | r t |  |  } t |  r t j	 d | |  q t j
 d | |  t  j | |  | } q q n  t | |  }	 t |  rt |	  rt  j | |	  q n  t |  r<t | |	 | |  q t | |	 d d r t  j |  q q Wt |   rt  j |   rt  j |   n  d S)	z<Try to move as many files from srcdir to dstdir as possible.r   z.soz.destination file exist, cannot rename %s to %szrenaming %s to %sZshallowFNr   )r   r   r   no_ext_renamer	   parse_public_version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 |  |  _ | |  _ ~ | |  _ i	 t   d 6t   d 6t   d 6t   d 6t   d 6i  d	 6d
 d 6t   d 6t   d 6|  _	 xt
 j |  j  D]\ } } } | j |  r| d  d   =q n  d  |  _ | j |  |  _ } |  j re| j d  r|  j	 d j |  qnI |  j |  |  _ |  j s|  j |  }	 |	 r |  j | |  qq n  xI | D]A }
 t | |
  } |  j |  rt |  | j |
  qqqW|  j |  r|  j | |  q n  xt |  D]} t | |  } |  j |  rst j d |  t
 j |  q,n  |  j |  r|  j |  q,n  t  |  st! |  r,d t" |  d k r,t j# d |  t
 j |  q,q,n  t$ |  d d d   } | d k r|  j j% s-|  j& |  } n  |  j' |  } | pE| } | rp|  j( j) d t    j |  q|  j( j) d t    j |  n  |  j rt  |  r| d k rt
 j* |  t+ } | t, @s| t- @s| t. @r| j/ st0 | |  j j1  r|  j j2 ry t3 j4 |  } Wn8 t5 k
 r\} z t j d | |  WYd  d  } ~ XqX|  j( j) d t    j |  qqqn  | d k r,|  j6 |  d
 k	 r,d |  j( d <q,q,Wq Wt j d | |  j	  d  S)Nz	debian/%sr   debianzrequires.txtzegg-infoznsp.txtshebangsZpublic_versprivate_dirsFcompileZext_versZext_no_versionz	-packageszremoving unwanted: %sz.so.r   zremoving dangling symlink: %ssozcannot parse shebang %s: %spyTzpackage %s details = %sr   r   )7r    implr   prootstripr   dpathr!   setresultr   walkZshould_ignorecurrent_private_dirr(   current_pub_versionendswithaddcheck_private_dir
is_bin_dirhandle_bin_diris_unwanted_dirr
   r.   
is_egg_dirhandle_egg_dirsortedis_unwanted_filer   r   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_module)selfr    r   r;   r!   rootdirs
file_namesr   rD   namefnfpathZfextZvermodereser$   r$   r%   __init__p   s    				




"			

"""		&+!zScan.__init__c             C   s*   |  j  r# |  j d j |  j  i   S|  j S)Nr4   )r?   r=   rP   )rX   r$   r$   r%   rO      s    	zScan.current_resultc             C   s   |  j  j j |  S)N)	__class__UNWANTED_DIRSmatch)rX   r;   r$   r$   r%   rF      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   r6   hr   )zsorf   )rc   UNWANTED_FILESre   r@   is_dbg_packager!   clean_dbg_pkgr	   )rX   r^   r$   r$   r%   rJ      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/   )rX   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)rl   rm   rn   ro   )r;   )rX   r=   r$   )rX   r%   private_dirs_to_check   s    	
	   
zScan.private_dirs_to_checkc             C   s   |  j  j d  S)Nz-dbg)r   rA   )rX   r$   r$   r%   rh      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)rp   
startswithr   r   )rX   r;   r/   r$   r$   r%   rC     s    zScan.check_private_dirc       	      C   sz  | 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 | |  q n  t j |  r | S|  j j | |  j  } | rvt | |  } t |  rO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   )rsplitr@   r   r<   rB   r   r   readlinkr   r   r   r+   r.   renamer   re   r    r)   r*   )	rX   r^   pathfnameZdstfpathZlinksZlpathZnew_fnZ	new_fpathr$   r$   r%   rM   
  s2    	"	zScan.rename_extc             C   s   d S)z0Handle .so file, return its version if detected.Nr$   )rX   r^   r$   r$   r%   rN   /  s    zScan.handle_extc             C   s   d  S)Nr$   )rX   r^   r$   r$   r%   rW   2  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)rx   ry   rz   )r:   r   lenrA   )rX   r;   Zspathr$   r$   r%   rD   5  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# q# Wd  S)Nzcannot parse shebang %s: %sr3   )r!   rR   rT   r   r   rS   r   rU   rV   r   r   r=   rB   )rX   r;   r[   r]   r^   r`   ra   r$   r$   r%   rE   ?  s    &zScan.handle_bin_dirc             C   s   | j  d  S)z+Check if given directory contains egg-info.z	.egg-info)rA   )rX   dnamer$   r$   r%   rG   L  s    zScan.is_egg_dirc             C   sd  | 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 | |  } n  | r`d | k r |  j d j t | d   n  d | k r+|  j d j t | d   n  d | k r`t
 j t | d   | j d  q`n  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)rr   rh   r!   ri   r
   r   r   r   r   r+   r   rt   r=   rB   r.   )rX   r;   r[   ru   r|   
clean_namer$   r$   r%   rH   P  s,    

  zScan.handle_egg_dirc             C   s   | j  d  S)z&Check if given file contains egg-info.z	.egg-info)rA   )rX   r^   r$   r$   r%   rK   j  s    zScan.is_egg_filec             C   s   | j  d d  \ } } t |  } | | k r t t | |   rh t j d | |  t j |  q t j d | |  t j | t | |   n  |  j	 d j
 t | |   d  S)Nr   r   z%removing %s (%s is already available)zrenaming %s to %szegg-info)rr   r   r   r   r   r+   r   r.   rt   r=   rB   )rX   r^   rY   r\   r}   r$   r$   r%   rL   n  s    	
zScan.handle_egg_filec             C   s   |  j  r |  j j r |  j d } xe t j | d d D]K \ } } } d | k r8 | r8 y t j |  Wq t k
 r Yq Xq8 q8 Wn  d  S)Nz/usr/libtopdownFz
-packages/)rh   r!   ri   r9   r   r>   r   rV   )rX   r9   rY   rZ   r[   r$   r$   r%   cleanup{  s    %zScan.cleanup)__name__
__module____qualname__rer5   rd   rg   rb   propertyrO   rF   rJ   rp   rh   rC   rM   rN   rW   rD   rE   rG   rH   rK   rL   r   r$   r$   r$   r%   r1   l   s&   n%
r1   )!Zloggingr   r   Zfilecmpr   r-   os.pathr   r   r   r   r   r   r	   Zshutilr
   rQ   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"%$