Ë
    äÞËjù5  ã                  óè   — 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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j8                  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)
Ú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Úfseventsc                  óˆ   ‡ — e Zd ZdZeddfˆ fd„	Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zed„ «       Zd„ Zd„ Zd„ Zd„ Z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``
    NFc                óˆ  •— t         ‰| �  ||||«       t        «       | _        || _        d| _        d | _        t        j                  «       | _	        t        j                  j                  t        j                  j                  t        j                  j                  | j                  j                  «      «      «      | _        y )Ng        )ÚsuperÚ__init__ÚsetÚ_fs_viewÚsuppress_historyÚ_start_timeÚ_starting_stateÚ	threadingÚLockÚ_lockÚosÚpathÚrealpathÚabspathÚ
expanduserÚwatchÚ_absolute_watch_path)ÚselfÚevent_queuer&   ÚtimeoutÚevent_filterr   Ú	__class__s         €úX/var/www/photos/backend/venv/lib/python3.12/site-packages/watchdog/observers/fsevents.pyr   zFSEventsEmitter.__init__J   s‡   ø€ ô 	‰Ñ˜ e¨W°lÔCÜ›ˆŒØ 0ˆÔØˆÔØ#ˆÔÜ—^‘^Ó%ˆŒ
Ü$&§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    r-   Úon_thread_stopzFSEventsEmitter.on_thread_stopZ   s    € Ü×Ñ˜tŸz™zÔ*Ü�‰�tÕr.   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     r-   r<   zFSEventsEmitter.queue_event^   sK   € ð �;‰;×#Ò#¨4×+CÑ+CÀEÔ+JÜ�L‰LÐ)¨5Ô1Ü×$Ñ$ T¨5Õ1ä�L‰L˜¨%Õ0r.   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(   r=   r@   rC   s       r-   r9   z#FSEventsEmitter._is_recursive_eventg   sr   € Ø%*×%7Ò%7�5—>’>¼R¿W¹W¿_¹_ÈUÏ^É^Ó=\ˆØ�t×0Ñ0Ò0Øä�eœn¬mÐ<Ô=ô Ÿ™Ÿ™¨¯©Ó8ˆIØ˜D×5Ñ5Ò5Øàr.   c                ó–   — |j                   rt        nt        }| j                   ||«      «       | j                  t	        |«      «       y r0   )r?   r   r   r<   r   ©r(   r=   r@   rA   Úclss        r-   Ú_queue_created_eventz$FSEventsEmitter._queue_created_eventu   ó8   € Ø!&×!3Ò!3�oÔ9IˆØ×Ñ™˜X›Ô'Ø×ÑÔ)¨'Ó2Õ3r.   c                ó–   — |j                   rt        nt        }| j                   ||«      «       | j                  t	        |«      «       y r0   )r?   r   r	   r<   r   rE   s        r-   Ú_queue_deleted_eventz$FSEventsEmitter._queue_deleted_eventz   rH   r.   c                ób   — |j                   rt        nt        }| j                   ||«      «       y r0   )r?   r   r
   r<   rE   s        r-   Ú_queue_modified_eventz%FSEventsEmitter._queue_modified_event   s%   € Ø"'×"4Ò"4ÕÔ:KˆØ×Ñ™˜X›Õ'r.   c                óî   — |j                   rt        nt        }| j                  |«      }| j	                   |||«      «       | j	                  t        |«      «       | j	                  t        |«      «       y r0   )r?   r   r   Ú_encode_pathr<   r   )r(   Ú	src_eventr@   Údst_pathÚsrc_dirnameÚdst_dirnamerF   s          r-   Ú_queue_renamed_eventz$FSEventsEmitter._queue_renamed_eventƒ   s^   € Ø(×5Ò5�m¼>ˆØ×$Ñ$ XÓ.ˆØ×Ñ™˜X xÓ0Ô1Ø×ÑÔ)¨+Ó6Ô7Ø×ÑÔ)¨+Ó6Õ7r.   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(   r=   Ú
in_historyÚ	old_inodeÚbefore_starts        r-   Ú_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)r=   s    r-   Ú_is_meta_modzFSEventsEmitter._is_meta_mod›   s&   € ð ×&Ñ&ÒU¨%×*<Ñ*<ÒUÀ×@UÑ@UÐUr.   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Úattrr=   s     €r-   ú	<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r0   )Ú
is_renamedrU   )rc   Úer=   s     €r-   re   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   ÚpoprN   r"   r!   rA   ÚstatÚOSErrorÚst_inorU   Ú
is_createdÚ
is_removedrZ   rG   r   ÚaddÚis_modifiedr_   rL   rJ   Údiscardrh   ÚnextÚiterrS   r   r<   Úremover   Úis_root_changedr   r&   r3   Úclear)r(   r*   ÚeventsÚflagsr@   rQ   rr   ÚexistsÚ	dst_eventrP   rR   Ú	sub_eventr=   s               @r-   Ú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ä)BÀ8ÈXÓ)Vò 8˜IØ ×,Ñ,¨YÕ7ð8ð
 Ÿ™ 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ä)DÀXÓ)Nò 8˜IØ ×,Ñ,¨YÕ7ñ8ð ×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)	r1   ÚNativeEventÚzipr    r„   r*   Ú	Exceptionr:   Ú	exception)r(   ÚpathsÚinodesr€   ÚidsrF   r"   rU   Úevent_flagsÚevent_idr   s              r-   Ú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"   Ú	pathnamesro   rp   r   r1   Ú	add_watchr�   Úread_eventsrˆ   r:   r‰   r4   s    r-   ÚrunzFSEventsEmitter.run0  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 r0   )	r   rB   r&   r"   Úbytesr!   Úfsdecoder   r   )r(   Ú
watch_paths     r-   Úon_thread_startzFSEventsEmitter.on_thread_start9  sT   € Ø× Ò Ü9CÀDÇJÁJÇOÁOÔUZÔ9[œŸ™ T§Z¡Z§_¡_Ô5Ðae×akÑak×apÑapˆJÜ#4°ZÓ#@ˆDÕ ð !r.   c                óx   — t        | j                  j                  t        «      rt	        j
                  |«      S |S )z6Encode path only if bytes were passed to this emitter.)rB   r&   r"   r–   r!   Úfsencode)r(   r"   s     r-   rN   zFSEventsEmitter._encode_path>  s'   € ä$.¨t¯z©z¯©ÄÔ$FŒr�{‰{˜4Ó ÐPÈDÐPr.   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r5   r<   r9   rG   rJ   rL   rS   rZ   Ústaticmethodr_   r„   r�   r”   r™   rN   Ú__classcell__©r,   s   @r-   r   r   3   sv   ø„ ñð4 (ØØõkò ò1òò4ò
4ò
(ò8ò*ð" ñVó ðVò&òBIòGòAö
Qr.   r   c                  ó.   ‡ — e Zd Zefˆ fd„	Zdˆ fd„	Zˆ xZS )ÚFSEventsObserverc                ó0   •— t         ‰| �  t        |¬«       y )N)r*   )r   r   r   )r(   r*   r,   s     €r-   r   zFSEventsObserver.__init__D  s   ø€ Ü‰Ñœ°'ÐÕ:r.   c                óv   •— t        |t        «      rt        j                  d|«      }t        ‰| �  ||||¬«      S )NÚNFC)Ú	recursiver+   )rB   ÚstrÚunicodedataÚ	normalizer   Úschedule)r(   Úevent_handlerr"   r¨   r+   r,   s        €r-   r¬   zFSEventsObserver.scheduleG  s;   ø€ ô �dœCÔ Ü×(Ñ(¨°Ó5ˆDä‰wÑ ¨t¸yÐWcÐÓdÐdr.   )FN)rœ   r�   rž   r   r   r¬   r¡   r¢   s   @r-   r¤   r¤   C  s   ø„ Ø7õ ;÷eñ er.   r¤   ) rŸ   Ú
__future__r   rk   r!   r   ro   rª   Ú_watchdog_fseventsr1   Úwatchdog.eventsr   r   r   r   r   r	   r
   r   r   r   Úwatchdog.observers.apir   r   r   r   Úwatchdog.utils.dirsnapshotr   Ú	getLoggerr:   r   r¤   © r.   r-   ú<module>rµ      sm   ðñ õ #ã Û 	Û Û Û ã &÷÷ ÷ ÷ qÓ pÝ 8à	ˆ×	Ñ	˜:Ó	&€ôMQ�lô MQô`
e�|õ 
er.   