Compare commits

..
Author SHA1 Message Date
tomasr 1506d43ffb Merge pull request #75 from tomasriveral/flake-update/2026-10-05 2026-10-05 17:47:16 +02:00
github-actions[bot] e1c63a1694 chore: weekly flake update 2026-10-05 10:17:06 +00:00
tomasr e01e580162 Merge pull request #74 from tomasriveral/flake-update/2026-09-28 2026-09-28 18:32:01 +02:00
github-actions[bot] b2d76adb88 chore: weekly flake update 2026-09-28 09:37:56 +00:00
tomasr 7403bed29c Merge pull request #73 from tomasriveral/flake-update/2026-09-21 2026-09-21 12:41:37 +02:00
github-actions[bot] 13bacbb6d6 chore: weekly flake update 2026-09-21 08:49:09 +00:00
tomasr 886eff21d3 Merge pull request #72 from tomasriveral/flake-update/2026-09-14 2026-09-14 12:38:03 +02:00
github-actions[bot] bcf30a4576 chore: weekly flake update 2026-09-14 08:47:43 +00:00
tomasr 72bf03bc9f Merge pull request #71 from tomasriveral/flake-update/2026-09-07 2026-09-07 12:00:23 +02:00
github-actions[bot] 7ca0bf1561 chore: weekly flake update 2026-09-07 08:10:41 +00:00
tomasr 94d659db2c Merge pull request #70 from tomasriveral/flake-update/2026-08-31 2026-08-31 16:40:06 +02:00
github-actions[bot] e01be6ecea chore: weekly flake update 2026-08-31 09:36:47 +00:00
tomasr 713fa27893 Merge pull request #69 from tomasriveral/flake-update/2026-08-24
[Automated] Weekly flake update 2026-08-24
2026-08-24 06:51:22 +02:00
github-actions[bot] dd7345c2fa chore: weekly flake update 2026-08-24 04:00:09 +00:00
tomasr dd58a86fce Merge (#68) from tomasriveral/fix-git-backup
feat: warning for slow git backups + docs: improved demo
2026-08-18 18:40:24 +02:00
tomasr 19610c1c51 fix: clang format 2026-08-18 18:37:15 +02:00
tomasr 39a3cb6bba docs: redone demo gif
It was first done on a WebDav mounted drive. That meant that read and
write operations were really slow.
2026-08-17 17:54:39 +02:00
tomasr 0d5da72b13 feat: show warning if git operation too slow 2026-08-17 17:43:00 +02:00
tomasr e78a9ca669 fix: git commit message being truncated 2026-08-17 17:16:06 +02:00
tomasr c83a504648 Merge pull request #67 from tomasriveral/flake-update/2026-08-17 2026-08-17 08:18:04 +02:00
6 changed files with 66 additions and 12 deletions

No files matched your search

+3 -1
View File
@@ -10,7 +10,7 @@ This project aims to remain minimal, terminal-focused, and easy to extend. Contr
Please use the standardized debugging and error-handling functions defined in [/src/utils.c](./src/utils.c): Please use the standardized debugging and error-handling functions defined in [/src/utils.c](./src/utils.c):
* `debug(...)` * `debug("message", ...)`
Used for formatted debugging output (printf-style formatting). Used for formatted debugging output (printf-style formatting).
* `altDebug(...)` * `altDebug(...)`
@@ -21,6 +21,8 @@ Please use the standardized debugging and error-handling functions defined in [/
* `"user"`: errors caused by user input or configuration * `"user"`: errors caused by user input or configuration
* `"program"`: internal or unexpected program errors * `"program"`: internal or unexpected program errors
* `warn(condition, "message", ...)`
Used for formatted warning (printf-style formatting).
--- ---
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

After

Width:  |  Height:  |  Size: 3.9 MiB

+4 -6
View File
@@ -36,8 +36,6 @@ Sleep 500ms
Down Down
Sleep 500ms Sleep 500ms
Down Down
Sleep 500ms
Down
Sleep 700ms Sleep 700ms
Enter Enter
@@ -109,12 +107,12 @@ Sleep 1500ms
Type "Don't worry: NoteWrapper also works with basic notes." Type "Don't worry: NoteWrapper also works with basic notes."
Sleep 800ms Sleep 800ms
Type "It distinguishes them using a regular expression, which defaults to `.*journal.*`." Type " It distinguishes them using a regular expression, which defaults to `.*journal.*`."
Sleep 800ms Sleep 800ms
Enter Enter
Sleep 700ms Sleep 700ms
Type "The unified or divided journal mode is chosen when you first create the journal." Type " The unified or divided journal mode is chosen when you first create the journal."
Sleep 1000ms Sleep 1000ms
Enter Enter
Sleep 1500ms Sleep 1500ms
@@ -126,7 +124,7 @@ Sleep 1500ms
Type "Let me show you one last cool feature." Type "Let me show you one last cool feature."
Sleep 1000ms Sleep 1000ms
Type "Have you ever forgotten when or where you wrote something?" Type " Have you ever forgotten when or where you wrote something?"
Sleep 1000ms Sleep 1000ms
Enter Enter
Sleep 800ms Sleep 800ms
@@ -172,7 +170,7 @@ Sleep 1500ms
# Show the search result / preview # Show the search result / preview
Up Up
Sleep 5000ms Sleep 2000ms
Enter Enter
Sleep 1000ms Sleep 1000ms
Generated
+3 -3
View File
@@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1786862985, "lastModified": 1791048980,
"narHash": "sha256-FBJRXmbGXiSUDvYEbfLYRkckayyZ6SK1UEqhCrIZ2Cs=", "narHash": "sha256-KgItSKML8Xvte0B7/uGnBDsYzSnnKHcOaiUbgWBXLXw=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "e5bdc4a41d4c072fe1e3787eaa0320a384741d44", "rev": "a7868a727837f3c09cee2ce0ca671c76b1589fed",
"type": "github" "type": "github"
}, },
"original": { "original": {
+53 -2
View File
@@ -71,6 +71,26 @@ void _error(const int shouldDebug, const int condition, const char *type, const
exit(1); exit(1);
} }
} }
void _warn(const int condition, const char *file, const int line, const char *function, const char *message, ...) { // use for warnings that should always be shown
if (condition) {
fflush(stdout);
fflush(stderr);
va_list args;
va_start(args, message);
int h, m, s;
getCurrentTime(&h, &m, &s);
fprintf(stdout, "\e[0;33m[WARNING -- %d:%d:%d] From file %s line %d function %s:\e[0m\n", h, m, s, file, line, function);
vfprintf(stdout, message, args);
fprintf(stdout, "\e[0m\n");
va_end(args);
}
}
static void copyDir(const char *source, const char *destination, const char **rsyncArgs, const int rsyncArgsNumber, const int shouldDebug) { static void copyDir(const char *source, const char *destination, const char **rsyncArgs, const int rsyncArgsNumber, const int shouldDebug) {
debug("Backuping... source: %s and destination: %s", source, destination); debug("Backuping... source: %s and destination: %s", source, destination);
@@ -113,6 +133,20 @@ static void ensureDir(const char *path, const int shouldDebug) {
} }
} }
static void slowGitWarning(struct timespec start, int *wasShown) {
if (!*wasShown) {
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
double elapsed = (double)(now.tv_sec - start.tv_sec) + (double)(now.tv_nsec - start.tv_nsec) / 1e9;
warn(elapsed > 0.3, "Git operations are taking too much time. You drive might be slow. Please do not stop the program.");
if (elapsed > 0.3) {
*wasShown = 1;
}
}
}
void ensureGitDirectory(const char *path, const char *vault, const char *signatureName, const char *signatureEmail, const int shouldDebug) { void ensureGitDirectory(const char *path, const char *vault, const char *signatureName, const char *signatureEmail, const int shouldDebug) {
git_repository *repo = NULL; git_repository *repo = NULL;
char *fullPath = malloc(PATH_MAX); char *fullPath = malloc(PATH_MAX);
@@ -151,6 +185,10 @@ void ensureGitDirectory(const char *path, const char *vault, const char *signatu
} }
void gitBackupUpdate(const char *path, const char *vault, const char *signatureName, const char *signatureEmail, const char *commitMsg, const int shouldDebug) { void gitBackupUpdate(const char *path, const char *vault, const char *signatureName, const char *signatureEmail, const char *commitMsg, const int shouldDebug) {
// on slow drive or WebDav mounted drive this git operations are pretty slow. We'll just show a warning to avoid the user closing the program.
struct timespec start;
clock_gettime(CLOCK_MONOTONIC, &start);
git_repository *repo = NULL; git_repository *repo = NULL;
git_index *index = NULL; git_index *index = NULL;
git_tree *tree = NULL; git_tree *tree = NULL;
@@ -162,6 +200,8 @@ void gitBackupUpdate(const char *path, const char *vault, const char *signatureN
git_oid tree_id; git_oid tree_id;
git_oid commit_id; git_oid commit_id;
int slowGitWarningAlreadyShown = 0;
char *fullPath = malloc(PATH_MAX); char *fullPath = malloc(PATH_MAX);
error(fullPath == NULL, "program", "Failed to allocate path"); error(fullPath == NULL, "program", "Failed to allocate path");
@@ -172,17 +212,21 @@ void gitBackupUpdate(const char *path, const char *vault, const char *signatureN
int return_code = git_repository_open(&repo, fullPath); int return_code = git_repository_open(&repo, fullPath);
error(return_code, "program", "Failed to open Git repository\n%s", git_error_last()->message); error(return_code, "program", "Failed to open Git repository\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
/* Get the index */ /* Get the index */
return_code = git_repository_index(&index, repo); return_code = git_repository_index(&index, repo);
error(return_code, "program", "Failed to get Git index\n%s", git_error_last()->message); error(return_code, "program", "Failed to get Git index\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
/* git add . */ /* git add . */
return_code = git_index_add_all(index, NULL, 0, NULL, NULL); return_code = git_index_add_all(index, NULL, 0, NULL, NULL);
error(return_code, "program", "Failed to add files\n%s", git_error_last()->message); error(return_code, "program", "Failed to add files\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
return_code = git_index_write(index); return_code = git_index_write(index);
error(return_code, "program", "Failed to write index\n%s", git_error_last()->message); error(return_code, "program", "Failed to write index\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
/* /*
* Check whether there are changes to commit. * Check whether there are changes to commit.
@@ -199,16 +243,19 @@ void gitBackupUpdate(const char *path, const char *vault, const char *signatureN
return_code = git_reference_name_to_id(&head_oid, repo, "HEAD"); return_code = git_reference_name_to_id(&head_oid, repo, "HEAD");
error(return_code, "program", "Failed to get HEAD\n%s", git_error_last()->message); error(return_code, "program", "Failed to get HEAD\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
return_code = git_commit_lookup(&head_commit, repo, &head_oid); return_code = git_commit_lookup(&head_commit, repo, &head_oid);
error(return_code, "program", "Failed to lookup HEAD commit\n%s", git_error_last()->message); error(return_code, "program", "Failed to lookup HEAD commit\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
return_code = git_commit_tree(&head_tree, head_commit); return_code = git_commit_tree(&head_tree, head_commit);
error(return_code, "program", "Failed to get HEAD tree\n%s", git_error_last()->message); error(return_code, "program", "Failed to get HEAD tree\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
return_code = git_diff_tree_to_index(&diff, repo, head_tree, index, NULL); return_code = git_diff_tree_to_index(&diff, repo, head_tree, index, NULL);
error(return_code, "program", "Failed to create diff\n%s", git_error_last()->message); error(return_code, "program", "Failed to create diff\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
has_changes = git_diff_num_deltas(diff) > 0; has_changes = git_diff_num_deltas(diff) > 0;
} }
@@ -222,13 +269,16 @@ void gitBackupUpdate(const char *path, const char *vault, const char *signatureN
/* index → tree */ /* index → tree */
return_code = git_index_write_tree(&tree_id, index); return_code = git_index_write_tree(&tree_id, index);
error(return_code, "program", "Failed to write tree\n%s", git_error_last()->message); error(return_code, "program", "Failed to write tree\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
return_code = git_tree_lookup(&tree, repo, &tree_id); return_code = git_tree_lookup(&tree, repo, &tree_id);
error(return_code, "program", "Failed to lookup tree\n%s", git_error_last()->message); error(return_code, "program", "Failed to lookup tree\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
/* Author/committer */ /* Author/committer */
return_code = git_signature_now(&signature, signatureName, signatureEmail); return_code = git_signature_now(&signature, signatureName, signatureEmail);
error(return_code, "program", "Failed to create signature\n%s", git_error_last()->message); error(return_code, "program", "Failed to create signature\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
/* Create commit */ /* Create commit */
if (git_repository_head_unborn(repo)) { if (git_repository_head_unborn(repo)) {
@@ -237,6 +287,7 @@ void gitBackupUpdate(const char *path, const char *vault, const char *signatureN
return_code = git_commit_create_v(&commit_id, repo, "HEAD", signature, signature, NULL, commitMsg, tree, 1, head_commit); return_code = git_commit_create_v(&commit_id, repo, "HEAD", signature, signature, NULL, commitMsg, tree, 1, head_commit);
} }
error(return_code, "program", "Failed to create commit\n%s", git_error_last()->message); error(return_code, "program", "Failed to create commit\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);
debug("Created commit %s in %s", commitMsg, fullPath); debug("Created commit %s in %s", commitMsg, fullPath);
@@ -315,7 +366,7 @@ char *getDateAndTime() {
struct tm tm_now; struct tm tm_now;
localtime_r(&now, &tm_now); localtime_r(&now, &tm_now);
strftime(return_value, sizeof(return_value), "%Y-%m-%%d %H:%M:%%S", &tm_now); strftime(return_value, 20, "%Y-%m-%d %H:%M:%S", &tm_now);
return return_value; return return_value;
} }
+3
View File
@@ -31,6 +31,7 @@
#define debug(message, ...) _debug(shouldDebug, __FILE__, __LINE__, __func__, message, ##__VA_ARGS__) #define debug(message, ...) _debug(shouldDebug, __FILE__, __LINE__, __func__, message, ##__VA_ARGS__)
#define altDebug(message, ...) _altDebug(shouldDebug, message, ##__VA_ARGS__) #define altDebug(message, ...) _altDebug(shouldDebug, message, ##__VA_ARGS__)
#define error(condition, type, message, ...) _error(shouldDebug, condition, type, __FILE__, __LINE__, __func__, message, ##__VA_ARGS__) #define error(condition, type, message, ...) _error(shouldDebug, condition, type, __FILE__, __LINE__, __func__, message, ##__VA_ARGS__)
#define warn(condition, message, ...) _warn(condition, __FILE__, __LINE__, __func__, message, ##__VA_ARGS__)
// you must edit this two values if you want to add suport for an editor // you must edit this two values if you want to add suport for an editor
extern const char *supportedEditor[]; // array of supported editors extern const char *supportedEditor[]; // array of supported editors
extern const int numEditors; // number of supported editors extern const int numEditors; // number of supported editors
@@ -53,6 +54,8 @@ void _debug(const int d, const char *file, const int line, const char *function,
void _altDebug(const int d, const char *message, ...); void _altDebug(const int d, const char *message, ...);
// formated error. // formated error.
void _error(const int shouldDebug, const int condition, const char *type, const char *file, const int line, const char *function, const char *message, ...); void _error(const int shouldDebug, const int condition, const char *type, const char *file, const int line, const char *function, const char *message, ...);
// formated warn
void _warn(const int condition, const char *file, const int line, const char *function, const char *message, ...);
// Returns 1 if the string is in the array. // Returns 1 if the string is in the array.
// Returns 0 if the string is not in the array. // Returns 0 if the string is not in the array.
// If you want to only check the first n elements of the array, pass n as len. // If you want to only check the first n elements of the array, pass n as len.