mirror of
https://github.com/flynx/features.js.git
synced 2025-10-29 10:20:09 +00:00
started work on a new algorithm for sorting deps...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
e3708f8ca1
commit
e238d01c72
118
features.js
118
features.js
@ -714,6 +714,124 @@ var FeatureSetProto = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// XXX
|
||||||
|
_buildFeatureList: function(lst){
|
||||||
|
lst = (lst == null || lst == '*') ? this.features : lst
|
||||||
|
lst = lst.constructor !== Array ? [lst] : lst
|
||||||
|
|
||||||
|
var that = this
|
||||||
|
|
||||||
|
var expand = function(target, lst, store, loops, seen){
|
||||||
|
seen = seen || []
|
||||||
|
|
||||||
|
lst
|
||||||
|
.forEach(function(f){
|
||||||
|
// dependency loop detection...
|
||||||
|
if(seen.indexOf(f) >= 0){
|
||||||
|
var loop = seen.slice(seen.indexOf(f)).concat([f])
|
||||||
|
loops
|
||||||
|
&& loops.push(loop)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip already done features...
|
||||||
|
if(f in store){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//var feature = store[f] = that[f]
|
||||||
|
// XXX use exclusive aliases...
|
||||||
|
var feature = that[f]
|
||||||
|
store[f] = feature ?
|
||||||
|
feature[target]
|
||||||
|
: null
|
||||||
|
|
||||||
|
feature
|
||||||
|
&& feature[target]
|
||||||
|
&& expand(target, feature[target] || [], store, loops, seen.concat([f]))
|
||||||
|
})
|
||||||
|
|
||||||
|
return store
|
||||||
|
}
|
||||||
|
|
||||||
|
var loops = []
|
||||||
|
|
||||||
|
// build exclusive groups...
|
||||||
|
// XXX use these as aliases...
|
||||||
|
// ...we need to do this on the build stage to include correct
|
||||||
|
// deps and suggesntions...
|
||||||
|
var exclusive = {}
|
||||||
|
var _exclusive = {}
|
||||||
|
// NOTE: we do not need loop detection active here...
|
||||||
|
Object.keys(expand('exclusive', lst, _exclusive))
|
||||||
|
.forEach(function(k){
|
||||||
|
(_exclusive[k] || [])
|
||||||
|
.forEach(function(e){
|
||||||
|
exclusive[e] = (exclusive[e] || []).concat([k]) }) })
|
||||||
|
|
||||||
|
// feature tree...
|
||||||
|
var features = expand('depends', lst, {}, loops)
|
||||||
|
|
||||||
|
// suggestion list...
|
||||||
|
// NOTE: this stage does not track suggested feature dependencies...
|
||||||
|
// NOTE: we do not need loop detection active here...
|
||||||
|
var suggested = Object.keys(expand('suggested', Object.keys(features), {}))
|
||||||
|
.filter(function(f){ return !(f in features) })
|
||||||
|
// get suggestion dependencies...
|
||||||
|
suggested = expand('depends', suggested, {}, loops)
|
||||||
|
// keep only suggested features..
|
||||||
|
// XXX this might get affected by disabled...
|
||||||
|
Object.keys(suggested)
|
||||||
|
.forEach(function(f){
|
||||||
|
f in features
|
||||||
|
&& (delete suggested[f]) })
|
||||||
|
|
||||||
|
// test applicablity -- we can't do this without an object...
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
// check/resolve for exclusivity conflicts...
|
||||||
|
// XXX this might get affected by disabled...
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
// disabled...
|
||||||
|
// NOTE: this is the last "removal" stage as we only need to obey disable
|
||||||
|
// directives of the live features...
|
||||||
|
// XXX need more explicit disable rules and priorities...
|
||||||
|
// - disabled are handled top-down the tree only removing
|
||||||
|
// features as they are encountered...
|
||||||
|
// XXX should remove the disabled items when linearising the list... (???)
|
||||||
|
var disabled = Object.keys(features)
|
||||||
|
.concat(Object.keys(suggested))
|
||||||
|
.unique()
|
||||||
|
.filter(function(f){ return f[0] == '-' })
|
||||||
|
.map(function(f){
|
||||||
|
// cleanup...
|
||||||
|
delete features[f]
|
||||||
|
delete suggested[f]
|
||||||
|
// normalize feature name...
|
||||||
|
return f.slice(1) })
|
||||||
|
|
||||||
|
/*/ report dependency loops...
|
||||||
|
// XXX a loop error should be raised only when one of the loop elements
|
||||||
|
// is encountered during the linearisation process...
|
||||||
|
// XXX this might get affected by disabled...
|
||||||
|
// XXX should we report this here???
|
||||||
|
loops.length > 0
|
||||||
|
&& loops
|
||||||
|
.forEach(function(loop){
|
||||||
|
console.warn('feature loop detected:\n\t' + loop.join('\n\t\t-> ')) })
|
||||||
|
//*/
|
||||||
|
|
||||||
|
// XXX
|
||||||
|
return {
|
||||||
|
features: features,
|
||||||
|
suggested: suggested,
|
||||||
|
exclusive: exclusive,
|
||||||
|
disabled: disabled,
|
||||||
|
loops: loops,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// .setup(<actions>, [<feature>, ...])
|
// .setup(<actions>, [<feature>, ...])
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user