Skip to content

Commit

Permalink
get git sha on install (#61)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
justinwoo authored Aug 10, 2023
1 parent bd858d0 commit 0196d2e
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 5 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:

strategy:
matrix:
node-version: [10.x, 12.x]
node-version: [18.x, 20.x]

steps:
- uses: actions/checkout@v2
Expand All @@ -30,7 +30,7 @@ jobs:

strategy:
matrix:
node-version: [10.x, 12.x]
node-version: [18.x, 20.x]

steps:
- uses: actions/checkout@v2
Expand All @@ -51,7 +51,7 @@ jobs:

strategy:
matrix:
node-version: [10.x, 12.x]
node-version: [18.x, 20.x]

steps:
- uses: actions/checkout@v2
Expand Down
40 changes: 38 additions & 2 deletions report.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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

Expand All @@ -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()) {
Expand Down Expand Up @@ -512,8 +546,10 @@ module.exports = {
tmpFileName,
dirName,
processDependencyTreeOutput,
processGitRevParseOutput,
npmExecPath,
getDependencyInfo,
getGitShaFromRootPath,
reportPostInstall,
hashWithDefault,
findScarfInFullDependencyTree
Expand Down
10 changes: 10 additions & 0 deletions test/report.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 () {
Expand Down

0 comments on commit 0196d2e

Please sign in to comment.