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 *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

View File

@ -15,9 +15,17 @@ G_DECLARE_FINAL_TYPE(
EDJournal *ed_journal_new(void);
EDJournal *ed_journal_new_with_location(gchar const *dir);
gchar const *ed_journal_get_location(EDJournal *j);
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
#endif

View File

@ -591,7 +591,7 @@ EDJournalEntry *ed_journal_file_get_last(EDJournalFile *self)
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);
@ -602,6 +602,17 @@ gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs)
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,
GDateTime *start,
GDateTime *end)

View File

@ -90,6 +90,23 @@ EDJournal *ed_journal_new(void)
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)
{
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, (GCompareFunc)ed_journal_file_compare);
p->files, (GCompareFunc)ed_journal_file_compare_desc);
done:
@ -171,3 +188,10 @@ EDErrorCode ed_journal_set_location(EDJournal *self, gchar const *dir)
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 <edapi/journal/journal.h>
#include <edapi/journal/file.h>
static void test_userprofile_location(void **state)
{
@ -22,10 +23,48 @@ static void test_userprofile_location(void **state)
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)
{
static const struct CMUnitTest tests[] = {
cmocka_unit_test(test_userprofile_location),
cmocka_unit_test(test_file_sorting),
};
return cmocka_run_group_tests(tests, NULL, NULL);