mirror of
https://github.com/meteor/meteor.git
synced 2026-05-02 03:01:46 -04:00
refactor catalog.version to do more O(1) stuff
This commit is contained in:
@@ -24,9 +24,9 @@ var baseCatalog = exports;
|
||||
baseCatalog.BaseCatalog = function () {
|
||||
var self = this;
|
||||
|
||||
// Package server data. Arrays of objects.
|
||||
// Package server data. Mostly arrays of objects.
|
||||
self.packages = null;
|
||||
self.versions = null;
|
||||
self.versions = null; // package name -> version -> object
|
||||
self.builds = null;
|
||||
self.releaseTracks = null;
|
||||
self.releaseVersions = null;
|
||||
@@ -49,7 +49,7 @@ _.extend(baseCatalog.BaseCatalog.prototype, {
|
||||
|
||||
// Initialize everything to its default version.
|
||||
self.packages = [];
|
||||
self.versions = [];
|
||||
self.versions = {};
|
||||
self.builds = [];
|
||||
self.releaseTracks = [];
|
||||
self.releaseVersions = [];
|
||||
@@ -76,10 +76,18 @@ _.extend(baseCatalog.BaseCatalog.prototype, {
|
||||
return;
|
||||
|
||||
_.each(
|
||||
['packages', 'versions', 'builds', 'releaseTracks', 'releaseVersions'],
|
||||
['packages', 'builds', 'releaseTracks', 'releaseVersions'],
|
||||
function (field) {
|
||||
self[field].push.apply(self[field], collections[field]);
|
||||
});
|
||||
|
||||
// Convert versions from array format to nested object format.
|
||||
_.each(collections.versions, function (record) {
|
||||
if (!_.has(self.versions, record.packageName)) {
|
||||
self.versions[record.packageName] = {};
|
||||
}
|
||||
self.versions[record.packageName][record.version] = record;
|
||||
});
|
||||
},
|
||||
|
||||
// Accessor methods below. The primary function of both catalogs is to provide
|
||||
@@ -183,8 +191,10 @@ _.extend(baseCatalog.BaseCatalog.prototype, {
|
||||
getSortedVersions: function (name) {
|
||||
var self = this;
|
||||
self._requireInitialized();
|
||||
var ret = _.pluck(_.where(self.versions, { packageName: name }),
|
||||
'version');
|
||||
if (!_.has(self.versions, name)) {
|
||||
return [];
|
||||
}
|
||||
var ret = _.keys(self.versions[name]);
|
||||
ret.sort(semver.compare);
|
||||
return ret;
|
||||
},
|
||||
@@ -208,8 +218,9 @@ _.extend(baseCatalog.BaseCatalog.prototype, {
|
||||
}
|
||||
|
||||
return self._recordOrRefresh(function () {
|
||||
return _.findWhere(self.versions, { packageName: name,
|
||||
version: version });
|
||||
return _.has(self.versions, name) &&
|
||||
_.has(self.versions[name], version) &&
|
||||
self.versions[name][version];
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -374,13 +374,13 @@ _.extend(CompleteCatalog.prototype, {
|
||||
// Remove all packages from the catalog that have the same name as
|
||||
// a local package, along with all of their versions and builds.
|
||||
var removedVersionIds = {};
|
||||
self.versions = _.filter(self.versions, function (version) {
|
||||
if (_.has(self.effectiveLocalPackages, version.packageName)) {
|
||||
// Remove this one
|
||||
removedVersionIds[version._id] = true;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
_.each(self.effectiveLocalPackages, function (dir, packageName) {
|
||||
if (!_.has(self.versions, packageName))
|
||||
return;
|
||||
_.each(self.versions[packageName], function (record) {
|
||||
removedVersionIds[record._id] = true;
|
||||
});
|
||||
delete self.versions[packageName];
|
||||
});
|
||||
|
||||
self.builds = _.filter(self.builds, function (build) {
|
||||
@@ -465,7 +465,10 @@ _.extend(CompleteCatalog.prototype, {
|
||||
throw new Error("version already has a buildid?");
|
||||
version = version + "+local";
|
||||
|
||||
self.versions.push({
|
||||
if (_.has(self.versions, name))
|
||||
throw Error("should have deleted " + name + " above?");
|
||||
self.versions[name] = {};
|
||||
self.versions[name][version] = {
|
||||
_id: versionId,
|
||||
packageName: name,
|
||||
testName: packageSource.testName,
|
||||
@@ -480,7 +483,7 @@ _.extend(CompleteCatalog.prototype, {
|
||||
published: null,
|
||||
isTest: packageSource.isTest,
|
||||
containsPlugins: packageSource.containsPlugins()
|
||||
});
|
||||
};
|
||||
|
||||
// Test packages are not allowed to have tests. Any time we recurse into
|
||||
// this function, it will be with test marked as true, so recursion
|
||||
|
||||
Reference in New Issue
Block a user