
    BC                        S r SSKrSSKrSSKJrJrJr  SSKJr   SSK	J
r
Jr  SSKJr  \" 5       rS r " S S	\5      r " S
 S\5      r " S S\\5      rS r\" S5      \" S5      \" S5      \" S5      \" S5      \" S5      \" S5      \" S5      \" S5      \" S5      0r\" S5      \" S5      /r\" S5      \" S5      /rS rS rS rS rS r " S S \5      rS! r  " S" S#\5      r!S$ r"g! \ a    SSKJ
r
Jr   Nf = f)%zReading and writing Git configuration files.

TODO:
 * preserve formatting when updating configuration files
 * treat subsection names as case-insensitive for [branch.foo] style
   subsections
    N)BinaryIOTupleOptional)OrderedDict)IterableMutableMapping)GitFilec                     [        U [        [        45      (       a  U R                  5       $ [        U [        5      (       a  [        U 5      " [        [        U 5      5      $ U $ N)
isinstancebytesstrlowerr   typemap	lower_key)keys    !lib/third_party/dulwich/config.pyr   r   7   sG    #s|$$yy{#x  CyY,--J    c                   `   ^  \ rS rSr\SS j5       rU 4S jrU 4S jr\4S jr	\4S jr
SrU =r$ )	CaseInsensitiveDictA   c                     [        X5      (       a  U$ U " 5       nUc  U$ [        U[        5      (       d  [        eUR                  5        H	  u  p4XBU'   M     U$ r   )r   r   	TypeErroritems)clsdict_inoutr   values        r   makeCaseInsensitiveDict.makeB   sW     g##Ne?J'>22O!--/JCH * 
r   c                 F   > [        U5      n[        [        U ]  " X40 UD6  g r   )r   superr   __setitem__)selfr   r   kwargs	__class__s       r   r$   CaseInsensitiveDict.__setitem__U   s!    n!44SJ6Jr   c                 @   > [        U5      n[        [        U ]  U5      $ r   )r   r#   r   __getitem__)r%   itemr   r'   s      r   r*   CaseInsensitiveDict.__getitem__Z   s    o($;C@@r   c                 b     X   $ ! [          a     Of = fU[        L a  [        U 5      " 5       $ U$ r   )KeyErrorSENTINALr   r%   r   defaults      r   getCaseInsensitiveDict.get_   s<    	9 		 h:<s    
c                 X     X   $ ! [          a    U R                  X5      X'    X   $ f = fr   )r.   r2   r0   s      r   
setdefaultCaseInsensitiveDict.setdefaultj   s6    	/9 	/.DIy	/s    )) r   )__name__
__module____qualname____firstlineno__classmethodr    r$   r*   r/   r2   r5   __static_attributes____classcell__r'   s   @r   r   r   A   s:     $K
A
  ( 	 '/  r   r   c                   @    \ rS rSrSrS rSS jrS rS rS r	S	 r
S
rg)Configs   zA Git configuration.c                 ,    [        U R                  5      e)zRetrieve the contents of a configuration setting.

Args:
  section: Tuple with section name and optional subsection namee
  subsection: Subsection name
Returns:
  Contents of the setting
Raises:
  KeyError: if the value is not set
)NotImplementedErrorr2   r%   sectionnames      r   r2   
Config.getv   s     "$((++r   Nc                      U R                  X5      nUR                  5       S:X  a  gUR                  5       S:X  a  g[        SU-  5      e! [         a    Us $ f = f)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
Raises:
  KeyError: if the value is not set
   trueT   falseFznot a valid boolean string: %r)r2   r.   r   
ValueError)r%   rF   rG   r1   r   s        r   get_booleanConfig.get_boolean   s`    	HHW+E ;;=G#[[]h&9EABB  	N	s   A AAc                 ,    [        U R                  5      e)zSet 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
)rD   setr%   rF   rG   r   s       r   rP   
Config.set   s     "$((++r   c                 ,    [        U R                  5      e)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
)rD   	iteritemsr%   rF   s     r   rT   Config.iteritems   s     "$..11r   c                 ,    [        U R                  5      e)zBIterate over the sections.

Returns: Iterator over section tuples
)rD   itersectionsr%   s    r   rX   Config.itersections   s    
 "$"3"344r   c                 &    XR                  5       ;   $ )zCheck if a specified section exists.

Args:
  name: Name of section to check for
Returns:
  boolean indicating whether the section exists
)rX   )r%   rG   s     r   has_sectionConfig.has_section   s     ((***r   r7   r   )r8   r9   r:   r;   __doc__r2   rM   rP   rT   rX   r\   r=   r7   r   r   rA   rA   s   s$    ,C,	,25+r   rA   c                   z    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS r\S 5       rS rS rS rS rS rSrg)
ConfigDict   z)Git configuration stored in a dictionary.Nc                 t    Uc  [         R                  " 5       nX l        [        R	                  U5      U l        g)zCreate a new ConfigDict.N)sysgetdefaultencodingencodingr   r    _values)r%   valuesre   s      r   __init__ConfigDict.__init__   s-    --/H *//7r   c                 R    U R                   R                  < SU R                  < S3$ )N())r'   r8   rf   rY   s    r   __repr__ConfigDict.__repr__   s    >>22DLLAAr   c                 l    [        XR                  5      =(       a    UR                  U R                  :H  $ r   )r   r'   rf   )r%   others     r   __eq__ConfigDict.__eq__   s#    %0RU]]dll5RRr   c                 8    U R                   R                  U5      $ r   )rf   r*   r%   r   s     r   r*   ConfigDict.__getitem__       ||'',,r   c                 8    U R                   R                  X5      $ r   )rf   r$   )r%   r   r   s      r   r$   ConfigDict.__setitem__   s    ||''33r   c                 8    U R                   R                  U5      $ r   )rf   __delitem__rt   s     r   rz   ConfigDict.__delitem__   rv   r   c                 6    U R                   R                  5       $ r   )rf   __iter__rY   s    r   r}   ConfigDict.__iter__   s    ||$$&&r   c                 6    U R                   R                  5       $ r   )rf   __len__rY   s    r   r   ConfigDict.__len__   s    ||##%%r   c                 t    UR                  S5      n[        U5      S:X  a  US   US   US   4$ US   S US   4$ )N.   r         )splitlen)r   rG   partss      r   _parse_settingConfigDict._parse_setting   sH    

3u:?!HeAha11!HdE!H--r   c           	      :   [        U[        5      (       d  U4n[        U Vs/ s H5  n[        U[        5      (       d  UR                  U R                  5      OUPM7     sn5      n[        U[        5      (       d  UR                  U R                  5      nX4$ s  snf r   )r   tupler   encodere   )r%   rF   rG   
subsections       r   _check_section_and_name"ConfigDict._check_section_and_name   s    '5))jG
 #*	 #*J "*e44 !!$--0  #*	
 $&&;;t}}-D}s   <Bc                     U R                  X5      u  p[        U5      S:  a   U R                  U   U   $ U R                  US   4   U   $ ! [         a     N"f = f)Nr   r   )r   r   rf   r.   rE   s      r   r2   ConfigDict.get   si    44WCw<!||G,T22 ||WQZM*400  s   A 
AAc                     U R                  X5      u  p[        U5      [        [        4;  a  UR	                  U R
                  5      nX0R                  R                  U5      U'   g r   )r   r   boolr   r   re   rf   r5   rQ   s       r   rP   ConfigDict.set  sM    44WC;tUm+LL/E16(.r   c                 T    U R                   R                  U5      R                  5       $ r   )rf   r2   r   rU   s     r   rT   ConfigDict.iteritems  s     ||(..00r   c                 6    U R                   R                  5       $ r   )rf   keysrY   s    r   rX   ConfigDict.itersections  s    ||  ""r   )rf   re   NN)r8   r9   r:   r;   r^   rh   rm   rq   r*   r$   rz   r}   r   r<   r   r   r2   rP   rT   rX   r=   r7   r   r   r`   r`      s\    38BS-4-'& . .$	171#r   r`   c                     U R                  S5      (       dH  U R                  S5      (       d2  U R                  S5      (       d  SU ;   d  U R                  S5      (       a  S[        U 5      -   S-   $ [        U 5      $ )N       	   #   ")
startswithendswith_escape_valuer   s    r   _format_stringr     si    E"">>$5=>>%  mE**T11U##r      \r      n   
   tr      b   r      ;r   c                    [        U R                  5       5      n [        5       n[        5       nSnSnU[        U 5      :  a  X   nU[        S5      :X  aE  US-  n [        X      nU(       a  UR                  U5        [        5       nUR                  U5        OxU[        S5      :X  a  U(       + nOaU[        ;   a  U(       d  OeU[        ;   a  UR                  U5        O3U(       a  UR                  U5        [        5       nUR                  U5        US-  nU[        U 5      :  a  M  U(       a  [        S5      e[        U5      $ ! [
         a    [        SX4-  5      e[         a    [        SX   X@4-  5      ef = f)	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
IndexErrorrL   r.   extendappend_COMMENT_CHARS_WHITESPACE_CHARSr   )r   ret
whitespace	in_quotesicvs          r   _parse_stringr   +  s`   ekkm$E
+CJI	A
c%j.HE
?FA
!%(+ 

:&&[
JJqM#d)^%I. ##a 

:&&[
JJqM	Q? c%j.B ,--:=   G5*T    %(-!';< s   E 5E9c                     U R                  SS5      n U R                  SS5      n U R                  SS5      n U R                  SS5      n U $ )	zEscape a value.r   s   \\r   s   \nr   s   \tr   s   \")replacer   s    r   r   r   X  sG    MM%)EMM%(EMM%(EMM$'ELr   c                     [        [        U 5      5       H)  nXUS-    nUR                  5       (       a  M!  US:w  d  M)    g   g)Nr      -FTranger   isalnumrG   r   r   s      r   _check_variable_namer   a  s;    3t9QUOyy{{qDy  r   c                     [        [        U 5      5       H)  nXUS-    nUR                  5       (       a  M!  US;  d  M)    g   g)Nr   )r      .FTr   r   s      r   _check_section_namer   i  s<    3t9QUOyy{{q4  r   c                     [        S5      [        S5      1n[        S5      nSn[        [        U 5      5       H(  u  pEXR:X  a	  U(       + nM  U(       a  M  XQ;   d  M#  U S U s  $    U $ )Nr   r   r   F)r   	enumerater   )linecomment_bytesquotestring_openr   	characters         r   _strip_commentsr   q  s`    YD	*MIEK!)D/2)/K!;8O 3 Kr   c                      ^  \ rS rSrSrSU 4S jjr\S\SS 4S j5       r\SS j5       r	SSS	 jjr
S\SS4S
 jrSrU =r$ )
ConfigFilei  z;A Git configuration file, like .git/config or ~/.gitconfig.Nc                 6   > [         [        U ]  XS9  S U l        g )N)rg   re   )r#   r   rh   path)r%   rg   re   r'   s      r   rh   ConfigFile.__init__  s    j$((J	r   freturnc                 j   U " 5       nSnSnSn[        UR                  5       5       GHZ  u  pgUR                  5       nUGc  [        U5      S:  Ga7  USS S:X  Ga-  [	        U5      R                  5       n UR                  S5      nUSU R                  SS5      n	XxS-   S n[        U	5      S:X  ac  U	S   SS S	:w  d  U	S   S
S S	:w  a  [        SU	S   -  5      eU	S   SS
 U	S'   [        U	S   5      (       d  [        SU	S   -  5      eU	S   U	S   4nOY[        U	S   5      (       d  [        SU	S   -  5      eU	S   R                  SS5      n	[        U	5      S:X  a  U	S   U	S   4nOU	S   4nUR                  R                  U5        [	        U5      R                  5       S:X  a  GM  Uc  [        SU-  5      e UR                  SS5      u  pJUR                  5       n[        U5      (       d  [        SU-  5      eU
R                  S5      (       a  U
SS nGM  Sn[        U
5      n
XR                  U   U'   SnGM  UR                  S5      (       a
  XWSS -  nGM6  XW-  n[        U5      n
XR                  U   U'   SnSnGM]     U$ ! [         a    [        S5      ef = f! [         a    UnSn
 Nf = f)z+Read configuration from a file-like object.Nr   r      [   ]zexpected trailing ]r   r   r   zInvalid subsection %rzinvalid section name %rr   r   zsetting %r without section   =rJ   zinvalid variable name %rs   \
)r   	readlineslstripr   r   rstripindexrL   r   r   rf   r5   r   r   r   r   )r   r   r   rF   settingcontinuationlinenor   lastptsr   s              r   	from_fileConfigFile.from_file  s    e%akkm4LF;;=Dt9q=T"1X%5*40779D@#zz$/ q,,,T15Cq
+D3x1}q6"1:-Q1D",-Ds1v-M"NN%(VAb\CF23q6::",-FQ-O"PP#&q63q6"223q6::",-FQ-O"PP!!fll43s8q='*1vs1v&6G'*1viGKK**73"4(..0C7?$%AD%HII$%)ZZa%8NG "--/+G44$%?'%IJJ>>'**#(":L#'L)%0E49KK(1"G==)) "I-L (L),7E49KK(1#'L"Gq 5r 
c & @()>??@6 " $"G#E$s   5J:J!J!J21J2c                     [        US5       nU R                  U5      nXl        UsSSS5        $ ! , (       d  f       g= f)z'Read configuration from a file on disk.rbN)r	   r   r   )r   r   r   r   s       r   	from_pathConfigFile.from_path  s2     T4 A--"CH !  s   0
>c                     Uc  U R                   n[        US5       nU R                  U5        SSS5        g! , (       d  f       g= f)z&Write configuration to a file on disk.Nwb)r   r	   write_to_file)r%   r   r   s      r   write_to_pathConfigFile.write_to_path  s6    <99DT4 Aq! !  s	   7
Ac                    U R                   R                  5        H  u  p# Uu  pEUc  UR                  SU-   S-   5        OUR                  SU-   S-   U-   S-   5        UR                  5        H=  u  pgUSL a  SnOUSL a  S	nO[	        U5      nUR                  S
U-   S-   U-   S-   5        M?     M     g! [         a	    Uu  nSn Nf = f)z*Write configuration to a file-like object.Nr   s   ]
s    "s   "]
TrJ   FrK   r   s    = r   )rf   r   rL   writer   )r%   r   rF   rg   section_namesubsection_namer   r   s           r   r   ConfigFile.write_to_file  s    #||113OG'07- &|+f45|+e3oEOP$lln
D=#Ee^$E*51Ef,u4u<= -  4  '")"&'s   B33CC)r   r   )r   r   r   )r   N)r8   r9   r:   r;   r^   rh   r<   r   r   r   r   r   r=   r>   r?   s   @r   r   r     s_    E ?( ?| ? ?B  ">x >D > >r   r   c                      [         R                  R                  S[         R                  R	                  S5      5      n[         R                  R
                  " U/U Q76 $ )NXDG_CONFIG_HOMEz
~/.config/)osenvironr2   r   
expanduserjoin)path_segmentsxdg_config_homes     r   get_xdg_config_home_pathr    sC    jjnn
<(O 77<<8-88r   c                   T    \ rS rSrSrSS jrS r\S 5       r\S 5       r	S r
S	 rS
rg)StackedConfigi  z6Configuration which reads from multiple config files..Nc                     Xl         X l        g r   backendswritable)r%   r  r  s      r   rh   StackedConfig.__init__  s      r   c                 T    SU R                   R                  < SU R                  < S3$ )N<z for >)r'   r8   r  rY   s    r   rm   StackedConfig.__repr__  s     $ 7 7GGr   c                 .    U " U R                  5       5      $ r   )default_backends)r   s    r   r1   StackedConfig.default  s    3'')**r   c                 l   / nUR                  [        R                  R                  S5      5        UR                  [	        SS5      5        S[        R
                  ;  a  UR                  S5        / nU H*  n [        R                  U5      nUR                  U5        M,     U$ ! [         a     M=  f = f)zZRetrieve the default configuration.

See git-config(1) for details on the files searched.
z~/.gitconfiggitconfigGIT_CONFIG_NOSYSTEMz/etc/gitconfig)	r   r   r   r   r  r   r   r   FileNotFoundError)r   pathsr  r   cfs        r   r  StackedConfig.default_backends  s     RWW''78-eX>? 

2LL)*D))$/ OOB   % s   9B%%
B32B3c                     [        U[        5      (       d  U4nU R                   H  n UR                  X5      s  $    [	        U5      e! [         a     M1  f = fr   )r   r   r  r2   r.   )r%   rF   rG   backends       r   r2   StackedConfig.get  sX    '5))jG}}G{{711 %
 tn  s   A		
AAc                 ~    U R                   c  [        U R                  5      eU R                   R                  XU5      $ r   )r  rD   rP   rQ   s       r   rP   StackedConfig.set#  s2    == %dhh//}}  66r   r  r   )r8   r9   r:   r;   r^   rh   rm   r<   r1   r  r2   rP   r=   r7   r   r   r  r    sB    @!H + +  *7r   r  c              #      #    U R                  5        H9  nUu  p#US:X  d  M  U R                  US5      nU R                  US5      nXEU4v   M;     g7f)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   paths   urlN)r   r2   )r  rF   section_kindr   sm_pathsm_urls         r   parse_submodulesr!  )  sR      ;;=%,"<'jj'2GZZ0FL11 !s
   A/A)#r^   r   rc   typingr   r   r   collectionsr   collections.abcr   r   ImportErrordulwich.filer	   objectr/   r   r   rA   r`   r   r   r   r   r   r   r   r   r   r   r   r  r  r!  r7   r   r   <module>r(     s9  * 
 
 , ,	 ! 8/+ /dJ+V J+ZP# P#f
$ JE
Is4yIs5zIs5zIs5z d)SY'ZT+ *Zk> k>\917F 17h2}   s   C- -C>=C>