|  | @@ -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():
 |