B
    d6?                 @   sp  d dl mZmZmZ d dlZd dlZd dlZd dlZd dlm	Z	m
Z
 ejZejdkrXeZdd Zdd Zd	d
 Zd?ddZdd Zd@ddZejdkreZneZdd Zdd ZdAddZdBddZdCddZd d! ZdDd"d#Zg g fd$d%ZG d&d' d'e Z!dEd(d)Z"dFd,d-Z#d.d/ Z$dGd3d4Z%G d5d6 d6e Z&G d7d8 d8e&Z'G d9d: d:e&Z(G d;d< d<e Z)d=d> Z*dS )H    )absolute_importdivisionprint_functionN)rangezipi   c              G   s   t t j|  S )N)opnormpathjoin)args r   j/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/libtbx/path.py	norm_join   s    r   c             C   s   t t t | S )N)r   r   realpathabspath)pathr   r   r   abs_real_norm   s    r   c             C   s   t t | S )N)r   r   r   )r   r   r   r   abs_norm   s    r   .Fc       	      C   s   | st ddd }|t|}t| }||}tt||g}|dkrV|rV|S dgt||  ||d   }|s|dS tj| S )Nzno path specifiedc             S   s*   g }x |  dD ]}|r|| qW |S )N/)splitappend)Zapresult_r   r   r   as_list   s
     zposix_relpath.<locals>.as_listr   z..r   )
ValueErrorr   r   lencommonprefixr	   )	r   startenable_abspath_if_through_rootr   
start_listpath_abs	path_listirel_listr   r   r   posix_relpath   s    
r$   c             C   sJ   yt | \}}t|rdS W n tk
r2   Y nX t | \}}t|S )NT)r   splituncboolAttributeError
splitdrive)r   prefixr   r   r   r   nt_is_true_abs,   s     r*   c             C   sD  | st d|r(t|r t| s(tdt|}t| }dd }||\}}}||\}	}
}|	|A r||rl|S t d| |f |
 | kr|r|S |	rt d|
|f nt d|
|f d}x0t||D ]"\}}| | krP |d	7 }qW |dkr|r|
d
 d
| S dgt||  ||d   }|s:dS tj| S )Nzno path specifiedz9nt_relpath(): both path and start must be absolute paths.c             S   sv   yt | \}}t|}W n tk
r2   d}Y nX |sFt | \}}g }x |dD ]}|rV|| qVW |||fS )NF\)r   r%   r&   r'   r(   r   r   )absr)   restZis_uncZ	rest_listr   r   r   r   _abspath_splitC   s    
 z"nt_relpath.<locals>._abspath_splitz,Cannot mix UNC and non-UNC paths (%s and %s)z,path is on UNC root %s, start on UNC root %sz&path is on drive %s, start on drive %sr      r+   z..r   )	r   r*   RuntimeErrorr   lowerr   r	   r   r   )r   r   r   Z	start_absr    r.   Zstart_is_uncZstart_prefixr   Zpath_is_uncZpath_prefixr!   r"   Ze1Ze2r#   r   r   r   
nt_relpath5   sH    r2   ntc             C   s   t j| t j| d   S )N)r   r	   r   sep)r   Znumber_of_levelsr   r   r   tail_levelsp   s    r5   c             C   s&   t | d }t |s"t| d S )Nr   )r   r   isdirosmakedirs)target_fileZ
target_dirr   r   r   create_target_dirs   s    
r:   r   %03dc       
   	   C   s   t | sd S t | | }t t | }d}xXt|D ]J}||r<|t|d  }yt	|}W n t
k
rz   Y q<X t||}q<W t ||||d   }	t| |	 d S )Nr   r/   )r   existsbasenamedirnamer   r7   listdir
startswithr   intr   maxr	   rename)
r   
serial_sep
serial_fmtZbnsZdnZmax_iZexsr"   Znnr   r   r   move_oldx   s    
 
  rG   c             C   s   t | ||d t|  d S )N)r   rD   rE   )rG   r7   r8   )r   rD   rE   r   r   r   move_old_create_new_directory   s    rH   c             C   sF   t | ttfst| } t| s<|d kr0t }t|| } t	| S )N)

isinstancebytesunicoder,   r   isabsr7   getcwdr	   r   )	file_name#effective_current_working_directoryr   r   r   canonical_path   s    
rP   c             C   sF   t | dkst| d | d kr$dS ttdrBt| d | d S dS )N   r   r/   TsamefileF)r   AssertionErrorhasattrr   rR   )
file_namesr   r   r   is_same_canoncial_file   s     
rV   c                s   t  fdd| D S )Nc                s   g | ]}t | qS r   )rP   ).0rN   )rO   r   r   
<listcomp>   s   z is_same_file.<locals>.<listcomp>)rV   )rU   rO   r   )rO   r   is_same_file   s    
rY   c             C   sL   |t jd t j | }x,|D ]$}t|| }t|r t|dS q W d S )NPATH)r   )r7   environr   pathsepr   r	   r<   r   )commandZsearch_firstZsearch_lastdirsr   Zpath_commandr   r   r   full_command_path   s    

r_   c               @   s(   e Zd Zdd Zd	ddZd
ddZdS )	directoryc             C   s
   || _ d S )N)r   )selfr   r   r   r   __init__   s    zdirectory.__init__Tc             C   sH   |d k	st t| j|}|rDt|sDddlm} td|| |S )Nr   )show_stringzNo such file or directory: %s)rS   r   r	   r   r<   libtbx.str_utilsrc   r0   )ra   name
must_existr   rc   r   r   r   get   s    zdirectory.getc             C   s@   t | |}|r<t|js<ddlm} td||j |S )Nr   )rc   zNot a directory: %s)r`   rg   r   r6   r   rd   rc   r0   )ra   re   rf   r   rc   r   r   r   sub_directory   s
    zdirectory.sub_directoryN)T)T)__name__
__module____qualname__rb   rg   rh   r   r   r   r   r`      s   
r`   c             C   sT   dd }g }t jjdkrBx6t| D ]\}}}||||d q$W nt| || |S )Nc                s   g }xx|D ]p}t || t  s:|ds
|   q
 fdd}|dkrV|ds
|dkrp|ds
|drpq
|| q
W t|t|kr|d d = || d S )	Nz.pycc                s   t t  | S )N)r   isfiler	   )re   )r   r   r   is_file_in_subdir   s    z<walk_source_tree.<locals>.visitor.<locals>.is_file_in_subdirCVSZEntriesz.svnz
README.txtentries)r   r	   r6   endswithr   r   extend)r   r>   namesZ
names_keepre   rm   r   )r   r   visitor   s"    




z!walk_source_tree.<locals>.visitor   )r   r>   rr   )sysversion_infomajorr7   walkr   )topargrs   r   rootr^   filesr   r   r   walk_source_tree   s    r}   tmp_dir_   c             C   sB   ddl m} x0tdD ] }| ||d }t|s|S qW td S )Nr   )random_hex_codei@B )Znumber_of_digits)libtbx.utilsr   r   r   r<   rS   )r)   Znumber_of_hex_code_digitsr   i_trialre   r   r   r   random_new_directory_name   s    
r   c          
   C   sN   yt |  W n: tk
rH } zddlm} |t|W dd}~X Y nX dS )zJ
  Wrapper for os.makedirs that catches OSError and re-raises as Sorry.
  r   )SorryN)r7   r8   OSErrorr   r   str)r   er   r   r   r   r8      s
    r8   
   MbP?      ?c          	   C   s   | d krt  } dd l}xdt|D ]X}t| rB|d k	r@|| P yt|  W q  tk
rv   |d k	rr|| Y q X q W t	| st
d|  | S )Nr   zmakedirs_race(%s) failure.)r   timer   r   r<   Zsleepr7   r8   	Exceptionr6   r0   )r   Z
max_trialsZdelay_if_existsZdelay_after_exceptionr   r   r   r   r   makedirs_race   s     


r   c               @   s   e Z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d Zdd Zdd Zdd Zdd  Zd'd"d#Zd(d$d%Zd&S ))
path_mixinc             C   s
   |  |S )N)__div__)ra   r   r   r   r   __truediv__  s    zpath_mixin.__truediv__c             C   s   t t| S )N)r   r6   r,   )ra   r   r   r   r6   
  s    zpath_mixin.isdirc             C   s   t t| S )N)r   rl   r,   )ra   r   r   r   rl     s    zpath_mixin.isfilec             C   s   t t| S )N)r   r<   r,   )ra   r   r   r   r<     s    zpath_mixin.existsc             O   s   t t| f||S )N)openr,   )ra   r
   kwdsr   r   r   r     s    zpath_mixin.openc             C   s   t t|  d S )N)r7   r8   r,   )ra   r   r   r   r8     s    zpath_mixin.makedirsc             C   s&   |   rtt|  |   r"td S )N)r<   r7   remover,   rS   )ra   r   r   r   r     s     zpath_mixin.removec             C   s.   ddl m} |  r"|t|  n|   d S )Nr   )remove_tree)Zdistutils.dir_utilr   r6   r,   r   )ra   r   r   r   r   r     s    zpath_mixin.remove_treec             C   s   t t| S )N)r7   r?   r,   )ra   r   r   r   r?   $  s    zpath_mixin.listdirc             O   s   t jt| f||S )N)r7   chmodr,   )ra   r
   r   r   r   r   r   '  s    zpath_mixin.chmodc             O   s   t jt| f||S )N)r7   accessr,   )ra   r
   r   r   r   r   r   *  s    zpath_mixin.accessc             C   s   t t| S )N)r   r=   r,   )ra   r   r   r   r=   -  s    zpath_mixin.basenamec             C   s   t |  d S )Nr/   )r   splitextr=   )ra   r   r   r   ext0  s    zpath_mixin.extc             C   s   |   |  fS )N)r>   r=   )ra   r   r   r   r   3  s    zpath_mixin.splitc             C   s6   t |ttfrtt| |S tt| t|S d S )N)rI   rJ   rK   r   rR   r,   )ra   otherr   r   r   rR   6  s    zpath_mixin.samefilec             C   s
   t | tS )N)rI   relocatable_path)ra   r   r   r   is_relocatable<  s    zpath_mixin.is_relocatableLIBTBX_BUILDc             C   s"   |   rtd| | jS t| S )Nz$%s)r   r   r	   relocatabler,   )ra   
anchor_varr   r   r   sh_value?  s    zpath_mixin.sh_valuec             C   s"   |   rtd| | jS t| S )Nz%%%s%%)r   r   r	   r   r,   )ra   r   r   r   r   	bat_valueD  s    zpath_mixin.bat_valueN)r   )r   )ri   rj   rk   r   r6   rl   r<   r   r8   r   r   r?   r   r   r=   r   r   rR   r   r   r   r   r   r   r   r     s$   
r   c               @   sH   e Zd ZdddZdddZdd Zdd	 Zd
d Zdd Zdd Z	dS )absolute_pathFc             C   s0   t |st|st |}t |}|| _d S )N)r   rL   rS   normcaser   _path)ra   r   case_sensitiver   r   r   rb   L  s
    

zabsolute_path.__init__c             C   s   t ||j| _d S )N)r   r   )ra   new_pathr   r   r   r   resetS  s    zabsolute_path.resetc             C   s   t t| j|S )N)r   r   r	   r   )ra   r   r   r   r   r   V  s    zabsolute_path.__div__c             C   s   | j S )N)r   )ra   r   r   r   __abs__Y  s    zabsolute_path.__abs__c             C   s   t | j| S )N)r   r   )ra   r   r   r   r   __add__\  s    zabsolute_path.__add__c             C   s
   d| j  S )Nzabsolute_path("%s"))r   )ra   r   r   r   __repr___  s    zabsolute_path.__repr__c             C   s   t t| jS )N)r   r   r>   r   )ra   r   r   r   r>   b  s    zabsolute_path.dirnameN)F)F)
ri   rj   rk   rb   r   r   r   r   r   r>   r   r   r   r   r   J  s   

r   c               @   s   e Zd ZdddZdd Zee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d ZdS ) r   Tc             C   sd   t |tst|| _t|rZtt|}t| j}|rLt|}t|}t||dd}|| _	d S )NT)r   r   r   )
rI   r   rS   _anchorr   rL   r,   r   relpathr   )ra   anchorr   resolve_symlinksr   r   r   r   r   rb   g  s    



zrelocatable_path.__init__c             C   s   | j S )N)r   )ra   r   r   r   r   v  s    zrelocatable_path.anchorc             C   s   t | jt| j|S )N)r   r   r   r	   r   )ra   r   r   r   r   r   z  s    zrelocatable_path.__div__c             C   s   t | j|| _| S )N)r   r	   r   )ra   r   r   r   r   __idiv__}  s    zrelocatable_path.__idiv__c             C   s   t | j| j| S )N)r   r   r   )ra   r   r   r   r   r     s    zrelocatable_path.__add__c             C   s   |rt | S | S d S )N)r,   )ra   flagr   r   r   self_or_abs_if  s    zrelocatable_path.self_or_abs_ifc             C   s   t t t| j| jS )N)r   r   r	   r,   r   r   )ra   r   r   r   r     s    zrelocatable_path.__abs__c             C   s   dt | j| jf S )Nz/relocatable_path(anchor="%s", relocatable="%s"))r,   r   r   )ra   r   r   r   r     s    zrelocatable_path.__repr__c             C   s   | j s
tt| jt| j S )N)r   rS   r   r   r   r>   )ra   r   r   r   r>     s    
zrelocatable_path.dirnamec             C   s   t | jS )N)r   r=   r   )ra   r   r   r   r=     s    zrelocatable_path.basenamec             C   s   t | jt| jS )N)r   r   r   r   r   )ra   r   r   r   r     s    zrelocatable_path.normcasec             C   s   | j |j ko| j|jkS )N)r   r   )ra   r   r   r   r   __eq__  s    zrelocatable_path.__eq__c             C   s
   | |k S )Nr   )ra   r   r   r   r   __ne__  s    zrelocatable_path.__ne__c             C   s   t | j| jfS )N)hashr   r   )ra   r   r   r   __hash__  s    zrelocatable_path.__hash__N)T)ri   rj   rk   rb   r   propertyr   r   r   r   r   r   r>   r=   r   r   r   r   r   r   r   r   r   f  s   
	r   c               @   sZ   e Zd ZdZdddZdd Zdd Zed	d
 Ze	j
fddZdd Ze	j
fddZdS )clean_out_directoryz
  Utility for cleaning out Phenix (etc.) project folders, which tend to
  accumulate large amounts of temporary files and other large objects (CCP4
  maps, .geo files, etc.) which we may not want to keep around forever.
  Tc             C   sV  || _ d | _ | _| _g | _g | _x*t|D ]\}}}	tj	|}
|

dd }|dkrd|kr|r|d tj|d}| | nF|dkrd|kr|r|r|d tj|d}| | n
|dkrq2xv|	D ]n}tj||}|dr|s@|d	r|s@|d
r"|s@|dr4|s@|dkr|r| | qW q2W d S )Nr   r   )ZAutoSolZ	AutoBuildZAutoMRZ	LigandFitZStructureComparisonZTEMP0)ZRefinez.comm)ZFFTZSuperposeMapsz.kinz.geoz.ccp4z.xplorz	probe.txt)	path_namen_filesn_dirsn_bytes
file_paths	dir_pathsr7   rx   r   r=   r   r   r	   delete_directoryrp   delete_file)ra   r   Zdelete_kin_filesZdelete_geo_filesZdelete_map_filesZdelete_temp_dirsZdelete_probe_filesr>   dirnames	filenamesZbase_dirZbase_dir_name	full_pathrN   r   r   r   rb     s6    


zclean_out_directory.__init__c             C   sD   t j|sd S |  jt j|7  _| j| |  jd7  _d S )Nr/   )r7   r   rl   r   getsizer   r   r   )ra   rN   r   r   r   r     s
     zclean_out_directory.delete_filec             C   s0   |  j t|7  _ | j| |  jd7  _d S )Nr/   )r   directory_sizer   r   r   )ra   dir_namer   r   r   r     s    z$clean_out_directory.delete_directoryc             C   s   | j | j S )N)r   r   )ra   r   r   r   n_total  s    zclean_out_directory.n_totalc             C   sP   | j |d td|d x| jD ]}t| q W x| jD ]}t| q:W d S )N)outz.Deleting all selected files and directories...)file)showprintr   r7   r   r   shutilZrmtree)ra   r   rN   r   r   r   r   run  s    zclean_out_directory.runc             C   sP   t t jd | jd }|dkr8t jd|d ddd S t jd|ddd S d S )	NCi  i'  z%.1fT)Zgroupingz MBz KB)locale	setlocaleLC_ALLr   format_string)ra   Zn_kbr   r   r   get_freed_space  s
    
z#clean_out_directory.get_freed_spacec             C   s   | j dkr@td| j  |d x"t| jD ]}td| |d q(W | jdkrtd| j |d x"t| jD ]}td| |d qhW | jdkrtd|   |d d S )Nr   z*The following %d directories will deleted:)r   z  %sz'The following %d files will be deleted:z%s of disk space will be freed.)r   r   sortedr   r   r   r   r   )ra   r   r   rN   r   r   r   r     s    


zclean_out_directory.showN)TTTTT)ri   rj   rk   __doc__rb   r   r   r   r   ru   stdoutr   r   r   r   r   r   r   r     s       
r   c       	   
   C   s   d}t  }x|t| D ]n\}}}xb|D ]Z}tj||}yt|}W n tk
r\   w&Y nX |j|krjq&||j ||j	7 }q&W qW |S )Nr   )
setr7   rx   r   r	   statr   st_inoaddst_size)	r   Z
total_sizeseendirpathr   r   ffpr   r   r   r   r     s    

r   )r   F)r   F)r   r;   )r   r;   )N)N)N)r~   r   )Nr   r   r   )+
__future__r   r   r   r   r   r7   ru   	six.movesr   r   r   r   
hexversionr   rK   r   r   r   r$   r*   r2   re   r   r5   r:   rG   rH   rP   rV   rY   r_   objectr`   r}   r   r8   r   r   r   r   r   r   r   r   r   r   <module>   sP   
 
 
3



	


	   
EDY