
    0yi&                         d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
mZmZ  G d de      Z ej                  d	e       y
)z
This module provides :class:`GitIgnoreBasicPattern` which implements Git's
`gitignore`_ patterns as documented. This differs from how Git actually behaves
when including files in excluded directories.

.. _`gitignore`: https://git-scm.com/docs/gitignore
    )Optional)util)AnyStrassert_unreachableoverride   )GitIgnorePatternError_BYTES_ENCODING_GitIgnoreBasePatternc            
           e Zd ZdZdZededee   de	e
ee      e
e   f   fd       Zeedede	e
e   e
e   f   fd              Zedee   dee   fd	       Zy
)GitIgnoreBasicPatternz
	The :class:`GitIgnoreBasicPattern` class represents a compiled gitignore
	pattern as documented. This is registered as "gitignore".
	 is_dir_patternpattern_segsreturnc                    |d   s|d= n=t        |      dk(  st        |      dk(  r |d   s|d   dk7  r|j                  dd       n	 |st        d      |d   sd|d<   t        t        |      dz
  dd      D ]  }||dz
     }||   }|dk(  s|dk(  s||=   t        |      }|dk(  r|d   dk(  r| ryy|dk(  r|d   dk(  r	|d   d	k(  ry|d
k(  r|d   dk(  r|d   d	k(  r	|d   dk(  ry|dfS )a  
		Normalize the pattern segments to make processing easier.

		*is_dir_pattern* (:class:`bool`) is whether the pattern is a directory
		pattern (i.e., ends with a slash '/').

		*pattern_segs* (:class:`list` of :class:`str`) contains the pattern
		segments. This may be modified in place.

		Returns a :class:`tuple` containing either:

		- The normalized segments (:class:`list` of :class:`str`; or :data:`None`).

		- The regular expression override (:class:`str` or :data:`None`).
		r   r      **zPattern normalized to nothing.)N/)N.*   N)leninsert
ValueErrorrange)r   r   iprevseg	seg_counts         c/var/www/html/content_weaver/venv/lib/python3.12/site-packages/pathspec/patterns/gitignore/basic.py__normalize_segmentsz*GitIgnoreBasicPattern.__normalize_segments!   sZ   ( 
a A
<A#l"3q"8a 1o4  	 
4	55	b	
 <
 \"Q&2. a
qs
4	a3
dlsd{Q	 ,)!^Q4/   >A$A#  >A$A#A$
  	    patternc                    t        |t              r	|}t        }n;t        |t              r|j                  t              }t        }nt        d|d      |}~|j                  d      rn|j                         }|sy|j                  d      ry|j                  d      rd}|dd	 }nd
}|j                  d      }|d    }|dk(  rd}	 | j                  ||      \  }}||}
n8|$	 | j                  |      }dj                  |      }
nt        d|d|d       
!|t        u r|
j!                  t              }||fS |
}||fS # t        $ r}	t        d|      |	d	}	~	ww xY w# t        $ r}	t        d|      |	d	}	~	ww xY w)a  
		Convert the pattern into a regular expression.

		*pattern* (:class:`str` or :class:`bytes`) is the pattern to convert into a
		regular expression.

		Returns a :class:`tuple` containing:

			-	*pattern* (:class:`str`, :class:`bytes` or :data:`None`) is the
				uncompiled regular expression.

			-	*include* (:class:`bool` or :data:`None`) is whether matched files
				should be included (:data:`True`), excluded (:data:`False`), or is a
				null-operation (:data:`None`).
		zpattern=z! is not a unicode or byte string.z\ )NN#!Fr   NTr   r   zInvalid git pattern:  zoverride_regex=z and pattern_segs=z cannot both be null.)
isinstancestrbytesdecoder
   	TypeErrorendswithrstrip
startswithsplit*_GitIgnoreBasicPattern__normalize_segmentsr   r	   *_GitIgnoreBasicPattern__translate_segmentsjoinr   encode)clsr%   pattern_strreturn_typeoriginal_patternincluder   r   override_regexeregexregex_parts	out_regexs                r"   pattern_to_regexz&GitIgnoreBasicPattern.pattern_to_regex~   s   * ;;'5!0;;	hg\!BC	DD %   ##%;
 
 c" C  7QR;7 ""3', $B''.C >"%":":L#< 5**<8K 77;5 ~*\O+@A ;%/||O,9 W	 9
W	A 
 	,/0
  
-01s0   	E &E$ 	E!EE!$	F-E<<Fc                    g }d}t        |      dz
  }t        |      D ]  \  }}|dk(  rP|dk(  r|j                  d       "||k  r|j                  d       d};||k(  s	J ||f       |j                  d       [|dk(  r|j                  d	       |r|j                  d       |d
k(  r|j                  d       n |j                  | j                  |             ||k(  r(|d
k(  r|j                  d       n|j                  d       d} |S )z
		Translate the pattern segments to regular expressions.

		*pattern_segs* (:class:`list` of :class:`str`) contains the pattern
		segments.

		Returns the regular expression parts (:class:`list` of :class:`str`).
		Fr   r   r   z	^(?:.+/)?z(?:/.+)?Tr   ^r   z[^/]+z/?$z(?:/|$))r   	enumerateappend_translate_segment_glob)r7   r   	out_parts
need_slashendr   r    s          r"   __translate_segmentsz*GitIgnoreBasicPattern.__translate_segments   s+    )*LA#,' 3fa	TkAv
 k"	
S j!Z Hq#hH c 	Avcc
czg c11#67Cxs
 u y!Jg3j 
r$   N)__name__
__module____qualname____doc__	__slots__staticmethodboollistr+   tupler   r3   r   classmethodr   rA   r4   r   r$   r"   r   r      s     ZZS	Z HT#Y#./Z Zx tt HVhtn,-t  tl BT#Y B49 B Br$   r   	gitignoreN)rN   typingr   pathspecr   pathspec._typingr   r   r   baser	   r
   r   r   register_patternr   r$   r"   <module>r[      sM     
 a1 aJ	   k#8 9r$   