sort journal files in descending order

This commit is contained in:
Florian Stinglmayr 2025-04-29 13:07:47 +02:00
parent d091272cea
commit 8047d4c75a
7 changed files with 86 additions and 3 deletions

View File

@ -54,7 +54,8 @@ gboolean ed_journal_file_has_entries_in_range(EDJournalFile *self,
GDateTime *start, GDateTime *start,
GDateTime *end); GDateTime *end);
gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs); gint ed_journal_file_compare_asc(EDJournalFile *lhs, EDJournalFile *rhs);
gint ed_journal_file_compare_desc(EDJournalFile *lhs, EDJournalFile *rhs);
G_END_DECLS G_END_DECLS

View File

@ -15,9 +15,17 @@ G_DECLARE_FINAL_TYPE(
EDJournal *ed_journal_new(void); EDJournal *ed_journal_new(void);
EDJournal *ed_journal_new_with_location(gchar const *dir);
gchar const *ed_journal_get_location(EDJournal *j); gchar const *ed_journal_get_location(EDJournal *j);
EDErrorCode ed_journal_set_location(EDJournal *j, gchar const *dir); EDErrorCode ed_journal_set_location(EDJournal *j, gchar const *dir);
/**
* Get a list of files. Files are sorted in descending order, with
* newer files first in the list.
*/
GList *ed_journal_get_files(EDJournal *self);
G_END_DECLS G_END_DECLS
#endif #endif

View File

@ -591,7 +591,7 @@ EDJournalEntry *ed_journal_file_get_last(EDJournalFile *self)
return p->last; return p->last;
} }
gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs) gint ed_journal_file_compare_asc(EDJournalFile *lhs, EDJournalFile *rhs)
{ {
return_if_true(lhs == NULL || rhs == NULL, 0); return_if_true(lhs == NULL || rhs == NULL, 0);
@ -602,6 +602,17 @@ gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs)
return g_date_time_compare(ldate, rdate); return g_date_time_compare(ldate, rdate);
} }
gint ed_journal_file_compare_desc(EDJournalFile *lhs, EDJournalFile *rhs)
{
return_if_true(lhs == NULL || rhs == NULL, 0);
GDateTime *ldate = ed_journal_file_get_datetime(lhs);
GDateTime *rdate = ed_journal_file_get_datetime(rhs);
return_if_true(ldate == NULL || rdate == NULL, 0);
return g_date_time_compare(rdate, ldate);
}
gboolean ed_journal_file_has_entries_in_range(EDJournalFile *self, gboolean ed_journal_file_has_entries_in_range(EDJournalFile *self,
GDateTime *start, GDateTime *start,
GDateTime *end) GDateTime *end)

View File

@ -90,6 +90,23 @@ EDJournal *ed_journal_new(void)
return g_object_new(ED_TYPE_JOURNAL, NULL); return g_object_new(ED_TYPE_JOURNAL, NULL);
} }
EDJournal *ed_journal_new_with_location(gchar const *dir)
{
EDJournal *j = NULL;
EDErrorCode ret = ed_error_success;
j = ed_journal_new();
return_if_true(j == NULL, NULL);
ret = ed_journal_set_location(j, dir);
if (ED_ERROR(ret)) {
g_clear_object(&j);
return NULL;
}
return j;
}
static void ed_journal_load_files(EDJournal *self) static void ed_journal_load_files(EDJournal *self)
{ {
EDJournalPrivate *p = ed_journal_get_instance_private(self); EDJournalPrivate *p = ed_journal_get_instance_private(self);
@ -137,7 +154,7 @@ static void ed_journal_load_files(EDJournal *self)
} }
p->files = g_list_sort( p->files = g_list_sort(
p->files, (GCompareFunc)ed_journal_file_compare); p->files, (GCompareFunc)ed_journal_file_compare_desc);
done: done:
@ -171,3 +188,10 @@ EDErrorCode ed_journal_set_location(EDJournal *self, gchar const *dir)
return ed_error_success; return ed_error_success;
} }
GList *ed_journal_get_files(EDJournal *self)
{
return_if_true(self == NULL, NULL);
EDJournalPrivate *p = ed_journal_get_instance_private(self);
return p->files;
}

View File

@ -8,6 +8,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <edapi/journal/journal.h> #include <edapi/journal/journal.h>
#include <edapi/journal/file.h>
static void test_userprofile_location(void **state) static void test_userprofile_location(void **state)
{ {
@ -22,10 +23,48 @@ static void test_userprofile_location(void **state)
g_clear_object(&journal); g_clear_object(&journal);
} }
static void test_file_sorting(void **state)
{
setenv("USERPROFILE", "./", 1);
EDJournal *journal = ed_journal_new();
assert_non_null(journal);
gchar const *location = ed_journal_get_location(journal);
assert_non_null(location);
GList *files = ed_journal_get_files(journal);
assert_non_null(files);
assert_non_null(files->data);
GDateTime *datetime = NULL;
datetime = ed_journal_file_get_datetime(
ED_JOURNALFILE(files->data)
);
assert_non_null(datetime);
assert_int_equal(g_date_time_get_year(datetime), 2025);
datetime = ed_journal_file_get_datetime(
ED_JOURNALFILE(files->next->data)
);
assert_non_null(datetime);
assert_int_equal(g_date_time_get_year(datetime), 2024);
datetime = ed_journal_file_get_datetime(
ED_JOURNALFILE(files->next->next->data)
);
assert_non_null(datetime);
assert_int_equal(g_date_time_get_year(datetime), 2023);
g_clear_object(&journal);
}
int main(int ac, char **av) int main(int ac, char **av)
{ {
static const struct CMUnitTest tests[] = { static const struct CMUnitTest tests[] = {
cmocka_unit_test(test_userprofile_location), cmocka_unit_test(test_userprofile_location),
cmocka_unit_test(test_file_sorting),
}; };
return cmocka_run_group_tests(tests, NULL, NULL); return cmocka_run_group_tests(tests, NULL, NULL);