Skip to content

Commit 4fc8ab5

Browse files
committed
Fixing updating index
1 parent 559e8e1 commit 4fc8ab5

File tree

1 file changed

+57
-28
lines changed

1 file changed

+57
-28
lines changed

src/main.rs

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// option. This file may not be copied, modified, or distributed
77
// except according to those terms.
88

9-
#![deny(warnings)]
9+
// #![deny(warnings)]
1010
extern crate rustc_serialize;
1111
extern crate router;
1212
extern crate iron;
@@ -30,7 +30,7 @@ use rustc_serialize::Decodable;
3030
use rustc_serialize::json;
3131

3232
use curl::easy::Easy;
33-
use git2::{Repository, ResetType, Cred};
33+
use git2::{Repository, Cred};
3434
use sha2::{Digest, Sha256};
3535
use clap::{App, Arg};
3636

@@ -311,27 +311,39 @@ fn main() {
311311
let repo = Repository::clone(&config.registry_config.upstream_url, base_dir.clone())
312312
.unwrap();
313313
{
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();
317317
write!(&mut config_file,
318318
"{{\"dl\": \"http://{url}/api/v1/crates\", \"api\": \"http://{url}\"}}",
319319
url = url)
320320
.unwrap();
321-
let sig = repo.signature().unwrap();
321+
322+
let repo_path = repo.workdir().unwrap();
323+
// git add $file
322324
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"),
328339
&sig,
329340
&sig,
330341
"Add local mirror",
331342
&tree,
332343
&[&parent])
333344
.unwrap();
334-
repo.reset(&repo.find_object(id, None).unwrap(), ResetType::Hard, None).unwrap();
345+
346+
335347
if let Some(remote) = config.registry_config.origin_url.clone() {
336348
let mut callbacks = git2::RemoteCallbacks::new();
337349
callbacks.credentials(credentials);
@@ -396,23 +408,40 @@ fn poll_index(repo: Repository, config: Config) {
396408
let mut origin = repo.find_remote("origin").unwrap();
397409
loop {
398410
::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();
414434

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+
}
416445
}
417446

418447
}

0 commit comments

Comments
 (0)