Compare commits

..
22 Commits
Author SHA1 Message Date
tomasr 292688296e format: fix 2026-06-02 13:46:03 +02:00
tomasr 4c18c2dda4 feat: fzf search inside vaults 2026-06-02 13:42:46 +02:00
tomasr 1bfb7f82a5 fix: fzfSearch when journal entry 2026-06-02 13:42:37 +02:00
tomasr d8a11bbc16 fix: flake src 2026-06-01 11:37:47 +02:00
tomasrandGitHub 1d95983d5d Merge (#42) from tomasriveral/flake-update/2026-06-01
[Automated] Weekly flake update 2026-06-01
2026-06-01 11:10:45 +02:00
github-actions[bot] 30449ca473 chore: weekly flake update 2026-06-01 08:42:14 +00:00
tomasrandGitHub 7af79c76b1 Merge pull request #41 from tomasriveral/release/v2.2
[Automatic] Release PR v2.2
2026-05-27 17:42:59 +02:00
github-actions[bot] 27b8b310cb chore(release): v2.2 2026-05-27 15:39:57 +00:00
tomasrandGitHub 4d228fb911 Merge (#40) from tomasriveral/fix-release-workflow-electric-bogaloo
CI: fix release workflow uncorrect branch
2026-05-27 17:38:57 +02:00
tomasr 34a2546990 CI: fix release workflow uncorrect branch 2026-05-27 17:35:42 +02:00
tomasrandGitHub 7231741f2d Merge (#39) from tomasriveral/feat-backup-now
feat: add backup now button
2026-05-27 17:11:43 +02:00
tomasr e86d7e7e03 feat: add backup now button 2026-05-27 17:09:14 +02:00
tomasrandGitHub 280c329339 Merge (#38) from tomasriveral/release/vv2.1.1
[Automatic] Release PR v2.1.1
2026-05-26 11:56:22 +02:00
tomasrandGitHub f7c84136a5 Merge (#37) from tomasriveral/fix-release-workflow
fix: release workflow correct branch
2026-05-26 11:53:33 +02:00
tomasr f66371137a fix: release workflow correct branch 2026-05-26 11:51:08 +02:00
github-actions[bot] 77b5148489 chore(release): v2.1.1 2026-05-26 09:45:50 +00:00
tomasrandGitHub d537357802 Merge (#36) from tomasriveral/fix-33-flake-version
fix(#33): CI update flake version flag
2026-05-26 11:44:55 +02:00
tomasr 503dddd9be fix(#33): CI update flake version flag 2026-05-26 11:43:14 +02:00
tomasrandGitHub fd77eaa4de Merge (#35) from tomasriveral/revert-34-fix-33-flake-version
Revert "fix(#33): flake notewrapper version flag"
2026-05-26 11:37:04 +02:00
tomasrandGitHub d6fa89785f Revert "fix(#33): flake notewrapper version flag" 2026-05-26 09:36:39 +00:00
tomasrandGitHub 30616b1b6f Merge (#34) from tomasriveral/fix-33-flake-version
fix(#33): flake notewrapper version flag
2026-05-26 11:22:05 +02:00
tomasr 004b536e05 fix(#33): flake notewrapper version flag 2026-05-26 11:19:03 +02:00
7 changed files with 136 additions and 103 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/${{ 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 }}
Generated
+4 -21
View File
@@ -20,11 +20,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1779508470,
"narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=",
"lastModified": 1779560665,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "29916453413845e54a65b8a1cf996842300cd299",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786",
"type": "github"
},
"original": {
@@ -34,27 +34,10 @@
"type": "github"
}
},
"notewrapper": {
"flake": false,
"locked": {
"lastModified": 1779721342,
"narHash": "sha256-QbRzgD4HoUUemaVCIZ2VfiW+SUjzFY2rL51CLOxQLvk=",
"owner": "tomasriveral",
"repo": "NoteWrapper",
"rev": "e370f98c5ebc3c037dec4e7e35f26230724b70d3",
"type": "github"
},
"original": {
"owner": "tomasriveral",
"repo": "NoteWrapper",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"notewrapper": "notewrapper"
"nixpkgs": "nixpkgs"
}
},
"systems": {
+4 -12
View File
@@ -4,22 +4,18 @@
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
notewrapper = {
url = "github:tomasriveral/NoteWrapper";
flake = false;
};
};
outputs = { self, nixpkgs, flake-utils, notewrapper }:
outputs = { self, nixpkgs, flake-utils}:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
in {
packages.default = pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "notewrapper";
version = "2.0";
version = "v2.2";
src = notewrapper;
src = ./.;
nativeBuildInputs = with pkgs; [
pkg-config
@@ -36,12 +32,8 @@
gnused
];
makeFlags = [
"VERSION=2.0"
];
buildPhase = ''
make
make VERSION=${finalAttrs.version}
'';
installPhase = ''
+46 -14
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
@@ -625,12 +644,13 @@ backup_config_end:
altDebug("└------------------------------\n");
}
// adds options
int extraNotesOptions = 4;
int extraNotesOptions = 5;
filesArray = realloc(filesArray, (filesCount + extraNotesOptions) * sizeof(char *)); // resize filesArray to fit the extra options
filesArray[filesCount] = "Create new note";
filesArray[filesCount + 1] = "Back to vault selection";
filesArray[filesCount + 2] = "Delete vault";
filesArray[filesCount + 3] = "Quit (Ctrl+C)";
filesArray[filesCount + 1] = "Search inside the vault";
filesArray[filesCount + 2] = "Back to vault selection";
filesArray[filesCount + 3] = "Delete vault";
filesArray[filesCount + 4] = "Quit (Ctrl+C)";
char *noteSelected;
// if we set to bypass the note selector
if (bypassSelectionNote) {
@@ -661,7 +681,7 @@ backup_config_end:
free(filesArray);
debug("Selected note: %s", noteSelected);
if (strcmp(noteSelected, "Create new note") != 0 && strcmp(noteSelected, "Back to vault selection") != 0 && strcmp(noteSelected, "Delete vault") != 0 &&
strcmp(noteSelected, "Quit (Ctrl+C)") != 0) {
strcmp(noteSelected, "Quit (Ctrl+C)") != 0 && strcmp(noteSelected, "Search inside the vault") != 0) {
open_note:
bypassSelectionNote = 0; // we must reset bypassSelectionNote to avoid getting into an infinite
// loop of bypassing the note selection
@@ -698,6 +718,13 @@ backup_config_end:
noteSelected = createNewNote(notesDirectoryString, vaultSelected, bypassSelectionNote, bypassSelectionNoteValue, journalRegex, shouldDebug);
// we can just go back to open_note
goto open_note;
} else if (strcmp(noteSelected, "Search inside the vault") == 0) {
char *vaultPath = malloc(PATH_MAX);
snprintf(vaultPath, PATH_MAX, "%s/%s/", notesDirectoryString, vaultSelected);
char *result = fzfSelect(vaultPath, "Input text to be searched", shouldDebug);
bypassSelectionNote = 1;
bypassSelectionNoteValue = result;
free(vaultPath);
} else if (strcmp(noteSelected, "Back to vault selection") == 0) {
shouldChangeVault = 1;
} else if (strcmp(noteSelected, "Delete vault") == 0) {
@@ -731,6 +758,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;
+15 -51
View File
@@ -179,13 +179,7 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
error(fd == -1, "program", "mkstemp failed");
close(fd);
/*
* STEP 1:
* Build index once into temp file
* format: file:line:content
*/
snprintf(command, sizeof(command), "rg --line-number --no-heading --color=never . \"%s\" > %s", pathToFiles, indexFile);
debug("INDEX CMD: %s", command);
if (system(command) != 0) {
@@ -193,45 +187,6 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
error(1, "program", "rg indexing failed");
}
/*
* STEP 2:
* Use fzf on the index file (NO rg anymore)
*/
/*
EXPLANATION:
cat %s
→ feeds prebuilt index file (format: file:line:content) into fzf
fzf --delimiter ':'
→ splits each line into fields:
{1} = file path
{2} = line number
{3} = content
--prompt
→ UI prompt text shown in fzf
--preview
→ runs a shell command for selected item:
file={1} → current file
line={2} → line number of match
nl -ba "$file"
→ prints file with line numbers
sed -n "$((line-5)),$((line+5))p"
→ extracts a window of 5 lines above and below match
sed "... -> ..."
→ highlights the matched line (middle of window) with red arrow
--preview-window=right:60%:hidden
→ preview appears on right, 60% width, initially hidden
--bind 'change:show-preview'
→ preview only appears after first selection change (not at startup)
*/
snprintf(command, sizeof(command),
"cat %s | fzf --delimiter ':' --prompt='%s' "
"--preview 'file={1}; line={2}; nl -ba \"$file\" | sed -n \"$((line-5)),$((line+5))p\" | "
@@ -254,16 +209,25 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
buffer[strcspn(buffer, "\n")] = '\0';
result = strdup(buffer);
}
debug("Buffer: %s", buffer);
debug("result: %s", result);
// cut at first ':'
result = strtok(result, ":");
// cut at / (because we need the full paths before and we only need to return the journal entry)
char *token = strtok(result, "/");
result = NULL;
while (token != NULL) {
result = token;
token = strtok(NULL, "/"); // Passing NULL means “dont start a new string, resume
// we need to cut out the whole pathToFiles
int pathToFilesLen = strlen(pathToFiles);
int cutOut = 0;
for (int i = 0; i < pathToFilesLen; i++) {
if (pathToFiles[i] == result[i]) {
cutOut = i;
}
}
result += cutOut + 1; // the + 1 cuts the first /
// in case we select a journal, we won't open the entry just yet. We only need to return the journal name (everything before [now the first] /
result = strtok(result, "/");
debug("Cleaned note: %s", result);
// clean up
pclose(fzfPipe);
+9 -3
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) {
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]);
+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