From 28ded269de95182edb3c04a60ab63d840b3cc580 Mon Sep 17 00:00:00 2001 From: Alan Smithee Date: Mon, 28 Feb 2022 18:24:49 +0900 Subject: [PATCH 1/4] fixed process case of not exist hayabusa .git folder #432 --- src/main.rs | 114 +++++++++++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 50 deletions(-) diff --git a/src/main.rs b/src/main.rs index efd95b2b..23eb3011 100644 --- a/src/main.rs +++ b/src/main.rs @@ -503,32 +503,51 @@ impl App { /// update rules(hayabusa-rules subrepository) fn update_rules(&self) -> Result<(), git2::Error> { - let open_result = Repository::open(Path::new(".")); - if open_result.is_err() { - AlertMessage::alert( - &mut BufWriter::new(std::io::stderr().lock()), - &"Failed to open the git repository.".to_string(), - ) - .ok(); + let hayabusa_repo = Repository::open(Path::new(".")); + let hayabusa_rule_repo = Repository::open(Path::new("./rules")); + if hayabusa_repo.is_err() && hayabusa_rule_repo.is_err() { println!( "Attempting to git clone the hayabusa-rules repository into the rules folder." ); // レポジトリが開けなかった段階でhayabusa rulesのgit cloneを実施する - return self.clone_rules(); - } - let rules_path = Path::new("./rules"); - if !rules_path.exists() { - create_dir(rules_path).ok(); - } - let hayabusa_repo = open_result.unwrap(); - let submodules = hayabusa_repo.submodules()?; - for mut submodule in submodules { - submodule.update(true, None)?; - let submodule_repo = submodule.open()?; - let mut exit_flag = false; + self.clone_rules() + } else if hayabusa_rule_repo.is_ok() && hayabusa_repo.is_err() { + // rulesのrepositoryが確認できる場合 // origin/mainのfetchができなくなるケースはネットワークなどのケースが考えられるため、git cloneは実施しない - submodule_repo - .find_remote("origin")? + self.pull_repository( hayabusa_rule_repo.unwrap()) + } else { + //hayabusa repositoryがあればsubmodule情報もあると思われるのでupdate + let rules_path = Path::new("./rules"); + if !rules_path.exists() { + create_dir(rules_path).ok(); + } + let hayabusa_repo = hayabusa_repo.unwrap(); + let submodules = hayabusa_repo.submodules()?; + let mut is_success_submodule_update = true; + for mut submodule in submodules { + submodule.update(true, None)?; + let submodule_repo = submodule.open()?; + match self.pull_repository(submodule_repo) { + Ok(it) => it, + Err(e) => {AlertMessage::alert( + &mut BufWriter::new(std::io::stderr().lock()), + &format!("Failed submodule update. {}", e), + ).ok(); + is_success_submodule_update =false; + } + } + } + if is_success_submodule_update { + Ok(()) + } else { + Err(git2::Error::from_str(&String::default())) + } + } + } + + /// Pull(fetch and fast-forward merge) repositoryto input_repo. + fn pull_repository(&self,input_repo :Repository) -> Result<(),git2::Error>{ + match input_repo.find_remote("origin")? .fetch(&["main"], None, None) .map_err(|e| { AlertMessage::alert( @@ -536,36 +555,31 @@ impl App { &format!("Failed git fetch to rules folder. {}", e), ) .ok(); - exit_flag = true; - }) - .ok(); - if exit_flag { - return Err(git2::Error::from_str(&String::default())); - } - let fetch_head = submodule_repo.find_reference("FETCH_HEAD")?; - let fetch_commit = submodule_repo.reference_to_annotated_commit(&fetch_head)?; - let analysis = submodule_repo.merge_analysis(&[&fetch_commit])?; - if analysis.0.is_up_to_date() { - continue; - } else if analysis.0.is_fast_forward() { - let refname = "refs/heads/main"; - let mut reference = submodule_repo.find_reference(&refname)?; - reference.set_target(fetch_commit.id(), "Fast-Forward")?; - submodule_repo.set_head(&refname)?; - submodule_repo - .checkout_head(Some(git2::build::CheckoutBuilder::default().force())) - .ok(); - } else if analysis.0.is_normal() { - AlertMessage::alert( - &mut BufWriter::new(std::io::stderr().lock()), - &"update-rules option is git Fast-Forward merge only. please check your rules folder." - .to_string(), - ) - .ok(); - return Err(git2::Error::from_str(&String::default())); - } + }) { + Ok(it) => it, + Err(_err) => return Err(git2::Error::from_str(&String::default())), + }; + let fetch_head = input_repo.find_reference("FETCH_HEAD")?; + let fetch_commit = input_repo.reference_to_annotated_commit(&fetch_head)?; + let analysis = input_repo.merge_analysis(&[&fetch_commit])?; + if analysis.0.is_up_to_date() { + Ok(()) + } else if analysis.0.is_fast_forward() { + let mut reference = input_repo.find_reference("refs/heads/main")?; + reference.set_target(fetch_commit.id(), "Fast-Forward")?; + input_repo.set_head("refs/heads/main")?; + input_repo.checkout_head(Some(git2::build::CheckoutBuilder::default().force()))?; + Ok(()) + } else if analysis.0.is_normal() { + AlertMessage::alert( + &mut BufWriter::new(std::io::stderr().lock()), + &"update-rules option is git Fast-Forward merge only. please check your rules folder." + .to_string(), + ).ok(); + Err(git2::Error::from_str(&String::default())) + } else { + Err(git2::Error::from_str(&String::default())) } - return Ok(()); } /// git clone でhauyabusa-rules レポジトリをrulesフォルダにgit cloneする関数 From c3c9423b742544429a7f29cc8bb5714f119f63bf Mon Sep 17 00:00:00 2001 From: Alan Smithee Date: Mon, 28 Feb 2022 18:25:54 +0900 Subject: [PATCH 2/4] fixed clippy warn --- src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 23eb3011..5be56cef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -590,7 +590,7 @@ impl App { ) { Ok(_repo) => { println!("Finished cloning the hayabusa-rules repository."); - return Ok(()); + Ok(()) } Err(e) => { AlertMessage::alert( @@ -601,9 +601,9 @@ impl App { ), ) .ok(); - return Err(git2::Error::from_str(&String::default())); + Err(git2::Error::from_str(&String::default())) } - }; + } } } From 6e5b24282f1249c0a8c496001ebe550fe250bd65 Mon Sep 17 00:00:00 2001 From: Alan Smithee Date: Mon, 28 Feb 2022 18:27:06 +0900 Subject: [PATCH 3/4] cargo fmt --- src/main.rs | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5be56cef..8fd635ae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -514,7 +514,7 @@ impl App { } else if hayabusa_rule_repo.is_ok() && hayabusa_repo.is_err() { // rulesのrepositoryが確認できる場合 // origin/mainのfetchができなくなるケースはネットワークなどのケースが考えられるため、git cloneは実施しない - self.pull_repository( hayabusa_rule_repo.unwrap()) + self.pull_repository(hayabusa_rule_repo.unwrap()) } else { //hayabusa repositoryがあればsubmodule情報もあると思われるのでupdate let rules_path = Path::new("./rules"); @@ -529,11 +529,13 @@ impl App { let submodule_repo = submodule.open()?; match self.pull_repository(submodule_repo) { Ok(it) => it, - Err(e) => {AlertMessage::alert( - &mut BufWriter::new(std::io::stderr().lock()), - &format!("Failed submodule update. {}", e), - ).ok(); - is_success_submodule_update =false; + Err(e) => { + AlertMessage::alert( + &mut BufWriter::new(std::io::stderr().lock()), + &format!("Failed submodule update. {}", e), + ) + .ok(); + is_success_submodule_update = false; } } } @@ -546,16 +548,17 @@ impl App { } /// Pull(fetch and fast-forward merge) repositoryto input_repo. - fn pull_repository(&self,input_repo :Repository) -> Result<(),git2::Error>{ - match input_repo.find_remote("origin")? - .fetch(&["main"], None, None) - .map_err(|e| { - AlertMessage::alert( - &mut BufWriter::new(std::io::stderr().lock()), - &format!("Failed git fetch to rules folder. {}", e), - ) - .ok(); - }) { + fn pull_repository(&self, input_repo: Repository) -> Result<(), git2::Error> { + match input_repo + .find_remote("origin")? + .fetch(&["main"], None, None) + .map_err(|e| { + AlertMessage::alert( + &mut BufWriter::new(std::io::stderr().lock()), + &format!("Failed git fetch to rules folder. {}", e), + ) + .ok(); + }) { Ok(it) => it, Err(_err) => return Err(git2::Error::from_str(&String::default())), }; From 0fdabf0d70833b2232628050dcb637ef8142f006 Mon Sep 17 00:00:00 2001 From: Alan Smithee Date: Tue, 1 Mar 2022 03:17:55 +0900 Subject: [PATCH 4/4] added process of remove submodule cache #432 --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 8fd635ae..65f102cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -511,7 +511,7 @@ impl App { ); // レポジトリが開けなかった段階でhayabusa rulesのgit cloneを実施する self.clone_rules() - } else if hayabusa_rule_repo.is_ok() && hayabusa_repo.is_err() { + } else if hayabusa_rule_repo.is_ok() { // rulesのrepositoryが確認できる場合 // origin/mainのfetchができなくなるケースはネットワークなどのケースが考えられるため、git cloneは実施しない self.pull_repository(hayabusa_rule_repo.unwrap()) @@ -524,6 +524,8 @@ impl App { let hayabusa_repo = hayabusa_repo.unwrap(); let submodules = hayabusa_repo.submodules()?; let mut is_success_submodule_update = true; + // submoduleのname参照だと参照先を変えることで意図しないフォルダを削除する可能性があるためハードコーディングする + fs::remove_dir_all(".git/.submodule/rules").ok(); for mut submodule in submodules { submodule.update(true, None)?; let submodule_repo = submodule.open()?;