agendafs

A filesystem for your calendar.

git clone git://mccd.space/agendafs
commit 1d886e40816b1f8ecc36a708a03469a5d41bf95f
parent c1dcdcd95e6dc9f86520e18e2ff5d83be9de958e
Author: Marc Coquand <marc@coquand.email>
Date:   Mon, 28 Jul 2025 17:06:01 +0200

Handle explicitly unset filenames

Diffstat:
Mfuse_node.c | 2++
Mical_extra.c | 53++++++++++++++++++++++++++++++++++++++++++++---------
2 files changed, 46 insertions(+), 9 deletions(-)
diff --git a/fuse_node.c b/fuse_node.c
@@ -209,9 +209,11 @@ parse_ics_to_agenda_entry(memory_region *mreg, const char *vdir_filepath)
 		filename = rstrdup(mreg, summary);
 	}
 	else {
+		LOG("GETTING FILE EXT");
 		const char *extension =
 		    icalcomponent_get_file_extension(component);
 		if (!extension) {
+			LOG("Has none, setting to default");
 			extension = get_default_file_extension();
 		}
 
diff --git a/ical_extra.c b/ical_extra.c
@@ -1,5 +1,7 @@
+#include "ical_extra.h"
 #include "libical/ical.h"
 #include "mregion.h"
+#include "path.h"
 #include "sys/stat.h"
 #include "uuid/uuid.h"
 #include <stdbool.h>
@@ -22,6 +24,7 @@ icalcomponent_get_uniq_x_value(icalcomponent *component, const char *key)
 
 		const char *prop_name = icalproperty_get_x_name(prop);
 		if (prop_name && strcmp(prop_name, key) == 0) {
+			LOG("FOUND PROP %s", key);
 			return icalproperty_get_value_as_string(prop);
 		}
 	}
@@ -202,7 +205,17 @@ create_vjournal_entry(memory_region *mreg, const char *summary)
 	icalcomponent_add_property(
 	    journal, icalproperty_new_dtstamp(icaltime_current_time_with_zone(
 			 icaltimezone_get_utc_timezone())));
-	icalcomponent_add_property(journal, icalproperty_new_summary(summary));
+	char *file_extension = get_file_extension(mreg, summary);
+	if (!file_extension) {
+		file_extension = "";
+	}
+
+	char *without_extension = without_file_extension(mreg, summary);
+
+	icalcomponent_add_property(journal,
+				   icalproperty_new_summary(without_extension));
+	icalcomponent_set_file_extension(journal, file_extension);
+
 	icalcomponent_add_property(journal, icalproperty_new_description(""));
 
 	icalcomponent_add_component(calendar, journal);
@@ -289,11 +302,22 @@ icalcomponent_insert_description(memory_region *mreg, icalcomponent *ic,
 	icalcomponent_set_description(ic, new_desc);
 }
 
+icalcomponent *
+icalcomponent_get_innermost(icalcomponent *c)
+{
+	icalcomponent *inner =
+	    icalcomponent_get_first_component(c, ICAL_ANY_COMPONENT);
+
+	if (!inner) {
+		inner = c;
+	}
+	return inner;
+}
+
 void
 icalcomponent_remove_x_prop(icalcomponent *component, const char *key)
 {
-	icalcomponent *inner =
-	    icalcomponent_get_first_component(component, ICAL_ANY_COMPONENT);
+	icalcomponent *inner = icalcomponent_get_innermost(component);
 	assert(inner);
 
 	icalproperty *prop_iter =
@@ -316,8 +340,7 @@ icalcomponent_set_unique_x_value(icalcomponent *component, const char *key,
 				 const char *value)
 {
 	icalcomponent_remove_x_prop(component, key);
-	icalcomponent *inner =
-	    icalcomponent_get_first_component(component, ICAL_ANY_COMPONENT);
+	icalcomponent *inner = icalcomponent_get_innermost(component);
 	assert(inner);
 
 	icalproperty *fileext_prop = icalproperty_new_x(key);
@@ -328,21 +351,33 @@ icalcomponent_set_unique_x_value(icalcomponent *component, const char *key,
 	icalcomponent_add_property(inner, fileext_prop);
 }
 
+// Since empty values are considered null, we store a disallowed extension (..)
+// to indicate that the system has explicitly not set an extension.
 void
 icalcomponent_set_file_extension(icalcomponent *component,
 				 const char *extension)
 {
 
-	icalcomponent_set_unique_x_value(component, FILE_EXTENSION_PROPERTY,
-					 extension);
+	if (strcmp(extension, "") == 0) {
+		icalcomponent_set_unique_x_value(component,
+						 FILE_EXTENSION_PROPERTY, ".");
+	}
+	else {
+		icalcomponent_set_unique_x_value(
+		    component, FILE_EXTENSION_PROPERTY, extension);
+	}
 	LOG("Set X-CALDAVFS-FILEEXT to '%s' on component.", extension);
 }
 
 const char *
 icalcomponent_get_file_extension(icalcomponent *component)
 {
-	return icalcomponent_get_uniq_x_value(component,
-					      FILE_EXTENSION_PROPERTY);
+	const char *ext =
+	    icalcomponent_get_uniq_x_value(component, FILE_EXTENSION_PROPERTY);
+
+	if (ext && strcmp(ext, ".") == 0)
+		return "";
+	return ext;
 }
 
 void