From 0196d2e30f1e0585c199b643bdf59db4a7f67172 Mon Sep 17 00:00:00 2001 From: Justin Woo Date: Thu, 10 Aug 2023 20:19:09 +0300 Subject: [PATCH] get git sha on install (#61) * get git sha on install * we should only inject sha if the root package allows top level * only get the git sha from root when root = parent * fix up parentIsRoot to be safe against optional values * update runner matrix to supported node.js versions see https://github.com/nodejs/Release/tree/7b8e0ac1b97b4ce4057e64ae024995052408926a#release-schedule * update runner matrix to supported node.js versions see https://github.com/nodejs/Release/tree/7b8e0ac1b97b4ce4057e64ae024995052408926a#release-schedule --- .github/workflows/main.yml | 6 +++--- report.js | 40 ++++++++++++++++++++++++++++++++++++-- test/report.test.js | 10 ++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7fec59b..3d1db32 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x] + node-version: [18.x, 20.x] steps: - uses: actions/checkout@v2 @@ -30,7 +30,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x] + node-version: [18.x, 20.x] steps: - uses: actions/checkout@v2 @@ -51,7 +51,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x] + node-version: [18.x, 20.x] steps: - uses: actions/checkout@v2 diff --git a/report.js b/report.js index 42a3d76..d3b01e0 100644 --- a/report.js +++ b/report.js @@ -74,8 +74,8 @@ function skipTraversal (rootPackage) { } function parentIsRoot (dependencyToReport) { - return dependencyToReport.parent.name === dependencyToReport.rootPackage.name && - dependencyToReport.parent.version === dependencyToReport.rootPackage.version + return dependencyToReport?.parent?.name === dependencyToReport?.rootPackage?.name && + dependencyToReport?.parent?.version === dependencyToReport?.rootPackage?.version } function isTopLevel (dependencyToReport) { @@ -193,6 +193,22 @@ function processDependencyTreeOutput (resolve, reject) { } } +function processGitRevParseOutput (resolve, reject) { + return function (error, stdout, stderr) { + if (error && !stdout) { + return reject(new Error(`Scarf received an error from git rev-parse: ${error} | ${stderr}`)) + } + + const output = String(stdout).trim() + + if (output.length > 0) { + return resolve(output) + } else { + return reject(new Error('Scarf did not receive usable output from git rev-parse')) + } + } +} + // packageJSONOverride: a test convenience to set a packageJSON explicitly. // Leave empty to use the actual root package.json. async function getDependencyInfo (packageJSONOverride) { @@ -226,6 +242,18 @@ async function getDependencyInfo (packageJSONOverride) { }) } +async function getGitShaFromRootPath () { + const promise = new Promise((resolve, reject) => { + exec(`cd ${rootPath} && git rev-parse HEAD`, { timeout: execTimeout, maxBuffer: 1024 * 1024 * 1024 }, processGitRevParseOutput(resolve, reject)) + }) + try { + return await promise + } catch (e) { + logIfVerbose(e) + return undefined + } +} + async function reportPostInstall () { const scarfApiToken = process.env.SCARF_API_TOKEN @@ -235,6 +263,12 @@ async function reportPostInstall () { return Promise.reject(new Error('No parent found, nothing to report')) } + if (parentIsRoot(dependencyInfo) && allowTopLevel(dependencyInfo.rootPackage)) { + const gitSha = await getGitShaFromRootPath() + logIfVerbose(`Injecting sha to parent: ${gitSha}`) + dependencyInfo.parent.gitSha = gitSha + } + const rootPackage = dependencyInfo.rootPackage if (!userHasOptedIn(rootPackage) && isYarn()) { @@ -512,8 +546,10 @@ module.exports = { tmpFileName, dirName, processDependencyTreeOutput, + processGitRevParseOutput, npmExecPath, getDependencyInfo, + getGitShaFromRootPath, reportPostInstall, hashWithDefault, findScarfInFullDependencyTree diff --git a/test/report.test.js b/test/report.test.js index 575d416..2d0463b 100644 --- a/test/report.test.js +++ b/test/report.test.js @@ -147,6 +147,16 @@ describe('Reporting tests', () => { return report.processDependencyTreeOutput(resolve, reject)(null, JSON.stringify(parsedLsOutput), null) })).rejects.toEqual(new Error('The package depending on Scarf is the root package being installed, but Scarf is not configured to run in this case. To enable it, set `scarfSettings.allowTopLevel = true` in your package.json')) }) + + test('Can parse example git rev-parse HEAD output', async () => { + await expect(new Promise((resolve, reject) => { + return report.processGitRevParseOutput(resolve, reject)(null, '9ace16b9e3833ad4e761a49f17fe607723d5bd5e\n', null) + })).resolves.toEqual('9ace16b9e3833ad4e761a49f17fe607723d5bd5e') + }) + + test('getGitShaFromRootPath resolves in test run of cloned repository', async () => { + await expect(report.getGitShaFromRootPath()).resolves.toBeTruthy() + }) }) function dependencyTreeScarfEnabled () {