From 3c2d03dc387fe8367268566de28285c09f9ed865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Fri, 1 Mar 2019 15:57:35 +0100 Subject: [PATCH] Start implementing new synchronization mechanism This one is based on separate Git repositories for results. --- examples/test-job.sh | 7 ++--- examples/test.rs | 7 +++-- src/lib.rs | 62 +++++++++++++++++++------------------------- 3 files changed, 34 insertions(+), 42 deletions(-) diff --git a/examples/test-job.sh b/examples/test-job.sh index 6ea240b..49c57c5 100755 --- a/examples/test-job.sh +++ b/examples/test-job.sh @@ -18,11 +18,12 @@ fi mkdir -p "$dir" pushd "$dir" - git clone --single-branch --branch="$JOB_BRANCH_NAME" "$GIT_REMOTE_URL" repository - git config user.name "Potassco Bot" - git config user.email "bot@potassco.org" + git clone "$GIT_REMOTE_URL" repository pushd repository + git config user.name "Potassco Bot" + git config user.email "bot@potassco.org" + echo "$JOB_BRANCH_NAME" > test-output sleep 10 start_time=$(date +%s%N) diff --git a/examples/test.rs b/examples/test.rs index 10250f6..f8ef513 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -14,7 +14,7 @@ fn main() { pretty_env_logger::init(); - let benchmark_repository = BenchmarkRepository::new("git@git.luehne.de:patrick/tplp-planning-benchmark.git", Path::new("storage"), "git", "Potassco Bot", "bot@potassco.org"); + let benchmark_repository = BenchmarkRepository::new("git@git.luehne.de:patrick/tplp-planning-benchmark.git", Path::new("cache").to_path_buf(), "git", "Potassco Bot", "bot@potassco.org"); let content = benchmark_repository.read_file(Path::new("configurations.yml"), "config").unwrap(); let configurations = &YamlLoader::load_from_str(&content).unwrap()[0]["configurations"]; @@ -45,12 +45,11 @@ fn main() continue; } - let branch_name = benchmark_repository.create_branch_for_job(i); + let result_repository = benchmark_repository.create_result_repository_for_job(i); Command::new("sbatch") .args(&["/home/pluehne/test-job.sh"]) - .env("JOB_BRANCH_NAME", &branch_name) - .env("GIT_REMOTE_URL", &format!("file://{}", fs::canonicalize(&Path::new("storage")).unwrap().display())) + .env("GIT_REMOTE_URL", &format!("file://{}", fs::canonicalize(&result_repository).unwrap().display())) .output() .expect("Could not execute command"); diff --git a/src/lib.rs b/src/lib.rs index 0471d64..10f996a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,7 @@ use walkdir::WalkDir; pub struct BenchmarkRepositoryInner { + base_path: PathBuf, repository: Repository, ssh_user: String, user_name: String, @@ -114,20 +115,22 @@ impl BenchmarkRepository fn init(base_path: &Path) -> Repository { - let repository = match Repository::init_bare(base_path) + let repository_path = base_path.join("upstream"); + + let repository = match Repository::init_bare(&repository_path) { Ok(repository) => repository, - Err(error) => panic!("failed to initialize Git repository in “{}”: {}", base_path.display(), error), + Err(error) => panic!("failed to initialize Git repository in “{}”: {}", repository_path.display(), error), }; - info!("Initialized Git repository in “{}”", base_path.display()); + info!("Initialized Git repository in “{}”", repository_path.display()); repository } - pub fn new(remote_url: &str, base_path: &Path, ssh_user: &str, user_name: &str, user_email: &str) -> BenchmarkRepository + pub fn new(remote_url: &str, base_path: PathBuf, ssh_user: &str, user_name: &str, user_email: &str) -> BenchmarkRepository { - let repository = match Repository::open(base_path) + let repository = match Repository::open(&base_path) { Ok(repository) => { @@ -135,12 +138,13 @@ impl BenchmarkRepository repository }, - Err(_) => BenchmarkRepository::init(base_path), + Err(_) => BenchmarkRepository::init(&base_path), }; let benchmark_repository_inner = BenchmarkRepositoryInner { + base_path: base_path, repository: repository, ssh_user: ssh_user.to_string(), user_name: user_name.to_string(), @@ -373,42 +377,30 @@ impl BenchmarkRepository Some(content.to_owned()) } - pub fn create_branch_for_job(&self, job_id: u32) -> String + pub fn create_result_repository_for_job(&self, job_id: u32) -> PathBuf { let inner = self.inner.clone(); - let empty_tree_hash = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"; - let empty_tree_object_id = Oid::from_str(&empty_tree_hash).unwrap(); - let empty_tree = match inner.repository.find_tree(empty_tree_object_id) + let repository_path = inner.base_path.join(format!("job-{}", job_id)); + + if repository_path.exists() { - Ok(value) => value, - Err(error) => panic!("Could not find empty tree object: {}", error), + match std::fs::remove_dir_all(&repository_path) + { + Ok(_) => (), + Err(error) => panic!("failed to initialize result Git repository for job {} in “{}”: {}", job_id, repository_path.display(), error), + }; + } + + match Repository::init_bare(&repository_path) + { + Ok(repository) => repository, + Err(error) => panic!("failed to initialize result Git repository for job {} in “{}”: {}", job_id, repository_path.display(), error), }; - let signature = Signature::now(&inner.user_name, &inner.user_email).expect("Could not create signature"); - let message = format!("Initial commit for job {}", job_id); + info!("Initialized result Git repository for job {} in “{}”", job_id, repository_path.display()); - let commit_id = match inner.repository.commit(None, &signature, &signature, &message, &empty_tree, &[]) - { - Ok(value) => value, - Err(error) => panic!("Could not write commit: {}", error), - }; - - let commit = match inner.repository.find_commit(commit_id) - { - Ok(value) => value, - Err(error) => panic!("Could not find newly written commit: {}", error), - }; - - let branch_name = format!("__job_{}", job_id); - - match inner.repository.branch(&branch_name, &commit, true) - { - Ok(_) => println!("Created new branch “{}”", branch_name), - Err(error) => panic!("Could not create job branch “{}”: {}", branch_name, error), - }; - - branch_name + repository_path } pub fn join(&self)