
    d?6                    H   d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
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mZmZ ddlmZ ddlmZ ddlmZmZm Z m!Z! erddl"Z"ddl#Z#d	d
l$m%Z%m&Z&m'Z' d	dl(m)Z)m*Z*m+Z+ d	dl,m-Z-m.Z.m/Z/m0Z0 d	dl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZU d	dlVmWZWmXZXmYZY d	dlZm[Z[ da\ ej]        e^          Z_ G d de`          Za G d de`          Zb G d de`          Zcd Zdd Zee9e=gZfe?e7e8e<gefz   Zge;e5gefz   Zh G d d          Zid Zj G d d          Zk G d d          Zld Zm G d  d!          Znd"eeo         d#eeepeof                  fd$Zqd% Zrde2fd&eeo         d'eeogdf         fd(Zs G d) d*          Ztd+ Zud, Zv G d- d.et          Zw G d/ d0ew          Zx G d1 d2          Zyd#eez         fd3Z{ G d4 d5ew          Z| G d6 d7et          Z}e}Z~ G d8 d9          Z G d: d;e`          Z G d< d=e          Z G d> d?e          Zd@ ZeZ G dA dBew          ZdC Z	 dYd#edD         fdEZdF Z G dG dHet          Z G dI dJe          ZeZd#ezfdKZ	 	 dZdLezdMee%         dNeez         d#eetezf         fdOZdP ZdQezd#eeez         ezezf         fdRZ	 	 dZdQezdMee%         dNeez         dSed#eetezf         f
dTZej                            dU           e'dVdW          gZdefdXZdS )[a1  Client side support for the Git protocol.

The Dulwich client supports the following capabilities:

 * thin-pack
 * multi_ack_detailed
 * multi_ack
 * side-band-64k
 * ofs-delta
 * quiet
 * report-status
 * delete-refs
 * shallow

Known capabilities that are not supported:

 * no-progress
 * include-tag
    N)closing)BufferedReaderBytesIO)IOTYPE_CHECKINGAnyCallableDictIterableIteratorListOptionalSetTupleUnion)quote)unquote)urljoinurlparse
urlunparse
urlunsplit   )Configapply_instead_ofget_xdg_config_home_path)GitProtocolErrorNotGitRepositorySendPackError)PACK_SPOOL_FILE_MAX_SIZEPackChunkGeneratorUnpackedObjectwrite_pack_from_container)$	_RBUFSIZECAPABILITIES_REFCAPABILITY_AGENTCAPABILITY_DELETE_REFSCAPABILITY_INCLUDE_TAGCAPABILITY_MULTI_ACKCAPABILITY_MULTI_ACK_DETAILEDCAPABILITY_OFS_DELTACAPABILITY_QUIETCAPABILITY_REPORT_STATUSCAPABILITY_SHALLOWCAPABILITY_SIDE_BAND_64KCAPABILITY_SYMREFCAPABILITY_THIN_PACKCOMMAND_DEEPENCOMMAND_DONECOMMAND_HAVECOMMAND_SHALLOWCOMMAND_UNSHALLOWCOMMAND_WANTKNOWN_RECEIVE_CAPABILITIESKNOWN_UPLOAD_CAPABILITIESSIDE_BAND_CHANNEL_DATASIDE_BAND_CHANNEL_FATALSIDE_BAND_CHANNEL_PROGRESSTCP_GIT_PORTZERO_SHAHangupExceptionPktLineParserProtocolagent_stringcapability_agentextract_capabilitiesextract_capability_namesparse_capabilitypkt_line)PEELED_TAG_SUFFIX_import_remote_refsread_info_refs)Repoc                       e Zd ZdZd ZdS )InvalidWantszInvalid wants.c                 B    t                               | d|z             d S )Nz/requested wants not in server provided refs: %r)	Exception__init__)selfwantss     R/home/feoh/.local/pipx/venvs/poetry/lib/python3.11/site-packages/dulwich/client.pyrO   zInvalidWants.__init__\   s/    CeK	
 	
 	
 	
 	
    N__name__
__module____qualname____doc__rO    rS   rR   rL   rL   Y   s)        
 
 
 
 
rS   rL   c                       e Zd ZdZd ZdS )HTTPUnauthorizedz!Raised when authentication fails.c                 X    t                               | d           || _        || _        d S )NzNo valid credentials provided)rN   rO   www_authenticateurl)rP   r]   r^   s      rR   rO   zHTTPUnauthorized.__init__e   s,    4!@AAA 0rS   NrT   rY   rS   rR   r[   r[   b   s)        ++    rS   r[   c                       e Zd ZdZd ZdS )HTTPProxyUnauthorizedz'Raised when proxy authentication fails.c                 X    t                               | d           || _        || _        d S )Nz#No valid proxy credentials provided)rN   rO   proxy_authenticater^   )rP   rb   r^   s      rR   rO   zHTTPProxyUnauthorized.__init__n   s,    4!FGGG"4rS   NrT   rY   rS   rR   r`   r`   k   s)        11    rS   r`   c                 `    t          t          j        | gg g d          d                   dk    S )z'Check if a file descriptor is readable.r   )lenselect)filenos    rR   _fileno_can_readrg   t   s,    v}fXr2q11!45599rS   c           
         ddl m}m}m} |                                }|                                }|j                            | ddd ||           ||                    }|s!t          |                                          |j	        S )zCWrapper around PeekNamedPipe to check how many bytes are available.r   )byrefwindllwintypesN)
ctypesri   rj   rk   DWORDkernel32PeekNamedPipeOSErrorGetLastErrorvalue)handleri   rj   rk   c_avail	c_messagesuccesss          rR   _win32_peek_availrw   y   s    ..........nnG  Io++auuW~~uuY/?/? G  /h++--...=rS   c                   $    e Zd ZdZd Zd Zd ZdS )ReportStatusParserzEHandle status as reported by servers with 'report-status' capability.c                 0    d| _         d | _        g | _        d S NF)_done_pack_status_ref_statusesrP   s    rR   rO   zReportStatusParser.__init__   s    
 rS   c              #   \  K   | j         dvrt          | j                   | j        D ]}	 |                    dd          \  }}n# t          $ r Y )w xY w|dk    r3|                    dd          \  }}||                    d          fV  f|dk    r|dfV  st          d|z            dS )	zCheck if there were any errors and, if so, raise exceptions.

        Raises:
          SendPackError: Raised when the server could not unpack
        Returns:
          iterator over refs
        )s	   unpack okN    r   s   ngutf-8s   okNzinvalid ref status %r)r}   r   r~   split
ValueErrordecoder   )rP   statusrestreferrors        rR   checkzReportStatusParser.check   s       $888 1222( 	I 	IF%||D!44    !ZZa00
U5<<00000005Dj    &'>'GHHH	I 	Is   A
AAc                     | j         rt          d          |	d| _         dS | j        |                                | _        dS |                                }| j                            |           dS )zHandle a packet.

        Raises:
          GitProtocolError: Raised when packets are received after a flush
          packet.
        z&received more data after status reportNT)r|   r   r}   stripr~   append)rP   pkt
ref_statuss      rR   handle_packetz ReportStatusParser.handle_packet   sx     : 	M"#KLLL;DJF$ #		DJ%%j11111rS   N)rU   rV   rW   rX   rO   r   r   rY   rS   rR   ry   ry      sJ        OO     
I I I02 2 2 2 2rS   ry   c                    d }i }| D ]p}|                     d                              d d          \  }}|dk    r#t          |                    dd                    |t	          |          \  }}|||<   qt          |          dk    ri t                      fS |t          t          ik    ri }|t          |          fS )N   
r   s   ERRr   replacer   )	rstripr   r   r   rC   rd   setr$   r=   )pkt_seqserver_capabilitiesrefsr   shar   s         rR   read_pkt_refsr      s    D  ZZ&&,,T155
c&=="3::gy#A#ABBB&)=c)B)B&S%S		
4yyA~~355y (+++())))rS   c                   \     e Zd ZdZg dZddZd Zd Zd Zd Z	d	 Z
d
 Z fdZd Z xZS )FetchPackResultzResult of a fetch-pack operation.

    Attributes:
      refs: Dictionary with all remote refs
      symrefs: Dictionary with remote symrefs
      agent: User agent string
    clearcopyfromkeysgetitemskeyspoppopitem
setdefaultupdatevalues	viewitemsviewkeys
viewvaluesNc                 L    || _         || _        || _        || _        || _        d S N)r   symrefsagentnew_shallownew_unshallow)rP   r   r   r   r   r   s         rR   rO   zFetchPackResult.__init__   s-    	
&*rS   c                 H    dd l }|                    dt          d           d S )Nr   z!Use FetchPackResult.refs instead.   
stacklevelwarningswarnDeprecationWarningrP   r   s     rR   _warn_deprecatedz FetchPackResult._warn_deprecated   s9    / 	 	
 	
 	
 	
 	
rS   c                     t          |t                    r|                                  | j        |k    S | j        |j        k    o| j        |j        k    o| j        |j        k    S r   )
isinstancedictr   r   r   r   rP   others     rR   __eq__zFetchPackResult.__eq__  sf    eT"" 	&!!###9%%I# *-*
ek)	
rS   c                 <    |                                   || j        v S r   r   r   rP   names     rR   __contains__zFetchPackResult.__contains__  !    ty  rS   c                 D    |                                   | j        |         S r   r   r   s     rR   __getitem__zFetchPackResult.__getitem__       yrS   c                 R    |                                   t          | j                  S r   r   rd   r   r   s    rR   __len__zFetchPackResult.__len__  "    49~~rS   c                 R    |                                   t          | j                  S r   r   iterr   r   s    rR   __iter__zFetchPackResult.__iter__  "    DIrS   c                     |t          |           j        v r)|                                  t          | j        |          S t                                          |          S r   type_FORWARDED_ATTRSr   getattrr   super__getattribute__rP   r   	__class__s     rR   r   z FetchPackResult.__getattribute__  S    4::...!!###49d+++ww''---rS   c                 d    d                     | j        j        | j        | j        | j                  S )Nz{}({!r}, {!r}, {!r}))formatr   rU   r   r   r   r   s    rR   __repr__zFetchPackResult.__repr__$  s1    %,,N#ILJ	
 
 	
rS   NNrU   rV   rW   rX   r   rO   r   r   r   r   r   r   r   r   __classcell__r   s   @rR   r   r      s           "+ + + +
 
 

 
 
! ! !      . . . . .
 
 
 
 
 
 
rS   r   c                   \     e Zd ZdZg dZddZd Zd Zd Zd Z	d	 Z
d
 Z fdZd Z xZS )SendPackResulta  Result of a upload-pack operation.

    Attributes:
      refs: Dictionary with all remote refs
      agent: User agent string
      ref_status: Optional dictionary mapping ref name to error message (if it
        failed to update), or None if it was updated successfully
    r   Nc                 0    || _         || _        || _        d S r   )r   r   r   )rP   r   r   r   s       rR   rO   zSendPackResult.__init__H  s    	
$rS   c                 H    dd l }|                    dt          d           d S )Nr   z Use SendPackResult.refs instead.r   r   r   r   s     rR   r   zSendPackResult._warn_deprecatedM  s9    . 	 	
 	
 	
 	
 	
rS   c                     t          |t                    r|                                  | j        |k    S | j        |j        k    o| j        |j        k    S r   )r   r   r   r   r   r   s     rR   r   zSendPackResult.__eq__V  sP    eT"" 	&!!###9%%yEJ&D4:+DDrS   c                 <    |                                   || j        v S r   r   r   s     rR   r   zSendPackResult.__contains__\  r   rS   c                 D    |                                   | j        |         S r   r   r   s     rR   r   zSendPackResult.__getitem__`  r   rS   c                 R    |                                   t          | j                  S r   r   r   s    rR   r   zSendPackResult.__len__d  r   rS   c                 R    |                                   t          | j                  S r   r   r   s    rR   r   zSendPackResult.__iter__h  r   rS   c                     |t          |           j        v r)|                                  t          | j        |          S t                                          |          S r   r   r   s     rR   r   zSendPackResult.__getattribute__l  r   rS   c                 X    d                     | j        j        | j        | j                  S )Nz{}({!r}, {!r}))r   r   rU   r   r   r   s    rR   r   zSendPackResult.__repr__r  s#    &&t~'>	4:VVVrS   r   r   r   s   @rR   r   r   -  s           "% % % %

 
 
E E E! ! !      . . . . .W W W W W W WrS   r   c                 l   t                      }t                      }| D ]}|                    dd          \  }}|t          k    r(|                    |                                           N|t
          k    r(|                    |                                           t          d|z            ||fS )Nr   r   zunknown command %s)r   r   r4   addr   r5   r   )r   r   r   r   cmdr   s         rR   _read_shallow_updatesr   v  s    %%KEEM ? ?99T1%%S/!!OOCIIKK((((%%%ciikk****"#7##=>>>''rS   c                        e Zd Zd Zd Zd ZdS )_v1ReceivePackHeaderc                 h    g | _         g | _        |                     |||          | _        d| _        d S r{   )wanthave_handle_receive_pack_head_itsent_capabilities)rP   capabilitiesold_refsnew_refss       rR   rO   z_v1ReceivePackHeader.__init__  s7    		11,(SS!&rS   c                     | j         S r   )r   r   s    rR   r   z_v1ReceivePackHeader.__iter__  s	    xrS   c              #   L  K   d |                                 D             | _        |D ]v}t          |t                    st	          d|z            |                    |t                    }t          |t                    s#t	          d                    ||                    |                    |t                    }t          |t                    s#t	          d                    ||                    ||k    rrt          	                    d|||           | j
        r|dz   |z   dz   |z   V  n=|dz   |z   dz   |z   dz   d                    t          |                    z   V  d| _
        || j        vr%|t          k    r| j                            |           xd	V  d	S )
a  Handle the head of a 'git-receive-pack' request.

        Args:
          capabilities: List of negotiated capabilities
          old_refs: Old refs, as received from the server
          new_refs: Refs to change

        Returns:
          (have, want) tuple
        c                 (    g | ]}|t           k    |S rY   r=   .0xs     rR   
<listcomp>zB_v1ReceivePackHeader._handle_receive_pack_head.<locals>.<listcomp>  s    GGG1hQrS   zrefname is not a bytestring: %rz+old sha1 for {!r} is not a bytestring: {!r}z*old sha1 for {!r} is not a bytestring {!r}z Sending updated ref %r: %r -> %rr       TN)r   r   r   bytes	TypeErrorr   r=   r   loggerdebugr   joinsortedr   r   )rP   r   r   r   refnameold_sha1new_sha1s          rR   r   z._v1ReceivePackHeader._handle_receive_pack_head  s      HG 1 1GGG	  	+  	+Ggu-- M AG KLLL||GX66Hh.. AHHRZ[[    ||GX66Hh.. @GGQYZZ   8##6Xx1 1 1 ) 2"T/H4t;gEEEEE !"#  "	"
    ))F<$8$899:   .2D*ty((X-A-A	  ***




rS   N)rU   rV   rW   rO   r   r   rY   rS   rR   r   r     sA        ' ' '  . . . . .rS   r   r   returnc              #   ^   K   | D ]'}t          |dd                   }||dd         fV  (dS )zRead per-channel data.

    This requires the side-band-64k capability.

    Args:
      pkt_seq: Sequence of packets to read
    Nr   )ord)r   r   channels      rR   _read_side_band64k_datar    sP         c"1"g,,s122w rS   c                 x   t          |t                    rt          |d         t                    sJ |                     t          dz   |d         z   dz   d                    t          |                    z   dz              |dd         D ]%}|                     t          dz   |z   dz              &|dvst          |dd          rt          |vrt          d          |j
        D ]%}|                     t          dz   |z   dz              &|C|                     t          dz   t          |                              d	          z   dz              |                     d           |%t          |                                           \  }}	n*dx}}	n%t#                      x}}	|                     d           t%          |          }
|
r|                     t&          dz   |
z   dz              | |            r|                                 }|                    d                              d          }|d         d
k    rK|                    |d                    |d         dv rn%|d         dk    rn)t1          d|d         z            t%          |          }
|
|                     t2          dz              ||	fS )a  Handle the head of a 'git-upload-pack' request.

    Args:
      proto: Protocol object to read from
      capabilities: List of negotiated capabilities
      graph_walker: GraphWalker instance to call .ack() on
      wants: List of commits to fetch
      can_read: function that returns a boolean that indicates
    whether there is extra graph data to read on proto
      depth: Depth for request

    Returns:

    r   r   r   r   N)r   Nshallowz=server does not support shallow capability required for depthascii   ACK   )   continue   common   readyz(%s not in ('continue', 'ready', 'common))r   listr  write_pkt_liner6   r  r  r   r-   r   r  r4   r1   strencoder   read_pkt_seqr   nextr3   read_pkt_liner   r   ackAssertionErrorr2   )protor   graph_walkerrQ   can_readdepthr   r   r   r   r   r   partss                rR   _handle_upload_pack_headr,    s   " eT""Bz%(E'B'BBBB	
	
(	 	 ))F<((
)
)		*
 	   abb	 A A\D047%?@@@@Iy$!G!G\11"R    ' 	G 	GC  4!7#!=!EFFFF  %E

(9(9'(B(BBUJ   	T"""+@ASASAUAU+V+V([--*..K--&)ee+mT"""D
 "\D047%?@@@HHJJ%%''CJJu%%++D11EQx6!!  q***87771X))(BU1XM   L!!  "  
-...''rS   r   	pack_datac                    |                                  }|r|                    d                              d          }|d         dk    r|                    |d                    |d         dk    r|                                 t          |          dk     s
|d         d	vrn|                                  }|t          |v rm|d }t          |                                           D ]D\  }}	|t          k    r ||	           |t          k    r ||	           3t          d|z            d
S 	 |                     |          }	|	dk    rd
S  ||	           ))an  Handle the tail of a 'git-upload-pack' request.

    Args:
      proto: Protocol object to read from
      capabilities: List of negotiated capabilities
      graph_walker: GraphWalker instance to call .ack() on
      pack_data: Function to call with pack data
      progress: Optional progress reporting function
      rbufsize: Read buffer size

    Returns:

    r   r   r   r  r   s   NAKr   r  )r  r  r  Nc                     d S r   rY   r  s    rR   progressz*_handle_upload_pack_tail.<locals>.progress8      rS   Invalid sideband channel %dTrS   )r$  r   r   r%  nakrd   r.   r  r"  r9   r;   r&  read)
r'  r   r(  r-  r1  rbufsizer   r+  chandatas
             rR   _handle_upload_pack_tailr9    s   * 



C
 $

5!!''--8vU1X&&&8vu::>>U1X .
 
 

 !!##  $  <//   2%2D2D2F2FGG 	: 	:JD$---	$333$1D8: : :	: 	:	::h''Ds{{IdOOO		rS   c                      e Zd ZdZ	 	 	 	 ddZd Zed             Zddee	e
         e	e
         egeeee         f         f         fd	Z	 	 d defdZ	 	 	 d!dededeeee
e
f         ee         gee
         f                  deee
gdf                  dee         defdZddddZd Zed             Zd Z	 ddede	e
         deee
gdf                  deee
ee         f                  fdZd Z 	 	 	 	 	 d"dZ!dS )#	GitClientzGit smart server client.TNFc                    || _         d| _        t          t                    | _        | j                            t                                 t          t                    | _        | j                            t                                 |r| j                            t                     |s| j        
                    t                     |r!| j                            t                     dS dS )a6  Create a new GitClient instance.

        Args:
          thin_packs: Whether or not thin packs should be retrieved
          report_activity: Optional callback for reporting transport
            activity.
          include_tags: send annotated tags when sending the objects they point
            to
        N)_report_activity_report_status_parserr   UPLOAD_CAPABILITIES_fetch_capabilitiesr   rB   RECEIVE_CAPABILITIES_send_capabilitiesr+   remover0   r'   )rP   
thin_packsreport_activityquietinclude_tagss        rR   rO   zGitClient.__init__Q  s      !0%)"#&':#;#;  $$%5%7%7888"%&:";";##$4$6$6777 	:#''(8999 	B$++,@AAA 	A$(()?@@@@@	A 	ArS   c                 *    t          | j                  )zRetrieves full url to given path.

        Args:
          path: Repository path (as string)

        Returns:
          Url to path (as string)

        )NotImplementedErrorget_urlrP   paths     rR   rJ  zGitClient.get_urln  s     "$,///rS   c                 *    t          | j                  )zCreate an instance of this client from a urlparse.parsed object.

        Args:
          parsedurl: Result of urlparse()

        Returns:
          A `GitClient` object
        )rI  from_parsedurlcls	parsedurlkwargss      rR   rN  zGitClient.from_parsedurlz  s     "#"4555rS   generate_pack_datac                 *    t          | j                  )ap  Upload a pack to a remote repository.

        Args:
          path: Repository path (as bytestring)
          update_refs: Function to determine changes to remote refs. Receive
            dict with existing remote refs, returns dict with
            changed refs (name -> sha, where sha=ZERO_SHA for deletions)
          generate_pack_data: Function that can return a tuple
            with number of objects and list of pack data to include
          progress: Optional progress function

        Returns:
          SendPackResult object

        Raises:
          SendPackError: if server rejects the pack data

        )rI  	send_pack)rP   rL  update_refsrS  r1  s        rR   rU  zGitClient.send_pack  s    & "$.111rS   originmkdirc
                 2   ddl m}
m}m} |rt	          j        |           	 d}|st          j        |          }|d}n%|rt          d          t          j	        |          }t          | t          t          f          r|                    d          }n(|                     |                              d          }|J |                                }|                    d|                    d          fd|           |                    d|                    d          fd	d
|                    d          z   dz              |                                 d|z   }|                     ||||	          }t'          |j         ||j         |           |j                            d          }|j                             d          }|r|s||j         d<   |}nc ||j         |                    d          |            |
|j         |                    d          |||          }|r ||j         ||          }nd}|r||                                 n@# t.          $ r3 ||                                 |rddl}|                    |            w xY w|S )zClone a repository.r   )_set_default_branch	_set_head_set_origin_headNTz"checkout and bare are incompatibler   s   remotes   urls   fetchs   +refs/heads/*:refs/remotes/s   /*s   clone: from r1  r*  )messages   HEADr   )r   rZ  r[  r\  osrX  rJ   initr   	init_barer   LocalGitClientSubprocessGitClientr!  rJ  
get_configr   write_to_pathfetchrH   r   r   reset_indexBaseExceptioncloseshutilrmtree)rP   rL  target_pathrX  barerW  checkoutbranchr1  r*  rZ  r[  r\  targetencoded_pathtarget_configref_messageresultorigin_head
origin_shaheadhead_refrj  s                          rR   clonezGitClient.clone  s    	KJJJJJJJJJ 	"H[!!!:	F 5;//##H K$%IJJJ44 $1D EFF B#{{733#||D1188AA%%%"--//My&--*@*@A6<XXXFMM'223.w1G1GG%O  
 ''))))L8KZZfxuZMMFVV[+G G G G !.,,W55K11J  +  '1G$!  fmmG.D.DkRRR..Kw!7!7fk 
   $9V[(KHHDDD %D,""$$$ 	 	 	! +k***	 s   H4I =JrL  rp  determine_wantsr1  r*  r  c           	        
 |j         j        }t          | j        v r:ddlm}  |t          dt          j         dd                    

fd}
fd}nj                                         \  
}}	 | 	                    ||
                                
j        |	          }	 |             n# t          $ r  |              w xY w                    |	j        |	j                   |	S )
a  Fetch into a target repository.

        Args:
          path: Path to fetch from (as bytestring)
          target: Target repository to fetch into
          determine_wants: Optional function to determine what refs to fetch.
            Receives dictionary of name->sha, should return
            list of shas to fetch. Defaults to all shas.
          progress: Optional progress function
          depth: Depth to fetch at

        Returns:
          Dictionary with all remote refs (not just those fetched)

        Nr   )SpooledTemporaryFilez	incoming-rL  )max_sizeprefixdirc                                                        r7                     d           j                             j        d                                              d S )Nr   r1  )tellseekobject_storeadd_thin_packr5  ri  )fr1  rp  s   rR   commitzGitClient.fetch.<locals>.commit  sT    6688 WFF1III'55afdX5VVV					rS   c                  0                                       d S r   ri  )r  s   rR   abortzGitClient.fetch.<locals>.abort  s    					rS   r]  )r  determine_wants_allr0   r@  tempfiler|  r   r   add_pack
fetch_packget_graph_walkerwriterh  update_shallowr   r   )rP   rL  rp  rz  r1  r*  r|  r  r  rt  r  s     ` `     @rR   rf  zGitClient.fetch  sa   2 "$1EO4#;;;555555//1+F/>>@ @ @A             &2;;==Avu	__''))! %  F FHHHH	  	 	 	EGGG	
 	f0&2FGGGs   82B5 5Cr]  c                *    t          | j                  )  Retrieve a pack from a git smart server.

        Args:
          path: Remote path to fetch from
          determine_wants: Function determine what refs
            to fetch. Receives dictionary of name->sha, should return
            list of shas to fetch.
          graph_walker: Object with next() and ack().
          pack_data: Callback called for each bit of data in the pack
          progress: Callback for progress reports (strings)
          depth: Shallow fetch depth

        Returns:
          FetchPackResult object

        )rI  r  )rP   rL  rz  r(  r-  r1  r*  s          rR   r  zGitClient.fetch_pack  s    4 "$/222rS   c                 *    t          | j                  )zRetrieve the current refs from a git smart server.

        Args:
          path: Path to the repo to fetch from. (as bytestring)

        Returns:

        )rI  get_refsrK  s     rR   r  zGitClient.get_refs9  s     "$-000rS   c                 X    t          d |                                 D                       S )Nc              3   ,   K   | ]}|t           k    V  d S r   r  )r  r   s     rR   	<genexpr>z.GitClient._should_send_pack.<locals>.<genexpr>G  s&      @@s3(?@@@@@@rS   )anyr   )r   s    rR   _should_send_packzGitClient._should_send_packD  s+     @@hoo.?.?@@@@@@rS   c                     | j         |z  }d }|D ]!}t          |          \  }}|t          k    r|}"t          |          t          z
  }||fS r   )rB  rE   r%   rD   r7   )rP   r   negotiated_capabilitiesr   
capabilitykvunknown_capabilitiess           rR   $_negotiate_receive_pack_capabilitiesz.GitClient._negotiate_receive_pack_capabilitiesI  sl    "&"9<O"O- 	 	J#J//DAq$$$$%899<VV 	 '--rS   r'  r   c                 (   t           |v r|d }t          |v rt          | j        j                  }t          |                                          D ]W\  }}|t          k    rt          |v r|                    |           /|t          k    r ||           Ft          d|z            n:t          |v r1|                                D ]}| j                            |           | j        &t          | j                                                  S dS )a  Handle the tail of a 'git-receive-pack' request.

        Args:
          proto: Protocol object to read from
          capabilities: List of negotiated capabilities
          progress: Optional progress reporting function

        Returns:
          dict mapping ref name to:
            error message if the ref failed to update
            None if it was updated successfully
        Nc                     d S r   rY   r0  s    rR   r1  z5GitClient._handle_receive_pack_tail.<locals>.progressk  s    DrS   r3  )r.   r,   r?   r>  r   r  r"  r9   parser;   r&  r   r   )rP   r'  r   r1  pktline_parserr7  r8  r   s           rR   _handle_receive_pack_tailz#GitClient._handle_receive_pack_tailV  s@   $ $|33   (<77!.t/I/W!X!X5e6H6H6J6JKK > >
d111/<??&,,T222777HTNNNN(5<> > >> (<77 --// B BC.<<SAAAA%1288::;;;trS   c                     t          |          t          z
  }i }d }|D ]J}t          |          \  }}|t          k    r|                    dd          \  }}	|	||<   |t
          k    r|}K| j        |z  }
|
||fS )N   :r   )rD   r8   rE   r/   r   r%   r@  )rP   r   r  r   r   r  r  r  srcdstr  s              rR   #_negotiate_upload_pack_capabilitiesz-GitClient._negotiate_upload_pack_capabilities  s    $%899<UU 	 - 	 	J#J//DAq%%%WWT1--
c"$$$"&":=P"P'%88rS   c	                 *    t          | j                  )z3Retrieve an archive of the specified tree.
        )rI  archive)	rP   rL  
committish
write_datar1  write_errorr   subdirsr~  s	            rR   r  zGitClient.archive  s     "$,///rS   )TNFFr   )TFrW  NNNNNNNNNNNN)"rU   rV   rW   rX   rO   rJ  classmethodrN  r	   r   r  boolr   intr   r!   rU  ry  r   rJ   r   r
   r   r   rf  r  r  staticmethodr  r  r@   r  r  r  rY   rS   rR   r;  r;  N  s       "" A A A A:
0 
0 
0 	6 	6 [	62 2xUUXY^U_aeHfhmnqs{  }K  tL  oL  iM  IM  @N 2 2 2 2* OW?CC Cd C C C CV 6:#; ;; ; "d5%<((3-8$u+EF
	; 8UGTM23; }; 
; ; ; ;H 3 3 3 3 38	1 	1 	1 A A \A. . ." 7;	* ** %j* 8UGTM23	*
 
$uhsm+,	-* * * *X9 9 9. 0 0 0 0 0 0rS   r;  c                     t          |           d |                                D             z
  }|rt          |          dS )zCheck that a set of wants is valid.

    Args:
      wants: Set of object SHAs to fetch
      refs: Refs dictionary to check against

    Returns:

    c                 L    h | ]!\  }}|                     t                    |"S rY   )endswithrG   )r  r  r  s      rR   	<setcomp>zcheck_wants.<locals>.<setcomp>  s>       q!AJJ7H,I,I	  rS   N)r   r   rL   )rQ   r   missings      rR   check_wantsr    sZ     %jj  

   G  $7###$ $rS   c                 $   | t                      S d |                                 D             }|D ]Q}|                    d          r:t          |t	          d          d                              dd                    c S Rt          |          S )Nc                 8    g | ]}|                     d           S )r   )r   )r  lines     rR   r  z-_remote_error_from_stderr.<locals>.<listcomp>  s$    ???DT[[???rS   s   ERROR: r   r   )r>   	readlines
startswithr   rd   r   )stderrlinesr  s      rR   _remote_error_from_stderrr    s    ~   ??F,<,<,>,>???E X X??:&& 	X#DZ):):$;$B$B7I$V$VWWWWW	X5!!!rS   c                   \     e Zd ZdZdZef fd	Zd Zd
dZ	 	 ddZd Z		 	 	 	 	 dd	Z
 xZS )TraditionalGitClientzTraditional Git client.r   c                 H    || _          t                      j        di | d S NrY   )_remote_path_encodingr   rO   )rP   path_encodingrR  r   s      rR   rO   zTraditionalGitClient.__init__  s.    %2"""6"""""rS   c                 "   K   t                      )a  Create a connection to the server.

        This method is abstract - concrete implementations should
        implement their own variant which connects to the server and
        returns an initialized Protocol object with the service ready
        for use and a can_read function which may be used to see if
        reads would block.

        Args:
          cmd: The git service name to which we should connect.
          path: The path we should pass to the service. (as bytestirng)
        )rI  )rP   r   rL  s      rR   _connectzTraditionalGitClient._connect  s       "###rS   Nc                    |                      d|          \  }}}|5  	 t          |                                          \  }}	n"# t          $ r}
t	          |          |
d}
~
ww xY w|                     |	          \  }}t          |v rt                      | _        | j        }	  |t          |                    x}}n$# t          $ r |                    d            w xY wt          |                                                              t          |                                                    r3|                    d           t          ||i           cddd           S t           |	vrgt          |          }|                                D ]C\  }}|t"          k    r3t          |v r'|j                            d|z   dz              d|_        ||= D|3|                    d           t          ||i           cddd           S t+          |          dk    r[|rY|                    d           |"t          |                                          }nd}t          |||          cddd           S t/          |||          }|D ]}|                    |            ||j        |j        t4          |v |          \  }}|                     |          r*t9          |||	          D ]}|                    |           |                     |||          }t          |||          cddd           S # 1 swxY w Y   dS )
au  Upload a pack to a remote repository.

        Args:
          path: Repository path (as bytestring)
          update_refs: Function to determine changes to remote refs.
            Receive dict with existing remote refs, returns dict with
            changed refs (name -> sha, where sha=ZERO_SHA for deletions)
          generate_pack_data: Function that can return a tuple with
            number of objects and pack data to upload.
          progress: Optional callback called with progress updates

        Returns:
          SendPackResult

        Raises:
          SendPackError: if server rejects the pack data

        s   receive-packNr   r   s   ng s&    remote does not support deleting refsFr   )	ofs_deltar1  r  )r  r   r"  r>   r  r  r,   ry   r>  r   rh  r  r   r   issubsetr   r&   r=   r~   r   _ref_status_okrd   r   r   r   r   r*   r  r    r  r  )rP   rL  rV  rS  r1  r'  unused_can_readr  r   r   excr  r   report_status_parserr   orig_new_refsr   r   r   header_handlerr   pack_data_countr-  chunks                           rR   rU  zTraditionalGitClient.send_pack  s   & *.)M)M& C	P C	PA0=e>P>P>R>R0S0S---" A A A/77S@A
 99:MNN''+BBB-?-A-A*#'#= +6;tH~~+F+FF==    $$T*** 8>>##$$--c(..2B2B.C.CDD L$$T***%heKKK+C	P C	P C	P C	P C	P C	P C	P C	P. &-@@@.. - 3 3 5 5 * *HCh37NNN0>EE &/X X   CH0?$SM$$T***%heKKKKC	P C	P C	P C	P C	P C	P C	P C	PN 8}}!!m!$$T***'3!%&:&@&@&B&B!C!CJJ!%J%he
SSS]C	P C	P C	P C	P C	P C	P C	P C	P` 22I8U]^^N% * *$$S))))););##/3JJ!	* * *&OY %%h// '/U]^^^ ' 'EKK&&&&77. J "(%JOOOGC	P C	P C	P C	P C	P C	P C	P C	P C	P C	P C	P C	P C	P C	P C	P C	P C	P C	Psb   L<$AL<
A#AA##>L<"B=<L<=!CA<L<'BL<A!L<:B5L<<M M c           	         |                      d|          \  }}}	|5  	 t          |                                          \  }
}n"# t          $ r}t	          |	          |d}~ww xY w|                     |          \  }}}|
2|                    d           t          |
||          cddd           S 	 | ||
|          }n ||
          }n$# t          $ r |                    d            w xY w|d |D             }|s2|                    d           t          |
||          cddd           S t          ||||||          \  }}t          |||||           t          |
||||          cddd           S # 1 swxY w Y   dS )r     upload-packNr*  c                 (    g | ]}|t           k    |S rY   r  r  cids     rR   r  z3TraditionalGitClient.fetch_pack.<locals>.<listcomp>b  s    AAArS   )r  r   r"  r>   r  r  r  r   rh  r,  r9  )rP   rL  rz  r(  r-  r1  r*  r'  r)  r  r   r   r  r  r   r   rQ   r   r   s                      rR   r  zTraditionalGitClient.fetch_pack0  s   2 #'--"E"Ex +	U +	UA,9%:L:L:N:N,O,O)))" A A A/77S@A 889LMM	' |$$T***&tWe<<+	U +	U +	U +	U +	U +	U +	U +	U$+OD>>>EE+OD11E    $$T***  AAAAA =$$T***&tWe<<7+	U +	U +	U +	U +	U +	U +	U +	U8 ,D', , ,([- %'   #4%mTTW+	U +	U +	U +	U +	U +	U +	U +	U +	U +	U +	U +	U +	U +	U +	U +	U +	U +	UsS   F $AF 
A#AA##AF 4CF !C118F 6=F  FFc                 ,   |                      d|          \  }}}|5  	 t          |                                          \  }}n"# t          $ r}t	          |          |d}~ww xY w|                    d           |cddd           S # 1 swxY w Y   dS )2Retrieve the current refs from a git smart server.r  N)r  r   r"  r>   r  r  )rP   rL  r'  _r  r   r  s          rR   r  zTraditionalGitClient.get_refsw  s      ==>>q& 	 	A'(:(:(<(<==aa" A A A/77S@A  &&&	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s4   B	$AB	
A#AA##B		BBc	                 >   |                      d|          \  }	}
}|	5  ||	                    d|z              |	                    d|z              ||D ]}|	                    d|z              ||	                    d|z              |	                    d            	 |	                                }n"# t          $ r}t	          |          |d }~ww xY w|dk    s|dk    r	 d d d            d S |dk    s|dk    rne|                    d	          r>t          |d
d                              d                              dd                    t          d|z            |	                                }|t          d          t          |	                                          D ][\  }}|t          k    r ||           |t          k    r ||           3|t          k    r ||           Jt          d|z            	 d d d            d S # 1 swxY w Y   d S )Ns   upload-archives   argument --format=s	   argument s   argument --prefix=s   NACK
s   NACKs   ACK
r  s   ERR    r   r   r   zinvalid response %rzexpected pkt tailr3  )r  r  r$  r>   r  r  r   r   r   r&  r  r"  r9   r;   r:   )rP   rL  r  r  r1  r  r   r  r~  r'  r)  r  subdirr   r  retr7  r8  s                     rR   r  zTraditionalGitClient.archive  s    #'--0A4"H"Hx !	O !	O!$$%:V%CDDD  
!:;;;"% @ @F(()>????!$$%:V%CDDD  &&&A))++" A A A/77S@Ai3'>>!	O !	O !	O !	O !	O !	O !	O !	O  C6MM(( B&s122w~~e'<'<'C'CGY'W'WXXX$%:S%@AAA%%''C$%89995e6H6H6J6JKK O O
d111Jt$$$$777HTNNNN444K%%%%()F)MNNNO3!	O !	O !	O !	O !	O !	O !	O !	O !	O !	O !	O !	O !	O !	O !	O !	O !	O !	Os=   BHB43H4
C>CCH0DHHHr   r   r  )rU   rV   rW   rX   DEFAULT_ENCODINGrO   r  rU  r  r  r  r   r   s   @rR   r  r    s        !!%5 # # # # # #$ $ $WP WP WP WP~ EU EU EU EUN
 
 
" -O -O -O -O -O -O -O -OrS   r  c                   F     e Zd ZdZd fd	Zed             Zd Zd Z xZ	S )TCPGitClientz8A Git Client that works over TCP directly (i.e. git://).Nc                 h    |t           }|| _        || _         t                      j        di | d S r  )r<   _host_portr   rO   )rP   hostportrR  r   s       rR   rO   zTCPGitClient.__init__  s>    <D

""6"""""rS   c                 ,     | |j         fd|j        i|S )Nr  )hostnamer  rO  s      rR   rN  zTCPGitClient.from_parsedurl  s$    s9%EEINEfEEErS   c                     | j         }| j        | j        t          k    r|d| j        z  z  }t          d||ddf          S )N:%dgit )r  r  r<   r   rP   rL  netlocs      rR   rJ  zTCPGitClient.get_url  sG    :!djL&@&@edj((F5&$B7888rS   c                    t          |t                    st          |          t          |t                    s|                    | j                  }t          j        | j        | j        t
          j	        t
          j
                  }d t          j        d| j        z            }|D ]\  }}}}}	t          j        |||                              t
          j        t
          j        d           	                     |	            n1# t           $ r$}
|
}                                 d Y d }
~
d }
~
ww xY w|                    dd                              dd          fd}t'          j        j        || j                  }|                    d	          r
|dd          }|                    d
|z   |d| j                            d          z              |fdd fS )Nzno address found for %sr   rbwbr   c                                                                                                                             d S r   r  )rfileswfiles   rR   ri  z$TCPGitClient._connect.<locals>.close  s.    KKMMMKKMMMGGIIIIIrS   rE  s   /~   git-s   host=r  c                  "    t                     S r   )rg   )r  s   rR   <lambda>z'TCPGitClient._connect.<locals>.<lambda>  s    .q11 rS   )r   r  r	  r!  r  socketgetaddrinfor  r  	AF_UNSPECSOCK_STREAMr   
setsockoptIPPROTO_TCPTCP_NODELAYconnectrp   ri  makefiler@   r5  r  r=  r  send_cmd)rP   r   rL  	sockaddrserrfamilysocktyper'  	canonnamesockaddreri  r  r  r  s               @@@rR   r  zTCPGitClient._connect  s   #u%% 	!C.. $&& 	;;;t9::D&J
F$4f6H
 
	 l4tzABB>G 
	 
	:VXuifh66ALL+V-?CCC		(###   =GGIII	
 9I

4$$

4##	 	 	 	 	 	 	
 JK 1	
 
 
 ??5!! 	8Dw}dHtz7H7H7Q7Q,QRRR1111477s   6D
D;D66D;r   )
rU   rV   rW   rX   rO   r  rN  rJ  r  r   r   s   @rR   r  r    s        BB# # # # # # F F [F9 9 9+8 +8 +8 +8 +8 +8 +8rS   r  c                   :    e Zd ZdZd Zed             Zd Zd ZdS )SubprocessWrapperz:A socket-like object that talks to a subprocess via pipes.c                 r    || _         t          |j                  j        | _        |j        j        | _        d S r   )procr   stdoutr5  stdinr  )rP   r  s     rR   rO   zSubprocessWrapper.__init__  s-    	"4;//4	Z%


rS   c                     | j         j        S r   )r  r  r   s    rR   r  zSubprocessWrapper.stderr  s    yrS   c                     t           j        dk    r@ddlm}  || j        j                                                  }t          |          dk    S t          | j        j                                                  S )Nwin32r   )get_osfhandle)	sysplatformmsvcrtr  r  r  rf   rw   rg   )rP   r  rs   s      rR   r)  zSubprocessWrapper.can_read  ss    <7"",,,,,,"]49#3#:#:#<#<==F$V,,11#DI$4$;$;$=$=>>>rS   c                    | j         j                                         | j         j                                         | j         j        r| j         j                                         | j                                          d S r   )r  r  ri  r  r  waitr   s    rR   ri  zSubprocessWrapper.close
  sk    		   9 	%I""$$$	rS   N)	rU   rV   rW   rX   rO   propertyr  r)  ri  rY   rS   rR   r  r    sb        DD& & &
     X ? ? ?    rS   r  c                      t           j        dk    r4	 ddl} |                     d          \  }}|gS # t          $ r g dcY S w xY wdgS )z3Find command to run for system Git (usually C Git).r  r   Nr  )r   z/cr  )r  r  win32apiFindExecutableImportError)r%  r   r  s      rR   find_git_commandr(    su    
|w	OOO #11%88KFC5L	  	( 	( 	(''''''	( ws   1 AAc                   2    e Zd ZdZed             ZdZd ZdS )rc  z5Git client that talks to a server using a subprocess.c                      | di |S r  rY   rO  s      rR   rN  z"SubprocessGitClient.from_parsedurl#      s}}V}}rS   Nc                    t          |t                    st          |          t          |t                    r|                    | j                  }| j        t                      }||                    d          |gz   }t          j        |dt          j	        t          j	        t          j	                  }t          |          }t          |j        |j        |j        | j                  |j        |j        fS )Nr  r   bufsizer  r  r  r  )r   r  r	  r   r  git_commandr(  
subprocessPopenPIPEr  r@   r5  r  ri  r=  r)  r  )rP   servicerL  r/  argvppws          rR   r  zSubprocessGitClient._connect)  s    '5)) 	%G$$$dE"" 	;;;t9::D#*,,KgnnW55t<</??
 
 
 q!! $ 5	   KH	
 		
rS   )rU   rV   rW   rX   r  rN  r/  r  rY   rS   rR   rc  rc     sI        ??  [ K
 
 
 
 
rS   rc  c                       e Zd ZdZ	 	 ddee         fdZd Zed             Z	ed             Z
dd	Zdd
Z	 	 ddefdZd ZdS )rb  z'Git Client that just uses a local Repo.TNconfigc                     || _         dS )zCreate a new LocalGitClient instance.

        Args:
          thin_packs: Whether or not thin packs should be retrieved
          report_activity: Optional callback for reporting transport
            activity.
        N)r=  )rP   rD  rE  r8  s       rR   rO   zLocalGitClient.__init__H  s     !0rS   c                 *    t          dd|ddf          S )Nfiler  )r   rK  s     rR   rJ  zLocalGitClient.get_urlT  s    62tR4555rS   c                      | di |S r  rY   rO  s      rR   rN  zLocalGitClient.from_parsedurlW  r+  rS   c                     t          |t                    st          j        |          }t	          t          |                    S r   )r   r   r_  fsdecoder   rJ   )rP  rL  s     rR   
_open_repozLocalGitClient._open_repo[  s9     $$$ 	%;t$$DtDzz"""rS   c                 &   |sd }|                      |          5 }|                                } |t          |                    }d |                                D             }g }	|                                D ]-\  }
}||vr$||	vr |t
          k    r|	                    |           .|	spt          |                                                              t          |                                                    rt          |i           cddd           S  |j
        j         |||	d            i }|                                D ]\  }
}|                    |
t
                    }|t
          k    rC|j                            |
||          s&d                    |
|          } ||           |||
<   n|j                            |
|          s |d|
z             d	||
<   	 ddd           n# 1 swxY w Y   t          ||          S )
a   Upload a pack to a remote repository.

        Args:
          path: Repository path (as bytestring)
          update_refs: Function to determine changes to remote refs.
            Receive dict with existing remote refs, returns dict with
            changed refs (name -> sha, where sha=ZERO_SHA for deletions)
            with number of items and pack data to upload.
          progress: Optional progress function

        Returns:
          SendPackResult

        Raises:
          SendPackError: if server rejects the pack data

        c                     d S r   rY   r0  s    rR   r1  z*LocalGitClient.send_pack.<locals>.progressv  r2  rS   c                 (    g | ]}|t           k    |S rY   r  )r  sha1s     rR   r  z,LocalGitClient.send_pack.<locals>.<listcomp>}  s"    KKKT$(:J:JD:J:J:JrS   )r   NTr  zunable to set {} to {}zunable to remove %szunable to remove)r?  r  r   r   r   r=   r   r   r  r   r  add_pack_datar   r   set_if_equalsr   remove_if_equals)rP   rL  rV  rS  r1  rp  r   r   r   r   r  r  r   r  msgs                  rR   rU  zLocalGitClient.send_packb  s   $  	   __T"" !	Af((H"{4>>22HKKX__%6%6KKKDD%-^^%5%5 * *!D(( ,, H,,KK))) ?C 0 011::3x~~?O?O;P;PQQ ?%h2>>>!	A !	A !	A !	A !	A !	A !	A !	A" .F-##D$$???  J%-^^%5%5 
A 
A!#<<::x''!;44WhQQ 26==gxPP .1
7+!;77JJ A !6!@AAA.@
7+
A/!	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	AF h:>>>>s   C4G7CG77G;>G;c                     |                      |          5 }|                    ||||          }t          ||j                                        t                                cddd           S # 1 swxY w Y   dS )a  Fetch into a target repository.

        Args:
          path: Path to fetch from (as bytestring)
          target: Target repository to fetch into
          determine_wants: Optional function determine what refs
            to fetch. Receives dictionary of name->sha, should return
            list of shas to fetch. Defaults to all shas.
          progress: Optional progress function
          depth: Shallow fetch depth

        Returns:
          FetchPackResult object

        )rz  r1  r*  N)r?  rf  r   r   get_symrefsrA   )rP   rL  rp  rz  r1  r*  rr   s           rR   rf  zLocalGitClient.fetch  s      __T"" 	Oa77 /!	   D #4););)=)=|~~NN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	Os   AA00A47A4r  c                    |                      |          5 }|                    ||||          }|                                }	t          |          }
|j                                        }t                      }|
t          d||          cddd           S t          ||j	        |
|	           t          |
                                ||          cddd           S # 1 swxY w Y   dS )r  r]  N)other_haves)r?  find_missing_objectsget_remote_hasr  r   rJ  rA   r   r"   r  r  )rP   rL  rz  r(  r-  r1  r*  rK  missing_objectsrM  
object_idsr   r   s                rR   r  zLocalGitClient.fetch_pack  sc   2 __T"" 	Aa44 5  O *88::Ko..Jf((**G NNE !&tWe<<	A 	A 	A 	A 	A 	A 	A 	A &iYdeeee"1::<<%@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As   A6C :C  C$'C$c                     |                      |          5 }|                                cddd           S # 1 swxY w Y   dS )r  N)r?  r  )rP   rL  rp  s      rR   r  zLocalGitClient.get_refs  s     __T"" 	%f??$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   7;;)TNNr   r  r   )rU   rV   rW   rX   r   r   rO   rJ  r  rN  r?  rU  rf  r   r  r  rY   rS   rR   rb  rb  E  s        118<,0	0 	0!&)	0 	0 	0 	06 6 6   [ # # [#:? :? :? :?xO O O O> 'A 'A 
'A 'A 'A 'AR% % % % %rS   rb  c                   $    e Zd ZdZ	 	 	 	 	 ddZdS )	SSHVendorz!A client side SSH implementation.Nc                 *    t          | j                  )a  Connect to an SSH server.

        Run a command remotely and return a file-like object for interaction
        with the remote command.

        Args:
          host: Host name
          command: Command to run (as argv array)
          username: Optional ame of user to log in as
          port: Optional SSH port to use
          password: Optional ssh password for login or private key
          key_filename: Optional path to private keyfile
          ssh_command: Optional SSH command

        Returns:

        )rI  run_command)rP   r  commandusernamer  passwordkey_filenamessh_commands           rR   rV  zSSHVendor.run_command  s    6 "$"2333rS   r  rU   rV   rW   rX   rV  rY   rS   rR   rT  rT    s?        ++ 4 4 4 4 4 4rS   rT  c                   "     e Zd ZdZ fdZ xZS )StrangeHostnamez,Refusing to connect to strange SSH hostname.c                 J    t                                          |           d S r   )r   rO   )rP   r  r   s     rR   rO   zStrangeHostname.__init__  s!    """""rS   )rU   rV   rW   rX   rO   r   r   s   @rR   r^  r^    s>        66# # # # # # # # #rS   r^  c                   $    e Zd ZdZ	 	 	 	 	 ddZdS )SubprocessSSHVendorz6SSH vendor that shells out to the local 'ssh' command.Nc                 \   |t          d          |r.dd l}|                    |t          j        dk              dgz   }	nddg}	|r$|	                    dt          |          g           |r$|	                    dt          |          g           |rd	                    ||          }|                    d
          rt          |          |	
                    |           t          j        |	|gz   dt          j        t          j        t          j                  }
t          |
          S )Nz6Setting password not supported by SubprocessSSHVendor.r   r  posixz-xsshz-p-i{}@{}-r  r-  )rI  shlexr   r  r  extendr   r   r  r^  r   r0  r1  r2  r  )rP   r  rW  rX  r  rY  rZ  r[  rj  argsr  s              rR   rV  zSubprocessSSHVendor.run_command  sO    %H    	!LLL;;CLG$;  > >AEGDD 4=D 	+KKs4yy)*** 	3KKs<001222 	2>>(D11D??3 	1!40000DG9/??
 
 
 !&&&rS   r  r\  rY   rS   rR   ra  ra    s?        @@ *' *' *' *' *' *'rS   ra  c                   $    e Zd ZdZ	 	 	 	 	 ddZdS )PLinkSSHVendorz8SSH vendor that shells out to the local 'plink' command.Nc                    |r.dd l }|                    |t          j        dk              dgz   }	nt          j        dk    rddg}	nddg}	|=dd l}
|
                    d           |	                    dt          |          g           |r$|	                    d	t          |          g           |r$|	                    d
t          |          g           |rd                    ||          }|	                    d          rt          |          |	                    |           t          j        |	|gz   dt          j        t          j        t          j                  }t          |          S )Nr   r  rc  z-sshz	plink.exeplinkzHInvoking PLink with a password exposes the password in the process list.z-pwz-Prf  rg  rh  ri  r-  )rj  r   r  r  r   r   rk  r   r   r  r^  r   r0  r1  r2  r  )rP   r  rW  rX  r  rY  rZ  r[  rj  rl  r   r  s               rR   rV  zPLinkSSHVendor.run_commandF  s     	%LLL;;CLG$;  > >AGIDD\W$$(DDV$DOOOMM    KKH./// 	+KKs4yy)*** 	3KKs<001222 	2>>(D11D??3 	1!40000DG9/??
 
 
 !&&&rS   r  r\  rY   rS   rR   rn  rn  C  s?        BB 0' 0' 0' 0' 0' 0'rS   rn  c                  \    dd l }|                    dt                     ddlm}  |di | S )Nr   zDParamikoSSHVendor has been moved to dulwich.contrib.paramiko_vendor.r   )ParamikoSSHVendorrY   )r   r   r   contrib.paramiko_vendorrr  )rR  r   rr  s      rR   rr  rr  y  sR    OOOMMN   ;:::::&&v&&&rS   c                   V     e Zd Z	 	 	 	 	 	 	 d fd	Zd Zed             Zd Zd Z xZ	S )SSHGitClientNc	                 R   || _         || _        || _        || _        || _        |p<t
          j                            dt
          j                            d                    | _         t                      j
        di |	 i | _        |	|| _        d S t                      | _        d S )NGIT_SSH_COMMANDGIT_SSHrY   )r  r  rX  rY  rZ  r_  environr   r[  r   rO   alternative_paths
ssh_vendorget_ssh_vendor)rP   r  r  rX  vendorr8  rY  rZ  r[  rR  r   s             rR   rO   zSSHGitClient.__init__  s     		  (& 
"*..rz~~i88+
 +
 	""6"""!#$DOOO,..DOOOrS   c                     | j         }| j        |d| j        z  z  }| j        t          | j        d          dz   |z   }t	          d||ddf          S )Nr  z@/:@re  r  )r  r  rX  urlquoter   r  s      rR   rJ  zSSHGitClient.get_url  s^    9 edi''F=$dmU33c9FBF5&$B7888rS   c                 8     | d|j         |j        |j        d|S )N)r  r  rX  rY   )r  r  rX  rO  s      rR   rN  zSSHGitClient.from_parsedurl  s;    s 
#'
 
 	
 
 	
rS   c                 p    | j                             |d|z             }t          |t                    sJ |S )Nr   )rz  r   r   r  )rP   r   s     rR   _get_cmd_pathzSSHGitClient._get_cmd_path  s9    $((gm<<#u%%%%%
rS   c                    t          |t                    st          |          t          |t                    r|                    | j                  }|                    d          r
|dd          }|                     |                              | j                  dz   |z   dz   }i }| j        
| j        |d<   | j        
| j        |d<   | j	        
| j	        |d<    | j
        j        | j        |f| j        | j        d|}t          |j        |j        |j        | j        	          |j        t+          |d
d           fS )Nz/~r   z ''rY  rZ  r[  )r  rX  r  r  )r   r  r	  r   r  r  r  rY  rZ  r[  r{  rV  r  r  rX  r@   r5  r  ri  r=  r)  r   )rP   r   rL  r4  rR  cons         rR   r  zSSHGitClient._connect  sp   #u%% 	!C.. dE"" 	;;;t9::D??4   	8Ds##**4+EFF  	 =$!%F:(%)%6F>"'$($4F=!)do)It
"&)dm
 
GM
 
 		 $ 5	   LC4((	
 		
rS   )NNNNNNN)
rU   rV   rW   rO   rJ  r  rN  r  r  r   r   s   @rR   ru  ru    s         / / / / / /69 9 9 
 
 [
  
!
 !
 !
 !
 !
 !
 !
rS   ru  c                  Z    dd                     d t          j        D                       z  S )Nzgit/dulwich/%s.c                 ,    g | ]}t          |          S rY   )r   r  s     rR   r  z-default_user_agent_string.<locals>.<listcomp>  s    'L'L'L1A'L'L'LrS   )r  dulwich__version__rY   rS   rR   default_user_agent_stringr    s-     chh'L'L8K'L'L'LMMMMrS   )zurllib3.ProxyManagerzurllib3.PoolManagerc                    dx}}dx}}|(dD ]%}	t           j                            |	          }|r n&|rt          |          rd}| |(	 |                     dd          }n# t          $ r Y nw xY w	 |                     dd          }n# t          $ r Y nw xY w	 |                     dd          }n# t          $ r d}Y nw xY w	 |                     dd          }n# t          $ r d}Y nw xY w|t                      }d	|i}
d
|i}|du rd|d<   n|du rd|d<   nd|d<   |                    |           ddl}|>||j	        }t          |t                    s|                                } ||fd|
i|}n||j        } |dd|
i|}|S )a  Return urllib3 connection pool manager.

    Honour detected proxy configurations.

    Args:
      config: `dulwich.config.ConfigDict` instance with Git configuration.
      override_kwargs: Additional arguments for `urllib3.ProxyManager`

    Returns:
      Either pool_manager_cls (defaults to `urllib3.ProxyManager`) instance for
      proxy configurations, proxy_manager_cls
      (defaults to `urllib3.PoolManager`) instance otherwise

    N)https_proxy
http_proxy	all_proxys   https   proxys	   useragents	   sslVerifyTs	   sslCAInfoz
User-agentca_certsCERT_REQUIRED	cert_reqsF	CERT_NONEr   headersrY   )r_  ry  r   check_for_proxy_bypassKeyErrorget_booleanr  r   urllib3ProxyManagerr   r   r   PoolManager)r8  pool_manager_clsproxy_manager_clsbase_urloverride_kwargsproxy_server
user_agentr  
ssl_verify	proxynamer  rR  r  managers                 rR   default_urllib3_managerr    sy   " !%$L:  HzC 	 	I:>>)44L    !(++ 	 L%zz'8<<   	G\::JJ 	 	 	D		++G\BBJJ 	 	 	JJJ		zz'<88HH 	 	 	HHH	 .00
Z(G 	XF T-{	u		){ .{
MM/"""NNN$ ' 4,,, 	1'..00L##LLL'LVLL#&2""==7=f==NsH   A" "
A/.A/3B
 

BBB2 2C CC C+*C+c                 V   | r%t           j                            d          }|rt          |           }|j        }|rdd l}	 |                    |          }n# t          $ r d }Y nw xY w|                    d          }|D ]}|	                                }|r|
                                }|                    d          }|r4	 |                    |d          }n# t          $ r d }Y nw xY w|r||v r dS |dk    r dS ||k    r dS d|z   }|                    |          r dS dS )	Nno_proxyr   ,r  F)strictT*)r_  ry  r   r   r  	ipaddress
ip_addressr   r   r   lowerlstrip
ip_networkr  )	r  no_proxy_str
parsed_urlr  r  hostname_ipno_proxy_valuesno_proxy_valueno_proxy_value_networks	            rR   r  r  =  s    *(z~~j11 (	( "(++J!*H "(    '"+"6"6x"@"@KK! ' ' '"&KKK' #/"4"4S"9"9&5 ( (N%3%9%9%;%;N% ()7)=)=)?)?)7)>)>s)C)C& 	0>9B9M9Mnej9M9k9k 6 6#- > > >9= 6 6 6>5 0#.2H#H#H+/44)S00#'44#~55#'44),~)=#,,^<< (#'445s$   A A('A(CC-,C-c                   p    e Zd ZdZddZddZd Zd ZddZ	 	 dd	Z	d
 Z
d Zd Zed             Zd ZdS )AbstractHttpGitClientzAbstract base class for HTTP Git Clients.

    This is agonistic of the actual HTTP implementation.

    Subclasses should provide an implementation of the
    _http_request method.
    Fc                 r    |                     d          dz   | _        || _        t          j        | fi | d S N/)r   	_base_urldumbr;  rO   )rP   r  r  rR  s       rR   rO   zAbstractHttpGitClient.__init__v  s@    !--3	4**6*****rS   Nc                 *    t          | j                  )a  Perform HTTP request.

        Args:
          url: Request URL.
          headers: Optional custom headers to override defaults.
          data: Request data.

        Returns:
          Tuple (response, read), where response is an urllib3
          response object with additional content_type and
          redirect_location properties, and read is a consumable read
          method for the response data.

        )rI  _http_request)rP   r^   r  r8  s       rR   r  z#AbstractHttpGitClient._http_request{  s      "$"4555rS   c                 
   |d         dk    sJ d}ddi}| j         dur|d|                    d          z  z  }t          ||          }|                     ||          \  }}|j        rb|j                            |          st          d	|d
|j        d|          t          ||j        d t          |                              }	 |j        d u p|j        	                    d           | _         | j         st          |d           }	 t          |                                          \  }	n"# t          $ r}
t          d          |
d }
~
ww xY w|	                    d          d|z   k    rt          d|	z            t          |                                          |fz   |                                 S t#          |          t%                      |f|                                 S # |                                 w xY w)Nr  r  z	info/refsAcceptz*/*Tz?service=%sr  zRedirected from URL z to URL z	 without zapplication/x-git-z%unexpected number of packets receivedr   s
   # service=z*unexpected first line %r from smart server)r  r   r   r  redirect_locationr  r   rd   content_typer  r@   r  r"  r   r   r   ri  rI   r   )rP   r3  r  tailr  r^   respr5  r'  r   r  s              rR   _discover_referencesz*AbstractHttpGitClient._discover_references  sC   |s""""U#9D  MGNN7$;$;;;Dh%%''W55
d! 	J)22488 &&ssD222DD:   sD$:<c$iiZ<$HIIH	!T) J(334HIII I 9 = t,,J !3!3!5!566ESS! J J J*?A AFIJJ ::e$$)@AA*DsJ   %U%7%7%9%9::h[H JJLLLL &d++SUUH<JJLLLLDJJLLLLs8   A G, #D1 0G, 1
E;EEAG, :G, ,Hc                 @   |d         dk    sJ t          ||          }d|z  }d|z  |d}t          |t                    rt          t	          |                    |d<   |                     |||          \  }}|j        |k    rt          d|j        z            ||fS )zSend a 'smart' HTTP request.

        This is a simple wrapper around _http_request that sets
        a couple of extra headers.
        r  r  zapplication/x-%s-resultzapplication/x-%s-request)Content-Typer  zContent-Lengthz$Invalid content-type from server: %s)r   r   r  r   rd   r  r  r   )rP   r3  r^   r8  result_content_typer  r  r5  s           rR   _smart_requestz$AbstractHttpGitClient._smart_request  s     2w#~~~~c7##7'A6@)
 
 dE"" 	7(+CIIG$%''Wd;;
d 333"69JJ   TzrS   c                                           |          }                     d|          \  }}                     |          \  }                    t	                                 t
          v rt                       _         |t                              t          |i           S t                                                                        t                                                              rt          |i           S  j        rt           j                   fd}                     d| |                      \  }	}
	 t#          |
d          }                     ||          }t          ||          |	                                 S # |	                                 w xY w)ac  Upload a pack to a remote repository.

        Args:
          path: Repository path (as bytestring)
          update_refs: Function to determine changes to remote refs.
            Receives dict with existing remote refs, returns dict with
            changed refs (name -> sha, where sha=ZERO_SHA for deletions)
          generate_pack_data: Function that can return a tuple
            with number of elements and pack data to upload.
          progress: Optional progress function

        Returns:
          SendPackResult

        Raises:
          SendPackError: if server rejects the pack data

        s   git-receive-packNr  c               3      K   t                    } | D ]}t          |          V   | j        | j        t          v           \  }}                              rt          ||          E d {V  d S d S )NrD  )r   rF   r   r   r*   r  r    )	r  r   r  r-  rS  r  r   r   rP   s	       rR   body_generatorz7AbstractHttpGitClient.send_pack.<locals>.body_generator  s      12I8U]^^N% $ $smm####););##/3JJ* * *&OY
 %%h// J-oyIIIIIIIIIIIJ JrS   zgit-receive-packr8  )_get_urlr  r  r   rB   r,   ry   r>  r   r   r   r   r  r  rI  r  r  r@   r  ri  )rP   rL  rV  rS  r1  r^   r   r   r  r  r5  
resp_protor   r  r   r   s   `  `         @@@rR   rU  zAbstractHttpGitClient.send_pack  s   & mmD!!-1-F-F.
 .
*%s 556IJJ	
###$4$6$6777#'>>>);)=)=D&;tH~~..!(%BGGGGx~~  ))#hnn.>.>*?*?@@ 	H!(%BGGGG9 	7%do666
	J 
	J 
	J 
	J 
	J 
	J 
	J 
	J 
	J ((..*:*: ) 
 

d	!$--J773X J "(%JOOOJJLLLLDJJLLLLs   #8F0 0Gc                 (   |                      |          }|                     d|          \  }}	}|                     |	          \  }
}}| |||          }n ||          }|d |D             }|st          |||          S | j        rt          | j                  t                      }t          d|j	                  }t          ||
||d|          \  }}|                     d||                                          \  }}	 t          |d          }|&|$t          |                                          \  }}t          ||
|||           t          |||||          |                                 S # |                                 w xY w)a  Retrieve a pack from a git smart server.

        Args:
          path: Path to fetch from
          determine_wants: Callback that returns list of commits to fetch
          graph_walker: Object with next() and ack().
          pack_data: Callback called for each bit of data in the pack
          progress: Callback for progress reports (strings)
          depth: Depth for request

        Returns:
          FetchPackResult object

           git-upload-packNr  c                 (    g | ]}|t           k    |S rY   r  r  s     rR   r  z4AbstractHttpGitClient.fetch_pack.<locals>.<listcomp>1  s    ===SSH__S___rS   )r)  r*  zgit-upload-packr  )r  r  r  r   r  rI  r  r   r@   r  r,  r  getvaluer   r"  r9  ri  )rP   rL  rz  r(  r-  r1  r*  r^   r   r   r  r   r   rQ   req_data	req_protor   r   r  r5  r  s                        rR   r  z AbstractHttpGitClient.fetch_pack  s   . mmD!!)-)B)B*
 *
&!3 445HII		
##OD666EE#OD))E==E===E 	9"4%8889 	7%do66699T8>22	'?#(
 (
 (
$m ((s):):)<)< ) 
 

d	!$--J"}'</D++--0/ 0/,m$'   #4%mTTJJLLLLDJJLLLLs   	AE; ;Fc                 d    |                      |          }|                     d|          \  }}}|S )r  r  )r  r  )rP   rL  r^   r   r  s        rR   r  zAbstractHttpGitClient.get_refsS  s4    mmD!!../A3GG
arS   c                 R    |                      |                              d          S r  )r  r   rK  s     rR   rJ  zAbstractHttpGitClient.get_urlY  s"    }}T""))#...rS   c                 X    t          | j        |                              d          dz   S r  )r   r  r   rK  s     rR   r  zAbstractHttpGitClient._get_url\  s'    t~t,,33C883>>rS   c                     |j         }|t          |          |d<   |j        }|t          |          |d<    | t          |          fi |S )NrY  rX  )rY  
urlunquoterX  r   )rP  rQ  rR  rY  rX  s        rR   rN  z$AbstractHttpGitClient.from_parsedurl_  sb    %!+H!5!5F:%!+H!5!5F:s:i((33F333rS   c                 h    d                     t          |           j        | j        | j                  S )Nz{}({!r}, dumb={!r}))r   r   rU   r  r  r   s    rR   r   zAbstractHttpGitClient.__repr__i  s0    $++JJNI
 
 	
rS   )Fr   r   )rU   rV   rW   rX   rO   r  r  r  rU  r  r  rJ  r  r  rN  r   rY   rS   rR   r  r  m  s         + + + +
6 6 6 6$& & &P  ,? ? ? ?N E E E EN  / / /? ? ? 4 4 [4
 
 
 
 
rS   r  c                   8     e Zd Z	 	 	 	 	 d fd	Zd ZddZ xZS )Urllib3HttpGitClientNc                 <   || _         || _        |t          ||          | _        n|| _        |G| d|pd }dd l}	|	j                            |          }
| j        j                            |
           || _	         t                      j        d||d| d S )N)r  :r  r   )
basic_auth)r  r  rY   )	_username	_passwordr  pool_managerurllib3.utilutilmake_headersr  r   r8  r   rO   )rP   r  r  r  r8  rX  rY  rR  credentialsr  r  r   s              rR   rO   zUrllib3HttpGitClient.__init__r  s     "! 7 R R RD ,D &88B88K 22k2JJJ%,,Z888 	4D	4 	4,2	4 	4 	4 	4 	4rS   c                     t          |t                    s|                    d          }t          | j        |                              d          dz   S )Nr   r  )r   r   r   r   r  r   rK  s     rR   r  zUrllib3HttpGitClient._get_url  sL    $$$ 	( ;;w''Dt~t,,33C883>>rS   c                 (   | j         j                                        }||                    |           d|d<   || j                             d||d          }n| j                             d|||d          }|j        dk    rt                      |j        d	k    r(t          |j                            d
          |          |j        dk    r(t          |j                            d          |          |j        dk    rt          d|j        |fz            |j                            d          |_        	 |                                }||k    r|nd|_        n)# t          $ r |                                |_        Y nw xY w||j        fS )Nzno-cachePragmaGETF)r  preload_contentPOST)r  bodyr  i  i  zWWW-Authenticatei  zProxy-Authenticate   zunexpected http resp %d for %sr  r  )r  r  r   r   requestr   r   r[   r   r`   r   r  geturlr  AttributeErrorget_redirect_locationr5  )rP   r^   r  r8  req_headersr  resp_urls          rR   r  z"Urllib3HttpGitClient._http_request  s   '/4466w''' *H<$,,sK - H HDD $,,[tU -  D ;#"$$$;#"4<#3#34F#G#GMMM;#'(8(89M(N(NPSTTT;#"0DK3EE   !L,,^<<	I{{}}H
 2:SXXbD""	  	B 	B 	B%)%?%?%A%AD"""	B
 TYs   >E" "#FFr  r   )rU   rV   rW   rO   r  r  r   r   s   @rR   r  r  q  sr         4 4 4 4 4 4@? ? ?" " " " " " " "rS   r  c                 p   t           j        dk    st          j        dk    sJ | j        dk    sJ | \  }}}}}}|dk    s|sd}nU|rDt          |          dk    r1|d                                         r|dd         d	v r|d
d         }nt          d          t          ddl	ma t          ||z             S )zVConvert a file: URL to a path.

    https://datatracker.ietf.org/doc/html/rfc8089
    r  ntr;  	localhostr  r  r   r   )r  z:/Nz%Non-local file URLs are not supported)url2pathname)
r  r  r_  r   schemerd   isalpharI  r  urllib.request)parsedr  r  rL  s       rR   _win32_url_to_pathr    s    
 <7""bgoooo=F""""%AvtQ1F	KKK11I 1Q3K;&& !"IJJJ //////&&&rS   r^   r8  	operationc                 R    |t          || |dk              } t          | f||d|S )a  Obtain a git client from a URL.

    Args:
      url: URL to open (a unicode string)
      config: Optional config object
      operation: Kind of operation that'll be performed; "pull" or "push"
      thin_packs: Whether or not thin packs should be retrieved
      report_activity: Optional callback for reporting transport
        activity.

    Returns:
      Tuple with client instance and relative path.

    Npushr  r8  r  )r    _get_transport_and_path_from_url)r^   r8  r  rR  s       rR   get_transport_and_path_from_urlr    sO    " vs)v2EGGG+;i; ;39; ; ;rS   c                    t          |           }|j        dk    rt          j        |fi ||j        fS |j        dv rt          j        |fi ||j        fS |j        dv rt          j        |fd|i||j        fS |j        dk    rTt          j        dk    st          j
        dk    rt          d	i |t          |          fS t          j        |fi ||j        fS t          d|j        z            )
Nr  )zgit+sshre  )httphttpsr8  r;  r  r  zunknown scheme '%s'rY   )r   r  r  rN  rL  ru  HttpGitClientr  r  r_  r   default_local_git_client_clsr  r   )r^   r8  r  rR  r  s        rR   r  r    s%   c]]F}+F==f==v{KK	,	,	,*6<<V<<fkII	+	+	+(III&IIK
 	
 
&	 	 <7""bgoo/99&99;Mf;U;UUU(7II&IIK
 	

 *V]:
;
;;rS   locationc                     d| v r d| vr|                      dd          \  }}d}nOd| v r<|                      dd          \  }}d|v r|                    dd          \  }}nd}|}nt          d          |||fS )zParse a rsync-style URL.r  r  r   Nznot a valid rsync-style URL)r   rsplitr   )r  r  rL  user	user_hosts        rR   parse_rsync_urlr  	  s    
h3h..~~c1--t	"..a00	4)"))#q11JD$$DDD6777$rS   rR  c                    |t          || |dk              } 	 t          | f||d|S # t          $ r Y nw xY wt          j        dk    r6| d                                         r| dd         d	k    rt          di || fS 	 t          |           \  }}}t          |fd
|i||fS # t          $ r t          di || fcY S w xY w)a  Obtain a git client from a URL.

    Args:
      location: URL or path (a string)
      config: Optional config object
      operation: Kind of operation that'll be performed; "pull" or "push"
      thin_packs: Whether or not thin packs should be retrieved
      report_activity: Optional callback for reporting transport
        activity.

    Returns:
      Tuple with client instance and relative path.

    Nr  r  r  r  r   r   r   z:\rX  rY   )	r   r  r   r  r  r  r
  r  ru  )r  r8  r  rR  rX  r  rL  s          rR   get_transport_and_pathr  	  sE   ( #FHI<OQQQ/D#yD D<BD D 	D    |w8A;#6#6#8#8Xac]e=S=S+55f55x??I%4X%>%>"8T
 HBBxB6BBDHH	  @ @ @+55f55x????@s   * 
77B% %C ?C z~/.git-credentialsr  r  c                 R   |D ]}	 t          |d          5 }|D ]d}t          |                                          }|j        | k    r6|j        |k    r+||j        |k    r|j        |j        fc cd d d            c S e	 d d d            n# 1 swxY w Y   # t          $ r Y w xY wd S )Nr  )openr   r   r  r  rX  rY  FileNotFoundError)r  r  rX  fnamesfnamer  r  parsed_lines           rR   get_credentials_from_storer  P	  sc      	eT"" Ja J JD"*4::<<"8"8K#*f44'0H<<%-1E1Q1Q*3[5IIIIJ J J J J J J J J JJJ J J J J J J J J J J J J J J ! 	 	 	H	 sA   BAB.B=B?BB	BB	B
B$#B$r  r   )rX   loggingr_  re   r  r0  r  
contextlibr   ior   r   typingr   r   r   r	   r
   r   r   r   r   r   r   r   urllib.parser   r  r   r  r   r   r   r   r  r  r8  r   r   r   errorsr   r   r   packr   r    r!   r"   protocolr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   r   rG   rH   rI   reporJ   r  	getLoggerrU   r
  rN   rL   r[   r`   rg   rw   COMMON_CAPABILITIESr?  rA  ry   r   r   r   r   r   r  r  r  r,  r9  r;  r  r  r  r  r  r   r(  rc  rb  r
  rT  r^  ra  rn  rr  r|  ru  r  r  r  r  r  r	  r  r  r  r  r  rL  
expanduserDEFAULT_GIT_CREDENTIALS_PATHSr  rY   rS   rR   <module>r'     su
  * (  				       



       & & & & & & & &7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 * * * * * * . . . . . . B B B B B B B B B B B B NNN  F F F F F F F F F F E E E E E E E E E E> > > > > > > > > > > >3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 I H H H H H H H H H        
	8	$	$
 
 
 
 
9 
 
 
    y       I   : : :
   ,-EF !	
     02 02 02 02 02 02 02 02f* * *&P
 P
 P
 P
 P
 P
 P
 P
fFW FW FW FW FW FW FW FWR( ( (9 9 9 9 9 9 9 9x
Xe_ 
%U
BS9T 
 
 
 
A( A( A(R 7 7e*7 &	7 7 7 7zS0 S0 S0 S0 S0 S0 S0 S0l
$ $ $"" " "qO qO qO qO qO9 qO qO qOh?8 ?8 ?8 ?8 ?8' ?8 ?8 ?8D       :$s)    "
 "
 "
 "
 "
. "
 "
 "
J_% _% _% _% _%Y _% _% _%F  . 4 4 4 4 4 4 4 4B# # # # #i # # #-' -' -' -' -') -' -' -'`3' 3' 3' 3' 3'Y 3' 3' 3'l	' 	' 	' %U
 U
 U
 U
 U
' U
 U
 U
pN N N EIS S
89S S S Sl- - -`A
 A
 A
 A
 A
I A
 A
 A
HJ J J J J0 J J JZ %'# ' ' ' '< .2#'; ;;"6*;C=;6;IsN6K; ; ; ;0< < <,c eHSM3,C&D    *  $#(I (I(IV(I }(I 	(I
 9c>(I (I (I (IX G+,,UM22!   $,I     rS   