From 5c8456aaa66e433285a54021a182d8f59eb4f1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Mon, 17 Sep 2018 14:25:49 +0100 Subject: [PATCH] Preserve file data when sha1s match --- .../src/crawlers/__tests__/watchman.test.js | 22 +++++++++++------- .../jest-haste-map/src/crawlers/watchman.js | 23 ++++++++++++++----- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js b/packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js index ebb9574e0974..071acb2fcd32 100644 --- a/packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js +++ b/packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js @@ -223,6 +223,8 @@ describe('watchman watch', () => { }); test('resets the file object when watchman is restarted', () => { + const mockTomatoSha1 = '321f6b7e8bf7f29aab89c5e41a555b1b0baa41a9'; + mockResponse = { 'list-capabilities': { [undefined]: { @@ -244,8 +246,9 @@ describe('watchman watch', () => { name: 'fruits/banana.js', }, { + 'content.sha1hex': mockTomatoSha1, exists: true, - mtime_ms: {toNumber: () => 31}, + mtime_ms: {toNumber: () => 76}, name: 'fruits/tomato.js', }, ], @@ -256,8 +259,10 @@ describe('watchman watch', () => { 'watch-project': WATCH_PROJECT_MOCK, }; - const mockMetadata = ['Banana', 41, 1, ['Raspberry'], null]; - mockFiles.set(BANANA, mockMetadata); + const mockBananaMetadata = ['Banana', 41, 1, ['Raspberry'], null]; + mockFiles.set(BANANA, mockBananaMetadata); + const mockTomatoMetadata = ['Tomato', 31, 1, [], mockTomatoSha1]; + mockFiles.set(TOMATO, mockTomatoMetadata); const clocks = createMap({ [ROOT_MOCK]: 'c:fake-clock:1', @@ -284,17 +289,18 @@ describe('watchman watch', () => { // /fruits/strawberry.js was removed from the file list. expect(data.files).toEqual( createMap({ - [BANANA]: mockMetadata, + [BANANA]: mockBananaMetadata, [KIWI]: ['', 42, 0, [], null], - [TOMATO]: mockFiles.get(TOMATO), + [TOMATO]: ['Tomato', 76, 1, [], mockTomatoSha1], }), ); // Even though the file list was reset, old file objects are still reused - // if no changes have been made. - expect(data.files.get(BANANA)).toBe(mockMetadata); + // if no changes have been made + expect(data.files.get(BANANA)).toBe(mockBananaMetadata); - expect(data.files.get(TOMATO)).toBe(mockFiles.get(TOMATO)); + // Old file objects are not reused if they have a different mtime + expect(data.files.get(TOMATO)).not.toBe(mockTomatoMetadata); }); }); diff --git a/packages/jest-haste-map/src/crawlers/watchman.js b/packages/jest-haste-map/src/crawlers/watchman.js index 684d6eeb55e1..cc7a9dfa6f47 100644 --- a/packages/jest-haste-map/src/crawlers/watchman.js +++ b/packages/jest-haste-map/src/crawlers/watchman.js @@ -169,16 +169,27 @@ module.exports = async function watchmanCrawl( typeof fileData.mtime_ms === 'number' ? fileData.mtime_ms : fileData.mtime_ms.toNumber(); + let sha1hex = fileData['content.sha1hex']; + if (typeof sha1hex !== 'string' || sha1hex.length !== 40) { + sha1hex = null; + } + const existingFileData = data.files.get(name); if (existingFileData && existingFileData[H.MTIME] === mtime) { files.set(name, existingFileData); + } else if ( + existingFileData && + sha1hex && + existingFileData[H.SHA1] === sha1hex + ) { + files.set(name, [ + existingFileData[0], + mtime, + existingFileData[2], + existingFileData[3], + existingFileData[4], + ]); } else { - let sha1hex = fileData['content.sha1hex']; - - if (typeof sha1hex !== 'string' || sha1hex.length !== 40) { - sha1hex = null; - } - // See ../constants.js files.set(name, ['', mtime, 0, [], sha1hex]); }