Ë
    êmxiÌ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jD                  d
«      Z# G d„ de«      Z$ G d„ de«      Z%y)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œ	 	 	 	 	 	 	 	 	 	 	 dˆ f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edd„«       Zdd„Zdd„Zdd„Zdd„Zdd„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_historyc               óŠ  •— t         ‰| �  ||||¬«       t        «       | _        || _        d| _        d | _        t        j                  «       | _	        t        j                  j                  t        j                  j                  t        j                  j                  | j                  j                  «      «      «      | _        y )N)r   r   g        )ÚsuperÚ__init__ÚsetÚ_fs_viewr   Ú_start_timeÚ_starting_stateÚ	threadingÚLockÚ_lockÚosÚpathÚrealpathÚabspathÚ
expanduserÚwatchÚ_absolute_watch_path)ÚselfÚevent_queuer-   r   r   r   Ú	__class__s         €úR/home/htdocs/ttos/venv/lib/python3.12/site-packages/watchdog/observers/fsevents.pyr    zFSEventsEmitter.__init__A   sŠ   ø€ ô 	‰Ñ˜ e°WÈ<ÐÔXÜ"%£%ˆŒØ 0ˆÔØˆÔØ9=ˆÔÜ—^‘^Ó%ˆŒ
Ü$&§G¡G×$4Ñ$4´R·W±W·_±_ÄRÇWÁW×EWÑEWÐX\×XbÑXb×XgÑXgÓEhÓ5iÓ$jˆÕ!ó    c                ól   — t        j                  | j                  «       t        j                  | «       y ©N)Ú	_fseventsÚremove_watchr-   Ústop©r/   s    r2   Úon_thread_stopzFSEventsEmitter.on_thread_stopR   s    € Ü×Ñ˜tŸz™zÔ*Ü�‰�tÕr3   c                óØ   — | j                   j                  s| j                  |«      s-t        j	                  d|«       t        j                  | |«       y t        j	                  d|«       y )Nzqueue_event %szdrop event %s)Ú_watchÚis_recursiveÚ_is_recursive_eventÚloggerÚdebugr   Úqueue_event)r/   Úevents     r2   rA   zFSEventsEmitter.queue_eventV   sK   € ð �;‰;×#Ò#¨4×+CÑ+CÀEÔ+JÜ�L‰LÐ)¨5Ô1Ü×$Ñ$ T¨5Õ1ä�L‰L˜¨%Õ0r3   c                óD  — |j                   r|j                  n(t        j                  j	                  |j                  «      }|| j
                  k(  ryt        |t        t        f«      r9t        j                  j	                  |j                  «      }|| j
                  k(  ryy)NFT)
Úis_directoryÚsrc_pathr(   r)   Údirnamer.   Ú
isinstancer   r   Ú	dest_path)r/   rB   rE   rH   s       r2   r>   z#FSEventsEmitter._is_recursive_event_   sr   € Ø%*×%7Ò%7�5—>’>¼R¿W¹W¿_¹_ÈUÏ^É^Ó=\ˆØ�t×0Ñ0Ò0Øä�eœn¬mÐ<Ô=ô Ÿ™Ÿ™¨¯©Ó8ˆIØ˜D×5Ñ5Ò5Øàr3   c                ó–   — |j                   rt        nt        }| j                   ||«      «       | j                  t	        |«      «       y r5   )rD   r   r	   rA   r   ©r/   rB   rE   rF   Úclss        r2   Ú_queue_created_eventz$FSEventsEmitter._queue_created_eventm   ó8   € Ø!&×!3Ò!3�oÔ9IˆØ×Ñ™˜X›Ô'Ø×ÑÔ)¨'Ó2Õ3r3   c                ó–   — |j                   rt        nt        }| j                   ||«      «       | j                  t	        |«      «       y r5   )rD   r   r
   rA   r   rJ   s        r2   Ú_queue_deleted_eventz$FSEventsEmitter._queue_deleted_eventr   rM   r3   c                ób   — |j                   rt        nt        }| j                   ||«      «       y r5   )rD   r   r   rA   rJ   s        r2   Ú_queue_modified_eventz%FSEventsEmitter._queue_modified_eventw   s%   € Ø"'×"4Ò"4ÕÔ:KˆØ×Ñ™˜X›Õ'r3   c                óî   — |j                   rt        nt        }| j                  |«      }| j	                   |||«      «       | j	                  t        |«      «       | j	                  t        |«      «       y r5   )rD   r   r   Ú_encode_pathrA   r   )r/   Ú	src_eventrE   Údst_pathÚsrc_dirnameÚdst_dirnamerK   s          r2   Ú_queue_renamed_eventz$FSEventsEmitter._queue_renamed_event{   s`   € ð  )×5Ò5�m¼>ˆØ×$Ñ$ XÓ.ˆØ×Ñ™˜X xÓ0Ô1Ø×ÑÔ)¨+Ó6Ô7Ø×ÑÔ)¨+Ó6Õ7r3   c                óî   — |j                   | j                  v }| j                  r9	 | j                  j                  |j                  «      d   }||j                   k(  }nd}|xs |S # t        $ r d}Y Œw xY w)Nr   F)Úinoder"   r$   r)   ÚKeyError)r/   rB   Ú
in_historyÚ	old_inodeÚbefore_starts        r2   Ú_is_historic_created_eventz*FSEventsEmitter._is_historic_created_event‰   sy   € ð —[‘[ D§M¡MÐ1ˆ
à×Òð%Ø ×0Ñ0×6Ñ6°u·z±zÓBÀ1ÑE�	Ø(¨E¯K©KÑ7‘ð !ˆLàÒ)˜\Ð)øô ò %Ø$’ð%ús   ¦7A& Á&A4Á3A4c                óR   — | j                   xs | j                  xs | j                  S )z9Returns True if the event indicates a change in metadata.)Úis_inode_meta_modÚis_xattr_modÚis_owner_change)rB   s    r2   Ú_is_meta_modzFSEventsEmitter._is_meta_modš   s&   € ð ×&Ñ&ÒU¨%×*<Ñ*<ÒUÀ×@UÑ@UÐUr3   c                ó^
  ‡— t         j                  «       t        j                  k  rA|D ]<  Šdj	                  ˆfd„t        ‰«      D «       «      }t         j                  d‰|«       Œ> t        j                  «       | j                  z
  dkD  rd | _
        |�r†|j                  d«      Š| j                  ‰j                  «      }t        j                  j                  |«      }	 t        j                   |«      }|xr |j$                  ‰j&                  k(  }‰j(                  r¿‰j*                  r³| j-                  ‰«      s| j/                  ‰||«       | j0                  j3                  ‰j&                  «       ‰j4                  s| j7                  ‰«      r| j9                  ‰||«       | j;                  ‰||«       | j0                  j=                  ‰j&                  «       �n¿‰j(                  r$| j-                  ‰«      s| j/                  ‰||«       | j0                  j3                  ‰j&                  «       ‰j4                  s| j7                  ‰«      r| j9                  ‰||«       ‰j>                  �rétA        tC        ˆfd„|D «       «      d «      }|�r2t         j                  d|«       | j                  |j                  «      }	t        j                  j                  |	«      }
| jE                  ‰||	||
«       | j0                  j3                  ‰j&                  «       tG        ||	«      D ]  }| jI                  |«       Œ |jK                  |«       |j4                  s| j7                  |«      r| j9                  ||	|
«       |j*                  rÏ| j;                  ||	|
«       | j0                  j=                  |j&                  «       n–|rZ| j/                  ‰||«       | j0                  j3                  ‰j&                  «       tM        |«      D ]  }| jI                  |«       Œ n:| j;                  ‰||«       | j0                  j=                  ‰j&                  «       �ŒÇ‰j*                  r8| j;                  ‰||«       | j0                  j=                  ‰j&                  «       ‰jN                  rm| jI                  tQ        | jR                  j                  «      «       t         j                  d«       | jU                  «        | j0                  jW                  «        |r�Œ…y y # t"        $ r d }Y �Œ4w xY w)	Nz, c              3  ó@   •K  — | ]  }t        ‰|«      d u sŒ|–— Œ y­w)TN)Úgetattr)Ú.0ÚattrrB   s     €r2   ú	<genexpr>z/FSEventsEmitter.queue_events.<locals>.<genexpr>¢   s!   øè ø€ Ò!^¨4ÄÈÐPTÓAUÐY]ÒA]¤$Ñ!^ùs   ƒ—z%s: %sé<   r   c              3  óp   •K  — | ]-  }|j                   sŒ|j                  ‰j                  k(  sŒ*|–— Œ/ y ­wr5   )Ú
is_renamedrZ   )rh   ÚerB   s     €r2   rj   z/FSEventsEmitter.queue_events.<locals>.<genexpr>ä   s&   øè ø€ ÒZ 1°!·,³,À1Ç7Á7ÈeÏkÉkÓCYœQÑZùs   ƒ6•6¯6z"Destination event for rename is %sz&Stopping because root path was changed),r?   ÚgetEffectiveLevelÚloggingÚDEBUGÚjoinÚdirr@   ÚtimeÚ	monotonicr#   r$   ÚpoprS   r)   r(   rF   ÚstatÚOSErrorÚst_inorZ   Ú
is_createdÚ
is_removedr_   rL   r"   ÚaddÚis_modifiedrd   rQ   rO   Údiscardrm   ÚnextÚiterrX   r   rA   Úremover   Úis_root_changedr   r-   r8   Úclear)r/   r   ÚeventsÚflagsrE   rV   rw   ÚexistsÚ	dst_eventrU   rW   Úsub_moved_eventÚsub_created_eventrB   s                @r2   Úqueue_eventszFSEventsEmitter.queue_eventsŸ   s
  ø€ Ü×#Ñ#Ó%¬¯©Ò6Øò 5�ØŸ	™	Ó!^´3°u³:Ô!^Ó^�Ü—‘˜X u¨eÕ4ð5ô �>‰>Ó˜d×.Ñ.Ñ.°Ò3à#'ˆDÔ âØ—J‘J˜q“MˆEà×(Ñ(¨¯©Ó4ˆHÜŸ'™'Ÿ/™/¨(Ó3ˆKðÜ—w‘w˜xÓ(�ð Ò8˜dŸk™k¨U¯[©[Ñ8ˆFð( ×Ò E×$4Ò$4ð
 ×6Ñ6°uÔ=Ø×-Ñ-¨e°X¸{ÔKà—‘×!Ñ! %§+¡+Ô.à×$Ò$¨×(9Ñ(9¸%Ô(@Ø×.Ñ.¨u°hÀÔLà×)Ñ)¨%°¸;ÔGØ—‘×%Ñ% e§k¡kÖ2ð ×#Ò#¨D×,KÑ,KÈEÔ,RØ×-Ñ-¨e°X¸{ÔKà—‘×!Ñ! %§+¡+Ô.à×$Ò$¨×(9Ñ(9¸%Ô(@Ø×.Ñ.¨u°hÀÔLà×#Ó#ä $ÜÓZ¨ÔZÓZØó!�Iò
 !äŸ™Ð%IÈ9ÔUà#'×#4Ñ#4°Y·^±^Ó#D˜Ü&(§g¡g§o¡o°hÓ&?˜à×1Ñ1°%¸À8È[ÐZeÔfØŸ™×)Ñ)¨%¯+©+Ô6ä/HÈÐS[Ó/\ò >˜OØ ×,Ñ,¨_Õ=ð>ð
 Ÿ™ iÔ0à$×0Ò0°D×4EÑ4EÀiÔ4PØ ×6Ñ6°yÀ(ÈKÔXà$×/Ò/Ø ×5Ñ5°iÀÈ;ÔWØ ŸM™M×1Ñ1°)·/±/ÕBáð ×1Ñ1°%¸À;ÔOØŸ™×)Ñ)¨%¯+©+Ô6ä1LÈXÓ1Vò @Ð-Ø ×,Ñ,Ð->Õ?ñ@ð ×1Ñ1°%¸À;ÔOØŸ™×-Ñ-¨e¯k©kÔ:ñ !à×#Ò#à×-Ñ-¨e°X¸{ÔKØ—M‘M×)Ñ)¨%¯+©+Ô6à×$Ò$ð × Ñ ¤°·±·±Ó!AÔBÜ—‘ÐEÔFØ—	‘	”à—‘×#Ñ#Ô%õk øô ò Ø“ðús   Ã"T ÔT,Ô+T,c                óV  — t         j                  }	 t        ||||«      D ����	cg c]  \  }}}}	 |||||	«      ‘Œ }
}}}}	| j                  5  | j	                  | j
                  |
«       ddd«       yc c}	}}}w # 1 sw Y   yxY w# t        $ r t        j                  d«       Y yw xY w)zhCallback passed to FSEventStreamCreate(), it will receive all
        FS events and queue them.
        Nz(Unhandled exception in fsevents callback)	r6   ÚNativeEventÚzipr'   rŠ   r   Ú	Exceptionr?   Ú	exception)r/   ÚpathsÚinodesr…   ÚidsrK   r)   rZ   Úevent_flagsÚevent_idr„   s              r2   Úevents_callbackzFSEventsEmitter.events_callback   s³   € ô ×#Ñ#ˆð	Iô ;>¸eÀVÈUÐTWÓ:X÷ñ á6�D˜% ¨hñ �D˜% ¨hÕ7ðˆFó ð —‘ñ 8Ø×!Ñ! $§,¡,°Ô7÷8ð 8ùõ	÷8ð 8ûäò 	IÜ×ÑÐGÖHð	Iús?   ’B ¥A3
¼B ÁA;Á*B Á3B Á;BÂ B ÂB ÂB(Â'B(c                óN  — | j                   j                  g| _        t        j                  «       | _        	 t        j                  | | j                   | j                  | j                  «       t        j                  | «       y # t        $ r t        j                  d«       Y y w xY w)Nz&Unhandled exception in FSEventsEmitter)r-   r)   Ú	pathnamesrt   ru   r#   r6   Ú	add_watchr•   Úread_eventsrŽ   r?   r�   r9   s    r2   ÚrunzFSEventsEmitter.run/  sy   € ØŸ*™*Ÿ/™/Ð*ˆŒÜŸ>™>Ó+ˆÔð	GÜ×Ñ  d§j¡j°$×2FÑ2FÈÏÉÔWÜ×!Ñ! $Õ'øÜò 	GÜ×ÑÐEÖFð	Gús   ·AB ÂB$Â#B$c                ó  — | j                   rtt        | j                  j                  t        «      r)t        j                  | j                  j                  «      n| j                  j                  }t        |«      | _        y y r5   )	r   rG   r-   r)   Úbytesr(   Úfsdecoder   r$   )r/   Ú
watch_paths     r2   Úon_thread_startzFSEventsEmitter.on_thread_start8  sT   € Ø× Ò Ü9CÀDÇJÁJÇOÁOÔUZÔ9[œŸ™ T§Z¡Z§_¡_Ô5Ðae×akÑak×apÑapˆJÜ#4°ZÓ#@ˆDÕ ð !r3   c                óx   — t        | j                  j                  t        «      rt	        j
                  |«      S |S )z6Encode path only if bytes were passed to this emitter.)rG   r-   r)   rœ   r(   Úfsencode)r/   r)   s     r2   rS   zFSEventsEmitter._encode_path=  s'   € ä$.¨t¯z©z¯©ÄÔ$FŒr�{‰{˜4Ó ÐPÈDÐPr3   )r0   r   r-   r   r   Úfloatr   ú"list[type[FileSystemEvent]] | Noner   ÚboolÚreturnÚNone)r¥   r¦   )rB   r   r¥   r¦   )rB   r   r¥   r¤   )rB   r   rE   úbytes | strrF   r§   r¥   r¦   )rT   r   rE   r§   rU   r§   rV   r§   rW   r§   r¥   r¦   )rB   z_fsevents.NativeEventr¥   r¤   )r   r¢   r„   zlist[_fsevents.NativeEvent]r¥   r¦   )
r�   zlist[bytes]r‘   ú	list[int]r…   r¨   r’   r¨   r¥   r¦   )r)   r§   r¥   r§   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r:   rA   r>   rL   rO   rQ   rX   r_   Ústaticmethodrd   rŠ   r•   rš   rŸ   rS   Ú__classcell__©r1   s   @r2   r   r   *   sð   ø„ ñð6 1Ø;?Ø!&ñkàðkð ðkð
 ðkð 9ðkð ðkð 
õkó"ó1óó4ó
4ó
(ð8à"ð8ð ð8ð ð	8ð
 !ð8ð !ð8ð 
ó8ó*ð" òVó ðVó&óBIóGóA÷
Qr3   r   c                  óL   ‡ — e Zd Zedœdˆ fd„Zdddœ	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )	ÚFSEventsObserver©r   c               ó0   •— t         ‰| �  t        |¬«       y )Nr²   )r   r    r   )r/   r   r1   s     €r2   r    zFSEventsObserver.__init__C  s   ø€ Ü‰Ñœ°'ÐÕ:r3   FN©Ú	recursiver   c               óv   •— t        |t        «      rt        j                  d|«      }t        ‰| �  ||||¬«      S )NÚNFCr´   )rG   ÚstrÚunicodedataÚ	normalizer   Úschedule)r/   Úevent_handlerr)   rµ   r   r1   s        €r2   r»   zFSEventsObserver.scheduleF  s;   ø€ ô �dœCÔ Ü×(Ñ(¨°Ó5ˆDä‰wÑ ¨t¸yÐWcÐÓdÐdr3   )r   r¢   r¥   r¦   )
r¼   r   r)   r¸   rµ   r¤   r   r£   r¥   r   )r©   rª   r«   r   r    r»   r®   r¯   s   @r2   r±   r±   B  sT   ø„ Ø+C÷ ;ð  Ø;?ñeà-ðeð ðeð
 ðeð 9ðeð 
÷eñ er3   r±   )&r¬   Ú
__future__r   rp   r(   r%   rt   r¹   Útypingr   Ú_watchdog_fseventsr6   Úwatchdog.eventsr   r   r   r   r	   r
   r   r   r   r   Úwatchdog.observers.apir   r   r   r   Úwatchdog.utils.dirsnapshotr   r   r   r   r   Ú	getLoggerr?   r   r±   © r3   r2   ú<module>rÅ      s{   ðñõ #ã Û 	Û Û Û Ý  ã &÷÷ ÷ ÷ qÓ pÝ 8áßGß@ð 
ˆ×	Ñ	˜:Ó	&€ôUQ�lô UQôpe�|õ er3   