diff --git a/src/nimble.nim b/src/nimble.nim index 9456e78..cd87b84 100644 --- a/src/nimble.nim +++ b/src/nimble.nim @@ -214,7 +214,9 @@ proc processDeps(pkginfo: PackageInfo, options: Options): seq[PackageInfo] = addRevDep(options.nimbleData, i, pkginfo) proc buildFromDir(pkgInfo: PackageInfo, paths: seq[string], - args: var seq[string]) = + args: var seq[string], options: Options) = + doAssert(options.action.typ == actionBuild) + ## Builds a package as specified by ``pkgInfo``. if pkgInfo.bin.len == 0: raise newException(NimbleError, @@ -244,13 +246,14 @@ proc buildFromDir(pkgInfo: PackageInfo, paths: seq[string], exc.hint = hint raise exc -proc buildFromDir(pkgInfo: PackageInfo, paths: seq[string], forRelease: bool) = +proc buildFromDir(pkgInfo: PackageInfo, paths: seq[string], forRelease: bool, + options: Options) = var args: seq[string] if forRelease: args = @["-d:release"] else: args = @[] - buildFromDir(pkgInfo, paths, args) + buildFromDir(pkgInfo, paths, args, options) proc removePkgDir(dir: string, options: Options) = ## Removes files belonging to the package in ``dir``. @@ -325,6 +328,7 @@ proc installFromDir(dir: string, requestedVer: VersionRange, options: Options, ## to the packages this package depends on. ## The return value of this function is used by ## ``processDeps`` to gather a list of paths to pass to the nim compiler. + doAssert(options.action.typ == actionInstall) # Handle pre-`install` hook. if not options.depsOnly: @@ -356,7 +360,9 @@ proc installFromDir(dir: string, requestedVer: VersionRange, options: Options, # if the build fails then the old package will still be installed. if pkgInfo.bin.len > 0: let paths = result.deps.map(dep => dep.getRealDir()) - buildFromDir(pkgInfo, paths, true) + let optsCopy = options.briefClone() + optsCopy.action.typ = actionBuild + buildFromDir(pkgInfo, paths, true, optsCopy) let pkgDestDir = pkgInfo.getPkgDest(options) if existsDir(pkgDestDir) and existsFile(pkgDestDir / "nimblemeta.json"): @@ -470,8 +476,14 @@ proc getDownloadInfo*(pv: PkgTuple, options: Options, proc install(packages: seq[PkgTuple], options: Options, doPrompt = true): tuple[deps: seq[PackageInfo], pkg: PackageInfo] = + var optsCopy = options.briefClone() + optsCopy.action.typ = actionInstall + # Pass an empty seq here because we're executing `install` inside the package + # directory + optsCopy.action.packages = @[] + if packages == @[]: - result = installFromDir(getCurrentDir(), newVRAny(), options, "") + result = installFromDir(getCurrentDir(), newVRAny(), optsCopy, "") else: # Install each package. for pv in packages: @@ -480,7 +492,7 @@ proc install(packages: seq[PkgTuple], let (downloadDir, downloadVersion) = downloadPkg(url, pv.ver, meth, subdir, options) try: - result = installFromDir(downloadDir, pv.ver, options, url) + result = installFromDir(downloadDir, pv.ver, optsCopy, url) except BuildFailed: # The package failed to build. # Check if we tried building a tagged version of the package. @@ -507,7 +519,7 @@ proc build(options: Options) = let deps = processDeps(pkginfo, options) let paths = deps.map(dep => dep.getRealDir()) var args = options.action.compileOptions - buildFromDir(pkgInfo, paths, args) + buildFromDir(pkgInfo, paths, args, options) proc execBackend(options: Options) = let @@ -549,7 +561,8 @@ proc search(options: Options) = ## Searches for matches in ``options.action.search``. ## ## Searches are done in a case insensitive way making all strings lower case. - assert options.action.typ == actionSearch + doAssert(options.action.typ == actionSearch) + if options.action.search == @[]: raise newException(NimbleError, "Please specify a search string.") if needsRefresh(options): @@ -899,6 +912,8 @@ proc listTasks(options: Options) = nimscriptsupport.listTasks(nimbleFile, options) proc developFromDir(dir: string, options: Options) = + doAssert(options.action.typ == actionDevelop) + if options.depsOnly: raiseNimbleError("Cannot develop dependencies only.")