mirror of
https://github.com/tomasriveral/NoteWrapper.git
synced 2026-10-10 08:55:22 +02:00
feat: show warning if git operation too slow
This commit is contained in:
1 parent
e78a9ca669
commit
0d5da72b13
3 files changed
+65
-2
No files matched your search
+3
-1
@@ -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).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+59
-1
@@ -71,6 +71,29 @@ 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 +136,21 @@ 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 +189,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 +204,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 +216,24 @@ 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 +250,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 +276,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 +294,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);
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in new issue
Block a user