Переглянути джерело

feat(linux): use XDG_STATE_HOME for logs (#2636)

Baptiste Augrain 3 днів тому
батько
коміт
c0d5246c70
1 змінених файлів з 123 додано та 0 видалено
  1. 123 0
      patches/linux/feat-logs-home.patch

+ 123 - 0
patches/linux/feat-logs-home.patch

@@ -0,0 +1,123 @@
+diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts
+index 4a14c83..59c963b 100644
+--- a/src/vs/platform/environment/common/environment.ts
++++ b/src/vs/platform/environment/common/environment.ts
+@@ -137,2 +137,3 @@ export interface INativeEnvironmentService extends IEnvironmentService {
+ 	userDataPath: string;
++	userStatePath: string;
+ 
+diff --git a/src/vs/platform/environment/common/environmentService.ts b/src/vs/platform/environment/common/environmentService.ts
+index 535132f..edd76bc 100644
+--- a/src/vs/platform/environment/common/environmentService.ts
++++ b/src/vs/platform/environment/common/environmentService.ts
+@@ -28,2 +28,4 @@ export interface INativeEnvironmentPaths {
+ 
++	userStateDir: string;
++
+ 	/**
+@@ -54,2 +56,5 @@ export abstract class AbstractNativeEnvironmentService implements INativeEnviron
+ 
++	@memoize
++	get userStatePath(): string { return this.paths.userStateDir; }
++
+ 	@memoize
+@@ -75,3 +80,3 @@ export abstract class AbstractNativeEnvironmentService implements INativeEnviron
+ 			const key = toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, '');
+-			this.args.logsPath = join(this.userDataPath, 'logs', key);
++			this.args.logsPath = join(this.userStatePath, key);
+ 		}
+diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts
+index ae9e7e1..3c6c6c5 100644
+--- a/src/vs/platform/environment/node/environmentService.ts
++++ b/src/vs/platform/environment/node/environmentService.ts
+@@ -11,2 +11,3 @@ import { getUserDataPath } from './userDataPath.js';
+ import { IProductService } from '../../product/common/productService.js';
++import { getUserStatePath } from './userStatePath.js';
+ 
+@@ -18,3 +19,4 @@ export class NativeEnvironmentService extends AbstractNativeEnvironmentService {
+ 			tmpDir: tmpdir(),
+-			userDataDir: getUserDataPath(args, productService.nameShort)
++			userDataDir: getUserDataPath(args, productService.nameShort),
++			userStateDir: getUserStatePath(args, productService.nameShort)
+ 		}, productService);
+diff --git a/src/vs/platform/environment/node/userStatePath.ts b/src/vs/platform/environment/node/userStatePath.ts
+new file mode 100644
+index 0000000..53f9e2f
+--- /dev/null
++++ b/src/vs/platform/environment/node/userStatePath.ts
+@@ -0,0 +1,42 @@
++import { homedir } from 'os';
++import { NativeParsedArgs } from '../common/argv.js';
++
++import { resolve, isAbsolute, join } from 'path';
++
++const cwd = process.env['VSCODE_CWD'] || process.cwd();
++
++export function getUserStatePath(cliArgs: NativeParsedArgs, productName: string): string {
++	const userStatePath = doGetUserStatePath(cliArgs, productName);
++	const pathsToResolve = [userStatePath];
++
++	if (!isAbsolute(userStatePath)) {
++		pathsToResolve.unshift(cwd);
++	}
++
++	return resolve(...pathsToResolve);
++}
++
++function doGetUserStatePath(cliArgs: NativeParsedArgs, productName: string): string {
++
++	// 0. Running out of sources has a fixed productName
++	if (process.env['VSCODE_DEV']) {
++		productName = 'code-oss-dev';
++	}
++
++	// 1. Support portable mode
++	const portablePath = process.env['VSCODE_PORTABLE'];
++	if (portablePath) {
++		return join(portablePath, 'user-state');
++	}
++
++	// 2. Support global VSCODE_APPSTATE environment variable
++	let appStatePath = process.env['VSCODE_APPSTATE'];
++	if (appStatePath) {
++		return join(appStatePath, productName);
++	}
++
++	// 4. Otherwise
++	appStatePath = process.env['XDG_STATE_HOME'] || join(homedir(), '.local', 'state');
++
++	return join(appStatePath, productName);
++}
+diff --git a/src/vs/platform/window/common/window.ts b/src/vs/platform/window/common/window.ts
+index fa297d1..839fd60 100644
+--- a/src/vs/platform/window/common/window.ts
++++ b/src/vs/platform/window/common/window.ts
+@@ -443,2 +443,3 @@ export interface INativeWindowConfiguration extends IWindowConfiguration, Native
+ 	userDataDir: string;
++	userStateDir: string;
+ 
+diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts
+index 117dfd2..6b0458b 100644
+--- a/src/vs/platform/windows/electron-main/windowsMainService.ts
++++ b/src/vs/platform/windows/electron-main/windowsMainService.ts
+@@ -1511,2 +1511,3 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
+ 			userDataDir: this.environmentMainService.userDataPath,
++			userStateDir: this.environmentMainService.userStatePath,
+ 
+diff --git a/src/vs/workbench/services/environment/electron-browser/environmentService.ts b/src/vs/workbench/services/environment/electron-browser/environmentService.ts
+index 6cfa517..46286c6 100644
+--- a/src/vs/workbench/services/environment/electron-browser/environmentService.ts
++++ b/src/vs/workbench/services/environment/electron-browser/environmentService.ts
+@@ -153,3 +153,3 @@ export class NativeWorkbenchEnvironmentService extends AbstractNativeEnvironment
+ 	) {
+-		super(configuration, { homeDir: configuration.homeDir, tmpDir: configuration.tmpDir, userDataDir: configuration.userDataDir }, productService);
++		super(configuration, { homeDir: configuration.homeDir, tmpDir: configuration.tmpDir, userDataDir: configuration.userDataDir, userStateDir: configuration.userStateDir }, productService);
+ 	}
+diff --git a/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts b/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts
+index 6b7307e..c74476a 100644
+--- a/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts
++++ b/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts
+@@ -74,2 +74,3 @@ const TestNativeWindowConfiguration: INativeWindowConfiguration = {
+ 	userDataDir: joinPath(homeDir, product.nameShort).fsPath,
++	userStateDir: joinPath(homeDir, product.nameShort).fsPath,
+ 	profiles: { profile: NULL_PROFILE, all: [NULL_PROFILE], home: homeDir },