o
    ÙñhÌ7  ã                   @  sò   d 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m	Z	 ddl
ZddlmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZ ddlmZ e	rbddlmZmZ dd	lm Z m!Z! e "d
¡Z#G dd„ deƒZ$G dd„ deƒZ%dS )uÒ   :module: watchdog.observers.fsevents
:synopsis: FSEvents based emitter implementation.
:author: yesudeep@google.com (Yesudeep Mangalapilly)
:author: contact@tiger-222.fr (MickaÃ«l Schoentgen)
:platforms: macOS
é    )ÚannotationsN)ÚTYPE_CHECKING)
ÚDirCreatedEventÚDirDeletedEventÚDirModifiedEventÚDirMovedEventÚFileCreatedEventÚFileDeletedEventÚFileModifiedEventÚFileMovedEventÚgenerate_sub_created_eventsÚgenerate_sub_moved_events)ÚDEFAULT_EMITTER_TIMEOUTÚDEFAULT_OBSERVER_TIMEOUTÚBaseObserverÚEventEmitter)ÚDirectorySnapshot)ÚFileSystemEventÚFileSystemEventHandler)Ú
EventQueueÚObservedWatchÚfseventsc                      s¼   e Zd ZdZedddœdB‡ fdd„ZdCdd„ZdDdd„ZdEdd„ZdFdd„Z	dFd d!„Z
dFd"d#„ZdGd(d)„ZdHd+d,„ZedHd-d.„ƒZdId1d2„ZdJd9d:„ZdCd;d<„ZdCd=d>„ZdKd@dA„Z‡  ZS )LÚFSEventsEmittera˜  macOS FSEvents Emitter class.

    :param event_queue:
        The event queue to fill with events.
    :param watch:
        A watch object representing the directory to monitor.
    :type watch:
        :class:`watchdog.observers.api.ObservedWatch`
    :param timeout:
        Read events blocking timeout (in seconds).
    :param event_filter:
        Collection of event types to emit, or None for no filtering (default).
    :param suppress_history:
        The FSEvents API may emit historic events up to 30 sec before the watch was
        started. When ``suppress_history`` is ``True``, those events will be suppressed
        by creating a directory snapshot of the watched path before starting the stream
        as a reference to suppress old events. Warning: This may result in significant
        memory usage in case of a large number of items in the watched path.
    :type timeout:
        ``float``
    NF)ÚtimeoutÚevent_filterÚsuppress_historyÚevent_queuer   Úwatchr   r   Úfloatr   ú"list[type[FileSystemEvent]] | Noner   ÚboolÚreturnÚNonec                  s^   t ƒ j||||d tƒ | _|| _d| _d | _t ¡ | _	t
j t
j t
j | jj¡¡¡| _d S )N)r   r   g        )ÚsuperÚ__init__ÚsetÚ_fs_viewr   Ú_start_timeÚ_starting_stateÚ	threadingÚLockÚ_lockÚosÚpathÚrealpathÚabspathÚ
expanduserr   Ú_absolute_watch_path)Úselfr   r   r   r   r   ©Ú	__class__© úO/var/www/vscode/kcb/lib/python3.10/site-packages/watchdog/observers/fsevents.pyr$   A   s   	
&zFSEventsEmitter.__init__c                 C  s   t  | j¡ t  | ¡ d S ©N)Ú	_fseventsÚremove_watchr   Ústop©r2   r5   r5   r6   Úon_thread_stopR   s   zFSEventsEmitter.on_thread_stopÚeventr   c                 C  s>   | j js	|  |¡st d|¡ t | |¡ d S t d|¡ d S )Nzqueue_event %szdrop event %s)Ú_watchÚis_recursiveÚ_is_recursive_eventÚloggerÚdebugr   Úqueue_event)r2   r=   r5   r5   r6   rC   V   s   zFSEventsEmitter.queue_eventc                 C  sV   |j r|jntj |j¡}|| jkrdS t|ttfƒr)tj |j	¡}|| jkr)dS dS )NFT)
Úis_directoryÚsrc_pathr,   r-   Údirnamer1   Ú
isinstancer   r   Ú	dest_path)r2   r=   rE   rH   r5   r5   r6   r@   _   s   

z#FSEventsEmitter._is_recursive_eventrE   úbytes | strrF   c                 C  ó.   |j rtnt}|  ||ƒ¡ |  t|ƒ¡ d S r7   )rD   r   r   rC   r   ©r2   r=   rE   rF   Úclsr5   r5   r6   Ú_queue_created_eventm   ó   z$FSEventsEmitter._queue_created_eventc                 C  rJ   r7   )rD   r   r	   rC   r   rK   r5   r5   r6   Ú_queue_deleted_eventr   rN   z$FSEventsEmitter._queue_deleted_eventc                 C  s    |j rtnt}|  ||ƒ¡ d S r7   )rD   r   r
   rC   rK   r5   r5   r6   Ú_queue_modified_eventw   s   z%FSEventsEmitter._queue_modified_eventÚ	src_eventÚdst_pathÚsrc_dirnameÚdst_dirnamec                 C  sH   |j rtnt}|  |¡}|  |||ƒ¡ |  t|ƒ¡ |  t|ƒ¡ d S r7   )rD   r   r   Ú_encode_pathrC   r   )r2   rQ   rE   rR   rS   rT   rL   r5   r5   r6   Ú_queue_renamed_event{   s
   
z$FSEventsEmitter._queue_renamed_eventú_fsevents.NativeEventc                 C  sV   |j | jv }| jr%z| j  |j¡d }||j k}W n ty$   d}Y nw d}|p*|S )Nr   F)Úinoder&   r(   r-   ÚKeyError)r2   r=   Ú
in_historyÚ	old_inodeÚbefore_startr5   r5   r6   Ú_is_historic_created_event‰   s   ÿz*FSEventsEmitter._is_historic_created_eventc                 C  s   | j p| jp| jS )z9Returns True if the event indicates a change in metadata.)Úis_inode_meta_modÚis_xattr_modÚis_owner_change©r=   r5   r5   r6   Ú_is_meta_modš   s   zFSEventsEmitter._is_meta_modÚeventsúlist[_fsevents.NativeEvent]c                   s  t  ¡ tjkr!|D ]‰ d ‡ fdd„tˆ ƒD ƒ¡}t  dˆ |¡ q	t ¡ | j	 dkr-d | _
|r„| d¡‰ |  ˆ j¡}tj |¡}zt |¡}W n tyS   d }Y nw |o[|jˆ jk}ˆ jr“ˆ jr“|  ˆ ¡sn|  ˆ ||¡ | j ˆ j¡ ˆ js}|  ˆ ¡r„|  ˆ ||¡ |  ˆ ||¡ | j ˆ j¡ nÒˆ jr¢|  ˆ ¡s¢|  ˆ ||¡ | j ˆ j¡ ˆ js±|  ˆ ¡r¸|  ˆ ||¡ ˆ jrSt t!‡ fdd„|D ƒƒd ƒ}|r%t  d|¡ |  |j¡}	tj |	¡}
|  "ˆ ||	||
¡ | j ˆ j¡ t#||	ƒD ]}|  $|¡ qô| %|¡ |js|  |¡r|  ||	|
¡ |jr$|  ||	|
¡ | j |j¡ n.|rD|  ˆ ||¡ | j ˆ j¡ t&|ƒD ]}|  $|¡ q:n|  ˆ ||¡ | j ˆ j¡ q-ˆ jre|  ˆ ||¡ | j ˆ j¡ ˆ j'r€|  $t(| j)jƒ¡ t  d	¡ |  *¡  | j +¡  |s0d S d S )
Nz, c                 3  s"    | ]}t ˆ |ƒd u r|V  qdS )TN)Úgetattr)Ú.0Úattrra   r5   r6   Ú	<genexpr>¢   s   €  z/FSEventsEmitter.queue_events.<locals>.<genexpr>z%s: %sé<   r   c                 3  s&    | ]}|j r|jˆ jkr|V  qd S r7   )Ú
is_renamedrX   )rf   Úera   r5   r6   rh   ä   s   €$ z"Destination event for rename is %sz&Stopping because root path was changed),rA   ÚgetEffectiveLevelÚloggingÚDEBUGÚjoinÚdirrB   ÚtimeÚ	monotonicr'   r(   ÚpoprU   r-   r,   rF   ÚstatÚOSErrorÚst_inorX   Ú
is_createdÚ
is_removedr]   rM   r&   ÚaddÚis_modifiedrb   rP   rO   Údiscardrj   ÚnextÚiterrV   r   rC   Úremover   Úis_root_changedr   r   r:   Úclear)r2   r   rc   ÚflagsrE   rS   rt   ÚexistsÚ	dst_eventrR   rT   Úsub_moved_eventÚsub_created_eventr5   ra   r6   Úqueue_eventsŸ   s†   
ÿ
þ
€ÿ

‹zFSEventsEmitter.queue_eventsÚpathsúlist[bytes]Úinodesú	list[int]r   Úidsc                   s€   t j‰ z-‡ fdd„t||||ƒD ƒ}| j |  | j|¡ W d  ƒ W dS 1 s)w   Y  W dS  ty?   t d¡ Y dS w )zhCallback passed to FSEventStreamCreate(), it will receive all
        FS events and queue them.
        c                   s"   g | ]\}}}}ˆ ||||ƒ‘qS r5   r5   )rf   r-   rX   Úevent_flagsÚevent_id©rL   r5   r6   Ú
<listcomp>&  s    
ÿÿz3FSEventsEmitter.events_callback.<locals>.<listcomp>Nz(Unhandled exception in fsevents callback)	r8   ÚNativeEventÚzipr+   r†   r   Ú	ExceptionrA   Ú	exception)r2   r‡   r‰   r   r‹   rc   r5   rŽ   r6   Úevents_callback   s   
þ&ÿÿzFSEventsEmitter.events_callbackc                 C  s\   | j jg| _t ¡ | _zt | | j | j| j¡ t 	| ¡ W d S  t
y-   t d¡ Y d S w )Nz&Unhandled exception in FSEventsEmitter)r   r-   Ú	pathnamesrq   rr   r'   r8   Ú	add_watchr”   Úread_eventsr’   rA   r“   r;   r5   r5   r6   Úrun/  s   
ÿzFSEventsEmitter.runc                 C  s<   | j rt| jjtƒrt | jj¡n| jj}t|ƒ| _d S d S r7   )	r   rG   r   r-   Úbytesr,   Úfsdecoder   r(   )r2   Ú
watch_pathr5   r5   r6   Úon_thread_start8  s   $þzFSEventsEmitter.on_thread_startr-   c                 C  s   t | jjtƒrt |¡S |S )z6Encode path only if bytes were passed to this emitter.)rG   r   r-   r™   r,   Úfsencode)r2   r-   r5   r5   r6   rU   =  s   zFSEventsEmitter._encode_path)r   r   r   r   r   r   r   r   r   r    r!   r"   )r!   r"   )r=   r   r!   r"   )r=   r   r!   r    )r=   r   rE   rI   rF   rI   r!   r"   )rQ   r   rE   rI   rR   rI   rS   rI   rT   rI   r!   r"   )r=   rW   r!   r    )r   r   rc   rd   r!   r"   )
r‡   rˆ   r‰   rŠ   r   rŠ   r‹   rŠ   r!   r"   )r-   rI   r!   rI   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r<   rC   r@   rM   rO   rP   rV   r]   Ústaticmethodrb   r†   r”   r˜   rœ   rU   Ú__classcell__r5   r5   r3   r6   r   *   s,    ù


	





 


	r   c                      s:   e Zd Zedœd‡ fdd„Zdd	d
œd‡ fdd„Z‡  ZS )ÚFSEventsObserver©r   r   r   r!   r"   c                  s   t ƒ jt|d d S )Nr¥   )r#   r$   r   )r2   r   r3   r5   r6   r$   C  s   zFSEventsObserver.__init__FN©Ú	recursiver   Úevent_handlerr   r-   Ústrr§   r    r   r   r   c                  s*   t |tƒrt d|¡}tƒ j||||dS )NÚNFCr¦   )rG   r©   ÚunicodedataÚ	normalizer#   Úschedule)r2   r¨   r-   r§   r   r3   r5   r6   r­   F  s   

zFSEventsObserver.schedule)r   r   r!   r"   )
r¨   r   r-   r©   r§   r    r   r   r!   r   )rž   rŸ   r    r   r$   r­   r£   r5   r5   r3   r6   r¤   B  s
    úr¤   )&r¡   Ú
__future__r   rm   r,   r)   rq   r«   Útypingr   Ú_watchdog_fseventsr8   Úwatchdog.eventsr   r   r   r   r   r	   r
   r   r   r   Úwatchdog.observers.apir   r   r   r   Úwatchdog.utils.dirsnapshotr   r   r   r   r   Ú	getLoggerrA   r   r¤   r5   r5   r5   r6   Ú<module>   s(    0
  