Skip to content

Commit

Permalink
feat: Add clean exit signals for ctrl+c
Browse files Browse the repository at this point in the history
  • Loading branch information
notheotherben committed Jul 25, 2024
1 parent 707a256 commit 669c332
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ mod sources;
mod targets;
mod telemetry;

static CANCEL: AtomicBool = AtomicBool::new(false);

/// Backup your GitHub repositories automatically.
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
Expand Down Expand Up @@ -63,19 +65,17 @@ async fn run(args: Args) -> Result<(), Error> {
let github = sources::GitHubSource::from(&config);
let git_backup = targets::FileSystemBackupTarget::from(&config);

let cancel = AtomicBool::new(false);

loop {
while !CANCEL.load(std::sync::atomic::Ordering::Relaxed) {
let next_run = config.schedule.as_ref()
.and_then(|s| s.find_next_occurrence(&chrono::Utc::now(), false).ok());

{
let _span = tracing::info_span!("backup.all").entered();

for policy in config.backups.iter() {
let policy_span = tracing::info_span!("backup.policy", policy = %policy).entered();

match github.get_repos(policy, &cancel).instrument(tracing::info_span!(parent: &policy_span, "backup.get_repos")).await {
match github.get_repos(policy, &CANCEL).instrument(tracing::info_span!(parent: &policy_span, "backup.get_repos")).await {
Ok(repos) => {
println!("Backing up repositories for: {}", &policy);
let mut join_set: JoinSet<Result<(_, String), (_, errors::Error)>> = JoinSet::new();
Expand All @@ -87,11 +87,10 @@ async fn run(args: Args) -> Result<(), Error> {
}

let git_backup = git_backup.clone();
let cancel = AtomicBool::new(false);

let span = tracing::info_span!(parent: &policy_span, "backup.repo", repo = %repo.full_name());
join_set.spawn(async move {
match git_backup.backup(&repo, &cancel) {
match git_backup.backup(&repo, &CANCEL) {
Ok(id) => Ok((repo, id)),
Err(e) => Err((repo, e)),
}
Expand Down Expand Up @@ -126,7 +125,7 @@ async fn run(args: Args) -> Result<(), Error> {
if let Some(next_run) = next_run {
println!("Next backup scheduled for: {}", next_run);

while chrono::Utc::now() < next_run && !cancel.load(std::sync::atomic::Ordering::Relaxed) {
while chrono::Utc::now() < next_run && !CANCEL.load(std::sync::atomic::Ordering::Relaxed) {
tokio::time::sleep(Duration::from_millis(500)).await;
}
} else {
Expand All @@ -139,6 +138,10 @@ async fn run(args: Args) -> Result<(), Error> {

#[tokio::main]
async fn main() {
ctrlc::set_handler(|| {
CANCEL.store(true, std::sync::atomic::Ordering::Relaxed);
}).unwrap_or_default();

let args = Args::parse();

telemetry::setup();
Expand Down

0 comments on commit 669c332

Please sign in to comment.