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 let prefix = "[git-side]".dimmed();
53
54 match repo.commit(&message) {
56 Ok(()) => {
57 println!(
58 "{} {} {}",
59 prefix,
60 "Auto-committed:".green().bold(),
61 message.lines().next().unwrap_or(&message)
62 );
63 println!(
64 "{} {} file(s) synced",
65 prefix,
66 files.len().to_string().cyan()
67 );
68 if repo.push().is_ok() {
70 println!("{} {}", prefix, "Pushed to remote.".green().bold());
71 }
72 }
73 Err(Error::NothingToCommit) => {
74 println!("{} {}", prefix, "Nothing to commit (side repo is up to date).".yellow());
75 }
76 Err(e) => return Err(e),
77 }
78
79 Ok(())
80}