Skip to content

Commit 4af84fc

Browse files
kylecarbscode-asher
authored andcommitted
Add flags for customizing user data dir and extensions dir (#420)
* Add flags for customizing extensions directory * Update @coder/nbin
1 parent c607015 commit 4af84fc

File tree

12 files changed

+73
-14
lines changed

12 files changed

+73
-14
lines changed

packages/protocol/src/browser/client.ts

+1
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ export class Client {
271271
workingDirectory: init.getWorkingDirectory(),
272272
os: protoToOperatingSystem(init.getOperatingSystem()),
273273
shell: init.getShell(),
274+
extensionsDirectory: init.getExtensionsDirectory(),
274275
builtInExtensionsDirectory: init.getBuiltinExtensionsDir(),
275276
};
276277
this.initDataEmitter.emit(this._initData);

packages/protocol/src/common/connection.ts

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface InitData {
2323
readonly homeDirectory: string;
2424
readonly tmpDirectory: string;
2525
readonly shell: string;
26+
readonly extensionsDirectory: string;
2627
readonly builtInExtensionsDirectory: string;
2728
}
2829

packages/protocol/src/node/server.ts

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface ServerOptions {
1414
readonly dataDirectory: string;
1515
readonly cacheDirectory: string;
1616
readonly builtInExtensionsDirectory: string;
17+
readonly extensionsDirectory: string;
1718
readonly fork?: ForkProvider;
1819
}
1920

@@ -93,6 +94,7 @@ export class Server {
9394
initMsg.setDataDirectory(this.options.dataDirectory);
9495
initMsg.setWorkingDirectory(this.options.workingDirectory);
9596
initMsg.setBuiltinExtensionsDir(this.options.builtInExtensionsDirectory);
97+
initMsg.setExtensionsDirectory(this.options.extensionsDirectory);
9698
initMsg.setHomeDirectory(os.homedir());
9799
initMsg.setTmpDirectory(os.tmpdir());
98100
initMsg.setOperatingSystem(platformToProto(os.platform()));

packages/protocol/src/proto/client.proto

+1
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ message WorkingInit {
4141
OperatingSystem operating_system = 5;
4242
string shell = 6;
4343
string builtin_extensions_dir = 7;
44+
string extensions_directory = 8;
4445
}

packages/protocol/src/proto/client_pb.d.ts

+4
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ export class WorkingInit extends jspb.Message {
132132
getBuiltinExtensionsDir(): string;
133133
setBuiltinExtensionsDir(value: string): void;
134134

135+
getExtensionsDirectory(): string;
136+
setExtensionsDirectory(value: string): void;
137+
135138
serializeBinary(): Uint8Array;
136139
toObject(includeInstance?: boolean): WorkingInit.AsObject;
137140
static toObject(includeInstance: boolean, msg: WorkingInit): WorkingInit.AsObject;
@@ -151,6 +154,7 @@ export namespace WorkingInit {
151154
operatingSystem: WorkingInit.OperatingSystem,
152155
shell: string,
153156
builtinExtensionsDir: string,
157+
extensionsDirectory: string,
154158
}
155159

156160
export enum OperatingSystem {

packages/protocol/src/proto/client_pb.js

+28-1
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,8 @@ proto.WorkingInit.toObject = function(includeInstance, msg) {
794794
workingDirectory: jspb.Message.getFieldWithDefault(msg, 4, ""),
795795
operatingSystem: jspb.Message.getFieldWithDefault(msg, 5, 0),
796796
shell: jspb.Message.getFieldWithDefault(msg, 6, ""),
797-
builtinExtensionsDir: jspb.Message.getFieldWithDefault(msg, 7, "")
797+
builtinExtensionsDir: jspb.Message.getFieldWithDefault(msg, 7, ""),
798+
extensionsDirectory: jspb.Message.getFieldWithDefault(msg, 8, "")
798799
};
799800

800801
if (includeInstance) {
@@ -859,6 +860,10 @@ proto.WorkingInit.deserializeBinaryFromReader = function(msg, reader) {
859860
var value = /** @type {string} */ (reader.readString());
860861
msg.setBuiltinExtensionsDir(value);
861862
break;
863+
case 8:
864+
var value = /** @type {string} */ (reader.readString());
865+
msg.setExtensionsDirectory(value);
866+
break;
862867
default:
863868
reader.skipField();
864869
break;
@@ -937,6 +942,13 @@ proto.WorkingInit.serializeBinaryToWriter = function(message, writer) {
937942
f
938943
);
939944
}
945+
f = message.getExtensionsDirectory();
946+
if (f.length > 0) {
947+
writer.writeString(
948+
8,
949+
f
950+
);
951+
}
940952
};
941953

942954

@@ -1054,4 +1066,19 @@ proto.WorkingInit.prototype.setBuiltinExtensionsDir = function(value) {
10541066
};
10551067

10561068

1069+
/**
1070+
* optional string extensions_directory = 8;
1071+
* @return {string}
1072+
*/
1073+
proto.WorkingInit.prototype.getExtensionsDirectory = function() {
1074+
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, ""));
1075+
};
1076+
1077+
1078+
/** @param {string} value */
1079+
proto.WorkingInit.prototype.setExtensionsDirectory = function(value) {
1080+
jspb.Message.setProto3StringField(this, 8, value);
1081+
};
1082+
1083+
10571084
goog.object.extend(exports, proto);

packages/server/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"build:binary": "ts-node scripts/nbin.ts"
1010
},
1111
"dependencies": {
12-
"@coder/nbin": "^1.0.4",
12+
"@coder/nbin": "^1.0.5",
1313
"commander": "^2.19.0",
1414
"express": "^4.16.4",
1515
"express-static-gzip": "^1.1.3",

packages/server/src/cli.ts

+17-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ commander.version(process.env.VERSION || "development")
2121
.description("Run VS Code on a remote server.")
2222
.option("--cert <value>")
2323
.option("--cert-key <value>")
24-
.option("-d, --data-dir <value>", "Customize where user-data is stored.")
24+
.option("-e, --extensions-dir <dir>", "Set the root path for extensions.")
25+
.option("-d --user-data-dir <dir>", " Specifies the directory that user data is kept in, useful when running as root.")
26+
.option("--data-dir <value>", "DEPRECATED: Use '--user-data-dir' instead. Customize where user-data is stored.")
2527
.option("-h, --host <value>", "Customize the hostname.", "0.0.0.0")
2628
.option("-o, --open", "Open in the browser on startup.", false)
2729
.option("-p, --port <number>", "Port to bind on.", 8443)
@@ -51,6 +53,9 @@ const bold = (text: string | number): string | number => {
5153
readonly host: string;
5254
readonly port: number;
5355

56+
readonly userDataDir?: string;
57+
readonly extensionsDir?: string;
58+
5459
readonly dataDir?: string;
5560
readonly password?: string;
5661
readonly open?: boolean;
@@ -67,7 +72,8 @@ const bold = (text: string | number): string | number => {
6772
const noAuthValue = (commander as any).auth;
6873
options.noAuth = !noAuthValue;
6974

70-
const dataDir = path.resolve(options.dataDir || path.join(dataHome, "code-server"));
75+
const dataDir = path.resolve(options.userDataDir || options.dataDir || path.join(dataHome, "code-server"));
76+
const extensionsDir = options.extensionsDir ? path.resolve(options.extensionsDir) : path.resolve(dataDir, "extensions");
7177
const workingDir = path.resolve(args[0] || process.cwd());
7278

7379
if (!fs.existsSync(dataDir)) {
@@ -81,6 +87,7 @@ const bold = (text: string | number): string | number => {
8187
await Promise.all([
8288
fse.mkdirp(cacheHome),
8389
fse.mkdirp(dataDir),
90+
fse.mkdirp(extensionsDir),
8491
fse.mkdirp(workingDir),
8592
]);
8693

@@ -144,10 +151,15 @@ const bold = (text: string | number): string | number => {
144151
}
145152

146153
logger.info(`\u001B[1mcode-server ${process.env.VERSION ? `v${process.env.VERSION}` : "development"}`);
154+
155+
if (options.dataDir) {
156+
logger.warn('"--data-dir" is deprecated. Use "--user-data-dir" instead.');
157+
}
158+
147159
// TODO: fill in appropriate doc url
148160
logger.info("Additional documentation: http://github.com/codercom/code-server");
149-
logger.info("Initializing", field("data-dir", dataDir), field("working-dir", workingDir), field("log-dir", logDir));
150-
const sharedProcess = new SharedProcess(dataDir, builtInExtensionsDir);
161+
logger.info("Initializing", field("data-dir", dataDir), field("extensions-dir", extensionsDir), field("working-dir", workingDir), field("log-dir", logDir));
162+
const sharedProcess = new SharedProcess(dataDir, extensionsDir, builtInExtensionsDir);
151163
const sendSharedProcessReady = (socket: WebSocket): void => {
152164
const active = new SharedProcessActive();
153165
active.setSocketPath(sharedProcess.socketPath);
@@ -196,6 +208,7 @@ const bold = (text: string | number): string | number => {
196208
}
197209
},
198210
serverOptions: {
211+
extensionsDirectory: extensionsDir,
199212
builtInExtensionsDirectory: builtInExtensionsDir,
200213
dataDirectory: dataDir,
201214
workingDirectory: workingDir,

packages/server/src/vscode/sharedProcess.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export class SharedProcess {
3838

3939
public constructor(
4040
private readonly userDataDir: string,
41+
private readonly extensionsDir: string,
4142
private readonly builtInExtensionsDir: string,
4243
) {
4344
this.retry.run();
@@ -95,10 +96,8 @@ export class SharedProcess {
9596
this.activeProcess.kill();
9697
}
9798

98-
const extensionsDir = path.join(this.userDataDir, "extensions");
9999
const backupsDir = path.join(this.userDataDir, "Backups");
100100
await Promise.all([
101-
fse.mkdirp(extensionsDir),
102101
fse.mkdirp(backupsDir),
103102
]);
104103

@@ -141,7 +140,7 @@ export class SharedProcess {
141140
args: {
142141
"builtin-extensions-dir": this.builtInExtensionsDir,
143142
"user-data-dir": this.userDataDir,
144-
"extensions-dir": extensionsDir,
143+
"extensions-dir": this.extensionsDir,
145144
},
146145
logLevel: this.logger.level,
147146
sharedIPCHandle: this.socketPath,

packages/server/yarn.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
resolved "https://registry.yarnpkg.com/@coder/logger/-/logger-1.0.3.tgz#e0e1ae5496fde5a3c6ef3d748fdfb26a55add8b8"
88
integrity sha512-1o5qDZX2VZUNnzgz5KfAdMnaqaX6FNeTs0dUdg73MRHfQW94tFTIryFC1xTTCuzxGDjVHOHkaUAI4uHA2bheOA==
99

10-
"@coder/nbin@^1.0.4":
11-
version "1.0.4"
12-
resolved "https://registry.yarnpkg.com/@coder/nbin/-/nbin-1.0.4.tgz#13a3d110fe116ed5d5fdbd1384f0335745dfd859"
13-
integrity sha512-mtd5hzPHWBwKpTCYdJdLdiY4CFCEb8HUtv3NgH8SSLFiPDwY7H1UlpqeamIty27NZ+9NLnrBd/DfaE3aVo7rxQ==
10+
"@coder/nbin@^1.0.5":
11+
version "1.0.5"
12+
resolved "https://registry.yarnpkg.com/@coder/nbin/-/nbin-1.0.5.tgz#6a9e9982eb179d6bcc9c2e7dfebb608b7c4605d9"
13+
integrity sha512-rai1/WgvH2j8SlRweOSk0JmrAzBx8bc22P+pThnPHj5terd0GScshqNR3EIoL/cdC2Ii4wjfOYodYbl/QynYGg==
1414
dependencies:
1515
"@coder/logger" "^1.0.3"
1616
fs-extra "^7.0.1"

packages/vscode/src/fill/environmentService.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export class EnvironmentService extends environment.EnvironmentService {
88
}
99

1010
public get extensionsPath(): string {
11-
return path.join(paths.getAppDataPath(), "extensions");
11+
return paths.getExtensionsDirectory();
1212
}
1313
}
1414

packages/vscode/src/fill/paths.ts

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ class Paths {
44
private _appData: string | undefined;
55
private _defaultUserData: string | undefined;
66
private _socketPath: string | undefined;
7+
private _extensionsDirectory: string | undefined;
78
private _builtInExtensionsDirectory: string | undefined;
89
private _workingDirectory: string | undefined;
910

@@ -31,6 +32,14 @@ class Paths {
3132
return this._socketPath;
3233
}
3334

35+
public get extensionsDirectory(): string {
36+
if (!this._extensionsDirectory) {
37+
throw new Error("trying to access extensions directory before it has been set");
38+
}
39+
40+
return this._extensionsDirectory;
41+
}
42+
3443
public get builtInExtensionsDirectory(): string {
3544
if (!this._builtInExtensionsDirectory) {
3645
throw new Error("trying to access builtin extensions directory before it has been set");
@@ -52,6 +61,7 @@ class Paths {
5261
this._appData = data.dataDirectory;
5362
this._defaultUserData = data.dataDirectory;
5463
this._socketPath = sharedData.socketPath;
64+
this._extensionsDirectory = data.extensionsDirectory;
5565
this._builtInExtensionsDirectory = data.builtInExtensionsDirectory;
5666
this._workingDirectory = data.workingDirectory;
5767
}
@@ -61,5 +71,6 @@ export const _paths = new Paths();
6171
export const getAppDataPath = (): string => _paths.appData;
6272
export const getDefaultUserDataPath = (): string => _paths.defaultUserData;
6373
export const getWorkingDirectory = (): string => _paths.workingDirectory;
74+
export const getExtensionsDirectory = (): string => _paths.extensionsDirectory;
6475
export const getBuiltInExtensionsDirectory = (): string => _paths.builtInExtensionsDirectory;
6576
export const getSocketPath = (): string => _paths.socketPath;

0 commit comments

Comments
 (0)