Skip to content

Commit a967b2e

Browse files
committed
Step back: Reintroduce SATState without getting rid of PackageInfo
1 parent 22d504a commit a967b2e

File tree

4 files changed

+55
-36
lines changed

4 files changed

+55
-36
lines changed

config.nims

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ switch("define", "ssl")
66
switch("path", "vendor" / "zippy" / "src")
77
switch("path", "vendor" / "sat" / "src")
88
switch("path", "vendor" / "checksums" / "src")
9+
switch("define", "zippyNoSimd")

src/nimble.nim

+17-16
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,10 @@ proc addReverseDeps(solvedPkgs: seq[SolvedPackage], allPkgsInfo: seq[PackageInfo
8383
proc processFreeDependenciesSAT(rootPkgInfo: PackageInfo, options: Options): HashSet[PackageInfo] =
8484
if satProccesedPackages.len > 0:
8585
return satProccesedPackages
86-
var solvedPkgs = newSeq[SolvedPackage]()
87-
var pkgsToInstall: seq[(string, Version)] = @[]
8886
var rootPkgInfo = rootPkgInfo
8987
rootPkgInfo.requires &= options.extraRequires
9088
var pkgList = initPkgList(rootPkgInfo, options).mapIt(it.toFullInfo(options))
89+
var state = initSATState(pkgList)
9190
var allPkgsInfo: seq[PackageInfo] = pkgList & rootPkgInfo
9291
#Remove from the pkglist the packages that exists in lock file and has a different vcsRevision
9392
var upgradeVersions = initTable[string, VersionRange]()
@@ -107,14 +106,15 @@ proc processFreeDependenciesSAT(rootPkgInfo: PackageInfo, options: Options): Has
107106
toRemoveFromLocked.add pkg
108107

109108
var systemNimCompatible = options.nimBin.isSome
110-
result = solveLocalPackages(rootPkgInfo, pkgList, solvedPkgs, systemNimCompatible, options)
111-
if solvedPkgs.len > 0:
112-
displaySatisfiedMsg(solvedPkgs, pkgsToInstall, options)
113-
addReverseDeps(solvedPkgs, allPkgsInfo, options)
109+
solveLocalPackages(rootPkgInfo, state, systemNimCompatible, options)
110+
result = state.solution
111+
if state.foundSolution():
112+
displaySatisfiedMsg(state.solvedPkgs, state.pkgToInstall, options)
113+
addReverseDeps(state.solvedPkgs, allPkgsInfo, options)
114114
for pkg in allPkgsInfo:
115115
if pkg.basicInfo.name.isNim and systemNimCompatible:
116116
continue #Dont add nim from the solution as we will use system nim
117-
result.incl pkg
117+
result.incl pkg #TODO likely this is only adding root. But review later
118118
for nonLocked in toRemoveFromLocked:
119119
#only remove if the vcsRevision is different
120120
for pkg in result:
@@ -126,13 +126,14 @@ proc processFreeDependenciesSAT(rootPkgInfo: PackageInfo, options: Options): Has
126126
.toHashSet
127127
satProccesedPackages = result
128128
return result
129-
130-
var output = ""
131-
result = solvePackages(rootPkgInfo, pkgList, pkgsToInstall, options, output, solvedPkgs)
132-
displaySatisfiedMsg(solvedPkgs, pkgsToInstall, options)
133-
displayUsingSpecialVersionWarning(solvedPkgs, options)
134-
var solved = solvedPkgs.len > 0 #A pgk can be solved and still dont return a set of PackageInfo
135-
for (name, ver) in pkgsToInstall:
129+
130+
state = initSATState(pkgList)
131+
solvePackages(rootPkgInfo, state, options)
132+
result = state.solution
133+
displaySatisfiedMsg(state.solvedPkgs, state.pkgToInstall, options)
134+
displayUsingSpecialVersionWarning(state.solvedPkgs, options)
135+
var solved = state.foundSolution() #A pgk can be solved and still dont return a set of PackageInfo
136+
for (name, ver) in state.pkgToInstall:
136137
var versionRange = ver.toVersionRange
137138
if name in upgradeVersions:
138139
versionRange = upgradeVersions[name]
@@ -151,7 +152,7 @@ proc processFreeDependenciesSAT(rootPkgInfo: PackageInfo, options: Options): Has
151152

152153
for pkg in result:
153154
allPkgsInfo.add pkg
154-
addReverseDeps(solvedPkgs, allPkgsInfo, options)
155+
addReverseDeps(state.solvedPkgs, allPkgsInfo, options)
155156

156157
for nonLocked in toRemoveFromLocked:
157158
result.excl nonLocked
@@ -160,7 +161,7 @@ proc processFreeDependenciesSAT(rootPkgInfo: PackageInfo, options: Options): Has
160161
satProccesedPackages = result
161162

162163
if not solved:
163-
display("Error", output, Error, priority = HighPriority)
164+
display("Error", state.output, Error, priority = HighPriority)
164165
raise nimbleError("Unsatisfiable dependencies")
165166

166167
proc processFreeDependencies(pkgInfo: PackageInfo,

src/nimblepkg/nimblesat.nim

+36-20
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,29 @@ type
6363
versions: seq[PackageMinimalInfo]
6464

6565
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
6673

6774

6875
const TaggedVersionsFileName* = "tagged_versions.json"
6976

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+
7089
proc initFromJson*(dst: var PkgTuple, jsonNode: JsonNode, jsonPath: var string) =
7190
dst = parseRequires(jsonNode.str)
7291

@@ -684,43 +703,40 @@ proc isSystemNimCompatible*(solvedPkgs: seq[SolvedPackage], options: Options): b
684703
return false
685704
true
686705

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) =
688707
var root = rootPkgInfo.getMinimalInfo(options)
689708
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)
696713

697-
for solvedPkg in solvedPkgs:
714+
for solvedPkg in state.solvedPkgs:
698715
if solvedPkg.pkgName.isNim and systemNimCompatible:
699716
continue #Dont add nim from the solution as we will use system nim
700-
for pkgInfo in pkgList:
717+
for pkgInfo in state.pkgList:
701718
if pkgInfo.basicInfo.name == solvedPkg.pkgName and pkgInfo.basicInfo.version == solvedPkg.version:
702-
result.incl pkgInfo
719+
state.solution.incl pkgInfo
703720

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) =
705722
var root: PackageMinimalInfo = rootPkg.getMinimalInfo(options)
706723
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)
712728

713-
for solvedPkg in solvedPkgs:
729+
for solvedPkg in state.solvedPkgs:
714730
if solvedPkg.pkgName == root.name: continue
715731
var foundInList = false
716-
for pkgInfo in pkgList:
732+
for pkgInfo in state.pkgList:
717733
if pkgInfo.basicInfo.name == solvedPkg.pkgName and pkgInfo.basicInfo.version == solvedPkg.version:
718-
result.incl pkgInfo
734+
state.solution.incl pkgInfo
719735
foundInList = true
720736
if not foundInList:
721737
if solvedPkg.pkgName.isNim and systemNimCompatible:
722738
continue #Skips systemNim
723-
pkgsToInstall.addUnique((solvedPkg.pkgName, solvedPkg.version))
739+
state.pkgToInstall.addUnique((solvedPkg.pkgName, solvedPkg.version))
724740

725741
proc getPackageInfo*(name: string, pkgs: seq[PackageInfo], version: Option[Version] = none(Version)): Option[PackageInfo] =
726742
for pkg in pkgs:

tests/nim.cfg

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
--path:"$nim/"
22
--path:"../src/"
3+
--define:zippyNoSimd

0 commit comments

Comments
 (0)