3
(h}*                 @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ yd dlZW n ek
r   Y nX yd dlZW n ek
r   dZY nX dZy0d dlZejj j Zed krd	Ze je W n ek
r   Y nX d	Zd
ZdZi aej dka!da"g Z#e$ a%g a&d'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  Z0d!d" Z1d#d$ Z2d(d%d&Z3dS ))    N)apps)settings)request_finished)six)npath)_threadFT      win32c             C   sT  t tjj }ttat|kr2| r&g S ttt S |t }tdd |D }t oVtj	r t
jjt
jjt
jjtdddg}x2tttj D ]}|jt
jjt|jd qW |jtj dd |D }xR|D ]J}xDt
j|D ]6\}}}	x*|	D ]"}
|
jdr|jt
jj||
 qW qW qW tj|at|7 a| rD|tt S ttt S dS )zZ
    Returns a list of filenames referenced in sys.modules and translation
    files.
    c             S   s   g | ]}t |d r|jqS )__file__)hasattrr   ).0filename r   ;/tmp/pip-install-q3hcpn_q/Django/django/utils/autoreload.py
<listcomp>f   s    z!gen_filenames.<locals>.<listcomp>conflocalec             S   s$   g | ]}t jj|rt jj|qS r   )ospathisdirabspath)r   basedirr   r   r   r   r   s    z.moN)setsysmodulesvaluesclean_files_cached_filenames_cached_modules_error_filesr   ZUSE_I18Nr   r   joindirnamer   reversedlistr   Zget_app_configsappendr   extendZLOCALE_PATHSwalkendswithunion)only_newZmodule_valuesZnew_modulesZnew_filenamesZbasedirsZ
app_configr   dirpathdirnamesZlocale_filenamesr   r   r   r   gen_filenamesR   s6    	


 
r-   c             C   sl   g }xb| D ]Z}|sq
|j ds(|j dr4|d d }|j drN|d d d }tjj|r
|j| q
W |S )	Nz.pycz.pyor   z	$py.class	   z.pyi)r(   r   r   existsr%   )filelist	filenamesr   r   r   r   r      s    

r   c              C   s4   dd l } ddlm} i | _i |_d |_tj |_d S )Nr   )
trans_real)gettextZdjango.utils.translationr3   _translations_default	threadinglocal_active)r4   r3   r   r   r   reset_translations   s    r:   c                 st   G  fdddt j t j t j  } dfdd	}tj| |  | jdd | j  | j  | j	   j
S )zv
    Checks for changed code using inotify. After being called
    it blocks until a change event has been fired.
    c                   s   e Zd ZdZ fddZdS )z*inotify_code_changed.<locals>.EventHandlerNc                s   |j jdrt _nt _d S )Nz.mo)r   r(   I18N_MODIFIEDmodified_codeFILE_MODIFIED)selfevent)EventHandlerr   r   process_default   s    z:inotify_code_changed.<locals>.EventHandler.process_default)__name__
__module____qualname__r<   rA   r   )r@   r   r   r@      s   r@   Nc                sh   | rt | ddrd S tjtjB tjB tjB tjB tjB tjB tj	B }xt
ddD ]} j|| qPW d S )NZhandles_filesFT)r*   )getattr	pyinotifyZ	IN_MODIFYZ	IN_DELETEZ	IN_ATTRIBZIN_MOVED_FROMZIN_MOVED_TOZ	IN_CREATEZIN_DELETE_SELFZIN_MOVE_SELFr-   Z	add_watch)Zsenderkwargsmaskr   )wmr   r   update_watch   s    (z*inotify_code_changed.<locals>.update_watch)timeout)N)rF   ZProcessEventZWatchManagerZNotifierr   connectZcheck_eventsread_eventsZprocess_eventsstopr<   )ZnotifierrJ   r   )r@   rI   r   inotify_code_changed   s    	
rO   c              C   s   xt  D ]|} tj| }|j}tr*||j8 }| tkr<|t| < q|t|  kri ayttj| = W n t	k
rp   Y nX | j
drtS tS qW dS )Nz.moF)r-   r   statst_mtime_winst_ctime_mtimesr    index
ValueErrorr(   r;   r=   )r   rP   mtimer   r   r   code_changed   s     

rX   c                s    fdd}|S )Nc                 sx   y | | W nd t k
rr   tj at\}}}t|dd d krTtj|d d }n|j}|tkrltj	|  Y nX d S )Nr   r   r   r/   )
	Exceptionr   exc_info
_exceptionrE   	traceback
extract_tbr   r    r%   )argsrG   etZevtbr   )fnr   r   wrapper   s    

zcheck_errors.<locals>.wrapperr   )ra   rb   r   )ra   r   check_errors   s    rc   c               C   s   t d k	rtjt   d S )N)r[   r   reraiser   r   r   r   raise_last_exception   s    re   c              C   s   t rtj} | j rt j| }|d t j@ s|d  t jO  < ttdrXtjtjtj	}nd }t j
| t j| |d k	rtjtj| d S )N   SIGTTOU)termiosr   stdinisatty	tcgetattrECHOr   signalrg   SIG_IGN	tcsetattrTCSANOW)fdZ	attr_listZold_handlerr   r   r   ensure_echo_on   s    

rr   c              C   sT   t   trt} nt} x:trN|  }|tkr4tjd n|tkrBt	  t
jd qW d S )Nrf   r   )rr   USE_INOTIFYrO   rX   RUN_RELOADERr=   r   exitr;   r:   timesleep)ra   Zchanger   r   r   reloader_thread  s    rx   c              C   sr   xlt jgdd t jD  t j } t jdkr8dd | D } tjj }d|d< tjtj	t j| |}|dkr|S qW d S )Nc             S   s   g | ]}d | qS )z-W%sr   )r   or   r   r   r     s    z)restart_with_reloader.<locals>.<listcomp>r
   c             S   s   g | ]}d | qS )z"%s"r   )r   argr   r   r   r     s    trueRUN_MAINrf   )
r   
executablewarnoptionsargvplatformr   environcopyspawnveP_WAIT)r^   Znew_environ	exit_coder   r   r   restart_with_reloader  s    

r   c             C   s   t jjddkr@tj| || y
t  W q tk
r<   Y qX nFy0t }|dk rdt jt j	 |  n
t
j| W n tk
r   Y nX d S )Nr|   r{   r   )r   r   getthreadstart_new_threadrx   KeyboardInterruptr   killgetpidr   ru   )	main_funcr^   rG   r   r   r   r   python_reloader'  s    
r   c             C   s6   ddl m} tj| | xt r$|tjd qW d S )Nr   )SystemRestartr   )Z_systemrestartr   r   r   rX   rv   rw   )r   r^   rG   r   r   r   r   jython_reloader9  s    r   c             C   sF   |d krf }|d kri }t jjdr*t}nt}t| }|||| d S )Njava)r   r   
startswithr   r   rc   )r   r^   rG   ZreloaderZwrapped_main_funcr   r   r   mainB  s    r   )F)NN)4r   rm   r   rv   r\   Zdjango.appsr   Zdjango.confr   Zdjango.core.signalsr   Zdjango.utilsr   Zdjango.utils._osr   Zdjango.utils.six.movesr   r   r7   ImportErrorrh   rs   rF   ZINotifyWrappercreateZinotify_initrq   closert   r=   r;   rT   r   rR   r[   r    r   r   r   r-   r   r:   rO   rX   rc   re   rr   rx   r   r   r   r   r   r   r   r   <module>   sb   


0	1	