
    .Ph                    N   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Zddlm	Z	m
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 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-m.Z. d
dl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZ d
dl[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZc d
dldmeZe ddgZfegZh eji        ej          Zk G d del          Zm G d del          Zn G d del          Zod Zpd Zqe9e=gZre?e7e8e<gerZse;e3gerZt G d d          ZudevfdZwd Zxdeyezegegf         ezegegf         ezegegf         f         fd Z{deyezegegf         e|eg         f         fd!Z} G d" d#          Z~ G d$ d%          Zd& Z G d' d(          Zd)e	eg         de
eyevegf                  fd*Zd+ Zd, Zde0dfd-e|eg         d.eeggdf         d/eeeggdf                  ddfd0Zd1 Z G d2 d3          Zdbd4Zd5 Z G d6 d7e          Z G d8 d9e          Z G d: d;          Zdee         fd<Z G d= d>e          Z G d? d@e          ZeZ G dA dB          Z G dC dDel          Z G dE dFe          Z G dG dHe          ZdI ZeZ G dJ dKe          ZdL Z	 	 	 dcdedM         fdNZdefdOZ G dP dQe          ZdR Z G dS dTe          ZeZdefdUZ	 dddVedWee#         dXee         deyeef         fdYZdZ Zd[edeyee         eef         fd\Z	 	 ddd[edWee#         dXee         deyeef         fd]Zej                            d^           e%d_d`          gZdefdaZdS )ea1  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)IterableIterator)closing)BufferedReaderBytesIO)IOTYPE_CHECKINGCallableClassVarOptional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_FETCHCAPABILITY_FILTER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"DEFAULT_GIT_PROTOCOL_VERSION_FETCH!DEFAULT_GIT_PROTOCOL_VERSION_SENDGIT_PROTOCOL_VERSIONS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filter_ref_prefixparse_capabilitypkt_linepkt_seq)PEELED_TAG_SUFFIXRef_import_remote_refs_set_default_branch	_set_head_set_origin_headread_info_refssplit_peeled_refs)Repo   HEADs   refs/c                       e Zd ZdZddZdS )InvalidWantszInvalid wants.returnNc                 B    t                               | d|           d S )Nz-requested wants not in server provided refs: )	Exception__init__)selfwantss     N/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/dulwich/client.pyrY   zInvalidWants.__init__   s2    K%KK	
 	
 	
 	
 	
    rV   N__name__
__module____qualname____doc__rY    r]   r\   rU   rU      s.        
 
 
 
 
 
r]   rU   c                       e Zd ZdZddZdS )HTTPUnauthorizedz!Raised when authentication fails.rV   Nc                 X    t                               | d           || _        || _        d S )NzNo valid credentials provided)rX   rY   www_authenticateurl)rZ   rh   ri   s      r\   rY   zHTTPUnauthorized.__init__   s,    4!@AAA 0r]   r^   r_   rd   r]   r\   rf   rf      s.        ++     r]   rf   c                       e Zd ZdZddZdS )HTTPProxyUnauthorizedz'Raised when proxy authentication fails.rV   Nc                 X    t                               | d           || _        || _        d S )Nz#No valid proxy credentials provided)rX   rY   proxy_authenticateri   )rZ   rm   ri   s      r\   rY   zHTTPProxyUnauthorized.__init__   s,    4!FGGG"4r]   r^   r_   rd   r]   r\   rk   rk      s.        11     r]   rk   c                 `    t          t          j        | gg g d          d                   dk    S )z'Check if a file descriptor is readable.r   )lenselect)filenos    r\   _fileno_can_readrr      s,    v}fXr2q11!45599r]   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)
ctypesrt   ru   rv   DWORDkernel32PeekNamedPipeOSErrorGetLastErrorvalue)handlert   ru   rv   c_avail	c_messagesuccesss          r\   _win32_peek_availr      s    ..........nnG  Io++auuW~~uuY/?/? G  /h++--...=r]   c                   (    e Zd ZdZddZd ZddZdS )ReportStatusParserzEHandle status as reported by servers with 'report-status' capability.rV   Nc                 0    d| _         d | _        g | _        d S NF)_done_pack_status_ref_statusesrZ   s    r\   rY   zReportStatusParser.__init__   s    
 *,r]   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|          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   split
ValueErrordecoder   )rZ   statusrestreferrors        r\   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    &'GV'G'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)rZ   pkt
ref_statuss      r\   handle_packetz ReportStatusParser.handle_packet   sx     : 	M"#KLLL;DJF$ #		DJ%%j11111r]   r^   )r`   ra   rb   rc   rY   r   r   rd   r]   r\   r   r      sT        OO- - - -
I I I02 2 2 2 2 2r]   r   rV   c                     |                                  }||                                dk    rdS |                     |           dS )Ns	   version 2   r   )read_pkt_liner   unread_pkt_line)protor   s     r\   negotiate_protocol_versionr     sH    




C
399;;,66q	#1r]   c                 X    g }| D ]}|                     |           t          |          S N)r   set)rI   server_capabilitiesr   s      r\   read_server_capabilitiesr   
  s=     ( (""3''''"###r]   c                 |   i }i }i }| D ]}|                     d                              d          }|d         }|dk    rd }|d         }|dd          D ]]}|                    d          r|dd          ||<   %|                    d	          r|d
d          ||<   Ht          j        d|           ^|||<   |||fS )N   
r   r   s   unbornr   r   s   peeled:   s   symref-target:   zunknown part in pkt-ref: %s)rstripr   
startswithloggingwarning)	rI   refssymrefspeeledr   partsshar   parts	            r\   read_pkt_refs_v2r     s     DGF  

5!!''--Ah)CAh!""I 	E 	EDz** E"122hs!233 E#BCCy =tDDDDS		&  r]   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 }|J |t          |          fS )Nr   r   s   ERRr   replacer   )	r   r   r   r   rD   ro   r   r    r>   )rI   r   r   r   r   r   s         r\   read_pkt_refs_v1r   *  s    D  ZZ&&,,T155
c&=="3::gy#A#ABBB&)=c)B)B&S%S		
4yyA~~355y (+++***())))r]   c                        e Zd ZU dZh dZeee                  ed<   	 d	 ddZ	ddZ
d Zdefd	Zd
 ZdefdZd Z fdZdef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
    >   getpopcopykeysclearitemsupdatevaluespopitemfromkeysviewkeys	viewitems
setdefault
viewvalues_FORWARDED_ATTRSNrV   c                 L    || _         || _        || _        || _        || _        d S r   )r   r   agentnew_shallownew_unshallow)rZ   r   r   r   r   r   s         r\   rY   zFetchPackResult.__init__X  s/     	
&*r]   c                 H    dd l }|                    dt          d           d S )Nr   z!Use FetchPackResult.refs instead.   
stacklevelwarningswarnDeprecationWarningrZ   r   s     r\   _warn_deprecatedz FetchPackResult._warn_deprecateda  s9    / 	 	
 	
 	
 	
 	
r]   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   rZ   others     r\   __eq__zFetchPackResult.__eq__j  sf    eT"" 	&!!###9%%I# *-*
ek)	
r]   c                 <    |                                   || j        v S r   r   r   rZ   names     r\   __contains__zFetchPackResult.__contains__t  !    ty  r]   c                 D    |                                   | j        |         S r   r   r   s     r\   __getitem__zFetchPackResult.__getitem__x       yr]   c                 R    |                                   t          | j                  S r   r   ro   r   r   s    r\   __len__zFetchPackResult.__len__|  "    49~~r]   c                 R    |                                   t          | j                  S r   r   iterr   r   s    r\   __iter__zFetchPackResult.__iter__  "    DIr]   c                     |t          |           j        v r)|                                  t          | j        |          S t                                          |          S r   typer   r   getattrr   super__getattribute__rZ   r   	__class__s     r\   r   z FetchPackResult.__getattribute__  S    4::...!!###49d+++ww''---r]   c                 P    | j         j         d| j        d| j        d| j        dS N(z, ))r   r`   r   r   r   r   s    r\   __repr__zFetchPackResult.__repr__  s4    .)\\DI\\4<\\TZ\\\\r]   NNr^   r`   ra   rb   rc   r   r   r   str__annotations__rY   r   r   boolr   r   intr   r   r   r   __classcell__r   s   @r\   r   r   >  s.         , , ,hs3x(   $ EI+	+ + + +
 
 
 

 
 
!D ! ! ! !        . . . . .]# ] ] ] ] ] ] ] ]r]   r   c                        e Zd ZU dZh dZeee                  ed<   dddZ	ddZ
d Zdefd	Zd
 ZdefdZd Z fdZdef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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   NrV   c                 0    || _         || _        || _        d S r   )r   r   r   )rZ   r   r   r   s       r\   rY   zSendPackResult.__init__  s    	
$r]   c                 H    dd l }|                    dt          d           d S )Nr   z Use SendPackResult.refs instead.r   r   r   r   s     r\   r   zSendPackResult._warn_deprecated  s9    . 	 	
 	
 	
 	
 	
r]   c                     t          |t                    r|                                  | j        |k    S | j        |j        k    o| j        |j        k    S r   )r   r   r   r   r   r   s     r\   r   zSendPackResult.__eq__  sP    eT"" 	&!!###9%%yEJ&D4:+DDr]   c                 <    |                                   || j        v S r   r   r   s     r\   r   zSendPackResult.__contains__  r   r]   c                 D    |                                   | j        |         S r   r   r   s     r\   r   zSendPackResult.__getitem__  r   r]   c                 R    |                                   t          | j                  S r   r   r   s    r\   r   zSendPackResult.__len__  r   r]   c                 R    |                                   t          | j                  S r   r   r   s    r\   r   zSendPackResult.__iter__  r   r]   c                     |t          |           j        v r)|                                  t          | j        |          S t                                          |          S r   r   r   s     r\   r   zSendPackResult.__getattribute__  r   r]   c                 @    | j         j         d| j        d| j        dS r   )r   r`   r   r   r   s    r\   r   zSendPackResult.__repr__  s*    .)JJDIJJ4:JJJJr]   r   r^   r   r  s   @r\   r  r    s'         , , ,hs3x(   "% % % % %

 
 
 
E E E!D ! ! ! !        . . . . .K# K K K K K K K Kr]   r  c                    t                      }t                      }| D ]}|dk    r		 |                    dd          \  }}n # t          $ r t          d|           w xY w|t          k    r(|                    |                                           w|t          k    r(|                    |                                           t          d|           ||fS )Ns   shallow-info
r   r   zunknown command )r   r   r   r   r2   addr   r3   )rI   r   r   r   cmdr   s         r\   _read_shallow_updatesr    s    %%KEEM = =###	=yyq))HC 	= 	= 	="#;c#;#;<<<	=/!!OOCIIKK((((%%%ciikk****"#;c#;#;<<<''s   AA c                   "    e Zd ZddZd Zd ZdS )_v1ReceivePackHeaderrV   Nc                 h    g | _         g | _        |                     |||          | _        d| _        d S r   )wanthave_handle_receive_pack_head_itsent_capabilities)rZ   capabilitiesold_refsnew_refss       r\   rY   z_v1ReceivePackHeader.__init__  s7    !#	!#	11,(SS!&r]   c                     | j         S r   )r  r   s    r\   r   z_v1ReceivePackHeader.__iter__  s	    xr]   c              #     K   d |                                 D             | _        |D ]Z}t          |t                    st	          d|          |                    |t                    }t          |t                    st	          d|d|          |                    |t                    }t          |t                    st	          d|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                            |           \d
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 rd   r>   .0xs     r\   
<listcomp>zB_v1ReceivePackHeader._handle_receive_pack_head.<locals>.<listcomp>  s    GGG1hQr]   zrefname is not a bytestring: zold sha1 for z is not a bytestring: z is not a bytestring z Sending updated ref %r: %r -> %rr       TN)r   r  r   bytes	TypeErrorr   r>   loggerdebugr  joinsortedr  r   )rZ   r  r  r  refnameold_sha1new_sha1s          r\   r  z._v1ReceivePackHeader._handle_receive_pack_head  s      HG 1 1GGG	  	+  	+Ggu-- M K K KLLL||GX66Hh.. QGQQXQQ    ||GX66Hh.. PGPPHPP   8##68   ) 2"T/H4t;gEEEEE !"#  "	"
    ))F<$8$899:   .2D*ty((X-A-A	  ***




r]   r^   )r`   ra   rb   rY   r   r  rd   r]   r\   r  r    sF        ' ' ' '  . . . . .r]   r  rI   c              #   ^   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)rI   r   channels      r\   _read_side_band64k_datar5  %  sP         c"1"g,,s122w r]   c                 |    | D ]8}t          |          \  }}||k    r|r||                    d          vr5|c S d S )Nr   )rG   r   )r  keyr}   
capabilitykvs         r\   find_capabilityr;  2  sc    "  

++188 	U!''$--// r]   c                 Z   t          |t                    rt          |d         t                    sJ t          dz   |d         z   }|t          }|dk    r(|dd                    t          |                    z   z  }|dz  }|                     |           |dd         D ]%}|                     t          dz   |z   dz              &|dvst          |dd          r|dk    r+t          |t          t                    st          d	          nt          |vrt          d	          |j        D ]%}	|                     t          dz   |	z   dz              &|C|                     t          dz   t!          |                              d
          z   dz              |dk    r|                     d           |dk    r|                     d           |dvr,|%t%          |                                           \  }
}ndx}
}nt)                      x}
}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)t7          |d          d          t+          |          }||                     t8          dz              |dk    r|                     d           |
|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
      protocol_version: Neogiated Git protocol version.
    r   r   Nr   r   r   )r   Nshallowz=server does not support shallow capability required for depthascii   ACK)   continue   common   readyz& not in ('continue', 'ready', 'common))r   listr)  r4   r6   r-  r.  write_pkt_liner   r;  r#   r+   r   r=  r2   r/   r   encoder  read_pkt_seqr   nextr1   r   r   r   ackAssertionErrorr0   )r   r  graph_walkerr[   can_readdepthprotocol_versionwantcmdr  r   r   r   r  r   r   s                  r\   _handle_upload_pack_headrO  <  s   * eT""Bz%(E'B'BBBBT!E!H,G<14$))F<$8$89999uG	!!!abb	 A A\D047%?@@@@Iy$!G!Gq  "<1ACUVV &S    |33"O    ' 	G 	GC  4!7#!=!EFFFF  %E

(9(9'(B(BBUJ   q    &&&1T"""I+@ASASAUAU+V+V([--*..K--&)ee+mD
 "\D047%?@@@HHJJ%%''CJJu%%++D11EQx6!!  q***87771X))( 8KKK   L!!  "  
-...1T"""''r]   r  	pack_dataprogressc                    |                                  }|r|                    d                              d          }|dk    r|d         dk    rn{|d         dk    r|                    |d                    |d         dk    r|                                 t          |          d	k     s
|d         d
vrn|                                  }|t          |v s|dk    rn|dd}t          |                                           D ]D\  }	}
|	t          k    r ||
           |	t          k    r ||
           3t          d|	           dS 	 |                     |          }
|
dk    rdS  ||
           ))a  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
      protocol_version: Neogiated Git protocol version.
    r   r   r   r   packfiler?  r   s   NAKr   )rB  r@  rA  NrV   c                     d S r   rd   r&  s    r\   rQ  z*_handle_upload_pack_tail.<locals>.progress      r]   Invalid sideband channel Tr]   r^   )r   r   r   rH  nakro   r,   r5  rF  r:   r<   rI  read)r   r  rJ  rP  rQ  rbufsizerM  r   r   chandatas              r\   _handle_upload_pack_tailr]    s   ( 



C
 $

5!!''--q  U1X%;%;Qx6!!  q***Qx6!!  """5zzA~~q 2 " "
 !!##  $   <//3Cq3H3H    2%2D2D2F2FGG 	I 	IJD$---	$333$%G%G%GHHH	I 	I	::h''Ds{{IdOOO		r]   c                     i }d}| D ]J}t          |          \  }}|t          k    r|                    dd          \  }}|||<   |t          k    r|}K||fS )zExtract symrefs and agent from capabilities.

    Args:
     capabilities: List of capabilities
    Returns:
     (symrefs, agent) tuple
    N   :r   )rG   r-   r   r!   )r  r   r   r8  r9  r:  srcdsts           r\   _extract_symrefs_and_agentrb    sw     GE"  

++1!!!q))JS#GCL   EUr]   c                   v   e Zd ZdZ	 	 	 	 d#	 d$dZdefdZed%d            Z	 d&d	ed
e	e
e         e
e         egeeee         f         f         defdZ	 	 	 	 	 	 	 	 	 	 d'dededee         deee                  dee         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ee                  dee         dee         defdZddddddd	edee	egdf                  dee         deee                  dee         defdZ	 	 d)dee         deee                  deeef         f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$d!Z$ed$d"            Z%dS )+	GitClientzGit smart server client.TNFrV   c                    || _         d| _        t          t                    | _        | j                            t                                 t          t                    | _        | j                            t                                 |r| j                            t                     |s| j        
                    t                     |r| j                            t                     d| _        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
        Nr   )_report_activity_report_status_parserr   UPLOAD_CAPABILITIES_fetch_capabilitiesr  rC   RECEIVE_CAPABILITIES_send_capabilitiesr)   remover.   r%   rM  )rZ   
thin_packsreport_activityquietinclude_tagskwargss         r\   rY   zGitClient.__init__  s    " !0CG"#&':#;#;  $$%5%7%7888"%&:";";##$4$6$6777 	:#''(8999 	B$++,@AAA 	A$(()?@@@ !r]   c                 *    t          | j                  )zRetrieves full url to given path.

        Args:
          path: Repository path (as string)

        Returns:
          Url to path (as string)

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

        Args:
          parsedurl: Result of urlparse()

        Returns:
          A `GitClient` object
        )rs  from_parsedurlcls	parsedurlrq  s      r\   rx  zGitClient.from_parsedurl  s     "#"4555r]   rv  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

        )rs  	send_pack)rZ   rv  update_refsr|  rQ  s        r\   r~  zGitClient.send_pack  s    6 "$.111r]   originmkdirbare
ref_prefixrM  c           	      H   |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<   |}not'          |j        |	                    d          |           t)          |j        |	                    d          |||          }|rt+          |j        ||          }nd}|r||                                 n@# t.          $ r3 ||                                 |rddl}|                    |            w xY w|S )zClone a repository.NTz"checkout and bare are incompatibler   s   remotes   urls   fetchs   +refs/heads/*:refs/remotes/s   /*s   clone: from rQ  rL  r  filter_specrM  )messagerS   r   )osr  rR   initr   	init_barer   LocalGitClientSubprocessGitClientrE  rt  
get_configr   write_to_pathfetchrL   r   r   r   rO   rM   rN   reset_indexBaseExceptioncloseshutilrmtree)rZ   rv  target_pathr  r  r  checkoutbranchrQ  rL  r  r  rM  targetencoded_pathtarget_configref_messageresultorigin_head
origin_shaheadhead_refr  s                          r\   clonezGitClient.clone8  s      	"H[!!!L	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%%%! & 1 1 3 3!!g 6 67   !!g 6 672V]]75K5KKeS  
 ++---)L8KZZ!%'!1    F !#Kk    !.,,W55K11J~*~[~'1G$! fmmG.D.DkRRR.KMM'**    $V[(KHHDDD %D,""$$$ 	 	 	! +k***	 s   I	I" "=Jr  determine_wantsrQ  rL  r  c	                    |j         j        }t          | j        v r<ddlm}	  |	t          dt          j         dd                    dfd}
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
          ref_prefix: List of prefixes of desired references, as a list of
            bytestrings. Filtering is done by the server if supported, and
            client side otherwise.
          filter_spec: A git-rev-list-style object filter spec, as bytestring.
            Only used if the server supports the Git protocol-v2 'filter'
            feature, and ignored otherwise.
          protocol_version: Desired Git protocol version. By default the highest
            mutually supported protocol version will be used.

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

        Nr   )SpooledTemporaryFilez	incoming-rv  )max_sizeprefixdirrV   c                                                        r7                     d           j                             j        d                                              d S )Nr   rQ  )tellseekobject_storeadd_thin_packrY  r  )frQ  r  s   r\   commitzGitClient.fetch.<locals>.commit  sT    6688 WFF1III'55afdX5VVV					r]   c                  0                                       d S r   r  )r  s   r\   abortzGitClient.fetch.<locals>.abort  s    					r]   r  r^   )r  determine_wants_allr.   ri  tempfiler  r   r   add_pack
fetch_packget_graph_walkerwriter  update_shallowr   r   )rZ   rv  r  r  rQ  rL  r  r  rM  r  r  r  r  r  s     ` `        @r\   r  zGitClient.fetch  ss   H "$1EO4#;;;555555//1"F/>>  A               &2;;==Avu	__''))!%'!1 % 
 
F FHHHH	  	 	 	EGGG	
 	f0&2FGGGs   :5B: :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
          ref_prefix: List of prefixes of desired references, as a list of
            bytestrings. Filtering is done by the server if supported, and
            client side otherwise.
          filter_spec: A git-rev-list-style object filter spec, as bytestring.
            Only used if the server supports the Git protocol-v2 'filter'
            feature, and ignored otherwise.
          protocol_version: Desired Git protocol version. By default the highest
            mutually supported protocol version will be used.

        Returns:
          FetchPackResult object

        )rs  r  )
rZ   rv  r  rJ  rP  rQ  rL  r  r  rM  s
             r\   r  zGitClient.fetch_pack  s    J "$/222r]   c                 *    t          | j                  )zRetrieve the current refs from a git smart server.

        Args:
          path: Path to the repo to fetch from. (as bytestring)
        )rs  get_refs)rZ   rv  rM  r  s       r\   r  zGitClient.get_refs  s     "$-000r]   c                 X    t          d |                                 D                       S )Nc              3   ,   K   | ]}|t           k    V  d S r   r#  )r%  r   s     r\   	<genexpr>z.GitClient._should_send_pack.<locals>.<genexpr>  s&      @@s3(?@@@@@@r]   )anyr   )r  s    r\   _should_send_packzGitClient._should_send_pack  s+     @@hoo.?.?@@@@@@r]   c                 p    | j         |z  }t          |          \  }}t          |          t          z
   ||fS r   )rk  rb  rE   r8   )rZ   r   negotiated_capabilitiesr   _symrefss        r\   $_negotiate_receive_pack_capabilitiesz.GitClient._negotiate_receive_pack_capabilities!  sD    "&"9<O"O67JKK	!"5	6	69S	S	S&--r]   r   r  c                 d   t           |v s| j        dk    r|dd}t          |v r"| j        J t	          | j        j                  }t          |                                          D ]W\  }}|t          k    rt          |v r|	                    |           /|t          k    r ||           Ft          d|           nCt          |v r:| j        sJ |                                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
        r   NrV   c                     d S r   rd   rU  s    r\   rQ  z5GitClient._handle_receive_pack_tail.<locals>.progress=  s    Dr]   rW  r^   )r,   rM  r*   rg  r@   r   r5  rF  r:   parser<   rI  r   r   )rZ   r   r  rQ  pktline_parserr[  r\  r   s           r\   _handle_receive_pack_tailz#GitClient._handle_receive_pack_tail(  sq   $ $|33t7LPQ7Q7Q    (<771===!.t/I/W!X!X5e6H6H6J6JKK M M
d111/<??&,,T222777HTNNNN()KT)K)KLLLM (<771111 --// B BC.<<SAAAA%1288::;;;tr]   c                 L   t          |          t          z
   d }|D ]}t          |          \  }}| j        dk    r|t          k    rt          }g }|                                                    d          }d|v r|                    t                     d|v r|                    t                     t          t          |                    D ]}|dk    r|dz  }n|dz  }|||         z  }t          |          \  }}	| j        |z  }
|r|
                    |           |
||	fS )Nr   r   s   shallows   filterr      =)rE   r9   rG   rM  r#   r   r   r   r+   r$   rangero   rb  ri  r  )rZ   r   
fetch_capar8  r9  r:  fetch_featuresir   r   r  s              r\   #_negotiate_upload_pack_capabilitiesz-GitClient._negotiate_upload_pack_capabilitiesU  sO   	!"5	6	69R	R	R
- 	4 	4J#J//DAq$))a3C.C.C-
!#GGIIOOD))??"))*<===>>"))*;<<<s>2233 4 4AAvv"d*

"d*
."33JJ56IJJ%"&":=P"P 	4#''
333'%88r]   c	                 *    t          | j                  )z*Retrieve an archive of the specified tree.)rs  archive)	rZ   rv  
committish
write_datarQ  write_errorformatsubdirsr  s	            r\   r  zGitClient.archiveq  s     "$,///r]   c                  D    dd l } |                     dt                     d S )Nr   z3object filtering not recognized by server, ignoring)r   r   UserWarning)r   s    r\   _warn_filter_objectszGitClient._warn_filter_objects  s1    A	
 	
 	
 	
 	
r]   )TNFFr^   )rV   rd  r   )
TFr  NNNNNNNNNNNNNr   NNNNN)&r`   ra   rb   rc   rY   r   rt  classmethodrx  r
   r   r)  r  tupler  r   r   r  r~  r   rC  rK   rR   r  r   r   r  r  ObjectIDr  staticmethodr  r  rA   r  r  r  r  rd   r]   r\   rd  rd    s2       "" " 
" " " ">
0s 
0 
0 
0 
0 	6 	6 	6 [	6$ 2 22 %ZUT*E#x7O2O,PP
	2 
2 2 2 2B  (*.*.` ` 	`
 ` ` T#Y'` #3-` 
` ` ` `P 6:#*.'+*.L LL L "d5%<((3-8$u+EF
	L 8UGTM23L }L T#Y'L e_L #3-L 
L L L Lj 7;#*.*.%3 %3 %3%3 8UGTM23%3 }%3 T#Y'%3 #3-%3 
%3 %3 %3 %3T +/*.	1 1 #3-1 T#Y'	1
 
c8m	1 1 1 1 A A \A. . . 7;	+ ++ %j+ 8UGTM23	+
 
$uhsm+,	-+ + + +Z9 9 9B 0 
0 0 0 0 
 
 
 \
 
 
r]   rd  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
    c                 L    h | ]!\  }}|                     t                    |"S rd   )endswithrJ   )r%  r9  r:  s      r\   	<setcomp>zcheck_wants.<locals>.<setcomp>  s>       q!AJJ7H,I,I	  r]   N)r   r   rU   )r[   r   missings      r\   check_wantsr    sZ     %jj  

   G  $7###$ $r]   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     r\   r'  z-_remote_error_from_stderr.<locals>.<listcomp>  s$    ???DT[[???r]   s   ERROR: r   r   )r?   	readlinesr   r   ro   r   )stderrlinesr  s      r\   _remote_error_from_stderrr    s    ~   ??F,<,<,>,>???E X X??:&& 	X#DZ):):$;$B$B7I$V$VWWWWW	X5!!!r]   c                   6    e Zd ZdZdZefd fdZ	 ddedeeef         de	e
         deeeg ef         e	ee                  f         fd	Zdd
Z	 	 	 	 	 dde	ee                  de	e
         fdZ	 	 dde	e
         de	ee                  fdZ	 	 	 	 	 d	 ddZ xZS )TraditionalGitClientzTraditional Git client.r   rV   Nc                 H    || _          t                      j        di | d S Nrd   )_remote_path_encodingr   rY   )rZ   path_encodingrq  r   s      r\   rY   zTraditionalGitClient.__init__  s.    %2"""6"""""r]   r  rv  rM  c                     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)
          protocol_version: Desired Git protocol version. By default the highest
            mutually supported protocol version will be used.
        )rs  )rZ   r  rv  rM  s       r\   _connectzTraditionalGitClient._connect  s
    ( "!r]   c                    t           | _        |                     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 t3          |||          }|D ]}|                    |            ||j        |j        t8          |v |          \  }}|                     |          r*t=          |||	          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_deltarQ  r  )!r6   rM  r  r   rF  r?   r  r  r*   r   rg  r   r  rD  r   r   issubsetr  r"   r>   r   r   _ref_status_okro   r   r  r  r  r(   r  r   r  r  )rZ   rv  r  r|  rQ  r   unused_can_readr  r  r   excr  r   report_status_parserr  orig_new_refsr   r   r   header_handlerr   pack_data_countrP  chunks                           r\   r~  zTraditionalGitClient.send_pack  s   & !B)-)M)M& G	P G	PA0@ASASAUAU0V0V---" 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+G	P G	P G	P G	P G	P G	P G	P G	P. &-@@@.. - 3 3 5 5 * *HCh37NNN0>EE &/X X   CH0?$SM$$T***%heKKKKG	P G	P G	P G	P G	P G	P G	P G	PN 8}}!!m!$$T***'3!%&:&@&@&B&B!C!CJJ!%J%he
SSS]G	P G	P G	P G	P G	P G	P G	P G	P` 2'8 N & * *$$S))))););##/3JJ!	* * *&OY %%h// '/#Y   ' 'E KK&&&&77. J "(%JOOOOG	P G	P G	P G	P G	P G	P G	P G	P G	P G	P G	P G	P G	P G	P G	P G	P G	P G	Psb   M$AM
A/A**A//>M.C	M	!C**A<M3BMA!MB5MMMr  c
           
         |	|	t           vrt          d|	           |                     d||	          \  }
}}t          |
          }|t           vrt          d| d          |	r||	k    rt          d| d          || _        |
5  | j        dk    r	 t          |
                                          }n"# t          $ r}t          |          |d}~ww xY w| 	                    |          \  }}}|

                    d           |
                    d           |

                    d	           |

                    d
           |t          }|D ]}|

                    d|z              |

                    d           t          |
                                          \  }}}ns	 t          |
                                          \  }}n"# t          $ r}t          |          |d}~ww xY w| 	                    |          \  }}}|t          ||          }|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 | j        dk    r|

                    d           |
                    d           t%          |t&          t(                    r(|r&|
                    t+          d|z                       n-|r|                                  n|r|                                  t/          |
|||||| j                  \  }}t1          |
||||| j                   t!          |||||          cddd           S # 1 swxY w Y   dS )r  Nunknown Git protocol version    upload-pack used by serverbad Git protocol version r      command=ls-refs
   0001   symrefs   peel   ref-prefix rL  c                 (    g | ]}|t           k    |S rd   r#  r%  cids     r\   r'  z3TraditionalGitClient.fetch_pack.<locals>.<listcomp>  s    AAAr]      command=fetch

   filter %s
)rL  rM  rM  )r7   r   r  r   rM  r   rF  r?   r  r  rD  r  DEFAULT_REF_PREFIXr   r   rF   r   r  r;  r#   r$   rH   r  rO  r]  )rZ   rv  r  rJ  rP  rQ  rL  r  r  rM  r   rK  r  server_protocol_versionr   r  r  r   r   r  r   _peeledr[   r   r   s                            r\   r  zTraditionalGitClient.fetch_pack  s   J ( (===O=MOOPPP"&--FV"W"Wx"<U"C"C"*???X0GXXX    	 7:J J JT,CTTT   !8 T	U T	U$))E*B5CUCUCWCW*X*X''& E E E3F;;DE <<=PQQ	+ $$%9:::G$$$$$Z000$$W---%!3J( B BF((&)@AAAA$$T***)9%:L:L:N:N)O)O&gwwE0@ASASAUAU0V0V-D--& E E E3F;;DE <<=PQQ	+ ),T:>>D|$$T***&tWe<<MT	U T	U T	U T	U T	U T	U T	U T	UP$+OD>>>EE+OD11E    $$T***  AAAAA =$$T***&tWe<<iT	U T	U T	U T	U T	U T	U T	U T	Uj $))$$%7888G$$$#/1ACT 0 $	0 KK+)E F FGGGG  0--/// ,))++++C'!%!6, , ,([- %'!%!6    #4%mTTiT	U T	U T	U T	U T	U T	U T	U T	U T	U T	U T	U T	U T	U T	U T	U T	U T	U T	Us{   O!B87O8
CCCCO)$GO
G-G((G--AOI,+O,!J8OC/OOOc                    ||t           vrt          d|           |                     d||          \  }}}t          |          }|t           vrt          d| d          |r||k    rt          d| d          || _        | j        dk    rSt          |                                          }|                    d           |                    d           |                    d	           |                    d
           |t          }|D ]}	|                    d|	z              |                    d           |5  	 t          |                                          \  }
}}n"# t          $ r}t          |          |d}~ww xY w|                    d           |                                D ]\  }}||
|t          z   <   |
cddd           S # 1 swxY w Y   dS |5  	 t          |                                          \  }
}n"# t          $ r}t          |          |d}~ww xY w|                    d           t!          |          \  }}|t#          |
|          }
|
cddd           S # 1 swxY w Y   dS )2Retrieve the current refs from a git smart server.Nr  r  r  r  r   r	  r
  r  r  r  )r7   r   r  r   rM  r   rF  rD  r  r  r   r?   r  r   rJ   r   rb  rF   )rZ   rv  rM  r  r   _r  r  r   r  r   r  r   r  r/  refvalue_agents                    r\   r  zTraditionalGitClient.get_refs  s    ( (===O=MOOPPP==?OPPq&"<U"C"C"*???X0GXXX    	 7:J J JT,CTTT   !8 A%%":5;M;M;O;O"P"P  !5666KK     ,,,  )))!/
$ > >$$^f%<====  &&&  E-=e>P>P>R>R-S-S*D(FF& E E E3F;;DE$$T***)/ A A%GX8@D#4455                   	 	E0@ASASAUAU0V0V-D--& E E E3F;;DE$$T***%?@S%T%T"6),T:>>D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sm   G%E,+G,
F6FFA GGG'I7)$HI7
H-H((H--=I77I;>I;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|          |	                                }|t          d          t          |	                                          D ][\  }}|t          k    r ||           |t          k    r ||           3|t          k    r ||           Jt          d|           	 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 zexpected pkt tailrW  )r  rD  r   r?   r  r   r   r   r   rI  r5  rF  r:   r<   r;   )rZ   rv  r  r  rQ  r  r  r  r  r   rK  r  subdirr   r  retr[  r\  s                     r\   r  zTraditionalGitClient.archive  s    #'--0A4"H"Hx !	M !	M!$$%:V%CDDD  
!:;;;"% @ @F(()>????!$$%:V%CDDD  &&&A))++" A A A/77S@Ai3'>>!	M !	M !	M !	M !	M !	M !	M !	M  C6MM(( B&s122w~~e'<'<'C'CGY'W'WXXX$%@%@%@AAA%%''C$%89995e6H6H6J6JKK M M
d111Jt$$$$777HTNNNN444K%%%%()KT)K)KLLLM3!	M !	M !	M !	M !	M !	M !	M !	M !	M !	M !	M !	M !	M !	M !	M !	M !	M !	Ms=   BHB43H4
C>CCH0DHHHr^   r   r  r   )r`   ra   rb   rc   DEFAULT_ENCODINGrY   r)  r   r   r   r  r  rA   r
   r  r   r  r~  rC  rK   r  r  r  r  r  s   @r\   r  r    s       !!%5 # # # # # # # +/	" "" CJ" #3-	"
 
x"d(+Xbi-@@	A" " " ",\P \P \P \PH *.*.HU HU T#Y'HU #3-HU HU HU HUZ +/*.	6 6 #3-6 T#Y'	6 6 6 6z -M 
-M -M -M -M -M -M -M -Mr]   r  c                        e Zd ZdZdd fdZed             Zd Z	 ddede	e
ef         d	ee         deeeg ef         eee                  f         fd
Z xZS )TCPGitClientz8A Git Client that works over TCP directly (i.e. git://).NrV   c                 h    |t           }|| _        || _         t                      j        di | d S r  )r=   _host_portr   rY   )rZ   hostportrq  r   s       r\   rY   zTCPGitClient.__init__  s>    <D

""6"""""r]   c                 ,     | |j         fd|j        i|S )Nr(  )hostnamer(  ry  s      r\   rx  zTCPGitClient.from_parsedurl  s$    s9%EEINEfEEEr]   c                     | j         }| j        | j        t          k    r|d| j         z  }t          d||ddf          S )N:git )r%  r&  r=   r   rZ   rv  netlocs      r\   rt  zTCPGitClient.get_url  sK    :!djL&@&@&$*&&&F5&$B7888r]   r  rv  rM  c                 r   t          |t                    st          |          t          |t                    s|                    | j                  }t          j        | j        | j        t
          j	        t
          j
                  }d t          d| j                   }|D ]\  }}}}	}
t          j        |||                              t
          j        t
          j        d           	                     |
            n1# t          $ r$}|}                                 d Y d }~d }~ww xY w|                    dd                              dd          dfd}t%          j        j        || j        	          }|                    d
          r
|dd          }|dk    r|t.          | _        n|| _        nt2          | _        |dk    r| j        dk    rd| j        z  }nd}|                    d|z   |d| j                            d          z   |z              |fdd fS )Nzno address found for r   rbwbr   rV   c                                                                                                                             d S r   r  )rfileswfiles   r\   r  z$TCPGitClient._connect.<locals>.closeE  s.    KKMMMKKMMMGGIIIIIr]   rn  s   /~r  r   s     version=%d r]      git-s   host=r>  c                  "    t                     S r   )rr   )r7  s   r\   <lambda>z'TCPGitClient._connect.<locals>.<lambda>f  s    .q11 r]   r^   )r   r)  r*  rE  r  socketgetaddrinfor%  r&  	AF_UNSPECSOCK_STREAMr{   
setsockoptIPPROTO_TCPTCP_NODELAYconnectr  makefilerA   rY  r  rf  r   r5   rM  r6   send_cmd)rZ   r  rv  rM  	sockaddrserrfamilysocktypeprotof	canonnamesockaddrer  r   version_strr6  r7  r8  s                  @@@r\   r  zTCPGitClient._connect$  s    #u%% 	!C.. $&& 	;;;t9::D&J
F$4f6H
 
	 :dj::;;=F 
	 
	9FHfifh77ALL+V-?CCC		(###   =GGIII	
 9I

4$$

4##	 	 	 	 	 	 	 	
 JK 1	
 
 
 ??5!! 	8D.  '(J%%(8%%$ED!.  T%:a%?%?
 .0EEKKKcM4DJ,=,=g,F,F!F!T	
 	
 	
 1111477s   1D
D6D11D6r   r^   )r`   ra   rb   rc   rY   r  rx  rt  r)  r   r   r   r  r  rA   r
   r  r   r  r  r  s   @r\   r#  r#    s        BB# # # # # # # F F [F9 9 9 +/	B8 B8B8 CJB8 #3-	B8
 
x"d(+Xbi-@@	AB8 B8 B8 B8 B8 B8 B8 B8r]   r#  c                   >    e Zd ZdZddZed             Zd ZddZdS )	SubprocessWrapperz:A socket-like object that talks to a subprocess via pipes.rV   Nc                 r    || _         t          |j                  j        | _        |j        j        | _        d S r   )procr   stdoutrY  stdinr  )rZ   rS  s     r\   rY   zSubprocessWrapper.__init__l  s-    	"4;//4	Z%


r]   c                     | j         j        S r   )rS  r  r   s    r\   r  zSubprocessWrapper.stderrq  s    yr]   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msvcrtrY  rS  rT  rq   r   rr   )rZ   rY  r~   s      r\   rK  zSubprocessWrapper.can_readu  ss    <7"",,,,,,"]49#3#:#:#<#<==F$V,,11#DI$4$;$;$=$=>>>r]   c                    | j         j                                         | j         j                                         | j         j        r| j         j                                         | j                                          d S r   )rS  rU  r  rT  r  waitr   s    r\   r  zSubprocessWrapper.close~  sk    		   9 	%I""$$$	r]   r^   )	r`   ra   rb   rc   rY   propertyr  rK  r  rd   r]   r\   rQ  rQ  i  sl        DD& & & &
     X ? ? ?     r]   rQ  c                      t           j        dk    rM	 ddl} ddl}	 |                    d          \  }}|gS # | j        $ r g dcY S w xY w# t          $ r g dcY S w xY wdgS )z3Find command to run for system Git (usually C Git).rX  r   Nr-  )r  z/cr-  )rZ  r[  
pywintypeswin32apiFindExecutabler   ImportError)ra  rb  r   r-  s       r\   find_git_commandre    s    
|w
	,OOO,&55e<<u# , , ,++++++,  	( 	( 	(''''''	( ws    A
 6 AA
AAc                       e Zd ZdZed             ZdZ	 d	dedeee	f         de
e         deeeg ef         e
ee                  f         fdZdS )
r  z5Git client that talks to a server using a subprocess.c                      | di |S r  rd   ry  s      r\   rx  z"SubprocessGitClient.from_parsedurl      s}}V}}r]   Nservicerv  rM  rV   c                    t          |t                    st          |          t          |t                    r|                    | j                  }| j        t                      }g ||                    d          |}t          j        |dt          j	        t          j	        t          j	                  }t          |          }t          |j        |j        |j        | j                  |j        |j        fS )Nr>  r   bufsizerU  rT  r  r9  )r   r)  r*  r   r  git_commandre  
subprocessPopenPIPErQ  rA   rY  r  r  rf  rK  r  )rZ   ri  rv  rM  rm  argvppws           r\   r  zSubprocessGitClient._connect  s     '5)) 	%G$$$dE"" 	;;;t9::D#*,,K<<gnnW55<t</??
 
 
 q!! $ 5	   KH	
 		
r]   r   )r`   ra   rb   rc   r  rx  rm  r)  r   r   r   r  r  rA   r
   r  r   r  rd   r]   r\   r  r    s        ??  [ K +/	
 

 E3J
 #3-	

 
x"d(+Xbi-@@	A
 
 
 
 
 
r]   r  c                      e Zd ZdZ	 	 	 ddedee         ddfdZd Ze	d	             Z
e	d
             Zd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ee                  dee         dee         fdZ	 	 	 	 	 ddeee                  dee         dee         defdZ	 	 ddee         deee                  fdZdS )r  z5Git Client that just uses a local on-disk repository.TNrm  configrV   c                     || _         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)rf  )rZ   rm  rn  ru  s       r\   rY   zLocalGitClient.__init__  s     !0r]   c                 *    t          dd|ddf          S )Nfiler.  )r   ru  s     r\   rt  zLocalGitClient.get_url  s    62tR4555r]   c                      | di |S r  rd   ry  s      r\   rx  zLocalGitClient.from_parsedurl  rh  r]   c                     t          |t                    st          j        |          }t	          t          |                    S r   )r   r   r  fsdecoder   rR   )rz  rv  s     r\   
_open_repozLocalGitClient._open_repo  s7    $$$ 	%;t$$DtDzz"""r]   c                    |sd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    r5|j                            |
||          sd|
 d	| } ||           |||
<   `|j                            |
|          s |d
|
            d||
<   	 ddd           n# 1 swxY w Y   t          ||          S )a'  Upload a pack to a local on-disk 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

        rV   Nc                     d S r   rd   rU  s    r\   rQ  z*LocalGitClient.send_pack.<locals>.progress  rV  r]   c                 (    g | ]}|t           k    |S rd   r#  )r%  sha1s     r\   r'  z,LocalGitClient.send_pack.<locals>.<listcomp>  s"    KKKT$(:J:JD:J:J:Jr]   )r   Tr  zunable to set z to zunable to remove zunable to remover^   )r|  r  r   r   r   r>   r   r   r  r  r  add_pack_datar   r   set_if_equalsremove_if_equals)rZ   rv  r  r|  rQ  r  r  r  r  r  r/  r1  r   r0  msgs                  r\   r~  zLocalGitClient.send_pack  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FwFFHFF .1
7+!;77JJ A !>W!>!>???.@
7+
A/!	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	A !	AF h:>>>>s   C4G*C G**G.1G.rv  r  r  rQ  rL  r  r  rM  c	                     |                      |          5 }
|
                    ||||          }t          ||
j                                        t                                cddd           S # 1 swxY w Y   dS )ab  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
          ref_prefix: List of prefixes of desired references, as a list of
            bytestrings. Filtering is done by the server if supported, and
            client side otherwise.
          filter_spec: A git-rev-list-style object filter spec, as bytestring.
            Only used if the server supports the Git protocol-v2 'filter'
            feature, and ignored otherwise.

        Returns:
          FetchPackResult object

        )r  rQ  rL  N)r|  r  r   r   get_symrefsrB   )rZ   rv  r  r  rQ  rL  r  r  rM  rq  rr   s               r\   r  zLocalGitClient.fetch  s    F __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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 )a  Retrieve a pack from a local on-disk repository.

        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
          ref_prefix: List of prefixes of desired references, as a list of
            bytestrings. Filtering is done by the server if supported, and
            client side otherwise.
          filter_spec: A git-rev-list-style object filter spec, as bytestring.
            Only used if the server supports the Git protocol-v2 'filter'
            feature, and ignored otherwise.

        Returns:
          FetchPackResult object

        )rQ  rL  N)other_haves)r|  find_missing_objectsget_remote_hasrC  r   r  rB   r   r   r  r  )rZ   rv  r  rJ  rP  rQ  rL  r  r  rM  r  missing_objectsr  
object_idsr   r   s                   r\   r  zLocalGitClient.fetch_packJ  sn   D __T"" 	Aa44 5  O *88::Ko..Jf((**G NNE !&tWe<<	A 	A 	A 	A 	A 	A 	A 	A &1>:;    #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 )z:Retrieve the current refs from a local on-disk repository.N)r|  r  )rZ   rv  rM  r  r  s        r\   r  zLocalGitClient.get_refs~  s     __T"" 	%f??$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   7;;)TNNr   r  r  r   )r`   ra   rb   rc   r  r   r   rY   rt  r  rx  r|  r~  r   rR   r
   r   r)  r  rC  rK   r  r   r  r  rd   r]   r\   r  r    s>       ??  #'	0 00  	0
 
0 0 0 0 6 6 6   [ # # [#
:? :? :? :?D 6:#*.'+*.*O *O*O *O "d5%<((3-8$u+EF
	*O 8UGTM23*O }*O T#Y'*O e_*O #3-*O *O *O *Od *.'+*.2A 2A T#Y'2A e_2A #3-2A 
2A 2A 2A 2An +/*.	% % #3-% T#Y'	% % % % % %r]   r  c                   8    e Zd ZdZ	 	 	 	 	 	 ddee         fdZdS )	SSHVendorz!A client side SSH implementation.NrM  c	                 *    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
          protocol_version: Desired Git protocol version. By default the highest
            mutually supported protocol version will be used.
        )rs  run_command)	rZ   r'  commandusernamer(  passwordkey_filenamessh_commandrM  s	            r\   r  zSSHVendor.run_command  s    6 "$"2333r]   r  r`   ra   rb   rc   r   r  r  rd   r]   r\   r  r    sU        ++ *.4 4 #3-4 4 4 4 4 4r]   r  c                   $     e Zd ZdZd fdZ xZS )StrangeHostnamez,Refusing to connect to strange SSH hostname.rV   Nc                 J    t                                          |           d S r   )r   rY   )rZ   r*  r   s     r\   rY   zStrangeHostname.__init__  s!    """""r]   r^   )r`   ra   rb   rc   rY   r  r  s   @r\   r  r    sC        66# # # # # # # # # #r]   r  c                   8    e Zd ZdZ	 	 	 	 	 	 ddee         fdZdS )SubprocessSSHVendorz6SSH vendor that shells out to the local 'ssh' command.NrM  c	                    |t          d          |r.dd l}	g |	                    |t          j        dk              d}
nddg}
|r$|
                    dt          |          g           |r$|
                    dt          |          g           |t          }|dk    r|
                    d	d
| g           |r| d| }|                    d          rt          |          |

                    |           t          j        g |
|dt          j        t          j        t          j                  }t          |          S )Nz6Setting password not supported by SubprocessSSHVendor.r   rX  posixz-xsshz-p-iz-ozSetEnv GIT_PROTOCOL=version=@-r*  rk  )rs  shlexr   rZ  r[  extendr   r5   r   r  r   rn  ro  rp  rQ  )rZ   r'  r  r  r(  r  r  r  rM  r  argsrS  s               r\   r  zSubprocessSSHVendor.run_command  s    %H    	!LLLSU[[CLG4K[LLSdSDD4=D 	+KKs4yy)*** 	3KKs<001222#AaKKP>NPPQRRR 	(''''D??3 	1!40000DdG/??
 
 
 !&&&r]   r  r  rd   r]   r\   r  r    sU        @@ *./' /' #3-/' /' /' /' /' /'r]   r  c                   8    e Zd ZdZ	 	 	 	 	 	 ddee         fdZdS )PLinkSSHVendorz8SSH vendor that shells out to the local 'plink' command.NrM  c	                 0   |r.dd l }	g |	                    |t          j        dk              d}
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        t          j                  }|t          }|dk    rd| |d<   t!          j        g |
|dt           j        t           j        t           j        |          }t'          |          S )Nr   rX  r  z-sshz	plink.exeplinkzHInvoking PLink with a password exposes the password in the process list.z-pwz-Pr  r  r  r  zversion=GIT_PROTOCOL)rl  rU  rT  r  env)r  r   rZ  r[  r   r   r  r   r   r  r   r   deepcopyr  environr5   rn  ro  rp  rQ  )rZ   r'  r  r  r(  r  r  r  rM  r  r  r   r  rS  s                 r\   r  zPLinkSSHVendor.run_command  s     	%LLLUU[[CLG4K[LLUfUDD\W$$(DDV$DOOOMM    KKH./// 	+KKs4yy)*** 	3KKs<001222 	(''''D??3 	1!40000D mBJ''#Aa"?-="?"?CdG/??
 
 
 !&&&r]   r  r  rd   r]   r\   r  r    sU        BB *.<' <' #3-<' <' <' <' <' <'r]   r  c                  \    dd l }|                    dt                     ddlm}  |di | S )Nr   zDParamikoSSHVendor has been moved to dulwich.contrib.paramiko_vendor.r   )ParamikoSSHVendorrd   )r   r   r   contrib.paramiko_vendorr  )rq  r   r  s      r\   r  r  ,  sR    OOOMMN   ;:::::&&v&&&r]   c                        e Zd Z	 	 	 	 	 	 	 d	 d fdZd Zed             Zd Z	 ddede	e
ef         d	ee         deeeg ef         eee                  f         fd
Z xZS )SSHGitClientNrV   c	                 R   || _         || _        || _        || _        || _        |p<t
          j                            dt
          j                            d                    | _         t                      j
        di |	 i | _        |	|| _        d S t                      | _        d S )NGIT_SSH_COMMANDGIT_SSHrd   )r'  r(  r  r  r  r  r  r   r  r   rY   alternative_paths
ssh_vendorget_ssh_vendor)rZ   r'  r(  r  vendorru  r  r  r  rq  r   s             r\   rY   zSSHGitClient.__init__=  s     		  (& 
"*..rz~~i88+
 +
 	""6"""57$DOOO,..DOOOr]   c                     | j         }| j        |d| j         z  }| j        t          | j        d          dz   |z   }t	          d||ddf          S )Nr,  z@/:r  r  r.  )r'  r(  r  urlquoter   r/  s      r\   rt  zSSHGitClient.get_urlX  s_    9 o$)oo%F=$dmU33c9FBF5&$B7888r]   c                 8     | d|j         |j        |j        d|S )N)r'  r(  r  rd   )r*  r(  r  ry  s      r\   rx  zSSHGitClient.from_parsedurlb  s;    s 
#'
 
 	
 
 	
r]   c                 p    | j                             |d|z             }t          |t                    sJ |S )Nr:  )r  r   r   r)  )rZ   r  s     r\   _get_cmd_pathzSSHGitClient._get_cmd_pathk  s9    $((gm<<#u%%%%%
r]   r  rv  rM  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 ''r  r  r  )r(  r  rM  r9  r  )r   r)  r*  r   r  r   r  r  r  r  r  r  r'  r(  r  rA   rY  r  r  rf  rK  r   )rZ   r  rv  rM  rq  rq  cons          r\   r  zSSHGitClient._connectp  s{    #u%% 	!C.. dE"" 	;;;t9::D??4   	8Ds##**4+EFF  	 =$!%F:(%)%6F>"'$($4F=!)do)I
 ]-
 
 
 
 		 $ 5	   LC4((	
 		
r]   )NNNNNNNr^   r   )r`   ra   rb   rY   rt  r  rx  r  r)  r   r   r   r  r  rA   r
   r  r   r  r  r  s   @r\   r  r  <  s        / 
/ / / / / /69 9 9 
 
 [
   +/	+
 +
+
 CJ+
 #3-	+

 
x"d(+Xbi-@@	A+
 +
 +
 +
 +
 +
 +
 +
r]   r  c                  z    d                     d                    d t          j        D                                 S )Nzgit/dulwich/{}.c                 ,    g | ]}t          |          S rd   )r   r$  s     r\   r'  z-default_user_agent_string.<locals>.<listcomp>  s    ,Q,Q,QSVV,Q,Q,Qr]   )r  r-  dulwich__version__rd   r]   r\   default_user_agent_stringr    s6     ""388,Q,QW=P,Q,Q,Q#R#RSSSr]   )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}|z||j	        }t          |t                    s|                                }t          |          }|j        # |j        |j         d|j        pd           }ni } ||f||
d|}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   r,  r.  )proxy_basic_auth)proxy_headersheadersr  rd   )r  r  r   check_for_proxy_bypassKeyErrorget_booleanr  r   urllib3ProxyManagerr   r   r   r   r  make_headersr  PoolManager)ru  pool_manager_clsproxy_manager_clsbase_urloverride_kwargsproxy_server
user_agentr  
ssl_verify	proxynamer  rq  r  proxy_server_urlr  managers                   r\   default_urllib3_managerr    s   * !%$L:  HzC 	 	I:>>)44L    !(++ 	 L%zz'8<<   	G\::JJ 	 	 	D		++G\BBJJ 	 	 	JJJ		zz'<88HH 	 	 	HHH	 .00
Z(G 	HF T-{	u		){ .{
MM/"""NNN$ ' 4,,, 	1'..00L#L11$00G0$4$=!a!a@P@Y@_]_!a!a  MM M##
(5w
 
JP
 
 #&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  r  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	            r\   r  r  	  s    0(z~~j11 .	( "(++J!*H ((    '"+"6"6x"@"@KK! ' ' '"&KKK' #/"4"4S"9"9&5 ( (N%3%9%9%;%;N% ()7)=)=)?)?)7)>)>* * ' 0>9B9M9M$25 :N :" :" 6 6 $. > > >9= 6 6 6>5 0#.2H#H#H+/44)S00#'44#~55#'44.0 ' $,,^<< (#'445s$   A A('A(CC-,C-c                   j   e Zd ZdZdddZddZ	 	 ddee         deee	                  de
ee	ef         ee         eee	e	f         ee	ef         f         fd	Zd
 ZddZ	 	 	 	 	 ddeee	                  dee         fdZ	 	 ddee         deee	                  fdZd Zd Zed             Zdef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.
    FrV   Nc                 r    |                     d          dz   | _        || _        t          j        | fi | d S N/)r   	_base_urldumbrd  rY   )rZ   r  r  rq  s       r\   rY   zAbstractHttpGitClient.__init__F	  s@    !--3	4**6*****r]   c                 *    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.

        Raises:
          GitProtocolError
        )rs  _http_request)rZ   ri   r  r\  s       r\   r  z#AbstractHttpGitClient._http_requestK	  s    " "$"4555r]   rM  r  c                 0    ||t           vrt          d|           d         dk    sJ d}ddi} j        durd|d                                        d	                    z  }d
k    r'|t
           _        n| _         j        dk    rd|d<   nt           _        t          |          } 	                    ||          \  }}	|j
        rb|j
                            |          st          d| d|j
         d|           t          ||j
        d t          |                              	 |j        d u p|j                            d            _         j        s9 fd}
t!          |	d           }t#          |          }|t           vrt          d| d          |r||k    rt          d| d          | _         j        dk    rP |
|          \  }}}	}t%          |                                          \  }}}||||f|                                 S 	 t+          |                                          \  }n"# t          $ r}t          d          |d }~ww xY w|                    d          dz   k    rt          d|d          t#          |          }|t           vrt          d| d          |r||k    rt          d| d          | _         j        dk    r6 |
|          \  }}}	}t%          |                                          \  }}}nZt/          |                                          \  }}t1          |          \  }}t3          |          \  }}t5          |          }||||f|                                 S d _        t1          t7          |                    \  }}t5          |          }|t9                      i |f|                                 S # |                                 w xY w)Nr  r3  r  z	info/refsAcceptz*/*Tz?service={}r>     git-upload-packr   	version=2Git-ProtocolzRedirected from URL z to URL z	 without zapplication/x-git-c                 x   t          |                                           }t          ddg}D ]}|                    d|z              d                    t          d          dt          | g          }	                    
                    d          |          \  }}t          |d           } |||| fS )Nr  r  r  r]   r	  r
  r>  )
r   rF  r  r   r-  rH   rI   _smart_requestr   rA   )r   r   pktsr  bodyresprY  r  r  rZ   ri  s          r\   begin_protocol_v2zEAbstractHttpGitClient._discover_references.<locals>.begin_protocol_v2	  s    *B5CUCUCWCW*X*X'!)%7
 #D #- = =NV$;<<<<88!"677'4.Q D "&!4!4w//4" "JD$ %T400E.dEAAr]   r  r  z%unexpected number of packets receivedr   s
   # service=zunexpected first line z from smart serverr   )r7   r   r  r  r   r5   rM  r6   r   r  redirect_locationr  r   ro   content_typer   rA   r   r   rF  r  rC  r   r   rQ   rb  rF   rP   r   )rZ   ri  r  rM  r  tailr  ri   r  rY  r  r   r  r   r   r   r   r   r  r   s   ``` `               r\   _discover_referencesz*AbstractHttpGitClient._discover_references^	  s7    ( (===O=MOOPPP|s""""U#9D  M(()@)@AAAD ,,,#+,ND)),<D)(A--.9GN+(I%h%%''W55
d! 	J)22488 &_3__8N__Y]__   sD$:<c$iiZ<$HIIH\	)T1 9J9U9U$: : 6DI 9 V9B B B B B B B B. !t,,*DU*K*K'*2GGG$`8O```   $ (?BR(R(R$\4K\\\   )@%(A--=N=Nu=U=U:'tU.>u?Q?Q?S?S.T.T+T7F!4hOb JJLLLL]# $U%7%7%9%9 : :% # # #.C "## zz%((]W-DEE.NSNNN  
 /I.O.O+.6KKK(d<Sddd   ( ,CFV,V,V(`8O```   -DD),11ARAR!B B>+T4 3C5CUCUCWCW2X2X/w
 -U-?-?-A-ABB /):4)@)@v+E/, ,(% &1#4T:#F#FD!4hO JJLLLL )*%!2>$3G3G!H!Hv),T:>>DSUUHb&8JJLLLLDJJLLLLs9   6CO? (#I O? 
I+I&&I++D O?  A
O? ?Pc                    |d         dk    sJ t          ||          }d| d}d| d|d}| j        dk    rd|d	<   t          |t                    rt	          t          |                    |d
<   |                     |||          \  }}|j                            d          d         |k    rt          d|j                   ||fS )zSend a 'smart' HTTP request.

        This is a simple wrapper around _http_request that sets
        a couple of extra headers.
        r3  r  zapplication/x-z-resultz-request)Content-Typer  r   r  r  zContent-Length;r   z"Invalid content-type from server: )
r   rM  r   r)  r   ro   r  r  r   r   )rZ   ri  ri   r\  result_content_typer  r  rY  s           r\   r  z$AbstractHttpGitClient._smart_request	  s     2w#~~~~c7##?w???>W>>>)
 
  A%%&1GN#dE"" 	7(+CIIG$%''Wd;;
d""3''*.AAA"HT5FHH   Tzr]   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 )Nr  )r  rH   r  r  r(   r  r   )	r  r   r  rP  r|  r  r  r  rZ   s	       r\   body_generatorz7AbstractHttpGitClient.send_pack.<locals>.body_generator)
  s      1'8 N & $ $smm####););##/3JJ* * *&OY
 %%h// J-oyIIIIIIIIIIIJ Jr]   zgit-receive-pack)r\  )_get_urlr  r  r  rC   r*   r   rg  r   r  r   r   r  r  rs  r  r  rA   r  r  )rZ   rv  r  r|  rQ  ri   r   r   r   r   r  r  rY  
resp_protor   r  r  r  s   `  `           @@@r\   r~  zAbstractHttpGitClient.send_pack 
  s   & mmD!!>B>W>W?
 ?
;%sGV 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 (();S~~GWGW(XX
d	!$--J773X J "(%JOOOJJLLLLDJJLLLLs   %8F2 2Gc
           	         |                      |          }
|                     d|
|	|          \  }}}
}}|                     |          \  }}}|s|r|}| |||          }n ||          }|d |D             }|st          |||          S | j        rt          | j                  t                      }t          d|j	                  }t          ||||d|| j                  \  }}| j        dk    rst          d          d	z   }t          |t          t                    r|r|t          d
|z            z  }n|r|                                  ||                                z  }n*|r|                                  |                                }|                     d|
|          \  }}	 t          |d          }|&|$t'          |                                          \  }}t+          |||||| j                   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
          ref_prefix: List of prefixes of desired references, as a list of
            bytestrings. Filtering is done by the server if supported, and
            client side otherwise.
          filter_spec: A git-rev-list-style object filter spec, as bytestring.
            Only used if the server supports the Git protocol-v2 'filter'
            feature, and ignored otherwise.
          protocol_version: Desired Git protocol version. By default the highest
            mutually supported protocol version will be used.

        Returns:
          FetchPackResult object

        r  rM  r  Nr  c                 (    g | ]}|t           k    |S rd   r#  r  s     r\   r'  z4AbstractHttpGitClient.fetch_pack.<locals>.<listcomp>v
  s    ===SSH__S___r]   )rK  rL  rM  r   r  r
  r  zgit-upload-packr  )r  r  r  r   r  rs  r  r   rA   r  rO  rM  rH   r;  r#   r$   r  getvaluer  r  rF  r]  r  )rZ   rv  r  rJ  rP  rQ  rL  r  r  rM  ri   r   r   r   r   r  capa_symrefsr   r[   req_data	req_protor   r   r\  r  rY  r  s                              r\   r  z AbstractHttpGitClient.fetch_packA
  s   D mmD!!:>:S:S-!	 ;T ;
 ;
7!3 445HII		
# 	#< 	#"G#OD666EE#OD))E==E===E 	9"4%8889 	7%do66699T8>22	'?#!2(
 (
 (
$m  A%%.//'9D+-=?P ,  	, +!=>>> ,))+++H%%'''DD ,))+++$$&&D(():CFF
d	!$--J"}'</D++--0 0,m %'!%!6    #4%mTTJJLLLLDJJLLLLs   /A$H( (H>c                     |                      |          }|                     d|||          \  }}}}}|                                D ]\  }}	|	||t          z   <   |S )r  r  r  )r  r  r   rJ   )
rZ   rv  rM  r  ri   r   r  r   r/  r  s
             r\   r  zAbstractHttpGitClient.get_refs
  s|     mmD!! $ 9 9-!	 !: !
 !
aAv "( 	9 	9GX08D,,--r]   c                 R    |                      |                              d          S r  )r  r   ru  s     r\   rt  zAbstractHttpGitClient.get_url
  s"    }}T""))#...r]   c                 X    t          | j        |                              d          dz   S r  )r   r  r   ru  s     r\   r  zAbstractHttpGitClient._get_url
  s'    t~t,,33C883>>r]   c                     |j         }|t          |          |d<   |j        }|t          |          |d<    | t          |          fi |S )Nr  r  )r  
urlunquoter  r   )rz  r{  rq  r  r  s        r\   rx  z$AbstractHttpGitClient.from_parsedurl
  sb    %!+H!5!5F:%!+H!5!5F:s:i((33F333r]   c                 P    t          |           j         d| j        d| j        dS )Nr   z, dumb=r   )r   r`   r  r  r   s    r\   r   zAbstractHttpGitClient.__repr__
  s.    t**%OOOOOOOOr]   )Fr^   r   r   r  )r`   ra   rb   rc   rY   r  r   r  rC  rK   r  r   r  r   r)  r   r  r  r~  r  r  rt  r  r  rx  r   rd   r]   r\   r  r  =	  s        + + + + +
6 6 6 6. +/*.H H #3-	H
 T#Y'H 
S(]SZd38nd3=>QQ
H H H HT  0? ? ? ?N *.*.f f T#Y'f #3-f f f fV +/*.	  #3- T#Y'	   $/ / /? ? ? 4 4 [4P# P P P P P Pr]   r  c                 "     ddl m  fd}|S )Nr   )ProtocolErrorc                  j    	  | i |S # $ r"}t          t          |                    |d }~ww xY wr   )r   r   )r  rq  r   r(  funcs      r\   wrapperz)_wrap_urllib3_exceptions.<locals>.wrapper
  sR    	:4(((( 	: 	: 	:"3u::..E9	:s    2-2)urllib3.exceptionsr(  )r*  r+  r(  s   ` @r\   _wrap_urllib3_exceptionsr-  
  s;    000000: : : : : : Nr]   c                   <     e Zd Z	 	 	 	 	 d	 d fdZd ZddZ xZS )	Urllib3HttpGitClientNrV   c                 <   || _         || _        |t          ||          | _        n|| _        |G| d|pd }dd l}	|	j                            |          }
| j        j                            |
           || _	         t                      j        d||d| d S )N)r  r,  r.  r   )
basic_auth)r  r  rd   )	_username	_passwordr  pool_managerurllib3.utilutilr  r  r   ru  r   rY   )rZ   r  r  r4  ru  r  r  rq  credentialsr  r1  r   s              r\   rY   zUrllib3HttpGitClient.__init__
  s     "! 7 R R RD ,D &88B88K 22k2JJJ%,,Z888@(@@@@@@@r]   c                     t          |t                    s|                    d          }t          | j        |                              d          dz   S )Nr   r  )r   r   r   r   r  r   ru  s     r\   r  zUrllib3HttpGitClient._get_url
  sL    $$$ 	( ;;w''Dt~t,,33C883>>r]   c                    dd l }| j        j                                        }||                    |           d|d<   	 || j                            d||d          }n| j                            d|||d          }n4# |j        j        $ r"}t          t          |                    |d }~ww xY w|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
         d|           |j                            d          |_        	 |                                }||k    r|nd|_        n)# t$          $ r |                                |_        Y nw xY w|t)          |j                  fS )Nr   zno-cachePragmaGETF)r  preload_contentPOST)r  r
  r<  i  i  zWWW-Authenticatei  zProxy-Authenticate   zunexpected http resp z for r  r.  )r,  r4  r  r   r   request
exceptions	HTTPErrorr   r   r   r   rf   r   rk   r  geturlr  AttributeErrorget_redirect_locationr-  rY  )	rZ   ri   r  r\  r  req_headersr  rN  resp_urls	            r\   r  z"Urllib3HttpGitClient._http_request  s   !!!!'/4466w''' *H
	2|(003U 1   (00C4QV 1   !+ 	2 	2 	2"3q66**1	2 ;#"";#"4<#3#34F#G#GMMM;#'(8(89M(N(NPSTTT;#"#R4;#R#RS#R#RSSS L,,^<<	I{{}}H
 2:SXXbD""	  	B 	B 	B%)%?%?%A%AD"""	B
 -di8888s+    A B B2B--B22F #F<;F<r  r^   r   )r`   ra   rb   rY   r  r  r  r  s   @r\   r/  r/  
  s         A 
A A A A A A>? ? ?&9 &9 &9 &9 &9 &9 &9 &9r]   r/  c                    | 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	          dd
lm}  |||z             S )zVConvert a file: URL to a path.

    https://datatracker.ietf.org/doc/html/rfc8089
    rx  	localhostr.  r   r   r   )r,  z:/Nz%Non-local file URLs are not supported)url2pathname)schemero   isalphars  
nturl2pathrI  )parsedr  r0  rv  rI  s        r\   _win32_url_to_pathrN  .  s    
 =F""""%AvtQ1F	KKK11I 1Q3K;&& !"IJJJ''''''<&&&r]   ri   ru  	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rQ  ru  rO  )r    _get_transport_and_path_from_url)ri   ru  rO  rq  s       r\   get_transport_and_path_from_urlrU  I  sO    " vs)v2EGGG+i 39  r]   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         d	          )Nr-  )zgit+sshr  )httphttpsru  rx  rX  ntzunknown scheme 'r  rd   )r   rJ  r#  rx  rv  r  HttpGitClientrZ  r[  r  r   default_local_git_client_clsrN  r   )ri   ru  rO  rq  rM  s        r\   rT  rT  b  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
 	

 8888
9
99r]   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'  rv  user	user_hosts        r\   parse_rsync_urlra  x  s    
h3h..~~c1--t	"..a00	4)"))#q11JD$$DDD6777$r]   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.

    NrQ  rR  rS  rX  r   r   r   z:\r  rd   )	r   rT  r   rZ  r[  rK  r[  ra  r  )r\  ru  rO  rq  r  r*  rv  s          r\   get_transport_and_pathrc    sA   ( #FHI<OQQQ/
#y
 
<B
 
 	
     |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-  r7  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 )Nr2  )openr   r   rJ  r*  r  r  FileNotFoundError)rJ  r*  r  fnamesfnamer  r  parsed_lines           r\   get_credentials_from_storerj    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^   )NNNr   )rc   r   r   r  rp   r=  rn  rZ  collections.abcr   r   
contextlibr   ior   r   typingr   r	   r
   r   r   r   urllib.parser   r  r   r%  r   r   r   r   r  r  ru  r   r   r   errorsr   r   r   packr   r   r   r   protocolr   r    r!   r"   r#   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   rG   rH   rI   r   rJ   rK   rL   rM   rN   rO   rP   rQ   reporR   r  r)  r  	getLoggerr`   r+  rX   rU   rf   rk   rr   r   COMMON_CAPABILITIESrh  rj  r   r  r   r   r  r   r   r   r   r   r  r  r  r5  r;  rO  r]  rb  rd  r  r  r  r#  rQ  rC  r   re  r  r  r[  r  r  r  r  r  r  r  r  r  r  r  r  r-  r/  rZ  rN  rU  rT  ra  rc  rv  
expanduserDEFAULT_GIT_CREDENTIALS_PATHSrj  rd   r]   r\   <module>rx     s  , (   				       



 . . . . . . . .       & & & & & & & &                + * * * * * . . . . . . 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           , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	       x(  
	8	$	$
 
 
 
 
9 
 
 
    y       I   : : :
   ,-EF !	
     02 02 02 02 02 02 02 02f    $ $ $!
4utE5L14u3EEF! ! ! !2*tE5L'93u:'E!F * * * *(M] M] M] M] M] M] M] M]`FK FK FK FK FK FK FK FKR( ( (&8 8 8 8 8 8 8 8v
Xe_ 
%U
BS9T 
 
 
 
  P( P( P(p 378 8e*8 &	8
 x./8 
8 8 8 8v  .e
 e
 e
 e
 e
 e
 e
 e
P$ $ $ $" " "lM lM lM lM lM9 lM lM lM^V8 V8 V8 V8 V8' V8 V8 V8r       :$s)    $'
 '
 '
 '
 '
. '
 '
 '
TD% D% D% D% D%Y D% D% D%P  . 4 4 4 4 4 4 4 4B# # # # #i # # #2' 2' 2' 2' 2') 2' 2' 2'j?' ?' ?' ?' ?'Y ?' ?' ?'D	' 	' 	' %_
 _
 _
 _
 _
' _
 _
 _
DT T T 	` ` 89` ` ` `F3 3 3 3 3lOP OP OP OP OPI OP OP OPd	 	 	M9 M9 M9 M9 M90 M9 M9 M9` %'# ' ' ' '8 KO 	v&:B3-
9c>   2: : :,c eHSM3,C&D    *  $#)I )I)IV)I })I
 9c>)I )I )I )IZ G+,,UM22!   $,I     r]   