Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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):

* `debug(...)`
* `debug("message", ...)`
Used for formatted debugging output (printf-style formatting).

* `altDebug(...)`
Expand All @@ -21,6 +21,8 @@ Please use the standardized debugging and error-handling functions defined in [/

* `"user"`: errors caused by user input or configuration
* `"program"`: internal or unexpected program errors
* `warn(condition, "message", ...)`
Used for formatted warning (printf-style formatting).

---

Expand Down
Binary file modified demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 4 additions & 6 deletions demo.tape
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ Sleep 500ms
Down
Sleep 500ms
Down
Sleep 500ms
Down
Sleep 700ms

Enter
Expand Down Expand Up @@ -109,12 +107,12 @@ Sleep 1500ms
Type "Don't worry: NoteWrapper also works with basic notes."
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
Enter
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
Enter
Sleep 1500ms
Expand All @@ -126,7 +124,7 @@ Sleep 1500ms
Type "Let me show you one last cool feature."
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
Enter
Sleep 800ms
Expand Down Expand Up @@ -172,7 +170,7 @@ Sleep 1500ms

# Show the search result / preview
Up
Sleep 5000ms
Sleep 2000ms
Enter
Sleep 1000ms

Expand Down
55 changes: 53 additions & 2 deletions src/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,26 @@ void _error(const int shouldDebug, const int condition, const char *type, const
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) {
debug("Backuping... source: %s and destination: %s", source, destination);
Expand Down Expand Up @@ -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) {
git_repository *repo = NULL;
char *fullPath = malloc(PATH_MAX);
Expand Down Expand Up @@ -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) {
// 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_index *index = NULL;
git_tree *tree = NULL;
Expand All @@ -162,6 +200,8 @@ void gitBackupUpdate(const char *path, const char *vault, const char *signatureN
git_oid tree_id;
git_oid commit_id;

int slowGitWarningAlreadyShown = 0;

char *fullPath = malloc(PATH_MAX);

error(fullPath == NULL, "program", "Failed to allocate path");
Expand All @@ -172,17 +212,21 @@ void gitBackupUpdate(const char *path, const char *vault, const char *signatureN
int return_code = git_repository_open(&repo, fullPath);

error(return_code, "program", "Failed to open Git repository\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);

/* Get the index */
return_code = git_repository_index(&index, repo);
error(return_code, "program", "Failed to get Git index\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);

/* git add . */
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);
slowGitWarning(start, &slowGitWarningAlreadyShown);

return_code = git_index_write(index);
error(return_code, "program", "Failed to write index\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);

/*
* Check whether there are changes to commit.
Expand All @@ -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");
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);
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);
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);

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;
}
Expand All @@ -222,13 +269,16 @@ void gitBackupUpdate(const char *path, const char *vault, const char *signatureN
/* index → tree */
return_code = git_index_write_tree(&tree_id, index);
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);
error(return_code, "program", "Failed to lookup tree\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);

/* Author/committer */
return_code = git_signature_now(&signature, signatureName, signatureEmail);
error(return_code, "program", "Failed to create signature\n%s", git_error_last()->message);
slowGitWarning(start, &slowGitWarningAlreadyShown);

/* Create commit */
if (git_repository_head_unborn(repo)) {
Expand All @@ -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);
}
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);

Expand Down Expand Up @@ -315,7 +366,7 @@ char *getDateAndTime() {
struct tm 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;
}

Expand Down
3 changes: 3 additions & 0 deletions src/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#define debug(message, ...) _debug(shouldDebug, __FILE__, __LINE__, __func__, 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 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
extern const char *supportedEditor[]; // array of supported editors
extern const int numEditors; // number of supported editors
Expand All @@ -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, ...);
// 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, ...);
// 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 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.
Expand Down
Loading