diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2111,6 +2111,7 @@ 'PhabricatorCalendarImport' => 'applications/calendar/storage/PhabricatorCalendarImport.php', 'PhabricatorCalendarImportDefaultLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportDefaultLogType.php', 'PhabricatorCalendarImportDeleteController' => 'applications/calendar/controller/PhabricatorCalendarImportDeleteController.php', + 'PhabricatorCalendarImportDeleteLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportDeleteLogType.php', 'PhabricatorCalendarImportDeleteTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportDeleteTransaction.php', 'PhabricatorCalendarImportDisableController' => 'applications/calendar/controller/PhabricatorCalendarImportDisableController.php', 'PhabricatorCalendarImportDisableTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportDisableTransaction.php', @@ -6965,6 +6966,7 @@ ), 'PhabricatorCalendarImportDefaultLogType' => 'PhabricatorCalendarImportLogType', 'PhabricatorCalendarImportDeleteController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarImportDeleteLogType' => 'PhabricatorCalendarImportLogType', 'PhabricatorCalendarImportDeleteTransaction' => 'PhabricatorCalendarImportTransactionType', 'PhabricatorCalendarImportDisableController' => 'PhabricatorCalendarController', 'PhabricatorCalendarImportDisableTransaction' => 'PhabricatorCalendarImportTransactionType', diff --git a/src/applications/calendar/import/PhabricatorCalendarImportEngine.php b/src/applications/calendar/import/PhabricatorCalendarImportEngine.php --- a/src/applications/calendar/import/PhabricatorCalendarImportEngine.php +++ b/src/applications/calendar/import/PhabricatorCalendarImportEngine.php @@ -409,10 +409,28 @@ array()); } - // TODO: When the source is a subscription-based ICS file or some other - // similar source, we should load all events from the source here and - // destroy the ones we didn't update. These are events that have been - // deleted. + // Delete any events which are no longer present in the source. + $updated_events = mpull($update_map, null, 'getPHID'); + $source_events = id(new PhabricatorCalendarEventQuery()) + ->setViewer($viewer) + ->withImportSourcePHIDs(array($import->getPHID())) + ->execute(); + + $engine = new PhabricatorDestructionEngine(); + foreach ($source_events as $source_event) { + if (isset($updated_events[$source_event->getPHID()])) { + // We imported and updated this event, so keep it around. + continue; + } + + $import->newLogMessage( + PhabricatorCalendarImportDeleteLogType::LOGTYPE, + array( + 'name' => $source_event->getName(), + )); + + $engine->destroyObject($source_event); + } } private function getFullNodeUID(PhutilCalendarEventNode $node) { diff --git a/src/applications/calendar/importlog/PhabricatorCalendarImportDeleteLogType.php b/src/applications/calendar/importlog/PhabricatorCalendarImportDeleteLogType.php new file mode 100644 --- /dev/null +++ b/src/applications/calendar/importlog/PhabricatorCalendarImportDeleteLogType.php @@ -0,0 +1,34 @@ +getParameter('name')); + } + + public function getDisplayIcon( + PhabricatorUser $viewer, + PhabricatorCalendarImportLog $log) { + return 'fa-times'; + } + + public function getDisplayColor( + PhabricatorUser $viewer, + PhabricatorCalendarImportLog $log) { + return 'grey'; + } + +}