Merge branch 'master' into araq-compiler-api2

This commit is contained in:
Araq 2016-11-01 00:21:51 +01:00
commit 9c81e28343
15 changed files with 141 additions and 119 deletions

View file

@ -1,5 +1,27 @@
[comment]: # (Before releasing, make sure to follow the steps in https://github.com/nim-lang/nimble/wiki/Releasing-a-new-version)
# Nimble changelog
## 0.7.10 - 09/10/2016
This release includes multiple bug fixes.
* Reverted patch that breaks binary stubs in Git Bash on Windows.
* The ``nimscriptapi.nim`` file is now statically compiled into the binary.
This should fix the "could not find nimscriptapi.nim" errors. The file can
still be overriden by placing a file named ``nimscriptapi.nim`` inside a
``nimblepkg`` directory that is placed alongside the Nimble binary, or
by a ``nimscriptapi.nim`` file inside ``~/.nimble/pkgs/nimble-ver/nimblepkg/``.
For more information see the
[code that looks for this file](https://github.com/nim-lang/nimble/blob/v0.7.10/src/nimblepkg/nimscriptsupport.nim#L176).
* Nim files can now be imported in .nimble nimscript files. (Issue [#186](https://github.com/nim-lang/nimble/issues/186))
* Requiring a specific git commit hash no longer fails. (Issue [#129](https://github.com/nim-lang/nimble/issues/129))
----
Full changelog: https://github.com/nim-lang/nimble/compare/v0.7.8...v0.7.10
## 0.7.8 - 28/09/2016
This is a hotfix release which fixes crashes when Nimble (or Nim) is installed

View file

@ -1,6 +1,13 @@
when dirExists("src"):
# In the git repository the Nimble sources are in a ``src`` directory.
import src/nimblepkg/common
else:
# When the package is installed, the ``src`` directory disappears.
import nimblepkg/common
# Package
version = "0.7.8"
version = nimbleVersion
author = "Dominik Picheta"
description = "Nim package manager."
license = "BSD"

View file

@ -8,11 +8,8 @@ Interested in learning **how to create a package**? Skip directly to that sectio
## Contents
- [Requirements](#requirements)
- [Installation](#installation)
- [Unix](#unix)
- [Windows](#windows)
- [Using the pre-built archives](#using-the-pre-built-archives)
- [From source](#from-source)
- [Nimble's folder structure and packages](#nimbles-folder-structure-and-packages)
- [Nimble usage](#nimble-usage)
- [nimble refresh](#nimble-refresh)
@ -47,15 +44,7 @@ Interested in learning **how to create a package**? Skip directly to that sectio
- [Contribution](#contribution)
- [About](#about)
## Installation
The latest version of Nimble (in the master branch) is primarily tested with
the latest version of the Nim compiler (in the devel branch). You can be sure
that Nimble will compile with that version of the compiler (a green travis
build status is also a good sign that this is the case).
The latest version of Nimble (0.7.4) requires a version of Nim greater than
or equal to 0.13.0. That being said, the latest version of Nim is recommended.
## Requirements
Nimble has some runtime dependencies on external tools, these tools are
used to download Nimble packages.
@ -71,51 +60,46 @@ If the version is less recent than 1.9.0 then Nimble may have trouble using it.
See [this issue](https://github.com/nim-lang/nimble/issues/105) for more
info.
The following sections give platform-specific instructions on how to
compile and install Nimble.
## Installation
### Source based installation
Nimble is now bundled with [Nim](http://nim-lang.org)
(since Nim version 0.15.0).
This means that you should have Nimble installed already, as long as you have
the latest version of Nim installed as well. Because of this **you likely do
not need to install Nimble manually**.
Run this command in your **Nim** directory::
But in case you still want to install Nimble manually, you can follow the
following instructions.
nim e install_nimble.nims
There are two ways to install Nimble manually. The first is using the
``install_nimble.nims`` script included in the Nim distribution and
[repository](https://github.com/nim-lang/Nim/blob/devel/install_nimble.nims).
Simply execute this to install Nimble.
This assumes that you also used the source based installation and added
``$nim/bin`` to your ``PATH``. If you create a symlink to ``nim`` instead,
you also need to create a symlink for ``nimble``.
```
nim e install_nimble.nims
```
### Windows
This will clone the Nimble repository, compile Nimble and copy it into
Nim's bin directory.
You can install Nimble via a pre-built installation archive which is
available on the [releases](https://github.com/nim-lang/nimble/releases) page.
Alternatively, you can also install Nimble from source.
The second approach is to install Nimble as a Nimble package. You can do this
by compiling Nimble, then running ``nimble install`` in Nimble's directory.
#### Using the pre-built archives
```
git clone https://github.com/nim-lang/nimble.git
cd nimble
nim c src/nimble
src/nimble install
```
Download the latest release archive from the
[releases](https://github.com/nim-lang/nimble/releases) page. These archives
will have a filename of the form ``nimble-x_win32`` where ``x`` is the
current version.
**Note for Windows users**: You will need to rename ``nimble.exe`` after
compilation to something else like ``nimble1.exe``, then run
``src\nimble1.exe install``.
Once you download that archive unzip it and execute the ``install.bat`` file.
One important thing to note is that this installation requires you have
the Nim compiler in your PATH. Once the installation completes you should
add ``C:\Users\YourName\.nimble\bin`` to your PATH.
#### From source
On Windows installing Nimble from source is slightly more complex:
git clone https://github.com/nim-lang/nimble.git
cd nimble
nim -d:release c src/nimble
cp src/nimble.exe src/nimble1.exe
src/nimble1.exe install
This is required because Windows will lock the process which is being run, but
during installation Nimble recompiles itself causing an error.
Once the installation completes you should
add ``C:\Users\YourName\.nimble\bin`` to your PATH.
This will install Nimble to the default Nimble packages location:
``~/.nimble/pkgs``. The binary will be installed to ``~/.nimble/bin``, so you
will need to add this directory to your PATH.
## Nimble's folder structure and packages

View file

@ -7,7 +7,7 @@ import httpclient, parseopt, os, strutils, osproc, pegs, tables, parseutils,
from sequtils import toSeq
import nimblepkg/packageinfo, nimblepkg/version, nimblepkg/tools,
nimblepkg/download, nimblepkg/config, nimblepkg/nimbletypes,
nimblepkg/download, nimblepkg/config, nimblepkg/common,
nimblepkg/publish, nimblepkg/options, nimblepkg/packageparser
import nimblepkg/nimscriptsupport
@ -30,9 +30,6 @@ else:
proc GetVersionExA*(VersionInformation: var OSVERSIONINFO): WINBOOL{.stdcall,
dynlib: "kernel32", importc: "GetVersionExA".}
const
nimbleVersion = "0.7.8"
proc writeVersion() =
echo("nimble v$# compiled at $# $#" %
[nimbleVersion, CompileDate, CompileTime])
@ -258,6 +255,7 @@ proc processDeps(pkginfo: PackageInfo, options: Options): seq[string] =
##
## Returns the list of paths to pass to the compiler during build phase.
result = @[]
assert(not pkginfo.isMinimal, "processDeps needs pkginfo.requires")
let pkglist = getInstalledPkgs(options.getPkgsDir(), options)
var reverseDeps: seq[tuple[name, version: string]] = @[]
for dep in pkginfo.requires:
@ -471,7 +469,7 @@ proc installFromDir(dir: string, latest: bool, options: Options,
# For bash on Windows (Cygwin/Git bash).
let bashDest = dest.changeFileExt("")
echo("Creating Cygwin stub: ", pkgDestDir / bin, " -> ", bashDest)
writeFile(bashDest, "\"$(cygpath '" & pkgDestDir / bin & "')\" \"$@\"\l")
writeFile(bashDest, "\"" & pkgDestDir / bin & "\" \"$@\"\n")
else:
{.error: "Sorry, your platform is not supported.".}
else:

40
src/nimblepkg/common.nim Normal file
View file

@ -0,0 +1,40 @@
# BSD License. Look at license.txt for more info.
#
# Various miscellaneous common types reside here, to avoid problems with
# recursive imports
when not defined(nimscript):
import sets
import version
export version.NimbleError
type
BuildFailed* = object of NimbleError
PackageInfo* = object
mypath*: string ## The path of this .nimble file
isNimScript*: bool ## Determines if this pkg info was read from a nims file
isMinimal*: bool
isInstalled*: bool ## Determines if the pkg this info belongs to is installed
postHooks*: HashSet[string] ## Useful to know so that Nimble doesn't execHook unnecessarily
preHooks*: HashSet[string]
name*: string
version*: string
author*: string
description*: string
license*: string
skipDirs*: seq[string]
skipFiles*: seq[string]
skipExt*: seq[string]
installDirs*: seq[string]
installFiles*: seq[string]
installExt*: seq[string]
requires*: seq[PkgTuple]
bin*: seq[string]
binDir*: string
srcDir*: string
backend*: string
const
nimbleVersion* = "0.7.10"

View file

@ -2,7 +2,7 @@
# BSD License. Look at license.txt for more info.
import parsecfg, streams, strutils, os, tables, Uri
import tools, version, nimbletypes
import tools, version, common
type
Config* = object

View file

@ -3,7 +3,7 @@
import parseutils, os, osproc, strutils, tables, pegs
import packageinfo, packageparser, version, tools, nimbletypes, options
import packageinfo, packageparser, version, tools, common, options
type
DownloadMethod* {.pure.} = enum
@ -174,13 +174,10 @@ proc doDownload*(url: string, downloadDir: string, verRange: VersionRange,
if verRange.spe == newSpecial(getHeadName(downMethod)):
doClone(downMethod, url, downloadDir) # Grab HEAD.
else:
# Mercurial requies a clone and checkout. The git clone operation is
# already fragmented into multiple steps so we just call doClone().
if downMethod == DownloadMethod.git:
doClone(downMethod, url, downloadDir, $verRange.spe)
else:
doClone(downMethod, url, downloadDir, tip = false)
doCheckout(downMethod, downloadDir, $verRange.spe)
# Grab the full repo.
doClone(downMethod, url, downloadDir, tip = false)
# Then perform a checkout operation to get the specified branch/commit.
doCheckout(downMethod, downloadDir, $verRange.spe)
result = verRange
else:
case downMethod

View file

@ -1,36 +0,0 @@
# BSD License. Look at license.txt for more info.
#
# Various miscellaneous common types reside here, to avoid problems with
# recursive imports
import sets
import version
export version.NimbleError
type
BuildFailed* = object of NimbleError
PackageInfo* = object
mypath*: string ## The path of this .nimble file
isNimScript*: bool ## Determines if this pkg info was read from a nims file
isMinimal*: bool
isInstalled*: bool ## Determines if the pkg this info belongs to is installed
postHooks*: HashSet[string] ## Useful to know so that Nimble doesn't execHook unnecessarily
preHooks*: HashSet[string]
name*: string
version*: string
author*: string
description*: string
license*: string
skipDirs*: seq[string]
skipFiles*: seq[string]
skipExt*: seq[string]
installDirs*: seq[string]
installFiles*: seq[string]
installExt*: seq[string]
requires*: seq[PkgTuple]
bin*: seq[string]
binDir*: string
srcDir*: string
backend*: string

View file

@ -8,13 +8,14 @@ import
compiler/ast, compiler/modules, compiler/passes, compiler/passaux,
compiler/condsyms, compiler/sem, compiler/semdata,
compiler/llstream, compiler/vm, compiler/vmdef, compiler/commands,
compiler/msgs, compiler/magicsys, compiler/lists, compiler/idents
compiler/msgs, compiler/magicsys, compiler/lists, compiler/idents,
compiler/nimconf
from compiler/scriptconfig import setupVM
from compiler/astalgo import strTableGet
import compiler/options as compiler_options
import nimbletypes, version, options, packageinfo
import common, version, options, packageinfo
import os, strutils, strtabs, times, osproc, sets
type
@ -27,6 +28,7 @@ type
const
internalCmd = "NimbleInternal"
nimscriptApi = staticRead("nimscriptapi.nim")
proc raiseVariableError(ident, typ: string) {.noinline.} =
raise newException(NimbleError,
@ -178,24 +180,20 @@ proc setupVM(module: PSym; scriptName: string,
flags[a.getString 0] = a.getString 1
proc findNimscriptApi(options: Options): string =
## Returns the directory containing ``nimscriptapi.nim``
var inPath = false
## Returns the directory containing ``nimscriptapi.nim`` or an empty string
## if it cannot be found.
result = ""
# Try finding it in exe's path
if fileExists(getAppDir() / "nimblepkg" / "nimscriptapi.nim"):
result = getAppDir()
inPath = true
if not inPath:
if result.len == 0:
let pkgs = getInstalledPkgsMin(options.getPkgsDir(), options)
var pkg: PackageInfo
if pkgs.findPkg(("nimble", newVRAny()), pkg):
let pkgDir = pkg.getRealDir()
if fileExists(pkgDir / "nimblepkg" / "nimscriptapi.nim"):
result = pkgDir
inPath = true
if not inPath:
raise newException(NimbleError, "Cannot find nimscriptapi.nim")
proc getNimPrefixDir(): string = splitPath(findExe("nim")).head.parentDir
@ -213,12 +211,20 @@ proc execScript(scriptName: string, flags: StringTableRef, options: Options) =
# Ensure that "nimblepkg/nimscriptapi" is in the PATH.
let nimscriptApiPath = findNimscriptApi(options)
appendStr(searchPaths, nimscriptApiPath)
if nimscriptApiPath.len > 0:
# TODO: Once better output is implemented show a message here.
appendStr(searchPaths, nimscriptApiPath)
else:
let tmpNimscriptApiPath = getTempDir() / "nimblepkg" / "nimscriptapi.nim"
createDir(tmpNimscriptApiPath.splitFile.dir)
if not existsFile(tmpNimscriptApiPath):
writeFile(tmpNimscriptApiPath, nimscriptApi)
appendStr(searchPaths, getTempDir())
setDefaultLibpath()
initDefines()
loadConfigs(DefaultConfig)
passes.gIncludeFile = includeModule
passes.gImportModule = importModule
initDefines()
defineSymbol("nimscript")
defineSymbol("nimconfig")

View file

@ -4,7 +4,7 @@
import json, strutils, os, parseopt, strtabs, uri, tables
from httpclient import Proxy, newProxy
import config, version, tools, nimbletypes
import config, version, tools, common
type
Options* = object

View file

@ -1,7 +1,7 @@
# Copyright (C) Dominik Picheta. All rights reserved.
# BSD License. Look at license.txt for more info.
import parsecfg, json, streams, strutils, parseutils, os, sets, tables
import version, tools, nimbletypes, options
import version, tools, common, options
type
Package* = object

View file

@ -1,7 +1,7 @@
# Copyright (C) Dominik Picheta. All rights reserved.
# BSD License. Look at license.txt for more info.
import parsecfg, json, streams, strutils, parseutils, os, tables
import version, tools, nimbletypes, nimscriptsupport, options, packageinfo
import version, tools, common, nimscriptsupport, options, packageinfo
## Contains procedures for parsing .nimble files. Moved here from ``packageinfo``
## because it depends on ``nimscriptsupport`` (``nimscriptsupport`` also
@ -250,7 +250,7 @@ proc getInstalledPkgs*(libsDir: string, options: Options):
if nimbleFile != "":
let meta = readMetaData(path)
try:
var pkg = readPackageInfo(nimbleFile, options, true)
var pkg = readPackageInfo(nimbleFile, options, onlyMinimalInfo=false)
pkg.isInstalled = true
result.add((pkg, meta))
except ValidationError:

View file

@ -5,7 +5,7 @@
## nim-lang/packages automatically.
import httpclient, base64, strutils, rdstdin, json, os, browsers, times, uri
import tools, nimbletypes
import tools, common
type
Auth = object

View file

@ -3,7 +3,7 @@
#
# Various miscellaneous utility functions reside here.
import osproc, pegs, strutils, os, uri, sets, json, parseutils
import version, packageinfo, nimbletypes
import version, packageinfo, common
proc extractBin(cmd: string): string =
if cmd[0] == '"':

View file

@ -22,6 +22,10 @@ proc inLines(lines: seq[string], line: string): bool =
for i in lines:
if line.normalize in i.normalize: return true
test "issue 129 (installing commit hash)":
check execCmdEx(path & " install -y \"https://github.com/nimble-test/packagea.git@#1f9cb289c89\"").
exitCode == QuitSuccess
test "issue 113 (uninstallation problems)":
cd "issue113/c":
check execCmdEx("../../" & path & " install -y").exitCode == QuitSuccess