MCPcopy Create free account
hub / github.com/XmirrorSecurity/OpenSCA-cli / Flush

Method Flush

opensca/model/dep.go:108–171  ·  view source on GitHub ↗

Flush 更新依赖图依赖关系

()

Source from the content-addressed store, hash-verified

106
107// Flush 更新依赖图依赖关系
108func (dep *DepGraph) Flush() {
109
110 // 删除不在dep依赖图的节点
111 parentMap := map[*DepGraph]bool{}
112 trueParentMap := map[*DepGraph]bool{}
113 dep.ForEachPath(func(p, n *DepGraph) bool {
114 // 记录所有节点的父节点
115 for _, p := range n.Parents {
116 parentMap[p] = true
117 }
118 // 记录在依赖图可遍历路径中的父节点
119 if p != nil {
120 trueParentMap[p] = true
121 }
122 return true
123 })
124 for p := range parentMap {
125 if trueParentMap[p] {
126 continue
127 }
128 // 删除遍历不到的父节点
129 for _, c := range p.Children {
130 p.RemoveChild(c)
131 }
132 }
133
134 // 锁定起始组件dev
135 dep.ForEachNode(func(p, n *DepGraph) bool { n.Expand = nil; return true })
136 dep.ForEachNode(func(p, n *DepGraph) bool {
137 // 起始开发组件状态锁定为开发组件
138 if len(n.Parents) == 0 || n.Develop {
139 n.Expand = struct{}{}
140 }
141 return true
142 })
143
144 // 传递develop
145 dep.ForEachPath(func(p, n *DepGraph) bool {
146 // 组件dev已锁定则跳过
147 if n.Expand != nil {
148 return true
149 }
150 // 传递父组件dev
151 n.Develop = p.Develop
152 // 存在任一父组件为实际引入则锁定组件dev
153 if !p.Develop {
154 n.Expand = struct{}{}
155 }
156 return true
157 })
158
159 // 去除非实际引用的关系
160 dep.ForEachNode(func(p, n *DepGraph) bool {
161 // 非开发组件的父组件为开发组件时 删除和开发父组件依赖关系
162 if !n.Develop {
163 for _, p := range n.Parents {
164 if p.Develop {
165 p.RemoveChild(n)

Callers 1

BuildMethod · 0.95

Calls 3

ForEachPathMethod · 0.95
ForEachNodeMethod · 0.95
RemoveChildMethod · 0.80

Tested by

no test coverage detected