
    .Phb                     
   d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
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* Z0d+ Z1 G d, d-e          Z2d.edeeeeef                  fd/Z3d0e-deeeeef                  fd1Z4d7d0ed3e(deeeef                  fd4Z5d7d0ed5ed3e(defd6Z6dS )8zReading and writing Git configuration files.

Todo:
 * preserve formatting when updating configuration files
 * treat subsection names as case-insensitive for [branch.foo] style
   subsections
    N)IterableIteratorKeysViewMutableMapping)suppress)AnyBinaryIOOptional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    N/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/dulwich/config.pyr   r   /   s]    #s|$$ yy{{#x   .tCyyY,,---J    c                       e Zd ZddZedd            ZdefdZdee	e
df                  fdZd Zd	 Zd
 ZddZddZd ZefdZd ZefdZdS )CaseInsensitiveOrderedMultiDictreturnNc                 "    g | _         i | _        d S r   )_real_keyedselfs    r   __init__z(CaseInsensitiveOrderedMultiDict.__init__:   s     "
&(r   c                     t          ||           r|S  |             }||S t          |t                    st          |                                D ]
\  }}|||<   |S r   )r   r   	TypeErroritems)clsdict_inoutr   values        r   makez$CaseInsensitiveOrderedMultiDict.make>   sp    gs## 	Ncee?J'>22 	O!--// 	 	JCCHH
r   c                 *    t          | j                  S r   )lenr    r!   s    r   __len__z'CaseInsensitiveOrderedMultiDict.__len__P   s    4;r   .c                 4    | j                                         S r   )r    keysr!   s    r   r0   z$CaseInsensitiveOrderedMultiDict.keysS   s    {!!!r   c                 *    t          | j                  S r   )iterr   r!   s    r   r&   z%CaseInsensitiveOrderedMultiDict.itemsV   s    DJr   c                 4    | j                                         S r   )r    __iter__r!   s    r   r4   z(CaseInsensitiveOrderedMultiDict.__iter__Y   s    {##%%%r   c                 4    | j                                         S r   )r    valuesr!   s    r   r6   z&CaseInsensitiveOrderedMultiDict.values\   s    {!!###r   c                 l    | j                             ||f           || j        t          |          <   d S r   )r   appendr    r   r"   r   r*   s      r   __setitem__z+CaseInsensitiveOrderedMultiDict.__setitem___   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__c   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__j   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.getm   sU    	9 	 	 	D	 h4::<<s   
 
c              #   p   K   t          |          }| j        D ]\  }}t          |          |k    r|V  d S r   )r   r   )r"   r   r@   r*   s       r   get_allz'CaseInsensitiveOrderedMultiDict.get_allx   sM      nn!Z 	 	MFE  C''	 	r   c                 v    	 | |         S # t           $ r |                     ||          | |<   Y nw xY w| |         S r   )rG   rK   rI   s      r   
setdefaultz*CaseInsensitiveOrderedMultiDict.setdefault~   sS    	/9 	/ 	/ 	/g..DIII	/ Cys   
 #00)r   Nr   )__name__
__module____qualname__r#   classmethodr+   intr.   r   tupler   r0   r&   r4   r6   r:   rB   rE   rH   rK   rM   rO    r   r   r   r   9   s1       ) ) ) )    ["         "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
        )NotImplementedErrorrK   r"   rY   rZ   s      r   rK   z
Config.get        "$(+++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   rJ   c                     d S r   rV   )r"   rY   rZ   rJ   s       r   get_booleanzConfig.get_boolean   s	     sr   c                     d S r   rV   r]   s      r   rb   zConfig.get_boolean   s    SVSVr   Nc                     	 |                      ||          }n# t          $ r |cY S w xY w|                                dk    rdS |                                dk    rdS t          d|          )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: )rK   rG   r   
ValueError)r"   rY   rZ   rJ   r*   s        r   rb   zConfig.get_boolean   s    	HHWd++EE 	 	 	NNN	;;==G##4[[]]h&&5AA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"   rY   rZ   r*   s       r   ri   z
Config.set   r^   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"   rY   s     r   r&   zConfig.items   s     "$*---r   c                 *    t          | j                  )zRIterate over the sections.

        Returns: Iterator over section tuples
        )r\   sectionsr!   s    r   rn   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
        )rn   )r"   rZ   s     r   has_sectionzConfig.has_section   s     t}}&&r   r   )rP   rQ   rR   __doc__SectionLikeNameLikeValuerK   r   r`   r   boolrb   r
   r   	ValueLikeri   rU   Namer&   Sectionrn   rp   rV   r   r   rX   rX      s       ,; ,h ,5 , , , ,5K 5x 5HUO 5 5 5 5 "*2=A	   X V;VhV8D>VVV XV OSC C"C*2C=Ed^C	$C C C C.,",*2,;@D;Q,	, , , ,.[ .XeD%K6H-I . . . .1(7+ 1 1 1 1' 'D ' ' ' ' ' 'r   rX   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.Nr6   encodingr   c                 |    |t          j                    }|| _        t                              |          | _        dS )zCreate a new ConfigDict.N)sysgetdefaultencodingr{   r   r+   _values)r"   r6   r{   s      r   r#   zConfigDict.__init__   s8     -//H 6;;FCCr   c                 0    | j         j         d| j        dS )N())	__class__rP   r   r!   s    r   __repr__zConfigDict.__repr__  s     .)==DL====r   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   rE   r"   r   s     r   rE   zConfigDict.__getitem__
      |'',,,r   r*   c                 8    | j                             ||          S r   )r   r:   r9   s      r   r:   zConfigDict.__setitem__  s    |''U333r   c                 6    | j                             |          S r   )r   rB   r   s     r   rB   zConfigDict.__delitem__  r   r   c                 4    | j                                         S r   )r   r4   r!   s    r   r4   zConfigDict.__iter__  s    |$$&&&r   c                 4    | j                                         S r   )r   r.   r!   s    r   r.   zConfigDict.__len__  s    |##%%%r   rZ   c                     |                     d          }t          |          dk    r|d         |d         |d         fS |d         d |d         fS )N.   r   r      )splitr-   )r'   rZ   partss      r   _parse_settingzConfigDict._parse_setting  sN    

3u::??!HeAha11!HdE!H--r   rY   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 rV   )r   r   encoder{   ).0
subsectionr"   s     r   
<listcomp>z6ConfigDict._check_section_and_name.<locals>.<listcomp>(  sR         "*e44 
!!$-000  r   )r   rU   r   r   r{   )r"   rY   rZ   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   rM   rG   r]   s      r   r`   zConfigDict.get_multivar5  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   rG   r]   s      r   rK   zConfigDict.get@  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 )Nre   rf   )r   r   ru   r   r   r{   r   rO   rj   s       r   ri   zConfigDict.setO  s     44WdCCeT"" 	3$2GG(E%'' 	0LL//E16((...r   c                 Z    | j                             |                                          S r   )r   rK   r&   rl   s     r   r&   zConfigDict.items_  s&     |((..000r   c                 4    | j                                         S r   )r   r0   r!   s    r   rn   zConfigDict.sectionsd  s    |  """r   NN)"rP   rQ   rR   rq   r   r   rx   rw   rt   r   r#   r   objectru   r   rE   r:   rB   r   r4   rT   r.   rS   r   rr   rs   rU   r   r`   rK   rv   ri   r&   rn   rV   r   r   rz   rz      s       33 %)D D7N4;$??@$F
D
 T	"D 
D D D D># > > > >SF St S S S S-w ->$++F - - - -4w 4~dEk/J 4t 4 4 4 4-w -4 - - - -'(7+ ' ' ' '& & & & & .# . . . [.%"%*2%	w}	% % % %(	9K 	9x 	9HUO 	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   rz   r*   r   c                     |                      d          s|                     d          sd| v rdt          |           z   dz   S t          |           S )N)       	   #   ")
startswithendswith_escape_valuer*   s    r   _format_stringr   h  s]    ''$>>-(($ 5==mE***T11U###r      \r      n   
   tr      b   r      ;r   c           	         t          |                                           } t                      }t                      }d}d}|t          |           k     rZ| |         }|t          d          k    r|dz  }	 t          | |                  }nU# t
          $ r}t          d| d| d          |d }~wt          $ r$}t          d| |         d| d	|           |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     Z|rt          d          t          |          S )NFr   r   r   zescape character in z at z before end of stringz/escape character followed by unknown character z in r   zmissing end quote)	bytearraystripr-   ord_ESCAPE_TABLE
IndexErrorrg   rG   extendr8   _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	!%(+    P5PPPPP      feAhffVWff]bff   )

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

:&&&&[[
JJqMMM	Q= c%jj..@  .,---::s$   7B 
CB,,C9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   rZ   c                     t          t          |                     D ],}| ||dz            }|                                s	|dk    r dS -dS )Nr      -FTranger-   isalnumrZ   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                   |d         dd
         |d<   t          |d                   st	          d|d                   |d         |d         f}nvt          |d                   st	          d|d                   |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 r   zinvalid section name r   )r   rstripr>   r   rg   r   r-   r   )r   r   escapedr?   r   lastptsrY   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=3q6==>>>VAbD\CF"3q6** 	A?SV??@@@q63q6""3q6** 	A?SV??@@@!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.Nr6   r{   r   c                 \    t                                          ||           d | _        d S )N)r6   r{   )superr#   path)r"   r6   r{   r   s      r   r#   zConfigFile.__init__  s-     	:::#'			r   fc                 ~    |             }d}d}d}t          |                                          D ]	\  }}|dk    r|                    d          r
|dd         }|                                }|St	          |          dk    r:|dd         dk    r,t          |          \  }}|j                            |           t          |          	                                dk    r|t          d|d	          	 |                    d
d          \  }}n# t          $ r |}d}Y nw xY w|	                                }t          |          st          d|          |                    d          r|dd         }O|                    d          r|dd         }pd}t          |          }||j        |         |<   d}|J |                    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 z without section   =re   zinvalid variable name s   \
s   \
)r>   	readlinesr   lstripr-   r   r   rO   r   r   rg   r   r   r   r   )	r'   r   r   rY   settingcontinuationlinenor   r*   s	            r   	from_filezConfigFile.from_file  s    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?$%H%H%H%HIII$%)ZZa%8%8NGUU! $ $ $"G#EEE$ "--//+G44 K$%Ig%I%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_path9  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_pathA  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&   rg   writer   )r"   r   rY   r6   section_namesubsection_namer   r*   s           r   r   zConfigFile.write_to_fileH  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   )rP   rQ   rR   rq   r   r   rx   rw   rt   r   r#   rS   r	   r   r   r
   r   r   __classcell__)r   s   @r   r   r     s?       EE %)( (7N4;$??@$F
(
 T	"( 
( ( ( ( ( ( /( /| / / / [/b 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environrK   r   
expanduserjoin)path_segmentsxdg_config_homes     r   get_xdg_config_home_pathr  Y  sI    jnn
<(( O 7<8-8888r   c               #     K   dD ]} t           j                            dd                              d          D ]}t           j                            t           j                            ||                     rZt           j                            |          \  }}|V  t           j                            |          \  }}|dk    s|dk    r|V   nd S )N)zgit.exezgit.cmdPATH ;mingw32mingw64)r  r  rK   r   r   existsr  )exer   git_dir_bin_dir
parent_dirbasenames         r   _find_git_in_win_pathr  a  s      %  JNN62..44S99 	 	Dw~~bgll45566 

 %'GMM$$7$7!')w}}W'='=$
Hy((H	,A,A$$$$
 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&  q  sa     OOOMMMW$$1 	
 T(&*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         dd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writabler   c                 "    || _         || _        d S r   )r0  r1  )r"   r0  r1  s      r   r#   zStackedConfig.__init__  s     ! r   c                 2    d| j         j         d| j        dS )N<z for >)r   rP   r0  r!   s    r   r   zStackedConfig.__repr__  s"    C4>*CCCCCCr   c                 <     | |                                            S r   )default_backends)r'   s    r   rJ   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)r8   r  r   r  r  r  r}   r  r   r-  r   r   FileNotFoundError)r'   pathsr0  r   cfs        r   r7  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rY   rZ   c                     t          |t                    s|f}| j        D ]*}	 |                    ||          c S # t          $ r Y 'w xY wt	          |          r   )r   rU   r0  rK   rG   r"   rY   rZ   backends       r   rK   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   rU   r0  r`   rG   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   )r1  r\   ri   rj   s       r   ri   zStackedConfig.set  s6     = %dh///}  $666r   c              #      K   t                      }| j        D ]6}|                                D ]}||vr|                    |           |V   7d S r   )ri   r0  rn   add)r"   seenrA  rY   s       r   rn   zStackedConfig.sections  sq      uu} 	" 	"G"++-- " "$&&HHW%%%!MMM"	" 	"r   r   )r   r/  )rP   rQ   rR   rq   r=   r   r
   r#   r   r   rS   rJ   r7  rr   rs   rt   rK   r   r`   r   rv   ru   ri   rx   rn   rV   r   r   r/  r/    s{       @@ LP! !Z(!4<Z4H!	! ! ! !D# D D D D + + + [+ j!1    [.; h 5    K x HUO    7"7*27;@D;Q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_submodulesrJ    s#    


t
$
$CC   r   r*  c              #      K   |                                  D ]R}|\  }}|dk    rE	 |                     |d          }|                     |d          }|||fV  B# t          $ r Y Nw xY wSd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)r0   rK   rG   )r*  rY   section_kindr   sm_pathsm_urls         r   rH  rH    s       ;;==  %,"l<'' **Wg66GV4455555    	 ( s   3A
A&%A&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 )z.Iterate over insteadOf / pushInsteadOf values.r   rL  r   	insteadOfpushInsteadOfzutf-8N)rn   r=   r`   rG   r   r   decode)r*  rP  rY   replacementneedlesneedles         r   iter_instead_ofrX    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)rX  r   r-   )r*  rY  rP  longest_needleupdated_urlrW  rU  s          r   apply_instead_ofr]    s    NK.vt<< @ @""6** 	~V,,#N%V(??Kr   )F)7rq   r  r}   collections.abcr   r   r   r   
contextlibr   typingr   r	   r
   r   r   filer   r   rH   r   r   r   rw   r   rs   rU   rx   rr   rt   rv   rX   rz   r   r   r   r   r   r   r   ru   r   r   r   r   r   r  r  r&  r-  r/  rJ  rH  rX  r]  rV   r   r   <module>rb     s  ,  
			 



 H H H H H H H H H H H H                         688  K K K K Kn K K K\ 
s

E3eE3J&7&< ==>%*	b' b' b' b' b' b' b' b'Jq# q# q# q# q#e1L(LM q# q# q#h$% $E $ $ $ $ CJJE

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