Browse Source

ignore DTSTAMP when comparing events

Fabian Peter Hammerle 4 years ago
parent
commit
cf04a68ed5
1 changed files with 22 additions and 5 deletions
  1. 22 5
      ics2vdir/__init__.py

+ 22 - 5
ics2vdir/__init__.py

@@ -16,7 +16,6 @@
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 import argparse
-import filecmp
 import logging
 import os
 import pathlib
@@ -28,6 +27,21 @@ import icalendar
 _LOGGER = logging.getLogger(__name__)
 
 
+def _event_prop_equal(prop_a, prop_b) -> bool:
+    if isinstance(prop_a, icalendar.prop.vDDDTypes):
+        return vars(prop_a) == vars(prop_b)
+    return prop_a == prop_b
+
+
+def _events_equal(event_a: icalendar.cal.Event, event_b: icalendar.cal.Event) -> bool:
+    for key, prop_a in event_a.items():
+        if key == "DTSTAMP":
+            continue
+        if not _event_prop_equal(prop_a, event_b[key]):
+            return False
+    return True
+
+
 def _export_event(event: icalendar.cal.Event, output_dir_path: pathlib.Path) -> None:
     temp_fd, temp_path = tempfile.mkstemp(prefix="ics2vdir-", suffix=".ics")
     os.write(temp_fd, event.to_ical())
@@ -36,11 +50,14 @@ def _export_event(event: icalendar.cal.Event, output_dir_path: pathlib.Path) ->
     if not output_path.exists():
         _LOGGER.info("creating %s", output_path)
         os.rename(temp_path, output_path)
-    elif not filecmp.cmp(temp_path, output_path):
-        _LOGGER.info("updating %s", output_path)
-        os.rename(temp_path, output_path)
     else:
-        _LOGGER.debug("%s is up to date", output_path)
+        with open(output_path, "rb") as current_file:
+            current_event = icalendar.Event.from_ical(current_file.read())
+        if _events_equal(event, current_event):
+            _LOGGER.debug("%s is up to date", output_path)
+        else:
+            _LOGGER.info("updating %s", output_path)
+            os.rename(temp_path, output_path)
 
 
 def _main():