Add variable to keep track of changed files to be commited
This commit is contained in:
parent
aa9209b7d6
commit
bf70e1b7f9
|
|
@ -7,7 +7,6 @@ This script automates the process of backing up your Obsidian vault to a Git rep
|
||||||
- [x] Trigger backup after file changes with delay
|
- [x] Trigger backup after file changes with delay
|
||||||
- [x] Maintain git repo in a seperate folder to not have the repo synced by syncthing (copy changed files over)
|
- [x] Maintain git repo in a seperate folder to not have the repo synced by syncthing (copy changed files over)
|
||||||
- [x] Push changes to remote repository
|
- [x] Push changes to remote repository
|
||||||
- [ ] Some error management
|
|
||||||
- [x] Tray Menu
|
- [x] Tray Menu
|
||||||
- [x] Exit
|
- [x] Exit
|
||||||
- [x] Backup now
|
- [x] Backup now
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,25 @@
|
||||||
use chrono::Local;
|
use chrono::Local;
|
||||||
use git2::{Cred, IndexAddOption, PushOptions, RemoteCallbacks, Repository, StatusOptions};
|
use git2::{Cred, Error, IndexAddOption, PushOptions, RemoteCallbacks, Repository, StatusOptions};
|
||||||
use keyring::Entry;
|
use keyring::Entry;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
pub fn backup_changes(repo_path: &Path) -> Result<(), Box<dyn std::error::Error>> {
|
pub fn current_change_count(repo_path: &Path) -> Result<usize, Error> {
|
||||||
let start = std::time::Instant::now();
|
|
||||||
|
|
||||||
// Open the repository at the provided path
|
// Open the repository at the provided path
|
||||||
let repo = Repository::open(repo_path)?;
|
let repo = Repository::open(repo_path)?;
|
||||||
|
|
||||||
// Gather the repository statuses, including untracked files.
|
// Gather the repository statuses, including untracked files
|
||||||
|
let mut status_opts = StatusOptions::new();
|
||||||
|
status_opts.include_untracked(true);
|
||||||
|
let statuses = repo.statuses(Some(&mut status_opts))?;
|
||||||
|
|
||||||
|
Ok(statuses.len())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn backup_changes(repo_path: &Path) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
// Open the repository at the provided path
|
||||||
|
let repo = Repository::open(repo_path)?;
|
||||||
|
|
||||||
|
// Gather the repository statuses, including untracked files
|
||||||
let mut status_opts = StatusOptions::new();
|
let mut status_opts = StatusOptions::new();
|
||||||
status_opts.include_untracked(true);
|
status_opts.include_untracked(true);
|
||||||
let statuses = repo.statuses(Some(&mut status_opts))?;
|
let statuses = repo.statuses(Some(&mut status_opts))?;
|
||||||
|
|
@ -17,11 +27,10 @@ pub fn backup_changes(repo_path: &Path) -> Result<(), Box<dyn std::error::Error>
|
||||||
// If no changes are detected, exit early
|
// If no changes are detected, exit early
|
||||||
if statuses.is_empty() {
|
if statuses.is_empty() {
|
||||||
println!("No changes detected");
|
println!("No changes detected");
|
||||||
println!("Backup took {:?}", start.elapsed());
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print out all changes.
|
// Print out all changes
|
||||||
println!("Detected changes:");
|
println!("Detected changes:");
|
||||||
for entry in statuses.iter() {
|
for entry in statuses.iter() {
|
||||||
let path = entry.path().unwrap_or("<unknown>");
|
let path = entry.path().unwrap_or("<unknown>");
|
||||||
|
|
@ -72,7 +81,6 @@ pub fn backup_changes(repo_path: &Path) -> Result<(), Box<dyn std::error::Error>
|
||||||
remote.push(&["refs/heads/main"], Some(&mut push_options))?;
|
remote.push(&["refs/heads/main"], Some(&mut push_options))?;
|
||||||
|
|
||||||
println!("Changes committed and pushed successfully.");
|
println!("Changes committed and pushed successfully.");
|
||||||
println!("Backup took {:?}", start.elapsed());
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
18
src/main.rs
18
src/main.rs
|
|
@ -13,7 +13,7 @@ use winit::{
|
||||||
};
|
};
|
||||||
|
|
||||||
mod filesync;
|
mod filesync;
|
||||||
mod gitpush;
|
mod git;
|
||||||
|
|
||||||
const SOURCE_VAULT: &str = "X:\\test\\obsidian-vault-source"; // syncthing vault folder
|
const SOURCE_VAULT: &str = "X:\\test\\obsidian-vault-source"; // syncthing vault folder
|
||||||
const REPO_VAULT: &str = "X:\\test\\obsidian-vault-test"; // git repo folder
|
const REPO_VAULT: &str = "X:\\test\\obsidian-vault-test"; // git repo folder
|
||||||
|
|
@ -31,6 +31,7 @@ struct App {
|
||||||
menu_exit_id: Option<MenuId>,
|
menu_exit_id: Option<MenuId>,
|
||||||
last_change_time: Option<Instant>,
|
last_change_time: Option<Instant>,
|
||||||
duration_threshold: Duration,
|
duration_threshold: Duration,
|
||||||
|
current_change_count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ApplicationHandler<UserEvent> for App {
|
impl ApplicationHandler<UserEvent> for App {
|
||||||
|
|
@ -70,7 +71,8 @@ impl ApplicationHandler<UserEvent> for App {
|
||||||
// Handle push now menu item
|
// Handle push now menu item
|
||||||
self.last_change_time = None;
|
self.last_change_time = None;
|
||||||
let repo_dir = Path::new(REPO_VAULT);
|
let repo_dir = Path::new(REPO_VAULT);
|
||||||
gitpush::backup_changes(repo_dir).expect("Changes could not be pushed");
|
git::backup_changes(repo_dir).expect("Changes could not be pushed");
|
||||||
|
self.current_change_count = 0;
|
||||||
}
|
}
|
||||||
id if id == self.menu_exit_id.as_ref().unwrap() => {
|
id if id == self.menu_exit_id.as_ref().unwrap() => {
|
||||||
println!("---> Exit triggert by menu");
|
println!("---> Exit triggert by menu");
|
||||||
|
|
@ -85,10 +87,11 @@ impl ApplicationHandler<UserEvent> for App {
|
||||||
self.last_change_time = Some(Instant::now());
|
self.last_change_time = Some(Instant::now());
|
||||||
let source = Path::new(SOURCE_VAULT);
|
let source = Path::new(SOURCE_VAULT);
|
||||||
let target = Path::new(REPO_VAULT);
|
let target = Path::new(REPO_VAULT);
|
||||||
let start = std::time::Instant::now();
|
|
||||||
filesync::sync_directory(source, target, Some(".git"))
|
filesync::sync_directory(source, target, Some(".git"))
|
||||||
.expect("Directories could not be synced");
|
.expect("Directories could not be synced");
|
||||||
println!("Sync took {:?}", start.elapsed());
|
self.current_change_count = git::current_change_count(target)
|
||||||
|
.expect("Changes could not get counted using git");
|
||||||
|
println!("Currently changed files: {:?}", self.current_change_count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -102,7 +105,8 @@ impl ApplicationHandler<UserEvent> for App {
|
||||||
println!("---> Backup triggered by file change");
|
println!("---> Backup triggered by file change");
|
||||||
self.last_change_time = None;
|
self.last_change_time = None;
|
||||||
let repo_dir = Path::new(REPO_VAULT);
|
let repo_dir = Path::new(REPO_VAULT);
|
||||||
gitpush::backup_changes(repo_dir).expect("Changes could not be pushed");
|
git::backup_changes(repo_dir).expect("Changes could not be pushed");
|
||||||
|
self.current_change_count = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,11 +127,9 @@ fn main() {
|
||||||
// Sync folder and check for changes to back up
|
// Sync folder and check for changes to back up
|
||||||
let source_dir = Path::new(SOURCE_VAULT);
|
let source_dir = Path::new(SOURCE_VAULT);
|
||||||
let repo_dir = Path::new(REPO_VAULT);
|
let repo_dir = Path::new(REPO_VAULT);
|
||||||
let start = std::time::Instant::now();
|
|
||||||
filesync::sync_directory(source_dir, repo_dir, Some(".git"))
|
filesync::sync_directory(source_dir, repo_dir, Some(".git"))
|
||||||
.expect("Directories could not be synced");
|
.expect("Directories could not be synced");
|
||||||
println!("Sync took {:?}", start.elapsed());
|
git::backup_changes(repo_dir).expect("Changes could not be pushed");
|
||||||
gitpush::backup_changes(repo_dir).expect("Changes could not be pushed");
|
|
||||||
|
|
||||||
// Create event loop
|
// Create event loop
|
||||||
let event_loop = EventLoop::<UserEvent>::with_user_event().build().unwrap();
|
let event_loop = EventLoop::<UserEvent>::with_user_event().build().unwrap();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user