Compare commits

..
Author SHA1 Message Date
github-actions[bot] 84d3c9bd85 chore(release): 2.1 2026-05-25 14:57:19 +00:00
10 changed files with 119 additions and 208 deletions
+9 -5
View File
@@ -17,6 +17,10 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Install GitHub CLI
run: sudo apt-get update && sudo apt-get install -y gh
- name: Configure git - name: Configure git
run: | run: |
git config user.name "github-actions[bot]" git config user.name "github-actions[bot]"
@@ -26,7 +30,7 @@ jobs:
- name: Create release branch - name: Create release branch
run: | run: |
git checkout -B release/${{ inputs.version }} git checkout -B release/v${{ inputs.version }}
- name: Set version in flake.nix - name: Set version in flake.nix
run: | run: |
@@ -42,14 +46,14 @@ jobs:
- name: Push branch - name: Push branch
run: | run: |
git push origin release/${{ inputs.version }} git push origin release/v${{ inputs.version }}
- name: Create Pull Request - name: Create Pull Request
run: | run: |
gh pr create \ gh pr create \
--base main \ --base main \
--head release/${{ inputs.version }} \ --head release/v${{ inputs.version }} \
--title "[Automatic] Release PR ${{ inputs.version }}" \ --title "[Automatic] Release v${{ inputs.version }}" \
--body "Automated release PR.\nAfter the test's succesfull run, create manually a release with a new tag matching ${{ inputs.version }}" --body "Automated release PR.\nAfter the test's succesfull run, create manually a release with a new tag matching `${{ inputs.version }}`"
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+1 -21
View File
@@ -57,26 +57,6 @@ You must also have a [supported editor (and their associated plugin if needed)](
## How to install ## How to install
### Nix flakes
Add this to your inputs in flake.nix:
```nix
notewrapper = {
url = "github:tomasriveral/notewrapper";
};
```
If your flake already inputs nixpkgs and/or flake-utils, you can follow it:
```nix
notewrapper = {
url = "github:tomasriveral/notewrapper;
inputs.nixpkgs.follow = "nixpkgs";
inputs.flake-utils.follow = "flake-utils";
};
```
### Building from source
1. Install all required dependencies listed above. 1. Install all required dependencies listed above.
2. Ensure you have a supported editor installed. 2. Ensure you have a supported editor installed.
3. Clone the repository: 3. Clone the repository:
@@ -109,7 +89,7 @@ make
--- ---
### Packaging ## Packaging
There is currently no official package available for NoteWrapper. There is currently no official package available for NoteWrapper.
Generated
+3 -3
View File
@@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1779560665, "lastModified": 1779508470,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", "narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", "rev": "29916453413845e54a65b8a1cf996842300cd299",
"type": "github" "type": "github"
}, },
"original": { "original": {
+12 -3
View File
@@ -13,9 +13,14 @@
in { in {
packages.default = pkgs.stdenv.mkDerivation (finalAttrs: { packages.default = pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "notewrapper"; pname = "notewrapper";
version = "v2.2.1"; version = "2.1";
src = ./.; src = pkgs.fetchFromGitHub {
owner = "tomasriveral";
repo = "NoteWrapper";
tag = "v${finalAttrs.version}";
hash = "sha256-JoI38n5RZ/s0n+Vr9Bri2oiFeyj7Xrt1AmglmcuMpmQ=";
};
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [
pkg-config pkg-config
@@ -32,8 +37,12 @@
gnused gnused
]; ];
makeFlags = [
"VERSION=2.0"
];
buildPhase = '' buildPhase = ''
make VERSION=${finalAttrs.version} make
''; '';
installPhase = '' installPhase = ''
+19 -61
View File
@@ -529,14 +529,9 @@ backup_config_end:
shouldDebug); // check if editor is supported and if it is installed. If not, it shouldDebug); // check if editor is supported and if it is installed. If not, it
// will throw an error. // 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) { if (doesBackup) {
debug("Handling normal backup"); debug("Handling backup");
forceBackup = 0; handleBackups(directoriesArray, numDirectories, backupDirectoriesArray, homedir, interval, (const char **)rsyncArgs, rsyncArgsNumber, shouldDebug);
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 initscr(); // initialize ncurses
@@ -577,29 +572,15 @@ backup_config_end:
} }
altDebug("└ ------------------------------\n"); altDebug("└ ------------------------------\n");
} }
int extraOptions = 3;
if (doesBackup) { // adds "create a new vault" into the vaultsArray
extraOptions++; // space for "Backup now" button const int extraOptions = 3;
}
if (*backupMessage) {
extraOptions++;
}
vaultsArray = realloc(vaultsArray, (vaultsCount + extraOptions) * sizeof(char *)); // resize vaultsArray to fit the extra options vaultsArray = realloc(vaultsArray, (vaultsCount + extraOptions) * sizeof(char *)); // resize vaultsArray to fit the extra options
int index = 0; vaultsArray[vaultsCount] = "Create a new vault"; // some more options that are not vaults
vaultsArray[vaultsCount + index++] = "Create a new vault"; // some more options that are not vaults vaultsArray[vaultsCount + 1] = "Settings";
vaultsArray[vaultsCount + index++] = "Settings"; vaultsArray[vaultsCount + 2] = "Quit (Ctrl+C)";
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);
vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select or use 1-9 to quick select or use 1-9 to quick select):", vaultsCount, extraOptions, " ",
"Or select an option below", "", shouldDebug);
// now that we won't use vaultsArray in this iteration of the loop, we should free it and // now that we won't use vaultsArray in this iteration of the loop, we should free it and
// all its elements. (As this is memory in the heap and not the stack and thus is our // all its elements. (As this is memory in the heap and not the stack and thus is our
@@ -613,8 +594,7 @@ backup_config_end:
} }
debug("Selected vault: %s", vaultSelected); debug("Selected vault: %s", vaultSelected);
if (strcmp(vaultSelected, "Create a new vault") != 0 && strcmp(vaultSelected, "Settings") != 0 && strcmp(vaultSelected, "Quit (Ctrl+C)") != 0 && strcmp(vaultSelected, "Backup now") != 0 && if (strcmp(vaultSelected, "Create a new vault") != 0 && strcmp(vaultSelected, "Settings") != 0 && strcmp(vaultSelected, "Quit (Ctrl+C)") != 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: note_selection:
bypassSelectionVault = 0; // we must reset bypassSelectionVault to not get stuck in a bypassSelectionVault = 0; // we must reset bypassSelectionVault to not get stuck in a
// infinite loop of bypassing // infinite loop of bypassing
@@ -645,13 +625,12 @@ backup_config_end:
altDebug("└------------------------------\n"); altDebug("└------------------------------\n");
} }
// adds options // adds options
int extraNotesOptions = 5; int extraNotesOptions = 4;
filesArray = realloc(filesArray, (filesCount + extraNotesOptions) * sizeof(char *)); // resize filesArray to fit the extra options filesArray = realloc(filesArray, (filesCount + extraNotesOptions) * sizeof(char *)); // resize filesArray to fit the extra options
filesArray[filesCount] = "Create new note"; filesArray[filesCount] = "Create new note";
filesArray[filesCount + 1] = "Search inside the vault"; filesArray[filesCount + 1] = "Back to vault selection";
filesArray[filesCount + 2] = "Back to vault selection"; filesArray[filesCount + 2] = "Delete vault";
filesArray[filesCount + 3] = "Delete vault"; filesArray[filesCount + 3] = "Quit (Ctrl+C)";
filesArray[filesCount + 4] = "Quit (Ctrl+C)";
char *noteSelected; char *noteSelected;
// if we set to bypass the note selector // if we set to bypass the note selector
if (bypassSelectionNote) { if (bypassSelectionNote) {
@@ -667,9 +646,8 @@ backup_config_end:
goto note_creation; goto note_creation;
} }
} }
char vaultMessage[PATH_MAX]; noteSelected =
snprintf(vaultMessage, PATH_MAX, "%s: Select note or journal to open (Use arrows or WASD, Enter to select or use 1-9 to quick select):", vaultSelected); ncursesSelect(filesArray, "Select note or journal to open (Use arrows or WASD, Enter to select):", filesCount, extraNotesOptions, " ", "Or select an option below", "", shouldDebug);
noteSelected = ncursesSelect(filesArray, vaultMessage, filesCount, extraNotesOptions, " ", "Or select an option below", "", shouldDebug);
// now that we won't use filesArray in this iteration of the loop, we should free it // now that we won't use filesArray in this iteration of the loop, we should free it
// and all its elements. (As this is memory in the heap and not the stack and thus // and all its elements. (As this is memory in the heap and not the stack and thus
// is our responsability to manage) // is our responsability to manage)
@@ -683,7 +661,7 @@ backup_config_end:
free(filesArray); free(filesArray);
debug("Selected note: %s", noteSelected); debug("Selected note: %s", noteSelected);
if (strcmp(noteSelected, "Create new note") != 0 && strcmp(noteSelected, "Back to vault selection") != 0 && strcmp(noteSelected, "Delete vault") != 0 && 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, "Search inside the vault") != 0) { strcmp(noteSelected, "Quit (Ctrl+C)") != 0) {
open_note: open_note:
bypassSelectionNote = 0; // we must reset bypassSelectionNote to avoid getting into an infinite bypassSelectionNote = 0; // we must reset bypassSelectionNote to avoid getting into an infinite
// loop of bypassing the note selection // loop of bypassing the note selection
@@ -697,18 +675,12 @@ backup_config_end:
int *journalWasUpdated = malloc(sizeof(int)); int *journalWasUpdated = malloc(sizeof(int));
*journalWasUpdated = 0; *journalWasUpdated = 0;
// used to go back to note selection
int *returnNoteSelection = malloc(sizeof(int));
*returnNoteSelection = 0;
if (!regexReturn) { // if the regex matches -> it's a journal if (!regexReturn) { // if the regex matches -> it's a journal
debug("%s is a journal. Updating it...", noteSelected); debug("%s is a journal. Updating it...", noteSelected);
fullPath = updateJournal(fullPath, noteSelected, timeFormat, journalWasUpdated, returnNoteSelection, fullPath = updateJournal(fullPath, noteSelected, timeFormat, journalWasUpdated,
shouldDebug); // we return the path. As if it is a divided journal we shouldDebug); // we return the path. As if it is a divided journal we
// must point to the correct entry // must point to the correct entry
} }
if (!*returnNoteSelection) { // if we don't need to return to the note selection
if (newLineOnOpening) { if (newLineOnOpening) {
if (*journalWasUpdated) { if (*journalWasUpdated) {
appendToFile(fullPath, "\n", appendToFile(fullPath, "\n",
@@ -721,20 +693,11 @@ backup_config_end:
} }
openEditor(fullPath, editorToOpen, shouldRender, shouldJumpToEnd, shouldDebug); openEditor(fullPath, editorToOpen, shouldRender, shouldJumpToEnd, shouldDebug);
free(fullPath); free(fullPath);
}
free(returnNoteSelection);
} else if (strcmp(noteSelected, "Create new note") == 0) { } else if (strcmp(noteSelected, "Create new note") == 0) {
note_creation: note_creation:
noteSelected = createNewNote(notesDirectoryString, vaultSelected, bypassSelectionNote, bypassSelectionNoteValue, journalRegex, shouldDebug); noteSelected = createNewNote(notesDirectoryString, vaultSelected, bypassSelectionNote, bypassSelectionNoteValue, journalRegex, shouldDebug);
// we can just go back to open_note // we can just go back to open_note
goto 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) { } else if (strcmp(noteSelected, "Back to vault selection") == 0) {
shouldChangeVault = 1; shouldChangeVault = 1;
} else if (strcmp(noteSelected, "Delete vault") == 0) { } else if (strcmp(noteSelected, "Delete vault") == 0) {
@@ -743,7 +706,7 @@ backup_config_end:
const char *yesNo[] = {"No, go back to note selection.", "Yes."}; const char *yesNo[] = {"No, go back to note selection.", "Yes."};
char *answer = ncursesSelect((char **)yesNo, char *answer = ncursesSelect((char **)yesNo,
"Are you sure you want to delete the entire vault? This can " "Are you sure you want to delete the entire vault? This can "
"not be undone (Use arrows or WASD, Enter to select or use 1-9 to quick select):", "not be undone (Use arrows or WASD, Enter to select):",
1, 1, " ", "", "", shouldDebug); 1, 1, " ", "", "", shouldDebug);
debug("You answered: %s for deleting the vault %s", answer, vaultSelected); debug("You answered: %s for deleting the vault %s", answer, vaultSelected);
if (strcmp(answer, "Yes.") == 0) { if (strcmp(answer, "Yes.") == 0) {
@@ -768,11 +731,6 @@ backup_config_end:
} else if (strcmp(vaultSelected, "Settings") == 0) { } else if (strcmp(vaultSelected, "Settings") == 0) {
openEditor(configPath, editorToOpen, 0, 0, openEditor(configPath, editorToOpen, 0, 0,
shouldDebug); // as this is not a md file we set render and jumptoEnfOfFile to 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) { } else if (strcmp(vaultSelected, "Quit (Ctrl+C)") == 0) {
debug("The program was exited"); debug("The program was exited");
shouldExit = 1; shouldExit = 1;
+3 -7
View File
@@ -188,7 +188,7 @@ char **getVaultsFromDirectories(char **directoryStringArray, int directoryNumber
return vaultsArray; return vaultsArray;
} }
char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int *returnNoteSelection, int shouldDebug) { char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int shouldDebug) {
path[PATH_MAX] = '\0'; // it assures it is a string (Most cases this does nothing). But rewriting at least path[PATH_MAX] = '\0'; // it assures it is a string (Most cases this does nothing). But rewriting at least
// one bytes make the compile happy. He doesn't want to return an unchanged input. // one bytes make the compile happy. He doesn't want to return an unchanged input.
debug("Handling the journal %s", path); debug("Handling the journal %s", path);
@@ -221,14 +221,13 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas
that the Create new entry in journal is on top entryArray = realloc(entryArray, that the Create new entry in journal is on top entryArray = realloc(entryArray,
sizeof(char*));*/ sizeof(char*));*/
// simpler to just malloc 2 and later realloc // simpler to just malloc 2 and later realloc
const int extraOptions = 4; const int extraOptions = 3;
char **entryArray = malloc(extraOptions * sizeof(char *)); char **entryArray = malloc(extraOptions * sizeof(char *));
char *createEntryMessage = malloc(PATH_MAX); char *createEntryMessage = malloc(PATH_MAX);
snprintf(createEntryMessage, PATH_MAX, "Create new entry for the journal %s", journal); snprintf(createEntryMessage, PATH_MAX, "Create new entry for the journal %s", journal);
entryArray[0] = createEntryMessage; entryArray[0] = createEntryMessage;
entryArray[1] = "Open random entry"; entryArray[1] = "Open random entry";
entryArray[2] = "Search inside entries"; entryArray[2] = "Search inside entries";
entryArray[3] = "Return to the note selection";
int entryCount = extraOptions; // we need to count how many dirs there is to always readjust int entryCount = extraOptions; // we need to count how many dirs there is to always readjust
// how many memory we alloc // how many memory we alloc
// Refer https://pubs.opengroup.org/onlinepubs/7990989775/xsh/readdir.html // Refer https://pubs.opengroup.org/onlinepubs/7990989775/xsh/readdir.html
@@ -260,8 +259,7 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas
// element // element
// we must now select to create new entry or to enter in old one // we must now select to create new entry or to enter in old one
char *selectedOption = char *selectedOption = ncursesSelect(entryArray, "Create new entry or acces old entry (Use arrows or WASD, Enter to select):", extraOptions, entryCount - extraOptions, " ", " ", "",
ncursesSelect(entryArray, "Create new entry or acces old entry (Use arrows or WASD, Enter to select or use 1-9 to quick select):", extraOptions, entryCount - extraOptions, " ", " ", "",
shouldDebug); // the "Create new entry for the journal %s" will be the only options. All shouldDebug); // the "Create new entry for the journal %s" will be the only options. All
// other will be extraOptions. This is made so that "Create [...] %s" will // other will be extraOptions. This is made so that "Create [...] %s" will
// always be on top // always be on top
@@ -303,8 +301,6 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas
snprintf(selectedOption, PATH_MAX, "%s/%s", path, temp); snprintf(selectedOption, PATH_MAX, "%s/%s", path, temp);
path = strdup(selectedOption); path = strdup(selectedOption);
free(selectedOption); free(selectedOption);
} else if (strcmp(selectedOption, "Return to the note selection") == 0) {
*returnNoteSelection = 1;
} else { // we just recreate the path to the selected entry } else { // we just recreate the path to the selected entry
// snprintf does not like to have the same variable as input and output so we use a // snprintf does not like to have the same variable as input and output so we use a
// buffer // buffer
+1 -2
View File
@@ -25,7 +25,6 @@ char **getVaultsFromDirectories(char **directoryStringArray, int directoryNumber
// handles both type of journal (divided and unified). // handles both type of journal (divided and unified).
// creates new entry with date. // creates new entry with date.
// for divided select if we want to acces to a new entry or a old one. // for divided select if we want to acces to a new entry or a old one.
// returnNoteSelection tells us if the user wants to go back to the note selection.
// returns the path to the file that needs to be opened. // returns the path to the file that needs to be opened.
char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int *returnNoteSelection, int shouldDebug); char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int shouldDebug);
#endif #endif
+52 -80
View File
@@ -6,8 +6,7 @@ void createNewVault(char **directoriesArray, int directoryCount, char **vaultsAr
int emptyWarning = 0; // set to 1 later if inpted empty name int emptyWarning = 0; // set to 1 later if inpted empty name
input_screen: input_screen:
// choose in which directory the vault will be created // choose in which directory the vault will be created
char *dirToVault = char *dirToVault = ncursesSelect(directoriesArray, "Select a directory, in which the vault will remain (Use arrows or WASD, Enter to select)", directoryCount, 0, "", "", " ", shouldDebug);
ncursesSelect(directoriesArray, "Select a directory, in which the vault will remain (Use arrows or WASD, Enter to select or use 1-9 to quick select)", directoryCount, 0, "", "", " ", shouldDebug);
char *vaultName = malloc(PATH_MAX); char *vaultName = malloc(PATH_MAX);
if (!bypass) { // if won't bypass (if -v or --vault weren't set) if (!bypass) { // if won't bypass (if -v or --vault weren't set)
echo(); echo();
@@ -180,7 +179,13 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
error(fd == -1, "program", "mkstemp failed"); error(fd == -1, "program", "mkstemp failed");
close(fd); 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); snprintf(command, sizeof(command), "rg --line-number --no-heading --color=never . \"%s\" > %s", pathToFiles, indexFile);
debug("INDEX CMD: %s", command); debug("INDEX CMD: %s", command);
if (system(command) != 0) { if (system(command) != 0) {
@@ -188,6 +193,45 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
error(1, "program", "rg indexing failed"); 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), snprintf(command, sizeof(command),
"cat %s | fzf --delimiter ':' --prompt='%s' " "cat %s | fzf --delimiter ':' --prompt='%s' "
"--preview 'file={1}; line={2}; nl -ba \"$file\" | sed -n \"$((line-5)),$((line+5))p\" | " "--preview 'file={1}; line={2}; nl -ba \"$file\" | sed -n \"$((line-5)),$((line+5))p\" | "
@@ -210,25 +254,16 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
buffer[strcspn(buffer, "\n")] = '\0'; buffer[strcspn(buffer, "\n")] = '\0';
result = strdup(buffer); result = strdup(buffer);
} }
debug("Buffer: %s", buffer);
debug("result: %s", result);
// cut at first ':' // cut at first ':'
result = strtok(result, ":"); result = strtok(result, ":");
// we need to cut out the whole pathToFiles // cut at / (because we need the full paths before and we only need to return the journal entry)
int pathToFilesLen = strlen(pathToFiles); char *token = strtok(result, "/");
int cutOut = 0; result = NULL;
for (int i = 0; i < pathToFilesLen; i++) { while (token != NULL) {
if (pathToFiles[i] == result[i]) { result = token;
cutOut = i; token = strtok(NULL, "/"); // Passing NULL means “dont start a new string, resume
} }
}
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 // clean up
pclose(fzfPipe); pclose(fzfPipe);
@@ -310,69 +345,6 @@ char *ncursesSelect(char **options, char *optionsText, int optionsNumber, int ex
highlight = 0; highlight = 0;
} }
break; break;
case '1':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 1.");
highlight = 0;
goto end_loop;
}
break;
case '2':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 2.");
highlight = 1;
goto end_loop;
}
break;
case '3':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 3.");
highlight = 2;
goto end_loop;
}
break;
case '4':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 4.");
highlight = 3;
goto end_loop;
}
break;
case '5':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 5.");
highlight = 4;
goto end_loop;
}
break;
case '6':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 6.");
highlight = 5;
goto end_loop;
}
break;
case '7':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 7.");
highlight = 6;
goto end_loop;
}
break;
case '8':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 8.");
highlight = 7;
goto end_loop;
}
break;
case '9':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 9.");
highlight = 8;
goto end_loop;
}
break;
case 10: //\n case 10: //\n
goto end_loop; goto end_loop;
} }
+2 -8
View File
@@ -167,9 +167,8 @@ 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, void handleBackups(char **sourceDirectoryArray, const int sourceNumber, char **destinationDirectoryArray, const char *homeDir, const int interval, const char **rsyncArguments, const int rsyncArgumentsNumber,
const int forceBackup, int *backupMessage, const int shouldDebug) { const int shouldDebug) {
int shouldBackup = 0; int shouldBackup = 0;
time_t now = time(NULL); time_t now = time(NULL);
debug("Time since epoch is %ld", (long)now); debug("Time since epoch is %ld", (long)now);
char cacheFilePATH[PATH_MAX]; char cacheFilePATH[PATH_MAX];
@@ -204,12 +203,8 @@ void handleBackups(char **sourceDirectoryArray, const int sourceNumber, char **d
error(1, "program", "Invalid timestamp in cache file: %s", line); error(1, "program", "Invalid timestamp in cache file: %s", line);
} }
double deltaTime = difftime(now, lastBackupTime); double deltaTime = difftime(now, lastBackupTime);
if (deltaTime > interval || forceBackup) { if (deltaTime > interval) {
if (!forceBackup) {
debug("(difftime) %f is greater than (interval) %d -> backuping...", deltaTime, interval); debug("(difftime) %f is greater than (interval) %d -> backuping...", deltaTime, interval);
} else {
debug("Backup was forced. backuping...");
}
shouldBackup = 1; shouldBackup = 1;
cacheFile = fopen(cacheFilePATH, "w"); cacheFile = fopen(cacheFilePATH, "w");
if (!cacheFile) { if (!cacheFile) {
@@ -223,7 +218,6 @@ void handleBackups(char **sourceDirectoryArray, const int sourceNumber, char **d
} }
if (shouldBackup) { if (shouldBackup) {
*backupMessage = 1;
debug("A backup is needed"); debug("A backup is needed");
for (int i = 0; i < sourceNumber; i++) { for (int i = 0; i < sourceNumber; i++) {
debug("%s", destinationDirectoryArray[i]); debug("%s", destinationDirectoryArray[i]);
+2 -3
View File
@@ -81,8 +81,7 @@ If need launches in the background rsync to do the backuping.
Each pair of source/destination will launch one rsync process. 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. 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 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, void handleBackups(char **sourceDirectoryArray, const int sourceDirectoryNumber, char **destinationDirectoryArray, const char *homeDir, const int interval, const char **rsyncArgs, const int rsyncArgsNumber,
const int forceBackup, int *backupMessage, const int shouldDebug); const int shouldDebug);
#endif #endif