summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMart Raudsepp <leio@gentoo.org>2020-03-22 17:30:22 +0200
committerMart Raudsepp <leio@gentoo.org>2020-03-22 18:08:32 +0200
commit220fdfdccc18aacab55908cb19dabbf443fc54bc (patch)
treeb26a93abd07bf30cdeb6f21e82c728ecbf3d731b
parentapp-arch/zstd: fix underlinking against pthreads, bug #713940 (diff)
downloadgentoo-220fdfdccc18aacab55908cb19dabbf443fc54bc.tar.gz
gentoo-220fdfdccc18aacab55908cb19dabbf443fc54bc.tar.bz2
gentoo-220fdfdccc18aacab55908cb19dabbf443fc54bc.zip
app-office/gnome-todo: initial import from gnome overlay
Package-Manager: Portage-2.3.84, Repoman-2.3.20 Signed-off-by: Mart Raudsepp <leio@gentoo.org>
-rw-r--r--app-office/gnome-todo/Manifest1
-rw-r--r--app-office/gnome-todo/files/gnome-todo-eds-libecal-2.0.patch570
-rw-r--r--app-office/gnome-todo/gnome-todo-3.28.1-r1.ebuild67
-rw-r--r--app-office/gnome-todo/metadata.xml8
4 files changed, 646 insertions, 0 deletions
diff --git a/app-office/gnome-todo/Manifest b/app-office/gnome-todo/Manifest
new file mode 100644
index 000000000000..4316fe661ed5
--- /dev/null
+++ b/app-office/gnome-todo/Manifest
@@ -0,0 +1 @@
+DIST gnome-todo-3.28.1.tar.xz 751448 BLAKE2B 55c4909d35e65a763bd283e55b85dc3a6dc0190c39f3f97c33bde7c071abd8e7a88479ed72733e66bd550133bb683ed9cafb9dff36f41b4f7d6bcb9f889f2a39 SHA512 26371dd2a460656b5b7d323420cfdc3f26c548cabe0bf6a01081a017d68e062fb54164f6d0c5cf5054b59f30be65681dedde450d9b98b88f73c07131cd01f57a
diff --git a/app-office/gnome-todo/files/gnome-todo-eds-libecal-2.0.patch b/app-office/gnome-todo/files/gnome-todo-eds-libecal-2.0.patch
new file mode 100644
index 000000000000..df4151b8fc3e
--- /dev/null
+++ b/app-office/gnome-todo/files/gnome-todo-eds-libecal-2.0.patch
@@ -0,0 +1,570 @@
+Taken from Fedora from
+https://src.fedoraproject.org/rpms/gnome-todo/raw/master/f/gnome-todo-eds-libecal-2.0.patch
+
+diff --git a/plugins/eds/gtd-eds-autoptr.h b/plugins/eds/gtd-eds-autoptr.h
+index eb9b011..78bd944 100644
+--- a/plugins/eds/gtd-eds-autoptr.h
++++ b/plugins/eds/gtd-eds-autoptr.h
+@@ -23,6 +23,5 @@
+ #include <libecal/libecal.h>
+
+ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ECalComponent, g_object_unref);
+-G_DEFINE_AUTOPTR_CLEANUP_FUNC (ECalComponentId, e_cal_component_free_id);
++G_DEFINE_AUTOPTR_CLEANUP_FUNC (ECalComponentId, e_cal_component_id_free);
+ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ECalClient, g_object_unref);
+-G_DEFINE_AUTOPTR_CLEANUP_FUNC (ESource, g_object_unref);
+diff --git a/plugins/eds/gtd-provider-eds.c b/plugins/eds/gtd-provider-eds.c
+index a403226..def4235 100644
+--- a/plugins/eds/gtd-provider-eds.c
++++ b/plugins/eds/gtd-provider-eds.c
+@@ -554,6 +554,7 @@ gtd_provider_eds_create_task (GtdProvider *provider,
+
+ e_cal_client_create_object (client,
+ e_cal_component_get_icalcomponent (component),
++ E_CAL_OPERATION_FLAG_NONE,
+ NULL,
+ (GAsyncReadyCallback) on_task_created_cb,
+ new_task);
+@@ -587,6 +588,7 @@ gtd_provider_eds_update_task (GtdProvider *provider,
+ e_cal_client_modify_object (client,
+ e_cal_component_get_icalcomponent (component),
+ E_CAL_OBJ_MOD_THIS,
++ E_CAL_OPERATION_FLAG_NONE,
+ NULL,
+ (GAsyncReadyCallback) on_task_modified_cb,
+ task);
+@@ -616,9 +618,10 @@ gtd_provider_eds_remove_task (GtdProvider *provider,
+ gtd_object_push_loading (GTD_OBJECT (provider));
+
+ e_cal_client_remove_object (client,
+- id->uid,
+- id->rid,
++ e_cal_component_id_get_uid (id),
++ e_cal_component_id_get_rid (id),
+ E_CAL_OBJ_MOD_THIS,
++ E_CAL_OPERATION_FLAG_NONE,
+ NULL,
+ (GAsyncReadyCallback) on_task_removed_cb,
+ provider);
+diff --git a/plugins/eds/gtd-task-eds.c b/plugins/eds/gtd-task-eds.c
+index 2c8cd8e..bd8f7ac 100644
+--- a/plugins/eds/gtd-task-eds.c
++++ b/plugins/eds/gtd-task-eds.c
+@@ -46,19 +46,19 @@ static GParamSpec *properties [N_PROPS];
+ */
+
+ static GDateTime*
+-convert_icaltime (const icaltimetype *date)
++convert_icaltime (const ICalTime *date)
+ {
+ GDateTime *dt;
+
+ if (!date)
+ return NULL;
+
+- dt = g_date_time_new_utc (date->year,
+- date->month,
+- date->day,
+- date->is_date ? 0 : date->hour,
+- date->is_date ? 0 : date->minute,
+- date->is_date ? 0 : date->second);
++ dt = g_date_time_new_utc (i_cal_time_get_year (date),
++ i_cal_time_get_month (date),
++ i_cal_time_get_day (date),
++ i_cal_time_is_date (date) ? 0 : i_cal_time_get_hour (date),
++ i_cal_time_is_date (date) ? 0 : i_cal_time_get_minute (date),
++ i_cal_time_is_date (date) ? 0 : i_cal_time_get_second (date));
+
+ return dt;
+ }
+@@ -67,19 +67,20 @@ static void
+ set_description (GtdTaskEds *self,
+ const gchar *description)
+ {
+- ECalComponentText text;
++ ECalComponentText *text;
+ GSList note;
+
+- text.value = description && *description ? description : "";
+- text.altrep = NULL;
++ text = e_cal_component_text_new (description ? description : "", NULL);
+
+- note.data = &text;
++ note.data = text;
+ note.next = NULL;
+
+ g_clear_pointer (&self->description, g_free);
+ self->description = g_strdup (description);
+
+- e_cal_component_set_description_list (self->component, &note);
++ e_cal_component_set_descriptions (self->component, (description && *description) ? &note : NULL);
++
++ e_cal_component_text_free (text);
+ }
+
+ static void
+@@ -90,7 +91,7 @@ setup_description (GtdTaskEds *self)
+ GSList *l;
+
+ /* concatenates the multiple descriptions a task may have */
+- e_cal_component_get_description_list (self->component, &text_list);
++ text_list = e_cal_component_get_descriptions (self->component);
+
+ for (l = text_list; l != NULL; l = l->next)
+ {
+@@ -105,21 +106,21 @@ setup_description (GtdTaskEds *self)
+ {
+ carrier = g_strconcat (desc,
+ "\n",
+- text->value,
++ e_cal_component_text_get_value (text),
+ NULL);
+ g_free (desc);
+ desc = carrier;
+ }
+ else
+ {
+- desc = g_strdup (text->value);
++ desc = g_strdup (e_cal_component_text_get_value (text));
+ }
+ }
+ }
+
+ set_description (self, desc);
+
+- e_cal_component_free_text_list (text_list);
++ g_slist_free_full (text_list, e_cal_component_text_free);
+ }
+
+
+@@ -138,7 +139,7 @@ gtd_task_eds_get_uid (GtdObject *object)
+ self = GTD_TASK_EDS (object);
+
+ if (self->component)
+- e_cal_component_get_uid (self->component, &uid);
++ uid = e_cal_component_get_uid (self->component);
+ else
+ uid = NULL;
+
+@@ -159,7 +160,7 @@ gtd_task_eds_set_uid (GtdObject *object,
+ if (!self->component)
+ return;
+
+- e_cal_component_get_uid (self->component, &current_uid);
++ current_uid = e_cal_component_get_uid (self->component);
+
+ if (g_strcmp0 (current_uid, uid) != 0)
+ {
+@@ -177,7 +178,7 @@ gtd_task_eds_set_uid (GtdObject *object,
+ static gboolean
+ gtd_task_eds_get_complete (GtdTask *task)
+ {
+- icalproperty_status status;
++ ICalPropertyStatus status;
+ GtdTaskEds *self;
+ gboolean completed;
+
+@@ -185,8 +186,8 @@ gtd_task_eds_get_complete (GtdTask *task)
+
+ self = GTD_TASK_EDS (task);
+
+- e_cal_component_get_status (self->component, &status);
+- completed = status == ICAL_STATUS_COMPLETED;
++ status = e_cal_component_get_status (self->component);
++ completed = status == I_CAL_STATUS_COMPLETED;
+
+ return completed;
+ }
+@@ -195,8 +196,8 @@ static void
+ gtd_task_eds_set_complete (GtdTask *task,
+ gboolean complete)
+ {
+- icalproperty_status status;
+- icaltimetype *dt;
++ ICalPropertyStatus status;
++ ICalTime *dt;
+ GtdTaskEds *self;
+ gint percent;
+
+@@ -209,54 +210,54 @@ gtd_task_eds_set_complete (GtdTask *task,
+ percent = 100;
+ status = ICAL_STATUS_COMPLETED;
+
+- dt = g_new0 (icaltimetype, 1);
+- dt->year = g_date_time_get_year (now);
+- dt->month = g_date_time_get_month (now);
+- dt->day = g_date_time_get_day_of_month (now);
+- dt->hour = g_date_time_get_hour (now);
+- dt->minute = g_date_time_get_minute (now);
+- dt->second = g_date_time_get_seconds (now);
+- dt->zone = icaltimezone_get_utc_timezone ();
++ dt = i_cal_time_new_null_time ();
++ i_cal_time_set_date (dt,
++ g_date_time_get_year (now),
++ g_date_time_get_month (now),
++ g_date_time_get_day_of_month (now));
++ i_cal_time_set_time (dt,
++ g_date_time_get_hour (now),
++ g_date_time_get_minute (now),
++ g_date_time_get_seconds (now));
++ i_cal_time_set_timezone (dt, i_cal_timezone_get_utc_timezone ());
+
+ /* convert timezone
+ *
+ * FIXME: This does not do anything until we have an ical
+ * timezone associated with the task
+ */
+- icaltimezone_convert_time (dt, NULL, icaltimezone_get_utc_timezone ());
++ i_cal_time_convert_timezone (dt, NULL, i_cal_timezone_get_utc_timezone ());
+ }
+ else
+ {
+ dt = NULL;
+ percent = 0;
+- status = ICAL_STATUS_NEEDSACTION;
++ status = I_CAL_STATUS_NEEDSACTION;
+ }
+
+- e_cal_component_set_percent_as_int (self->component, percent);
++ e_cal_component_set_percent_complete (self->component, percent);
+ e_cal_component_set_status (self->component, status);
+ e_cal_component_set_completed (self->component, dt);
+
+- if (dt)
+- e_cal_component_free_icaltimetype (dt);
++ g_clear_object (&dt);
+ }
+
+ static GDateTime*
+ gtd_task_eds_get_creation_date (GtdTask *task)
+ {
+- icaltimetype *idt;
++ ICalTime *idt;
+ GtdTaskEds *self;
+ GDateTime *dt;
+
+ self = GTD_TASK_EDS (task);
+- idt = NULL;
+ dt = NULL;
+
+- e_cal_component_get_created (self->component, &idt);
++ idt = e_cal_component_get_created (self->component);
+
+ if (idt)
+ dt = convert_icaltime (idt);
+
+- g_clear_pointer (&idt, e_cal_component_free_icaltimetype);
++ g_clear_object (&idt);
+
+ return dt;
+ }
+@@ -286,7 +287,7 @@ gtd_task_eds_set_description (GtdTask *task,
+ static GDateTime*
+ gtd_task_eds_get_due_date (GtdTask *task)
+ {
+- ECalComponentDateTime comp_dt;
++ ECalComponentDateTime *comp_dt;
+ GtdTaskEds *self;
+ GDateTime *date;
+
+@@ -294,10 +295,12 @@ gtd_task_eds_get_due_date (GtdTask *task)
+
+ self = GTD_TASK_EDS (task);
+
+- e_cal_component_get_due (self->component, &comp_dt);
++ comp_dt = e_cal_component_get_due (self->component);
++ if (!comp_dt)
++ return NULL;
+
+- date = convert_icaltime (comp_dt.value);
+- e_cal_component_free_datetime (&comp_dt);
++ date = convert_icaltime (e_cal_component_datetime_get_value (comp_dt));
++ e_cal_component_datetime_free (comp_dt);
+
+ return date;
+ }
+@@ -317,11 +320,10 @@ gtd_task_eds_set_due_date (GtdTask *task,
+
+ if (dt != current_dt)
+ {
+- ECalComponentDateTime comp_dt;
+- icaltimetype *idt;
++ ECalComponentDateTime *comp_dt;
++ ICalTime *idt;
+
+- comp_dt.value = NULL;
+- comp_dt.tzid = NULL;
++ comp_dt = NULL;
+ idt = NULL;
+
+ if (!current_dt ||
+@@ -329,36 +331,34 @@ gtd_task_eds_set_due_date (GtdTask *task,
+ dt &&
+ g_date_time_compare (current_dt, dt) != 0))
+ {
+- idt = g_new0 (icaltimetype, 1);
++ idt = i_cal_time_new_null_time ();
+
+ g_date_time_ref (dt);
+
+ /* Copy the given dt */
+- idt->year = g_date_time_get_year (dt);
+- idt->month = g_date_time_get_month (dt);
+- idt->day = g_date_time_get_day_of_month (dt);
+- idt->hour = g_date_time_get_hour (dt);
+- idt->minute = g_date_time_get_minute (dt);
+- idt->second = g_date_time_get_seconds (dt);
+- idt->is_date = (idt->hour == 0 &&
+- idt->minute == 0 &&
+- idt->second == 0);
+-
+- comp_dt.tzid = g_strdup ("UTC");
++ i_cal_time_set_date (idt,
++ g_date_time_get_year (dt),
++ g_date_time_get_month (dt),
++ g_date_time_get_day_of_month (dt));
++ i_cal_time_set_time (idt,
++ g_date_time_get_hour (dt),
++ g_date_time_get_minute (dt),
++ g_date_time_get_seconds (dt));
++ i_cal_time_set_is_date (idt,
++ i_cal_time_get_hour (idt) == 0 &&
++ i_cal_time_get_minute (idt) == 0 &&
++ i_cal_time_get_second (idt) == 0);
+
+- comp_dt.value = idt;
++ comp_dt = e_cal_component_datetime_new_take (idt, g_strdup ("UTC"));
+
+- e_cal_component_set_due (self->component, &comp_dt);
++ e_cal_component_set_due (self->component, comp_dt);
+
+- e_cal_component_free_datetime (&comp_dt);
++ e_cal_component_datetime_free (comp_dt);
+
+ g_date_time_unref (dt);
+ }
+ else if (!dt)
+ {
+- idt = NULL;
+- comp_dt.tzid = NULL;
+-
+ e_cal_component_set_due (self->component, NULL);
+ }
+ }
+@@ -369,19 +369,13 @@ gtd_task_eds_set_due_date (GtdTask *task,
+ static gint32
+ gtd_task_eds_get_priority (GtdTask *task)
+ {
+- g_autofree gint *priority = NULL;
+ GtdTaskEds *self;
+
+ g_assert (GTD_IS_TASK_EDS (task));
+
+ self = GTD_TASK_EDS (task);
+
+- e_cal_component_get_priority (self->component, &priority);
+-
+- if (!priority)
+- return -1;
+-
+- return *priority;
++ return e_cal_component_get_priority (self->component);
+ }
+
+ static void
+@@ -394,29 +388,26 @@ gtd_task_eds_set_priority (GtdTask *task,
+
+ self = GTD_TASK_EDS (task);
+
+- e_cal_component_set_priority (self->component, &priority);
++ e_cal_component_set_priority (self->component, priority);
+ }
+
+ static const gchar*
+ gtd_task_eds_get_title (GtdTask *task)
+ {
+- ECalComponentText summary;
+ GtdTaskEds *self;
+
+ g_return_val_if_fail (GTD_IS_TASK_EDS (task), NULL);
+
+ self = GTD_TASK_EDS (task);
+
+- e_cal_component_get_summary (self->component, &summary);
+-
+- return summary.value;
++ return i_cal_component_get_summary (e_cal_component_get_icalcomponent (self->component));
+ }
+
+ static void
+ gtd_task_eds_set_title (GtdTask *task,
+ const gchar *title)
+ {
+- ECalComponentText new_summary;
++ ECalComponentText *new_summary;
+ GtdTaskEds *self;
+
+ g_return_if_fail (GTD_IS_TASK_EDS (task));
+@@ -424,10 +415,11 @@ gtd_task_eds_set_title (GtdTask *task,
+
+ self = GTD_TASK_EDS (task);
+
+- new_summary.value = title;
+- new_summary.altrep = NULL;
++ new_summary = e_cal_component_text_new (title, NULL);
+
+- e_cal_component_set_summary (self->component, &new_summary);
++ e_cal_component_set_summary (self->component, new_summary);
++
++ e_cal_component_text_free (new_summary);
+ }
+
+
+@@ -436,10 +428,10 @@ gtd_task_eds_subtask_added (GtdTask *task,
+ GtdTask *subtask)
+ {
+ g_autoptr (GList) subtasks = NULL;
+- ECalComponentId *id;
++ const gchar *uid;
+ ECalComponent *comp;
+- icalcomponent *ical_comp;
+- icalproperty *property;
++ ICalComponent *ical_comp;
++ ICalProperty *property;
+ GtdTaskEds *subtask_self;
+ GtdTaskEds *self;
+
+@@ -450,17 +442,17 @@ gtd_task_eds_subtask_added (GtdTask *task,
+ /* Hook with parent's :subtask_added */
+ GTD_TASK_CLASS (gtd_task_eds_parent_class)->subtask_added (task, subtask);
+
+- id = e_cal_component_get_id (self->component);
++ uid = e_cal_component_get_uid (self->component);
+ comp = subtask_self->component;
+ ical_comp = e_cal_component_get_icalcomponent (comp);
+- property = icalcomponent_get_first_property (ical_comp, ICAL_RELATEDTO_PROPERTY);
++ property = i_cal_component_get_first_property (ical_comp, I_CAL_RELATEDTO_PROPERTY);
+
+ if (property)
+- icalproperty_set_relatedto (property, id->uid);
++ i_cal_property_set_relatedto (property, uid);
+ else
+- icalcomponent_add_property (ical_comp, icalproperty_new_relatedto (id->uid));
++ i_cal_component_take_property (ical_comp, i_cal_property_new_relatedto (uid));
+
+- e_cal_component_free_id (id);
++ g_clear_object (&property);
+ }
+
+ static void
+@@ -468,8 +460,8 @@ gtd_task_eds_subtask_removed (GtdTask *task,
+ GtdTask *subtask)
+ {
+ g_autoptr (GList) subtasks = NULL;
+- icalcomponent *ical_comp;
+- icalproperty *property;
++ ICalComponent *ical_comp;
++ ICalProperty *property;
+ GtdTaskEds *subtask_self;
+
+ subtask_self = GTD_TASK_EDS (subtask);
+@@ -480,12 +472,13 @@ gtd_task_eds_subtask_removed (GtdTask *task,
+
+ /* Remove the parent link from the subtask's component */
+ ical_comp = e_cal_component_get_icalcomponent (subtask_self->component);
+- property = icalcomponent_get_first_property (ical_comp, ICAL_RELATEDTO_PROPERTY);
++ property = i_cal_component_get_first_property (ical_comp, I_CAL_RELATEDTO_PROPERTY);
+
+ if (!property)
+ return;
+
+- icalcomponent_remove_property (ical_comp, property);
++ i_cal_component_remove_property (ical_comp, property);
++ g_object_unref (property);
+ }
+
+
+diff --git a/plugins/eds/gtd-task-list-eds.c b/plugins/eds/gtd-task-list-eds.c
+index eb48a73..5b71718 100644
+--- a/plugins/eds/gtd-task-list-eds.c
++++ b/plugins/eds/gtd-task-list-eds.c
+@@ -85,19 +85,19 @@ setup_parent_task (GtdTaskListEds *self,
+ GtdTask *task)
+ {
+ ECalComponent *component;
+- icalcomponent *ical_comp;
+- icalproperty *property;
++ ICalComponent *ical_comp;
++ ICalProperty *property;
+ GtdTask *parent_task;
+ const gchar *parent_uid;
+
+ component = gtd_task_eds_get_component (GTD_TASK_EDS (task));
+ ical_comp = e_cal_component_get_icalcomponent (component);
+- property = icalcomponent_get_first_property (ical_comp, ICAL_RELATEDTO_PROPERTY);
++ property = i_cal_component_get_first_property (ical_comp, I_CAL_RELATEDTO_PROPERTY);
+
+ if (!property)
+ return;
+
+- parent_uid = icalproperty_get_relatedto (property);
++ parent_uid = i_cal_property_get_relatedto (property);
+ parent_task = gtd_task_list_get_task_by_id (GTD_TASK_LIST (self), parent_uid);
+
+ if (parent_task)
+@@ -112,6 +112,8 @@ setup_parent_task (GtdTaskListEds *self,
+
+ g_ptr_array_add (self->pending_subtasks, data);
+ }
++
++ g_object_unref (property);
+ }
+
+ static void
+@@ -161,8 +163,8 @@ on_view_objects_added_cb (ECalClientView *view,
+ GtdTask *task;
+ const gchar *uid;
+
+- component = e_cal_component_new_from_string (icalcomponent_as_ical_string (l->data));
+- e_cal_component_get_uid (component, &uid);
++ component = e_cal_component_new_from_icalcomponent (i_cal_component_clone (l->data));
++ uid = e_cal_component_get_uid (component);
+
+ task = gtd_task_list_get_task_by_id (self, uid);
+
+@@ -211,8 +213,8 @@ on_view_objects_modified_cb (ECalClientView *view,
+ GtdTask *task;
+ const gchar *uid;
+
+- component = e_cal_component_new_from_string (icalcomponent_as_ical_string (l->data));
+- e_cal_component_get_uid (component, &uid);
++ component = e_cal_component_new_from_icalcomponent (i_cal_component_clone (l->data));
++ uid = e_cal_component_get_uid (component);
+
+ task = gtd_task_list_get_task_by_id (self, uid);
+
+@@ -244,7 +246,7 @@ on_view_objects_removed_cb (ECalClientView *view,
+ GtdTask *task;
+
+ id = l->data;
+- task = gtd_task_list_get_task_by_id (self, id->uid);
++ task = gtd_task_list_get_task_by_id (self, e_cal_component_id_get_uid (id));
+
+ if (!task)
+ continue;
+diff --git a/plugins/eds/meson.build b/plugins/eds/meson.build
+index ea84426..b37f0c6 100644
+--- a/plugins/eds/meson.build
++++ b/plugins/eds/meson.build
+@@ -8,10 +8,9 @@ plugins_ldflags += ['-Wl,--undefined=gtd_plugin_eds_register_types']
+ ################
+
+ eds_plugin_deps = [
+- dependency('libecal-1.2', version: '>= 3.13.90'),
++ dependency('libecal-2.0', version: '>= 3.33.1'),
+ dependency('libedataserver-1.2', version: '>= 3.17.1'),
+ dependency('libedataserverui-1.2', version: '>= 3.17.1'),
+- dependency('libical', version: '>= 0.43'),
+ ]
+
+ eds_plugin_deps += gnome_todo_deps
diff --git a/app-office/gnome-todo/gnome-todo-3.28.1-r1.ebuild b/app-office/gnome-todo/gnome-todo-3.28.1-r1.ebuild
new file mode 100644
index 000000000000..7a8b9d674579
--- /dev/null
+++ b/app-office/gnome-todo/gnome-todo-3.28.1-r1.ebuild
@@ -0,0 +1,67 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+inherit gnome.org gnome2-utils meson xdg
+
+DESCRIPTION="Personal task manager"
+HOMEPAGE="https://wiki.gnome.org/Apps/Todo"
+
+LICENSE="GPL-3+"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE="gtk-doc +introspection"
+
+RDEPEND="
+ >=dev-libs/glib-2.43.4:2
+ >=x11-libs/gtk+-3.22.0:3[introspection?]
+ >=net-libs/gnome-online-accounts-3.25.3
+ >=dev-libs/libpeas-1.17
+ >=gnome-extra/evolution-data-server-3.33.1:=[gtk]
+ net-libs/rest:0.7
+ dev-libs/json-glib
+ introspection? ( >=dev-libs/gobject-introspection-1.42:= )
+"
+DEPEND="${RDEPEND}
+ dev-libs/libxml2:2
+ dev-util/glib-utils
+ gtk-doc? ( dev-util/gtk-doc
+ app-text/docbook-xml-dtd:4.3 )
+ >=sys-devel/gettext-0.19.8
+ virtual/pkgconfig
+"
+
+PATCHES=(
+ "${FILESDIR}"/gnome-todo-eds-libecal-2.0.patch
+)
+
+src_configure() {
+ # TODO: There aren't any consumers of the introspection outside gnome-todo's own plugins, so maybe we
+ # TODO: should just always build introspection support as an application that needs it for full functionality?
+ # Todoist plugin requires 3.25.3 GOA for being able to add a Todoist account
+ local emesonargs=(
+ -Dbackground_plugin=true
+ -Ddark_theme_plugin=true
+ -Dscheduled_panel_plugin=true
+ -Dscore_plugin=true
+ -Dtoday_panel_plugin=true
+ -Dunscheduled_panel_plugin=true
+ -Dtodo_txt_plugin=true
+ -Dtodoist_plugin=true
+ -Dtracing=false
+ $(meson_use gtk-doc gtk_doc)
+ $(meson_use introspection)
+ )
+ meson_src_configure
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+ gnome2_schemas_update
+}
+
+pkg_postrm() {
+ xdg_pkg_postrm
+ gnome2_schemas_update
+}
diff --git a/app-office/gnome-todo/metadata.xml b/app-office/gnome-todo/metadata.xml
new file mode 100644
index 000000000000..39980802b1da
--- /dev/null
+++ b/app-office/gnome-todo/metadata.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+<maintainer type="project">
+ <email>gnome@gentoo.org</email>
+ <name>Gentoo GNOME Desktop</name>
+</maintainer>
+</pkgmetadata>