Refactoring to use remotes and not single repositories
This commit is contained in:
parent
4e3efb6007
commit
a7875ad363
60
src/lib.rs
60
src/lib.rs
@ -12,6 +12,7 @@ pub struct Job
|
|||||||
pub id: u32,
|
pub id: u32,
|
||||||
pub key: String,
|
pub key: String,
|
||||||
pub result_repository_path: PathBuf,
|
pub result_repository_path: PathBuf,
|
||||||
|
remote_name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BenchmarkRepository
|
pub struct BenchmarkRepository
|
||||||
@ -70,7 +71,7 @@ impl BenchmarkRepository
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fetch_branch(&self, branch_name: &str) -> &Self
|
fn fetch_branch(&self, remote_name: &str, branch_name: &str) -> &Self
|
||||||
{
|
{
|
||||||
let mut progress_bar = ProgressBar::new(0);
|
let mut progress_bar = ProgressBar::new(0);
|
||||||
progress_bar.set_style(BenchmarkRepository::progress_bar_style());
|
progress_bar.set_style(BenchmarkRepository::progress_bar_style());
|
||||||
@ -93,13 +94,17 @@ impl BenchmarkRepository
|
|||||||
let mut fetch_options = FetchOptions::new();
|
let mut fetch_options = FetchOptions::new();
|
||||||
fetch_options.remote_callbacks(remote_callbacks);
|
fetch_options.remote_callbacks(remote_callbacks);
|
||||||
|
|
||||||
let mut origin = self.repository.find_remote("origin").expect("could not find remote “origin”");
|
let mut remote = match self.repository.find_remote(remote_name)
|
||||||
|
|
||||||
info!("Updating branch “{}”", branch_name);
|
|
||||||
|
|
||||||
if let Err(error) = origin.fetch(&[branch_name], Some(&mut fetch_options), None)
|
|
||||||
{
|
{
|
||||||
panic!("failed to fetch branch “{}” from remote “origin”: {}", branch_name, error);
|
Ok(remote) => remote,
|
||||||
|
Err(error) => panic!("could not find remote “{}”", error),
|
||||||
|
};
|
||||||
|
|
||||||
|
info!("updating branch “{}”", branch_name);
|
||||||
|
|
||||||
|
if let Err(error) = remote.fetch(&[branch_name], Some(&mut fetch_options), None)
|
||||||
|
{
|
||||||
|
panic!("failed to fetch branch “{}” from remote “{}”: {}", branch_name, remote_name, error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,8 +154,8 @@ impl BenchmarkRepository
|
|||||||
|
|
||||||
benchmark_repository
|
benchmark_repository
|
||||||
.reset_origin(remote_url)
|
.reset_origin(remote_url)
|
||||||
.fetch_branch("config")
|
.fetch_branch("origin", "config")
|
||||||
.fetch_branch("results");
|
.fetch_branch("origin", "results");
|
||||||
|
|
||||||
benchmark_repository
|
benchmark_repository
|
||||||
}
|
}
|
||||||
@ -389,7 +394,8 @@ impl BenchmarkRepository
|
|||||||
pub fn create_job(&mut self, key: String) -> &Job
|
pub fn create_job(&mut self, key: String) -> &Job
|
||||||
{
|
{
|
||||||
let id = self.jobs.len() as u32;
|
let id = self.jobs.len() as u32;
|
||||||
let result_repository_path = self.base_path.join(format!("job-{}", id));
|
let remote_name = format!("job-{}", id);
|
||||||
|
let result_repository_path = self.base_path.join(&remote_name);
|
||||||
|
|
||||||
if result_repository_path.exists()
|
if result_repository_path.exists()
|
||||||
{
|
{
|
||||||
@ -402,25 +408,26 @@ impl BenchmarkRepository
|
|||||||
|
|
||||||
match Repository::init_bare(&result_repository_path)
|
match Repository::init_bare(&result_repository_path)
|
||||||
{
|
{
|
||||||
Ok(repository) => repository,
|
Ok(_) => (),
|
||||||
Err(error) => panic!("failed to initialize result Git repository for job {} in “{}”: {}", id, result_repository_path.display(), error),
|
Err(error) => panic!("failed to initialize result Git repository for job {} in “{}”: {}", id, result_repository_path.display(), error),
|
||||||
};
|
};
|
||||||
|
|
||||||
info!("Initialized result Git repository for job {} in “{}”", id, result_repository_path.display());
|
match self.repository.remote(&remote_name, &format!("../{}", remote_name))
|
||||||
|
{
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(error) => panic!("cannot create remote: {}", error),
|
||||||
|
};
|
||||||
|
|
||||||
self.jobs.insert(id, Job{id, key, result_repository_path});
|
info!("initialized result Git repository for job {} in “{}”", id, result_repository_path.display());
|
||||||
|
|
||||||
|
self.jobs.insert(id, Job{id, key, result_repository_path, remote_name});
|
||||||
self.jobs.get(&id).unwrap()
|
self.jobs.get(&id).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn tip_commit<'repository>(repository: &'repository git2::Repository, from_remote: bool, branch_name: &str) -> Result<git2::Commit<'repository>, git2::Error>
|
fn tip_commit(&self, remote_name: &str, branch_name: &str) -> Result<git2::Commit, git2::Error>
|
||||||
{
|
{
|
||||||
let tip_reference_name = match from_remote
|
let tip_reference_name = format!("refs/remotes/{}/{}", remote_name, branch_name);
|
||||||
{
|
self.repository.find_reference(&tip_reference_name).and_then(|tip_reference| tip_reference.peel_to_commit())
|
||||||
true => format!("refs/remotes/origin/{}", branch_name),
|
|
||||||
false => format!("refs/heads/{}", branch_name),
|
|
||||||
};
|
|
||||||
|
|
||||||
repository.find_reference(&tip_reference_name).and_then(|tip_reference| tip_reference.peel_to_commit())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn join(&self)
|
pub fn join(&self)
|
||||||
@ -444,13 +451,10 @@ impl BenchmarkRepository
|
|||||||
|job_id|
|
|job_id|
|
||||||
{
|
{
|
||||||
let job = self.jobs.get(job_id).unwrap();
|
let job = self.jobs.get(job_id).unwrap();
|
||||||
let job_repository = match Repository::open(&job.result_repository_path)
|
|
||||||
{
|
|
||||||
Ok(value) => value,
|
|
||||||
Err(error) => panic!("cannot access result repository for job {}: {}", job_id, error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let job_commit = match Self::tip_commit(&job_repository, false, "master")
|
self.fetch_branch(&job.remote_name, "master");
|
||||||
|
|
||||||
|
let job_commit = match self.tip_commit(&job.remote_name, "master")
|
||||||
{
|
{
|
||||||
Ok(value) => value,
|
Ok(value) => value,
|
||||||
// Job is not done yet, so skip it until it is
|
// Job is not done yet, so skip it until it is
|
||||||
@ -459,7 +463,7 @@ impl BenchmarkRepository
|
|||||||
|
|
||||||
info!("job {} finished ({})", job_id, job.key);
|
info!("job {} finished ({})", job_id, job.key);
|
||||||
|
|
||||||
let remote_commit = match Self::tip_commit(&self.repository, true, "results")
|
let remote_commit = match self.tip_commit("origin", "results")
|
||||||
{
|
{
|
||||||
Ok(value) => value,
|
Ok(value) => value,
|
||||||
Err(error) => panic!("could not access tip commit of “results” branch: {}", error),
|
Err(error) => panic!("could not access tip commit of “results” branch: {}", error),
|
||||||
|
Loading…
Reference in New Issue
Block a user