/ src / git.rs
git.rs
 1  use crate::error::JournalError;
 2  use log::debug;
 3  use std::ffi::OsString;
 4  use std::path::Path;
 5  use std::process::Command;
 6  
 7  pub fn init<P: AsRef<Path>>(dirname: P) -> Result<(), JournalError> {
 8      let dirname = dirname.as_ref();
 9      debug!("git init {}", dirname.display());
10  
11      let output = Command::new("git")
12          .arg("init")
13          .current_dir(dirname)
14          .output()
15          .map_err(|err| JournalError::SpawnGit(dirname.to_path_buf(), err))?;
16      debug!("git init exit code was {:?}", output.status.code());
17      if !output.status.success() {
18          let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
19          return Err(JournalError::GitInit(dirname.to_path_buf(), stderr));
20      }
21      Ok(())
22  }
23  
24  pub fn add<P: AsRef<Path>>(dirname: P, files: &[P]) -> Result<(), JournalError> {
25      let args = &["add", "--"];
26      let mut args: Vec<OsString> = args.iter().map(OsString::from).collect();
27      for f in files {
28          args.push(OsString::from(f.as_ref()));
29      }
30  
31      let dirname = dirname.as_ref();
32      debug!("git add in {}", dirname.display());
33  
34      let output = Command::new("git")
35          .args(&args)
36          .current_dir(dirname)
37          .output()
38          .map_err(|err| JournalError::SpawnGit(dirname.to_path_buf(), err))?;
39      debug!("git exit code was {:?}", output.status.code());
40      if !output.status.success() {
41          let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
42          return Err(JournalError::GitAdd(dirname.to_path_buf(), stderr));
43      }
44      Ok(())
45  }
46  
47  pub fn commit<P: AsRef<Path>>(dirname: P, msg: &str) -> Result<(), JournalError> {
48      let dirname = dirname.as_ref();
49      debug!("git commit in {}", dirname.display());
50  
51      let output = Command::new("git")
52          .args(["commit", "-m", msg])
53          .current_dir(dirname)
54          .output()
55          .map_err(|err| JournalError::SpawnGit(dirname.to_path_buf(), err))?;
56      debug!("git exit code was {:?}", output.status.code());
57      if !output.status.success() {
58          let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
59          return Err(JournalError::GitCommit(dirname.to_path_buf(), stderr));
60      }
61      Ok(())
62  }