file_manager: ignore duplicate "create_file" notifications for gcode files

The the cancel object post processor results in an additional
"create_file" notification when the old file is replaced.
Track previous "create_file" notifications for valid gcode
files so the dups can be suppressed.

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan 2021-11-24 07:57:07 -05:00 committed by Eric Callahan
parent ea6c78773e
commit 9dd0797f49
1 changed files with 22 additions and 1 deletions

View File

@ -998,7 +998,11 @@ class NotifySyncLock:
if not self.check_need_sync(path): if not self.check_need_sync(path):
return return
self.notified_paths.add(path) self.notified_paths.add(path)
if self.wait_fut is not None and self.dest_path == path: if (
self.wait_fut is not None and
not self.wait_fut.done() and
self.dest_path == path
):
self.wait_fut.set_result(None) self.wait_fut.set_result(None)
# Transfer control to waiter # Transfer control to waiter
try: try:
@ -1041,6 +1045,7 @@ class INotifyHandler:
self.watched_nodes: Dict[int, InotifyNode] = {} self.watched_nodes: Dict[int, InotifyNode] = {}
self.pending_moves: Dict[ self.pending_moves: Dict[
int, Tuple[InotifyNode, str, asyncio.Handle]] = {} int, Tuple[InotifyNode, str, asyncio.Handle]] = {}
self.create_gcode_notifications: Dict[str, Any] = {}
def add_root_watch(self, root: str, root_path: str) -> None: def add_root_watch(self, root: str, root_path: str) -> None:
@ -1321,6 +1326,22 @@ class INotifyHandler:
is_valid = False is_valid = False
elif action not in ["delete_file", "delete_dir"]: elif action not in ["delete_file", "delete_dir"]:
is_valid = False is_valid = False
ext = os.path.splitext(rel_path)[-1].lower()
if (
is_valid and
root == "gcodes" and
ext in VALID_GCODE_EXTS and
action == "create_file"
):
prev_info = self.create_gcode_notifications.get(rel_path, {})
if file_info == prev_info:
logging.debug("Ignoring duplicate 'create_file' "
f"notification: {rel_path}")
is_valid = False
else:
self.create_gcode_notifications[rel_path] = dict(file_info)
elif rel_path in self.create_gcode_notifications:
del self.create_gcode_notifications[rel_path]
file_info['path'] = rel_path file_info['path'] = rel_path
file_info['root'] = root file_info['root'] = root
result = {'action': action, 'item': file_info} result = {'action': action, 'item': file_info}