@@ -19,6 +19,7 @@ use crate::libgit::{BlobId, CommitId, RawBlob, RawCommit};
19
19
use crate :: oid:: { HgObjectId , ObjectId } ;
20
20
use crate :: oid_type;
21
21
use crate :: util:: { FromBytes , SliceExt } ;
22
+ use crate :: xdiff:: { apply, PatchInfo } ;
22
23
23
24
macro_rules! hg2git {
24
25
( $h: ident => $g: ident( $i: ident) ) => {
@@ -194,19 +195,22 @@ impl<'a> Iterator for ChangesetFilesIter<'a> {
194
195
pub struct GitChangesetPatch < ' a > ( & ' a [ u8 ] ) ;
195
196
196
197
impl < ' a > GitChangesetPatch < ' a > {
198
+ pub fn iter ( & self ) -> Option < impl Iterator < Item = PatchInfo < Cow < ' a , [ u8 ] > > > > {
199
+ self . 0
200
+ . split ( |c| * c == b'\0' )
201
+ . map ( |part| {
202
+ let ( start, end, data) = part. split3 ( b',' ) ?;
203
+ let start = usize:: from_bytes ( start) . ok ( ) ?;
204
+ let end = usize:: from_bytes ( end) . ok ( ) ?;
205
+ let data = Cow :: from ( percent_decode ( data) ) ;
206
+ Some ( PatchInfo { start, end, data } )
207
+ } )
208
+ . collect :: < Option < Vec < _ > > > ( )
209
+ . map ( |v| v. into_iter ( ) )
210
+ }
211
+
197
212
pub fn apply ( & self , input : & [ u8 ] ) -> Option < Vec < u8 > > {
198
- let mut patched = Vec :: new ( ) ;
199
- let mut last_end = 0 ;
200
- for part in self . 0 . split ( |c| * c == b'\0' ) {
201
- let ( start, end, data) = part. split3 ( b',' ) ?;
202
- let start = usize:: from_bytes ( start) . ok ( ) ?;
203
- let data = Cow :: from ( percent_decode ( data) ) ;
204
- patched. extend_from_slice ( & input[ last_end..start] ) ;
205
- patched. extend_from_slice ( & data) ;
206
- last_end = usize:: from_bytes ( end) . ok ( ) ?;
207
- }
208
- patched. extend_from_slice ( & input[ last_end..] ) ;
209
- Some ( patched)
213
+ Some ( apply ( self . iter ( ) ?, input) )
210
214
}
211
215
}
212
216
0 commit comments