Skip to content

Commit 547dcea

Browse files
scotthovestadtSimenB
authored andcommitted
Optimize haste map tracking of deleted files with Watchman. (#8056)
* Optimize haste map tracking of deprecated files with Watchman. * Fix issue with not-fresh Watchman. * Update change log. * deprecatedFiles -> removedFiles * deprecated file -> removed file in comments/test descriptions. * Resolve lint error.
1 parent 3e32813 commit 547dcea

7 files changed

Lines changed: 204 additions & 92 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@
9494

9595
### Performance
9696

97+
- `[jest-haste-map]` Optimize haste map tracking of deleted files with Watchman. ([#8056](https://github.com/facebook/jest/pull/8056))
98+
9799
## 24.1.0
98100

99101
### Features

packages/jest-haste-map/src/__tests__/index.test.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ jest.mock('../crawlers/watchman', () =>
4040

4141
const {data, ignore, rootDir, roots, computeSha1} = options;
4242
const list = mockChangedFiles || mockFs;
43+
const removedFiles = new Map();
4344

4445
data.clocks = mockClocks;
4546

@@ -51,12 +52,19 @@ jest.mock('../crawlers/watchman', () =>
5152

5253
data.files.set(relativeFilePath, ['', 32, 42, 0, [], hash]);
5354
} else {
54-
data.files.delete(relativeFilePath);
55+
const fileData = data.files.get(relativeFilePath);
56+
if (fileData) {
57+
removedFiles.set(relativeFilePath, fileData);
58+
data.files.delete(relativeFilePath);
59+
}
5560
}
5661
}
5762
}
5863

59-
return Promise.resolve(data);
64+
return Promise.resolve({
65+
hasteMap: data,
66+
removedFiles,
67+
});
6068
}),
6169
);
6270

@@ -416,7 +424,10 @@ describe('HasteMap', () => {
416424
'vegetables/Melon.js': ['Melon', 32, 42, 0, [], null],
417425
});
418426

419-
return Promise.resolve(data);
427+
return Promise.resolve({
428+
hasteMap: data,
429+
removedFiles: new Map(),
430+
});
420431
});
421432

422433
const hasteMap = new HasteMap({
@@ -543,7 +554,7 @@ describe('HasteMap', () => {
543554
...defaultConfig,
544555
})
545556
.build()
546-
.catch(({__hasteMapForTest: data}) => {
557+
.catch(() => {
547558
expect(console.error.mock.calls[0][0]).toMatchSnapshot();
548559
});
549560
});
@@ -979,7 +990,7 @@ describe('HasteMap', () => {
979990
mockImpl(options).then(() => {
980991
const {data} = options;
981992
data.files.set('fruits/invalid/file.js', ['', 34, 44, 0, []]);
982-
return data;
993+
return {hasteMap: data, removedFiles: new Map()};
983994
}),
984995
);
985996
return new HasteMap(defaultConfig)
@@ -1077,7 +1088,10 @@ describe('HasteMap', () => {
10771088
data.files = createMap({
10781089
'fruits/Banana.js': ['', 32, 42, 0, [], null],
10791090
});
1080-
return Promise.resolve(data);
1091+
return Promise.resolve({
1092+
hasteMap: data,
1093+
removedFiles: new Map(),
1094+
});
10811095
});
10821096

10831097
return new HasteMap(defaultConfig)
@@ -1108,7 +1122,10 @@ describe('HasteMap', () => {
11081122
data.files = createMap({
11091123
'fruits/Banana.js': ['', 32, 42, 0, [], null],
11101124
});
1111-
return Promise.resolve(data);
1125+
return Promise.resolve({
1126+
hasteMap: data,
1127+
removedFiles: new Map(),
1128+
});
11121129
});
11131130

11141131
return new HasteMap(defaultConfig)

packages/jest-haste-map/src/crawlers/__tests__/node.test.js

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ describe('node crawler', () => {
114114
ignore: pearMatcher,
115115
rootDir,
116116
roots: ['/project/fruits', '/project/vegtables'],
117-
}).then(data => {
117+
}).then(({hasteMap, removedFiles}) => {
118118
expect(childProcess.spawn).lastCalledWith('find', [
119119
'/project/fruits',
120120
'/project/vegtables',
@@ -129,15 +129,17 @@ describe('node crawler', () => {
129129
')',
130130
]);
131131

132-
expect(data.files).not.toBe(null);
132+
expect(hasteMap.files).not.toBe(null);
133133

134-
expect(data.files).toEqual(
134+
expect(hasteMap.files).toEqual(
135135
createMap({
136136
'fruits/strawberry.js': ['', 32, 42, 0, [], null],
137137
'fruits/tomato.js': ['', 33, 42, 0, [], null],
138138
'vegetables/melon.json': ['', 34, 42, 0, [], null],
139139
}),
140140
);
141+
142+
expect(removedFiles).toEqual(new Map());
141143
});
142144

143145
return promise;
@@ -161,16 +163,52 @@ describe('node crawler', () => {
161163
ignore: pearMatcher,
162164
rootDir,
163165
roots: ['/project/fruits'],
164-
}).then(data => {
165-
expect(data.files).toEqual(
166+
}).then(({hasteMap, removedFiles}) => {
167+
expect(hasteMap.files).toEqual(
166168
createMap({
167169
'fruits/strawberry.js': ['', 32, 42, 0, [], null],
168170
'fruits/tomato.js': tomato,
169171
}),
170172
);
171173

172174
// Make sure it is the *same* unchanged object.
173-
expect(data.files.get('fruits/tomato.js')).toBe(tomato);
175+
expect(hasteMap.files.get('fruits/tomato.js')).toBe(tomato);
176+
177+
expect(removedFiles).toEqual(new Map());
178+
});
179+
});
180+
181+
it('returns removed files', () => {
182+
process.platform = 'linux';
183+
184+
nodeCrawl = require('../node');
185+
186+
// In this test sample, previouslyExisted was present before and will not be
187+
// when crawling this directory.
188+
const files = createMap({
189+
'fruits/previouslyExisted.js': ['', 30, 40, 1, [], null],
190+
'fruits/strawberry.js': ['', 33, 42, 0, [], null],
191+
'fruits/tomato.js': ['', 32, 42, 0, [], null],
192+
});
193+
194+
return nodeCrawl({
195+
data: {files},
196+
extensions: ['js'],
197+
ignore: pearMatcher,
198+
rootDir,
199+
roots: ['/project/fruits'],
200+
}).then(({hasteMap, removedFiles}) => {
201+
expect(hasteMap.files).toEqual(
202+
createMap({
203+
'fruits/strawberry.js': ['', 32, 42, 0, [], null],
204+
'fruits/tomato.js': ['', 33, 42, 0, [], null],
205+
}),
206+
);
207+
expect(removedFiles).toEqual(
208+
createMap({
209+
'fruits/previouslyExisted.js': ['', 30, 40, 1, [], null],
210+
}),
211+
);
174212
});
175213
});
176214

@@ -187,13 +225,14 @@ describe('node crawler', () => {
187225
ignore: pearMatcher,
188226
rootDir,
189227
roots: ['/project/fruits'],
190-
}).then(data => {
191-
expect(data.files).toEqual(
228+
}).then(({hasteMap, removedFiles}) => {
229+
expect(hasteMap.files).toEqual(
192230
createMap({
193231
'fruits/directory/strawberry.js': ['', 33, 42, 0, [], null],
194232
'fruits/tomato.js': ['', 32, 42, 0, [], null],
195233
}),
196234
);
235+
expect(removedFiles).toEqual(new Map());
197236
});
198237
});
199238

@@ -210,13 +249,14 @@ describe('node crawler', () => {
210249
ignore: pearMatcher,
211250
rootDir,
212251
roots: ['/project/fruits'],
213-
}).then(data => {
214-
expect(data.files).toEqual(
252+
}).then(({hasteMap, removedFiles}) => {
253+
expect(hasteMap.files).toEqual(
215254
createMap({
216255
'fruits/directory/strawberry.js': ['', 33, 42, 0, [], null],
217256
'fruits/tomato.js': ['', 32, 42, 0, [], null],
218257
}),
219258
);
259+
expect(removedFiles).toEqual(new Map());
220260
});
221261
});
222262

@@ -233,8 +273,9 @@ describe('node crawler', () => {
233273
ignore: pearMatcher,
234274
rootDir,
235275
roots: [],
236-
}).then(data => {
237-
expect(data.files).toEqual(new Map());
276+
}).then(({hasteMap, removedFiles}) => {
277+
expect(hasteMap.files).toEqual(new Map());
278+
expect(removedFiles).toEqual(new Map());
238279
});
239280
});
240281

@@ -250,8 +291,9 @@ describe('node crawler', () => {
250291
ignore: pearMatcher,
251292
rootDir,
252293
roots: ['/error'],
253-
}).then(data => {
254-
expect(data.files).toEqual(new Map());
294+
}).then(({hasteMap, removedFiles}) => {
295+
expect(hasteMap.files).toEqual(new Map());
296+
expect(removedFiles).toEqual(new Map());
255297
});
256298
});
257299
});

0 commit comments

Comments
 (0)