From e86d7e7e03c039db398df51ea75b3517368dfcde Mon Sep 17 00:00:00 2001 From: Tomas Rivera Date: Wed, 27 May 2026 16:59:34 +0200 Subject: [PATCH] feat: add backup now button --- src/main.c | 42 +++++++++++++++++++++++++++++++++--------- src/utils.c | 12 +++++++++--- src/utils.h | 5 +++-- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/main.c b/src/main.c index fcafd7a..29edc89 100644 --- a/src/main.c +++ b/src/main.c @@ -529,9 +529,14 @@ int main(int argc, char *argv[]) { shouldDebug); // check if editor is supported and if it is installed. If not, it // will throw an error. + int *backupMessage = malloc(sizeof(int)); // Used later to set the backuping message. + *backupMessage = 0; // default don't show the message + int forceBackup = 0; if (doesBackup) { - debug("Handling backup"); - handleBackups(directoriesArray, numDirectories, backupDirectoriesArray, homedir, interval, (const char **)rsyncArgs, rsyncArgsNumber, shouldDebug); + debug("Handling normal backup"); + forceBackup = 0; + handleBackups(directoriesArray, numDirectories, backupDirectoriesArray, homedir, interval, (const char **)rsyncArgs, rsyncArgsNumber, forceBackup, backupMessage, shouldDebug); + debug("backupMessage was set to %d by a normal backup", *backupMessage); } initscr(); // initialize ncurses @@ -572,13 +577,26 @@ int main(int argc, char *argv[]) { } altDebug("└ ------------------------------\n"); } - - // adds "create a new vault" into the vaultsArray - const int extraOptions = 3; + int extraOptions = 3; + if (doesBackup) { + extraOptions++; // space for "Backup now" button + } + if (*backupMessage) { + extraOptions++; + } vaultsArray = realloc(vaultsArray, (vaultsCount + extraOptions) * sizeof(char *)); // resize vaultsArray to fit the extra options - vaultsArray[vaultsCount] = "Create a new vault"; // some more options that are not vaults - vaultsArray[vaultsCount + 1] = "Settings"; - vaultsArray[vaultsCount + 2] = "Quit (Ctrl+C)"; + int index = 0; + vaultsArray[vaultsCount + index++] = "Create a new vault"; // some more options that are not vaults + vaultsArray[vaultsCount + index++] = "Settings"; + if (doesBackup) { + vaultsArray[vaultsCount + index++] = "Backup now"; + } + vaultsArray[vaultsCount + index++] = "Quit (Ctrl+C)"; + if (*backupMessage) { + vaultsArray[vaultsCount + index++] = "A backup was launched. Do not immediatly close the program. After a few seconds, you can safely ignore this message."; + }; + + *backupMessage = 0; // we reset it to show the message only once vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select):", vaultsCount, extraOptions, " ", "Or select an option below", "", shouldDebug); @@ -594,7 +612,8 @@ int main(int argc, char *argv[]) { } debug("Selected vault: %s", vaultSelected); - if (strcmp(vaultSelected, "Create a new vault") != 0 && strcmp(vaultSelected, "Settings") != 0 && strcmp(vaultSelected, "Quit (Ctrl+C)") != 0) { + if (strcmp(vaultSelected, "Create a new vault") != 0 && strcmp(vaultSelected, "Settings") != 0 && strcmp(vaultSelected, "Quit (Ctrl+C)") != 0 && strcmp(vaultSelected, "Backup now") != 0 && + strcmp(vaultSelected, "A backup was launched. Do not immediatly close the program. After a few seconds, you can safely ignore this message.") != 0) { note_selection: bypassSelectionVault = 0; // we must reset bypassSelectionVault to not get stuck in a // infinite loop of bypassing @@ -731,6 +750,11 @@ int main(int argc, char *argv[]) { } else if (strcmp(vaultSelected, "Settings") == 0) { openEditor(configPath, editorToOpen, 0, 0, shouldDebug); // as this is not a md file we set render and jumptoEnfOfFile to 0 + } else if (strcmp(vaultSelected, "Backup now") == 0) { + debug("Running a forced backup"); + forceBackup = 1; + handleBackups(directoriesArray, numDirectories, backupDirectoriesArray, homedir, interval, (const char **)rsyncArgs, rsyncArgsNumber, forceBackup, backupMessage, shouldDebug); + debug("backupMessage was set to %d by a normal backup", *backupMessage); } else if (strcmp(vaultSelected, "Quit (Ctrl+C)") == 0) { debug("The program was exited"); shouldExit = 1; diff --git a/src/utils.c b/src/utils.c index 3fc5cc4..0f49b6e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -167,8 +167,9 @@ void initAppFilesAndDirs(const char *home, const int shouldDebug) { } void handleBackups(char **sourceDirectoryArray, const int sourceNumber, char **destinationDirectoryArray, const char *homeDir, const int interval, const char **rsyncArguments, const int rsyncArgumentsNumber, - const int shouldDebug) { + const int forceBackup, int *backupMessage, const int shouldDebug) { int shouldBackup = 0; + time_t now = time(NULL); debug("Time since epoch is %ld", (long)now); char cacheFilePATH[PATH_MAX]; @@ -203,8 +204,12 @@ void handleBackups(char **sourceDirectoryArray, const int sourceNumber, char **d error(1, "program", "Invalid timestamp in cache file: %s", line); } double deltaTime = difftime(now, lastBackupTime); - if (deltaTime > interval) { - debug("(difftime) %f is greater than (interval) %d -> backuping...", deltaTime, interval); + if (deltaTime > interval || forceBackup) { + if (!forceBackup) { + debug("(difftime) %f is greater than (interval) %d -> backuping...", deltaTime, interval); + } else { + debug("Backup was forced. backuping..."); + } shouldBackup = 1; cacheFile = fopen(cacheFilePATH, "w"); if (!cacheFile) { @@ -218,6 +223,7 @@ void handleBackups(char **sourceDirectoryArray, const int sourceNumber, char **d } if (shouldBackup) { + *backupMessage = 1; debug("A backup is needed"); for (int i = 0; i < sourceNumber; i++) { debug("%s", destinationDirectoryArray[i]); diff --git a/src/utils.h b/src/utils.h index d41c0d2..be1d260 100644 --- a/src/utils.h +++ b/src/utils.h @@ -81,7 +81,8 @@ If need launches in the background rsync to do the backuping. Each pair of source/destination will launch one rsync process. If a pair don't need to be backed up, the destination should be set to NULL. rsyncArgs is the array of arguments to be passed to rsync. Do not inclue destination or source. It -will be added in the function.*/ +will be added in the function. +backupMessage will be set to 1 if a backup was launched.*/ void handleBackups(char **sourceDirectoryArray, const int sourceDirectoryNumber, char **destinationDirectoryArray, const char *homeDir, const int interval, const char **rsyncArgs, const int rsyncArgsNumber, - const int shouldDebug); + const int forceBackup, int *backupMessage, const int shouldDebug); #endif