Skip to content

Commit 80b1d15

Browse files
authored
Improves package collection for SAT (#1416)
* Improves the special version tests so it includes run and custom actions. * disables all suites except requires to iterate quicker * removes fake tesst * remove test * reenables suites. Changes the way special versions are collected
1 parent 81816bf commit 80b1d15

File tree

6 files changed

+52
-14
lines changed

6 files changed

+52
-14
lines changed

src/nimblepkg/nimblesat.nim

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,13 @@ proc getMinimalInfo*(nimbleFile: string, pkgName: string, options: Options): Pac
125125

126126
proc hasVersion*(packageVersions: PackageVersions, pv: PkgTuple): bool =
127127
for pkg in packageVersions.versions:
128-
if pkg.name == pv.name and pkg.version.withinRange(pv.ver):
129-
return true
128+
if pkg.name == pv.name:
129+
# Special versions must match exactly for collection purposes
130+
if pv.ver.kind == verSpecial:
131+
return $pkg.version == $pv.ver
132+
# Regular version ranges
133+
elif pkg.version.withinRange(pv.ver):
134+
return true
130135
false
131136

132137
proc hasVersion*(packagesVersions: Table[string, PackageVersions], pv: PkgTuple): bool =
@@ -657,21 +662,31 @@ proc getMinimalFromPreferred(pv: PkgTuple, getMinimalPackage: GetPackageMinimal
657662
return @[pp]
658663
getMinimalPackage(pv, options)
659664

660-
proc processRequirements(versions: var Table[string, PackageVersions], pv: PkgTuple, visited: var HashSet[PkgTuple], getMinimalPackage: GetPackageMinimal, preferredPackages: seq[PackageMinimalInfo] = newSeq[PackageMinimalInfo](), options: Options) =
665+
proc processRequirements(versions: var Table[string, PackageVersions], pv: PkgTuple, visited: var HashSet[PkgTuple], getMinimalPackage: GetPackageMinimal, preferredPackages: seq[PackageMinimalInfo] = newSeq[PackageMinimalInfo](), options: Options) =
661666
if pv in visited:
662667
return
663668

664669
visited.incl pv
665670

666-
if not hasVersion(versions, pv):
671+
# For special versions, always process them even if we think we have the package
672+
# This ensures the special version gets downloaded and added to the version table
673+
if pv.ver.kind == verSpecial or not hasVersion(versions, pv):
667674
var pkgMins = getMinimalFromPreferred(pv, getMinimalPackage, preferredPackages, options)
668675
for pkgMin in pkgMins.mitems:
669676
if pv.ver.kind == verSpecial:
670677
pkgMin.version = newVersion $pv.ver
671-
if not versions.hasKey(pv.name):
672-
versions[pv.name] = PackageVersions(pkgName: pv.name, versions: @[pkgMin])
678+
679+
# If this is a special version, clear any existing regular versions
680+
# to force the SAT solver to use this specific version
681+
if versions.hasKey(pv.name):
682+
versions[pv.name].versions = @[pkgMin]
683+
else:
684+
versions[pv.name] = PackageVersions(pkgName: pv.name, versions: @[pkgMin])
673685
else:
674-
versions[pv.name].versions.addUnique pkgMin
686+
if not versions.hasKey(pv.name):
687+
versions[pv.name] = PackageVersions(pkgName: pv.name, versions: @[pkgMin])
688+
else:
689+
versions[pv.name].versions.addUnique pkgMin
675690

676691
for req in pkgMin.requires:
677692
processRequirements(versions, req, visited, getMinimalPackage, preferredPackages, options)

tests/gitversions/gitversions.nimble

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ author = "jmgomez"
55
description = "A new awesome nimble package"
66
license = "MIT"
77
srcDir = "src"
8+
bin = @["gitversions"]
89

910

1011
# Dependencies

tests/gitversions/src/gitversions.nim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# This is just an example to get you started. A typical library package
22
# exports the main API in this file. Note that you cannot rename this file
33
# but you can remove it if you wish.
4+
when not defined(no_test):
5+
import json_serialization/nimbletest
6+
7+
hello()
48

59
proc add*(x, y: int): int =
610
## Adds two numbers together.

tests/gitversions/tests/test1.nim

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import unittest
99

10-
import gitversions
11-
test "can add":
12-
check add(5, 5) == 10
10+
when not defined(no_test):
11+
import json_serialization/nimbletest
12+
13+
hello()

tests/tests/test1.nim

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# This is just an example to get you started. You may wish to put all of your
2+
# tests into a single file, or separate them into multiple `test1`, `test2`
3+
# etc. files (better names are recommended, just make sure the name starts with
4+
# the letter 't').
5+
#
6+
# To run these tests, simply execute `nimble test`.
7+
8+
import unittest
9+
10+
import tests
11+
test "can add":
12+
check add(5, 5) == 10

tests/trequireflag.nim

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ suite "requires flag":
4646
]#
4747
let requires = [
4848
"https://github.com/status-im/nim-json-serialization.git#nimble_test_dont_delete",
49-
"https://github.com/status-im/nim-json-serialization.git#e45fe67d71f006f15a32f90a5a56a4775982d951",
49+
"https://github.com/status-im/nim-json-serialization.git#26bea5ffce20ae0d0855b3d61072de04d3bf9826",
5050
"json_serialization#nimble_test_dont_delete",
51-
"json_serialization#e45fe67d71f006f15a32f90a5a56a4775982d951",
51+
"json_serialization#26bea5ffce20ae0d0855b3d61072de04d3bf9826",
5252
"json_serialization == 0.2.9"
5353
]
5454
cleanDir(installDir)
@@ -57,10 +57,15 @@ suite "requires flag":
5757
let require = "--requires: " & req
5858
let isVersion = req.contains("==")
5959
# echo "Trying require: ", req
60-
let (output, exitCode) = execNimble("install", require)
60+
let no_test = if isVersion: "-d:no_test" else: ""
61+
let (output, exitCode) = execNimble("run", require, no_test)
6162
let pkgDir = getPackageDir(pkgsDir, "json_serialization-0.2.9")
6263
check exitCode == QuitSuccess
63-
let nimbleTestDontDeleteFile = pkgDir / "json_serialization" / "nimble.test.nim"
64+
65+
let (_, exitCodeTest) = execNimble("test", require, no_test)
66+
check exitCodeTest == QuitSuccess
67+
68+
let nimbleTestDontDeleteFile = pkgDir / "json_serialization" / "nimbletest.nim"
6469
# echo "Nimble test dont delete file: ", nimbleTestDontDeleteFile
6570
if isVersion:
6671
check output.processOutput.inLines("Success: json_serialization installed successfully.")

0 commit comments

Comments
 (0)