B
    §dë%  ã               @   sú   d dl mZmZmZmZ d dlZd dlZd dlmZ	 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Zdd„ Zddd„Zd	d
„ Zejdddfdd„Zdd„ Zd dd„Zdejfdd„Zdd„ Zdd„ Zejfdd„Zd!dd„Zd"dd„Zdd„ ZdS )#é    )Úabsolute_importÚdivisionÚprint_functionÚwith_statementNc               C   s   t jdk rt  d¡ d S )Ni  z9Python version 2.6 or greater required to run this script)ÚsysÚ
hexversionÚexit© r	   r	   ú€/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/libtbx/auto_build/installer_utils.pyÚcheck_python_version   s    
r   TFc       
      C   sÎ   |d krt j}|r&t| tƒr&d | ¡} |r2tj}n|}tj| ||dd |tjdd|d
}|r”x8| 	¡ d kr’|j 
¡ }|r\td| ¡  ƒ | |¡ q\W | ¡  | ¡  | ¡  |j}	|	dkrÊtd| |	f ƒ‚d S )	Nú éÿÿÿÿTF)
ÚargsÚshellÚcwdÚbufsizeÚstdinÚstdoutÚstderrZuniversal_newlinesZ	close_fdsÚenvz: r   z%Call to '%s' failed with exit code %d)r   r   Ú
isinstanceÚlistÚjoinÚ
subprocessÚPIPEÚPopenZSTDOUTÚpollÚreadlineÚprintÚstripÚwriteÚflushÚwaitÚ
returncodeÚRuntimeError)
r   Úlogr   r   Úverboser   r   ÚpÚlineÚrcr	   r	   r
   Úcall   s<     

r*   c           
   O   sˆ   yt j| dt ji|—Ž}W n@ tk
rZ } z"|jtjkrHtd| d  ƒ‚‚ W d d }~X Y nX | ¡ \}}| ¡ }|r„td| |f ƒ‚|S )Nr   zNo such file or directory (%s)r   z%Call to '%s' failed with exit code %d)	r   r   r   ÚOSErrorÚerrnoZENOENTZcommunicater   r$   )Z	popenargsÚkwargsÚprocessÚexcÚoutputZ
unused_errZretcoder	   r	   r
   Úcheck_output9   s    r1   c             C   sB  t j | ¡st| ƒ‚d }}|r$d}|r,d}dd||f g}|  d¡rXdd||f g}n|  d¡rrdd	||f g}|| g }t jd
kr˜td |¡|ƒ nt 	| ¡}	|	 
¡  |	 ¡  t j | ¡ dd¡ dd¡ dd¡ dd¡}
|r>t j |
¡s2t d¡ t j |
¡s2t j |
 ¡ ¡r&|
 ¡ }
ntd|
 ƒ‚t j |
¡S d S )NÚ ÚvÚoÚtarzx%s%sfÚgzzzx%s%sfÚbz2zjx%s%sfÚntr   z.tar.bz2z.tar.gzz.tgzz.taré   z"Expected directory '%s' not found!)ÚosÚpathÚisfileÚAssertionErrorÚendswithÚnamer*   r   ÚtarfileÚopenÚ
extractallÚcloseÚbasenameÚreplaceÚisdirÚtimeÚsleepÚ
capitalizer$   Úabspath)Zpkg_namer%   r&   Zchange_ownershipZcheck_output_pathZverbose_flagZ
owner_flagÚcmdr   r5   Údir_namer	   r	   r
   ÚuntarG   s>    






rM   c              C   s(   t  ¡ } | d }| d¡\}}}t|ƒS )Né   Ú.)r:   ÚunameÚsplitÚint)rP   ÚversionÚmajorÚminorZrevr	   r	   r
   Údetect_osx_versionr   s    rV   c          
   C   sŠ   t j | ¡st‚t| dƒ*}t|dƒ}| | ¡ ¡ W d Q R X W d Q R X t  | t j¡s\|r†t  	|¡j
}t  ||t	jB t	jB t	jB ¡ d S )NÚrbÚwb)r:   r;   r<   r=   rA   r    ÚreadÚaccessÚX_OKÚstatÚst_modeÚchmodÚS_IXUSRÚS_IXGRPÚS_IXOTH)Úsrc_pathÚ	dest_pathÚ
executableÚfiÚfoÚmoder	   r	   r
   Ú	copy_filex   s    "rh   c             C   s  t jdkrtj| |ddS tj | ¡s.t| ƒ‚tj |¡rBt|ƒ‚|rVt	d| |d t 
|¡ x®t | ¡D ] }tj | |¡}tj ||¡}tj |¡r°t |¡}t ||¡ qltj |¡rà|rÔt	d||f |d t||ƒ qltj |¡røt||ƒ ql|rlt	d| |d qlW d S )Ni T)Úsymlinkszcreating %s)Úfilez  copy %s -> %sz  skipping %s)r   r   ÚshutilÚcopytreer:   r;   rF   r=   Úexistsr   ÚmakedirsÚlistdirr   ÚislinkÚreadlinkÚsymlinkr<   rh   Ú	copy_tree)rb   rc   r&   r%   Ú	path_nameZnode_src_pathZnode_dest_pathZtarget_pathr	   r	   r
   rs   †   s*    


rs   c              C   sV   t  ¡ } | d }| d dkrRt ¡ \}}}d | d¡d d… ¡}|sNtdƒ‚|S |S )NrN   r   ÚDarwinrO   zCould not determine OSX version)r:   rP   ÚplatformÚmac_verr   rQ   r=   )rP   Zkernel_versionÚreleaseÚ_Zrelease_majorr	   r	   r
   Úget_os_version   s    rz   c              C   s¾   t jdkr.d} t ¡ \}}|dkr*| d7 } | S t ¡ }|d dkrHd} n|d dkrZd	} n|d } |d
 dkrx| d7 } nB| d	krº|d  d¡}t|d ƒ}|dkrª| d7 } |dkrº| d7 } | S )NÚwin32zintel-windowsZ64bitz-x86_64r   ZLinuxzintel-linux-2.6ru   zmac-intel-osxr   Zx86_64rN   rO   é
   é   z-10.9)r   rv   Zarchitecturer:   rP   rQ   rR   )ZmtypeZarchZos_typerP   Zversion_fieldsZmajor_versionr	   r	   r
   Úmachine_type©   s,    

r~   c             C   sÒ   t  ¡ }t  | ¡ xºt  | ¡D ]¬}t | |¡}t |¡rt |¡}t ||g¡}t 	||¡}t 	||¡}dd„ t 
|¡D ƒdd… }	|	r”tj|	Ž }
nd}
t |
|¡}td| |d t  |¡ t  ||¡ qW dS )z½
  Rewrite all symlinks in a directory with relative paths (allows later
  relocation).  This is mostly just for Mac OS where there are a lot of links
  into the Python.framework bundle.
  c             S   s   g | ]}d ‘qS )z..r	   )Ú.0Údr	   r	   r
   ú
<listcomp>Ò   s    z0regenerate_relative_symlinks.<locals>.<listcomp>r9   NrO   z  creating symlink to %s)rj   )r:   ÚgetcwdÚchdirro   Úopr   rp   ÚrealpathÚcommonprefixÚrelpathrQ   r   Úremoverr   )rL   r%   Zold_cwdÚ	file_nameÚ	full_pathZ	real_pathÚprefixZrel_path_linkZrel_path_targetZparent_dirsZ
parent_dirÚnew_pathr	   r	   r
   Úregenerate_relative_symlinksÂ   s"    



r   c       
      C   s¶   g }x¬t  | ¡D ]ž\}}}x4|D ],}||kr t ||¡}t |¡ | |¡ q W x\|D ]T}	t ||	¡}|	|kr„t  |¡ | |¡ qV|dk	rV|	 |¡rVt  |¡ | |¡ qVW qW |S )zË
  Recursively walk through a directory and delete any files (or directories)
  with the specified file name or extension.  Effectively equivalent to
  running 'find . -name "PATTERN" | xargs rm -rf'.
  N)	r:   Úwalkr„   r   rk   ÚrmtreeÚappendrˆ   r>   )
rL   r‰   Úfile_extZdeletedÚdirnameÚdirnamesÚ	filenamesÚdnrŠ   Úfnr	   r	   r
   Úfind_and_delete_filesÜ   s     




r—   c          
   C   sd  t  | ¡} t  | ¡r | t ¡ ks$t‚t  | ¡}t  t ¡ |¡}|rPt 	| |¡ n
t
| |ƒ t  t  |d¡¡r²ytd||f tjd W n* tk
r° } zt|ƒ W dd}~X Y nX t|dd t|dd t|dd t|dd	 t|d
d	 t|dd	 |rTt d| d¡}| |¡ | ¡  t  t ¡ |d ¡}t  |¡sFt‚t |¡ |S t  t ¡ |¡S )za
  Create a clean copy of a source repository, optionally bundling it as a
  gzipped tar file.
  z.svnzsvnversion %s > %s/.svnversion)r%   Nz.pyc)r‘   z.pyoz.swp)r‰   z.gitz	.sconsignz	%s.tar.gzzw:gzz.tar.gz)r„   rJ   rF   r:   r‚   r=   rD   r   rk   rl   rs   rm   r*   r   r   r$   r   r—   r@   rA   ÚaddrC   r<   r   )rL   Zcreate_tarfileZ
use_shutilÚmodule_nameZ
local_pathÚer5   Ztar_filer	   r	   r
   Úarchive_distó   s8    




r›   c          
   C   sv   xpt  | ¡D ]b\}}}xV|D ]N}t ||¡}| d¡rt |¡rytd| |d W q tk
rh   Y qX qW qW d S )Nz.sozstrip %s)r%   )r:   rŽ   r„   r   r>   r<   r*   r$   )rL   r%   r’   r“   r”   r–   rŠ   r	   r	   r
   Ú
strip_libs  s    
rœ   )NTNFN)N)NN)TT)Ú
__future__r   r   r   r   r,   r:   Zos.pathr;   r„   rv   rk   r\   r   r   r@   rG   r   r*   r1   r   rM   rV   rh   rs   rz   r~   r   r—   r›   rœ   r	   r	   r	   r
   Ú<module>   s0   
%*


%