B
    0ªa§  ã               @   sÆ   d dl mZ d dl mZ d dl m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yd dlZW n ek
r   d dlZY nX d dlZddlmZ dZd	d
„ ZG dd„ deƒZdS )é    )Úabsolute_import)Údivision)Úprint_function)Úunicode_literalsNé   )Úutilsz.cache-versionc              C   sZ   t j tj¡} t t j | d¡¡}| tj	d ¡ dd„ |D ƒ}t
 d |¡ d¡¡ ¡ S )Nz*.pyr   c             s   s   | ]}t t |¡jƒV  qd S )N)ÚstrÚosÚstatÚst_mtime)Ú.0Úsource© r   ú6/usr/lib/gobject-introspection/giscanner/cachestore.pyú	<genexpr>4   s    z#_get_versionhash.<locals>.<genexpr>Ú Úascii)r	   ÚpathÚdirnameÚ	giscannerÚ__file__ÚglobÚjoinÚappendÚsysÚargvÚhashlibÚsha1ÚencodeÚ	hexdigest)ZtoplevelZsourcesZmtimesr   r   r   Ú_get_versionhash/   s
    r    c               @   sT   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S )Ú
CacheStorec             C   s   |   ¡ | _|  ¡  d S )N)Ú_get_cachedirÚ
_directoryÚ_check_cache_version)Úselfr   r   r   Ú__init__;   s    
zCacheStore.__init__c             C   s    dt jkrd S t d¡}|S d S )NZGI_SCANNER_DISABLE_CACHEzg-ir-scanner)r	   Úenvironr   Zget_user_cache_dir)r%   Zcachedirr   r   r   r"   ?   s    

zCacheStore._get_cachedirc       	   
   C   s  | j d krd S tƒ }tj | j t¡}y"t|dƒ}| ¡ }W d Q R X W n: tt	fk
r€ } z|j
t
jkrnd}n‚ W d d }~X Y nX ||krŽd S |  ¡  tjdd\}}y2t |d¡}| |¡ W d Q R X t ||¡ W n< tt	fk
r } z|j
t
jkrd S ‚ W d d }~X Y nX d S )NÚrr   zg-ir-scanner-cache-version-)ÚprefixÚw)r#   r    r	   r   r   Ú_CACHE_VERSION_FILENAMEÚopenÚreadÚIOErrorÚOSErrorÚerrnoÚENOENTÚ_cleanÚtempfileÚmkstempÚfdopenÚwriteÚshutilÚmoveÚEACCES)	r%   Zcurrent_hashÚversionZversion_fileZ
cache_hashÚeÚtmp_fdÚtmp_filenameÚtmp_filer   r   r   r$   F   s.    
zCacheStore._check_cache_versionc             C   s2   | j d krd S t | d¡¡ ¡ }tj | j |¡S )Nzutf-8)r#   r   r   r   r   r	   r   r   )r%   Úfilenamer   r   r   r   Ú_get_filenamej   s    
zCacheStore._get_filenamec             C   s   t  |¡jt  |¡jkS )N)r	   r
   r   )r%   Ústore_filenamer?   r   r   r   Ú_cache_is_validu   s    
zCacheStore._cache_is_validc          
   C   sR   yt  |¡ W n> ttfk
rL } z|jtjtjfkr:d S ‚ W d d }~X Y nX d S )N)r	   Úunlinkr.   r/   r0   r9   r1   )r%   r?   r;   r   r   r   Ú_remove_filenamey   s    zCacheStore._remove_filenamec             C   s:   x4t  | j¡D ]$}|tkrq|  t j | j|¡¡ qW d S )N)r	   Úlistdirr#   r+   rD   r   r   )r%   r?   r   r   r   r2   ƒ   s    zCacheStore._cleanc          
   C   s  |   |¡}|d krd S tj |¡r2|  ||¡r2d S tjdd\}}y(t |d¡}t 	||¡ W d Q R X W nB t
tfk
r¬ } z |jtjkrš|  |¡ d S ‚ W d d }~X Y nX yt ||¡ W nB t
tfk
r  } z|jtjkrî|  |¡ n‚ W d d }~X Y nX d S )Nzg-ir-scanner-cache-)r)   Úwb)r@   r	   r   ÚexistsrB   r3   r4   r5   ÚpickleÚdumpr.   r/   r0   ZENOSPCrD   r7   r8   r9   )r%   r?   ÚdatarA   r<   r=   r>   r;   r   r   r   Ústore‰   s(    

zCacheStore.storec             C   s®   |   |¡}|d krd S yt|dƒ}W n8 ttfk
r\ } z|jtjkrJd S ‚ W d d }~X Y nX |  ||¡snd S yt |¡}W n, t	t
ttjfk
r¨   |  |¡ d }Y nX |S )NÚrb)r@   r,   r.   r/   r0   r1   rB   rH   ÚloadÚAttributeErrorÚEOFErrorÚ
ValueErrorZBadPickleGetrD   )r%   r?   rA   Úfdr;   rJ   r   r   r   rM   ¦   s"    


zCacheStore.loadN)Ú__name__Ú
__module__Ú__qualname__r&   r"   r$   r@   rB   rD   r2   rK   rM   r   r   r   r   r!   9   s   $
r!   )Z
__future__r   r   r   r   r0   r   r   r	   r7   r   r3   ZcPicklerH   ÚImportErrorr   r   r   r+   r    Úobjectr!   r   r   r   r   Ú<module>   s&   
