6
6
// option. This file may not be copied, modified, or distributed
7
7
// except according to those terms.
8
8
9
- #![ deny( warnings) ]
9
+ // #![deny(warnings)]
10
10
extern crate rustc_serialize;
11
11
extern crate router;
12
12
extern crate iron;
@@ -30,7 +30,7 @@ use rustc_serialize::Decodable;
30
30
use rustc_serialize:: json;
31
31
32
32
use curl:: easy:: Easy ;
33
- use git2:: { Repository , ResetType , Cred } ;
33
+ use git2:: { Repository , Cred } ;
34
34
use sha2:: { Digest , Sha256 } ;
35
35
use clap:: { App , Arg } ;
36
36
@@ -311,27 +311,39 @@ fn main() {
311
311
let repo = Repository :: clone ( & config. registry_config . upstream_url , base_dir. clone ( ) )
312
312
. unwrap ( ) ;
313
313
{
314
- let mut config_file = base_dir. clone ( ) ;
315
- config_file . push ( "config.json" ) ;
316
- let mut config_file = File :: create ( config_file ) . unwrap ( ) ;
314
+ let mut config_file_path = base_dir. clone ( ) ;
315
+ config_file_path . push ( "config.json" ) ;
316
+ let mut config_file = File :: create ( config_file_path . clone ( ) ) . unwrap ( ) ;
317
317
write ! ( & mut config_file,
318
318
"{{\" dl\" : \" http://{url}/api/v1/crates\" , \" api\" : \" http://{url}\" }}" ,
319
319
url = url)
320
320
. unwrap ( ) ;
321
- let sig = repo. signature ( ) . unwrap ( ) ;
321
+
322
+ let repo_path = repo. workdir ( ) . unwrap ( ) ;
323
+ // git add $file
322
324
let mut index = repo. index ( ) . unwrap ( ) ;
323
- index. update_all ( & [ "config.json" ] , None ) . unwrap ( ) ;
324
- let id = index. write_tree_to ( & repo) . unwrap ( ) ;
325
- let tree = repo. find_tree ( id) . unwrap ( ) ;
326
- let parent = repo. find_commit ( repo. refname_to_id ( "HEAD" ) . unwrap ( ) ) . unwrap ( ) ;
327
- let id = repo. commit ( Some ( "HEAD" ) ,
325
+ let mut repo_path = repo_path. iter ( ) ;
326
+ let dst = config_file_path. iter ( )
327
+ . skip_while ( |s| Some ( * s) == repo_path. next ( ) )
328
+ . collect :: < PathBuf > ( ) ;
329
+ index. add_path ( & dst) . unwrap ( ) ;
330
+ index. write ( ) . unwrap ( ) ;
331
+ let tree_id = index. write_tree ( ) . unwrap ( ) ;
332
+ let tree = repo. find_tree ( tree_id) . unwrap ( ) ;
333
+
334
+ // git commit -m "..."
335
+ let head = repo. head ( ) . unwrap ( ) ;
336
+ let parent = repo. find_commit ( head. target ( ) . unwrap ( ) ) . unwrap ( ) ;
337
+ let sig = repo. signature ( ) . unwrap ( ) ;
338
+ repo. commit ( Some ( "HEAD" ) ,
328
339
& sig,
329
340
& sig,
330
341
"Add local mirror" ,
331
342
& tree,
332
343
& [ & parent] )
333
344
. unwrap ( ) ;
334
- repo. reset ( & repo. find_object ( id, None ) . unwrap ( ) , ResetType :: Hard , None ) . unwrap ( ) ;
345
+
346
+
335
347
if let Some ( remote) = config. registry_config . origin_url . clone ( ) {
336
348
let mut callbacks = git2:: RemoteCallbacks :: new ( ) ;
337
349
callbacks. credentials ( credentials) ;
@@ -396,23 +408,40 @@ fn poll_index(repo: Repository, config: Config) {
396
408
let mut origin = repo. find_remote ( "origin" ) . unwrap ( ) ;
397
409
loop {
398
410
:: std:: thread:: sleep ( Duration :: from_secs ( config. poll_intervall . unwrap_or ( 60 ) as u64 ) ) ;
399
- origin. fetch ( & [ "refs/heads/*:refs/heads/*" ] , None , None ) . unwrap ( ) ;
400
- let head = repo. head ( ) . ok ( ) . and_then ( |h| h. target ( ) ) . unwrap ( ) ;
401
- let remote_head = repo. refname_to_id ( "refs/remotes/origin/master" ) . unwrap ( ) ;
402
- let head = repo. find_commit ( head) . unwrap ( ) ;
403
- let remote_head = repo. find_commit ( remote_head) . unwrap ( ) ;
404
- repo. merge_commits ( & head, & remote_head, None ) . unwrap ( ) ;
405
-
406
- if let Some ( _) = config. registry_config . origin_url . clone ( ) {
407
- let mut callbacks = git2:: RemoteCallbacks :: new ( ) ;
408
- callbacks. credentials ( credentials) ;
409
- let mut remote = repo. find_remote ( "local" ) . unwrap ( ) ;
410
- let mut opts = git2:: PushOptions :: new ( ) ;
411
- opts. remote_callbacks ( callbacks) ;
412
- remote. push ( & [ "refs/heads/master" ] , Some ( & mut opts) ) . unwrap ( ) ;
413
- }
411
+ origin. fetch ( & [ "master" ] , None , None ) . unwrap ( ) ;
412
+ let head = repo. head ( ) . unwrap ( ) ;
413
+
414
+ let parent = repo. find_commit ( head. target ( ) . unwrap ( ) ) . unwrap ( ) ;
415
+ let remote = repo. find_reference ( "refs/remotes/origin/master" ) . unwrap ( ) ;
416
+ let c = repo. reference_to_annotated_commit ( & remote) . unwrap ( ) ;
417
+ let mut checkout = :: git2:: build:: CheckoutBuilder :: new ( ) ;
418
+ let mut merge_option = :: git2:: MergeOptions :: new ( ) ;
419
+ let mut index = repo. index ( ) . unwrap ( ) ;
420
+ let old_tree = repo. find_tree ( index. write_tree ( ) . unwrap ( ) ) . unwrap ( ) ;
421
+ repo. merge ( & [ & c] ,
422
+ Some ( merge_option. file_favor ( :: git2:: FileFavor :: Theirs ) ) ,
423
+ Some ( checkout. force ( ) ) )
424
+ . unwrap ( ) ;
425
+ index. write ( ) . unwrap ( ) ;
426
+ let tree_id = index. write_tree ( ) . unwrap ( ) ;
427
+ let tree = repo. find_tree ( tree_id) . unwrap ( ) ;
428
+ let diff = repo. diff_tree_to_tree ( Some ( & old_tree) , Some ( & tree) , None ) . unwrap ( ) ;
429
+ if diff. stats ( ) . unwrap ( ) . files_changed ( ) > 0 {
430
+
431
+ let sig = repo. signature ( ) . unwrap ( ) ;
432
+ repo. commit ( Some ( "HEAD" ) , & sig, & sig, "Merge" , & tree, & [ & parent] )
433
+ . unwrap ( ) ;
414
434
415
- info ! ( "updated index" ) ;
435
+ if let Some ( _) = config. registry_config . origin_url . clone ( ) {
436
+ let mut callbacks = git2:: RemoteCallbacks :: new ( ) ;
437
+ callbacks. credentials ( credentials) ;
438
+ let mut remote = repo. find_remote ( "local" ) . unwrap ( ) ;
439
+ let mut opts = git2:: PushOptions :: new ( ) ;
440
+ opts. remote_callbacks ( callbacks) ;
441
+ remote. push ( & [ "refs/heads/master" ] , Some ( & mut opts) ) . unwrap ( ) ;
442
+ }
443
+ info ! ( "updated index" ) ;
444
+ }
416
445
}
417
446
418
447
}
0 commit comments