Force reeval of env vars if group/flow/global envs change

This commit is contained in:
Nick O'Leary
2023-07-10 12:04:52 +01:00
parent 3209777aba
commit 7481b78b16
3 changed files with 90 additions and 34 deletions

View File

@@ -34,8 +34,11 @@ function diffNodes(oldNode,newNode) {
if (oldNode == null) {
return true;
}
var oldKeys = Object.keys(oldNode).filter(function(p) { return p != "x" && p != "y" && p != "wires" });
var newKeys = Object.keys(newNode).filter(function(p) { return p != "x" && p != "y" && p != "wires" });
const keyFilter = p => p != 'x' && p != 'y' && p != 'wires'
const groupKeyFilter = p => keyFilter(p) && p != 'nodes' && p != 'style' && p != 'w' && p != 'h'
var oldKeys = Object.keys(oldNode).filter(oldNode.type === 'group' ? groupKeyFilter : keyFilter);
var newKeys = Object.keys(newNode).filter(newNode.type === 'group' ? groupKeyFilter : keyFilter);
if (oldKeys.length != newKeys.length) {
return true;
}
@@ -354,10 +357,9 @@ function diffConfigs(oldConfig, newConfig) {
var removed = {};
var changed = {};
var wiringChanged = {};
var globalConfigChanged = false;
var linkMap = {};
var changedTabs = {};
var allNestedGroups = []
// Look for tabs that have been removed
for (id in oldConfig.flows) {
@@ -372,7 +374,6 @@ function diffConfigs(oldConfig, newConfig) {
var originalState = oldConfig.flows[id].disabled||false;
var newState = newConfig.flows[id].disabled||false;
if (originalState !== newState) {
changedTabs[id] = true;
if (originalState) {
added[id] = oldConfig.allNodes[id];
} else {
@@ -435,6 +436,9 @@ function diffConfigs(oldConfig, newConfig) {
delete changed[id];
}
}
if (newConfig.allNodes[id].type === 'global-config') {
globalConfigChanged = true
}
}
// This node's wiring has changed
if (!redUtil.compareObjects(node.wires,newConfig.allNodes[id].wires)) {
@@ -450,6 +454,10 @@ function diffConfigs(oldConfig, newConfig) {
}
}
}
} else {
if (JSON.stringify(node.env) !== JSON.stringify(newConfig.allNodes[id].env)) {
changed[id] = newConfig.allNodes[id];
}
}
}
}
@@ -457,6 +465,20 @@ function diffConfigs(oldConfig, newConfig) {
for (id in newConfig.allNodes) {
if (newConfig.allNodes.hasOwnProperty(id)) {
node = newConfig.allNodes[id];
if (node.type === 'group') {
if (node.g) {
allNestedGroups.push(node)
}
if (changed[node.id]) {
if (node.nodes) {
node.nodes.forEach(nid => {
if (!changed[nid]) {
changed[nid] = true
}
})
}
}
}
// build the map of what this node is now wired to
if (node.wires) {
linkMap[node.id] = linkMap[node.id] || [];
@@ -550,6 +572,26 @@ function diffConfigs(oldConfig, newConfig) {
}
}
// Recursively mark all children of changed groups as changed
do {
madeChange = false
for (let i = 0; i < allNestedGroups.length; i++) {
const group = allNestedGroups[i]
if (!changed[group.id] && group.g && changed[group.g]) {
changed[group.id] = true
madeChange = true
}
if (changed[group.id] && group.nodes) {
group.nodes.forEach(nid => {
if (!changed[nid]) {
changed[nid] = true
madeChange = true
}
})
}
}
} while(madeChange)
// Recursively mark all instances of changed subflows as changed
var changedSubflowStack = Object.keys(changedSubflows);
while (changedSubflowStack.length > 0) {
@@ -575,12 +617,15 @@ function diffConfigs(oldConfig, newConfig) {
}
}
var diff = {
added:Object.keys(added),
changed:Object.keys(changed),
removed:Object.keys(removed),
rewired:Object.keys(wiringChanged),
linked:[]
linked:[],
globalConfigChanged
}
// Traverse the links of all modified nodes to mark the connected nodes
@@ -600,13 +645,15 @@ function diffConfigs(oldConfig, newConfig) {
}
// console.log(diff);
// for (id in newConfig.allNodes) {
// console.log(
// (added[id]?"a":(changed[id]?"c":" "))+(wiringChanged[id]?"w":" ")+(diff.linked.indexOf(id)!==-1?"l":" "),
// newConfig.allNodes[id].type.padEnd(10),
// id.padEnd(16),
// (newConfig.allNodes[id].z||"").padEnd(16),
// newConfig.allNodes[id].name||newConfig.allNodes[id].label||""
// );
// if (added[id] || changed[id] || wiringChanged[id] || diff.linked.indexOf(id)!==-1) {
// console.log(
// (added[id]?"a":(changed[id]?"c":" "))+(wiringChanged[id]?"w":" ")+(diff.linked.indexOf(id)!==-1?"l":" "),
// newConfig.allNodes[id].type.padEnd(10),
// id.padEnd(16),
// (newConfig.allNodes[id].z||"").padEnd(16),
// newConfig.allNodes[id].name||newConfig.allNodes[id].label||""
// );
// }
// }
// for (id in removed) {
// console.log(