mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-29 09:35:38 -05:00
* Merge from vscode 504f934659740e9d41501cad9f162b54d7745ad9 * delete unused folders * distro * Bump build node version * update chokidar * FIx hygiene errors * distro * Fix extension lint issues * Remove strict-vscode * Add copyright header exemptions * Bump vscode-extension-telemetry to fix webpacking issue with zone.js * distro * Fix failing tests (revert marked.js back to current one until we decide to update) * Skip searchmodel test * Fix mac build * temp debug script loading * Try disabling coverage * log error too * Revert "log error too" This reverts commit af0183e5d4ab458fdf44b88fbfab9908d090526f. * Revert "temp debug script loading" This reverts commit 3d687d541c76db2c5b55626c78ae448d3c25089c. * Add comments explaining coverage disabling * Fix ansi_up loading issue * Merge latest from ads * Use newer option * Fix compile * add debug logging warn * Always log stack * log more * undo debug * Update to use correct base path (+cleanup) * distro * fix compile errors * Remove strict-vscode * Fix sql editors not showing * Show db dropdown input & fix styling * Fix more info in gallery * Fix gallery asset requests * Delete unused workflow * Fix tapable resolutions for smoke test compile error * Fix smoke compile * Disable crash reporting * Disable interactive Co-authored-by: ADS Merger <karlb@microsoft.com>
109 lines
3.8 KiB
TypeScript
109 lines
3.8 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { RunOnceScheduler } from 'vs/base/common/async';
|
|
import { IStringDictionary } from 'vs/base/common/collections';
|
|
import { onUnexpectedError } from 'vs/base/common/errors';
|
|
import { Disposable } from 'vs/base/common/lifecycle';
|
|
import { join } from 'vs/base/common/path';
|
|
import { Promises } from 'vs/base/node/pfs';
|
|
import { INativeEnvironmentService } from 'vs/platform/environment/common/environment';
|
|
import { ILogService } from 'vs/platform/log/common/log';
|
|
import { IProductService } from 'vs/platform/product/common/productService';
|
|
|
|
interface IExtensionEntry {
|
|
version: string;
|
|
extensionIdentifier: {
|
|
id: string;
|
|
uuid: string;
|
|
};
|
|
}
|
|
|
|
interface ILanguagePackEntry {
|
|
hash: string;
|
|
extensions: IExtensionEntry[];
|
|
}
|
|
|
|
interface ILanguagePackFile {
|
|
[locale: string]: ILanguagePackEntry;
|
|
}
|
|
|
|
export class LanguagePackCachedDataCleaner extends Disposable {
|
|
|
|
private readonly _DataMaxAge = this.productService.quality !== 'stable'
|
|
? 1000 * 60 * 60 * 24 * 7 // roughly 1 week (insiders)
|
|
: 1000 * 60 * 60 * 24 * 30 * 3; // roughly 3 months (stable)
|
|
|
|
constructor(
|
|
@INativeEnvironmentService private readonly environmentService: INativeEnvironmentService,
|
|
@ILogService private readonly logService: ILogService,
|
|
@IProductService private readonly productService: IProductService
|
|
) {
|
|
super();
|
|
|
|
// We have no Language pack support for dev version (run from source)
|
|
// So only cleanup when we have a build version.
|
|
if (this.environmentService.isBuilt) {
|
|
const scheduler = this._register(new RunOnceScheduler(() => {
|
|
this.cleanUpLanguagePackCache();
|
|
}, 40 * 1000 /* after 40s */));
|
|
scheduler.schedule();
|
|
}
|
|
}
|
|
|
|
private async cleanUpLanguagePackCache(): Promise<void> {
|
|
this.logService.info('[language pack cache cleanup]: Starting to clean up unused language packs.');
|
|
|
|
try {
|
|
const installed: IStringDictionary<boolean> = Object.create(null);
|
|
const metaData: ILanguagePackFile = JSON.parse(await Promises.readFile(join(this.environmentService.userDataPath, 'languagepacks.json'), 'utf8'));
|
|
for (let locale of Object.keys(metaData)) {
|
|
const entry = metaData[locale];
|
|
installed[`${entry.hash}.${locale}`] = true;
|
|
}
|
|
|
|
// Cleanup entries for language packs that aren't installed anymore
|
|
const cacheDir = join(this.environmentService.userDataPath, 'clp');
|
|
const cacheDirExists = await Promises.exists(cacheDir);
|
|
if (!cacheDirExists) {
|
|
return;
|
|
}
|
|
|
|
const entries = await Promises.readdir(cacheDir);
|
|
for (const entry of entries) {
|
|
if (installed[entry]) {
|
|
this.logService.info(`[language pack cache cleanup]: Skipping folder ${entry}. Language pack still in use.`);
|
|
continue;
|
|
}
|
|
|
|
this.logService.info(`[language pack cache cleanup]: Removing unused language pack: ${entry}`);
|
|
|
|
await Promises.rm(join(cacheDir, entry));
|
|
}
|
|
|
|
const now = Date.now();
|
|
for (const packEntry of Object.keys(installed)) {
|
|
const folder = join(cacheDir, packEntry);
|
|
const entries = await Promises.readdir(folder);
|
|
for (const entry of entries) {
|
|
if (entry === 'tcf.json') {
|
|
continue;
|
|
}
|
|
|
|
const candidate = join(folder, entry);
|
|
const stat = await Promises.stat(candidate);
|
|
if (stat.isDirectory() && (now - stat.mtime.getTime()) > this._DataMaxAge) {
|
|
this.logService.info(`[language pack cache cleanup]: Removing language pack cache folder: ${join(packEntry, entry)}`);
|
|
|
|
await Promises.rm(candidate);
|
|
}
|
|
}
|
|
}
|
|
} catch (error) {
|
|
onUnexpectedError(error);
|
|
}
|
|
}
|
|
}
|