
    zc6                         d 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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
    N)
FileDeletedEventFileModifiedEventFileCreatedEventFileMovedEventDirDeletedEventDirModifiedEventDirCreatedEventDirMovedEventgenerate_sub_created_eventsgenerate_sub_moved_events)BaseObserverEventEmitterDEFAULT_EMITTER_TIMEOUTDEFAULT_OBSERVER_TIMEOUT)DirectorySnapshotfseventsc                       e Zd ZdZed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dS )FSEventsEmittera5  
    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 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``
    Fc                    t          j        | |||           t                      | _        || _        d| _        d | _        t          j                    | _	        t          j                            t          j                            t          j                            | j        j                                      | _        d S )Ng        )r   __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$   timeoutr   s        ;lib/python3.11/site-packages/watchdog/observers/fsevents.pyr   zFSEventsEmitter.__init__P   s    dK@@@ 0#^%%
$&G$4$4RW__RWEWEWX\XbXgEhEh5i5i$j$j!!!    c                 `    t          j        | j                   t          j        |            d S N)	_fseventsremove_watchr$   stopr&   s    r)   on_thread_stopzFSEventsEmitter.on_thread_stopY   s+    tz***tr*   c                 F   | j         j        r2t                              d|           t	          j        | |           d S |                     |          s2t                              d|           t	          j        | |           d S t                              d|           d S )Nzqueue_event %szdrop event %s)_watchis_recursiveloggerdebugr   queue_event_is_recursive_event)r&   events     r)   r7   zFSEventsEmitter.queue_event]   s     ;# 	5LL)5111$T511111++E22 5-u555(u55555_e44444r*   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   r    dirnamer%   
isinstancer   r
   	dest_path)r&   r9   r<   r?   s       r)   r8   z#FSEventsEmitter._is_recursive_eventj   s    %*%7\5>>RW__U^=\=\t00 	5enm<== 	 88ID55 utr*   c                     |j         rt          nt          }|                      ||                     |                     t	          |                     d S r,   )r;   r	   r   r7   r   r&   r9   r<   r=   clss        r)   _queue_created_eventz$FSEventsEmitter._queue_created_eventx   S    !&!3Ioo9IX''')'2233333r*   c                     |j         rt          nt          }|                      ||                     |                     t	          |                     d S r,   )r;   r   r   r7   r   rA   s        r)   _queue_deleted_eventz$FSEventsEmitter._queue_deleted_event}   rD   r*   c                 l    |j         rt          nt          }|                      ||                     d S r,   )r;   r   r   r7   rA   s        r)   _queue_modified_eventz%FSEventsEmitter._queue_modified_event   s8    "'"4K:KX'''''r*   c                     |j         rt          nt          }|                     |          }|                      |||                     |                     t          |                     |                     t          |                     d S r,   )r;   r
   r   _encode_pathr7   r   )r&   	src_eventr<   dst_pathsrc_dirnamedst_dirnamerB   s          r)   _queue_renamed_eventz$FSEventsEmitter._queue_renamed_event   s    (5Imm>$$X..Xx00111)+66777)+6677777r*   c                     |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   r    KeyError)r&   r9   
in_history	old_inodebefore_starts        r)   _is_historic_created_eventz*FSEventsEmitter._is_historic_created_event   s    
 [DM1
 	!% 066uzBB1E	(EK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)r9   s    r)   _is_meta_modzFSEventsEmitter._is_meta_mod   s     &U%*<U@UUr*   c                 r
   t                                           t          j        k    rR|D ]Od                    fdt                    D                       }t                                d|            Pt          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        rtA          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attrr9   s     r)   	<genexpr>z/FSEventsEmitter.queue_events.<locals>.<genexpr>   s9      !^!^4PTAUAUY]A]!^$!^!^!^!^!^!^r*   z: <   r   c              3   J   K   | ]}|j         	|j        j        k    |V  d S r,   )
is_renamedrQ   )r_   er9   s     r)   ra   z/FSEventsEmitter.queue_events.<locals>.<genexpr>   s<      )g)gq|)gPQPW[`[fPf)g!)g)g)g)g)g)gr*   z"Destination event for rename is %sz&Stopping because root path was changed),r5   getEffectiveLevelloggingDEBUGjoindirr6   time	monotonicr   r   poprJ   r    r   r=   statOSErrorst_inorQ   
is_created
is_removedrV   rC   r   addis_modifiedr[   rH   rF   discardrd   nextiterrO   r   r7   remover   is_root_changedr   r$   r/   clear)r&   r(   eventsflagsr<   rM   rn   exists	dst_eventrL   rN   	sub_eventr9   s               @r)   queue_eventszFSEventsEmitter.queue_events   s`   ##%%6 	2 2 2		!^!^!^!^3u::!^!^!^^^00001111>d..3 	(#'D  u	&JJqMME((44H'//(33Kwx((    8dkU[8F(  M7E$4 M7 66u== L--eX{KKK!!%+...$ M(9(9%(@(@ M..uhLLL))%;GGG%%ek2222 # LD,K,KE,R,R L--eX{KKK!!%+...$ M(9(9%(@(@ M..uhLLL# -! !%T)g)g)g)gV)g)g)g%g%gim n nI  (!%I9UUU#'#4#4Y^#D#D&(gooh&?&?11%8[Zefff))%+666)B8X)V)V 8 8I ,,Y7777 i000$0 YD4E4Ei4P4P Y 66y(KXXX$/ C 55i;WWW M11)/BBB ! 11%;OOO))%+666)DX)N)N 8 8I ,,Y77778 11%;OOO--ek::: !# 7--eX{KKKM))%+666$ &   !A!ABBBEFFF		##%%%k  u	& u	& u	& u	& u	&s   3D DDc                 *   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   )r_   r    rQ   event_flagsevent_idrB   s        r)   
<listcomp>z3FSEventsEmitter.events_callback.<locals>.<listcomp>,  sA       6D%h D%h77  r*   Nz(Unhandled exception in fsevents callback)	r-   NativeEventzipr   r   r(   	Exceptionr5   	exception)r&   pathsinodesr|   idsr{   rB   s         @r)   events_callbackzFSEventsEmitter.events_callback&  s    #
	I   :=65#; ;  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$   r    	pathnamesrk   rl   r   r-   	add_watchr   read_eventsr   r5   r   r0   s    r)   runzFSEventsEmitter.run7  s    */*>++	Gdj$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   r>   r$   r    bytesr   fsdecoder   r   )r&   
watch_paths     r)   on_thread_startzFSEventsEmitter.on_thread_start@  sd      	A$*/511 -[99

!Z_
#4Z#@#@D   	A 	Ar*   c                 l    t          | j        j        t                    rt	          j        |          S |S )z7Encode path only if bytes were passed to this emitter. )r>   r$   r    r   r   fsencode)r&   r    s     r)   rJ   zFSEventsEmitter._encode_pathJ  s-    djou-- 	%;t$$$r*   N)__name__
__module____qualname____doc__r   r   r1   r7   r8   rC   rF   rH   rO   rV   staticmethodr[   r   r   r   r   rJ   r   r*   r)   r   r   9   s-        * 4K]b k k k k  5 5 5  4 4 4
4 4 4
( ( (8 8 8* * *$ V V \V@& @& @&DI I I"G G GA A A    r*   r   c                        e Zd ZefdZddZdS )FSEventsObserverc                 >    t          j        | t          |           d S )N)emitter_classr(   )r   r   r   )r&   r(   s     r)   r   zFSEventsObserver.__init__S  s-    d/&-	/ 	/ 	/ 	/ 	/ 	/r*   Fc                     t          |t                    rt          j        d|          }t	          j        | |||          S )NNFC)r>   strunicodedata	normalizer   schedule)r&   event_handlerr    	recursives       r)   r   zFSEventsObserver.scheduleW  s?     dC   	6(55D$T=$	JJJr*   N)F)r   r   r   r   r   r   r   r*   r)   r   r   Q  sE        7 / / / /K K K K K Kr*   r   )r   rk   rg   r   r   r   _watchdog_fseventsr-   watchdog.eventsr   r   r   r   r   r   r	   r
   r   r   watchdog.observers.apir   r   r   r   watchdog.utils.dirsnapshotr   	getLoggerr5   r   r   r   r*   r)   <module>r      s  $    				         & & & &                                   9 8 8 8 8 8		:	&	&U U U U Ul U U UpK K K K K| K K K K Kr*   