|
63 | 63 | versions: seq[PackageMinimalInfo]
|
64 | 64 |
|
65 | 65 | VersionAttempt = tuple[pkgName: string, version: Version]
|
| 66 | + SATState* = object |
| 67 | + pkgList*: seq[PackageInfo] |
| 68 | + pkgVersions*: Table[string, PackageVersions] |
| 69 | + solvedPkgs*: seq[SolvedPackage] |
| 70 | + solution*: HashSet[PackageInfo] |
| 71 | + pkgToInstall*: seq[(string, Version)] |
| 72 | + output*: string |
66 | 73 |
|
67 | 74 |
|
68 | 75 | const TaggedVersionsFileName* = "tagged_versions.json"
|
69 | 76 |
|
| 77 | +proc initSATState*(pkgList: seq[PackageInfo]): SATState = |
| 78 | + result.pkgList = pkgList |
| 79 | + result.pkgVersions = initTable[string, PackageVersions]() |
| 80 | + result.solvedPkgs = @[] |
| 81 | + result.solution = initHashSet[PackageInfo]() |
| 82 | + result.pkgToInstall = @[] |
| 83 | + result.output = "" |
| 84 | + |
| 85 | + |
| 86 | +proc foundSolution*(state: SATState): bool = |
| 87 | + state.solvedPkgs.len > 0 #TODO add a flag as well to make sure it ran |
| 88 | + |
70 | 89 | proc initFromJson*(dst: var PkgTuple, jsonNode: JsonNode, jsonPath: var string) =
|
71 | 90 | dst = parseRequires(jsonNode.str)
|
72 | 91 |
|
@@ -684,43 +703,40 @@ proc isSystemNimCompatible*(solvedPkgs: seq[SolvedPackage], options: Options): b
|
684 | 703 | return false
|
685 | 704 | true
|
686 | 705 |
|
687 |
| -proc solveLocalPackages*(rootPkgInfo: PackageInfo, pkgList: seq[PackageInfo], solvedPkgs: var seq[SolvedPackage], systemNimCompatible: var bool, options: Options): HashSet[PackageInfo] = |
| 706 | +proc solveLocalPackages*(rootPkgInfo: PackageInfo, state: var SATState, systemNimCompatible: var bool, options: Options) = |
688 | 707 | var root = rootPkgInfo.getMinimalInfo(options)
|
689 | 708 | root.isRoot = true
|
690 |
| - var pkgVersionTable = initTable[string, PackageVersions]() |
691 |
| - pkgVersionTable[root.name] = PackageVersions(pkgName: root.name, versions: @[root]) |
692 |
| - fillPackageTableFromPreferred(pkgVersionTable, pkgList.mapIt(it.getMinimalInfo(options))) |
693 |
| - var output = "" |
694 |
| - solvedPkgs = pkgVersionTable.getSolvedPackages(output) |
695 |
| - systemNimCompatible = solvedPkgs.isSystemNimCompatible(options) |
| 709 | + state.pkgVersions[root.name] = PackageVersions(pkgName: root.name, versions: @[root]) |
| 710 | + fillPackageTableFromPreferred(state.pkgVersions, state.pkgList.mapIt(it.getMinimalInfo(options))) |
| 711 | + state.solvedPkgs = state.pkgVersions.getSolvedPackages(state.output) |
| 712 | + systemNimCompatible = state.solvedPkgs.isSystemNimCompatible(options) |
696 | 713 |
|
697 |
| - for solvedPkg in solvedPkgs: |
| 714 | + for solvedPkg in state.solvedPkgs: |
698 | 715 | if solvedPkg.pkgName.isNim and systemNimCompatible:
|
699 | 716 | continue #Dont add nim from the solution as we will use system nim
|
700 |
| - for pkgInfo in pkgList: |
| 717 | + for pkgInfo in state.pkgList: |
701 | 718 | if pkgInfo.basicInfo.name == solvedPkg.pkgName and pkgInfo.basicInfo.version == solvedPkg.version:
|
702 |
| - result.incl pkgInfo |
| 719 | + state.solution.incl pkgInfo |
703 | 720 |
|
704 |
| -proc solvePackages*(rootPkg: PackageInfo, pkgList: seq[PackageInfo], pkgsToInstall: var seq[(string, Version)], options: Options, output: var string, solvedPkgs: var seq[SolvedPackage]): HashSet[PackageInfo] = |
| 721 | +proc solvePackages*(rootPkg: PackageInfo, state: var SATState, options: Options) = |
705 | 722 | var root: PackageMinimalInfo = rootPkg.getMinimalInfo(options)
|
706 | 723 | root.isRoot = true
|
707 |
| - var pkgVersionTable = initTable[string, PackageVersions]() |
708 |
| - pkgVersionTable[root.name] = PackageVersions(pkgName: root.name, versions: @[root]) |
709 |
| - collectAllVersions(pkgVersionTable, root, options, downloadMinimalPackage, pkgList.mapIt(it.getMinimalInfo(options))) |
710 |
| - solvedPkgs = pkgVersionTable.getSolvedPackages(output).topologicalSort() |
711 |
| - let systemNimCompatible = solvedPkgs.isSystemNimCompatible(options) |
| 724 | + state.pkgVersions[root.name] = PackageVersions(pkgName: root.name, versions: @[root]) |
| 725 | + collectAllVersions(state.pkgVersions, root, options, downloadMinimalPackage, state.pkgList.mapIt(it.getMinimalInfo(options))) |
| 726 | + state.solvedPkgs = state.pkgVersions.getSolvedPackages(state.output).topologicalSort() |
| 727 | + let systemNimCompatible = state.solvedPkgs.isSystemNimCompatible(options) |
712 | 728 |
|
713 |
| - for solvedPkg in solvedPkgs: |
| 729 | + for solvedPkg in state.solvedPkgs: |
714 | 730 | if solvedPkg.pkgName == root.name: continue
|
715 | 731 | var foundInList = false
|
716 |
| - for pkgInfo in pkgList: |
| 732 | + for pkgInfo in state.pkgList: |
717 | 733 | if pkgInfo.basicInfo.name == solvedPkg.pkgName and pkgInfo.basicInfo.version == solvedPkg.version:
|
718 |
| - result.incl pkgInfo |
| 734 | + state.solution.incl pkgInfo |
719 | 735 | foundInList = true
|
720 | 736 | if not foundInList:
|
721 | 737 | if solvedPkg.pkgName.isNim and systemNimCompatible:
|
722 | 738 | continue #Skips systemNim
|
723 |
| - pkgsToInstall.addUnique((solvedPkg.pkgName, solvedPkg.version)) |
| 739 | + state.pkgToInstall.addUnique((solvedPkg.pkgName, solvedPkg.version)) |
724 | 740 |
|
725 | 741 | proc getPackageInfo*(name: string, pkgs: seq[PackageInfo], version: Option[Version] = none(Version)): Option[PackageInfo] =
|
726 | 742 | for pkg in pkgs:
|
|
0 commit comments