@@ -16,13 +16,20 @@ import opn = require("opn");
1616
1717import * as commander from "commander" ;
1818
19+ const collect = < T > ( value : T , previous : T [ ] ) : T [ ] => {
20+ return previous . concat ( value ) ;
21+ } ;
22+
1923commander . version ( process . env . VERSION || "development" )
2024 . name ( "code-server" )
2125 . description ( "Run VS Code on a remote server." )
2226 . option ( "--cert <value>" )
2327 . 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." )
2633 . option ( "--data-dir <value>" , "DEPRECATED: Use '--user-data-dir' instead. Customize where user-data is stored." )
2734 . option ( "-h, --host <value>" , "Customize the hostname." , "0.0.0.0" )
2835 . option ( "-o, --open" , "Open in the browser on startup." , false )
@@ -59,6 +66,9 @@ const bold = (text: string | number): string | number => {
5966
6067 readonly userDataDir ?: string ;
6168 readonly extensionsDir ?: string ;
69+ readonly builtinExtensionsDir ?: string ;
70+ readonly extraExtensionsDir ?: string [ ] ;
71+ readonly extraBuiltinExtensionsDir ?: string [ ] ;
6272
6373 readonly dataDir ?: string ;
6474 readonly password ?: string ;
@@ -84,6 +94,10 @@ const bold = (text: string | number): string | number => {
8494
8595 const dataDir = path . resolve ( options . userDataDir || options . dataDir || path . join ( dataHome , "code-server" ) ) ;
8696 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 ) ) : [ ] ;
87101 const workingDir = path . resolve ( args [ 0 ] || process . cwd ( ) ) ;
88102 const dependenciesDir = path . join ( os . tmpdir ( ) , "code-server/dependencies" ) ;
89103
@@ -99,8 +113,11 @@ const bold = (text: string | number): string | number => {
99113 fse . mkdirp ( cacheHome ) ,
100114 fse . mkdirp ( dataDir ) ,
101115 fse . mkdirp ( extensionsDir ) ,
116+ fse . mkdirp ( builtInExtensionsDir ) ,
102117 fse . mkdirp ( workingDir ) ,
103118 fse . mkdirp ( dependenciesDir ) ,
119+ ...extraExtensionDirs . map ( ( p ) => fse . mkdirp ( p ) ) ,
120+ ...extraBuiltinExtensionDirs . map ( ( p ) => fse . mkdirp ( p ) ) ,
104121 ] ) ;
105122
106123 const unpackExecutable = ( binaryName : string ) : void => {
@@ -116,7 +133,6 @@ const bold = (text: string | number): string | number => {
116133 // tslint:disable-next-line no-any
117134 ( < any > global ) . RIPGREP_LOCATION = path . join ( dependenciesDir , "rg" ) ;
118135
119- const builtInExtensionsDir = path . resolve ( buildDir || path . join ( __dirname , ".." ) , "build/extensions" ) ;
120136 if ( options . bootstrapFork ) {
121137 const modulePath = options . bootstrapFork ;
122138 if ( ! modulePath ) {
@@ -192,7 +208,7 @@ const bold = (text: string | number): string | number => {
192208 // TODO: fill in appropriate doc url
193209 logger . info ( "Additional documentation: http://github.com/cdr/code-server" ) ;
194210 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 ) ;
196212 const sendSharedProcessReady = ( socket : WebSocket ) : void => {
197213 const active = new SharedProcessActive ( ) ;
198214 active . setSocketPath ( sharedProcess . socketPath ) ;
@@ -247,6 +263,8 @@ const bold = (text: string | number): string | number => {
247263 serverOptions : {
248264 extensionsDirectory : extensionsDir ,
249265 builtInExtensionsDirectory : builtInExtensionsDir ,
266+ extraExtensionDirectories : extraExtensionDirs ,
267+ extraBuiltinExtensionDirectories : extraBuiltinExtensionDirs ,
250268 dataDirectory : dataDir ,
251269 workingDirectory : workingDir ,
252270 cacheDirectory : cacheHome ,
0 commit comments