§
    xÅjÌ7  ã                  ó"  — 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	rddlmZmZ dd	lm Z m!Z!  ej"        d
¦  «        Z# G d„ de¦  «        Z$ G 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                  ó®   ‡ — e Zd ZdZedddœd3ˆ fd„Zd4d„Zd5d„Zd6d„Zd7d„Z	d7d„Z
d7d„Zd8d!„Zd9d#„Zed9d$„¦   «         Zd:d'„Zd;d.„Zd4d/„Zd4d0„Zd<d2„Zˆ xZS )=Ú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               ó¢  •— t          ¦   «                              ||||¬¦  «         t          ¦   «         | _        || _        d| _        d | _        t          j        ¦   «         | _	        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__s         €úLC:\Projects\Historical\venv\Lib\site-packages\watchdog/observers/fsevents.pyr'   zFSEventsEmitter.__init__A   s›   ø€ õ 	‰Œ×Ò˜ e°WÈ<ÐÑXÔXÐXÝ"%¡%¤%ˆŒØ 0ˆÔØˆÔØ9=ˆÔÝ”^Ñ%Ô%ˆŒ
Ý$&¤G×$4Ò$4µR´W·_²_ÅRÄW×EWÒEWÐX\ÔXbÔXgÑEhÔEhÑ5iÔ5iÑ$jÔ$jˆÔ!Ð!Ð!ó    c                ó`   — t          j        | j        ¦  «         t          j        | ¦  «         d S ©N)Ú	_fseventsÚremove_watchr   Ústop©r5   s    r7   Úon_thread_stopzFSEventsEmitter.on_thread_stopR   s+   € ÝÔ˜tœzÑ*Ô*Ð*ÝŒ�tÑÔÐÐÐr8   Úeventr   c                óâ   — | j         j        s|                      |¦  «        s2t                               d|¦  «         t          j        | |¦  «         d S t                               d|¦  «         d S )Nzqueue_event %szdrop event %s)Ú_watchÚis_recursiveÚ_is_recursive_eventÚloggerÚdebugr   Úqueue_event)r5   r@   s     r7   rG   zFSEventsEmitter.queue_eventV   sn   € ð Œ;Ô#ð 	1¨4×+CÒ+CÀEÑ+JÔ+Jð 	1Ý�LŠLÐ)¨5Ñ1Ô1Ð1ÝÔ$ T¨5Ñ1Ô1Ð1Ð1Ð1å�LŠL˜¨%Ñ0Ô0Ð0Ð0Ð0r8   c                ó  — |j         r|j        n#t          j                             |j        ¦  «        }|| j        k    rdS t          |t          t          f¦  «        r1t          j                             |j	        ¦  «        }|| j        k    rdS dS )NFT)
Úis_directoryÚsrc_pathr/   r0   Údirnamer4   Ú
isinstancer   r   Ú	dest_path)r5   r@   rJ   rM   s       r7   rD   z#FSEventsEmitter._is_recursive_event_   s~   € Ø%*Ô%7Ð\�5”>�>½R¼W¿_º_ÈUÌ^Ñ=\Ô=\ˆØ�tÔ0Ò0Ð0Ø�5å�e�n­mÐ<Ñ=Ô=ð 	õ œŸš¨¬Ñ8Ô8ˆIØ˜DÔ5Ò5Ð5Ø�uàˆtr8   rJ   úbytes | strrK   c                ó°   — |j         rt          nt          }|                       ||¦  «        ¦  «         |                      t	          |¦  «        ¦  «         d S r:   )rI   r   r	   rG   r   ©r5   r@   rJ   rK   Úclss        r7   Ú_queue_created_eventz$FSEventsEmitter._queue_created_eventm   óS   € Ø!&Ô!3ÐI�oˆoÕ9IˆØ×Ò˜˜˜X™œÑ'Ô'Ð'Ø×ÒÕ)¨'Ñ2Ô2Ñ3Ô3Ð3Ð3Ð3r8   c                ó°   — |j         rt          nt          }|                       ||¦  «        ¦  «         |                      t	          |¦  «        ¦  «         d S r:   )rI   r   r
   rG   r   rP   s        r7   Ú_queue_deleted_eventz$FSEventsEmitter._queue_deleted_eventr   rS   r8   c                ól   — |j         rt          nt          }|                       ||¦  «        ¦  «         d S r:   )rI   r   r   rG   rP   s        r7   Ú_queue_modified_eventz%FSEventsEmitter._queue_modified_eventw   s8   € Ø"'Ô"4ÐKÕÐÕ:KˆØ×Ò˜˜˜X™œÑ'Ô'Ð'Ð'Ð'r8   Ú	src_eventÚdst_pathÚsrc_dirnameÚdst_dirnamec                ó   — |j         rt          nt          }|                      |¦  «        }|                       |||¦  «        ¦  «         |                      t          |¦  «        ¦  «         |                      t          |¦  «        ¦  «         d S r:   )rI   r   r   Ú_encode_pathrG   r   )r5   rX   rJ   rY   rZ   r[   rQ   s          r7   Ú_queue_renamed_eventz$FSEventsEmitter._queue_renamed_event{   sˆ   € ð  )Ô5ÐI�mˆm½>ˆØ×$Ò$ XÑ.Ô.ˆØ×Ò˜˜˜X xÑ0Ô0Ñ1Ô1Ð1Ø×ÒÕ)¨+Ñ6Ô6Ñ7Ô7Ð7Ø×ÒÕ)¨+Ñ6Ô6Ñ7Ô7Ð7Ð7Ð7r8   ú_fsevents.NativeEventc                óÀ   — |j         | j        v }| j        rD	 | j                              |j        ¦  «        d         }||j         k    }n# t          $ r d}Y nw xY wd}|p|S )Nr   F)Úinoder)   r+   r0   ÚKeyError)r5   r@   Ú
in_historyÚ	old_inodeÚbefore_starts        r7   Ú_is_historic_created_eventz*FSEventsEmitter._is_historic_created_event‰   sƒ   € ð ”[ D¤MÐ1ˆ
àÔð 	!ð%Ø Ô0×6Ò6°u´zÑBÔBÀ1ÔE�	Ø(¨E¬KÒ7��øÝð %ð %ð %Ø$���ð%øøøð !ˆLàÐ)˜\Ð)s   —0A ÁAÁAc                ó,   — | 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@   s    r7   Ú_is_meta_modzFSEventsEmitter._is_meta_modš   s   € ð Ô&ÐU¨%Ô*<ÐUÀÔ@UÐUr8   Úeventsúlist[_fsevents.NativeEvent]c                ól
  ‡— t                                ¦   «         t          j        k    rO|D ]LŠd                     ˆfd„t          ‰¦  «        D ¦   «         ¦  «        }t                                d‰|¦  «         ŒMt          j        ¦   «         | j	        z
  dk    rd | _
        |�r“|                     d¦  «        Š|                      ‰j        ¦  «        }t          j                             |¦  «        }	 t          j        |¦  «        }n# t"          $ r d }Y nw xY w|o|j        ‰j        k    }‰j        r½‰j        r¶|                      ‰¦  «        s|                      ‰||¦  «         | j                             ‰j        ¦  «         ‰j        s|                      ‰¦  «        r|                      ‰||¦  «         |                      ‰||¦  «         | j                             ‰j        ¦  «         �nÈ‰j        r,|                      ‰¦  «        s|                      ‰||¦  «         | j                             ‰j        ¦  «         ‰j        s|                      ‰¦  «        r|                      ‰||¦  «         ‰j        �rþtA          tC          ˆfd„|D ¦   «         ¦  «        d ¦  «        }|�r:t                                d|¦  «         |                      |j        ¦  «        }	t          j                             |	¦  «        }
|  "                    ‰||	||
¦  «         | j                             ‰j        ¦  «         tG          ||	¦  «        D ]}|  $                    |¦  «         Œ| %                    |¦  «         |j        s|                      |¦  «        r|                      ||	|
¦  «         |j        r6|                      ||	|
¦  «         | j                             |j        ¦  «         n˜|r^|                      ‰||¦  «         | j                             ‰j        ¦  «         tM          |¦  «        D ]}|  $                    |¦  «         Œn8|                      ‰||¦  «         | j                             ‰j        ¦  «         �ŒÚ‰j        r6|                      ‰||¦  «         | j                             ‰j        ¦  «         ‰j'        rs|  $                    tQ          | j)        j        ¦  «        ¦  «         t                                d¦  «         |  *                    ¦   «          | j         +                    ¦   «          |�°‘d S d S )	Nz, c              3  ó@   •K  — | ]}t          ‰|¦  «        d u ¯|V — ŒdS )TN)Úgetattr)Ú.0Úattrr@   s     €r7   ú	<genexpr>z/FSEventsEmitter.queue_events.<locals>.<genexpr>¢   s9   øè è € Ð!^Ð!^¨4ÅÈÐPTÑAUÔAUÐY]ÐA]ÐA] $ÐA]ÐA]ÐA]ÐA]Ð!^Ð!^r8   z%s: %sé<   r   c              3  óJ   •K  — | ]}|j         ¯	|j        ‰j        k    ¯|V — Œd S r:   )Ú
is_renamedra   )rq   Úer@   s     €r7   rs   z/FSEventsEmitter.queue_events.<locals>.<genexpr>ä   s8   øè è € ÐZÐZ 1°!´,ÐZÀ1Ä7ÈeÌkÒCYÐCY˜QÐCYÐCYÐCYÐCYÐZÐZr8   z"Destination event for rename is %sz&Stopping because root path was changed),rE   ÚgetEffectiveLevelÚloggingÚDEBUGÚjoinÚdirrF   ÚtimeÚ	monotonicr*   r+   Úpopr]   r0   r/   rK   ÚstatÚOSErrorÚst_inora   Ú
is_createdÚ
is_removedrf   rR   r)   ÚaddÚis_modifiedrk   rW   rU   Údiscardrv   ÚnextÚiterr^   r   rG   Úremover   Úis_root_changedr   r   r=   Úclear)r5   r   rl   ÚflagsrJ   rZ   r€   ÚexistsÚ	dst_eventrY   r[   Úsub_moved_eventÚsub_created_eventr@   s                @r7   Úqueue_eventszFSEventsEmitter.queue_eventsŸ   s]  ø€ Ý×#Ò#Ñ%Ô%­¬Ò6Ð6Øð 5ð 5�ØŸ	š	Ð!^Ð!^Ð!^Ð!^µ3°u±:´:Ð!^Ñ!^Ô!^Ñ^Ô^�Ý—’˜X u¨eÑ4Ô4Ð4Ð4åŒ>ÑÔ˜dÔ.Ñ.°Ò3Ð3à#'ˆDÔ àñ u	&Ø—J’J˜q‘M”MˆEà×(Ò(¨¬Ñ4Ô4ˆHÝœ'Ÿ/š/¨(Ñ3Ô3ˆKðÝ”w˜xÑ(Ô(��øÝð ð ð Ø���ðøøøð Ð8˜dœk¨U¬[Ò8ˆFð( Ôð M7 EÔ$4ð M7ð
 ×6Ò6°uÑ=Ô=ð LØ×-Ò-¨e°X¸{ÑKÔKÐKà”×!Ò! %¤+Ñ.Ô.Ð.àÔ$ð M¨×(9Ò(9¸%Ñ(@Ô(@ð MØ×.Ò.¨u°hÀÑLÔLÐLà×)Ò)¨%°¸;ÑGÔGÐGØ”×%Ò% e¤kÑ2Ô2Ð2Ñ2ð Ô#ð L¨D×,KÒ,KÈEÑ,RÔ,Rð LØ×-Ò-¨e°X¸{ÑKÔKÐKà”×!Ò! %¤+Ñ.Ô.Ð.àÔ$ð M¨×(9Ò(9¸%Ñ(@Ô(@ð MØ×.Ò.¨u°hÀÑLÔLÐLàÔ#ñ /!å $ÝÐZÐZÐZÐZ¨ÐZÑZÔZÑZÔZØñ!ô !�Ið
 !ñ (!åŸšÐ%IÈ9ÑUÔUÐUà#'×#4Ò#4°Y´^Ñ#DÔ#D˜Ý&(¤g§o¢o°hÑ&?Ô&?˜à×1Ò1°%¸À8È[ÐZeÑfÔfÐfØœ×)Ò)¨%¬+Ñ6Ô6Ð6å/HÈÐS[Ñ/\Ô/\ð >ð >˜OØ ×,Ò,¨_Ñ=Ô=Ð=Ð=ð Ÿš iÑ0Ô0Ð0à$Ô0ð Y°D×4EÒ4EÀiÑ4PÔ4Pð YØ ×6Ò6°yÀ(ÈKÑXÔXÐXà$Ô/ð CØ ×5Ò5°iÀÈ;ÑWÔWÐWØ œM×1Ò1°)´/ÑBÔBÐBøàð !ð ×1Ò1°%¸À;ÑOÔOÐOØœ×)Ò)¨%¬+Ñ6Ô6Ð6å1LÈXÑ1VÔ1Vð @ð @Ð-Ø ×,Ò,Ð->Ñ?Ô?Ð?Ð?ð@ð ×1Ò1°%¸À;ÑOÔOÐOØœ×-Ò-¨e¬kÑ:Ô:Ð:ñ !àÔ#ð 7à×-Ò-¨e°X¸{ÑKÔKÐKØ”M×)Ò)¨%¬+Ñ6Ô6Ð6àÔ$ð &ð × Ò ¥°´´Ñ!AÔ!AÑBÔBÐBÝ—’ÐEÑFÔFÐFØ—	’	‘”�à”×#Ò#Ñ%Ô%Ð%ðk ñ u	&ð u	&ð u	&ð u	&ð u	&s   Ã0D ÄDÄDÚpathsúlist[bytes]Úinodesú	list[int]r�   Úidsc                ó*  ‡— t           j        Š	 ˆfd„t          ||||¦  «        D ¦   «         }| j        5  |                      | j        |¦  «         ddd¦  «         dS # 1 swxY w Y   dS # t          $ r t                               d¦  «         Y dS w xY w)zhCallback passed to FSEventStreamCreate(), it will receive all
        FS events and queue them.
        c                ó6   •— g | ]\  }}}} ‰||||¦  «        ‘ŒS © rš   )rq   r0   ra   Úevent_flagsÚevent_idrQ   s        €r7   ú
<listcomp>z3FSEventsEmitter.events_callback.<locals>.<listcomp>&  sA   ø€ ð ð ð á6�D˜% ¨hð ��D˜% ¨hÑ7Ô7ðð ð r8   Nz(Unhandled exception in fsevents callback)	r;   ÚNativeEventÚzipr.   r’   r   Ú	ExceptionrE   Ú	exception)r5   r“   r•   r�   r—   rl   rQ   s         @r7   Úevents_callbackzFSEventsEmitter.events_callback   s  ø€ õ Ô#ˆð	Iðð ð ð å:=¸eÀVÈUÐTWÑ:XÔ:Xðñ ô ˆFð ”ð 8ð 8Ø×!Ò! $¤,°Ñ7Ô7Ð7ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð 8ð 8øåð 	Ið 	Ið 	IÝ×ÒÐGÑHÔHÐHÐHÐHÐHð	Iøøøs4   �%A* ´AÁA* ÁA!Á!A* Á$A!Á%A* Á*$BÂBc                ó&  — | j         j        g| _        t          j        ¦   «         | _        	 t          j        | | j         | j        | j        ¦  «         t          j	        | ¦  «         d S # t          $ r t                               d¦  «         Y d S w xY w)Nz&Unhandled exception in FSEventsEmitter)r   r0   Ú	pathnamesr}   r~   r*   r;   Ú	add_watchr¢   Úread_eventsr    rE   r¡   r>   s    r7   ÚrunzFSEventsEmitter.run/  s˜   € Øœ*œ/Ð*ˆŒÝœ>Ñ+Ô+ˆÔð	GÝÔ  d¤j°$Ô2FÈÌÑWÔWÐWÝÔ! $Ñ'Ô'Ð'Ð'Ð'øÝð 	Gð 	Gð 	GÝ×ÒÐEÑFÔFÐFÐFÐFÐFð	Gøøøs   ¬:A( Á($BÂBc                óÒ   — | j         r_t          | j        j        t          ¦  «        rt          j        | j        j        ¦  «        n| j        j        }t          |¦  «        | _        d S d S r:   )	r   rL   r   r0   Úbytesr/   Úfsdecoder   r+   )r5   Ú
watch_paths     r7   Úon_thread_startzFSEventsEmitter.on_thread_start8  sc   € ØÔ ð 	AÝ9CÀDÄJÄOÕUZÑ9[Ô9[Ðp�œ T¤Z¤_Ñ5Ô5Ð5ÐaeÔakÔapˆJÝ#4°ZÑ#@Ô#@ˆDÔ Ð Ð ð	Að 	Ar8   r0   c                ól   — t          | j        j        t          ¦  «        rt	          j        |¦  «        n|S )z6Encode path only if bytes were passed to this emitter.)rL   r   r0   r©   r/   Úfsencode)r5   r0   s     r7   r]   zFSEventsEmitter._encode_path=  s*   € å$.¨t¬z¬ÅÑ$FÔ$FÐP�rŒ{˜4Ñ Ô Ð ÈDÐPr8   )r   r   r   r   r   r    r   r!   r   r"   r#   r$   )r#   r$   )r@   r   r#   r$   )r@   r   r#   r"   )r@   r   rJ   rN   rK   rN   r#   r$   )rX   r   rJ   rN   rY   rN   rZ   rN   r[   rN   r#   r$   )r@   r_   r#   r"   )r   r    rl   rm   r#   r$   )
r“   r”   r•   r–   r�   r–   r—   r–   r#   r$   )r0   rN   r#   rN   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r?   rG   rD   rR   rU   rW   r^   rf   Ústaticmethodrk   r’   r¢   r§   r¬   r]   Ú__classcell__©r6   s   @r7   r   r   *   s¥  ø€ € € € € ðð ð6 1Ø;?Ø!&ðkð kð kð kð kð kð kð kð"ð ð ð ð1ð 1ð 1ð 1ðð ð ð ð4ð 4ð 4ð 4ð
4ð 4ð 4ð 4ð
(ð (ð (ð (ð8ð 8ð 8ð 8ð*ð *ð *ð *ð" ðVð Vð Vñ „\ðVð&ð &ð &ð &ðBIð Ið Ið IðGð Gð Gð GðAð Að Að Að
Qð Qð Qð Qð Qð Qð Qð Qr8   r   c                  ó:   ‡ — e Zd Zedœdˆ fd„Zddd	œdˆ fd„Zˆ xZS )ÚFSEventsObserver©r   r   r    r#   r$   c               óX   •— t          ¦   «                              t          |¬¦  «         d S )Nr¸   )r&   r'   r   )r5   r   r6   s     €r7   r'   zFSEventsObserver.__init__C  s&   ø€ Ý‰Œ×Ò�°'ÐÑ:Ô:Ð:Ð:Ð:r8   FN©Ú	recursiver   Úevent_handlerr   r0   Ústrr»   r"   r   r!   r   c               ó¢   •— t          |t          ¦  «        rt          j        d|¦  «        }t	          ¦   «                              ||||¬¦  «        S )NÚNFCrº   )rL   r½   ÚunicodedataÚ	normalizer&   Úschedule)r5   r¼   r0   r»   r   r6   s        €r7   rÂ   zFSEventsObserver.scheduleF  sK   ø€ õ �d�CÑ Ô ð 	6ÝÔ(¨°Ñ5Ô5ˆDå‰wŒw×Ò ¨t¸yÐWcÐÑdÔdÐdr8   )r   r    r#   r$   )
r¼   r   r0   r½   r»   r"   r   r!   r#   r   )r¯   r°   r±   r   r'   rÂ   r´   rµ   s   @r7   r·   r·   B  s†   ø€ € € € € Ø+Cð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð  Ø;?ðeð eð eð eð eð eð eð eð eð eð eð er8   r·   )&r²   Ú
__future__r   ry   r/   r,   r}   rÀ   Útypingr   Ú_watchdog_fseventsr;   Úwatchdog.eventsr   r   r   r   r	   r
   r   r   r   r   Úwatchdog.observers.apir   r   r   r   Úwatchdog.utils.dirsnapshotr   r   r   r   r   Ú	getLoggerrE   r   r·   rš   r8   r7   ú<module>rÊ      së  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð qÐ pÐ pÐ pÐ pÐ pÐ pÐ pÐ pÐ pÐ pÐ pØ 8Ð 8Ð 8Ð 8Ð 8Ð 8àð AØGÐGÐGÐGÐGÐGÐGÐGØ@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ð 
ˆÔ	˜:Ñ	&Ô	&€ðUQð UQð UQð UQð UQ�lñ UQô UQð UQðpeð eð eð eð e�|ñ eô eð eð eð er8   