Fix revision bundling

Summary:
This fixes headless not terminating due to the `package.json` not being readable.
I instead write this to the `global` object in the same way that the version is
set.

Reviewed By: jknoxville

Differential Revision: D14579316

fbshipit-source-id: 238afe912366c423552305e120088f4abac4c20b
This commit is contained in:
Pascal Hartig
2019-03-22 10:35:30 -07:00
committed by Facebook Github Bot
parent 57a24769e8
commit 939cc531e2
5 changed files with 26 additions and 14 deletions

View File

@@ -15,16 +15,19 @@ const {
compile, compile,
compileDefaultPlugins, compileDefaultPlugins,
getVersionNumber, getVersionNumber,
genMercurialRevision,
} = require('./build-utils.js'); } = require('./build-utils.js');
const PLUGINS_FOLDER_NAME = 'plugins'; const PLUGINS_FOLDER_NAME = 'plugins';
function preludeBundle(dir, versionNumber) { function preludeBundle(dir, versionNumber, buildRevision) {
const revisionStr =
buildRevision == null ? '' : `global.__REVISION__="${buildRevision}";`;
return new Promise((resolve, reject) => return new Promise((resolve, reject) =>
lineReplace({ lineReplace({
file: path.join(dir, 'bundle.js'), file: path.join(dir, 'bundle.js'),
line: 1, line: 1,
text: `var __DEV__=false; global.electronRequire = require; global.performance = require("perf_hooks").performance;global.__VERSION__="${versionNumber}";`, text: `var __DEV__=false; global.electronRequire = require; global.performance = require("perf_hooks").performance;global.__VERSION__="${versionNumber}";${revisionStr}`,
addNewLine: true, addNewLine: true,
callback: resolve, callback: resolve,
}), }),
@@ -52,7 +55,7 @@ async function createZip(buildDir, distDir, targets) {
// write zip file // write zip file
zip.outputStream zip.outputStream
.pipe(fs.createWriteStream(path.join(distDir, `Flipper-headless.zip`))) .pipe(fs.createWriteStream(path.join(distDir, 'Flipper-headless.zip')))
.on('close', resolve); .on('close', resolve);
zip.end(); zip.end();
}); });
@@ -88,7 +91,8 @@ async function createZip(buildDir, distDir, targets) {
console.log('Created build directory', buildDir); console.log('Created build directory', buildDir);
await compile(buildDir, path.join(__dirname, '..', 'headless', 'index.js')); await compile(buildDir, path.join(__dirname, '..', 'headless', 'index.js'));
const versionNumber = getVersionNumber(); const versionNumber = getVersionNumber();
await preludeBundle(buildDir, versionNumber); const buildRevision = await genMercurialRevision();
await preludeBundle(buildDir, versionNumber, buildRevision);
await compileDefaultPlugins(path.join(buildDir, PLUGINS_FOLDER_NAME)); await compileDefaultPlugins(path.join(buildDir, PLUGINS_FOLDER_NAME));
await createBinary([ await createBinary([
path.join(buildDir, 'bundle.js'), path.join(buildDir, 'bundle.js'),

View File

@@ -7,14 +7,15 @@
const path = require('path'); const path = require('path');
const fs = require('fs-extra'); const fs = require('fs-extra');
const builder = require('electron-builder'); const builder = require('electron-builder');
const cp = require('child-process-es6-promise');
const Platform = builder.Platform; const Platform = builder.Platform;
const cp = require('child-process-es6-promise');
const { const {
buildFolder, buildFolder,
compile, compile,
die, die,
compileDefaultPlugins, compileDefaultPlugins,
getVersionNumber, getVersionNumber,
genMercurialRevision,
} = require('./build-utils.js'); } = require('./build-utils.js');
function generateManifest(versionNumber) { function generateManifest(versionNumber) {
@@ -31,14 +32,6 @@ function generateManifest(versionNumber) {
); );
} }
// Asynchronously determine current mercurial revision as string or `null` in case of any error.
function genMercurialRevision() {
return cp
.spawn('hg', ['log', '-r', '.', '-T', '{node}'])
.catch(err => null)
.then(res => (res && res.stdout) || null);
}
function modifyPackageManifest(buildFolder, versionNumber, hgRevision) { function modifyPackageManifest(buildFolder, versionNumber, hgRevision) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log('Creating package.json manifest'); console.log('Creating package.json manifest');

View File

@@ -10,6 +10,7 @@ const compilePlugins = require('../static/compilePlugins');
const tmp = require('tmp'); const tmp = require('tmp');
const path = require('path'); const path = require('path');
const fs = require('fs-extra'); const fs = require('fs-extra');
const cp = require('child-process-es6-promise');
function die(err) { function die(err) {
console.error(err.stack); console.error(err.stack);
@@ -98,10 +99,19 @@ function getVersionNumber() {
return version; return version;
} }
// Asynchronously determine current mercurial revision as string or `null` in case of any error.
function genMercurialRevision() {
return cp
.spawn('hg', ['log', '-r', '.', '-T', '{node}'])
.catch(err => null)
.then(res => (res && res.stdout) || null);
}
module.exports = { module.exports = {
buildFolder, buildFolder,
compile, compile,
die, die,
compileDefaultPlugins, compileDefaultPlugins,
getVersionNumber, getVersionNumber,
genMercurialRevision,
}; };

View File

@@ -23,6 +23,10 @@ const getPackageJSON = async () => {
export const readCurrentRevision: () => Promise<?string> = lodash.memoize( export const readCurrentRevision: () => Promise<?string> = lodash.memoize(
async () => { async () => {
// This is provided as part of the bundling process for headless.
if (global.__REVISION__) {
return global.__REVISION__;
}
const json = await getPackageJSON(); const json = await getPackageJSON();
return json.revision; return json.revision;
}, },

View File

@@ -11,7 +11,8 @@
}, },
app: { app: {
getVersion: function() {return global.__VERSION__ || '1';}, getVersion: function() {return global.__VERSION__ || '1';},
getName: function() {return '';} getName: function() {return '';},
getAppPath: function() {return process.cwd();}
}, },
shell: { shell: {
openExternal: function() {} openExternal: function() {}