Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 29 additions & 5 deletions packages/file-service/src/node/recursive/file-service-watcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import paths from 'path';
import ParcelWatcher from '@parcel/watcher';
import fs from 'fs-extra';
import debounce from 'lodash/debounce';
import uniqBy from 'lodash/uniqBy';

import { Injectable, Autowired, Optional } from '@opensumi/di';
import {
Expand Down Expand Up @@ -166,7 +167,7 @@ export class FileSystemWatcherServer implements IFileSystemWatcherServer {
protected trimChangeEvent(events: ParcelWatcher.Event[]): ParcelWatcher.Event[] {
events = events.filter((event: ParcelWatcher.Event) => {
if (event.path) {
if (/\.\d{7}\d+$/.test(event.path)) {
if (this.isTempFile(event.path)) {
// write-file-atomic 源文件xxx.xx 对应的临时文件为 xxx.xx.22243434
// 这类文件的更新应当完全隐藏掉
return false;
Expand All @@ -178,6 +179,10 @@ export class FileSystemWatcherServer implements IFileSystemWatcherServer {
return events;
}

private isTempFile(path: string) {
return /\.\d{7}\d+$/.test(path);
}

private getDefaultWatchExclude() {
return ['**/.git/objects/**', '**/.git/subtree-cache/**', '**/node_modules/**/*', '**/.hg/store/**'];
}
Expand Down Expand Up @@ -309,6 +314,10 @@ export class FileSystemWatcherServer implements IFileSystemWatcherServer {
}

private async handleNSFWEvents(events: INsfw.ChangeEvent[], watcherId: number): Promise<void> {
if (events.length > 5000) {
return;
}

const isIgnored = (watcherId: number, path: string): boolean => {
const options = this.watcherOptions.get(watcherId);
if (!options || !options.excludes || options.excludes.length < 1) {
Expand All @@ -317,11 +326,26 @@ export class FileSystemWatcherServer implements IFileSystemWatcherServer {
return options.excludesPattern.some((match) => match(path));
};

if (events.length > 5000) {
return;
}
const filterEvents = events.filter((event) => {
// 如果是 RENAME,不会产生临时文件
if (event.action === INsfw.actions.RENAMED) {
return true;
}

return !this.isTempFile(event.file!);
});
// 合并下事件,由于 resolvePath 耗时较久,这里只用当前事件路径及文件名去重,后续处理事件再获取真实路径
const mergedEvents = uniqBy(filterEvents, (event) => {
if (event.action === INsfw.actions.RENAMED) {
const deletedPath = paths.join(event.directory, event.oldFile!);
const newPath = paths.join(event.newDirectory || event.directory, event.newFile!);
return deletedPath + newPath;
Comment thread
Ricbet marked this conversation as resolved.
}

return event.action + paths.join(event.directory, event.file!);
});

for (const event of events) {
for (const event of mergedEvents) {
if (event.action === INsfw.actions.RENAMED) {
const deletedPath = this.resolvePath(event.directory, event.oldFile!);
if (isIgnored(watcherId, deletedPath)) {
Expand Down