| 170 | } |
| 171 | |
| 172 | func newTreeNode(d *detail.DepDetailGraph) *tview.TreeNode { |
| 173 | |
| 174 | // 组件信息文本 |
| 175 | dev := "" |
| 176 | if d.Develop { |
| 177 | dev = "<dev>" |
| 178 | } |
| 179 | dep := fmt.Sprintf("%s:%s", d.Name, d.Version) |
| 180 | if d.Vendor != "" { |
| 181 | dep = fmt.Sprintf("%s:%s", d.Vendor, dep) |
| 182 | } |
| 183 | info := fmt.Sprintf("%s%s<%s>", dev, dep, d.Language) |
| 184 | |
| 185 | // 当前节点 |
| 186 | n := tview.NewTreeNode(info) |
| 187 | |
| 188 | // 没有子依赖则不展开 |
| 189 | if len(d.Children) == 0 { |
| 190 | n.SetExpanded(false) |
| 191 | } |
| 192 | |
| 193 | n.SetColor(colorDep) |
| 194 | if len(d.Vulnerabilities) > 0 { |
| 195 | n.SetColor(colorVulDep) |
| 196 | } |
| 197 | if d.Develop { |
| 198 | n.SetColor(colorDevDep) |
| 199 | } |
| 200 | |
| 201 | // 路径 |
| 202 | if len(d.Paths) > 0 { |
| 203 | color := colorPath |
| 204 | if d.Develop { |
| 205 | color = colorDevDep |
| 206 | } |
| 207 | paths := tview.NewTreeNode("paths").SetColor(color).SetExpanded(!n.IsExpanded()) |
| 208 | for _, p := range d.Paths { |
| 209 | paths.AddChild(tview.NewTreeNode(p).SetColor(color)) |
| 210 | } |
| 211 | n.AddChild(paths) |
| 212 | } |
| 213 | |
| 214 | // 许可证 |
| 215 | if len(d.Licenses) > 0 { |
| 216 | color := colorLicense |
| 217 | if d.Develop { |
| 218 | color = colorDevDep |
| 219 | } |
| 220 | license := tview.NewTreeNode("license").SetColor(color).SetExpanded(!n.IsExpanded()) |
| 221 | for _, lic := range d.Licenses { |
| 222 | license.AddChild(tview.NewTreeNode(lic.ShortName).SetColor(color)) |
| 223 | } |
| 224 | n.AddChild(license) |
| 225 | } |
| 226 | |
| 227 | // 漏洞 |
| 228 | if len(d.Vulnerabilities) > 0 { |
| 229 | color := colorVul |