@@ -16,13 +16,20 @@ import opn = require("opn");
16
16
17
17
import * as commander from "commander" ;
18
18
19
+ const collect = < T > ( value : T , previous : T [ ] ) : T [ ] => {
20
+ return previous . concat ( value ) ;
21
+ } ;
22
+
19
23
commander . version ( process . env . VERSION || "development" )
20
24
. name ( "code-server" )
21
25
. description ( "Run VS Code on a remote server." )
22
26
. option ( "--cert <value>" )
23
27
. option ( "--cert-key <value>" )
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." )
28
+ . option ( "-e, --extensions-dir <dir>" , "Override the main default path for user extensions." )
29
+ . option ( "--builtin-extensions-dir <dir>" , "Override the main default path for built-in extensions." )
30
+ . option ( "--extra-extensions-dir [dir]" , "Path to an extra user extension directory (repeatable)." , collect , [ ] )
31
+ . option ( "--extra-builtin-extensions-dir [dir]" , "Path to an extra built-in extension directory (repeatable)." , collect , [ ] )
32
+ . option ( "-d --user-data-dir <dir>" , "Specifies the directory that user data is kept in, useful when running as root." )
26
33
. option ( "--data-dir <value>" , "DEPRECATED: Use '--user-data-dir' instead. Customize where user-data is stored." )
27
34
. option ( "-h, --host <value>" , "Customize the hostname." , "0.0.0.0" )
28
35
. option ( "-o, --open" , "Open in the browser on startup." , false )
@@ -59,6 +66,9 @@ const bold = (text: string | number): string | number => {
59
66
60
67
readonly userDataDir ?: string ;
61
68
readonly extensionsDir ?: string ;
69
+ readonly builtinExtensionsDir ?: string ;
70
+ readonly extraExtensionsDir ?: string [ ] ;
71
+ readonly extraBuiltinExtensionsDir ?: string [ ] ;
62
72
63
73
readonly dataDir ?: string ;
64
74
readonly password ?: string ;
@@ -84,6 +94,10 @@ const bold = (text: string | number): string | number => {
84
94
85
95
const dataDir = path . resolve ( options . userDataDir || options . dataDir || path . join ( dataHome , "code-server" ) ) ;
86
96
const extensionsDir = options . extensionsDir ? path . resolve ( options . extensionsDir ) : path . resolve ( dataDir , "extensions" ) ;
97
+ const builtInExtensionsDir = options . builtinExtensionsDir ? path . resolve ( options . builtinExtensionsDir )
98
+ : path . resolve ( buildDir || path . join ( __dirname , ".." ) , "build/extensions" ) ;
99
+ const extraExtensionDirs = options . extraExtensionsDir ? options . extraExtensionsDir . map ( ( p ) => path . resolve ( p ) ) : [ ] ;
100
+ const extraBuiltinExtensionDirs = options . extraBuiltinExtensionsDir ? options . extraBuiltinExtensionsDir . map ( ( p ) => path . resolve ( p ) ) : [ ] ;
87
101
const workingDir = path . resolve ( args [ 0 ] || process . cwd ( ) ) ;
88
102
const dependenciesDir = path . join ( os . tmpdir ( ) , "code-server/dependencies" ) ;
89
103
@@ -99,8 +113,11 @@ const bold = (text: string | number): string | number => {
99
113
fse . mkdirp ( cacheHome ) ,
100
114
fse . mkdirp ( dataDir ) ,
101
115
fse . mkdirp ( extensionsDir ) ,
116
+ fse . mkdirp ( builtInExtensionsDir ) ,
102
117
fse . mkdirp ( workingDir ) ,
103
118
fse . mkdirp ( dependenciesDir ) ,
119
+ ...extraExtensionDirs . map ( ( p ) => fse . mkdirp ( p ) ) ,
120
+ ...extraBuiltinExtensionDirs . map ( ( p ) => fse . mkdirp ( p ) ) ,
104
121
] ) ;
105
122
106
123
const unpackExecutable = ( binaryName : string ) : void => {
@@ -116,7 +133,6 @@ const bold = (text: string | number): string | number => {
116
133
// tslint:disable-next-line no-any
117
134
( < any > global ) . RIPGREP_LOCATION = path . join ( dependenciesDir , "rg" ) ;
118
135
119
- const builtInExtensionsDir = path . resolve ( buildDir || path . join ( __dirname , ".." ) , "build/extensions" ) ;
120
136
if ( options . bootstrapFork ) {
121
137
const modulePath = options . bootstrapFork ;
122
138
if ( ! modulePath ) {
@@ -192,7 +208,7 @@ const bold = (text: string | number): string | number => {
192
208
// TODO: fill in appropriate doc url
193
209
logger . info ( "Additional documentation: http://github.com/cdr/code-server" ) ;
194
210
logger . info ( "Initializing" , field ( "data-dir" , dataDir ) , field ( "extensions-dir" , extensionsDir ) , field ( "working-dir" , workingDir ) , field ( "log-dir" , logDir ) ) ;
195
- const sharedProcess = new SharedProcess ( dataDir , extensionsDir , builtInExtensionsDir ) ;
211
+ const sharedProcess = new SharedProcess ( dataDir , extensionsDir , builtInExtensionsDir , extraExtensionDirs , extraBuiltinExtensionDirs ) ;
196
212
const sendSharedProcessReady = ( socket : WebSocket ) : void => {
197
213
const active = new SharedProcessActive ( ) ;
198
214
active . setSocketPath ( sharedProcess . socketPath ) ;
@@ -247,6 +263,8 @@ const bold = (text: string | number): string | number => {
247
263
serverOptions : {
248
264
extensionsDirectory : extensionsDir ,
249
265
builtInExtensionsDirectory : builtInExtensionsDir ,
266
+ extraExtensionDirectories : extraExtensionDirs ,
267
+ extraBuiltinExtensionDirectories : extraBuiltinExtensionDirs ,
250
268
dataDirectory : dataDir ,
251
269
workingDirectory : workingDir ,
252
270
cacheDirectory : cacheHome ,
0 commit comments