Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/code/electron-utility/sharedProcess/contrib/logsDataCleaner.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { RunOnceScheduler } from '../../../../base/common/async.js';
7
import { onUnexpectedError } from '../../../../base/common/errors.js';
8
import { Disposable } from '../../../../base/common/lifecycle.js';
9
import { Schemas } from '../../../../base/common/network.js';
10
import { join } from '../../../../base/common/path.js';
11
import { basename, dirname } from '../../../../base/common/resources.js';
12
import { Promises } from '../../../../base/node/pfs.js';
13
import { IEnvironmentService } from '../../../../platform/environment/common/environment.js';
14
import { ILogService } from '../../../../platform/log/common/log.js';
15
16
export class LogsDataCleaner extends Disposable {
17
18
constructor(
19
@IEnvironmentService private readonly environmentService: IEnvironmentService,
20
@ILogService private readonly logService: ILogService
21
) {
22
super();
23
24
const scheduler = this._register(new RunOnceScheduler(() => {
25
this.cleanUpOldLogs();
26
}, 10 * 1000 /* after 10s */));
27
scheduler.schedule();
28
}
29
30
private async cleanUpOldLogs(): Promise<void> {
31
this.logService.trace('[logs cleanup]: Starting to clean up old logs.');
32
33
try {
34
const currentLog = basename(this.environmentService.logsHome);
35
const logsRoot = dirname(this.environmentService.logsHome.with({ scheme: Schemas.file })).fsPath;
36
const logFiles = await Promises.readdir(logsRoot);
37
38
const allSessions = logFiles.filter(logFile => /^\d{8}T\d{6}$/.test(logFile));
39
const oldSessions = allSessions.sort().filter(session => session !== currentLog);
40
const sessionsToDelete = oldSessions.slice(0, Math.max(0, oldSessions.length - 9));
41
42
if (sessionsToDelete.length > 0) {
43
this.logService.trace(`[logs cleanup]: Removing log folders '${sessionsToDelete.join(', ')}'`);
44
45
await Promise.all(sessionsToDelete.map(sessionToDelete => Promises.rm(join(logsRoot, sessionToDelete))));
46
}
47
} catch (error) {
48
onUnexpectedError(error);
49
}
50
}
51
}
52
53