
    "                         d Z ddlmZ ddlmZmZmZmZ ddlm	Z	m
ZmZmZ ddlZd Z G d de      Z G d	 d
ej$                        Zy)z!Fast export/import functionality.    )commit_tree)BlobCommitTagZERO_SHA)commandserrorsparser	processorNc                 R    | j                  dd      \  }}||j                  d      fS )N    <      >)rsplitrstrip)textnameemails      %lib/third_party/dulwich/fastexport.pysplit_emailr   +   s*    KKq)MT5%,,t$%%    c                   D    e Zd ZdZd Zd Zd Zd Zd Zd Z	dd	Z
dd
Zy)GitFastExporterz5Generate a fast-export output stream for Git objects.c                 <    || _         || _        i | _        d| _        y )Nr   )outfstoremarkers_marker_idx)selfr   r   s      r   __init__zGitFastExporter.__init__3   s    	
r   c                 t    | j                   j                   t        |d|j                               dz          y )N	__bytes__   
)r   writegetattr__repr__r   cmds     r   	print_cmdzGitFastExporter.print_cmd9   s*    		?[#,,?AEIJr   c                 j    | xj                   dz  c_         d| j                   fz  j                  d      S )Nr   z%dascii)r   encode)r   s    r   _allocate_markerz GitFastExporter._allocate_marker<   s2    A((**227;;r   c                     | j                         }|j                  | j                  |<   t        j                  ||j
                        |fS N)r-   idr   r   BlobCommanddata)r   blobmarkers      r   _export_blobzGitFastExporter._export_blob@   s>    &&(#wwV$$VTYY7@@r   c                 P    | j                  |      \  }}| j                  |       |S r/   )r5   r)   )r   r3   r(   r4   s       r   	emit_blobzGitFastExporter.emit_blobE   s'    ))$/fsr   c              #     K   | j                   j                  ||      D ]  \  \  }}\  }}\  }}|t        j                  |       *t	        j
                  |      s | j                   |   }	| j                  |	      }
||k7  r|t        j                  ||       ||k7  s||k7  sd
z   }t        j                  |||d         y w)N   :)	r   tree_changesr   FileDeleteCommandstatS_ISDIRr7   FileRenameCommandFileModifyCommand)r   	base_treenew_treeold_pathnew_pathold_modenew_mode
old_hexsha
new_hexshar3   r4   prefixed_markers               r   _iter_fileszGitFastExporter._iter_filesJ   s     
 ZZ$$Y9	
 Xx Xx$Z00::<<)zz*--8#(<008DD8#zZ'?"&-00h  :s   B%C
("C
Nc           
         t        | j                  ||j                              }| j                         }|j                  r|j                  d   }|j                  dd  }nd }g }t        |j                        \  }}	t        |j                        \  }
}t        j                  ||||	|j                  |j                  f|
||j                  |j                  f|j                  |||      }||fS )Nr   r   )listrI   treer-   parentsr   author	committerr   CommitCommandauthor_timeauthor_timezonecommit_timecommit_timezonemessage)r   commitrefr@   	file_cmdsr4   from_mergesrN   author_emailrO   committer_emailr(   s                r   _export_commitzGitFastExporter._export_commit^   s    )))V[[AB	&&(>>NN1%E^^AB'FEF*6==9%01A1A%B"	?$$\6#5#5v7M7MN""&&	 NN
 V}r   c                 T    | j                  |||      \  }}| j                  |       |S r/   )r]   r)   )r   rV   rW   r@   r(   r4   s         r   emit_commitzGitFastExporter.emit_commitz   s+    ))&#yAVsr   r/   )__name__
__module____qualname____doc__r    r)   r-   r5   r7   rI   r]   r_    r   r   r   r   0   s/    ?K<A

(8r   r   c                   T    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zy)GitImportProcessorzEAn import processor that imports into a Git repository using Dulwich.Nc                     t         j                  j                  | ||       || _        t        | _        i | _        i | _        y r/   )r   ImportProcessorr    repor   last_commitr   	_contents)r   ri   paramsverboser   s        r   r    zGitImportProcessor.__init__   s7    !!**4A	#r   c                 L    |j                  d      r| j                  |dd     S |S )Nr9   r   )
startswithr   )r   	objectishs     r   lookup_objectz GitImportProcessor.lookup_object   s+    %<<	!"..r   c                 z    t        j                  |      }| j                  |j                         | j                  S r/   )r
   ImportParserprocessiter_commandsr   )r   streamps      r   import_streamz GitImportProcessor.import_stream   s,    'Q__%||r   c                     t        j                  |j                        }| j                  j                  j                  |       |j                  r$|j                  | j                  |j                  <   yy)zProcess a BlobCommand.N)	r   from_stringr2   ri   object_store
add_objectmarkr0   r   )r   r(   r3   s      r   blob_handlerzGitImportProcessor.blob_handler   sP    )		))$/88%)WWDLL" r   c                      y)zProcess a CheckpointCommand.Nrd   r'   s     r   checkpoint_handlerz%GitImportProcessor.checkpoint_handler       r   c                    t               }|j                  |j                  }n|j                  }|\  }}}}|j                  \  }}	}
}|dz   |z   dz   |_        ||_        t	        |      |_        |dz   |	z   dz   |_        ||_        t	        |
      |_        |j                  |_        g |_	        |j                  r;| j                  |j                        |_
        | j                  |j                         |j                         D ]  }|j                  dk(  r|j                  Qt!        j"                  |j                        }| j$                  j&                  j)                  |       |j*                  }n| j                  |j,                        }|j.                  |f| j0                  |j2                  <   |j                  dk(  r| j0                  |j2                  = |j                  dk(  r2| j0                  |j4                     | j0                  |j6                  <   |j                  dk(  rI| j0                  |j8                     | j0                  |j:                  <   | j0                  |j8                  = q|j                  dk(  r	i | _        t=        d	|j                  z         t?        | j$                  j&                  d
 | j0                  jA                         D              |_!        | jD                  tF        k7  r%|j                  jI                  | jD                         |jJ                  D ],  }|j                  jI                  | j                  |             . | j$                  j&                  jM                  |       |j*                  | j$                  |jN                  <   |j*                  | _"        |jP                  r$|j*                  | jR                  |jP                  <   yy)zProcess a CommitCommand.Nr   r   s
   filemodifys
   filedeletes   filecopys
   filerenames   filedeleteallzCommand %s not supportedc              3   2   K   | ]  \  }\  }}|||f  y wr/   rd   ).0pathmodehexshas       r   	<genexpr>z4GitImportProcessor.commit_handler.<locals>.<genexpr>   s#     W@V&<t^dFdFD!@Vs   )*r   rN   rO   rR   intrQ   rT   rS   rU   rM   rY   rq   _reset_base
iter_filesr   r2   r   rz   ri   r{   addr0   datarefr   rk   r   src_path	dest_pathrB   rC   	Exceptionr   itemsrL   rj   r   appendrZ   r|   rW   r}   r   )r   r(   rV   rN   author_namer[   author_timestamprR   committer_namer\   commit_timestamprT   filecmdr3   blob_idmerges                   r   commit_handlerz!GitImportProcessor.commit_handler   s   ::!ZZF]]FIOFl$4o MM	
#e+l:TA!0 !12)E1OCdJ!0 !1299**3995CISYY'~~'G||},<<+++GLL9DII**..t4"ggG"00AG07g/Fw||,.NN7<<0,48NN7CSCS4Tw001.37>>'BRBR3Sw//0NN7#3#34!11!# :W\\ IJJ' (( "II""W@T@T@VW
 x'NN!!$"2"23ZZENN!!$"4"4U";<  		))&1#YY		#''!9988%+YYDLL" r   c                      y)zProcess a ProgressCommand.Nrd   r'   s     r   progress_handlerz#GitImportProcessor.progress_handler   r   r   c                    | j                   |k(  ry i | _        || _         |t        k7  rY| j                  |   j                  }| j                  j
                  j                  |      D ]  \  }}}||f| j                  |<    y y r/   )rj   rk   r   ri   rL   r{   iter_tree_contents)r   	commit_idtree_idr   r   r   s         r   r   zGitImportProcessor._reset_base   s    y($ ii	*//G
 ''::7C	(,f~t$ D !r   c                     |j                   t        }n| j                  |j                         }| j                  |       || j                  j
                  |j                  <   y)zProcess a ResetCommand.N)rY   r   rq   r   ri   refsrW   )r   r(   rY   s      r   reset_handlerz GitImportProcessor.reset_handler   sI    99E&&syy1E"'		swwr   c                    t               }|j                  |_        |j                  |_        |j                  |_        | j
                  j                  |       |j                  | j
                  j                  d|j                  z   <   y)zProcess a TagCommand.z
refs/tags/N)	r   taggerrU   tagr   ri   r|   r0   r   )r   r(   r   s      r   tag_handlerzGitImportProcessor.tag_handler   s[    eZZ
kk77		S!25&&		|chh./r   c                 @    t        j                  |j                        )zProcess a FeatureCommand.)fastimport_errorsUnknownFeaturefeature_namer'   s     r   feature_handlerz"GitImportProcessor.feature_handler   s    ..s/?/?@@r   )NFN)r`   ra   rb   rc   r    rq   rx   r~   r   r   r   r   r   r   r   rd   r   r   rf   rf      s>    O

-9/v6(9Ar   rf   )rc   dulwich.indexr   dulwich.objectsr   r   r   r   
fastimportr   r	   r   r
   r   r<   r   objectr   rh   rf   rd   r   r   <module>r      sR   , (   &
Mf M`BA22 BAr   