aboutsummaryrefslogtreecommitdiff
path: root/src/git_tools.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/git_tools.rs')
-rw-r--r--src/git_tools.rs106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/git_tools.rs b/src/git_tools.rs
new file mode 100644
index 0000000..1c361ca
--- /dev/null
+++ b/src/git_tools.rs
@@ -0,0 +1,106 @@
+use std::io::{Result, Error, ErrorKind};
+use std::process::Command;
+use std::path::Path;
+
+pub fn git_save_previous_branch(path: &Path) -> Result<String> {
+ let output = Command::new("git")
+ .arg("rev-parse")
+ .arg("--abbrev-ref")
+ .arg("HEAD")
+ .current_dir(path)
+ .output()?;
+ if !output.status.success() {
+ Err(Error::new(ErrorKind::Other, "Failed to get current branch"))
+ } else {
+ Ok(String::from_utf8(output.stdout).unwrap().trim().to_string())
+ }
+}
+
+pub fn git_checkout(path: &Path, branch: &str) -> Result<()> {
+ let output = Command::new("git")
+ .arg("checkout")
+ .arg(branch)
+ .current_dir(path)
+ .output()?;
+ if !output.status.success() {
+ Err(Error::new(ErrorKind::Other, format!("Failed to checkout {}", branch)))
+ } else {
+ Ok(())
+ }
+}
+
+pub fn git_fetch(path: &Path) -> Result<()> {
+ let output = Command::new("git")
+ .arg("fetch")
+ .current_dir(path)
+ .output()?;
+ if !output.status.success() {
+ return Err(Error::new(ErrorKind::Other, "Failed to fetch"));
+ }
+ Ok(())
+}
+
+pub fn git_check_for_conflicts(path: &Path) -> Result<bool> {
+ let merge_output = Command::new("git")
+ .arg("merge")
+ .arg("--no-commit")
+ .arg("--no-ff")
+ .arg("origin/main")
+ .current_dir(path)
+ .output()?;
+ if !merge_output.status.success() {
+ return Err(Error::new(ErrorKind::Other, "Failed to merge"));
+ }
+ let conflicts_output = Command::new("git")
+ .arg("ls-files")
+ .arg("--unmerged")
+ .current_dir(path)
+ .output()?;
+ Command::new("git")
+ .arg("merge")
+ .arg("--abort")
+ .current_dir(path)
+ .output()?;
+ Ok(!conflicts_output.stdout.is_empty())
+}
+
+pub fn git_merge(path: &Path) -> Result<()> {
+ let output = Command::new("git")
+ .arg("merge")
+ .arg("origin/main")
+ .current_dir(path)
+ .output()?;
+ if !output.status.success() {
+ Err(Error::new(ErrorKind::Other, "Failed to merge"))
+ } else {
+ Ok(())
+ }
+}
+
+pub fn git_push(path: &Path) -> Result<()> {
+ let output = Command::new("git")
+ .arg("push")
+ .arg("origin")
+ .arg("main")
+ .current_dir(path)
+ .output()?;
+ if !output.status.success() {
+ Err(Error::new(ErrorKind::Other, "Failed to push to origin"))
+ } else {
+ Ok(())
+ }
+}
+
+pub fn get_commit(path: &Path, revision: &str) -> Result<String> {
+ let output = Command::new("git")
+ .arg("rev-parse")
+ .arg("--short")
+ .arg(revision)
+ .current_dir(path)
+ .output()?;
+ if !output.status.success() {
+ Err(Error::new(ErrorKind::Other, "Failed to get current commit"))
+ } else {
+ Ok(String::from_utf8(output.stdout).unwrap().trim().to_string())
+ }
+}