Skip to content

Instantly share code, notes, and snippets.

@codegod100
Created March 2, 2023 20:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save codegod100/aed9adf5bd8298f241ad0a21589d8361 to your computer and use it in GitHub Desktop.
Save codegod100/aed9adf5bd8298f241ad0a21589d8361 to your computer and use it in GitHub Desktop.
use git2::{RemoteCallbacks, Repository};
use simple_logger::SimpleLogger;
use std::{env, path::Path};
struct User {
name: String,
remote: String,
}
fn main() {
SimpleLogger::new().init().unwrap();
let garden = format!("{}/garden", env::var("HOME").unwrap());
let user = User {
name: "vera".to_string(),
remote: "https://git.anagora.org/vera/notes".to_string(),
};
let repopath = format!("{}/{}", garden, user.name);
let mut builder = git2::build::RepoBuilder::new();
let mut fo = generate_fetchoptions(&user);
builder.fetch_options(fo);
let p = Path::new(&repopath);
let repo = match builder.clone(&user.remote, p) {
Ok(r) => r,
Err(e) => match e.code() {
git2::ErrorCode::Exists => {
log::warn!("{}: Repo exists, skipping clone", e);
Repository::open(&repopath).unwrap()
}
// something else unknown happened
_ => panic!("{}", e),
},
};
// regenerate fetch options
fo = generate_fetchoptions(&user);
let so = Some(&mut fo);
let mut origin = repo.find_remote("origin").unwrap();
origin.fetch(&["HEAD"], so, None).unwrap();
let fetchref = repo.find_reference("FETCH_HEAD").unwrap();
let commit = repo.reference_to_annotated_commit(&fetchref).unwrap();
log::info!(
"Current FETCH_HEAD for {} is sha: {}",
user.name,
commit.id()
);
let object = repo.find_object(commit.id(), None).unwrap();
repo.reset(&object, git2::ResetType::Hard, None).unwrap();
}
//needed because fetch options don't implement Copy
fn generate_fetchoptions(user: &User) -> git2::FetchOptions {
let mut callbacks = RemoteCallbacks::new();
callbacks.transfer_progress({
|p| {
log::info!(
"Fetch progress for {}: {}/{}",
user.name,
p.received_objects(),
p.total_objects()
);
true
}
});
let mut fo = git2::FetchOptions::new();
fo.remote_callbacks(callbacks);
fo
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment