mirror of
https://github.com/tomasriveral/NoteWrapper.git
synced 2026-08-12 10:20:46 +02:00
Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84d3c9bd85 | ||
|
|
6e6ddebb5e | ||
|
|
91d6db6c74 | ||
|
|
f85a32f97f | ||
|
|
bc306ca630 | ||
|
|
89c686652e | ||
|
|
8ee0096540 | ||
|
|
2d6787a91b | ||
|
|
2f688df3ec |
@@ -17,6 +17,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install GitHub CLI
|
||||
run: sudo apt-get update && sudo apt-get install -y gh
|
||||
|
||||
|
||||
- name: Configure git
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
@@ -26,7 +30,7 @@ jobs:
|
||||
|
||||
- name: Create release branch
|
||||
run: |
|
||||
git checkout -B release/${{ inputs.version }}
|
||||
git checkout -B release/v${{ inputs.version }}
|
||||
|
||||
- name: Set version in flake.nix
|
||||
run: |
|
||||
@@ -42,14 +46,14 @@ jobs:
|
||||
|
||||
- name: Push branch
|
||||
run: |
|
||||
git push origin release/${{ inputs.version }}
|
||||
git push origin release/v${{ 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 }}"
|
||||
--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 }}`"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# NoteWrapper
|
||||
|
||||
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 ;)
|
||||
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 ;)
|
||||
|
||||
[](https://deepwiki.com/tomasriveral/notewrapper)
|
||||
|
||||
@@ -57,26 +57,6 @@ You must also have a [supported editor (and their associated plugin if needed)](
|
||||
|
||||
## 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.
|
||||
2. Ensure you have a supported editor installed.
|
||||
3. Clone the repository:
|
||||
@@ -109,7 +89,7 @@ make
|
||||
|
||||
---
|
||||
|
||||
### Packaging
|
||||
## Packaging
|
||||
|
||||
There is currently no official package available for NoteWrapper.
|
||||
|
||||
|
||||
Generated
+1
-18
@@ -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,22 +4,23 @@
|
||||
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 = "v2.1";
|
||||
version = "2.1";
|
||||
|
||||
src = notewrapper;
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "tomasriveral";
|
||||
repo = "NoteWrapper";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-JoI38n5RZ/s0n+Vr9Bri2oiFeyj7Xrt1AmglmcuMpmQ=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = with pkgs; [
|
||||
pkg-config
|
||||
@@ -36,8 +37,12 @@
|
||||
gnused
|
||||
];
|
||||
|
||||
makeFlags = [
|
||||
"VERSION=2.0"
|
||||
];
|
||||
|
||||
buildPhase = ''
|
||||
make VERSION=${finalAttrs.version}
|
||||
make
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
|
||||
+9
-33
@@ -529,14 +529,9 @@ 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 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);
|
||||
debug("Handling backup");
|
||||
handleBackups(directoriesArray, numDirectories, backupDirectoriesArray, homedir, interval, (const char **)rsyncArgs, rsyncArgsNumber, shouldDebug);
|
||||
}
|
||||
|
||||
initscr(); // initialize ncurses
|
||||
@@ -577,26 +572,13 @@ backup_config_end:
|
||||
}
|
||||
altDebug("└ ------------------------------\n");
|
||||
}
|
||||
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
|
||||
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
|
||||
// adds "create a new vault" into the vaultsArray
|
||||
const int extraOptions = 3;
|
||||
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)";
|
||||
|
||||
vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select):", vaultsCount, extraOptions, " ", "Or select an option below", "", shouldDebug);
|
||||
|
||||
@@ -612,8 +594,7 @@ 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 && 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) {
|
||||
if (strcmp(vaultSelected, "Create a new vault") != 0 && strcmp(vaultSelected, "Settings") != 0 && strcmp(vaultSelected, "Quit (Ctrl+C)") != 0) {
|
||||
note_selection:
|
||||
bypassSelectionVault = 0; // we must reset bypassSelectionVault to not get stuck in a
|
||||
// infinite loop of bypassing
|
||||
@@ -750,11 +731,6 @@ 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;
|
||||
|
||||
@@ -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);
|
||||
snprintf(fileFullPath, PATH_MAX, "%s/%s/%s", dirToVault, vaultFromDir, fileName);
|
||||
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);
|
||||
// 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);
|
||||
FILE *filePointer;
|
||||
filePointer = fopen(fileFullPath, "w"); // creates and opens the file
|
||||
error(filePointer == NULL, "program", "The %s couldn't be created.", fileFullPath);
|
||||
|
||||
+3
-9
@@ -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,
|
||||
const int forceBackup, int *backupMessage, const int shouldDebug) {
|
||||
const int shouldDebug) {
|
||||
int shouldBackup = 0;
|
||||
|
||||
time_t now = time(NULL);
|
||||
debug("Time since epoch is %ld", (long)now);
|
||||
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);
|
||||
}
|
||||
double deltaTime = difftime(now, lastBackupTime);
|
||||
if (deltaTime > interval || forceBackup) {
|
||||
if (!forceBackup) {
|
||||
debug("(difftime) %f is greater than (interval) %d -> backuping...", deltaTime, interval);
|
||||
} else {
|
||||
debug("Backup was forced. backuping...");
|
||||
}
|
||||
if (deltaTime > interval) {
|
||||
debug("(difftime) %f is greater than (interval) %d -> backuping...", deltaTime, interval);
|
||||
shouldBackup = 1;
|
||||
cacheFile = fopen(cacheFilePATH, "w");
|
||||
if (!cacheFile) {
|
||||
@@ -223,7 +218,6 @@ 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]);
|
||||
|
||||
+2
-3
@@ -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.
|
||||
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.
|
||||
backupMessage will be set to 1 if a backup was launched.*/
|
||||
will be added in the function.*/
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user