bugfix -- now we cleanout suggested features too...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2017-06-25 08:28:06 +03:00
parent e9566a73b1
commit 3e9576f4f7
2 changed files with 46 additions and 28 deletions

View File

@ -307,7 +307,18 @@ var FeatureSetProto = {
// a dependency) // a dependency)
// //
// //
// return format: // Algorithm:
// - expand features:
// - handle dependencies (detect loops)
// - handle suggestions
// - handle explicitly disabled features (detect loops)
// - handle exclusive feature groups/aliases (handle conflicts)
// - sort list of features:
// - by priority
// - by dependency (detect loops/errors)
//
//
// Return format:
// { // {
// // input feature feature tags... // // input feature feature tags...
// input: [ .. ], // input: [ .. ],
@ -363,22 +374,6 @@ var FeatureSetProto = {
// }, // },
// } // }
// //
//
// Algorithm:
// - expand features:
// - handle dependencies (detect loops)
// - handle suggestions
// - handle explicitly disabled features (detect loops)
// - handle exclusive feature groups/aliases (handle conflicts)
// - sort list of features:
// - by priority
// - by dependency (detect loops/errors)
//
//
// XXX differences to .buildFeatureList(..):
// - order is slightly different -- within expectations...
// - this includes meta-features...
// this seems to be more logical and more flexible...
buildFeatureList: function(lst, filter){ buildFeatureList: function(lst, filter){
var all = this.features var all = this.features
lst = (lst == null || lst == '*') ? all : lst lst = (lst == null || lst == '*') ? all : lst
@ -521,12 +516,13 @@ var FeatureSetProto = {
// //
// NOTE: this stage does not track suggested feature dependencies... // NOTE: this stage does not track suggested feature dependencies...
// NOTE: we do not need loop detection active here... // NOTE: we do not need loop detection active here...
var s = Object.keys( var s = expand('suggested', Object.keys(features), {}, { disabled: disabled })
expand('suggested', Object.keys(features), {}, s = Object.keys(s)
{ .filter(function(f){
disabled: disabled, // populate the tree of feature suggestions...
})) suggests[f] = s[f]
.filter(function(f){ return !(f in features) }) // filter out what's in features already...
return !(f in features) })
// get suggestion dependencies... // get suggestion dependencies...
// NOTE: we do not care bout missing here... // NOTE: we do not care bout missing here...
s = expand('depends', s, {}, s = expand('depends', s, {},
@ -545,6 +541,7 @@ var FeatureSetProto = {
// mix suggested into features... // mix suggested into features...
} else { } else {
features[f] = s[f] features[f] = s[f]
suggested[f] = (s[f] || []).slice()
} }
}) })
@ -558,6 +555,9 @@ var FeatureSetProto = {
var disable_loops = [] var disable_loops = []
var disabled = [] var disabled = []
var missing = [] var missing = []
// XXX
var suggests = {}
var suggested = {}
// user filter... // user filter...
// NOTE: we build this out of the full feature list... // NOTE: we build this out of the full feature list...
@ -657,9 +657,6 @@ var FeatureSetProto = {
var excluded = [] var excluded = []
Object.keys(conflicts) Object.keys(conflicts)
.forEach(function(group){ .forEach(function(group){
// XXX BUG: for some reason this does not behave
// deterministically and in some cases the order
// of the list is not stable...
excluded = excluded.concat(conflicts[group].slice(1))}) excluded = excluded.concat(conflicts[group].slice(1))})
disabled = disabled.concat(excluded) disabled = disabled.concat(excluded)
@ -678,6 +675,7 @@ var FeatureSetProto = {
rev_features[d] = (rev_features[d] || []).concat([f]) }) }) rev_features[d] = (rev_features[d] || []).concat([f]) }) })
// clear dependency trees containing disabled features... // clear dependency trees containing disabled features...
var suggested_clear = []
do { do {
var expanded_disabled = false var expanded_disabled = false
disabled disabled
@ -692,8 +690,26 @@ var FeatureSetProto = {
disabled.push(f) disabled.push(f)
} }
}) })
// delete the feature itself... // delete the feature itself...
var s = suggests[d] || []
delete suggests[d]
delete features[d] delete features[d]
// clear suggested...
s
.forEach(function(f){
if(disabled.indexOf(f) < 0
// not depended/suggested by any of
// the non-disabled features...
&& Object.values(features)
.concat(Object.values(suggests))
.filter(n => n.indexOf(f) >= 0)
.length == 0){
expanded_disabled = true
disabled.push(f)
}
})
}) })
} while(expanded_disabled) } while(expanded_disabled)
@ -709,6 +725,7 @@ var FeatureSetProto = {
// keep features that have no sources left, i.e. orphans... // keep features that have no sources left, i.e. orphans...
.length == 0 }) .length == 0 })
.forEach(function(f){ .forEach(function(f){
console.log('ORPHANED:', f)
disabled.push(f) disabled.push(f)
delete features[f] delete features[f]
}) })
@ -829,7 +846,8 @@ var FeatureSetProto = {
// introspection... // introspection...
depends: features, depends: features,
depended: rev_features, depended: rev_features,
//suggests: suggested, suggests: suggests,
suggested: suggested,
//exclusive: exclusive, //exclusive: exclusive,
} }
}, },

View File

@ -1,6 +1,6 @@
{ {
"name": "ig-features", "name": "ig-features",
"version": "3.1.5", "version": "3.1.6",
"description": "", "description": "",
"main": "features.js", "main": "features.js",
"scripts": { "scripts": {