
    d a                        d Z ddlZddlZddlm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  e            Zd Z G d d	e          ZeZeeef         Zeed
f         Zeeeeeeef         d
f         f         ZeZeeef         Z G d d          Z G d deeeeeef         f                   ZdedefdZ  e!d           e!d           e!d           e!d           e!d           e!d           e!d           e!d           e!d           e!d          iZ" e!d           e!d          gZ# e!d           e!d          gZ$dedefdZ%dedefdZ&dede'fd Z(dede'fd!Z)d"edefd#Z*d"edeeef         fd$Z+ G d% d&e          Z,d' Z-d( Z.d) Z/d* Z0 G d+ d,e          Z1d-edeeeeef                  fd.Z2d/e,deeeeef                  fd0Z3d6d/ed2e'deeeef                  fd3Z4d6d/ed4ed2e'defd5Z5dS )7zReading and writing Git configuration files.

TODO:
 * preserve formatting when updating configuration files
 * treat subsection names as case-insensitive for [branch.foo] style
   subsections
    N)suppress)
BinaryIOIterableIteratorKeysViewListMutableMappingOptionalTupleUnionoverload   )GitFilec                     t          | t          t          f          r|                                 S t          | t                    r+ t          |           t          t          |                     S | S N)
isinstancebytesstrlowerr   typemap	lower_key)keys    R/home/feoh/.local/pipx/venvs/poetry/lib/python3.11/site-packages/dulwich/config.pyr   r   (   s]    #s|$$ yy{{#x   .tCyyY,,---J    c                       e Zd Zd Zedd            Zd Zdeee	df                  fdZ
d Zd	 Zd
 Zd Zd Zd ZefdZd ZefdZdS )CaseInsensitiveOrderedMultiDictc                 "    g | _         i | _        d S r   )_real_keyedselfs    r   __init__z(CaseInsensitiveOrderedMultiDict.__init__4   s    
r   Nc                     t          ||           r|S  |             }||S t          |t                    st          |                                D ]
\  }}|||<   |S r   )r   r	   	TypeErroritems)clsdict_inoutr   values        r   makez$CaseInsensitiveOrderedMultiDict.make8   sr     gs## 	Ncee?J'>22 	O!--// 	 	JCCHH
r   c                 *    t          | j                  S r   )lenr    r!   s    r   __len__z'CaseInsensitiveOrderedMultiDict.__len__K   s    4;r   return.c                 4    | j                                         S r   )r    keysr!   s    r   r1   z$CaseInsensitiveOrderedMultiDict.keysN   s    {!!!r   c                 *    t          | j                  S r   )iterr   r!   s    r   r&   z%CaseInsensitiveOrderedMultiDict.itemsQ   s    DJr   c                 4    | j                                         S r   )r    __iter__r!   s    r   r5   z(CaseInsensitiveOrderedMultiDict.__iter__T   s    {##%%%r   c                 4    | j                                         S r   )r    valuesr!   s    r   r7   z&CaseInsensitiveOrderedMultiDict.valuesW   s    {!!###r   c                 l    | j                             ||f           || j        t          |          <   d S r   )r   appendr    r   r"   r   r*   s      r   __setitem__z+CaseInsensitiveOrderedMultiDict.__setitem__Z   s4    
3,'''&+IcNN###r   c                     t          |          }| j        |= t          t          t	          | j                                      D ]#\  }\  }}t          |          |k    r| j        |= $d S r   )r   r    reversedlist	enumerater   )r"   r   iactualunused_values        r   __delitem__z+CaseInsensitiveOrderedMultiDict.__delitem__^   sq    nnK)1$y7L7L2M2M)N)N 	" 	"%A%  C''JqM	" 	"r   c                 6    | j         t          |                   S r   )r    r   )r"   items     r   __getitem__z+CaseInsensitiveOrderedMultiDict.__getitem__e   s    {9T??++r   c                 x    	 | |         S # t           $ r Y nw xY w|t          u r t          |                       S |S r   )KeyErrorSENTINELr   r"   r   defaults      r   getz#CaseInsensitiveOrderedMultiDict.geth   sU    	9 	 	 	D	 h4::<<s   
 
c              #   p   K   t          |          }| j        D ]\  }}t          |          |k    r|V  d S r   )r   r   )r"   r   rA   r*   s       r   get_allz'CaseInsensitiveOrderedMultiDict.get_alls   sM      nn!Z 	 	MFE  C''	 	r   c                 v    	 | |         S # t           $ r |                     ||          | |<   Y nw xY w| |         S r   )rH   rL   rJ   s      r   
setdefaultz*CaseInsensitiveOrderedMultiDict.setdefaulty   sS    	/9 	/ 	/ 	/g..DIII	/ Cys   
 #00r   )__name__
__module____qualname__r#   classmethodr+   r.   r   r   r   r1   r&   r5   r7   r;   rC   rF   rI   rL   rN   rP    r   r   r   r   2   s             [$     "huUCZ01 " " " "     & & &$ $ $, , ," " ", , ,  ( 	 	 	 	   '/      r   r   .c            
       N   e Zd ZdZdededefdZdededee         fdZ	e
dedededefd            Ze
dededee         fd	            Z	 ddededee         dee         fdZdededeeef         dd
fdZdedeeeef                  fdZdee         fdZdedefdZd
S )ConfigzA Git configuration.sectionnamer/   c                 *    t          | j                  )a  Retrieve the contents of a configuration setting.

        Args:
          section: Tuple with section name and optional subsection name
          name: Variable name
        Returns:
          Contents of the setting
        Raises:
          KeyError: if the value is not set
        )NotImplementedErrorrL   r"   rX   rY   s      r   rL   z
Config.get   s     "$(+++r   c                 *    t          | j                  )a4  Retrieve the contents of a multivar configuration setting.

        Args:
          section: Tuple with section name and optional subsection namee
          name: Variable name
        Returns:
          Contents of the setting as iterable
        Raises:
          KeyError: if the value is not set
        )r[   get_multivarr\   s      r   r^   zConfig.get_multivar   s     "$"3444r   rK   c                     d S r   rU   )r"   rX   rY   rK   s       r   get_booleanzConfig.get_boolean       r   c                     d S r   rU   r\   s      r   r`   zConfig.get_boolean   ra   r   Nc                     	 |                      ||          }n# t          $ r |cY S w xY w|                                dk    rdS |                                dk    rdS t          d|z            )a  Retrieve a configuration setting as boolean.

        Args:
          section: Tuple with section name and optional subsection name
          name: Name of the setting, including section and possible
            subsection.
        Returns:
          Contents of the setting
           trueT   falseFznot a valid boolean string: %r)rL   rH   r   
ValueError)r"   rX   rY   rK   r*   s        r   r`   zConfig.get_boolean   s    	HHWd++EE 	 	 	NNN	;;==G##4[[]]h&&59EABBBs    ((r*   c                 *    t          | j                  )a  Set a configuration value.

        Args:
          section: Tuple with section name and optional subsection namee
          name: Name of the configuration value, including section
            and optional subsection
          value: value of the setting
        )r[   setr"   rX   rY   r*   s       r   rh   z
Config.set   s     "$(+++r   c                 *    t          | j                  )zIterate over the configuration pairs for a specific section.

        Args:
          section: Tuple with section name and optional subsection namee
        Returns:
          Iterator over (name, value) pairs
        )r[   r&   r"   rX   s     r   r&   zConfig.items   s     "$*---r   c                 *    t          | j                  )zRIterate over the sections.

        Returns: Iterator over section tuples
        )r[   sectionsr!   s    r   rm   zConfig.sections   s    
 "$-000r   c                 .    ||                                  v S )zCheck if a specified section exists.

        Args:
          name: Name of section to check for
        Returns:
          boolean indicating whether the section exists
        )rm   )r"   rY   s     r   has_sectionzConfig.has_section   s     t}}&&r   r   )rQ   rR   rS   __doc__SectionLikeNameLikeValuerL   r   r^   r   boolr`   r
   r   	ValueLikerh   r   Namer&   Sectionrm   ro   rU   r   r   rW   rW      s       ,; ,h ,5 , , , ,5K 5x 5HUO 5 5 5 5 ; h  RV    X ; h 8D>    X OSC C"C*2C=Ed^C	$C C C C,,, , Y_%	,
 
, , , , .[ .XeD%K6H-I . . . .1(7+ 1 1 1 1' 'D ' ' ' ' ' 'r   rW   c                      e Zd ZdZ	 	 ddeeeeeef         f         df         dee	df         ddfdZ
de	fdZdedefd	Zd
edeeef         fdZd
edeeef         ddfdZd
eddfdZdee         fdZdefdZede	fd            Zdededeeef         fdZdededee         fdZdededefdZdededeeef         ddfdZdedeeeef                  fdZ dee         fdZ!dS )
ConfigDictz)Git configuration stored in a dictionary.Nr7   encodingr/   c                 |    |t          j                    }|| _        t                              |          | _        dS )zCreate a new ConfigDict.N)sysgetdefaultencodingrz   r   r+   _values)r"   r7   rz   s      r   r#   zConfigDict.__init__   s8     -//H 6;;FCCr   c                 L    d                     | j        j        | j                  S )Nz{}({!r}))format	__class__rQ   r~   r!   s    r   __repr__zConfigDict.__repr__  s      !8$,GGGr   otherc                 L    t          || j                  o|j        | j        k    S r   )r   r   r~   )r"   r   s     r   __eq__zConfigDict.__eq__  s"    %00RU]dl5RRr   r   c                 6    | j                             |          S r   )r~   rF   r"   r   s     r   rF   zConfigDict.__getitem__      |'',,,r   r*   c                 8    | j                             ||          S r   )r~   r;   r:   s      r   r;   zConfigDict.__setitem__
  s    
 |''U333r   c                 6    | j                             |          S r   )r~   rC   r   s     r   rC   zConfigDict.__delitem__  r   r   c                 4    | j                                         S r   )r~   r5   r!   s    r   r5   zConfigDict.__iter__  s    |$$&&&r   c                 4    | j                                         S r   )r~   r.   r!   s    r   r.   zConfigDict.__len__  s    |##%%%r   rY   c                     |                     d          }t          |          dk    r|d         |d         |d         fS |d         d |d         fS )N.   r   r      )splitr-   )r'   rY   partss      r   _parse_settingzConfigDict._parse_setting  sN    

3u::??!HeAha11!HdE!H--r   rX   c                      t          |t                    s|f}t           fd|D                       }t          |t                    s|                     j                  }||fS )Nc                 r    g | ]3}t          |t                    s|                    j                  n|4S rU   )r   r   encoderz   ).0
subsectionr"   s     r   
<listcomp>z6ConfigDict._check_section_and_name.<locals>.<listcomp>+  sR         "*e44 
!!$-000  r   )r   tupler   r   rz   )r"   rX   rY   checked_sections   `   r   _check_section_and_namez"ConfigDict._check_section_and_name"  s    
 '5)) 	!jG    #*	  
 
 $&& 	.;;t}--D$$r   c                 
   |                      ||          \  }}t          |          dk    r1	 | j        |                             |          S # t          $ r Y nw xY w| j        |d         f                             |          S Nr   r   )r   r-   r~   rN   rH   r\   s      r   r^   zConfigDict.get_multivar8  s    
 44WdCCw<<!|G,44T:::    |WQZM*224888s   A 
AAc                     |                      ||          \  }}t          |          dk    r$	 | j        |         |         S # t          $ r Y nw xY w| j        |d         f         |         S r   )r   r-   r~   rH   r\   s      r   rL   zConfigDict.getG  s    
 44WdCCw<<!|G,T22    |WQZM*400s   A 
AAc                    |                      ||          \  }}t          |t                    r|rdnd}t          |t                    s|                    | j                  }|| j                            |          |<   d S )Nrd   re   )r   r   rt   r   r   rz   r~   rP   ri   s       r   rh   zConfigDict.setV  s     44WdCCeT"" 	3$2GG(E%'' 	0LL//E16((...r   c                 Z    | j                             |                                          S r   )r~   rL   r&   rk   s     r   r&   zConfigDict.itemsf  s&     |((..000r   c                 4    | j                                         S r   )r~   r1   r!   s    r   rm   zConfigDict.sectionsl  s    |  """r   NN)"rQ   rR   rS   rp   r   r	   rw   rv   rs   r   r#   r   objectrt   r   rF   r;   rC   r   r5   intr.   rT   r   rq   rr   r   r   r^   rL   ru   rh   r&   rm   rU   r   r   ry   ry      s       33 %)D D7N4;$??@$F
D
 T	"D 
D D D DH# H H H HSF St S S S S-w ->$++F - - - -44 dEk*4 
	4 4 4 4-w -4 - - - -'(7+ ' ' ' '& & & & & .# . . . [.%% % 
w}		% % % %,99 9 
%	9 9 9 911 1 
	1 1 1 177 7 Y_%	7
 
7 7 7 7 11 
%e$	%1 1 1 1#(7+ # # # # # #r   ry   r*   r/   c                     |                      d          sC|                      d          s.|                     d          sd| v s|                     d          rdt          |           z   dz   S t          |           S )N       	   #   ")
startswithendswith_escape_valuer*   s    r   _format_stringr   p  s    	$E""	$ >>$	$ 5==>>%    mE***T11U###r      \r      n   
   tr      b   r      ;r   c                    t          |                                           } t                      }t                      }d}d}|t          |           k     rU| |         }|t          d          k    r|dz  }	 t          | |                  }nP# t
          $ r}t          d| |fz            |d }~wt          $ r!}t          d| |         || fz            |d }~ww xY w|r#|                    |           t                      }|	                    |           n||t          d          k    r| }ne|t          v r|snr|t          v r|	                    |           n:|r#|                    |           t                      }|	                    |           |dz  }|t          |           k     U|rt          d          t          |          S )	NFr   r   r   z1escape character in %r at %d before end of stringz=escape character followed by unknown character %s at %d in %rr   zmissing end quote)	bytearraystripr-   ord_ESCAPE_TABLE
IndexErrorrf   rH   extendr9   _COMMENT_CHARS_WHITESPACE_CHARSr   )r*   ret
whitespace	in_quotesr@   cvexcs           r   _parse_stringr     s   ekkmm$$E
++CJI	A
c%jj..!HE

??FA
!%(+    G5RS*T      %(-a!U';<  
  )

:&&&&[[
JJqMMMM#d))^^%II.   ###a     )

:&&&&[[
JJqMMM	Q? c%jj..B  .,---::s$   7B 
CB**C7CCc                     |                      dd          } |                      dd          } |                      dd          } |                      dd          } |                      d	d
          } | S )zEscape a value.r   s   \\   s   \rr   s   \nr   s   \tr   s   \")replacer   s    r   r   r     sf    MM%))EMM%((EMM%((EMM%((EMM$''ELr   rY   c                     t          t          |                     D ],}| ||dz            }|                                s	|dk    r dS -dS )Nr      -FTranger-   isalnumrY   r@   r   s      r   _check_variable_namer     sU    3t99  QUOyy{{ 	qDyy554r   c                     t          t          |                     D ]*}| ||dz            }|                                s|dvr dS +dS )Nr   )r      .FTr   r   s      r   _check_section_namer     sW    3t99  QUOyy{{ 	q44554r   linec                     t          d          t          d          h}t          d          }d}t          t          |                     D ]!\  }}||k    r| }|s||v r| d |         c S "| S )Nr   r   r   F)r   r?   r   )r   comment_bytesquotestring_openr@   	characters         r   _strip_commentsr     s    YYD		*MIIEK!)D//22  9)/KK 	m!;!;8OOOKr   c                    t          |                                           } d}d}t          |           D ]N\  }}|rd}
|t          d          k    r| }|t          d          k    rd}|t          d          k    r|s|} nOt	          d          | d|                             dd          }| |dz   d          } t          |          d	k    r|d         d d         dk    s|d         d
d          dk    rt	          d|d         z            |d         dd
         |d<   t          |d                   st	          d|d         z            |d         |d         f}nvt          |d                   st	          d|d         z            |d                             dd          }t          |          d	k    r|d         |d         f}n	|d         f}|| fS )NFr   r   T   ]zexpected trailing ]r   r   r   zInvalid subsection %rr   zinvalid section name %rr   )r   rstripr?   r   rf   r   r-   r   )r   r   escapedr@   r   lastptsrX   s           r   _parse_section_header_liner     s   4  ''))DIG$ 0 01 	GD		>>%IE

??GD		>>)>DE.///
qv,

T1
%
%Cq		?D
3xx1}}q6"1":Q!4!44s1v=>>>VAbD\CF"3q6** 	A6Q?@@@q63q6""3q6** 	A6Q?@@@!fll4##s88q==1vs1v&GG1viGD=r   c                        e Zd ZdZ	 	 ddeeeeeef         f         df         dee	df         ddf fdZ
ededd fd            Zed	e	dd fd
            Zdd	ee	         ddfdZdeddfdZ xZS )
ConfigFilez;A Git configuration file, like .git/config or ~/.gitconfig.Nr7   rz   r/   c                 \    t                                          ||           d | _        d S )N)r7   rz   )superr#   path)r"   r7   rz   r   s      r   r#   zConfigFile.__init__  s-     	:::#'			r   fc                 t    |             }d}d}d}t          |                                          D ]\  }}|dk    r|                    d          r
|dd         }|                                }|Rt	          |          dk    r:|dd         dk    r,t          |          \  }}|j                            |           t          |          	                                dk    r|t          d|z            	 |                    d	d          \  }}n# t          $ r |}d
}Y nw xY w|	                                }t          |          st          d|z            |                    d          r|dd         }N|                    d          r|dd         }od}t          |          }||j        |         |<   d}|                    d          r||dd         z  }|                    d          r||dd         z  }||z  }t          |          }||j        |         |<   d}d}|S )z+Read configuration from a file-like object.Nr   s   ﻿r   r      [r   zsetting %r without section   =rd   zinvalid variable name %rs   \
s   \
)r?   	readlinesr   lstripr-   r   r~   rP   r   r   rf   r   r   r   r   )	r'   r   r   rX   settingcontinuationlinenor   r*   s	            r   	from_filezConfigFile.from_file  sp    cee%)%akkmm44 '	# '	#LFD{{t??{ABBx;;==Dt99q==T"1"X%5%5$>t$D$DMGTK**7333"4((..00C77?$%AD%HIII$%)ZZa%8%8NGUU! $ $ $"G#EEE$ "--//+G44 K$%?'%IJJJ>>'** ##(":LL^^I.. ##(":LL#'L)%00E49CK(1"GG==)) 	# D"I-LL]]9-- # D"I-LL D(L),77E49CK(1#'L"GG
s   <DD'&D'r   c                     t          |d          5 }|                     |          }||_        |cddd           S # 1 swxY w Y   dS )z'Read configuration from a file on disk.rbN)r   r   r   )r'   r   r   r   s       r   	from_pathzConfigFile.from_pathC  s     T4   	A--""CCH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   <A A c                     || j         }t          |d          5 }|                     |           ddd           dS # 1 swxY w Y   dS )z&Write configuration to a file on disk.Nwb)r   r   write_to_file)r"   r   r   s      r   write_to_pathzConfigFile.write_to_pathK  s    <9DT4   	"Aq!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   =AAc                    | j                                         D ]\  }}	 |\  }}n# t          $ r	 |\  }d}Y nw xY w||                    d|z   dz              n!|                    d|z   dz   |z   dz              |                                D ]5\  }}t	          |          }|                    d|z   dz   |z   dz              6dS )	z*Write configuration to a file-like object.Nr   s   ]
s    "s   "]
r   s    = r   )r~   r&   rf   writer   )r"   r   rX   r7   section_namesubsection_namer   r*   s           r   r   zConfigFile.write_to_fileR  s   #|1133 	> 	>OGV'07-oo ' ' '")"&' &|+f45555|+e3oEOPPP$llnn > >
U&u--f,u4u<====>	> 	>s   &99r   r   )rQ   rR   rS   rp   r   r	   rw   rv   rs   r   r#   rT   r   r   r   r
   r   r   __classcell__)r   s   @r   r   r     s?       EE %)( (7N4;$??@$F
(
 T	"( 
( ( ( ( ( ( .( .| . . . [.` S \    [" "(3- "4 " " " ">x >D > > > > > > > >r   r   c                      t           j                            dt           j                            d                    }t          j        j        |g| R  S )NXDG_CONFIG_HOMEz
~/.config/)osenvironrL   r   
expanduserjoin)path_segmentsxdg_config_homes     r   get_xdg_config_home_pathr  c  sI    jnn
<(( O 7<8-8888r   c               #   J  K   dD ]} t           j                            dd                              d          D ]g}t           j                            t           j                            ||                     r(t           j                            |          \  }}|V   nhd S )N)zgit.exezgit.cmdPATH ;)r  r  rL   r   r   existsr  )exer   git_dir_bin_dirs       r   _find_git_in_win_pathr  k  s      %  JNN62..44S99 	 	Dw~~bgll45566 $&GMM$$7$7!	 r   c               #   z  K   dd l } dd l}|                                 dk    rd}nd}|j        |j        fD ]}t          t                    5  |                    ||          5 }|                    |d          \  }}||j	        k    r|V  d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d S )Nr   AMD64zGSOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Git_is1z;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Git_is1InstallLocation)
platformwinregmachineHKEY_CURRENT_USERHKEY_LOCAL_MACHINEr   OSErrorOpenKeyQueryValueExREG_SZ)r  r  subkeyr   kvaltyps          r   _find_git_in_win_regr"  u  se     OOOMMMW$$1 	! 	
 (&*CD  g 	 	V,, !..q2CDDS&-''III              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 s6   B/#)BB/BB/B B//B3	6B3	c               #   \  K   dt           j        v r3t           j                            t           j        d         dd          V  t	                      D ]%} t           j                            | dd          V  &t                      D ]%} t           j                            | dd          V  &d S )NPROGRAMDATAGitconfigetc	gitconfig)r  r  r   r  r  r"  )r  s    r   get_win_system_pathsr)    s      
""gll2:m4eXFFFFF(** 8 8gll7E;777777')) 8 8gll7E;7777778 8r   c                       e Zd ZdZ	 ddee         dee         fdZdefdZ	e
dd            Ze
dee         fd	            Zd
ededefdZd
ededee         fdZd
ededeeef         ddfdZdee         fdZdS )StackedConfigz6Configuration which reads from multiple config files..Nbackendswritablec                 "    || _         || _        d S r   )r,  r-  )r"   r,  r-  s      r   r#   zStackedConfig.__init__  s     ! r   r/   c                 L    d                     | j        j        | j                  S )Nz<{} for {!r}>)r   r   rQ   r,  r!   s    r   r   zStackedConfig.__repr__  s    %%dn&=t}MMMr   c                 <     | |                                            S r   )default_backends)r'   s    r   rK   zStackedConfig.default  s    s3''))***r   c                    g }|                     t          j                            d                     |                     t	          dd                     dt          j        vrF|                     d           t          j        dk    r!|                    t                                 g }|D ]C}	 t                              |          }n# t          $ r Y *w xY w|                     |           D|S )zjRetrieve the default configuration.

        See git-config(1) for details on the files searched.
        z~/.gitconfiggitr&  GIT_CONFIG_NOSYSTEMz/etc/gitconfigwin32)r9   r  r   r  r  r  r|   r  r   r)  r   r   FileNotFoundError)r'   pathsr,  r   cfs        r   r1  zStackedConfig.default_backends  s     RW''77888-eX>>??? 
22LL)***|w&&133444 	  	 D))$//$   OOBs   3C
CCrX   rY   c                     t          |t                    s|f}| j        D ]*}	 |                    ||          c S # t          $ r Y 'w xY wt	          |          r   )r   r   r,  rL   rH   r"   rX   rY   backends       r   rL   zStackedConfig.get  sw    '5)) 	!jG} 	 	G{{7D11111   tnns   ;
AAc              #      K   t          |t                    s|f}| j        D ]/}	 |                    ||          E d {V   # t          $ r Y ,w xY wd S r   )r   r   r,  r^   rH   r:  s       r   r^   zStackedConfig.get_multivar  s      '5)) 	!jG} 	 	G"//>>>>>>>>>>   	 	s   A
AAr*   c                 p    | j         t          | j                  | j                             |||          S r   )r-  r[   rh   ri   s       r   rh   zStackedConfig.set  s6     = %dh///}  $666r   c              #      K   t                      }| j        D ]6}|                                D ]}||vr|                    |           |V   7d S r   )rh   r,  rm   add)r"   seenr;  rX   s       r   rm   zStackedConfig.sections  sq      uu} 	" 	"G"++-- " "$&&HHW%%%!MMM"	" 	"r   r   )r/   r+  )rQ   rR   rS   rp   r   r   r
   r#   r   r   rT   rK   r1  rq   rr   rs   rL   r   r^   r   ru   rt   rh   rw   rm   rU   r   r   r+  r+    sy       @@ LP! !Z(!4<Z4H! ! ! !N# N N N N + + + [+ j!1    [.; h 5    K x HUO    77 7 Y_%	7
 
7 7 7 7"(7+ " " " " " "r   r+  r   c                 T    t                               |           }t          |          S )zread a .gitmodules file.)r   r   parse_submodules)r   cfgs     r   read_submodulesrD    s#    


t
$
$CC   r   r&  c              #      K   |                                  D ]@}|\  }}|dk    r3|                     |d          }|                     |d          }|||fV  AdS )zParse a gitmodules GitConfig file, returning submodules.

    Args:
      config: A `ConfigFile`
    Returns:
      list of tuples (submodule path, url, name),
        where name is quoted part of the section's name.
    s	   submodules   path   urlN)r1   rL   )r&  rX   section_kindr   sm_pathsm_urls         r   rB  rB    sx       ;;== 2 2%,"l<''jj'22GZZ00FFL11112 2r   Fpushc              #     K   |                                  D ]}|d         dk    r|d         }	 t          |                     |d                    }n# t          $ r g }Y nw xY w|r8	 |t          |                     |d                    z  }n# t          $ r Y nw xY w|D ]E}t	          |t
                    sJ |                    d          |                    d          fV  FdS )z3Iterate over insteadOf / pushInsteadOf values.
    r   rF  r   	insteadOfpushInsteadOfzutf-8N)rm   r>   r^   rH   r   r   decode)r&  rJ  rX   replacementneedlesneedles         r   iter_instead_ofrR    s>      ??$$ F F1:aj	6..wDDEEGG 	 	 	GGG	 	4 3 3G_ M MNNN    	F 	FFfe,,,,,--((+*<*<W*E*EEEEEE	FF Fs#   #AA"!A"(&B
BBorig_urlc                     d}|}t          | |          D ]W\  }}|                    |          st          |          t          |          k     r|}||t          |          d         z   }X|S )z.Apply insteadOf / pushInsteadOf to a URL.
    r  N)rR  r   r-   )r&  rS  rJ  longest_needleupdated_urlrQ  rO  s          r   apply_instead_ofrW    s     NK.vt<< ? ?""6** 	~V,,#N%V(>>Kr   )F)6rp   r  r|   
contextlibr   typingr   r   r   r   r   r	   r
   r   r   r   filer   r   rI   r   r   r   rv   r   rr   rw   rq   rs   ru   rW   ry   r   r   r   r   r   r   r   rt   r   r   r   r   r   r  r  r"  r)  r+  rD  rB  rR  rW  rU   r   r   <module>r[     s%  *  
			 



      F F F F F F F F F F F F F F F F F F F F F F F F      688  M M M M Mn M M M` 
s

E3eE3J&7&< ==>%*	d' d' d' d' d' d' d' d'N|# |# |# |# |#e1L(LM |# |# |#~
$% 
$E 
$ 
$ 
$ 
$ CJJE

CIIss4yyCIIss5zzCIIss5zzCIIss5zz #d))SSYY'SZZT+ * *5 * * * *Z 5    u     e     % E    %U %uWe^/D % % % %P[> [> [> [> [> [> [> [>|9 9 9    :8 8 8K" K" K" K" K"F K" K" K"\!# !(5u1D+E"F ! ! ! !2Z 2HU5%;N5O,P 2 2 2 2"F FF F$ F8E#s(O;T F F F F* V s $ 3      r   