2018-01-23 15:40:41 +00:00
/ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Copyright ( c ) Microsoft Corporation . All rights reserved .
* Licensed under the MIT License . See License . txt in the project root for license information .
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- * /
'use strict' ;
const fs = require ( 'fs' ) ;
const path = require ( 'path' ) ;
2018-01-29 16:15:22 +00:00
const os = require ( 'os' ) ;
2018-01-29 11:23:43 +00:00
const mkdirp = require ( 'mkdirp' ) ;
const rimraf = require ( 'rimraf' ) ;
const es = require ( 'event-stream' ) ;
const rename = require ( 'gulp-rename' ) ;
const vfs = require ( 'vinyl-fs' ) ;
const ext = require ( './extensions' ) ;
const util = require ( 'gulp-util' ) ;
2018-01-23 15:40:41 +00:00
const root = path . dirname ( path . dirname ( _ _dirname ) ) ;
2018-02-01 13:39:12 +00:00
const builtInExtensions = require ( '../builtInExtensions.json' ) ;
2018-01-29 16:15:22 +00:00
const controlFilePath = path . join ( os . homedir ( ) , '.vscode-oss-dev' , 'extensions' , 'control.json' ) ;
2018-01-29 11:23:43 +00:00
function getExtensionPath ( extension ) {
return path . join ( root , '.build' , 'builtInExtensions' , extension . name ) ;
}
2018-01-23 15:40:41 +00:00
function isUpToDate ( extension ) {
2018-01-29 11:23:43 +00:00
const packagePath = path . join ( getExtensionPath ( extension ) , 'package.json' ) ;
2018-01-23 15:40:41 +00:00
if ( ! fs . existsSync ( packagePath ) ) {
return false ;
}
2018-01-29 11:23:43 +00:00
2018-02-27 14:41:00 +00:00
const packageContents = fs . readFileSync ( packagePath , { encoding : 'utf8' } ) ;
2018-01-29 11:23:43 +00:00
2018-01-23 15:40:41 +00:00
try {
const diskVersion = JSON . parse ( packageContents ) . version ;
return ( diskVersion === extension . version ) ;
2018-01-29 11:23:43 +00:00
} catch ( err ) {
2018-01-23 15:40:41 +00:00
return false ;
}
}
2018-01-29 11:23:43 +00:00
function syncMarketplaceExtension ( extension ) {
if ( isUpToDate ( extension ) ) {
util . log ( util . colors . blue ( '[marketplace]' ) , ` ${ extension . name } @ ${ extension . version } ` , util . colors . green ( '✔︎' ) ) ;
return es . readArray ( [ ] ) ;
}
rimraf . sync ( getExtensionPath ( extension ) ) ;
return ext . fromMarketplace ( extension . name , extension . version )
. pipe ( rename ( p => p . dirname = ` ${ extension . name } / ${ p . dirname } ` ) )
. pipe ( vfs . dest ( '.build/builtInExtensions' ) )
. on ( 'end' , ( ) => util . log ( util . colors . blue ( '[marketplace]' ) , extension . name , util . colors . green ( '✔︎' ) ) ) ;
}
function syncExtension ( extension , controlState ) {
switch ( controlState ) {
case 'disabled' :
util . log ( util . colors . blue ( '[disabled]' ) , util . colors . gray ( extension . name ) ) ;
return es . readArray ( [ ] ) ;
case 'marketplace' :
return syncMarketplaceExtension ( extension ) ;
default :
if ( ! fs . existsSync ( controlState ) ) {
util . log ( util . colors . red ( ` Error: Built-in extension ' ${ extension . name } ' is configured to run from ' ${ controlState } ' but that path does not exist. ` ) ) ;
return es . readArray ( [ ] ) ;
} else if ( ! fs . existsSync ( path . join ( controlState , 'package.json' ) ) ) {
util . log ( util . colors . red ( ` Error: Built-in extension ' ${ extension . name } ' is configured to run from ' ${ controlState } ' but there is no 'package.json' file in that directory. ` ) ) ;
return es . readArray ( [ ] ) ;
}
2018-01-29 21:04:27 +00:00
util . log ( util . colors . blue ( '[local]' ) , ` ${ extension . name } : ${ util . colors . cyan ( controlState ) } ` , util . colors . green ( '✔︎' ) ) ;
2018-01-29 11:23:43 +00:00
return es . readArray ( [ ] ) ;
2018-01-23 15:40:41 +00:00
}
2018-01-29 11:23:43 +00:00
}
function readControlFile ( ) {
try {
return JSON . parse ( fs . readFileSync ( controlFilePath , 'utf8' ) ) ;
} catch ( err ) {
return { } ;
}
}
function writeControlFile ( control ) {
mkdirp . sync ( path . dirname ( controlFilePath ) ) ;
fs . writeFileSync ( controlFilePath , JSON . stringify ( control , null , 2 ) ) ;
}
function main ( ) {
util . log ( 'Syncronizing built-in extensions...' ) ;
2018-01-29 21:04:27 +00:00
util . log ( ` You can manage built-in extensions with the ${ util . colors . cyan ( '--builtin' ) } flag ` ) ;
2018-01-29 11:23:43 +00:00
const control = readControlFile ( ) ;
const streams = [ ] ;
for ( const extension of builtInExtensions ) {
let controlState = control [ extension . name ] || 'marketplace' ;
control [ extension . name ] = controlState ;
streams . push ( syncExtension ( extension , controlState ) ) ;
}
writeControlFile ( control ) ;
es . merge ( streams )
. on ( 'error' , err => {
console . error ( err ) ;
process . exit ( 1 ) ;
} )
. on ( 'end' , ( ) => {
process . exit ( 0 ) ;
} ) ;
}
main ( ) ;