
    $g7                    "   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         [/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/watchdog/observers/fsevents.pyr'   zFSEventsEmitter.__init__A   s     	eW<XXX"%%% 09=^%%
$&G$4$4RW__RWEWEWX\XbXgEhEh5i5i$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+    tz***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     ;# 	14+C+CE+J+J 	1LL)5111$T511111LL%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>>RW__U^=\=\t0005enm<== 	 88I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Ioo9I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Imm>$$X..Xx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     [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)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        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attrr@   s     r7   	<genexpr>z/FSEventsEmitter.queue_events.<locals>.<genexpr>   s9      !^!^4PTAUAUY]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Z1!,Z17ekCYCYQCYCYCYCY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		!^!^!^!^3u::!^!^!^^^Xue4444>d..3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# /! $ZZZZZZZZZ! !I
 ! (!%I9UUU#'#4#4Y^#D#D&(gooh&?&?11%8[Zefff))%+666/HS[/\/\ > >O ,,_==== 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61LX1V1V @ @- ,,->????@ 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   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       6D%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   :=eVUTW: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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   rL   r   r0   bytesr/   fsdecoder   r+   )r5   
watch_paths     r7   on_thread_startzFSEventsEmitter.on_thread_start8  sc      	A9CDJOUZ9[9[pTZ_555aeakapJ#4Z#@#@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*    $.tz$F$FPr{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     dC   	6(55DwwtyWc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   