Skip to content
This repository was archived by the owner on Sep 6, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 8 additions & 11 deletions src/project/FileIndexManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -280,39 +280,36 @@ define(function (require, exports, module) {
* Used by syncFileIndex function to prevent reentrancy
* @private
*/
var _syncFileIndexReentracyGuard = false;
var _ongoingSyncPromise = null;

/**
* Clears and rebuilds all of the fileIndexes and sets _indexListDirty to false
* @return {$.Promise} resolved when index has been updated
*/
function syncFileIndex() {

// TODO (issue 330) - allow multiple calls to syncFileIndex to be batched up so that this code isn't necessary
if (_syncFileIndexReentracyGuard) {
console.error("syncFileIndex cannot be called Recursively");
return;
// If we're already syncing, don't kick off a second one
if (_ongoingSyncPromise) {
return _ongoingSyncPromise;
}

_syncFileIndexReentracyGuard = true;

var rootDir = ProjectManager.getProjectRoot();
if (_indexListDirty) {
PerfUtils.markStart(PerfUtils.FILE_INDEX_MANAGER_SYNC);

_clearIndexes();

return _scanDirectorySubTree(rootDir)
_ongoingSyncPromise = _scanDirectorySubTree(rootDir)
.done(function () {
PerfUtils.addMeasurement(PerfUtils.FILE_INDEX_MANAGER_SYNC);
_indexListDirty = false;
_syncFileIndexReentracyGuard = false;
_ongoingSyncPromise = null;

//_logFileList(_indexList["all"].fileInfos);
//_logFileList(_indexList["css"].fileInfos);
});
return _ongoingSyncPromise;
} else {
_syncFileIndexReentracyGuard = false;
return $.Deferred().resolve().promise();
}
}
Expand Down
37 changes: 36 additions & 1 deletion test/spec/FileIndexManager-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@


/*jslint vars: true, plusplus: true, devel: true, browser: true, nomen: true, indent: 4, maxerr: 50 */
/*global define: false, describe: false, beforeEach: false, afterEach: false, it: false, runs: false, waitsFor: false, expect: false, brackets: false */
/*global define, describe, beforeEach, afterEach, it, runs, waitsFor, waitsForDone, expect, spyOn */

define(function (require, exports, module) {
'use strict';
Expand Down Expand Up @@ -89,6 +89,41 @@ define(function (require, exports, module) {

});

it("should handle simultaneous requests without doing extra work", function () { // #330
// Open a directory
SpecRunnerUtils.loadProjectInTestWindow(testPath);

var projectRoot;
var promise1, promise2;
var allFiles1, allFiles2;
runs(function () {
projectRoot = ProjectManager.getProjectRoot();
spyOn(projectRoot, "createReader").andCallThrough();

// Kick off two index requests in parallel
promise1 = FileIndexManager.getFileInfoList("all")
.done(function (result) {
allFiles1 = result;
});
promise2 = FileIndexManager.getFileInfoList("all")
.done(function (result) {
allFiles2 = result;
});

waitsForDone(promise1, "First FileIndexManager.getFileInfoList()");
waitsForDone(promise2, "Second FileIndexManager.getFileInfoList()");
});

runs(function () {
// Correct response to both promises
expect(allFiles1.length).toEqual(8);
expect(allFiles2.length).toEqual(8);

// Didn't scan project tree twice
expect(projectRoot.createReader.callCount).toBe(1);
});
});

it("should match a specific filename and return the correct FileInfo", function () {
// Open a directory
SpecRunnerUtils.loadProjectInTestWindow(testPath);
Expand Down