Merge pull request #1982 from balena-io/allow-shrinkwrap-rebase

Allow rebasing of npm-shrinkwrap
This commit is contained in:
bulldozer-balena[bot] 2020-08-12 15:27:15 +00:00 committed by GitHub
commit 54cceb688f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 37 additions and 20 deletions

3
.gitattributes vendored
View File

@ -10,6 +10,3 @@ doc/cli.markdown text eol=lf
# crlf for the eol conversion test files
tests/test-data/projects/docker-compose/basic/service2/file2-crlf.sh eol=crlf
tests/test-data/projects/no-docker-compose/basic/src/windows-crlf.sh eol=crlf
# Prevent auto merging of the npm-shrinkwrap.json file: see notes in CONTRIBUTING.md
/npm-shrinkwrap.json merge=binary

View File

@ -98,27 +98,18 @@ Meanwhile, as a text (JSON) file, `git` is capable of merging the `npm-shrinkwra
operations like `rebase`, `cherry-pick` and `pull`. But git's automated merge is not the
recommended way of updating the `npm-shrinkwrap.json` file, because it does not take into account
duplicates or conflicts in the dependency tree, or indeed the state of the `package.json` file
(which may have just been merged). In extreme cases, the automated merge may actually result in a
broken installation. For these reasons, automatic merging of the `npm-shrinkwrap.json` was disabled
through the `.gitattributes` file (the "binary merge driver" allows diff'ing but prevents automatic
merging). Operations like `git rebase` may then result in an error like:
```text
$ git rebase master
warning: Cannot merge binary files: npm-shrinkwrap.json (HEAD vs. c34942b9... test)
Auto-merging npm-shrinkwrap.json
CONFLICT (content): Merge conflict in npm-shrinkwrap.json
error: Failed to merge in the changes.
(which may have just been merged). You can improve this by installing the npm merge driver with:
```
npx npm-merge-driver install -g
```
Whether or not there is a merge error, the following commands are the recommended way of updating
and committing the `npm-shrinkwrap.json` file:
```bash
$ rm -rf node_modules # Linux / Mac
$ rmdir /s node_modules # Windows Command Prompt
$ npm checkout master -- npm-shrinkwrap.json # revert it to the master branch state
$ npm install # "cleanly" update the npm-shrinkwrap.json file
$ npm install # fetch the latest modules update the npm-shrinkwrap.json file
$ npm dedupe # deduplicate dependencies from the npm-shrinkwrap.json file
$ npm install # re-add optional dependencies for other platforms that may have been removed by dedupe
$ git add npm-shrinkwrap.json # add it for committing (solve merge errors)
```

View File

@ -409,3 +409,12 @@ export async function catchUncommitted(): Promise<void> {
]);
}
}
export async function testShrinkwrap(): Promise<void> {
if (process.env.DEBUG) {
console.error(`[debug] platform=${process.platform}`);
}
if (process.platform !== 'win32') {
await whichSpawn(path.resolve(__dirname, 'test-lock-deduplicated.sh'));
}
}

View File

@ -21,6 +21,7 @@ import {
buildOclifInstaller,
buildStandaloneZip,
catchUncommitted,
testShrinkwrap,
} from './build-bin';
import {
release,
@ -63,6 +64,7 @@ export async function run(args?: string[]) {
'build:installer': buildOclifInstaller,
'build:standalone': buildStandaloneZip,
'catch-uncommitted': catchUncommitted,
'test-shrinkwrap': testShrinkwrap,
fix1359: updateDescriptionOfReleasesAffectedByIssue1359,
release,
};

View File

@ -0,0 +1,17 @@
#!/bin/bash
set -e
cp npm-shrinkwrap.json npm-shrinkwrap.json.old
npm i
npm dedupe
npm i
if ! diff -q npm-shrinkwrap.json npm-shrinkwrap.json.old > /dev/null; then
rm npm-shrinkwrap.json.old
echo "** npm-shrinkwrap.json was not deduplicated or not fully committed - FAIL **";
echo "** Please run 'npm ci', followed by 'npm dedupe' **";
exit 1;
fi
rm npm-shrinkwrap.json.old

View File

@ -206,7 +206,7 @@ export async function which(program: string): Promise<string> {
*/
export async function whichSpawn(
programName: string,
args: string[],
args?: string[],
): Promise<void> {
const program = await which(programName);
let error: Error | undefined;

View File

@ -58,7 +58,8 @@
"package": "npm run build:fast && npm run build:standalone && npm run build:installer",
"release": "ts-node --transpile-only automation/run.ts release",
"pretest": "npm run build",
"test": "npm run test:source && npm run test:standalone",
"test": "npm run test:shrinkwrap && npm run test:source && npm run test:standalone",
"test:shrinkwrap": "ts-node --transpile-only automation/run.ts test-shrinkwrap",
"test:source": "cross-env BALENA_CLI_TEST_TYPE=source mocha",
"test:standalone": "npm run build:standalone && npm run test:standalone:fast",
"test:standalone:fast": "cross-env BALENA_CLI_TEST_TYPE=standalone mocha",