diff --git a/src/nimble.nim b/src/nimble.nim index 55a0b09..e1f9ccc 100644 --- a/src/nimble.nim +++ b/src/nimble.nim @@ -227,7 +227,7 @@ proc processDeps(pkginfo: PackageInfo, options: Options): seq[string] = "dependencies for $1@$2" % [pkginfo.name, pkginfo.specialVersion], priority = HighPriority) - let pkglist = getInstalledPkgsMin(options.getPkgsDir(), options) + var pkgList = getInstalledPkgsMin(options.getPkgsDir(), options) var reverseDeps: seq[tuple[name, version: string]] = @[] for dep in pkginfo.requires: if dep.name == "nimrod" or dep.name == "nim": @@ -255,6 +255,9 @@ proc processDeps(pkginfo: PackageInfo, options: Options): seq[string] = result.add(paths) pkg = installedPkg # For addRevDep + + # This package has been installed so we add it to our pkgList. + pkgList.add((pkg, readMetaData(pkg.getRealDir()))) else: display("Info:", "Dependency on $1 already satisfied" % $dep, priority = HighPriority) @@ -441,9 +444,10 @@ proc installFromDir(dir: string, requestedVer: VersionRange, options: Options, filesInstalled.incl copyFileD(file, dest) # Copy the .nimble file. - let dest = changeRoot(pkgInfo.mypath.splitFile.dir, pkgDestDir, - pkgInfo.mypath) - filesInstalled.incl copyFileD(pkgInfo.mypath, dest) + let dest = changeRoot(pkgInfo.myPath.splitFile.dir, pkgDestDir, + pkgInfo.myPath) + filesInstalled.incl copyFileD(pkgInfo.myPath, dest) + pkgInfo.myPath = dest var binariesInstalled = initSet[string]() if pkgInfo.bin.len > 0: @@ -518,6 +522,7 @@ proc installFromDir(dir: string, requestedVer: VersionRange, options: Options, # Return the paths to the dependencies of this package. result.paths.add pkgDestDir result.pkg = pkgInfo + result.pkg.isInstalled = true display("Success:", pkgInfo.name & " installed successfully.", Success, HighPriority) diff --git a/src/nimblepkg/version.nim b/src/nimblepkg/version.nim index b4d42f5..0a70c88 100644 --- a/src/nimblepkg/version.nim +++ b/src/nimblepkg/version.nim @@ -51,7 +51,8 @@ proc isSpecial*(ver: Version): bool = proc `<`*(ver: Version, ver2: Version): bool = # Handling for special versions such as "#head" or "#branch". if ver.isSpecial or ver2.isSpecial: - return false + # TODO: This may need to be reverted. See #311. + return ($ver2).normalize == "#head" and ($ver).normalize != "#head" # Handling for normal versions such as "0.1.0" or "1.0". var sVer = string(ver).split('.') @@ -103,32 +104,23 @@ proc `==`*(range1: VersionRange, range2: VersionRange): bool = of verAny: true proc withinRange*(ver: Version, ran: VersionRange): bool = - if ver.isSpecial: - case ran.kind - of verLater, verEarlier, verEqLater, verEqEarlier, verEq, verIntersect: - return false - of verSpecial: - return ver == ran.spe - of verAny: - return true - else: - case ran.kind - of verLater: - return ver > ran.ver - of verEarlier: - return ver < ran.ver - of verEqLater: - return ver >= ran.ver - of verEqEarlier: - return ver <= ran.ver - of verEq: - return ver == ran.ver - of verSpecial: - return false - of verIntersect: - return withinRange(ver, ran.verILeft) and withinRange(ver, ran.verIRight) - of verAny: - return true + case ran.kind + of verLater: + return ver > ran.ver + of verEarlier: + return ver < ran.ver + of verEqLater: + return ver >= ran.ver + of verEqEarlier: + return ver <= ran.ver + of verEq: + return ver == ran.ver + of verSpecial: + return ver == ran.spe + of verIntersect: + return withinRange(ver, ran.verILeft) and withinRange(ver, ran.verIRight) + of verAny: + return true proc contains*(ran: VersionRange, ver: Version): bool = return withinRange(ver, ran) @@ -342,9 +334,10 @@ when isMainModule: doAssert newVersion("#head") in parseVersionRange("#head") - # TODO: It may be worth changing this in the future, although we can't be - # certain that #head is in fact newer than v0.1.0. - doAssert(not(newVersion("#head") > newVersion("0.1.0"))) + # We assume that #head > 0.1.0, in practice this shouldn't be a problem. + doAssert(newVersion("#head") > newVersion("0.1.0")) + doAssert(not(newVersion("#head") > newVersion("#head"))) + doAssert(withinRange(newVersion("#head"), parseVersionRange(">= 0.5.0"))) # An empty version range should give verAny doAssert parseVersionRange("").kind == verAny diff --git a/tests/tester.nim b/tests/tester.nim index 78df424..007572f 100644 --- a/tests/tester.nim +++ b/tests/tester.nim @@ -42,6 +42,12 @@ proc inLines(lines: seq[string], line: string): bool = for i in lines: if line.normalize in i.normalize: return true +test "picks #head when looking for packages": + cd "versionClashes" / "aporiaScenario": + check execNimble("install", "-y", "--verbose").exitCode == QuitSuccess + check execNimble("remove", "aporiascenario", "-y").exitCode == QuitSuccess + check execNimble("remove", "packagea", "-y").exitCode == QuitSuccess + test "can distinguish package reading in nimbleDir vs. other dirs (#304)": cd "issue304" / "package-test": check execNimble("tasks").exitCode == QuitSuccess