
                           S r SSKJr  SSKJrJr  SSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKJrJrJrJr  SSKJrJrJrJrJrJr  SSKrSSKJr  SSKJrJrJ r   SS	K!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@JArAJBrBJCrCJDrDJErE  SS
KFJGrGJHrH  SSKIJJrJJKrK  \R                  " \M5      rN " S S\O5      rP " S S\O5      rQS rRS rS\,\1/rT\2\*\+\//\T-   rU\.\(/\T-   rV " S S\W5      rXS rY " S S\W5      rZ " S S\W5      r[S r\ " S S\W5      r]S r^S r_ " S S\]5      r` " S  S!\`5      ra " S" S#\W5      rbS$ rc " S% S&\`5      rd " S' S(\]5      re\erf " S) S*\W5      rg " S+ S,\O5      rh " S- S.\g5      ri " S/ S0\g5      rjS1 rk\irl " S2 S3\`5      rmS4 rn S?S5 jro " S6 S7\]5      rpS@S8 jrqS9 rrS: rs\R                  R                  S;5      \" S<S=5      /rvS\v4S> jrwg)Aa1  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
    )closing)BytesIOBufferedReaderN)OptionalDictCallableSet)quoteunquoteurlparseurljoin
urlunsplit
urlunparse)get_xdg_config_home_path)GitProtocolErrorNotGitRepositorySendPackError)$HangupException	_RBUFSIZEagent_stringcapability_agentextract_capability_namesCAPABILITY_AGENTCAPABILITY_DELETE_REFSCAPABILITY_INCLUDE_TAGCAPABILITY_MULTI_ACKCAPABILITY_MULTI_ACK_DETAILEDCAPABILITY_OFS_DELTACAPABILITY_QUIETCAPABILITY_REPORT_STATUSCAPABILITY_SHALLOWCAPABILITY_SYMREFCAPABILITY_SIDE_BAND_64KCAPABILITY_THIN_PACKCAPABILITIES_REFKNOWN_RECEIVE_CAPABILITIESKNOWN_UPLOAD_CAPABILITIESCOMMAND_DEEPENCOMMAND_SHALLOWCOMMAND_UNSHALLOWCOMMAND_DONECOMMAND_HAVECOMMAND_WANTSIDE_BAND_CHANNEL_DATASIDE_BAND_CHANNEL_PROGRESSSIDE_BAND_CHANNEL_FATALPktLineParserProtocolProtocolFileTCP_GIT_PORTZERO_SHAextract_capabilitiesparse_capability)write_pack_datawrite_pack_objects)read_info_refsANNOTATED_TAG_SUFFIXc                       \ rS rSrSrS rSrg)InvalidWantsv   zInvalid wants.c                 6    [         R                  U SU-  5        g )Nz/requested wants not in server provided refs: %r)	Exception__init__)selfwantss     !lib/third_party/dulwich/client.pyrA   InvalidWants.__init__y   s    CeK	
     N__name__
__module____qualname____firstlineno____doc__rA   __static_attributes__rG   rF   rD   r=   r=   v   s
    
rF   r=   c                       \ rS rSrSrS rSrg)HTTPUnauthorized   z!Raised when authentication fails.c                 H    [         R                  U S5        Xl        X l        g )NzNo valid credentials provided)r@   rA   www_authenticateurl)rB   rS   rT   s      rD   rA   HTTPUnauthorized.__init__   s    4!@A 0rF   )rT   rS   NrH   rG   rF   rD   rP   rP      s
    +rF   rP   c                 T    [        [        R                  " U // / S5      S   5      S:  $ )z'Check if a file descriptor is readable.r   )lenselect)filenos    rD   _fileno_can_readrZ      s(    v}}fXr2q1!4599rF   c           
         SSK JnJnJn  UR	                  5       nUR	                  5       nUR
                  R                  U SSSU" U5      U" U5      5      nU(       d  [        UR                  5       5      eUR                  $ )zCWrapper around PeekNamedPipe to check how many bytes are available.r   )byrefwintypeswindllN)
ctypesr\   r]   r^   DWORDkernel32PeekNamedPipeOSErrorGetLastErrorvalue)handler\   r]   r^   c_avail	c_messagesuccesss          rD   _win32_peek_availrj      sm    ..nnG Ioo++auW~uY/?G h++-..==rF   c                   *    \ rS rSrSrS rS rS rSrg)ReportStatusParser   zEHandle status as reported by servers with 'report-status' capability.c                 .    SU l         S U l        / U l        g )NF_done_pack_status_ref_statusesrB   s    rD   rA   ReportStatusParser.__init__   s    
 rF   c              #   \  #    U R                   S;  a  [        U R                   5      eU R                   Hb  n UR                  SS5      u  pUS:X  a*  UR                  SS5      u  p4X4R                  S5      4v   MH  US:X  a  US4v   MV  [        SU-  5      e   g! [         a     Mt  f = f7f)	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       s   ngutf-8s   okNzinvalid ref status %r)rq   r   rr   split
ValueErrordecoder   )rB   statusrestreferrors        rD   checkReportStatusParser.check   s      $88 1 122((F%||D!4 !ZZa0
<<0005Dj &'>'GHH )  s)   5B,BAB,
B)%B,(B))B,c                     U R                   (       a  [        S5      eUc  SU l         gU R                  c  UR                  5       U l        gUR                  5       nU R                  R                  U5        g)zgHandle a packet.

Raises:
  GitProtocolError: Raised when packets are received after a flush
  packet.
z&received more data after status reportNT)rp   r   rq   striprr   append)rB   pkt
ref_statuss      rD   handle_packet ReportStatusParser.handle_packet   s_     ::"#KLL;DJ$ #		DJ%%j1rF   ro   N)	rI   rJ   rK   rL   rM   rA   r   r   rN   rG   rF   rD   rl   rl      s    O 
I02rF   rl   c                 ^   S n0 nU R                  5        H[  nUR                  S5      R                  S S5      u  pEUS:X  a  [        UR	                  SS5      5      eUc  [        U5      u  pQXBU'   M]     [        U5      S:X  a  0 [        / 5      4$ U[        [        0:X  a  0 nU[        U5      4$ )N   
rw   s   ERRrx   replacer   )
read_pkt_seqrstripry   r   r{   r6   rW   setr%   r5   )protoserver_capabilitiesrefsr   shar~   s         rD   read_pkt_refsr      s    D!!#ZZ&,,T15
&="3::gy#ABB&)=c)B&SS	 $ 4yA~3r7{ (++()))rF   c                   h   ^  \ rS rSrSr/ SQrSS jrS rS rS r	S r
S	 rS
 rU 4S jrS rSrU =r$ )FetchPackResult   zResult of a fetch-pack operation.

Attributes:
  refs: Dictionary with all remote refs
  symrefs: Dictionary with remote symrefs
  agent: User agent string
clearcopyfromkeysgetitemskeyspoppopitem
setdefaultupdatevalues	viewitemsviewkeys
viewvaluesc                 @    Xl         X l        X0l        X@l        XPl        g N)r   symrefsagentnew_shallownew_unshallow)rB   r   r   r   r   r   s         rD   rA   FetchPackResult.__init__  s    	
&*rF   c                 6    SS K nUR                  S[        SS9  g )Nr   z!Use FetchPackResult.refs instead.   
stacklevelwarningswarnDeprecationWarningrB   r   s     rD   _warn_deprecated FetchPackResult._warn_deprecated  s    / 	 	
rF   c                    [        U[        5      (       a  U R                  5         U R                  U:H  $ U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ r   )
isinstancedictr   r   r   r   rB   others     rD   __eq__FetchPackResult.__eq__  si    eT""!!#99%%II# *-*

ekk)	
rF   c                 >    U R                  5         XR                  ;   $ r   r   r   rB   names     rD   __contains__FetchPackResult.__contains__"      yy  rF   c                 @    U R                  5         U R                  U   $ r   r   r   s     rD   __getitem__FetchPackResult.__getitem__&      yyrF   c                 L    U R                  5         [        U R                  5      $ r   r   rW   r   rs   s    rD   __len__FetchPackResult.__len__*      499~rF   c                 L    U R                  5         [        U R                  5      $ r   r   iterr   rs   s    rD   __iter__FetchPackResult.__iter__.      DIIrF   c                    > U[        U 5      R                  ;   a&  U R                  5         [        U R                  U5      $ [
        [        U ]  U5      $ r   )type_FORWARDED_ATTRSr   getattrr   superr   __getattribute__rB   r   	__class__s     rD   r    FetchPackResult.__getattribute__2  sD    4:...!!#499d++_d<TBBrF   c                     U R                   R                  < SU R                  < SU R                  < SU R                  < S3$ N(z, ))r   rI   r   r   r   rs   s    rD   __repr__FetchPackResult.__repr__8  s.    NN##IILLJJ	
 	
rF   )r   r   r   r   r   NNrI   rJ   rK   rL   rM   r   rA   r   r   r   r   r   r   r   r   rN   __classcell__r   s   @rD   r   r      sC    "+

!C
 
rF   r   c                   h   ^  \ rS rSrSr/ SQrSS jrS rS rS r	S r
S	 rS
 rU 4S jrS rSrU =r$ )SendPackResultiA  zResult 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   c                 (    Xl         X l        X0l        g r   )r   r   r   )rB   r   r   r   s       rD   rA   SendPackResult.__init__\  s    	
$rF   c                 6    SS K nUR                  S[        SS9  g )Nr   z Use SendPackResult.refs instead.r   r   r   r   s     rD   r   SendPackResult._warn_deprecateda  s    . 	 	
rF   c                     [        U[        5      (       a  U R                  5         U R                  U:H  $ U R                  UR                  :H  =(       a    U R                  UR                  :H  $ r   )r   r   r   r   r   r   s     rD   r   SendPackResult.__eq__j  sO    eT""!!#99%%yyEJJ&D4::+DDrF   c                 >    U R                  5         XR                  ;   $ r   r   r   s     rD   r   SendPackResult.__contains__p  r   rF   c                 @    U R                  5         U R                  U   $ r   r   r   s     rD   r   SendPackResult.__getitem__t  r   rF   c                 L    U R                  5         [        U R                  5      $ r   r   rs   s    rD   r   SendPackResult.__len__x  r   rF   c                 L    U R                  5         [        U R                  5      $ r   r   rs   s    rD   r   SendPackResult.__iter__|  r   rF   c                    > U[        U 5      R                  ;   a&  U R                  5         [        U R                  U5      $ [
        [        U ]  U5      $ r   )r   r   r   r   r   r   r   r   r   s     rD   r   SendPackResult.__getattribute__  sD    4:...!!#499d++^T;DAArF   c                 n    U R                   R                  < SU R                  < SU R                  < S3$ r   )r   rI   r   r   rs   s    rD   r   SendPackResult.__repr__  s!    #~~66		4::NNrF   )r   r   r   r   r   r   s   @rD   r   r   A  sF    "%

E!BO OrF   r   c                 J   [        5       n[        5       nU R                  5        Hy  nUR                  SS5      u  pEU[        :X  a!  UR	                  UR                  5       5        MB  U[        :X  a!  UR	                  UR                  5       5        Mm  [        SU-  5      e   X4$ )Nrv   rw   zunknown command %s)r   r   ry   r)   addr   r*   r   )r   r   r   r   cmdr   s         rD   _read_shallow_updatesr     s    %KEM!!#99T1%/!OOCIIK(%%ciik*"#7##=>> $ ''rF   c                       \ rS rSrSr    SS jrS r\S 5       rSS jr	SS jr
  SS	 jrS
 rS r\S 5       rS rS r SS\S\\   S\\/S4   S\\\\\   4      4S jjrS rS rS\4S jrSrg)	GitClienti  zGit smart server client.Nc                    X l         SU l        [        [        5      U l        U R                  R                  [        5       5        [        [        5      U l        U R                  R                  [        5       5        U(       a  U R                  R                  [        5        U(       d  U R                  R                  [        5        U(       a   U R                  R                  [        5        gg)zCreate a new GitClient instance.

Args:
  thin_packs: Whether or not thin packs should be retrieved
  report_activity: Optional callback for reporting transport
    activity.
  include_tags: send annotated tags when sending the objects they point
    to
N)_report_activity_report_status_parserr   UPLOAD_CAPABILITIES_fetch_capabilitiesr   r   RECEIVE_CAPABILITIES_send_capabilitiesr   remover$   r   )rB   
thin_packsreport_activityquietinclude_tagss        rD   rA   GitClient.__init__  s      !0%)"#&':#;   $$%5%78"%&:";##$4$67##''(89$$++,@A$$(()?@ rF   c                 ,    [        U R                  5      e)zrRetrieves full url to given path.

Args:
  path: Repository path (as string)

Returns:
  Url to path (as string)

)NotImplementedErrorget_urlrB   paths     rD   r  GitClient.get_url  s     "$,,//rF   c                 ,    [        U R                  5      e)zCreate an instance of this client from a urlparse.parsed object.

Args:
  parsedurl: Result of urlparse()

Returns:
  A `GitClient` object
)r  from_parsedurlcls	parsedurlkwargss      rD   r  GitClient.from_parsedurl  s     "#"4"455rF   c                 ,    [        U R                  5      e)a  Upload a pack to a remote repository.

Args:
  path: Repository path (as bytestring)
  update_refs: Function to determine changes to remote refs. Receive
    dict with existing remote refs, returns dict with
    changed refs (name -> sha, where sha=ZERO_SHA for deletions)
  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

)r  	send_pack)rB   r  update_refsgenerate_pack_dataprogresss        rD   r  GitClient.send_pack  s    & "$..11rF   c           	        ^^	 Uc  TR                   R                  n[        U R                  ;   a  [	        5       m	U	U4S jnS nOTR                   R                  5       u  m	pg U R                  UUTR                  5       T	R                  UUS9nU" 5         TR                  UR                  UR                  5        U$ ! [         a	    U" 5         e f = f)a  Fetch into a target repository.

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

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

c                     > T R                  5       (       a8  T R                  S5        TR                  R                  T R                  S 5        g g )Nr   )tellseekobject_storeadd_thin_packread)ftargets   rD   commitGitClient.fetch.<locals>.commit  s8    6688FF1I''55affdC rF   c                      g r   rG   rG   rF   rD   abortGitClient.fetch.<locals>.abort      rF   r   depth)r&  determine_wants_allr$   r  r   add_pack
fetch_packget_graph_walkerwriteBaseExceptionupdate_shallowr   r   )
rB   r  r*  determine_wantsr   r2  r+  r.  resultr)  s
     `      @rD   fetchGitClient.fetch  s      "$11EEO4#;#;; 	AD
  &22;;=Av	__'')! % F Hf00&2F2FG  	G	s   #,B> >Cc                 ,    [        U R                  5      e)  Retrieve a pack from a git smart server.

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

Returns:
  FetchPackResult object

)r  r5  )rB   r  r:  graph_walker	pack_datar   r2  s          rD   r5  GitClient.fetch_pack  s    2 "$//22rF   c                 ,    [        U R                  5      e)z}Retrieve the current refs from a git smart server.

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

Returns:

)r  get_refsr  s     rD   rD  GitClient.get_refs5  s     "$--00rF   c                     UR                  5        H(  n[        USS 5      nUSS n X$   nUb
  U" U5        M(  M*     g! [         a    [        SU-  5      ef = f)zRead per-channel data.

This requires the side-band-64k capability.

Args:
  proto: Protocol object to read from
  channel_callbacks: Dictionary mapping channels to packet
    handlers to use. None for a callback discards channel data.
Nrw   zInvalid sideband channel %d)r   ordKeyErrorAssertionError)rB   r   channel_callbacksr   channelcbs         rD   _read_side_band64k_data!GitClient._read_side_band64k_data@  su     %%'C#bq'lGab'C&/ >sG " (
  N$%BW%LMMNs	   >Ac                 B    [        S U R                  5        5       5      $ )Nc              3   2   #    U  H  o[         :g  v   M     g 7fr   )r5   ).0r   s     rD   	<genexpr>.GitClient._should_send_pack.<locals>.<genexpr>X  s     @.?s(?.?s   )anyr   )new_refss    rD   _should_send_packGitClient._should_send_packU  s     @hoo.?@@@rF   c           	      .   / nUR                  5        Vs/ s H  of[        :X  a  M  UPM     nnSnU GHG  n	[        U	[        5      (       d  [	        SU	-  5      eUR                  U	[        5      n
[        U
[        5      (       d  [	        SU	< SU
< 35      eUR                  U	[        5      n[        U[        5      (       d  [	        SU	< SU< 35      eX:w  ay  [        R                  SXU5        U(       a  UR                  U
S-   U-   S-   U	-   5        O=UR                  U
S-   U-   S-   U	-   S-   SR                  [        U5      5      -   5        S	nX;  d  GM)  U[        :w  d  GM6  UR                  U5        GMJ     UR                  S
5        Xu4$ s  snf )zHandle the head of a 'git-receive-pack' request.

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

Returns:
  (have, want) tuple
Fzrefname is not a bytestring: %rzold sha1 for z is not a bytestring: z is not a bytestring z Sending updated ref %r: %r -> %rrv       TN)r   r5   r   bytes	TypeErrorr   loggerdebugwrite_pkt_linejoinsortedr   )rB   r   capabilitiesold_refsrU  wantxhavesent_capabilitiesrefnameold_sha1new_sha1s               rD   _handle_receive_pack_head#GitClient._handle_receive_pack_headZ  s    #??,B,aM,B!Ggu-- AG KLL||GX6Hh..AH(S   ||GX6Hh..@GR  #6x1 %((D8)Cd)JW)TU(( "#  "	"
    ))F<$89: )-%#H(<H%A  B 	T"|K Cs
   FFc                     U R                   U-  nS nU H  n[        U5      u  pVU[        :X  d  M  UnM      [        U5      [        -
  nX#4$ r   )r  r7   r   r   r&   )rB   r   negotiated_capabilitiesr   
capabilitykvunknown_capabilitiess           rD   $_negotiate_receive_pack_capabilities.GitClient._negotiate_receive_pack_capabilities  s^    "&"9"9<O"O-J#J/DA$$ .
 %%89<VV 	 '--rF   r   ra  r   returnc                    [         U;   aR  Uc  S nSU0n[        U;   a,  [        U R                  R                  5      R
                  US'   U R                  X5        O<[        U;   a2  UR                  5        H  nU R                  R	                  U5        M      U R                  b#  [        U R                  R                  5       5      $ g)a;  Handle the tail of a 'git-receive-pack' request.

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

Returns:
  dict mapping ref name to:
    error message if the ref failed to update
    None if it was updated successfully
Nc                     g r   rG   rd  s    rD   r   5GitClient._handle_receive_pack_tail.<locals>.progress      rF      rw   )
r#   r    r1   r  r   parserM  r   r   r   )rB   r   ra  r   rJ  r   s         rD   _handle_receive_pack_tail#GitClient._handle_receive_pack_tail  s    $ $|3 "#H'<7'4..<<(% "!$ ((B'<7 --/C..<<SA 0%%12288:;;rF   c                     [        U5      [        -
  n0 nS nU H@  n[        U5      u  pgU[        :X  a  UR	                  SS5      u  pXU'   U[
        :X  d  M>  UnMB     U R                  U-  n
XU4$ )N   :rw   )r   r'   r7   r"   ry   r   r  )rB   r   rq  r   r   rn  ro  rp  srcdstrm  s              rD   #_negotiate_upload_pack_capabilities-GitClient._negotiate_upload_pack_capabilities  s    $%89<UU 	 -J#J/DA%%WWT1-
"$$ . #'":":=P"P'%88rF   c                    [        U[        5      (       a  [        US   [        5      (       d   eUR                  [        S-   US   -   S-   SR                  [        U5      5      -   S-   5        USS  H!  nUR                  [        S-   U-   S-   5        M#     US;  d  [        USS5      (       a  [        U;  a  [        S5      eUR                   H!  nUR                  [        S-   U-   S-   5        M#     Ub6  UR                  [        S-   [        U5      R                  S	5      -   S-   5        UR                  S5        Ub  [        U5      u  pO S=pO[!        5       =pUR                  S5        [#        U5      nU(       a  UR                  [$        S-   U-   S-   5        Ub~  U" 5       (       ar  UR'                  5       nUR)                  S5      R+                  S5      nUS   S
:X  a9  UR-                  US   5        US   S;   a  OUS   S:X  a  O%[/        SUS   -  5      e[#        U5      nU(       a  M  UR                  [0        S-   5        X4$ )az  Handle the head of a 'git-upload-pack' request.

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

Returns:

r   rv   r   rw   N)r   Nshallowz=server does not support shallow capability required for depthascii   ACKrz  )   continue   common   readyz(%s not in ('continue', 'ready', 'common))r   listrZ  r^  r-   r_  r`  r   r!   r   r  r)   r(   strencoder   r   nextr,   read_pkt_liner   ry   ackrI  r+   )rB   r   ra  r@  rC   can_readr2  rc  r   r   r   re  r   partss                 rD   _handle_upload_pack_head"GitClient._handle_upload_pack_head  sd   " %&&:eAh+F+FFFAh  ii|,-	.
 	
 !"ID  !4t!;e!CD 	!W\9d%K%K!5&V  $++$$_t%;c%AE%IJ , $$"T)CJ,=,=g,FFN   &#/DU/K,m.22m*-%/K  &L!  !4t!;e!CD#

))+

5)//58v% $$U1X.Qx#;;qX-,FqQ  %D d  	\E12++rF   c                    UR                  5       nU(       ao  UR                  S5      R                  S5      nUS   S:X  a  UR                  US   5        [	        U5      S:  d	  US   S;  a  OUR                  5       nU(       a  Mo  [
        U;   a%  Uc  S
 nU R                  U[        U[        U05        g	 UR                  U5      n	U	S:X  a  g	U" U	5        M"  )aJ  Handle the tail of a 'git-upload-pack' request.

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

Returns:

r   rv   r   r  rw   r   rz  )r  r  r  Nc                     g r   rG   rw  s    rD   r   4GitClient._handle_upload_pack_tail.<locals>.progress=  ry  rF   rF   )
r  r   ry   r  rW   r#   rM  r.   r/   r(  )
rB   r   ra  r@  rA  r   rbufsizer   r  datas
             rD   _handle_upload_pack_tail"GitClient._handle_upload_pack_tail  s    , !!#JJu%++D1EQx6!  q*5zA~q 2 "
 %%'C c $|3 ((*I. zz(+3;$	 rF   )r  r  r  r  )TNFFr   NNNr   )rI   rJ   rK   rL   rM   rA   r  classmethodr  r  r<  r5  rD  rM  staticmethodrV  rj  rr  r2   r	   rZ  r   r   r   r  r|  r  r  r   r  rN   rG   rF   rD   r  r    s    " A:
0 	6 	62*0p 36	1* A A2h." -1	%% %j% E7D=)	%
 
$uhsm+,	-%N9$A,R 5 rF   r  c                     [        U 5      UR                  5        VVs1 s H#  u  p#UR                  [        5      (       a  M!  UiM%     snn-
  nU(       a  [	        U5      egs  snnf )zCheck that a set of wants is valid.

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

Returns:

N)r   r   endswithr;   r=   )rC   r   ro  rp  missings        rD   check_wantsr  O  sW     %j

$fqAJJ7K,L G 7## s    A!A!c                 (   U c
  [        5       $ U R                  5        Vs/ s H  oR                  S5      PM     nnU HB  nUR                  S5      (       d  M  [	        U[        S5      S  R                  SS5      5      s  $    [        U5      $ s  snf )Nr   s   ERROR: rx   r   )r   	readlinesr   
startswithr   rW   r{   )stderrlineliness      rD   _remote_error_from_stderrr  `  s    ~  ,2,<,<,>?,>D[[,>E???:&&#DZ):$;$B$B7I$VWW  5!!	 @s   Bc                   n   ^  \ rS rSrSrSr\4U 4S jjrS rSS jr  SS jr	S r
     SS	 jrS
rU =r$ )TraditionalGitClientij  zTraditional Git client.rx   c                 :   > Xl         [        [        U ]  " S0 UD6  g NrG   )_remote_path_encodingr   r  rA   )rB   path_encodingr  r   s      rD   rA   TraditionalGitClient.__init__o  s    %2""D2<V<rF   c                    #    [        5       e7f)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)
)r  )rB   r   r  s      rD   _connectTraditionalGitClient._connects  s      "##s   c                 4   U R                  SU5      u  pVnU    [        U5      u  pU R	                  U	5      u  n
n[
        U
;   a  [        5       U l        U R                  n U" [        U5      5      =p[        UR                  5       5      R                  [        UR                  5       5      5      (       a$  UR                  S5        [        X0 S9sSSS5        $ [        U	;  ae  [        U5      nUR                  5        HF  u  nnU[         :X  d  M  [
        U
;   a(  UR"                  R%                  SU-   S-   5        SUl        X	 MH     Uc$  UR                  S5        [        X0 S9sSSS5        $ [)        U5      S:X  aS  [)        U5      (       aC  UR                  S5        Ub  [        UR+                  5       5      nOSn[        XUS9sSSS5        $ U R-                  XZX5      u  nnU" UU[.        U
;   S9u  nnU R1                  U5      (       a  [3        UR5                  5       UU5        U R7                  XZU5      n[        XUS9sSSS5        $ ! [         a    [        U5      ef = f! [         a    UR                  S5        e f = f! , (       d  f       g= f)	a  Upload a pack to a remote repository.

Args:
  path: Repository path (as bytestring)
  update_refs: Function to determine changes to remote refs.
Receive dict with existing remote refs, returns dict with
changed refs (name -> sha, where sha=ZERO_SHA for deletions)
  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_delta)r  r   r   r  rr  r    rl   r  r   r8  r^  r   r   issubsetr   r   r5   rr   r   _ref_status_okrW   r   rj  r   rV  r8   
write_filer|  )rB   r  r  r  r   r   unused_can_readr  rb  r   rm  r   report_status_parserrU  orig_new_refsr~   r   r   re  rc  pack_data_countrA  s                         rD   r  TraditionalGitClient.send_pack  s   & *.)M&80=e0D- 99:MN''+BB-?-A*#'#=#= +6tH~+FF
 8>>#$--c(..2B.CDD$$T*%hK+ U. &-@@. - 3 3 5HCh37NN0>>EE &/X X CH0?$M !6 $$T*%hKK UN 8}!c-&8&8$$T*'3!%&:&@&@&B!CJ!%J%h
S] U`  99LT4 *</3JJ*&OY %%h// 0 0 2OYO77J "(JOA U # 8/778 ! $$T* UsU   J	I9J	!I)3AJ	3J	AJ	1AJ	A3J	I&&J	)JJ		
Jc           
         U R                  SU5      u  pxn	U    [        U5      u  pU R	                  U5      u  nnnU
c&  UR                  S5        [        XU5      sSSS5        $  U" U
5      nUb  U Vs/ s H  nU[        :w  d  M  UPM     nnU(       d&  UR                  S5        [        XU5      sSSS5        $ U R                  UUUUUUS9u  nnU R                  UUUUU5        [        XUUU5      sSSS5        $ ! [         a    [        U	5      ef = f! [         a    UR                  S5        e f = fs  snf ! , (       d  f       g= f)r?     upload-packN)r2  )r  r   r   r  r  r^  r   r8  r5   r  r  )rB   r  r:  r@  rA  r   r2  r   r  r  r   r   rm  r   r   rC   cidr   r   s                      rD   r5  TraditionalGitClient.fetch_pack  sv   2 #'--"E8,9%,@) 889LM	' |$$T*&te< U'-  (-AA$$T*&te<1 U2 ,0+H+H' ,I ,([- ))' #4%mTQ U # 8/778 ! $$T* B+ UsQ   D=C?4D=&D.D=5D8D8%D=<9D=?DD=D55D==
Ec                     U R                  SU5      u  p#nU    [        U5      u  pSUR	                  S5        UsSSS5        $ ! [         a    [        U5      ef = f! , (       d  f       g= f)2Retrieve the current refs from a git smart server.r  N)r  r   r   r  r^  )rB   r  r   _r  r   s         rD   rD  TraditionalGitClient.get_refs  sk      ==>&8'.   & U # 8/778 Us!   AAAAA
A*c	           
         U R                  SU5      u  pnU	   Ub  U	R                  SU-   5        U	R                  SU-   5        Ub  U H  nU	R                  SU-   5        M     Ub  U	R                  SU-   5        U	R                  S 5         U	R                  5       nUS:X  d  US:X  a
   S S S 5        g US:X  d  US:X  a  OQUR                  S	5      (       a-  [        US
S  R                  S5      R                  SS5      5      e[        SU-  5      eU	R                  5       nUb  [        S5      eU R                  U	[        U[        U[        U05        S S S 5        g ! [         a    [	        U5      ef = f! , (       d  f       g = f)Ns   upload-archives   argument --format=s	   argument s   argument --prefix=s   NACK
s   NACKs   ACK
r  s   ERR    r   rx   r   zinvalid response %rzexpected pkt tail)r  r^  r  r   r  r  r   r   r{   rI  rM  r.   r/   r0   )rB   r  
committish
write_datar   write_errorformatsubdirsprefixr   r  r  subdirr   rets                  rD   archiveTraditionalGitClient.archive(  s    #'--0A4"H!$$%:V%CD  
!:;"%F(()>? &!$$%:V%CD  &8))+ i3'> U  C6M((&s12w~~e'<'C'CGY'WXX$%:S%@AA%%'C$%899((*J.+[3 U # 8/778 Us+   A4E5EE53B E5E22E55
F)r  r  r   r   NNNNN)rI   rJ   rK   rL   rM   DEFAULT_ENCODINGrA   r  r  r5  rD  r  rN   r   r   s   @rD   r  r  j  sQ    !%5 =$TPx BUH
" , ,rF   r  c                   L   ^  \ rS rSrSrSU 4S jjr\S 5       rS rS r	Sr
U =r$ )	TCPGitClientiW  z8A Git Client that works over TCP directly (i.e. git://).c                 X   > Uc  [         nXl        X l        [        [        U ]  " S0 UD6  g r  )r4   _host_portr   r  rA   )rB   hostportr  r   s       rD   rA   TCPGitClient.__init__Z  s)    <D

lD*4V4rF   c                 @    U " UR                   4SUR                  0UD6$ )Nr  )hostnamer  r  s      rD   r  TCPGitClient.from_parsedurla  s!    9%%EINNEfEErF   c                     U R                   nU R                  b&  U R                  [        :w  a  USU R                  -  -  n[        SX!SS45      $ )N:%dgit )r  r  r4   r   rB   r  netlocs      rD   r  TCPGitClient.get_urle  sG    ::!djjL&@edjj((F5&B788rF   c                 $  ^^^ [        U[        5      (       d  [        U5      e[        U[        5      (       d  UR                  U R                  5      n[
        R                  " U R                  U R                  [
        R                  [
        R                  5      nS m[
        R                  " SU R                  -  5      nU H_  u  pVpxn	[
        R
                  " XVU5      mTR                  [
        R                  [
        R                  S5         TR                  U	5          O   Tc  UeTR#                  SS5      mTR#                  SS5      mUUU4S jn[%        TR&                  TR(                  UU R*                  S9nUR-                  S	5      (       a  USS  nUR/                  S
U-   USU R                  R                  S5      -   5        UU4S jS 4$ ! [
        R                   a#  n
U
nTb  TR!                  5         S m S n
A
GMF  S n
A
ff = f)Nzno address found for %srw   rbwbr   c                  f   > T R                  5         TR                  5         TR                  5         g r   )close)rfileswfiles   rD   r  $TCPGitClient._connect.<locals>.close  s    KKMKKMGGIrF   r  s   /~   git-s   host=r  c                     > [        T 5      $ r   )rZ   )r  s   rD   <lambda>'TCPGitClient._connect.<locals>.<lambda>  s    .q1rF   )r   rZ  r[  r  r  socketgetaddrinfor  r  	AF_UNSPECSOCK_STREAMr   
setsockoptIPPROTO_TCPTCP_NODELAYconnectr  makefiler2   r(  r7  r  r  send_cmd)rB   r   r  	sockaddrserrfamilysocktyper   	canonnamesockaddrer  r  r  r  s               @@@rD   r  TCPGitClient._connectk  s   #u%%C. $&&;;t99:D&&JJ

F$4$4f6H6H
	 ll4tzzAB>G:Vuf6ALL++V-?-?C		(# ?H 9I

4$

4#	
 JJKK 11	
 ??5!!8Dw}dHtzz7H7H7Q,QR14777 << =GGI	s   GH,H

H)r  r  r   )rI   rJ   rK   rL   rM   rA   r  r  r  r  rN   r   r   s   @rD   r  r  W  s0    B5 F F9+8 +8rF   r  c                   :    \ rS rSrSrS r\S 5       rS rS r	Sr
g)	SubprocessWrapperi  z:A socket-like object that talks to a subprocess via pipes.c                     Xl         [        UR                  5      R                  U l        UR                  R
                  U l        g r   )procr   stdoutr(  stdinr7  )rB   r  s     rD   rA   SubprocessWrapper.__init__  s.    	"4;;/44	ZZ%%
rF   c                 .    U R                   R                  $ r   )r  r  rs   s    rD   r  SubprocessWrapper.stderr  s    yyrF   c                     [         R                  S:X  a>  SSKJn  U" U R                  R
                  R                  5       5      n[        U5      S:g  $ [        U R                  R
                  R                  5       5      $ )Nwin32r   )get_osfhandle)	sysplatformmsvcrtr  r  r  rY   rj   rZ   )rB   r  rf   s      rD   r  SubprocessWrapper.can_read  s\    <<7","499#3#3#:#:#<=F$V,11#DII$4$4$;$;$=>>rF   c                 F   U R                   R                  R                  5         U R                   R                  R                  5         U R                   R                  (       a$  U R                   R                  R                  5         U R                   R                  5         g r   )r  r  r  r  r  waitrs   s    rD   r  SubprocessWrapper.close  s]    				 99II""$		rF   )r  r(  r7  N)rI   rJ   rK   rL   rM   rA   propertyr  r  r  rN   rG   rF   rD   r
  r
    s(    D&
    ?rF   r
  c                      [         R                  S:X  a   SSKn U R                  S5      u  pU/$ S/$ ! [         a    / SQs $ f = f)z3Find command to run for system Git (usually C Git).r  r   Nr  )r   z/cr  )r  r  win32apiFindExecutableImportError)r  r|   r  s      rD   find_git_commandr!    sO    
||w	 #11%8KF5Lw  	(''	(s   3 AAc                   2    \ rS rSrSr\S 5       rSrS rSr	g)SubprocessGitClienti  z5Git client that talks to a server using a subprocess.c                     U " S0 UD6$ r  rG   r  s      rD   r  "SubprocessGitClient.from_parsedurl      }V}rF   Nc                 ,   [        U[        5      (       d  [        U5      e[        U[        5      (       a  UR                  U R                  5      nU R
                  c
  [        5       nWUR                  S5      U/-   n[        R                  " US[        R                  [        R                  [        R                  S9n[        U5      n[        UR                  UR                  UR                  U R                  S9UR                   UR"                  4$ )Nr  r   bufsizer  r  r  r  )r   rZ  r[  r{   r  git_commandr!  
subprocessPopenPIPEr
  r2   r(  r7  r  r  r  r  )rB   servicer  r*  argvppws          rD   r  SubprocessGitClient._connect  s    '5))G$$dE"";;t99:D#*,KgnnW5t<<//????
 q! $ 5 5	 KKHH	
 		
rF   rG   )
rI   rJ   rK   rL   rM   r  r  r*  r  rN   rG   rF   rD   r#  r#    s#    ?  K
rF   r#  c                   p    \ rS rSrSrSS jrS r\S 5       r\S 5       r	SS jr
SS	 jr  SS
 jrS rSrg)LocalGitClienti  z'Git Client that just uses a local Repo.Nc                     X l         g)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  )rB   r
  r  configs       rD   rA   LocalGitClient.__init__  s
     !0rF   c                 "    [        SSUSS45      $ )Nfiler  )r   r  s     rD   r  LocalGitClient.get_url  s    62tR455rF   c                     U " S0 UD6$ r  rG   r  s      rD   r  LocalGitClient.from_parsedurl  r&  rF   c                     SSK Jn  [        U[        5      (       d  [        R
                  " U5      n[        U" U5      5      $ )Nr   )Repo)dulwich.repor?  r   r  osfsdecoder   )r  r  r?  s      rD   
_open_repoLocalGitClient._open_repo  s/    %$$$;;t$DtDz""rF   c           	         U(       d  S nU R                  U5       nUR                  5       nU" [        U5      5      nUR                  5        Vs/ s H  o[        :w  d  M  UPM     n	n/ n
UR                  5        H0  u  pX;  d  M  X;  d  M  U[        :w  d  M  U
R                  U5        M2     U
(       dW  [        UR                  5       5      R                  [        UR                  5       5      5      (       a  [        U0 S9sSSS5        $ UR                  R                  " U" XSS96   0 nUR                  5        H  u  pUR                  U[        5      nU[        :w  a;  UR                  R                  XU5      (       d  SU< SU< 3nU" U5        XU'   M^  M`  UR                  R                  X5      (       a  M  U" SU-  5        S	X'   M     SSS5        [        WWS9$ s  snf ! , (       d  f       N= f)
a  Upload a pack to a remote repository.

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

Returns:
  SendPackResult

Raises:
  SendPackError: if server rejects the pack data

c                     g r   rG   rw  s    rD   r   *LocalGitClient.send_pack.<locals>.progress  r0  rF   )r   NTr  zunable to set z to zunable to remove %szunable to remove)rC  rD  r   r   r5   r   r   r   r  r   r&  add_pack_datar   r   set_if_equalsremove_if_equals)rB   r  r  r  r   r*  rb  rU  sha1re  rc  rg  ri  r   rh  msgs                   rD   r  LocalGitClient.send_pack  s   $  __T"f(H"4>2H%-__%6K%6T(:JD%6DKD%-^^%5!( , H,KK) &6 C 01::3x~~?O;PQQ%h2> #"" --#D$? J%-^^%5!#<<:x'!;;44WQQ:A8L .17+ R
 ";;77JJ !6!@A.@
+ &6/ #F h:>>? L	 #"sC   4G)G$!G$'G)G)G)A)G)B.G)?G)$G))
G7c                     U R                  U5       nUR                  UUUUS9n[        XvR                  R	                  5       [        5       5      sSSS5        $ ! , (       d  f       g= f)a  Fetch into a target repository.

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

Returns:
  FetchPackResult object

)r:  r   r2  N)rC  r<  r   r   get_symrefsr   )rB   r  r*  r:  r   r2  rr   s           rD   r<  LocalGitClient.fetchB  sX      __T"a77 /!	  D #4););)=|~N #""s   >A
A(c                 T   U R                  U5       nUR                  X#XVS9nUR                  R                  5       n	[	        5       n
Uc  [        SX5      sSSS5        $ [        SU5      n[        X5        [        UR                  5       X5      sSSS5        $ ! , (       d  f       g= f)r?  r1  N)	rC  fetch_objectsr   rO  r   r   r3   r9   rD  )rB   r  r:  r@  rA  r   r2  rP  objects_iterr   r   protocols               rD   r5  LocalGitClient.fetch_pack[  s    2 __T"a?? + L ff((*G NE #&tW< #" $D)4Hx6"1::<@ #""s   AB0B
B'c                 z    U R                  U5       nUR                  5       sSSS5        $ ! , (       d  f       g= f)r  N)rC  rD  )rB   r  r*  s      rD   rD  LocalGitClient.get_refs  s(     __T"f??$ #""s   ,
:r6  )TNNr   r  r   )rI   rJ   rK   rL   rM   rA   r  r  r  rC  r  r<  r5  rD  rN   rG   rF   rD   r4  r4    sW    106   # #:?xO> &AP%rF   r4  c                   <    \ rS rSrSr    SS jr    SS jrSrg)	SSHVendori  z!A client side SSH implementation.Nc           	      ^    SS K nUR                  S[        5        U R                  UUUUUUS9$ )Nr   z?SSHVendor.connect_ssh has been renamed to SSHVendor.run_command)usernamer  passwordkey_filename)r   r   r   run_command)rB   r  commandr\  r  r]  r^  r   s           rD   connect_sshSSHVendor.connect_ssh  sE     	M	
 %   
 	
rF   c                 ,    [        U R                  5      e)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

Returns:

)r  r_  )rB   r  r`  r\  r  r]  r^  s          rD   r_  SSHVendor.run_command  s    2 "$"2"233rF   rG   NNNN)rI   rJ   rK   rL   rM   ra  r_  rN   rG   rF   rD   rZ  rZ    s+    + 
: 4rF   rZ  c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )StrangeHostnamei  z,Refusing to connect to strange SSH hostname.c                 ,   > [         [        U ]  U5        g r   )r   rg  rA   )rB   r  r   s     rD   rA   StrangeHostname.__init__  s    ot-h7rF   rG   )rI   rJ   rK   rL   rM   rA   rN   r   r   s   @rD   rg  rg    s    68 8rF   rg  c                   *    \ rS rSrSr    SS jrSrg)SubprocessSSHVendori  z6SSH vendor that shells out to the local 'ssh' command.Nc                    Ub  [        S5      eSS/nU(       a  UR                  S[        U5      /5        U(       a  UR                  S[        U5      /5        U(       a	  U< SU< 3nUR                  S5      (       a	  [	        US9eUR                  U5        [        R                  " Xr/-   S	[        R                  [        R                  [        R                  S
9n[        U5      $ )Nz6Setting password not supported by SubprocessSSHVendor.sshz-xz-p-i@-r  r   r(  )
r  extendr  r  rg  r   r+  r,  r-  r
  )	rB   r  r`  r\  r  r]  r^  argsr  s	            rD   r_  SubprocessSSHVendor.run_command  s     %H  t}KKs4y)*KKs<012&-D??3!400D9//????
 !&&rF   rG   re  rI   rJ   rK   rL   rM   r_  rN   rG   rF   rD   rk  rk    s    @ $'rF   rk  c                   *    \ rS rSrSr    SS jrSrg)PLinkSSHVendori  z8SSH vendor that shells out to the local 'plink' command.Nc                 P   [         R                  S:X  a  SS/nOSS/nUb1  SS KnUR                  S5        UR	                  S[        U5      /5        U(       a  UR	                  S[        U5      /5        U(       a  UR	                  S	[        U5      /5        U(       a	  U< S
U< 3nUR                  S5      (       a	  [        US9eUR                  U5        [        R                  " Xr/-   S[        R                  [        R                  [        R                  S9n	[        U	5      $ )Nr  z	plink.exez-sshplinkr   zHInvoking PLink with a password exposes the password in the process list.z-pwz-Prn  ro  rp  rq  r(  )r  r  r   r   rr  r  r  rg  r   r+  r,  r-  r
  )
rB   r  r`  r\  r  r]  r^  rs  r   r  s
             rD   r_  PLinkSSHVendor.run_command  s     <<7"(DV$DMM  KKH./KKs4y)*KKs<012&-D??3!400D9//????
 !&&rF   rG   re  ru  rG   rF   rD   rw  rw    s    B +'rF   rw  c                  R    SS K nUR                  S[        5        SSKJn  U" S0 U D6$ )Nr   zDParamikoSSHVendor has been moved to dulwich.contrib.paramiko_vendor.)ParamikoSSHVendorrG   )r   r   r   dulwich.contrib.paramiko_vendorr|  )r  r   r|  s      rD   r|  r|  (  s+    MMN B&v&&rF   c                   Z   ^  \ rS rSr      SU 4S jjrS r\S 5       rS rS r	Sr
U =r$ )	SSHGitClienti8  c                    > Xl         X l        X0l        X`l        Xpl        [
        [        U ]  " S0 UD6  0 U l        Ub  X@l	        g [        5       U l	        g r  )r  r  r\  r]  r^  r   r  rA   alternative_paths
ssh_vendorget_ssh_vendor)
rB   r  r  r\  vendorr7  r]  r^  r  r   s
            rD   rA   SSHGitClient.__init__9  sN     		  (lD*4V4!#$O,.DOrF   c                     U R                   nU R                  b  USU R                  -  -  nU R                  b  [        U R                  S5      S-   U-   n[	        SX!SS45      $ )Nr  z@/:ro  rm  r  )r  r  r\  urlquoter   r  s      rD   r  SSHGitClient.get_urlP  s`    99 edii''F==$dmmU3c9FBF5&B788rF   c                 V    U " SUR                   UR                  UR                  S.UD6$ )N)r  r  r\  rG   )r  r  r\  r  s      rD   r  SSHGitClient.from_parsedurlZ  s7     
##''
 	
 	
rF   c                 r    U R                   R                  USU-   5      n[        U[        5      (       d   eU$ )Nr  )r  r   r   rZ  )rB   r   s     rD   _get_cmd_pathSSHGitClient._get_cmd_pathc  s6    $$((gm<#u%%%%
rF   c                    [        U[        5      (       d  [        U5      e[        U[        5      (       a  UR                  U R                  5      nUR                  S5      (       a  USS  nU R                  U5      R                  U R                  5      S-   U-   S-   n0 nU R                  b  U R                  US'   U R                  b  U R                  US'   U R                  R                  " U R                  U4U R                  U R                  S.UD6n[        UR                  UR                   UR"                  U R$                  S9UR&                  [)        US	S 5      4$ )
Nz/~rw   z ''r]  r^  )r  r\  r  r  )r   rZ  r[  r{   r  r  r  r]  r^  r  r_  r  r  r\  r2   r(  r7  r  r  r  r   )rB   r   r  r/  r  cons         rD   r  SSHGitClient._connecth  sK   #u%%C. dE"";;t99:D??4  8Ds#**4+E+EF  	 ==$!%F:(%)%6%6F>"oo))IIt
"&))dmm
GM
 				 $ 5 5	 LLC4(	
 		
rF   )r  r  r^  r]  r  r  r\  )NNNNNN)rI   rJ   rK   rL   rA   r  r  r  r  r  rN   r   r   s   @rD   r  r  8  sD     /.9 
 


 
rF   r  c            	          SSR                  [        R                   V s/ s H  n [        U 5      PM     sn 5      -  $ s  sn f )Nzgit/dulwich/%s.)r_  dulwich__version__r  rw  s    rD   default_user_agent_stringr    s6     chh8K8K'L8K1A8K'LMMM'Ls   =
c                 z   S=pES=pgUc-  S H'  n[         R                  R                  U5      nUc  M'    O   U bO  Uc   U R                  SS5      n U R                  SS5      n U R	                  SS5      n U R                  SS5      nUc
  [        5       nS	U0n	0 n
USL a  S
U
S'   OUSL a  SU
S'   OS
U
S'   Ub  XjS'   U
R                  U5        SU
;  a-  U
R                  S5      S:w  a   SSKnUR                  5       U
S'   SSK
nUbA  Uc  UR                  n[        U[        5      (       d  UR                  5       nU" U4SU	0U
D6nU$ Uc  UR                  nU" SSU	0U
D6nU$ ! [         a     GN"f = f! [         a     GN f = f! [         a    Sn GN f = f! [         a    Sn GN f = f! [         a     Nf = f)a  Return `urllib3` connection pool manager.

Honour detected proxy configurations.

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

Returns:
  `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CERT_REQUIRED	cert_reqsF	CERT_NONEca_certsr   headersrG   )rA  environr   rH  get_booleanr  r   certifiwherer   urllib3ProxyManagerr   r  r{   PoolManager)r7  pool_manager_clsproxy_manager_clsoverride_kwargsproxy_server
user_agentr  
ssl_verify	proxynamer  r  r  r  managers                 rD   default_urllib3_managerr    s$   " !%$L  HCI::>>)4L' D
 %zz'8<	G\:J
	++G\BJ	zz'<8H .0
Z(GFT-{	u	){ .{%z
MM/" FJJ{$;{$J	1 ")F:$ ' 4 4 ,,,'..0L#LL'LVL N	 #&22"=7=f=Ny    		  	J	
  	H	2  		sY   E% E6 $F 7F +F- %
E32E36
FFFFF*)F*-
F:9F:c                   ~    \ rS rSr     SS jrS r\S 5       rS rS r	SS jr
S	 rS
 rSS jr  SS jrS rSrg)HttpGitClienti  Nc                 X   UR                  S5      S-   U l        XPl        X`l        X l        Uc  [        U5      U l        OX0l        UbK  U< SU< 3nSS Kn	U	R                  R                  US9n
U R                  R                  R                  U
5        [        R                  " U 40 UD6  g )N/:r   )
basic_auth)r   	_base_url	_username	_passworddumbr  pool_managerurllib3.utilutilmake_headersr  r   r  rA   )rB   base_urlr  r  r7  r\  r]  r  credentialsr  r  s              rD   rA   HttpGitClient.__init__  s     "-3!!	 7 ?D , &.x8K 22k2JJ%%,,Z84*6*rF   c                 B    U R                  U5      R                  S5      $ )Nr  )_get_urlr   r  s     rD   r  HttpGitClient.get_url  s    }}T"))#..rF   c                 `   UR                   nUb  [        U5      US'   UR                  nUb  [        U5      US'   UR                  nUR                  (       a  U< SUR                  < 3nUR                  (       a  UR                  < SU< 3nUR                  US9nU " [        U5      40 UD6$ )Nr]  r\  r  ro  )r  )r]  
urlunquoter\  r  r  _replacer   )r  r  r  r]  r\  r  s         rD   r  HttpGitClient.from_parsedurl  s    %%!+H!5F:%%!+H!5F:##>> &	7F ) 2 2F;F&&f&5	:i(3F33rF   c                 l    [        U 5      R                  < SU R                  < SU R                  < S3$ )Nr   z, dumb=r   )r   rI   r  r  rs   s    rD   r   HttpGitClient.__repr__  s'    JNNII
 	
rF   c                     [        U[        5      (       d  UR                  S5      n[        U R                  U5      R                  S5      S-   $ )Nrx   r  )r   r  r{   r   r  r   r  s     rD   r  HttpGitClient._get_url&  s@    $$$ ;;w'Dt~~t,33C83>>rF   c                    U R                   R                  R                  5       nUb  UR                  U5        SUS'   U(       a  SUS'   OSUS'   Uc  U R                   R	                  SXS9nOU R                   R	                  SXUS	9nUR
                  S
:X  a
  [        5       eUR
                  S:X  a  [        UR                  S5      U5      eUR
                  S:w  a  [        SUR
                  U4-  5      e[        UR                  5      R                  nUR                  S5      Ul         UR                  5       nX:w  a  UOSUl        Xg4$ ! [          a    UR#                  5       Ul         Xg4$ f = f)a  Perform HTTP request.

Args:
  url: Request URL.
  headers: Optional custom headers to override defaults.
  data: Request data.
  allow_compression: Allow GZipped communication.

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.

zno-cachePragmagzipzAccept-EncodingidentityGET)r  POST)r  bodyi  i  zWWW-Authenticate   zunexpected http resp %d for %sContent-Typer  )r  r  r   r   requestr|   r   rP   	getheaderr   r   r  r(  content_typegeturlredirect_locationAttributeErrorget_redirect_location)	rB   rT   r  r  allow_compressionreq_headersrespr(  resp_urls	            rD   _http_requestHttpGitClient._http_request-  sy     ''//446w' *H-3K)*-7K)*<$$,,UC,MD$$,,t - D ;;#"$$;;#"4>>2D#EsKK;;#"0DKK3EE  tyy!&& NN>:	I{{}H
 2:XbD"z  	B%)%?%?%AD" z	Bs   .E E32E3c                 p   US   S:X  d   eSnSS0nU R                   SLa  USUR                  S5      -  -  n[        X#5      nU R                  XTSS	9u  pgUR                  (       aZ  UR                  R                  U5      (       d!  [        S
U< SUR                  < SU< 35      eUR                  S [        U5      *  n UR                  R                  S5      (       + U l         U R                   (       dm  [        US 5      n [        UR                  5       5      u  n	U	R                  S5      SU-   :w  a  [        SU	-  5      e[        U5      U4-   UR!                  5         $ [#        U5      [%        5       U4UR!                  5         $ ! [         a    [        S5      ef = f! UR!                  5         f = f)Nr  r  z	info/refsAcceptz*/*Tz?service=%sr  )r  zRedirected from URL z to URL z	 without zapplication/x-git-z%unexpected number of packets receivedr   s
   # service=z*unexpected first line %r from smart server)r  r{   r   r  r  r  r   rW   r  r  r2   r  r   rz   r   r   r  r:   r   )
rB   r.  r  tailr  rT   r  r(  r   r   s
             rD   _discover_references"HttpGitClient._discover_referencesh  s   |s"""U#99D MGNN7$;;;Dh%'''M
!!))22488&D22D:  --lT
;H	 --889MNNDI99 t,T !3!3!56ES ::e$)@A*DsJ  %U+xk9 JJL &d+SUH<JJL " T*+RSST JJLs+   AF# F
 4F# $F# 
F  F# #F5c                     US   S:X  d   e[        X!5      nSU-  nSU-  U[        [        U5      5      S.nU R                  X%U5      u  pgUR                  U:w  a  [        SUR                  -  5      eXg4$ )Nr  r  zapplication/x-%s-resultzapplication/x-%s-request)r  r  zContent-Lengthz$Invalid content-type from server: %s)r   r  rW   r  r  r   )rB   r.  rT   r  result_content_typer  r  r(  s           rD   _smart_requestHttpGitClient._smart_request  s    2w#~~c#7'A6@)!#d)n

 ''d;
 33"69J9JJ  zrF   c                    U R                  U5      nU R                  SU5      u  pgnU R                  U5      u  nn	UR                  [	        5       5        [
        U;   a  [        5       U l        U" [        U5      5      n
U
c
  [        Xi0 S9$ [        U
R                  5       5      R                  [        UR                  5       5      5      (       a
  [        X0 S9$ U R                  (       a  [        U R                  5      e[!        5       n[#        SUR$                  5      nU R'                  XXj5      u  pU" UU[(        U;   S9u  nnU R+                  U
5      (       a  [-        UR/                  5       UU5        U R1                  SX[R3                  5       S9u  nn [#        US5      nU R5                  UX5      n[        XUS9UR7                  5         $ ! UR7                  5         f = f)a  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  r  zgit-receive-packr  )r  r  rr  r   r   r    rl   r  r   r   r   r   r  r  r  r5  r   r2   r7  rj  r   rV  r8   r  r  getvaluer|  r  )rB   r  r  r  r   rT   rb  r   rm  r   rU  req_data	req_protore  rc  r  rA  r  r(  
resp_protor   s                        rD   r  HttpGitClient.send_pack  s   & mmD!-1-F-F.
*s 556IJ	
###$4$67#'>>);)=D&tH~.!(BGGx~~ ))#hnn.>*?@@!(BGG99%doo669T8>>2	55
 &8+/FF&
"
 !!(++I002OYO((*;*;*= ) 

d	!$-J773J "(JOJJLDJJLs   'G G"c           	         U R                  U5      nU R                  SU5      u  pnU R                  U	5      u  n
nnU" U5      nUb  U Vs/ s H  o[        :w  d  M  UPM     nnU(       d  [	        XU5      $ U R
                  (       a  [        U R                  5      e[        5       n[        SUR                  5      nU R                  UU
UUSUS9u  nnU R                  SXR                  5       S9u  nn [        US5      nUc  Uc  [        U5      u  nnU R                  UU
UUU5        [	        XUUU5      UR!                  5         $ s  snf ! UR!                  5         f = f)al  Retrieve a pack from a git smart server.

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

Returns:
  FetchPackResult object

   git-upload-packN)r  r2  zgit-upload-packr  )r  r  r  r5   r   r  r  r5  r   r2   r7  r  r  r  r   r  r  )rB   r  r:  r@  rA  r   r2  rT   r   r   rm  r   r   rC   r  r  r  r   r   r  r(  r  s                         rD   r5  HttpGitClient.fetch_pack  sy   . mmD!)-)B)B*
&3 445HI		
#%$)=ESH_SEE="4%8899%doo669T8>>2	'+'D'D# (E (
$m ((s):):)< ) 

d	!$-J"}'</DZ/P,m))' #4%mTJJL? >> JJLs   E	E	6AE E c                 T    U R                  U5      nU R                  SU5      u  n  nU$ )r  r  )r  r  )rB   r  rT   r   r  s        rD   rD  HttpGitClient.get_refs   s.    mmD!../A3G
arF   )r  r  r  r  r  r  r  )NNFr   r   )rI   rJ   rK   rL   rA   r  r  r  r   r  r  r  r  r  r5  rD  rN   rG   rF   rD   r  r    sf     +>/ 4 4
?9v#J >L AFrF   r  c                    [        U 5      nUR                  S:X  a#  [        R                  " U40 UD6UR                  4$ UR                  S;   a#  [
        R                  " U40 UD6UR                  4$ UR                  S;   a%  [        R                  " U4SU0UD6UR                  4$ UR                  S:X  a#  [        R                  " U40 UD6UR                  4$ [        SUR                  -  5      e)a0  Obtain a git client from a URL.

Args:
  url: URL to open (a unicode string)
  config: Optional config object
  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.

r  )zgit+sshrm  )httphttpsr7  r:  zunknown scheme '%s')	r   schemer  r  r  r  r  default_local_git_client_clsrz   )rT   r7  r  parseds       rD   get_transport_and_path_from_urlr  '  s     c]F}}++F=f=v{{KK	,	,**6<V<fkkII	+	+((II&IKK
 	
 
&	 (77I&IKK
 	

 *V]]:
;;rF   c                     SU ;   a  SU ;  a  U R                  SS5      u  pSnOESU ;   a4  U R                  SS5      u  pBSU;   a  UR                  SS5      u  p1OSnUnO[        S5      eX1U4$ )zParse a rsync-style URL.r  ro  rw   Nznot a valid rsync-style URL)ry   rsplitrz   )locationr  r  user	user_hosts        rD   parse_rsync_urlr  H  s    
h3h.~~c1-	"..a0	)"))#q1JD$DD677rF   c                 8    [        U 40 UD6$ ! [         a     Of = f[        R                  S:X  a.  U S   R	                  5       (       a  U SS S:X  a  [        S0 UD6U 4$  [        U 5      u  p#n[        U4SU0UD6U4$ ! [         a    [        S0 UD6U 4s $ f = f)a-  Obtain a git client from a URL.

Args:
  location: URL or path (a string)
  config: Optional config object
  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.

r  r   rw   r   z:\r\  rG   )r  rz   r  r  isalphar  r  r  )r   r  r\  r  r  s        rD   get_transport_and_pathr  [  s    .xB6BB  ||w8A;#6#6#8#8Xa]e=S+5f5x??I%4X%>"T
 HBxB6BDHH	  @+5f5x??@s    
!A? ?BBz~/.git-credentialsr  r  c                    U H  n [        US5       nU Hx  n[        UR                  5       5      nUR                  U :X  d  M.  UR                  U:X  d  M@  Ub  UR
                  U:X  d  MU  UR
                  UR                  4s  sS S S 5        s  $    S S S 5        M     g ! , (       d  f       M  = f! [         a     M  f = f)Nr  )openr   r   r  r  r\  r]  FileNotFoundError)r  r  r\  fnamesfnamer)  r  parsed_lines           rD   get_credentials_from_storer    s     	eT"aD"*4::<"8K#**f4'00H<%-1E1E1Q*33[5I5III #" #" "" ! 		sL   B1-BBB+B	B1BB1
B.	)B1.B11
B?>B?r   r   )xrM   
contextlibr   ior   r   loggingrA  rX   r  r+  r  typingr   r   r   r	   urllib.parser
   r  r   r  r   r   r   r   r  dulwich.configr   dulwich.errorsr   r   r   dulwich.protocolr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   dulwich.packr8   r9   dulwich.refsr:   r;   	getLoggerrI   r\  r@   r=   rP   rZ   rj   COMMON_CAPABILITIESr  r  objectrl   r   r   r   r   r  r  r  r  r  r
  r!  r#  r4  r  rZ  rg  rk  rw  r|  r  r  r  r  r  r  r  r  r  
expanduserDEFAULT_GIT_CREDENTIALS_PATHSr  rG   rF   rD   <module>r     sV  *(  &  	    
 0 0   3 
% % % % % % % % % %L 
		8	$
9 
y :
 ,-EF !	
     02 02f*&P
f P
fFOV FOR("q  q h$""j9 jZ?8' ?8D :"
. "
J^%Y ^%D  . 54 54p8i 8'') ''T.'Y .'b	' %N
' N
bN 6:ZzxI xv	<B&ID GG+,UM2!   $,IrF   