|
1 | | -import packageinfotypes, developfile, packageinfo, version, tables, strformat, strutils |
| 1 | +import tables, strformat, sequtils, algorithm, cli |
| 2 | +import packageinfotypes, developfile, packageinfo, version |
2 | 3 |
|
3 | 4 | type |
4 | 5 | DependencyNode = ref object of RootObj |
@@ -33,20 +34,122 @@ proc depsRecursive*(pkgInfo: PackageInfo, |
33 | 34 |
|
34 | 35 | proc printDepsHumanReadable*(pkgInfo: PackageInfo, |
35 | 36 | dependencies: seq[PackageInfo], |
36 | | - level: int, |
37 | | - errors: ValidationErrors) = |
| 37 | + errors: ValidationErrors, |
| 38 | + levelInfos: seq[tuple[skip: bool]] = @[] |
| 39 | + ) = |
| 40 | + ## print human readable tree deps |
| 41 | + ## |
| 42 | + if levelInfos.len() == 0: |
| 43 | + displayLineReset() |
| 44 | + displayInfo("Dependency tree format: {PackageName} {Requirements} (@{Resolved Version})") |
| 45 | + displayFormatted(Hint, "\n") |
| 46 | + displayFormatted(Message, pkgInfo.basicInfo.name, " ") |
| 47 | + displayFormatted(Success, "(@", $pkgInfo.basicInfo.version, ")") |
| 48 | + |
| 49 | + var requires: seq[(string, VersionRange, bool, PackageInfo)] |
| 50 | + for idx, (name, ver) in pkgInfo.requires.sorted(): |
| 51 | + var depPkgInfo = initPackageInfo() |
| 52 | + let |
| 53 | + found = dependencies.findPkg((name, ver), depPkgInfo) |
| 54 | + packageName = if found: depPkgInfo.basicInfo.name else: name |
| 55 | + requires.add((packageName, ver, found, depPkgInfo)) |
| 56 | + |
| 57 | + proc reqCmp[T](x, y: T): int = cmp(x[0], y[0]) |
| 58 | + requires.sort(reqCmp) |
| 59 | + |
| 60 | + for idx, (packageName, ver, found, depPkgInfo) in requires: |
| 61 | + let |
| 62 | + isLast = idx == pkgInfo.requires.len() - 1 |
| 63 | + |
| 64 | + displayFormatted(Hint, "\n") |
| 65 | + for levelInfo in levelInfos: |
| 66 | + if levelInfo.skip: |
| 67 | + displayFormatted(Hint, " ") |
| 68 | + else: |
| 69 | + displayFormatted(Hint, "│ ") |
| 70 | + if not isLast: |
| 71 | + displayFormatted(Hint, "├── ") |
| 72 | + else: |
| 73 | + displayFormatted(Hint, "└── ") |
| 74 | + displayFormatted(Message, packageName) |
| 75 | + displayFormatted(Hint, " ") |
| 76 | + displayFormatted(Warning, if ver.kind == verAny: "@any" else: $ver) |
| 77 | + displayFormatted(Hint, " ") |
| 78 | + if found: |
| 79 | + displayFormatted(Success, fmt"(@{depPkgInfo.basicInfo.version})") |
| 80 | + if errors.contains(packageName): |
| 81 | + let errMsg = getValidationErrorMessage(packageName, errors.getOrDefault packageName) |
| 82 | + displayFormatted(Error, fmt" - error: {errMsg}") |
| 83 | + if found: |
| 84 | + var levelInfos = levelInfos & @[(skip: isLast)] |
| 85 | + printDepsHumanReadable(depPkgInfo, dependencies, errors, levelInfos) |
| 86 | + if levelInfos.len() == 0: |
| 87 | + displayFormatted(Hint, "\n") |
| 88 | + |
| 89 | +proc printDepsHumanReadableInverted*(pkgInfo: PackageInfo, |
| 90 | + dependencies: seq[PackageInfo], |
| 91 | + errors: ValidationErrors, |
| 92 | + pkgs = newTable[string, TableRef[string, VersionRange]](), |
| 93 | + ) = |
| 94 | + ## print human readable tree deps |
| 95 | + ## |
| 96 | + let |
| 97 | + parent = pkgInfo.basicInfo.name |
| 98 | + isRoot = pkgs.len() == 0 |
| 99 | + |
| 100 | + if isRoot: |
| 101 | + displayInfo("Dependency tree format: {PackageName} (@{Resolved Version})") |
| 102 | + displayInfo("Dependency tree format: {Source Package} {Source Requirements}") |
| 103 | + displayFormatted(Hint, "\n") |
| 104 | + displayFormatted(Message, pkgInfo.basicInfo.name, " ") |
| 105 | + displayFormatted(Success, "(@", $pkgInfo.basicInfo.version, ")") |
| 106 | + displayFormatted(Hint, "\n") |
| 107 | + |
38 | 108 | for (name, ver) in pkgInfo.requires: |
39 | 109 | var depPkgInfo = initPackageInfo() |
40 | 110 | let |
41 | 111 | found = dependencies.findPkg((name, ver), depPkgInfo) |
42 | 112 | packageName = if found: depPkgInfo.basicInfo.name else: name |
43 | 113 |
|
44 | | - echo " ".repeat(level * 2), |
45 | | - packageName, |
46 | | - if ver.kind == verAny: "@any" else: " " & $ver, |
47 | | - if found: fmt "(resolved {depPkgInfo.basicInfo.version})" else: "", |
48 | | - if errors.contains(packageName): |
49 | | - " - error: " & getValidationErrorMessage(packageName, errors.getOrDefault packageName) |
| 114 | + pkgs.mgetOrPut(packageName, newTable[string, VersionRange]())[parent] = ver |
| 115 | + |
| 116 | + if found: |
| 117 | + printDepsHumanReadableInverted(depPkgInfo, dependencies, errors, pkgs) |
| 118 | + |
| 119 | + if isRoot: |
| 120 | + # for pkg, info in pkgs: |
| 121 | + for idx, name in pkgs.keys().toSeq().sorted(): |
| 122 | + let |
| 123 | + info = pkgs[name] |
| 124 | + isOuterLast = idx == pkgs.len() - 1 |
| 125 | + if not isOuterLast: |
| 126 | + displayFormatted(Hint, "├── ") |
50 | 127 | else: |
51 | | - "" |
52 | | - if found: printDepsHumanReadable(depPkgInfo, dependencies, level + 1, errors) |
| 128 | + displayFormatted(Hint, "└── ") |
| 129 | + displayFormatted(Message, name, " ") |
| 130 | + displayFormatted(Success, "(@", $pkgInfo.basicInfo.version, ")") |
| 131 | + displayFormatted(Hint, "\n") |
| 132 | + # echo "name: ", pkg, " info: ", $info |
| 133 | + # for idx, (source, ver) in info.pairs().toSeq(): |
| 134 | + proc printOuter() = |
| 135 | + if not isOuterLast: |
| 136 | + displayFormatted(Hint, "│ ") |
| 137 | + else: |
| 138 | + displayFormatted(Hint, " ") |
| 139 | + for idx, source in info.keys().toSeq().sorted(): |
| 140 | + let |
| 141 | + ver = info[source] |
| 142 | + isLast = idx == info.len() - 1 |
| 143 | + |
| 144 | + if not isLast: |
| 145 | + printOuter() |
| 146 | + displayFormatted(Hint, "╟── ") |
| 147 | + else: |
| 148 | + printOuter() |
| 149 | + displayFormatted(Hint, "╙── ") |
| 150 | + displayFormatted(Warning, if ver.kind == verAny: "@any" else: $ver) |
| 151 | + displayFormatted(Hint, " ") |
| 152 | + displayFormatted(Message, source) |
| 153 | + displayFormatted(Hint, "\n") |
| 154 | + displayFormatted(Hint, "\n") |
| 155 | + |
0 commit comments