git_side/commands/
auto.rs1use colored::Colorize;
2
3use crate::error::{Error, Result};
4use crate::git;
5use crate::side_repo::SideRepo;
6use crate::tracked::TrackedPaths;
7
8pub fn run() -> Result<()> {
14 let repo = SideRepo::open()?;
15
16 if !repo.is_initialized() {
17 return Err(Error::NoTrackedPaths);
18 }
19
20 let tracked = TrackedPaths::load(&repo)?;
22
23 if tracked.is_empty() {
24 return Err(Error::NoTrackedPaths);
25 }
26
27 let files = tracked.expand(&repo.work_tree);
29
30 let tracked_paths: Vec<_> = tracked.paths().iter().cloned().collect();
32
33 repo.stage_update(&tracked_paths);
36
37 repo.stage_new(&tracked_paths)?;
39
40 repo.stage_tracked_file()?;
42
43 let message = git::last_commit_message()?;
45
46 if message.trim().is_empty() {
47 return Err(Error::GitCommandFailed(
48 "no commit message found in main repo".to_string(),
49 ));
50 }
51
52 match repo.commit(&message) {
54 Ok(()) => {
55 println!(
56 "{} {}",
57 "Auto-committed:".green().bold(),
58 message.lines().next().unwrap_or(&message)
59 );
60 println!(
61 " {} file(s) synced",
62 files.len().to_string().cyan()
63 );
64 }
65 Err(Error::NothingToCommit) => {
66 println!("{}", "Nothing to commit (side repo is up to date).".yellow());
67 }
68 Err(e) => return Err(e),
69 }
70
71 Ok(())
72}