Compare commits

...

14 commits

Author SHA1 Message Date
Timothee Cour
a10691bdf2
show cmd used with --verbose (even on success); fix #783 (#781)
* show cmd used with --verbose (even on success)

* honor -p:-u:release

* address comment

* remove --showCmds flag

* remove quoteShell

* fix #783

* Revert "fix #783"

This reverts commit af0ac004c00f17e9983c63ab99e40cd38ba6aaa4.

* fix #783 by fixing the gist instead

* Revert "fix #783 by fixing the gist instead" now that upstream gist was updated with my patch

This reverts commit 8bec86039d8335af152acf238ab14d0268e003e5.
2020-03-26 23:14:09 +00:00
Daniel M
68a9c4c955 fix and improve the behavior of nimble run
quote arguments appropriately:
  - whitespace in arguments is preserved;
    previously arguments with whitespace were split
  - quotes are now escaped

the exit code of the command that has been "run"
is re-used when nimble exits

show the output of the "run" command
regardless of whether nimble is debugging
2020-02-23 16:01:14 +00:00
Ganesh Viswanathan
27d56f8e9f Remove ~/.nimble from cache 2020-02-11 21:43:41 +00:00
Ganesh Viswanathan
85e5bc7c37 Use travis gist 2020-02-07 00:12:25 +00:00
inv2004
9391fbc56d Run can work without additional option if only one bin in .nimble (#761)
* nimble run can work if only one binary in config

* usage changed

* runFile is option now

* usage updated

* small refactoring to reduce condition

* setRunOptions fix

* some code optimisation
2020-01-17 22:15:34 +00:00
Taylor Hoff
e9d45ca683 Capitalize the "D" in srcDir to avoid errors when using styleChecks
Fixes #740
2019-11-19 22:00:15 +00:00
Xie Yanbo
16ba5db44e tests' config file should be config.nims
which is created by `nimble init`.
2019-11-10 15:30:38 +00:00
itmuckel
051cfa6cd3 Add '==' as operator for pinning versions. 2019-11-09 12:48:00 +00:00
Dominik Picheta
a8a5bdd863
Fixes #734 2019-10-29 22:43:04 +00:00
yuchunzhou
bbb586dbfc add vcs to the new created project (#729)
* add git vcs and a default .nim.cfg file to the new created project

* remove the gitapi dependency

* add vcs support for new nimble project

* add vcs support for new nimble project

* update pull request #729

* add --git/hg flag instead of --vcs flag for nimble init command
2019-10-28 21:28:46 +00:00
Dominik Picheta
b3abee937d Add tests for #666. 2019-10-24 23:26:21 +01:00
yuchunzhou
703abe3d41 fix #725 2019-10-24 00:20:40 +01:00
Ganesh Viswanathan
5bb795a364 Export initOptions for choosenim 2019-10-23 23:22:00 +01:00
genotrance
a2ec2db8f2
Enable Windows CI (#714)
Also fix #676
2019-10-03 18:38:51 -05:00
11 changed files with 181 additions and 70 deletions

View file

@ -1,4 +1,5 @@
os: os:
- windows
- linux - linux
- osx - osx
@ -7,23 +8,17 @@ language: c
env: env:
- BRANCH=0.19.6 - BRANCH=0.19.6
- BRANCH=0.20.2 - BRANCH=0.20.2
- BRANCH=1.0.6
# This is the latest working Nim version against which Nimble is being tested # This is the latest working Nim version against which Nimble is being tested
- BRANCH=#2565d3d102efd21ba02ed1f3b96d892fe2637d2b - BRANCH=#ab525cc48abdbbbed1f772e58e9fe21474f70f07
cache: cache:
directories: directories:
- "$HOME/.choosenim/toolchains/nim-0.19.6" - "$HOME/.choosenim"
- "$HOME/.choosenim/toolchains/nim-0.20.2"
install: install:
- export CHOOSENIM_CHOOSE_VERSION=$BRANCH - curl https://gist.github.com/genotrance/fb53504a4fba88bc5201d3783df5c522/raw/travis.sh -LsSf -o travis.sh
- | - source travis.sh
curl https://nim-lang.org/choosenim/init.sh -sSf > init.sh
sh init.sh -y
before_script:
- export CHOOSENIM_NO_ANALYTICS=1
- export PATH=$HOME/.nimble/bin:$PATH
script: script:
- cd tests - cd tests

View file

@ -172,12 +172,13 @@ example:
This is of course Git-specific, for Mercurial, use ``tip`` instead of ``head``. A This is of course Git-specific, for Mercurial, use ``tip`` instead of ``head``. A
branch, tag, or commit hash may also be specified in the place of ``head``. branch, tag, or commit hash may also be specified in the place of ``head``.
Instead of specifying a VCS branch, you may also specify a version range, for Instead of specifying a VCS branch, you may also specify a concrete version or a
example: version range, for example:
$ nimble install nimgame@0.5
$ nimble install nimgame@"> 0.5" $ nimble install nimgame@"> 0.5"
In this case a version which is greater than ``0.5`` will be installed. The latter command will install a version which is greater than ``0.5``.
If you don't specify a parameter and there is a ``package.nimble`` file in your If you don't specify a parameter and there is a ``package.nimble`` file in your
current working directory then Nimble will install the package residing in current working directory then Nimble will install the package residing in
@ -504,7 +505,7 @@ For a package named "foobar", the recommended project structure is the following
└── src └── src
└── foobar.nim # Imported via `import foobar` └── foobar.nim # Imported via `import foobar`
└── tests # Contains the tests └── tests # Contains the tests
├── nim.cfg ├── config.nims
├── tfoo1.nim # First test ├── tfoo1.nim # First test
└── tfoo2.nim # Second test └── tfoo2.nim # Second test

View file

@ -3,12 +3,13 @@
import system except TResult import system except TResult
import os, tables, strtabs, json, algorithm, sets, uri, sugar, sequtils import os, tables, strtabs, json, algorithm, sets, uri, sugar, sequtils, osproc
import std/options as std_opt import std/options as std_opt
import strutils except toLower import strutils except toLower
from unicode import toLower from unicode import toLower
from sequtils import toSeq from sequtils import toSeq
from strformat import fmt
import nimblepkg/packageinfo, nimblepkg/version, nimblepkg/tools, import nimblepkg/packageinfo, nimblepkg/version, nimblepkg/tools,
nimblepkg/download, nimblepkg/config, nimblepkg/common, nimblepkg/download, nimblepkg/config, nimblepkg/common,
@ -220,7 +221,7 @@ proc buildFromDir(
options: Options options: Options
) = ) =
## Builds a package as specified by ``pkgInfo``. ## Builds a package as specified by ``pkgInfo``.
let binToBuild = options.getCompilationBinary() let binToBuild = options.getCompilationBinary(pkgInfo)
# Handle pre-`build` hook. # Handle pre-`build` hook.
let realDir = pkgInfo.getRealDir() let realDir = pkgInfo.getRealDir()
cd realDir: # Make sure `execHook` executes the correct .nimble file. cd realDir: # Make sure `execHook` executes the correct .nimble file.
@ -250,10 +251,14 @@ proc buildFromDir(
if not existsDir(outputDir): if not existsDir(outputDir):
createDir(outputDir) createDir(outputDir)
let input = realDir / bin.changeFileExt("nim")
# `quoteShell` would be more robust than `\"` (and avoid quoting when
# un-necessary) but would require changing `extractBin`
let cmd = "\"$#\" $# --noNimblePath $# $# $# \"$#\"" %
[getNimBin(), pkgInfo.backend, nimblePkgVersion,
join(args, " "), outputOpt, input]
try: try:
doCmd("\"" & getNimBin() & "\" $# --noNimblePath $# $# $# \"$#\"" % doCmd(cmd, showCmd = true)
[pkgInfo.backend, nimblePkgVersion, join(args, " "), outputOpt,
realDir / bin.changeFileExt("nim")])
binariesBuilt.inc() binariesBuilt.inc()
except NimbleError: except NimbleError:
let currentExc = (ref NimbleError)(getCurrentException()) let currentExc = (ref NimbleError)(getCurrentException())
@ -381,7 +386,7 @@ proc installFromDir(dir: string, requestedVer: VersionRange, options: Options,
options.action.passNimFlags options.action.passNimFlags
else: else:
@[] @[]
buildFromDir(pkgInfo, paths, flags & "-d:release", options) buildFromDir(pkgInfo, paths, "-d:release" & flags, options)
let pkgDestDir = pkgInfo.getPkgDest(options) let pkgDestDir = pkgInfo.getPkgDest(options)
if existsDir(pkgDestDir) and existsFile(pkgDestDir / "nimblemeta.json"): if existsDir(pkgDestDir) and existsFile(pkgDestDir / "nimblemeta.json"):
@ -534,9 +539,9 @@ proc build(options: Options) =
var args = options.getCompilationFlags() var args = options.getCompilationFlags()
buildFromDir(pkgInfo, paths, args, options) buildFromDir(pkgInfo, paths, args, options)
proc execBackend(options: Options) = proc execBackend(pkgInfo: PackageInfo, options: Options) =
let let
bin = options.getCompilationBinary().get() bin = options.getCompilationBinary(pkgInfo).get()
binDotNim = bin.addFileExt("nim") binDotNim = bin.addFileExt("nim")
if bin == "": if bin == "":
raise newException(NimbleError, "You need to specify a file.") raise newException(NimbleError, "You need to specify a file.")
@ -724,6 +729,11 @@ proc dump(options: Options) =
echo "backend: ", p.backend.escape echo "backend: ", p.backend.escape
proc init(options: Options) = proc init(options: Options) =
# Check whether the vcs is installed.
let vcsBin = options.action.vcsOption
if vcsBin != "" and findExe(vcsBin, true) == "":
raise newException(NimbleError, "Please install git or mercurial first")
# Determine the package name. # Determine the package name.
let pkgName = let pkgName =
if options.action.projName != "": if options.action.projName != "":
@ -858,6 +868,17 @@ js - Compile using JavaScript backend.""",
pkgRoot pkgRoot
) )
# Create a git or hg repo in the new nimble project.
if vcsBin != "":
let cmd = fmt"cd {pkgRoot} && {vcsBin} init"
let ret: tuple[output: string, exitCode: int] = execCmdEx(cmd)
if ret.exitCode != 0: quit ret.output
var ignoreFile = if vcsBin == "git": ".gitignore" else: ".hgignore"
var fd = open(joinPath(pkgRoot, ignoreFile), fmWrite)
fd.write(pkgName & "\n")
fd.close()
display("Success:", "Package $# created successfully" % [pkgName], Success, display("Success:", "Package $# created successfully" % [pkgName], Success,
HighPriority) HighPriority)
@ -1053,17 +1074,21 @@ proc test(options: Options) =
if options.continueTestsOnFailure: if options.continueTestsOnFailure:
inc tests inc tests
try: try:
execBackend(optsCopy) execBackend(pkgInfo, optsCopy)
except NimbleError: except NimbleError:
inc failures inc failures
else: else:
execBackend(optsCopy) execBackend(pkgInfo, optsCopy)
let let
existsAfter = existsFile(binFileName) existsAfter = existsFile(binFileName)
canRemove = not existsBefore and existsAfter canRemove = not existsBefore and existsAfter
if canRemove: if canRemove:
removeFile(binFileName) try:
removeFile(binFileName)
except OSError as exc:
display("Warning:", "Failed to delete " & binFileName & ": " &
exc.msg, Warning, MediumPriority)
if failures == 0: if failures == 0:
display("Success:", "All tests passed", Success, HighPriority) display("Success:", "All tests passed", Success, HighPriority)
@ -1092,25 +1117,25 @@ proc check(options: Options) =
proc run(options: Options) = proc run(options: Options) =
# Verify parameters. # Verify parameters.
let binary = options.getCompilationBinary().get("") var pkgInfo = getPkgInfo(getCurrentDir(), options)
let binary = options.getCompilationBinary(pkgInfo).get("")
if binary.len == 0: if binary.len == 0:
raiseNimbleError("Please specify a binary to run") raiseNimbleError("Please specify a binary to run")
var pkgInfo = getPkgInfo(getCurrentDir(), options)
if binary notin pkgInfo.bin: if binary notin pkgInfo.bin:
raiseNimbleError( raiseNimbleError(
"Binary '$#' is not defined in '$#' package." % [binary, pkgInfo.name] "Binary '$#' is not defined in '$#' package." % [binary, pkgInfo.name]
) )
let binaryPath = pkgInfo.getOutputDir(binary)
# Build the binary. # Build the binary.
build(options) build(options)
# Now run it. let binaryPath = pkgInfo.getOutputDir(binary)
let args = options.action.runFlags.join(" ") let cmd = quoteShellCommand(binaryPath & options.action.runFlags)
displayDebug("Executing", cmd)
cmd.execCmd.quit
doCmd("$# $#" % [binaryPath, args], showOutput = true)
proc doAction(options: var Options) = proc doAction(options: var Options) =
if options.showHelp: if options.showHelp:
@ -1155,7 +1180,8 @@ proc doAction(options: var Options) =
of actionRun: of actionRun:
run(options) run(options)
of actionCompile, actionDoc: of actionCompile, actionDoc:
execBackend(options) var pkgInfo = getPkgInfo(getCurrentDir(), options)
execBackend(pkgInfo, options)
of actionInit: of actionInit:
init(options) init(options)
of actionPublish: of actionPublish:

View file

@ -300,4 +300,17 @@ when isMainModule:
}) })
doAssert expected == getVersionList(data) doAssert expected == getVersionList(data)
block:
let data2 = @["v0.1.0", "v0.1.1", "v0.2.0",
"0.4.0", "v0.4.2"]
let expected2 = toOrderedTable[Version, string]({
newVersion("0.4.2"): "v0.4.2",
newVersion("0.4.0"): "0.4.0",
newVersion("0.2.0"): "v0.2.0",
newVersion("0.1.1"): "v0.1.1",
newVersion("0.1.0"): "v0.1.0",
})
doAssert expected2 == getVersionList(data2)
echo("Everything works!") echo("Everything works!")

View file

@ -17,7 +17,7 @@ var
author*: string ## The package's author. author*: string ## The package's author.
description*: string ## The package's description. description*: string ## The package's description.
license*: string ## The package's license. license*: string ## The package's license.
srcdir*: string ## The package's source directory. srcDir*: string ## The package's source directory.
binDir*: string ## The package's binary directory. binDir*: string ## The package's binary directory.
backend*: string ## The package's backend. backend*: string ## The package's backend.
@ -101,7 +101,7 @@ proc printPkgInfo(): string =
printIfLen author printIfLen author
printIfLen description printIfLen description
printIfLen license printIfLen license
printIfLen srcdir printIfLen srcDir
printIfLen binDir printIfLen binDir
printIfLen backend printIfLen backend

View file

@ -51,12 +51,13 @@ type
search*: seq[string] # Search string. search*: seq[string] # Search string.
of actionInit, actionDump: of actionInit, actionDump:
projName*: string projName*: string
vcsOption*: string
of actionCompile, actionDoc, actionBuild: of actionCompile, actionDoc, actionBuild:
file*: string file*: string
backend*: string backend*: string
compileOptions: seq[string] compileOptions: seq[string]
of actionRun: of actionRun:
runFile: string runFile: Option[string]
compileFlags: seq[string] compileFlags: seq[string]
runFlags*: seq[string] runFlags*: seq[string]
of actionCustom: of actionCustom:
@ -80,17 +81,19 @@ Commands:
init [pkgname] Initializes a new Nimble project in the init [pkgname] Initializes a new Nimble project in the
current directory or if a name is provided a current directory or if a name is provided a
new directory of the same name. new directory of the same name.
--git
--hg Create a git or hg repo in the new nimble project.
publish Publishes a package on nim-lang/packages. publish Publishes a package on nim-lang/packages.
The current working directory needs to be the The current working directory needs to be the
toplevel directory of the Nimble package. toplevel directory of the Nimble package.
uninstall [pkgname, ...] Uninstalls a list of packages. uninstall [pkgname, ...] Uninstalls a list of packages.
[-i, --inclDeps] Uninstall package and dependent package(s). [-i, --inclDeps] Uninstall package and dependent package(s).
build [opts, ...] [bin] Builds a package. build [opts, ...] [bin] Builds a package.
run [opts, ...] bin Builds and runs a package. run [opts, ...] [bin] Builds and runs a package.
A binary name needs Binary needs to be specified after any
to be specified after any compilation options, compilation options if there are several
any flags after the binary name are passed to binaries defined, any flags after the binary
the binary when it is run. or -- arg are passed to the binary when it is run.
c, cc, js [opts, ...] f.nim Builds a file inside a package. Passes options c, cc, js [opts, ...] f.nim Builds a file inside a package. Passes options
to the Nim compiler. to the Nim compiler.
test Compiles and executes tests test Compiles and executes tests
@ -201,8 +204,10 @@ proc initAction*(options: var Options, key: string) =
else: options.action.backend = keyNorm else: options.action.backend = keyNorm
of actionInit: of actionInit:
options.action.projName = "" options.action.projName = ""
options.action.vcsOption = ""
of actionDump: of actionDump:
options.action.projName = "" options.action.projName = ""
options.action.vcsOption = ""
options.forcePrompts = forcePromptYes options.forcePrompts = forcePromptYes
of actionRefresh: of actionRefresh:
options.action.optionalURL = "" options.action.optionalURL = ""
@ -261,6 +266,12 @@ proc parseCommand*(key: string, result: var Options) =
result.action = Action(typ: parseActionType(key)) result.action = Action(typ: parseActionType(key))
initAction(result, key) initAction(result, key)
proc setRunOptions(result: var Options, key, val: string, isArg: bool) =
if result.action.runFile.isNone() and (isArg or val == "--"):
result.action.runFile = some(key)
else:
result.action.runFlags.add(val)
proc parseArgument*(key: string, result: var Options) = proc parseArgument*(key: string, result: var Options) =
case result.action.typ case result.action.typ
of actionNil: of actionNil:
@ -292,10 +303,7 @@ proc parseArgument*(key: string, result: var Options) =
of actionBuild: of actionBuild:
result.action.file = key result.action.file = key
of actionRun: of actionRun:
if result.action.runFile.len == 0: result.setRunOptions(key, key, true)
result.action.runFile = key
else:
result.action.runFlags.add(key)
of actionCustom: of actionCustom:
result.action.arguments.add(key) result.action.arguments.add(key)
else: else:
@ -349,6 +357,12 @@ proc parseFlag*(flag, val: string, result: var Options, kind = cmdLongOption) =
result.action.passNimFlags.add(val) result.action.passNimFlags.add(val)
else: else:
wasFlagHandled = false wasFlagHandled = false
of actionInit:
case f
of "git", "hg":
result.action.vcsOption = f
else:
wasFlagHandled = false
of actionUninstall: of actionUninstall:
case f case f
of "incldeps", "i": of "incldeps", "i":
@ -359,7 +373,8 @@ proc parseFlag*(flag, val: string, result: var Options, kind = cmdLongOption) =
if not isGlobalFlag: if not isGlobalFlag:
result.action.compileOptions.add(getFlagString(kind, flag, val)) result.action.compileOptions.add(getFlagString(kind, flag, val))
of actionRun: of actionRun:
result.action.runFlags.add(getFlagString(kind, flag, val)) result.showHelp = false
result.setRunOptions(flag, getFlagString(kind, flag, val), false)
of actionCustom: of actionCustom:
if result.action.command.normalize == "test": if result.action.command.normalize == "test":
if f == "continue" or f == "c": if f == "continue" or f == "c":
@ -371,7 +386,8 @@ proc parseFlag*(flag, val: string, result: var Options, kind = cmdLongOption) =
if not wasFlagHandled and not isGlobalFlag: if not wasFlagHandled and not isGlobalFlag:
result.unknownFlags.add((kind, flag, val)) result.unknownFlags.add((kind, flag, val))
proc initOptions(): Options = proc initOptions*(): Options =
# Exported for choosenim
Options( Options(
action: Action(typ: actionNil), action: Action(typ: actionNil),
pkgInfoCache: newTable[string, PackageInfo](), pkgInfoCache: newTable[string, PackageInfo](),
@ -428,7 +444,7 @@ proc parseCmdLine*(): Options =
else: else:
parseArgument(key, result) parseArgument(key, result)
of cmdLongOption, cmdShortOption: of cmdLongOption, cmdShortOption:
parseFlag(key, val, result, kind) parseFlag(key, val, result, kind)
of cmdEnd: assert(false) # cannot happen of cmdEnd: assert(false) # cannot happen
handleUnknownFlags(result) handleUnknownFlags(result)
@ -513,15 +529,23 @@ proc getCompilationFlags*(options: Options): seq[string] =
var opt = options var opt = options
return opt.getCompilationFlags() return opt.getCompilationFlags()
proc getCompilationBinary*(options: Options): Option[string] = proc getCompilationBinary*(options: Options, pkgInfo: PackageInfo): Option[string] =
case options.action.typ case options.action.typ
of actionBuild, actionDoc, actionCompile: of actionBuild, actionDoc, actionCompile:
let file = options.action.file.changeFileExt("") let file = options.action.file.changeFileExt("")
if file.len > 0: if file.len > 0:
return some(file) return some(file)
of actionRun: of actionRun:
let runFile = options.action.runFile.changeFileExt(ExeExt) let optRunFile = options.action.runFile
let runFile =
if optRunFile.get("").len > 0:
optRunFile.get()
elif pkgInfo.bin.len == 1:
pkgInfo.bin[0]
else:
""
if runFile.len > 0: if runFile.len > 0:
return some(runFile) return some(runFile.changeFileExt(ExeExt))
else: else:
discard discard

View file

@ -11,7 +11,7 @@ proc extractBin(cmd: string): string =
else: else:
return cmd.split(' ')[0] return cmd.split(' ')[0]
proc doCmd*(cmd: string, showOutput = false) = proc doCmd*(cmd: string, showOutput = false, showCmd = false) =
let bin = extractBin(cmd) let bin = extractBin(cmd)
if findExe(bin) == "": if findExe(bin) == "":
raise newException(NimbleError, "'" & bin & "' not in PATH.") raise newException(NimbleError, "'" & bin & "' not in PATH.")
@ -20,7 +20,10 @@ proc doCmd*(cmd: string, showOutput = false) =
stdout.flushFile() stdout.flushFile()
stderr.flushFile() stderr.flushFile()
displayDebug("Executing", cmd) if showCmd:
display("Executing", cmd, priority = MediumPriority)
else:
displayDebug("Executing", cmd)
if showOutput: if showOutput:
let exitCode = execCmd(cmd) let exitCode = execCmd(cmd)
displayDebug("Finished", "with exit code " & $exitCode) displayDebug("Finished", "with exit code " & $exitCode)

View file

@ -147,7 +147,7 @@ proc makeRange*(version: string, op: string): VersionRange =
result = VersionRange(kind: verEqLater) result = VersionRange(kind: verEqLater)
of "<=": of "<=":
result = VersionRange(kind: verEqEarlier) result = VersionRange(kind: verEqEarlier)
of "": of "", "==":
result = VersionRange(kind: verEq) result = VersionRange(kind: verEq)
else: else:
raise newException(ParseVersionError, "Invalid operator: " & op) raise newException(ParseVersionError, "Invalid operator: " & op)
@ -298,9 +298,10 @@ when isMainModule:
doAssert(newVersion("0.1.0") <= newVersion("0.1")) doAssert(newVersion("0.1.0") <= newVersion("0.1"))
var inter1 = parseVersionRange(">= 1.0 & <= 1.5") var inter1 = parseVersionRange(">= 1.0 & <= 1.5")
doAssert inter1.kind == verIntersect doAssert(inter1.kind == verIntersect)
var inter2 = parseVersionRange("1.0") var inter2 = parseVersionRange("1.0")
doAssert(inter2.kind == verEq) doAssert(inter2.kind == verEq)
doAssert(parseVersionRange("== 3.4.2") == parseVersionRange("3.4.2"))
doAssert(not withinRange(newVersion("1.5.1"), inter1)) doAssert(not withinRange(newVersion("1.5.1"), inter1))
doAssert(withinRange(newVersion("1.0.2.3.4.5.6.7.8.9.10.11.12"), inter1)) doAssert(withinRange(newVersion("1.0.2.3.4.5.6.7.8.9.10.11.12"), inter1))

View file

@ -9,10 +9,9 @@ license = "BSD"
requires "nim >= 0.12.1" requires "nim >= 0.12.1"
when defined(windows): let
let callNimble = "..\\..\\src\\nimble.exe" callNimble = getEnv("NIMBLE_TEST_BINARY_PATH")
else: doAssert callNimble.len != 0, "NIMBLE_TEST_BINARY_PATH not set"
let callNimble = "../../src/nimble"
task recurse, "Level 1": task recurse, "Level 1":
echo 1 echo 1

View file

@ -12,6 +12,9 @@ var installDir = rootDir / "tests" / "nimbleDir"
const path = "../src/nimble" const path = "../src/nimble"
const stringNotFound = -1 const stringNotFound = -1
# Set env var to propagate nimble binary path
putEnv("NIMBLE_TEST_BINARY_PATH", nimblePath)
# Clear nimble dir. # Clear nimble dir.
removeDir(installDir) removeDir(installDir)
createDir(installDir) createDir(installDir)
@ -35,7 +38,7 @@ proc execNimble(args: varargs[string]): tuple[output: string, exitCode: int] =
var quotedArgs = @args var quotedArgs = @args
quotedArgs.insert("--nimbleDir:" & installDir) quotedArgs.insert("--nimbleDir:" & installDir)
quotedArgs.insert(nimblePath) quotedArgs.insert(nimblePath)
quotedArgs = quotedArgs.map((x: string) => ("\"" & x & "\"")) quotedArgs = quotedArgs.map((x: string) => x.quoteShell)
let path {.used.} = getCurrentDir().parentDir() / "src" let path {.used.} = getCurrentDir().parentDir() / "src"
@ -480,17 +483,17 @@ test "issue #349":
] ]
proc checkName(name: string) = proc checkName(name: string) =
when defined(windows):
if name.toLowerAscii() in @["con", "nul"]:
return
let (outp, code) = execNimble("init", "-y", name) let (outp, code) = execNimble("init", "-y", name)
let msg = outp.strip.processOutput() let msg = outp.strip.processOutput()
check code == QuitFailure check code == QuitFailure
check inLines(msg, check inLines(msg,
"\"$1\" is an invalid package name: reserved name" % name) "\"$1\" is an invalid package name: reserved name" % name)
removeFile(name.changeFileExt("nimble")) try:
removeDir("src") removeFile(name.changeFileExt("nimble"))
removeDir("tests") removeDir("src")
removeDir("tests")
except OSError:
discard
for reserved in reservedNames: for reserved in reservedNames:
checkName(reserved.toUpperAscii()) checkName(reserved.toUpperAscii())
@ -930,7 +933,8 @@ suite "nimble run":
"blahblah", # The command to run "blahblah", # The command to run
) )
check exitCode == QuitFailure check exitCode == QuitFailure
check output.contains("Binary 'blahblah' is not defined in 'run' package.") check output.contains("Binary '$1' is not defined in 'run' package." %
"blahblah".changeFileExt(ExeExt))
test "Parameters passed to executable": test "Parameters passed to executable":
cd "run": cd "run":
@ -942,9 +946,54 @@ suite "nimble run":
"check" # Second argument passed to the executed command. "check" # Second argument passed to the executed command.
) )
check exitCode == QuitSuccess check exitCode == QuitSuccess
check output.contains("tests/run/run --debug check") check output.contains("tests$1run$1$2 --debug check" %
[$DirSep, "run".changeFileExt(ExeExt)])
check output.contains("""Testing `nimble run`: @["--debug", "check"]""") check output.contains("""Testing `nimble run`: @["--debug", "check"]""")
test "Parameters not passed to single executable":
cd "run":
var (output, exitCode) = execNimble(
"--debug", # Flag to enable debug verbosity in Nimble
"run", # Run command invokation
"--debug" # First argument passed to the executed command
)
check exitCode == QuitSuccess
check output.contains("tests$1run$1$2 --debug" %
[$DirSep, "run".changeFileExt(ExeExt)])
check output.contains("""Testing `nimble run`: @["--debug"]""")
test "Parameters passed to single executable":
cd "run":
var (output, exitCode) = execNimble(
"--debug", # Flag to enable debug verbosity in Nimble
"run", # Run command invokation
"--", # Flag to set run file to "" before next argument
"--debug", # First argument passed to the executed command
"check" # Second argument passed to the executed command.
)
check exitCode == QuitSuccess
check output.contains("tests$1run$1$2 --debug check" %
[$DirSep, "run".changeFileExt(ExeExt)])
check output.contains("""Testing `nimble run`: @["--debug", "check"]""")
test "Executable output is shown even when not debugging":
cd "run":
var (output, exitCode) =
execNimble("run", "run", "--option1", "arg1")
check exitCode == QuitSuccess
check output.contains("""Testing `nimble run`: @["--option1", "arg1"]""")
test "Quotes and whitespace are well handled":
cd "run":
var (output, exitCode) = execNimble(
"run", "run", "\"", "\'", "\t", "arg with spaces"
)
check exitCode == QuitSuccess
check output.contains(
"""Testing `nimble run`: @["\"", "\'", "\t", "arg with spaces"]"""
)
test "NimbleVersion is defined": test "NimbleVersion is defined":
cd "nimbleVersionDefine": cd "nimbleVersionDefine":
var (output, exitCode) = execNimble("c", "-r", "src/nimbleVersionDefine.nim") var (output, exitCode) = execNimble("c", "-r", "src/nimbleVersionDefine.nim")