o
    Uhb                     @   s  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d	 ZG d
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 dZG dd deeeeeef f Z dedefd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 d!Z&dedefd"d#Z'd$ede(fd%d&Z)d$ede(fd'd(Z*d)edefd*d+Z+d)edeeef fd,d-Z,G d.d/ d/e Z-d0d1 Z.d2d3 Z/d4d5 Z0d6d7 Z1G d8d9 d9eZ2d:edeeeeef  fd;d<Z3d=e-deeeeef  fd>d?Z4dGd=edAe(deeeef  fdBdCZ5dGd=edDedAe(defdEdFZ6dS )HzReading 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                 C   s6   t | ttfr|  S t | trt| tt| S | S N)
isinstancebytesstrlowerr   typemap	lower_key)key r   b/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/dulwich/config.pyr   /   s
   
r   c                   @   s   e Zd ZdddZedddZdefddZdee	e
d	f  fd
dZdd Zdd Zdd ZdddZdddZdd ZefddZdd ZefddZdS ) CaseInsensitiveOrderedMultiDictreturnNc                 C   s   g | _ i | _d S r   )_real_keyedselfr   r   r   __init__:   s   
z(CaseInsensitiveOrderedMultiDict.__init__c                 C   sL   t || r|S |  }|d u r|S t |tst| D ]\}}|||< q|S r   )r   r   	TypeErroritems)clsdict_inoutr   valuer   r   r   make>   s   


z$CaseInsensitiveOrderedMultiDict.makec                 C   
   t | jS r   )lenr   r   r   r   r   __len__P      
z'CaseInsensitiveOrderedMultiDict.__len__.c                 C   
   | j  S r   )r   keysr   r   r   r   r,   S   r*   z$CaseInsensitiveOrderedMultiDict.keysc                 C   r'   r   )iterr   r   r   r   r   r!   V   r*   z%CaseInsensitiveOrderedMultiDict.itemsc                 C   r+   r   )r   __iter__r   r   r   r   r.   Y   r*   z(CaseInsensitiveOrderedMultiDict.__iter__c                 C   r+   r   )r   valuesr   r   r   r   r/   \   r*   z&CaseInsensitiveOrderedMultiDict.valuesc                 C   s"   | j ||f || jt|< d S r   )r   appendr   r   r   r   r%   r   r   r   __setitem___   s   z+CaseInsensitiveOrderedMultiDict.__setitem__c                 C   sH   t |}| j|= ttt| jD ]\}\}}t ||kr!| j|= qd S r   )r   r   reversedlist	enumerater   )r   r   iactualunused_valuer   r   r   __delitem__c   s   z+CaseInsensitiveOrderedMultiDict.__delitem__c                 C   s   | j t| S r   )r   r   )r   itemr   r   r   __getitem__j      z+CaseInsensitiveOrderedMultiDict.__getitem__c                 C   s4   z| | W S  t y   Y nw |tu rt|  S |S r   )KeyErrorSENTINELr   r   r   defaultr   r   r   getm   s   

z#CaseInsensitiveOrderedMultiDict.getc                 c   s0    t |}| jD ]\}}t ||kr|V  qd S r   )r   r   )r   r   r7   r%   r   r   r   get_allx   s   z'CaseInsensitiveOrderedMultiDict.get_allc                 C   s4   z| | W S  t y   | ||| |< Y | | S w r   )r=   rA   r?   r   r   r   
setdefault~   s   
z*CaseInsensitiveOrderedMultiDict.setdefault)r   Nr   )__name__
__module____qualname__r   classmethodr&   intr)   r   tupler   r,   r!   r.   r/   r2   r9   r;   r>   rA   rB   rC   r   r   r   r   r   9   s    


r   .c                
   @   s  e Zd ZdZdededefddZdededee fddZ	e
deded	edefd
dZe
dededee fddZ	ddeded	ee dee fddZdededeeef ddfddZdedeeeef  fddZdee fddZdedefddZdS )ConfigzA Git configuration.sectionnamer   c                 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
        )NotImplementedErrorrA   r   rK   rL   r   r   r   rA         
z
Config.getc                 C   rM   )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
        )rN   get_multivarrO   r   r   r   rQ      rP   zConfig.get_multivarr@   c                 C      d S r   r   )r   rK   rL   r@   r   r   r   get_boolean   s   zConfig.get_booleanc                 C   rR   r   r   rO   r   r   r   rS      s   Nc                 C   sV   z|  ||}W n ty   | Y S 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: )rA   r=   r   
ValueError)r   rK   rL   r@   r%   r   r   r   rS      s   r%   c                 C   rM   )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
        )rN   setr   rK   rL   r%   r   r   r   rW      rP   z
Config.setc                 C   rM   )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
        )rN   r!   r   rK   r   r   r   r!      s   
zConfig.itemsc                 C   rM   )zRIterate over the sections.

        Returns: Iterator over section tuples
        )rN   sectionsr   r   r   r   rZ      s   
zConfig.sectionsc                 C   s   ||   v S )zCheck if a specified section exists.

        Args:
          name: Name of section to check for
        Returns:
          boolean indicating whether the section exists
        )rZ   )r   rL   r   r   r   has_section   s   zConfig.has_sectionr   )rD   rE   rF   __doc__SectionLikeNameLikeValuerA   r   rQ   r   boolrS   r	   r
   	ValueLikerW   rI   Namer!   SectionrZ   r[   r   r   r   r   rJ      sL    



rJ   c                   @   s  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dZ
de	fdd	Zd
edefddZdedeeef fddZdedeeef ddfddZdeddfddZdee fddZdefddZede	fddZdededeeef fddZdededee fdd Zdededefd!d"Zdededeeef ddfd#d$Zdedeeeef  fd%d&Z dee fd'd(Z!dS )*
ConfigDictz)Git configuration stored in a dictionary.Nr/   encodingr   c                 C   s&   |du rt  }|| _t|| _dS )zCreate a new ConfigDict.N)sysgetdefaultencodingre   r   r&   _valuesr   r/   re   r   r   r   r      s   zConfigDict.__init__c                 C   s   | j j d| jdS )N())	__class__rD   rh   r   r   r   r   __repr__  s   zConfigDict.__repr__otherc                 C   s   t || jo|j| jkS r   )r   rl   rh   )r   rn   r   r   r   __eq__     zConfigDict.__eq__r   c                 C      | j |S r   )rh   r;   r   r   r   r   r   r;   
     zConfigDict.__getitem__r%   c                 C   s   | j ||S r   )rh   r2   r1   r   r   r   r2     r<   zConfigDict.__setitem__c                 C   rq   r   )rh   r9   rr   r   r   r   r9     rs   zConfigDict.__delitem__c                 C   r+   r   )rh   r.   r   r   r   r   r.     r*   zConfigDict.__iter__c                 C   r+   r   )rh   r)   r   r   r   r   r)     r*   zConfigDict.__len__rL   c                 C   s>   | d}t|dkr|d |d |d fS |d d |d fS )N.   r   r      )splitr(   )r"   rL   partsr   r   r   _parse_setting  s   
zConfigDict._parse_settingrK   c                    sD   t |ts|f}t fdd|D }t |ts| j}||fS )Nc                    s&   g | ]}t |ts| jn|qS r   )r   r   encodere   ).0
subsectionr   r   r   
<listcomp>(  s    z6ConfigDict._check_section_and_name.<locals>.<listcomp>)r   rI   r   rz   re   )r   rK   rL   checked_sectionr   r   r   _check_section_and_name!  s   


	z"ConfigDict._check_section_and_namec                 C   sX   |  ||\}}t|dkr!z	| j| |W S  ty    Y nw | j|d f |S Nr   r   )r   r(   rh   rB   r=   rO   r   r   r   rQ   5  s   zConfigDict.get_multivarc                 C   sT   |  ||\}}t|dkr z| j| | W S  ty   Y nw | j|d f | S r   )r   r(   rh   r=   rO   r   r   r   rA   @  s   zConfigDict.getc                 C   sP   |  ||\}}t|tr|rdnd}t|ts|| j}|| j||< d S )NrT   rU   )r   r   r`   r   rz   re   rh   rC   rX   r   r   r   rW   O  s   

zConfigDict.setc                 C   s   | j | S r   )rh   rA   r!   rY   r   r   r   r!   _  s   zConfigDict.itemsc                 C   r+   r   )rh   r,   r   r   r   r   rZ   d  r*   zConfigDict.sectionsNN)"rD   rE   rF   r\   r
   r   rc   rb   r_   r   r   rm   objectr`   ro   r;   r2   r9   r   r.   rH   r)   rG   ry   r]   r^   rI   r   rQ   rA   ra   rW   r!   rZ   r   r   r   r   rd      sh    







rd   r%   r   c                 C   s4   |  ds| dsd| v rdt|  d S t| S )N)       	   #   ")
startswithendswith_escape_valuer%   r   r   r   _format_stringh  s   r      \r      n   
   tr      b   r      ;r   c              
   C   s\  t |  } t  }t  }d}d}|t| k r| | }|tdkrp|d7 }zt| |  }W n3 tyD } ztd| d| d|d }~w ty_ } ztd| | d| d	| |d }~ww |rj|| t  }|	| n*|td
krz| }n |t
v r|sn#|tv r|	| n|r|| t  }|	| |d7 }|t| k s|rt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
IndexErrorrV   r=   extendr0   _COMMENT_CHARS_WHITESPACE_CHARSr   )r%   ret
whitespace	in_quotesr6   cvexcr   r   r   _parse_string~  sZ   


 r   c                 C   s@   |  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   r   r   r   r     s   r   rL   c                 C   s<   t t| D ]}| ||d  }| s|dkr dS qdS )Nr      -FTranger(   isalnumrL   r6   r   r   r   r   _check_variable_name     r   c                 C   s<   t t| D ]}| ||d  }| s|dvr dS qdS )Nr   )r      .FTr   r   r   r   r   _check_section_name  r   r   linec                 C   sb   t dt dh}t d}d}tt| D ]\}}||kr | }q|s.||v r.| d |   S q| S )Nr   r   r   F)r   r5   r   )r   comment_bytesquotestring_openr6   	characterr   r   r   _strip_comments  s   r   c                 C   s  t |  } d}d}t| D ]&\}}|rd}q|tdkr | }|tdkr(d}|tdkr4|s4|} nqtd| d| dd}| |d d  } t|d	kr|d d d dkse|d d
d  dkrntd|d |d dd
 |d< t|d std|d |d |d f}|| fS t|d std|d |d dd}t|d	kr|d |d f}|| fS |d f}|| fS )NFr   r   T   ]zexpected trailing ]r   r   rv   zInvalid subsection r   zinvalid section name r   )r   rstripr5   r   rV   rw   r(   r   )r   r   escapedr6   r   lastptsrK   r   r   r   _parse_section_header_line  sD   (	
r   c                       s   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dZ
ededd fd	d
Zede	dd fddZddee	 ddfddZdeddfddZ  ZS )
ConfigFilez;A Git configuration file, like .git/config or ~/.gitconfig.Nr/   re   r   c                    s   t  j||d d | _d S )N)r/   re   )superr   pathri   rl   r   r   r     s   
zConfigFile.__init__fc           	   	   C   s  |  }d}d}d}t | D ]\}}|dkr"|dr"|dd }| }|du rt|dkrD|dd dkrDt|\}}|j| t|	 dkrMq|du rYt
d|d	z
|d
d\}}W n t
yp   |}d}Y nw |	 }t|st
d||dr|dd }q|dr|dd }qd}t|}||j| |< d}q|dusJ |dr||dd 7 }q|dr||dd 7 }q||7 }t|}||j| |< d}d}q|S )z+Read configuration from a file-like object.Nr   s   ﻿ru   r      [    zsetting z without section   =rT   zinvalid variable name s   \
s   \
)r5   	readlinesr   lstripr(   r   rh   rC   r   r   rV   rw   r   r   r   )	r"   r   r   rK   settingcontinuationlinenor   r%   r   r   r   	from_file  sX   



zConfigFile.from_filer   c                 C   sB   t |d}| |}||_|W  d   S 1 sw   Y  dS )z'Read configuration from a file on disk.rbN)r   r   r   )r"   r   r   r   r   r   r   	from_path9  s
   
$zConfigFile.from_pathc                 C   sH   |du r| j }t|d}| | W d   dS 1 sw   Y  dS )z&Write configuration to a file on disk.Nwb)r   r   write_to_file)r   r   r   r   r   r   write_to_pathA  s
   "zConfigFile.write_to_pathc              	   C   s   | j  D ]N\}}z|\}}W n ty   |\}d}Y nw |du r,|d| d  n|d| d | d  | D ]\}}t|}|d| d | d  q=qdS )	z*Write configuration to a file-like object.Nr   s   ]
s    "s   "]
r   s    = r   )rh   r!   rV   writer   )r   r   rK   r/   section_namesubsection_namer   r%   r   r   r   r   H  s   zConfigFile.write_to_filer   r   )rD   rE   rF   r\   r
   r   rc   rb   r_   r   r   rG   r   r   r   r	   r   r   __classcell__r   r   r   r   r     s&    

1r   c                  G   s*   t jdt jd}t jj|g| R  S )NXDG_CONFIG_HOMEz
~/.config/)osenvironrA   r   
expanduserjoin)path_segmentsxdg_config_homer   r   r   get_xdg_config_home_pathY  s
   
r   c                  c   s    dD ]:} t jdddD ]-}t jt j|| r<t j|\}}|V  t j|\}}|dks7|dkr:|V   nqqd S )N)zgit.exezgit.cmdPATH ;mingw32mingw64)r   r   rA   rw   r   existsr   )exer   git_dir_bin_dir
parent_dirbasenamer   r   r   _find_git_in_win_patha  s   r   c               
   c   s    dd l } dd l}|  dkrd}nd}|j|jfD ]<}tt. |||}||d\}}||j	kr8|V  W d    n1 sBw   Y  W d    n1 sQw   Y  q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typr   r   r   _find_git_in_win_regq  s&   

r   c                  c   sd    dt jv rt jt jd ddV  t D ]} t j| ddV  qt D ]} t j| ddV  q$d S )NPROGRAMDATAGitconfigetc	gitconfig)r   r   r   r   r   r   )r   r   r   r   get_win_system_paths  s   


r   c                   @   s   e Zd ZdZ	ddee dee ddfddZdefdd	Z	e
dd
dZe
dee fddZdededefddZdededee fddZdededeeef ddfddZdee fddZdS )StackedConfigz6Configuration which reads from multiple config files..Nbackendswritabler   c                 C   s   || _ || _d S r   )r   r   )r   r   r   r   r   r   r     s   
zStackedConfig.__init__c                 C   s   d| j j d| jdS )N<z for >)rl   rD   r   r   r   r   r   rm     rp   zStackedConfig.__repr__c                 C   s   | |   S r   )default_backends)r"   r   r   r   r@     s   zStackedConfig.defaultc              	   C   s   g }| tjd | tdd dtjvr(| d tjdkr(|t	  g }|D ]}zt
|}W n	 ty>   Y q,w | | q,|S )zjRetrieve the default configuration.

        See git-config(1) for details on the files searched.
        z~/.gitconfiggitr   GIT_CONFIG_NOSYSTEMz/etc/gitconfigwin32)r0   r   r   r   r   r   rf   r   r   r   r   r   FileNotFoundError)r"   pathsr   r   cfr   r   r   r    s    


zStackedConfig.default_backendsrK   rL   c              	   C   sH   t |ts|f}| jD ]}z	|||W   S  ty   Y qw t|r   )r   rI   r   rA   r=   r   rK   rL   backendr   r   r   rA     s   

zStackedConfig.getc              	   c   sJ    t |ts	|f}| jD ]}z|||E d H  W q ty"   Y qw d S r   )r   rI   r   rQ   r=   r	  r   r   r   rQ     s   

zStackedConfig.get_multivarr%   c                 C   s$   | j d u r
t| j| j |||S r   )r   rN   rW   rX   r   r   r   rW     s   

zStackedConfig.setc                 c   s>    t  }| jD ]}| D ]}||vr|| |V  qqd S r   )rW   r   rZ   add)r   seenr
  rK   r   r   r   rZ     s   

zStackedConfig.sectionsr   )r   r   )rD   rE   rF   r\   r4   r   r	   r   r   rm   rG   r@   r  r]   r^   r_   rA   r   rQ   r
   ra   r`   rW   rc   rZ   r   r   r   r   r     s6    

	

r   r   c                 C   s   t | }t|S )zRead a .gitmodules file.)r   r   parse_submodules)r   cfgr   r   r   read_submodules  s   
r  r   c              	   c   s`    |   D ](}|\}}|dkr-z| |d}| |d}|||fV  W q ty,   Y qw qd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)r,   rA   r=   )r   rK   section_kindr   sm_pathsm_urlr   r   r   r    s   	r  Fpushc              	   c   s    |   D ]R}|d dkrq|d }z
t| |d}W n ty'   g }Y nw |r@z|t| |d7 }W n	 ty?   Y nw |D ]}t|tsKJ |d|dfV  qBqdS )z.Iterate over insteadOf / pushInsteadOf values.r   r  r   	insteadOfpushInsteadOfzutf-8N)rZ   r4   rQ   r=   r   r   decode)r   r  rK   replacementneedlesneedler   r   r   iter_instead_of  s*   r  orig_urlc                 C   sT   d}|}t | |D ]\}}||sq	t|t|k r'|}||t|d  }q	|S )z)Apply insteadOf / pushInsteadOf to a URL.r   N)r  r   r(   )r   r  r  longest_needleupdated_urlr  r  r   r   r   apply_instead_of  s   
r  )F)7r\   r   rf   collections.abcr   r   r   r   
contextlibr   typingr   r   r	   r
   r   filer   r   r>   r   r   r   rb   r   r^   rI   rc   r]   r_   ra   rJ   rd   r   r   r   r   r   r   r   r`   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   <module>   sV   
N"et,
(_
 K $ 