Compare commits

..
4 Commits
Author SHA1 Message Date
tomasr e86d7e7e03 feat: add backup now button 2026-05-27 17:09:14 +02:00
tomasr f66371137a fix: release workflow correct branch 2026-05-26 11:51:08 +02:00
tomasr 503dddd9be fix(#33): CI update flake version flag 2026-05-26 11:43:14 +02:00
tomasr 004b536e05 fix(#33): flake notewrapper version flag 2026-05-26 11:19:03 +02:00
7 changed files with 112 additions and 30 deletions
+55
View File
@@ -0,0 +1,55 @@
name: Release PR
on:
workflow_dispatch:
inputs:
version:
required: true
permissions:
contents: write
pull-requests: write
jobs:
release_pr:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- uses: DeterminateSystems/nix-installer-action@v12
- name: Create release branch
run: |
git checkout -B release/${{ inputs.version }}
- name: Set version in flake.nix
run: |
sed -i "s/version = \".*\";/version = \"${{ inputs.version }}\";/" flake.nix
- name: Update flake inputs
run: nix flake update
- name: Commit changes
run: |
git add flake.nix flake.lock
git commit -m "chore(release): ${{ inputs.version }}"
- name: Push branch
run: |
git push origin release/${{ inputs.version }}
- name: Create Pull Request
run: |
gh pr create \
--base main \
--head release/v${{ inputs.version }} \
--title "[Automatic] Release PR ${{ inputs.version }}" \
--body "Automated release PR.\nAfter the test's succesfull run, create manually a release with a new tag matching ${{ inputs.version }}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+1 -1
View File
@@ -1,6 +1,6 @@
# NoteWrapper
Note: This project fullfills all my usecases for now, so my main source for features ideas dried out. So if you have good ideas, feel free to open an issue ;)
Note: This project fullfills all my usecase for now, so my main source for features ideas dried out. So if you have good ideas, feel free to open an issue ;)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/tomasriveral/notewrapper)
+2 -6
View File
@@ -17,7 +17,7 @@
in {
packages.default = pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "notewrapper";
version = "2.0";
version = "v2.1";
src = notewrapper;
@@ -36,12 +36,8 @@
gnused
];
makeFlags = [
"VERSION=2.0"
];
buildPhase = ''
make
make VERSION=${finalAttrs.version}
'';
installPhase = ''
+33 -9
View File
@@ -529,9 +529,14 @@ backup_config_end:
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 @@ backup_config_end:
}
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 @@ backup_config_end:
}
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 @@ backup_config_end:
} 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;
+9 -9
View File
@@ -130,16 +130,16 @@ char *createNewNote(char dirToVault[PATH_MAX], char *vaultFromDir, int bypass, c
free(fileFullPath);
} else { // if it is a unified journal
char *fileFullPath = malloc(PATH_MAX);
// we append .md directly to fileName and not only to fileFullPath to avoid passing the wrong fileName later.
int lenName = strlen(fileName);
if (fileName[lenName - 3] != '.' && fileName[lenName - 2] != 'm' && fileName[lenName - 2] != '1') {
strcat(fileName, ".md");
debug("We just appended .md to %s", fileName);
}
snprintf(fileFullPath, PATH_MAX, "%s/%s/%s", dirToVault, vaultFromDir, fileName);
// we verify if the file doesn't already exist as we might just have changed the fileName and (by extension) the file path.
struct stat metadata;
error(stat(fileFullPath, &metadata) == 0, "user", "%s already exists", fileFullPath);
int len = strlen(fileFullPath);
if (fileFullPath[len - 3] != '.' || fileFullPath[len - 2] != 'm' || fileFullPath[len - 1] != 'd') { // there might be a cleaner way to do this
error(len > PATH_MAX - 3, "user", "%s is too big (greater than PATH_MAX-3) and we can't append .md", fileFullPath);
strncat(fileFullPath, ".md", PATH_MAX);
// we checked before if fileName didn't already exist.
// we must redo it as we add a .mode
struct stat st;
error(stat(fileFullPath, &st) == 0, "user", "%s already exists", fileFullPath);
}
FILE *filePointer;
filePointer = fopen(fileFullPath, "w"); // creates and opens the file
error(filePointer == NULL, "program", "The %s couldn't be created.", fileFullPath);
+8 -2
View File
@@ -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) {
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]);
+3 -2
View File
@@ -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