
    \j'                         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         K/root/env/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include	orig_segsr   r   override_regexeregexregex_partsregex_bytes	out_regexs                  r"   pattern_to_regexz&GitIgnoreBasicPattern.pattern_to_regex~   s   * ;;'5!0;;	hg\!BC	DD %   ##%;
 
 c" C  7QR;7 $) !}$.C >"%":":I#< 5**<8K 77;5 ~*\O+@A ;%/o.;9 W	 9
W	C 
 	,/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                  |d             ||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[^/]+literalz/?$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#,' 5fa	TkAv
 k"	
S j!Z Hq#hH c 	Avcc
czg c11#yABCxs
 u y!Jk5n 
r$   N)__name__
__module____qualname____doc__	__slots__staticmethodboollistr+   tupler   r3   r   classmethodr   rC   r4   r   r$   r"   r   r      s     ZZS	Z HT#Y#./Z Zx uu HVhtn,-u  un DT#Y D49 D Dr$   r   	gitignoreN)rQ   typingr   pathspecr   pathspec._typingr   r   r   baser	   r
   r   r   register_patternr   r$   r"   <module>r^      sM     
 d1 dP	   k#8 9r$   