o
    Uh                    @   s  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rbd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ZfegZheiejZkG dd delZmG dd delZnG dd delZodd Zpdd Zqe9e=gZre?e7e8e<gerZse;e3gerZtG dd dZudevfd d!Zwd"d# Zxdeyezegegf ezegegf ezegegf f fd$d%Z{deyezegegf e|eg f fd&d'Z}G d(d) d)Z~G d*d+ d+Zd,d- ZG d.d/ d/Zd0e	eg de
eyevegf  fd1d2Zd3d4 Zd5d6 Zde0dfd7e|eg d8eeggdf d9eeeggdf  ddfd:d;Zd<d= ZG d>d? d?Zd|d@dAZdBdC ZG dDdE dEeZG dFdG dGeZG dHdI dIZdee fdJdKZG dLdM dMeZG dNdO dOeZeZG dPdQ dQZG dRdS dSelZG dTdU dUeZG dVdW dWeZdXdY ZeZG dZd[ d[eZd\d] Z			d}ded^ fd_d`ZdefdadbZG dcdd ddeZdedf ZG dgdh dheZeZdefdidjZ	d~dkedlee# dmee deyeef fdndoZdpdq Zdredeyee eef fdsdtZ		d~dredlee# dmee deyeef fdudvZejdwe%dxdygZdefdzd{ZdS )a1  Client side support for the Git protocol.

The Dulwich client supports the following capabilities:

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

Known capabilities that are not supported:

 * no-progress
 * include-tag
    N)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dZdS )InvalidWantszInvalid wants.returnNc                 C   s   t | d| d S )Nz-requested wants not in server provided refs: )	Exception__init__)selfwants rZ   b/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/dulwich/client.pyrW      s   
zInvalidWants.__init__rU   N__name__
__module____qualname____doc__rW   rZ   rZ   rZ   r[   rT          rT   c                   @   rS   )HTTPUnauthorizedz!Raised when authentication fails.rU   Nc                 C      t | d || _|| _d S )NzNo valid credentials provided)rV   rW   www_authenticateurl)rX   re   rf   rZ   rZ   r[   rW         
zHTTPUnauthorized.__init__r\   r]   rZ   rZ   rZ   r[   rc      rb   rc   c                   @   rS   )HTTPProxyUnauthorizedz'Raised when proxy authentication fails.rU   Nc                 C   rd   )Nz#No valid proxy credentials provided)rV   rW   proxy_authenticaterf   )rX   ri   rf   rZ   rZ   r[   rW      rg   zHTTPProxyUnauthorized.__init__r\   r]   rZ   rZ   rZ   r[   rh      rb   rh   c                 C   s   t t| gg g dd dkS )z'Check if a file descriptor is readable.r   )lenselect)filenorZ   rZ   r[   _fileno_can_read   s   rm   c              	   C   sX   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)
ctypesrn   ro   rp   DWORDkernel32PeekNamedPipeOSErrorGetLastErrorvalue)handlern   ro   rp   c_avail	c_messagesuccessrZ   rZ   r[   _win32_peek_avail   s   r|   c                   @   s,   e Zd ZdZd
ddZdd Zd
dd	ZdS )ReportStatusParserzEHandle status as reported by servers with 'report-status' capability.rU   Nc                 C   s   d| _ d | _g | _d S NF)_done_pack_status_ref_statusesrX   rZ   rZ   r[   rW         
zReportStatusParser.__init__c              	   c   s    | j dvrt| j | jD ];}z
|dd\}}W n	 ty#   Y qw |dkr9|dd\}}||dfV  q|dkrC|dfV  qt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   )rX   statusrestreferrorrZ   rZ   r[   check   s    


zReportStatusParser.checkc                 C   sP   | j rtd|du rd| _ dS | jdu r| | _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)rX   pkt
ref_statusrZ   rZ   r[   handle_packet   s   
z ReportStatusParser.handle_packetr\   )r^   r_   r`   ra   rW   r   r   rZ   rZ   rZ   r[   r}      s
    
r}   rU   c                 C   s.   |   }|d ur| dkrdS | | dS )Ns	   version 2   r   )read_pkt_liner   unread_pkt_line)protor   rZ   rZ   r[   negotiate_protocol_version  s
   
r   c                 C   s    g }| D ]}| | qt|S N)r   set)rH   server_capabilitiesr   rZ   rZ   r[   read_server_capabilities
  s   r   c           	      C   s   i }i }i }| D ]G}| dd}|d }|dkrd }|d }|dd  D ]$}|dr6|dd  ||< q&|d	rD|d
d  ||< q&td| q&|||< q|||fS )N   
r   r   s   unbornr   r   s   peeled:   s   symref-target:   zunknown part in pkt-ref: %s)rstripr   
startswithloggingwarning)	rH   refssymrefspeeledr   partsshar   partrZ   rZ   r[   read_pkt_refs_v2  s"   



r   c                 C   s   d }i }| D ]'}| dd d\}}|dkrt|dd|d u r)t|\}}|||< qt|dkr9i t fS |ttikrAi }|d usGJ |t|fS )Nr   r   s   ERRr   replacer   )	r   r   r   r   rC   rj   r   r   r=   )rH   r   r   r   r   r   rZ   rZ   r[   read_pkt_refs_v1*  s   

r   c                       s   e Zd ZU dZh dZeee  ed< 	d	dddZ	ddd	Z
d
d ZdefddZdd ZdefddZdd Z fddZdefddZ  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_ATTRSNrU   c                 C   s"   || _ || _|| _|| _|| _d S r   )r   r   agentnew_shallownew_unshallow)rX   r   r   r   r   r   rZ   rZ   r[   rW   X  s
   
zFetchPackResult.__init__c                 C      dd l }|jdtdd d S )Nr   z!Use FetchPackResult.refs instead.   
stacklevelwarningswarnDeprecationWarningrX   r   rZ   rZ   r[   _warn_deprecateda     
z FetchPackResult._warn_deprecatedc                 C   s@   t |tr|   | j|kS | j|jko| j|jko| j|jkS r   )
isinstancedictr   r   r   r   rX   otherrZ   rZ   r[   __eq__j  s   



zFetchPackResult.__eq__c                 C      |    || jv S r   r   r   rX   namerZ   rZ   r[   __contains__t     
zFetchPackResult.__contains__c                 C      |    | j| S r   r   r   rZ   rZ   r[   __getitem__x  r   zFetchPackResult.__getitem__c                 C      |    t| jS r   r   rj   r   r   rZ   rZ   r[   __len__|  r   zFetchPackResult.__len__c                 C   r   r   r   iterr   r   rZ   rZ   r[   __iter__  r   zFetchPackResult.__iter__c                    .   |t | jv r|   t| j|S t |S r   typer   r   getattrr   super__getattribute__r   	__class__rZ   r[   r        z FetchPackResult.__getattribute__c                 C   s&   | j j d| jd| jd| jdS N(z, ))r   r^   r   r   r   r   rZ   rZ   r[   __repr__  s   &zFetchPackResult.__repr__NNr\   r^   r_   r`   ra   r   r
   r   str__annotations__rW   r   r   boolr   r   intr   r   r   r   __classcell__rZ   rZ   r   r[   r   >  s   
 

		
r   c                       s   e Zd ZU dZh dZeee  ed< ddddZ	ddd	Z
d
d ZdefddZdd ZdefddZdd Z fddZdefddZ  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   NrU   c                 C   s   || _ || _|| _d S r   )r   r   r   )rX   r   r   r   rZ   rZ   r[   rW     r   zSendPackResult.__init__c                 C   r   )Nr   z Use SendPackResult.refs instead.r   r   r   r   rZ   rZ   r[   r     r   zSendPackResult._warn_deprecatedc                 C   s4   t |tr|   | j|kS | j|jko| j|jkS r   )r   r   r   r   r   r   rZ   rZ   r[   r     s   

zSendPackResult.__eq__c                 C   r   r   r   r   rZ   rZ   r[   r     r   zSendPackResult.__contains__c                 C   r   r   r   r   rZ   rZ   r[   r     r   zSendPackResult.__getitem__c                 C   r   r   r   r   rZ   rZ   r[   r     r   zSendPackResult.__len__c                 C   r   r   r   r   rZ   rZ   r[   r     r   zSendPackResult.__iter__c                    r   r   r   r   r   rZ   r[   r     r   zSendPackResult.__getattribute__c                 C   s   | j j d| jd| jdS r   )r   r^   r   r   r   rZ   rZ   r[   r     s   zSendPackResult.__repr__r   r\   r   rZ   rZ   r   r[   r     s   
 	
	r   c              	   C   s   t  }t  }| D ]>}|dkrqz
|dd\}}W n ty'   td| w |tkr4||  q|tkr@||  qtd| ||fS )Ns   shallow-info
r   r   zunknown command )r   r   r   r   r1   addr   r2   )rH   r   r   r   cmdr   rZ   rZ   r[   _read_shallow_updates  s    r   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
_v1ReceivePackHeaderrU   Nc                 C   s&   g | _ g | _| |||| _d| _d S r~   )wanthave_handle_receive_pack_head_itsent_capabilities)rX   capabilitiesold_refsnew_refsrZ   rZ   r[   rW     s   
z_v1ReceivePackHeader.__init__c                 C   s   | j S r   )r   r   rZ   rZ   r[   r     s   z_v1ReceivePackHeader.__iter__c                 c   s   dd |  D | _|D ]y}t|tstd|||t}t|ts0td|d|||t}t|tsEtd|d|||krwtd||| | j	r`|d | d | V  n|d | d | d	 d
t| V  d
| _	|| jvr|tkr| j| q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                 S   s   g | ]}|t ks|qS rZ   r=   .0xrZ   rZ   r[   
<listcomp>      zB_v1ReceivePackHeader._handle_receive_pack_head.<locals>.<listcomp>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   )rX   r   r   r   refnameold_sha1new_sha1rZ   rZ   r[   r     sP   


	
z._v1ReceivePackHeader._handle_receive_pack_headr\   )r^   r_   r`   rW   r   r   rZ   rZ   rZ   r[   r     s    
r   rH   c                 c   s2    | D ]}t |dd }||dd fV  qdS )zRead per-channel data.

    This requires the side-band-64k capability.

    Args:
      pkt_seq: Sequence of packets to read
    Nr   )ord)rH   r   channelrZ   rZ   r[   _read_side_band64k_data%  s
   r  c                 C   s>   | D ]}t |\}}||krq|r||dvrq|  S d S )Nr   )rF   r   )r   keyrw   
capabilitykvrZ   rZ   r[   find_capability2  s   r  c                 C   sD  t |trt |d tsJ td |d  }|du rt}|dkr+|ddt| 7 }|d7 }| | |dd D ]}| td | d  q:|dvsRt|ddr|dkrat	|t
ts`td	nt|vritd	|jD ]}	| td |	 d  ql|dur| td t|d
 d  |dkr| d |dkr| d |dvr|durt|  \}
}n
d }
}nt  }
}t|}|r| td | d  |dur| r|  }|dd}|d dkr||d  |d dv rn|d dkrnt|d  dt|}|s| td  |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  r3   r5   r	  r
  write_pkt_liner   r  r"   r*   r   r  r1   r.   r   encoder   read_pkt_seqr   nextr0   r   r   r   ackAssertionErrorr/   )r   r   graph_walkerrY   can_readdepthprotocol_versionwantcmdr   r   r   r   r   r   r   rZ   rZ   r[   _handle_upload_pack_head<  sr   







r(  r   	pack_dataprogressc                 C   s  |   }|rC|dd}|dkr|d dkrn*|d dkr&||d  |d dkr0|  t|d	k s<|d d
vr=n|   }|st|v sK|dkry|du rTddd}t|  D ]\}	}
|	t	krg||
 qZ|	t
krp||
 qZtd|	 dS 	 | |}
|
dkrdS ||
 qz)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   )r  r  r  NrU   c                 S      d S r   rZ   r  rZ   rZ   r[   r*       z*_handle_upload_pack_tail.<locals>.progressInvalid sideband channel T    r\   )r   r   r   r!  nakrj   r+   r  r  r9   r;   r"  read)r   r   r#  r)  r*  rbufsizer&  r   r   chandatarZ   rZ   r[   _handle_upload_pack_tail  s:   



r6  c                 C   sR   i }d}| D ]}t |\}}|tkr|dd\}}|||< |tkr$|}q||fS )zExtract symrefs and agent from capabilities.

    Args:
     capabilities: List of capabilities
    Returns:
     (symrefs, agent) tuple
    N   :r   )rF   r,   r   r    )r   r   r   r  r  r  srcdstrZ   rZ   r[   _extract_symrefs_and_agent  s   r:  c                   @   sD  e Zd ZdZ				d1	d2ddZdefdd	Zed3d
dZ	d4dede	e
e e
e egeeee f f defddZ										d5dededee deee  dee defddZ						d6d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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d Z		d7dee deee  deeef fd!d"Zed#d$ Zd%d& Z 	d4d'e!d(e
e dee	egdf  deeeee f  fd)d*Z"d+d, Z#					d8	d2d-d.Z$ed2d/d0Z%dS )9	GitClientzGit smart server client.TNFrU   c                 K   sv   || _ d| _tt| _| jt  tt| _| jt  |r&| jt	 |s.| j
t |r6| 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   rB   RECEIVE_CAPABILITIES_send_capabilitiesr(   remover-   r$   r&  )rX   
thin_packsreport_activityquietinclude_tagskwargsrZ   rZ   r[   rW     s   


zGitClient.__init__c                 C   
   t | j)zRetrieves full url to given path.

        Args:
          path: Repository path (as string)

        Returns:
          Url to path (as string)

        )NotImplementedErrorget_urlrX   pathrZ   rZ   r[   rJ       

zGitClient.get_urlc                 K   rH  )zCreate an instance of this client from a urlparse.parsed object.

        Args:
          parsedurl: Result of urlparse()

        Returns:
          A `GitClient` object
        )rI  from_parsedurlcls	parsedurlrG  rZ   rZ   r[   rN    rM  zGitClient.from_parsedurlrL  generate_pack_datac                 C   rH  )ap  Upload a pack to a remote repository.

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

        Returns:
          SendPackResult object

        Raises:
          SendPackError: if server rejects the pack data

        )rI  	send_pack)rX   rL  update_refsrR  r*  rZ   rZ   r[   rS       
zGitClient.send_packoriginmkdirbare
ref_prefixr&  c              	   C   s  |rt | zd}|st|}|du rd}n|rtdt|}t| ttfr0|	d}n| 
|	d}|dus>J |duri| }|d|	dfd| |d|	dfdd|	d d	  |  d
| }| j||||	|
||d}|durt|j||j|d |jd}|jd}|du s|r|s||jd< |}n"t|j|	d| t|j|	d|||}|rt|j||}nd}|r|dur|  W |S W |S W |S  ty   |dur|  |rddl}||  w )zClone a repository.NTz"checkout and bare are incompatibler   s   remotes   urls   fetchs   +refs/heads/*:refs/remotes/s   /*s   clone: from r*  r%  rY  filter_specr&  )messagerR   r   )osrW  rQ   initr   	init_barer   LocalGitClientSubprocessGitClientr  rJ  
get_configr   write_to_pathfetchrK   r   r   r   rN   rL   rM   reset_indexBaseExceptioncloseshutilrmtree)rX   rL  target_pathrW  rX  rV  checkoutbranchr*  r%  rY  r[  r&  targetencoded_pathtarget_configref_messageresultorigin_head
origin_shaheadhead_refrh  rZ   rZ   r[   clone8  s   


	
	
	


zGitClient.clonerm  determine_wantsr*  r%  r[  c	                    s   |du rj j}t| jv r0ddlm}	 |	tdtj ddd d fdd	}
d fd
d}nj  \ }
}z| j	||
  j||||d	}W n tyV   |   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-rL  )max_sizeprefixdirrU   c                      s2      r d jj jd d    d S )Nr   r*  )tellseekobject_storeadd_thin_packr2  rg  rZ   fr*  rm  rZ   r[   commit  s   
zGitClient.fetch.<locals>.commitc                      s       d S r   rg  rZ   )r  rZ   r[   abort  s   zGitClient.fetch.<locals>.abortrZ  r\   )r  determine_wants_allr-   r?  tempfilerx  r   r   add_pack
fetch_packget_graph_walkerwriterf  update_shallowr   r   )rX   rL  rm  rw  r*  r%  rY  r[  r&  rx  r  r  rq  rZ   r  r[   rd    s>   $

zGitClient.fetchrZ  c          
      C   rH  ))  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

        )rI  r  )
rX   rL  rw  r#  r)  r*  r%  rY  r[  r&  rZ   rZ   r[   r    s   
%zGitClient.fetch_packc                 C   rH  )zRetrieve the current refs from a git smart server.

        Args:
          path: Path to the repo to fetch from. (as bytestring)
        )rI  get_refs)rX   rL  r&  rY  rZ   rZ   r[   r    s   
zGitClient.get_refsc                 C   s   t dd |  D S )Nc                 s   s    | ]}|t kV  qd S r   r   )r   r   rZ   rZ   r[   	<genexpr>  s    z.GitClient._should_send_pack.<locals>.<genexpr>)anyr   )r   rZ   rZ   r[   _should_send_pack  s   zGitClient._should_send_packc                 C   s*   | j |@ }t|\}}t|t  ||fS r   )rA  r:  rD   r7   )rX   r   negotiated_capabilitiesr   _symrefsrZ   rZ   r[   $_negotiate_receive_pack_capabilities!  s   
z.GitClient._negotiate_receive_pack_capabilitiesr   r   c                 C   s   t |v s	| jdkrL|du rddd}t|v r#| jdusJ t| jj}t| D ]!\}}|tkr;t|v r:|	| q)|t
krD|| q)td| nt|v rb| jsUJ | D ]}| j| qY| jdurnt| 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   NrU   c                 S   r,  r   rZ   r-  rZ   rZ   r[   r*  =  r.  z5GitClient._handle_receive_pack_tail.<locals>.progressr/  r\   )r+   r&  r)   r=  r?   r   r  r  r9   parser;   r"  r   r   )rX   r   r   r*  pktline_parserr4  r5  r   rZ   rZ   r[   _handle_receive_pack_tail(  s,   


	

z#GitClient._handle_receive_pack_tailc                 C   s   t |t  d }|D ]J}t|\}}| jdkrT|tkrTt}g }| d}d|v r/|t d|v r8|t	 t
t|D ]}|dkrI|d7 }n|d7 }||| 7 }q>q
t|\}}	| j|@ }
|rg|
| |
||	fS )Nr   r   s   shallows   filterr      =)rD   r8   rF   r&  r"   r   r   r   r*   r#   rangerj   r:  r?  r   )rX   r   
fetch_capar  r  r  fetch_featuresir   r   r  rZ   rZ   r[   #_negotiate_upload_pack_capabilitiesU  s.   





z-GitClient._negotiate_upload_pack_capabilitiesc	           	      C   rH  )z*Retrieve an archive of the specified tree.)rI  archive)	rX   rL  
committish
write_datar*  write_errorformatsubdirsrz  rZ   rZ   r[   r  q  s   
zGitClient.archivec                  C   s   dd l } | dt d S )Nr   z3object filtering not recognized by server, ignoring)r   r   UserWarning)r   rZ   rZ   r[   _warn_filter_objects  s
   zGitClient._warn_filter_objects)TNFFr\   )rU   r;  r   )
TFrV  NNNNNNNNNNNNNr   NNNNN)&r^   r_   r`   ra   rW   r   rJ  classmethodrN  r	   r   r  r   tupler   r   r   r   rS  r   r  rJ   rQ   rv  r   r   rd  r  ObjectIDr  staticmethodr  r  r@   r  r  r  r  rZ   rZ   rZ   r[   r;    s    
 
!

h
	

U
	
*




-!

r;  c                 C   s*   t | dd | D  }|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                 S   s   h | ]\}}| ts|qS rZ   )endswithrI   )r   r  r  rZ   rZ   r[   	<setcomp>  s
    zcheck_wants.<locals>.<setcomp>N)r   r   rT   )rY   r   missingrZ   rZ   r[   check_wants  s   r  c                 C   s\   | d u rt  S dd |  D }|D ]}|dr)t|tdd  dd  S qt |S )Nc                 S   s   g | ]}| d qS )r   )r   )r   linerZ   rZ   r[   r    s    z-_remote_error_from_stderr.<locals>.<listcomp>s   ERROR: r   r   )r>   	readlinesr   r   rj   r   )stderrlinesr  rZ   rZ   r[   _remote_error_from_stderr  s   
 r  c                       s   e Zd ZdZdZefd fd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
dZdddZ					dde	ee  d	e	e
 fddZ		dd	e	e
 de	ee  fddZ					d	dddZ  ZS )TraditionalGitClientzTraditional Git client.r   rU   Nc                    s   || _ t jdi | d S NrZ   )_remote_path_encodingr   rW   )rX   path_encodingrG  r   rZ   r[   rW     s   zTraditionalGitClient.__init__r   rL  r&  c                 C   s   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.
        )rI  )rX   r   rL  r&  rZ   rZ   r[   _connect  s   zTraditionalGitClient._connectc                 C   sd  t | _| d|\}}}| z
t| \}}	W n ty+ }
 zt||
d}
~
ww | |	\}}t|v r;t	 | _
| j
}z
|t| }}W n tyU   |d  w t| t| rv|d t||i dW  d   S t|	vrt|}| D ]\}}|tkrt|v r|jd| d  d|_||= q|du r|d t||i dW  d   S t|dkr|r|d |durt| }nd}t|||dW  d   S t|||}|D ]}|| q||j|jt|v |d\}}| |rt|||d	D ]}|| q	|  |||}t|||dW  d   S 1 s+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_deltar*  r|  )!r5   r&  r  r   r  r>   r  r  r)   r}   r=  r   rf  r  r   r   issubsetr   r!   r=   r   r   _ref_status_okrj   r   r   r   r   r'   r  r   r  r  )rX   rL  rT  rR  r*  r   unused_can_readr  r   r   excr  r   report_status_parserr   orig_new_refsr   r   r   header_handlerr   pack_data_countr)  chunkrZ   rZ   r[   rS    s   




'
0

&zTraditionalGitClient.send_packrY  c
                 C   s  |	dur|	t vrtd|	 | d||	\}
}}t|
}|t vr)td| d|	r7||	kr7td| d|| _|
; | jdkrzt|
 }W n ty\ } zt||d}~ww | 	|\}}}|

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

d	 |

d
 |du rt}|D ]	}|

d|  q|

d t|
 \}}}n-z
t|
 \}}W n ty } zt||d}~ww | 	|\}}}|durt||}|du r|

d t|||W  d   S z|dur|||d}n||}W n ty   |

d  w |durdd |D }|s|

d t|||W  d   S | jdkrI|

d |
d t|ttrA|rA|
td|  n|rH|   n|rP|   t|
|||||| jd\}}t|
||||| jd t|||||W  d   S 1 s|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 r%  c                 S      g | ]}|t kr|qS rZ   r   r   cidrZ   rZ   r[   r    r  z3TraditionalGitClient.fetch_pack.<locals>.<listcomp>   command=fetch

   filter %s
)r%  r&  r&  )r6   r   r  r   r&  r   r  r>   r  r  r  r  DEFAULT_REF_PREFIXr   r   rE   r   rf  r  r"   r#   rG   r  r(  r6  )rX   rL  rw  r#  r)  r*  r%  rY  r[  r&  r   r$  r  server_protocol_versionr   r  r  r   r   rz  r   _peeledrY   r   r   rZ   rZ   r[   r    s   %












(



5


	&zTraditionalGitClient.fetch_packc                 C   s  |dur|t vrtd| | d||\}}}t|}|t vr)td| d|r7||kr7td| d|| _| jdkrt| }|d |d |d	 |d
 |du r_t	}|D ]	}	|d|	  qa|d |; zt
| \}
}}W n ty } zt||d}~ww |d | D ]
\}}||
|t < q|
W  d   S 1 sw   Y  dS |: z
t| \}
}W n ty } zt||d}~ww |d t|\}}|durt|
|}
|
W  d   S 1 sw   Y  dS )2Retrieve the current refs from a git smart server.Nr  r  r  r  r   r  r  r  r  r  )r6   r   r  r   r&  r   r  r  r  r  r   r>   r  r   rI   r   r:  rE   )rX   rL  r&  rY  r   _r  r  r   rz  r   r  r   r  r  refvalue_agentrZ   rZ   r[   r    sd   	









$



$zTraditionalGitClient.get_refsc	                 C   s  |  d|\}	}
}|	 |d ur|	d|  |	d|  |d ur.|D ]	}|	d|  q$|d ur9|	d|  |	d  z|	 }W n tyU } zt||d }~ww |dks^|dkrg	 W d    d S |dkso|dkrpn|d	rt|d
d  dddt	d||	 }|d urt	dt
|	 D ]%\}}|tkr|| q|tkr|| q|tkr|| qt	d| W d    d S 1 sw   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 tailr/  )r  r  r   r>   r  r   r   r   r   r"  r  r  r9   r;   r:   )rX   rL  r  r  r*  r  r  r  rz  r   r$  r  subdirr   r  retr4  r5  rZ   rZ   r[   r    sL   





"zTraditionalGitClient.archiver\   r   r  r   )r^   r_   r`   ra   DEFAULT_ENCODINGrW   r  r   r   r   r   r  r@   r	   r   r   r  rS  r  rJ   r  r  r  r   rZ   rZ   r   r[   r    sR    


d


 

=
r  c                       s|   e Zd ZdZdd fddZedd Zd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dZ  ZS )TCPGitClientz8A Git Client that works over TCP directly (i.e. git://).NrU   c                    s.   |d u rt }|| _|| _t jdi | d S r  )r<   _host_portr   rW   )rX   hostportrG  r   rZ   r[   rW     s
   zTCPGitClient.__init__c                 K   s   | |j fd|ji|S )Nr  )hostnamer  rO  rZ   rZ   r[   rN    s   zTCPGitClient.from_parsedurlc                 C   s<   | j }| jd ur| jtkr|d| j 7 }td||ddfS )N:git )r  r  r<   r   rX   rL  netlocrZ   rZ   r[   rJ    s   zTCPGitClient.get_urlr   rL  r&  c                    s  t |ts	t|t |ts|| j}t| j| jtj	tj
}d td| j }|D ]=\}}}}	}
t|||tjtjd z|
 W  n tyi } z|}d ur]  d W Y d }~q,d }~ww d u rp|dd ddd fdd	}t jj|| jd
}|dr|dd  }|dkr|d u rt| _n|| _nt| _|dkr| jdkrd| j }nd}|d| |d| jd |  |fddd fS )Nzno address found for r   rbwbr   rU   c                      s             d S r   r  rZ   rfileswfilerZ   r[   rg  E  s   z$TCPGitClient._connect.<locals>.closerD  s   /~r  r   s     version=%d r0     git-s   host=r  c                      s   t  S r   )rm   rZ   )r  rZ   r[   <lambda>f  s    z'TCPGitClient._connect.<locals>.<lambda>r\   )r   r  r  r  r  socketgetaddrinfor  r  	AF_UNSPECSOCK_STREAMru   
setsockoptIPPROTO_TCPTCP_NODELAYconnectrg  makefiler@   r2  r  r<  r   r4   r&  r5   send_cmd)rX   r   rL  r&  	sockaddrserrfamilysocktypeprotof	canonnamesockaddrerg  r   version_strrZ   r  r[   r  $  s^   



zTCPGitClient._connectr   r\   )r^   r_   r`   ra   rW   r  rN  rJ  r  r   r   r   r   r  r@   r	   r   r   r  r   rZ   rZ   r   r[   r    s     


r  c                   @   s8   e Zd ZdZdddZedd Zdd	 Zdd
dZdS )SubprocessWrapperz:A socket-like object that talks to a subprocess via pipes.rU   Nc                 C   s"   || _ t|jj| _|jj| _d S r   )procr   stdoutr2  stdinr  )rX   r	  rZ   rZ   r[   rW   l  s   zSubprocessWrapper.__init__c                 C   s   | j jS r   )r	  r  r   rZ   rZ   r[   r  q  s   zSubprocessWrapper.stderrc                 C   sB   t jdkrddlm} || jj }t|dkS t| jj S )Nwin32r   )get_osfhandle)	sysplatformmsvcrtr  r	  r
  rl   r|   rm   )rX   r  rx   rZ   rZ   r[   r$  u  s
   
zSubprocessWrapper.can_readc                 C   s:   | j j  | j j  | j jr| j j  | j   d S r   )r	  r  rg  r
  r  waitr   rZ   rZ   r[   rg  ~  s
   zSubprocessWrapper.closer\   )	r^   r_   r`   ra   rW   propertyr  r$  rg  rZ   rZ   rZ   r[   r  i  s    

	r  c                  C   st   t jdkr7z
ddl} ddl}W n ty   g d Y S w z|d\}}|gW S  | jy6   g d Y S w dgS )z3Find command to run for system Git (usually C Git).r  r   N)r   z/cr  r  )r  r  
pywintypeswin32apiImportErrorFindExecutabler   )r  r  r   r  rZ   rZ   r[   find_git_command  s   
r  c                   @   sd   e Zd ZdZed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	d
ZdS )ra  z5Git client that talks to a server using a subprocess.c                 K      | di |S r  rZ   rO  rZ   rZ   r[   rN       z"SubprocessGitClient.from_parsedurlNservicerL  r&  rU   c                 C   s   t |ts	t|t |tr|| j}| jd u rt }g ||d|}tj|dtj	tj	tj	d}t
|}t|j|j|j| jd|j|jfS )Nr  r   bufsizer  r
  r  r  )r   r  r  r   r  git_commandr  
subprocessPopenPIPEr  r@   r2  r  rg  r<  r$  r  )rX   r  rL  r&  r  argvppwrZ   rZ   r[   r    s0   


zSubprocessGitClient._connectr   )r^   r_   r`   ra   r  rN  r  r  r   r   r   r   r  r@   r	   r   r   r  rZ   rZ   rZ   r[   ra    s    

ra  c                   @   s0  e Zd ZdZ			ddedee ddfddZd	d
 Ze	dd Z
e	dd Zd 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dZ					d"deee  dee dee defddZ		d#dee deee  fddZdS )$r`  z5Git Client that just uses a local on-disk repository.TNrC  configrU   c                 C   s
   || _ dS )zCreate a new LocalGitClient instance.

        Args:
          thin_packs: Whether or not thin packs should be retrieved
          report_activity: Optional callback for reporting transport
            activity.
        N)r<  )rX   rC  rD  r$  rZ   rZ   r[   rW     s   
zLocalGitClient.__init__c                 C   s   t dd|ddfS )Nfiler  )r   rK  rZ   rZ   r[   rJ    s   zLocalGitClient.get_urlc                 K   r  r  rZ   rO  rZ   rZ   r[   rN    r  zLocalGitClient.from_parsedurlc                 C   s    t |ts
t|}tt|S r   )r   r   r]  fsdecoder   rQ   )rP  rL  rZ   rZ   r[   
_open_repo  s   

zLocalGitClient._open_repoc                 C   sp  |sddd}|  |}| }|t|}dd | D }g }	| D ]\}
}||vr;||	vr;|tkr;|	| q&|	sXt| t| rXt	|i dW  d   S |j
j|||	dd	  i }| D ]9\}
}||
t}|tkr|j|
||sd
|
 d| }|| |||
< qi|j|
|s|d|
  d||
< qiW d   n1 sw   Y  t	||d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

        rU   Nc                 S   r,  r   rZ   r-  rZ   rZ   r[   r*    r.  z*LocalGitClient.send_pack.<locals>.progressc                 S   r  rZ   r   )r   sha1rZ   rZ   r[   r    r  z,LocalGitClient.send_pack.<locals>.<listcomp>)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)rX   rL  rT  rR  r*  rm  r   r   r   r   r  r  r   r  msgrZ   rZ   r[   rS    sF   


#zLocalGitClient.send_packrL  rm  rw  r*  r%  rY  r[  r&  c	                 K   sT   |  |}
|
j||||d}t||
j t W  d   S 1 s#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

        )rw  r*  r%  N)r'  rd  r   r   get_symrefsrA   )rX   rL  rm  rw  r*  r%  rY  r[  r&  rG  rr   rZ   rZ   r[   rd    s   #$zLocalGitClient.fetchc
                 C   s   |  |C}
|
j||||d}| }t|}|
j }t }|du r0td||W  d   S t||
j	||d t|

 ||W  d   S 1 sKw   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

        )r*  r%  N)other_haves)r'  find_missing_objectsget_remote_hasr  r   r.  rA   r   r   r  r  )rX   rL  rw  r#  r)  r*  r%  rY  r[  r&  r/  missing_objectsr0  
object_idsr   r   rZ   rZ   r[   r  J  s    "


$zLocalGitClient.fetch_packc                 C   s6   |  |}| W  d   S 1 sw   Y  dS )z:Retrieve the current refs from a local on-disk repository.N)r'  r  )rX   rL  r&  rY  rm  rZ   rZ   r[   r  ~  s   $zLocalGitClient.get_refs)TNNr   r  r  r   )r^   r_   r`   ra   r   r   r   rW   rJ  r  rN  r'  rS  r   rQ   r	   r   r  r   r  rJ   rd  r   r  r  rZ   rZ   rZ   r[   r`    s    



B
	

2
	

7
r`  c                   @   0   e Zd ZdZ						ddee fddZdS )	SSHVendorz!A client side SSH implementation.Nr&  c	           	      C   rH  )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.
        )rI  run_command)	rX   r  commandusernamer  passwordkey_filenamessh_commandr&  rZ   rZ   r[   r7    rU  zSSHVendor.run_commandr  r^   r_   r`   ra   r   r   r7  rZ   rZ   rZ   r[   r6        	r6  c                       s"   e Zd ZdZd fddZ  ZS )StrangeHostnamez,Refusing to connect to strange SSH hostname.rU   Nc                    s   t  | d S r   )r   rW   )rX   r  r   rZ   r[   rW        zStrangeHostname.__init__r\   )r^   r_   r`   ra   rW   r   rZ   rZ   r   r[   r?    s    r?  c                   @   r5  )SubprocessSSHVendorz6SSH vendor that shells out to the local 'ssh' command.Nr&  c	                 C   s   |d urt d|rdd l}	g |	j|tjdkdd}
nddg}
|r,|
dt|g |r7|
dt|g |d u r=t}|dkrK|
d	d
| g |rT| d| }|dr^t	|d|

| tjg |
|dtjtjtjd}t|S )Nz6Setting password not supported by SubprocessSSHVendor.r   r  posixz-xsshz-p-iz-ozSetEnv GIT_PROTOCOL=version=@-r  r  )rI  shlexr   r  r  extendr   r4   r   r?  r   r  r  r   r  )rX   r  r8  r9  r  r:  r;  r<  r&  rI  argsr	  rZ   rZ   r[   r7    s:   



zSubprocessSSHVendor.run_commandr  r=  rZ   rZ   rZ   r[   rA    r>  rA  c                   @   r5  )PLinkSSHVendorz8SSH vendor that shells out to the local 'plink' command.Nr&  c	                 C   s(  |rdd l }	g |	j|tjdkdd}
ntjdkrddg}
nddg}
|d ur9dd l}|d |
dt|g |rD|
d	t|g |rO|
d
t|g |rX| d| }|drbt	|d|

| ttj}|d u rst}|dkr~d| |d< tjg |
|dtjtjtj|d}t|S )Nr   r  rB  z-sshz	plink.exeplinkzHInvoking PLink with a password exposes the password in the process list.z-pwz-PrE  rF  rG  rH  zversion=GIT_PROTOCOL)r  r  r
  r  env)rI  r   r  r  r   r   rJ  r   r   r?  r   r   deepcopyr]  environr4   r  r  r   r  )rX   r  r8  r9  r  r:  r;  r<  r&  rI  rK  r   rO  r	  rZ   rZ   r[   r7    sF   





zPLinkSSHVendor.run_commandr  r=  rZ   rZ   rZ   r[   rL    r>  rL  c                  K   s.   dd l }|dt ddlm} |di | S )Nr   zDParamikoSSHVendor has been moved to dulwich.contrib.paramiko_vendor.r   )ParamikoSSHVendorrZ   )r   r   r   contrib.paramiko_vendorrR  )rG  r   rR  rZ   rZ   r[   rR  ,  s   rR  c                       s   e Zd Z							d	d fddZdd Zedd Zd	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dZ  ZS )SSHGitClientNrU   c	           
         sp   || _ || _|| _|| _|| _|ptjdtjd| _t	 j
di |	 i | _|d ur2|| _d S t | _d S )NGIT_SSH_COMMANDGIT_SSHrZ   )r  r  r9  r:  r;  r]  rQ  r   r<  r   rW   alternative_paths
ssh_vendorget_ssh_vendor)
rX   r  r  r9  vendorr$  r:  r;  r<  rG  r   rZ   r[   rW   =  s   

zSSHGitClient.__init__c                 C   sP   | j }| jd ur|d| j 7 }| jd urt| jdd | }td||ddfS )Nr  z@/:rF  rD  r  )r  r  r9  urlquoter   r  rZ   rZ   r[   rJ  X  s   

zSSHGitClient.get_urlc                 K   s   | d|j |j|jd|S )N)r  r  r9  rZ   )r  r  r9  rO  rZ   rZ   r[   rN  b  s   zSSHGitClient.from_parsedurlc                 C   s$   | j |d| }t|tsJ |S )Nr  )rW  r   r   r  )rX   r   rZ   rZ   r[   _get_cmd_pathk  s   zSSHGitClient._get_cmd_pathr   rL  r&  c                 C   s   t |ts	t|t |tr|| j}|dr|dd  }| || jd | d }i }| jd ur:| j|d< | jd urD| j|d< | j	d urN| j	|d< | j
j| j|f| j| j|d|}t|j|j|j| jd	|jt|d
d fS )Nz/~r   z ''r:  r;  r<  )r  r9  r&  r  r  )r   r  r  r   r  r   r\  r:  r;  r<  rX  r7  r  r  r9  r@   r2  r  rg  r<  r$  r   )rX   r   rL  r&  r!  rG  conrZ   rZ   r[   r  p  sP   








	
zSSHGitClient._connect)NNNNNNNr\   r   )r^   r_   r`   rW   rJ  r  rN  r\  r  r   r   r   r   r  r@   r	   r   r   r  r   rZ   rZ   r   r[   rT  <  s2    

	
rT  c                   C   s   d ddd tjD S )Nzgit/dulwich/{}.c                 S   s   g | ]}t |qS rZ   )r   r   rZ   rZ   r[   r    s    z-default_user_agent_string.<locals>.<listcomp>)r  r	  dulwich__version__rZ   rZ   rZ   r[   default_user_agent_string  s   rb  )zurllib3.ProxyManagerzurllib3.PoolManagerc                 K   s  d }}d }}|du rdD ]}	t j|	}|r nq|r#t|r#d}| durw|du r=z| dd}W n	 ty<   Y nw z| dd}W n	 tyN   Y nw z| dd}W n tyb   d}Y nw z| dd}W n tyv   d}Y nw |du r~t }d	|i}
d
|i}|du rd|d< n|du rd|d< nd|d< || ddl}|dur|du r|j	}t
|ts| }t|}|jdur|j|j d|jpd d}ni }||f||
d|}|S |du r|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headersrl  rZ   )r]  rQ  r   check_for_proxy_bypassKeyErrorget_booleanrb  r   urllib3ProxyManagerr   r   r   r   r9  make_headersr:  PoolManager)r$  pool_manager_clsproxy_manager_clsbase_urloverride_kwargsproxy_server
user_agentrf  
ssl_verify	proxynamerl  rG  rp  proxy_server_urlrk  managerrZ   rZ   r[   default_urllib3_manager  s   




r~  c           	   	   C   s   | r}t jd}|r}t| }|j}|r}dd l}z||}W n ty)   d }Y nw |d}|D ]K}|	 }|r||
 }|d}|rbz	|j|dd}W n tyX   d }Y nw |rb||v rb dS |dkri dS ||krp dS d| }||r| dS q1dS )	Nno_proxyr   ,r_  F)strictT*)r]  rQ  r   r   r  	ipaddress
ip_addressr   r   r   lowerlstrip
ip_networkr  )	rv  no_proxy_str
parsed_urlr  r  hostname_ipno_proxy_valuesno_proxy_valueno_proxy_value_networkrZ   rZ   r[   rm  	  sR   


rm  c                   @   s  e Zd ZdZddddZd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dZdd Zd ddZ					d!d
eee	  d	ee fddZ		dd	ee d
eee	  fddZdd Zdd Zedd Zdefd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.
    FrU   Nc                 K   s,   | dd | _|| _tj| fi | d S N/)r   	_base_urldumbr;  rW   )rX   rv  r  rG  rZ   rZ   r[   rW   F	  s   zAbstractHttpGitClient.__init__c                 C   rH  )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
        )rI  _http_request)rX   rf   rl  r5  rZ   rZ   r[   r  K	  s   
z#AbstractHttpGitClient._http_requestr&  rY  c              
      s.  |d ur|t vrtd|  d dksJ d}ddi}jdurH|dd	7 }d
krE|d u r8t_n|_jdkrDd|d< nt_t |}	||\}}	|j
ry|j
|sltd| d|j
 d| t||j
d t|   z|jd u p|jd _jsp fdd}
t|	d }t|}|t vrtd| d|r||krtd| d|_jdkr|
|\}}}	}t| \}}}|| ||fW |  S z	t| \}W n ty } ztd|d }~ww |dd kr
td|dt|}|t vrtd| d|r+||kr+td| d|_jdkrF|
|\}}}	}t| \}}}nt| \}}t|\}}t|\}}d urdt|}|| ||fW |  S d_tt|\}}d urt|}|t  i |fW |  S |  w )Nr  r  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                    s~   t |  }d u rtddg}D ]	}|d|  qdtddt| g}d |\}}t	|d } |||| fS )Nr  r  r  r0  r  r  r  )
r   r  r  r   r	  rG   rH   _smart_requestr   r@   )r   r   pktsrz  bodyrespr2  rv  rY  rX   r  rZ   r[   begin_protocol_v2	  s    
zEAbstractHttpGitClient._discover_references.<locals>.begin_protocol_v2r  r  z%unexpected number of packets receivedr   s
   # service=zunexpected first line z from smart serverr   )r6   r   r  r  r   r4   r&  r5   r   r  redirect_locationr  r   rj   content_typer   r@   r   r   r  rg  r  r   r   rP   r:  rE   rO   r   )rX   r  rv  r&  rY  tailrl  rf   r  r2  r  r   r  r   r   r   r   r   r  r   rZ   r  r[   _discover_references^	  s   








1









z*AbstractHttpGitClient._discover_referencesc                 C   s   |d dksJ t ||}d| d}d| d|d}| jdkr%d|d	< t|tr2tt||d
< | |||\}}|jdd |krMt	d|j ||fS )zSend a 'smart' HTTP request.

        This is a simple wrapper around _http_request that sets
        a couple of extra headers.
        r  r  zapplication/x-z-resultz-request)Content-Typer  r   r  r  zContent-Length;r   z"Invalid content-type from server: )
r   r&  r   r  r   rj   r  r  r   r   )rX   r  rf   r5  result_content_typerl  r  r2  rZ   rZ   r[   r  	  s    




z$AbstractHttpGitClient._smart_requestc                    s
   |}d|\}}}}|\}	t  tv r%t _|tdu r6t	|	i dS t
 t
 rJt	|	i dS jrRtj fdd}
jd||
 d\}}zt|d}||}t	|	|dW |  S |  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   s^    t } | D ]}t|V  q	 | j| jtv d\}}r-t||E d H  d S d S )Nr)  )r   rG   r   r   r'   r  r   )r  r   r  r)  rR  r  r   r   rX   rZ   r[   body_generator)
  s   

z7AbstractHttpGitClient.send_pack.<locals>.body_generatorzgit-receive-pack)r5  )_get_urlr  r  r   rB   r)   r}   r=  r   r   r   r   r  r  rI  r  r  r@   r  rg  )rX   rL  rT  rR  r*  rf   r   r   r   r   r  r  r2  
resp_protor   rZ   r  r[   rS   
  s6   


zAbstractHttpGitClient.send_packc
              	   C   s  |  |}
| jd|
|	|d\}}}
}}| |\}}}|s!|r!|}|dur,|||d}n||}|dur;dd |D }|sCt|||S | jrKt| jt }td|j	}t
||||d|| jd\}}| jdkrtd	d
 }t|ttr~|r~|td| 7 }n|r|   || 7 }n
|r|   | }| d|
|\}}z-t|d}|du r|du rt| \}}t|||||| jd t|||||W |  S |  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  r&  rY  Nr  c                 S   r  rZ   r   r  rZ   rZ   r[   r  v
  r  z4AbstractHttpGitClient.fetch_pack.<locals>.<listcomp>)r$  r%  r&  r   r  r  r  zgit-upload-packr  )r  r  r  r   r  rI  r  r   r@   r  r(  r&  rG   r  r"   r#   r  getvaluer  r   r  r6  rg  )rX   rL  rw  r#  r)  r*  r%  rY  r[  r&  rf   r   r   r   r   r  capa_symrefsr   rY   req_data	req_protor   r   r5  r  r2  r  rZ   rZ   r[   r  A
  s   
"



	
z AbstractHttpGitClient.fetch_packc           
      C   sH   |  |}| jd|||d\}}}}}| D ]
\}}	|	||t < q|S )r  r  r  )r  r  r   rI   )
rX   rL  r&  rY  rf   r   r  r   r  r  rZ   rZ   r[   r  
  s   
zAbstractHttpGitClient.get_refsc                 C   s   |  |dS r  )r  r   rK  rZ   rZ   r[   rJ  
  r@  zAbstractHttpGitClient.get_urlc                 C   s   t | j|dd S r  )r   r  r   rK  rZ   rZ   r[   r  
  s   zAbstractHttpGitClient._get_urlc                 K   sH   |j }|d urt||d< |j}|d urt||d< | t|fi |S )Nr:  r9  )r:  
urlunquoter9  r   )rP  rQ  rG  r:  r9  rZ   rZ   r[   rN  
  s   z$AbstractHttpGitClient.from_parsedurlc                 C   s    t | j d| jd| jdS )Nr   z, dumb=r   )r   r^   r  r  r   rZ   rZ   r[   r   
  s    zAbstractHttpGitClient.__repr__)Fr\   r   r   r  )r^   r_   r`   ra   rW   r  r   r   r  rJ   r  r   r  r   r  r   r  r  rS  r  r  rJ  r  r  rN  r   rZ   rZ   rZ   r[   r  =	  sP    

(
 
G


k


	r  c                    s   ddl m   fdd}|S )Nr   )ProtocolErrorc               
      s8   z| i |W S   y } zt t||d }~ww r   )r   r   )rK  rG  r   r  funcrZ   r[   wrapper
  s   z)_wrap_urllib3_exceptions.<locals>.wrapper)urllib3.exceptionsr  )r  r  rZ   r  r[   _wrap_urllib3_exceptions
  s   r  c                       s>   e Zd Z					d		d
 fddZdd ZdddZ  ZS )Urllib3HttpGitClientNrU   c                    s   || _ || _|d u rt||d| _n|| _|d ur4| d|pd }dd l}	|	jj|d}
| jj|
 || _	t
 jd||d| d S )N)rv  r  r  r   )
basic_auth)rv  r  rZ   )	_username	_passwordr~  pool_managerurllib3.utilutilrr  rl  r   r$  r   rW   )rX   rv  r  r  r$  r9  r:  rG  credentialsrp  r  r   rZ   r[   rW   
  s   
zUrllib3HttpGitClient.__init__c                 C   s*   t |ts
|d}t| j|dd S )Nr   r  )r   r   r   r   r  r   rK  rZ   rZ   r[   r  
  s   

zUrllib3HttpGitClient._get_urlc           	   
   C   sP  dd l }| jj }|d ur|| d|d< z|d u r'| jjd||dd}n| jjd|||dd}W n |jjyH } ztt	||d }~ww |j
d	krPt|j
d
kr^t|jd||j
dkrlt|jd||j
dkr|td|j
 d| |jd|_z| }W n ty   | |_Y n
w ||kr|nd|_|t|jfS )Nr   zno-cachePragmaGETF)rl  preload_contentPOST)rl  r  r  i  i  zWWW-Authenticatei  zProxy-Authenticate   zunexpected http resp z for r  r  )r  r  rl  r   r   request
exceptions	HTTPErrorr   r   r   r   rc   r   rh   r  geturlAttributeErrorget_redirect_locationr  r  r2  )	rX   rf   rl  r5  rp  req_headersr  r  resp_urlrZ   rZ   r[   r    sD   





z"Urllib3HttpGitClient._http_requestr  r\   r   )r^   r_   r`   rW   r  r  r   rZ   rZ   r   r[   r  
  s    	r  c                 C   s   | j dksJ | \}}}}}}|dks|sd}n!|r5t|dkr5|d  r5|dd dv r5|dd }ntd	dd
lm} ||| S )zVConvert a file: URL to a path.

    https://datatracker.ietf.org/doc/html/rfc8089
    r%  	localhostr  r   r   r   )r  z:/Nz%Non-local file URLs are not supported)url2pathname)schemerj   isalpharI  
nturl2pathr  )parsedr  r  rL  r  rZ   rZ   r[   _win32_url_to_path.  s   
r  rf   r$  	operationc                 K   s0   |durt || |dkd} t| f||d|S )a  Obtain a git client from a URL.

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

    Returns:
      Tuple with client instance and relative path.

    Npushr  r$  r  )r    _get_transport_and_path_from_url)rf   r$  r  rG  rZ   rZ   r[   get_transport_and_path_from_urlI  s   r  c                 K   s   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 r9tj|fd|i||jfS |jdkr_tjdksHt	j
dkrStd
i |t|fS tj|fi ||jfS td|j d	)Nr  )zgit+sshrD  )httphttpsr$  r%  r  ntzunknown scheme 'r]  rZ   )r   r  r  rN  rL  rT  HttpGitClientr  r  r]  r   default_local_git_client_clsr  r   )rf   r$  r  rG  r  rZ   rZ   r[   r  b  s    



r  locationc                 C   st   d| v rd| vr|  dd\}}d}n"d| v r1|  dd\}}d|v r,|dd\}}n	d}|}ntd|||fS )zParse a rsync-style URL.r  rF  r   Nznot a valid rsync-style URL)r   rsplitr   )r  r  rL  user	user_hostrZ   rZ   r[   parse_rsync_urlx  s   
r  c                 K   s   |durt || |dkd} zt| f||d|W S  ty"   Y nw tjdkr?| d  r?| dd d	kr?tdi || fS z	t| \}}}W n tyZ   tdi || f Y S w t|fd
|i||fS )a  Obtain a git client from a URL.

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

    Returns:
      Tuple with client instance and relative path.

    Nr  r  r  r  r   r   r   z:\r9  rZ   )	r   r  r   r  r  r  r  r  rT  )r  r$  r  rG  r9  r  rL  rZ   rZ   r[   get_transport_and_path  s*   &r  z~/.git-credentialsr  r  c              	   C   s   |D ]R}zGt |d8}|D ]-}t| }|j| kr:|j|kr:|d u s(|j|kr:|j|jf  W  d    W   S qW d    n1 sEw   Y  W q tyT   Y qw d S )Nr  )openr   r   r  r  r9  r:  FileNotFoundError)r  r  r9  fnamesfnamer  r  parsed_linerZ   rZ   r[   get_credentials_from_store  s$   

	r  r\   )NNNr   )ra   r   r   r]  rk   r  r  r  collections.abcr   r   
contextlibr   ior   r   typingr   r   r	   r
   r   r   urllib.parser   r[  r   r  r   r   r   r   rp  r`  r$  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.   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   r   rI   rJ   rK   rL   rM   rN   rO   rP   reporQ   r  r  r  	getLoggerr^   r  rV   rT   rc   rh   rm   r|   COMMON_CAPABILITIESr>  r@  r}   r   r   r   r  r   r   r   r   r   r   r   r   r  r  r(  r6  r:  r;  r  r  r  r  r  r  r   r  ra  r`  r  r6  r?  rA  rL  rR  rY  rT  rb  r~  r   rm  r  r  r  r  r  r  r  r  r  rL  
expanduserDEFAULT_GIT_CREDENTIALS_PATHSr  rZ   rZ   rZ   r[   <module>   s   (-

			3$
"PI";
X
;   
+
  qY* I!5Bb
c6   P

 


-