Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/torch/luajit-rocks.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Fomitchev <bfomitchev@nvidia.com>2015-11-20 02:26:03 +0300
committerBoris Fomitchev <bfomitchev@nvidia.com>2015-11-20 02:26:03 +0300
commit6a17239fb3e1891cbf4170ccbeb0f1dcaf6e2b6e (patch)
treeebaf46a0a0f7df49b944e951217a0e709d930f71
parent0252c5d229e7f245e6cbee1e412b917047165151 (diff)
parentfbe7ffba6e8d6ec4375fb2fa85851ea595d2fb60 (diff)
Merged master from kepler/luarocks
-rw-r--r--luarocks/.appveyor/build.bat111
-rw-r--r--luarocks/.appveyor/install.bat154
-rw-r--r--luarocks/.gitignore2
-rw-r--r--luarocks/.travis.yml5
-rw-r--r--luarocks/Makefile41
-rw-r--r--luarocks/Makefile.install.inc22
-rw-r--r--luarocks/Makefile.luarocks15
-rw-r--r--luarocks/Makefile.setup.inc20
-rw-r--r--luarocks/README.md17
-rw-r--r--luarocks/appveyor.yml30
-rwxr-xr-xluarocks/configure62
-rw-r--r--luarocks/install.bat183
-rwxr-xr-xluarocks/makedist8
-rw-r--r--luarocks/rockspec16
-rwxr-xr-xluarocks/src/bin/luarocks.in1
-rw-r--r--luarocks/src/luarocks/add.lua2
-rw-r--r--luarocks/src/luarocks/admin_remove.lua2
-rw-r--r--luarocks/src/luarocks/build.lua55
-rw-r--r--luarocks/src/luarocks/build/builtin.lua10
-rw-r--r--luarocks/src/luarocks/build/cmake.lua25
-rw-r--r--luarocks/src/luarocks/cfg.lua345
-rw-r--r--luarocks/src/luarocks/command_line.lua38
-rw-r--r--luarocks/src/luarocks/config_cmd.lua73
-rw-r--r--luarocks/src/luarocks/deps.lua2
-rw-r--r--luarocks/src/luarocks/doc.lua6
-rw-r--r--luarocks/src/luarocks/fetch.lua19
-rw-r--r--luarocks/src/luarocks/fetch/cvs.lua8
-rw-r--r--luarocks/src/luarocks/fetch/git.lua7
-rw-r--r--luarocks/src/luarocks/fetch/git_https.lua7
-rw-r--r--luarocks/src/luarocks/fetch/hg.lua9
-rw-r--r--luarocks/src/luarocks/fetch/hg_http.lua24
-rw-r--r--luarocks/src/luarocks/fetch/hg_https.lua8
-rw-r--r--luarocks/src/luarocks/fetch/hg_ssh.lua8
-rw-r--r--luarocks/src/luarocks/fetch/svn.lua5
-rw-r--r--luarocks/src/luarocks/fs.lua3
-rw-r--r--luarocks/src/luarocks/fs/lua.lua40
-rw-r--r--luarocks/src/luarocks/fs/unix/tools.lua23
-rw-r--r--luarocks/src/luarocks/fs/win32.lua1
-rw-r--r--luarocks/src/luarocks/fs/win32/tools.lua12
-rw-r--r--luarocks/src/luarocks/help.lua14
-rw-r--r--luarocks/src/luarocks/install.lua49
-rw-r--r--luarocks/src/luarocks/list.lua70
-rw-r--r--luarocks/src/luarocks/manif_core.lua1
-rw-r--r--luarocks/src/luarocks/path.lua5
-rw-r--r--luarocks/src/luarocks/path_cmd.lua1
-rw-r--r--luarocks/src/luarocks/persist.lua151
-rw-r--r--luarocks/src/luarocks/remove.lua2
-rw-r--r--luarocks/src/luarocks/search.lua5
-rw-r--r--luarocks/src/luarocks/show.lua2
-rw-r--r--luarocks/src/luarocks/tools/patch.lua63
-rw-r--r--luarocks/src/luarocks/tools/tar.lua8
-rw-r--r--luarocks/src/luarocks/tools/zip.lua6
-rw-r--r--luarocks/src/luarocks/type_check.lua276
-rw-r--r--luarocks/src/luarocks/unpack.lua6
-rw-r--r--luarocks/src/luarocks/upload.lua4
-rw-r--r--luarocks/src/luarocks/upload/api.lua29
-rw-r--r--luarocks/src/luarocks/upload/multipart.lua5
-rw-r--r--luarocks/src/luarocks/util.lua126
-rw-r--r--luarocks/src/luarocks/write_rockspec.lua53
-rw-r--r--luarocks/test/testfiles/invalid_patch-0.1-1.rockspec29
-rw-r--r--luarocks/test/testfiles/no_build_table-0.1-1.rockspec12
-rw-r--r--luarocks/test/testfiles/not_a_zipfile-1.0-1.src.rock1
-rw-r--r--luarocks/test/testfiles/type_mismatch_string-1.0-1.rockspec4
-rw-r--r--luarocks/test/testfiles/type_mismatch_table-1.0-1.rockspec5
-rw-r--r--luarocks/test/testfiles/type_mismatch_version-1.0-1.rockspec4
-rw-r--r--luarocks/test/testing.bat9
-rw-r--r--luarocks/test/testing.lua457
-rwxr-xr-xluarocks/test/testing.sh185
-rw-r--r--luarocks/win32/pe-parser.lua15
69 files changed, 2299 insertions, 717 deletions
diff --git a/luarocks/.appveyor/build.bat b/luarocks/.appveyor/build.bat
new file mode 100644
index 0000000..a4ff637
--- /dev/null
+++ b/luarocks/.appveyor/build.bat
@@ -0,0 +1,111 @@
+@echo off
+Setlocal EnableDelayedExpansion EnableExtensions
+
+cd %APPVEYOR_BUILD_FOLDER%
+
+:: =========================================================
+:: Make sure some environment variables are set
+if not defined LUA_VER call :die LUA_VER is not defined
+if not defined LUA call :die LUA is not defined
+if not defined LUA_SHORTV call :die LUA_SHORTV is not defined
+if not defined LUA_DIR call :die LUA_DIR is not defined
+
+:: =========================================================
+:: Set some defaults. Infer some variables.
+::
+if not defined LUAROCKS_VER set LUAROCKS_VER=2.2.1
+
+set LUAROCKS_SHORTV=%LUAROCKS_VER:~0,3%
+
+if not defined LR_EXTERNAL set LR_EXTERNAL=c:\external
+if not defined LR_ROOT set LR_ROOT=%LUA_DIR%\LuaRocks
+if not defined LR_SYSTREE set LR_SYSTREE=%LR_ROOT%\systree
+
+::
+:: =========================================================
+
+
+if not exist %LUA_DIR%\bin\%LUA%.exe call :die "Missing Lua interpreter at %LUA_DIR%\bin\%LUA%.exe"
+
+
+
+:: =========================================================
+:: LuaRocks
+:: =========================================================
+
+cd %APPVEYOR_BUILD_FOLDER%
+call install.bat /LUA %LUA_DIR% /Q /LV %LUA_SHORTV% /P "%LR_ROOT%" /TREE "%LR_SYSTREE%"
+
+if not exist "%LR_ROOT%" call :die "LuaRocks not found at %LR_ROOT%"
+
+set PATH=%LR_ROOT%;%LR_SYSTREE%\bin;%PATH%
+
+:: Lua will use just the system rocks
+set LUA_PATH=%LR_ROOT%\lua\?.lua;%LR_ROOT%\lua\?\init.lua
+set LUA_PATH=%LUA_PATH%;%LR_SYSTREE%\share\lua\%LUA_SHORTV%\?.lua
+set LUA_PATH=%LUA_PATH%;%LR_SYSTREE%\share\lua\%LUA_SHORTV%\?\init.lua
+set LUA_CPATH=%LR_SYSTREE%\lib\lua\%LUA_SHORTV%\?.dll
+
+call luarocks --version || call :die "Error with LuaRocks installation"
+call luarocks list
+
+
+if not exist "%LR_EXTERNAL%" (
+ mkdir "%LR_EXTERNAL%"
+ mkdir "%LR_EXTERNAL%\lib"
+ mkdir "%LR_EXTERNAL%\include"
+)
+
+set PATH=%LR_EXTERNAL%;%PATH%
+
+:: Exports the following variables:
+:: (beware of whitespace between & and ^ below)
+endlocal & set PATH=%PATH%&^
+set LR_SYSTREE=%LR_SYSTREE%&^
+set LUA_PATH=%LUA_PATH%&^
+set LUA_CPATH=%LUA_CPATH%&^
+set LR_EXTERNAL=%LR_EXTERNAL%
+
+echo.
+echo ======================================================
+echo Installation of LuaRocks %LUAROCKS_VER% done.
+echo .
+echo LUA_PATH - %LUA_PATH%
+echo LUA_CPATH - %LUA_CPATH%
+echo.
+echo LR_EXTERNAL - %LR_EXTERNAL%
+echo ======================================================
+echo.
+
+goto :eof
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+:: This blank space is intentional. If you see errors like "The system cannot find the batch label specified 'foo'"
+:: then try adding or removing blank lines lines above.
+:: Yes, really.
+:: http://stackoverflow.com/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-thrown-even-if-label-e
+
+:: helper functions:
+
+:: for bailing out when an error occurred
+:die %1
+echo %1
+exit /B 1
+goto :eof
+
diff --git a/luarocks/.appveyor/install.bat b/luarocks/.appveyor/install.bat
new file mode 100644
index 0000000..a2aefdd
--- /dev/null
+++ b/luarocks/.appveyor/install.bat
@@ -0,0 +1,154 @@
+@echo off
+
+cd %APPVEYOR_BUILD_FOLDER%
+
+:: =========================================================
+:: Set some defaults. Infer some variables.
+::
+:: These are set globally
+if "%LUA_VER%" NEQ "" (
+ set LUA=lua
+ set LUA_SHORTV=%LUA_VER:~0,3%
+) else (
+ set LUA=luajit
+ set LJ_SHORTV=%LJ_VER:~0,3%
+ set LUA_SHORTV=5.1
+)
+
+:: unless we specify a platform on appveyor.yaml, we won't get this variable
+if not defined platform set platform=x86
+
+:: defines LUA_DIR so Cmake can find this Lua install
+if "%LUA%"=="luajit" (
+ set LUA_DIR=c:\lua\%platform%\lj%LJ_SHORTV%
+) else (
+ set LUA_DIR=c:\lua\%platform%\%LUA_VER%
+)
+
+:: Now we declare a scope
+Setlocal EnableDelayedExpansion EnableExtensions
+
+if not defined LUA_URL set LUA_URL=http://www.lua.org/ftp
+if not defined LUAJIT_GIT_REPO set LUAJIT_GIT_REPO=http://luajit.org/git/luajit-2.0.git
+if not defined LUAJIT_URL set LUAJIT_URL=http://luajit.org/download
+
+if not defined SEVENZIP set SEVENZIP=7z
+::
+:: =========================================================
+
+:: first create some necessary directories:
+mkdir downloads 2>NUL
+
+:: Download and compile Lua (or LuaJIT)
+if "%LUA%"=="luajit" (
+ if not exist %LUA_DIR% (
+ if "%LJ_SHORTV%"=="2.1" (
+ :: Clone repository and checkout 2.1 branch
+ set lj_source_folder=%APPVEYOR_BUILD_FOLDER%\downloads\luajit-%LJ_VER%
+ if not exist !lj_source_folder! (
+ echo Cloning git repo %LUAJIT_GIT_REPO% !lj_source_folder!
+ git clone %LUAJIT_GIT_REPO% !lj_source_folder! || call :die "Failed to clone repository"
+ )
+ cd !lj_source_folder!\src
+ git checkout v2.1 || call :die
+ ) else (
+ set lj_source_folder=%APPVEYOR_BUILD_FOLDER%\downloads\luajit-%LJ_VER%
+ if not exist !lj_source_folder! (
+ echo Downloading... %LUAJIT_URL%/LuaJIT-%LJ_VER%.tar.gz
+ curl --silent --fail --max-time 120 --connect-timeout 30 %LUAJIT_URL%/LuaJIT-%LJ_VER%.tar.gz | %SEVENZIP% x -si -so -tgzip | %SEVENZIP% x -si -ttar -aoa -odownloads
+ )
+ cd !lj_source_folder!\src
+ )
+ :: Compiles LuaJIT
+ call msvcbuild.bat
+
+ mkdir %LUA_DIR% 2> NUL
+ for %%a in (bin include lib) do ( mkdir "%LUA_DIR%\%%a" )
+
+ for %%a in (luajit.exe lua51.dll) do ( move "!lj_source_folder!\src\%%a" "%LUA_DIR%\bin" )
+
+ move "!lj_source_folder!\src\lua51.lib" "%LUA_DIR%\lib"
+ for %%a in (lauxlib.h lua.h lua.hpp luaconf.h lualib.h luajit.h) do (
+ copy "!lj_source_folder!\src\%%a" "%LUA_DIR%\include"
+ )
+
+ ) else (
+ echo LuaJIT %LJ_VER% already installed at %LUA_DIR%
+ )
+) else (
+ if not exist %LUA_DIR% (
+ :: Download and compile Lua
+ if not exist downloads\lua-%LUA_VER% (
+ curl --silent --fail --max-time 120 --connect-timeout 30 %LUA_URL%/lua-%LUA_VER%.tar.gz | %SEVENZIP% x -si -so -tgzip | %SEVENZIP% x -si -ttar -aoa -odownloads
+ )
+
+ mkdir downloads\lua-%LUA_VER%\etc 2> NUL
+ if not exist downloads\lua-%LUA_VER%\etc\winmake.bat (
+ curl --silent --location --insecure --fail --max-time 120 --connect-timeout 30 https://github.com/Tieske/luawinmake/archive/master.tar.gz | %SEVENZIP% x -si -so -tgzip | %SEVENZIP% e -si -ttar -aoa -odownloads\lua-%LUA_VER%\etc luawinmake-master\etc\winmake.bat
+ )
+
+ cd downloads\lua-%LUA_VER%
+ call etc\winmake
+ call etc\winmake install %LUA_DIR%
+ ) else (
+ echo Lua %LUA_VER% already installed at %LUA_DIR%
+ )
+)
+
+if not exist %LUA_DIR%\bin\%LUA%.exe call :die "Missing Lua interpreter at %LUA_DIR%\bin\%LUA%.exe"
+
+set PATH=%LUA_DIR%\bin;%PATH%
+call %LUA% -v
+
+
+
+:: Exports the following variables:
+endlocal & set PATH=%PATH%
+
+echo.
+echo ======================================================
+if "%LUA%"=="luajit" (
+ echo Installation of LuaJIT %LJ_VER% done.
+) else (
+ echo Installation of Lua %LUA_VER% done.
+)
+echo Platform - %platform%
+echo LUA - %LUA%
+echo LUA_SHORTV - %LUA_SHORTV%
+echo LJ_SHORTV - %LJ_SHORTV%
+echo.
+echo ======================================================
+echo.
+
+goto :eof
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+:: This blank space is intentional. If you see errors like "The system cannot find the batch label specified 'foo'"
+:: then try adding or removing blank lines lines above.
+:: Yes, really.
+:: http://stackoverflow.com/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-thrown-even-if-label-e
+
+:: helper functions:
+
+:: for bailing out when an error occurred
+:die %1
+echo %1
+exit /B 1
+goto :eof
+
diff --git a/luarocks/.gitignore b/luarocks/.gitignore
index 13a0772..f74b954 100644
--- a/luarocks/.gitignore
+++ b/luarocks/.gitignore
@@ -1,2 +1,4 @@
/config.*
/src/luarocks/site_config.lua
+/test/testing_*
+/test/luacov.*
diff --git a/luarocks/.travis.yml b/luarocks/.travis.yml
index cf2b1e6..69ec28f 100644
--- a/luarocks/.travis.yml
+++ b/luarocks/.travis.yml
@@ -2,9 +2,12 @@ language: c
compiler: gcc
+sudo: false
+
env:
matrix:
- LUA_VER=5.1.5
- - LUA_VER=5.2.3
+ - LUA_VER=5.2.4
+ - LUA_VER=5.3.1
script: cd test && ./testing.sh --travis --lua $LUA_VER
diff --git a/luarocks/Makefile b/luarocks/Makefile
index 1f9d0e2..81d24d2 100644
--- a/luarocks/Makefile
+++ b/luarocks/Makefile
@@ -2,31 +2,13 @@
include config.unix
.PHONY: all build dev build_bins luadoc check_makefile cleanup_bins clean \
- install_bins install_luas install_site_config write_sysconfig \
- install bootstrap install_rock
+ install_site_config write_sysconfig install bootstrap install_rock
-DESTDIR =
-PREFIX ?= /usr/local
ROCKS_TREE ?= $(PREFIX)
SYSCONFDIR ?= $(PREFIX)/etc/luarocks
-BINDIR ?= $(PREFIX)/bin
-LUADIR ?= $(PREFIX)/share/lua/$(LUA_VERSION)/
LUA_DIR ?= /usr/local
LUA_BINDIR ?= $(LUA_DIR)/bin
-BIN_FILES = luarocks luarocks-admin
-LUAROCKS_FILES = fs/unix/tools.lua fs/unix.lua fs/win32/tools.lua fs/win32.lua \
-fs/lua.lua persist.lua list.lua require.lua repos.lua dir.lua make_manifest.lua \
-command_line.lua install.lua build/command.lua build/cmake.lua build/make.lua \
-build/builtin.lua fetch/cvs.lua fetch/git.lua fetch/sscm.lua tools/patch.lua \
-fetch/svn.lua tools/zip.lua tools/tar.lua pack.lua type_check.lua make.lua \
-remove.lua fs.lua manif.lua add.lua deps.lua build.lua search.lua show.lua \
-manif_core.lua fetch.lua unpack.lua validate.lua cfg.lua download.lua \
-help.lua util.lua index.lua cache.lua refresh_cache.lua loader.lua \
-admin_remove.lua fetch/hg.lua fetch/git_file.lua new_version.lua lint.lua \
-purge.lua path.lua path_cmd.lua write_rockspec.lua doc.lua upload.lua \
-upload/api.lua upload/multipart.lua fetch/git_http.lua
-
CONFIG_FILE = $(SYSCONFDIR)/config-$(LUA_VERSION).lua
SAFEPWD=`echo "$$PWD" | sed -e 's/\([][]\)\1/]]..'\''\1\1'\''..[[/g'`
@@ -38,6 +20,9 @@ all:
@echo " to install LuaRocks in $(PREFIX) as a rock."
@echo
+include Makefile.setup.inc
+include Makefile.install.inc
+
build: src/luarocks/site_config.lua build_bins
@echo
@echo "Done. Type 'make install' to install into $(PREFIX)."
@@ -139,23 +124,6 @@ cleanup_bins:
clean: cleanup_bins
rm -f src/luarocks/site_config.lua
-install_bins:
- mkdir -p "$(DESTDIR)$(BINDIR)"
- cd src/bin && for f in $(BIN_FILES); \
- do \
- cp "$$f" "$(DESTDIR)$(BINDIR)/$$f-$(LUA_VERSION)"; \
- ln -nfs "$$f-$(LUA_VERSION)" "$(DESTDIR)$(BINDIR)/$$f"; \
- done
-
-install_luas:
- mkdir -p "$(DESTDIR)$(LUADIR)/luarocks"
- cd src/luarocks && for f in $(LUAROCKS_FILES); \
- do \
- d="$(DESTDIR)$(LUADIR)/luarocks"/`dirname "$$f"` && \
- mkdir -p "$$d" && \
- cp "$$f" "$$d" || exit 1; \
- done
-
install_site_config: src/luarocks/site_config.lua
mkdir -p "$(DESTDIR)$(LUADIR)/luarocks"
cp src/luarocks/site_config.lua "$(DESTDIR)$(LUADIR)/luarocks"
@@ -180,3 +148,4 @@ bootstrap: src/luarocks/site_config.lua install_site_config write_sysconfig clea
'$(LUA_BINDIR)/lua$(LUA_SUFFIX)' -e "package.path=[[$(SAFEPWD)/src/?.lua;]]..package.path" src/bin/luarocks make rockspec --tree="$(PREFIX)"
install_rock: install_bins install_luas
+
diff --git a/luarocks/Makefile.install.inc b/luarocks/Makefile.install.inc
new file mode 100644
index 0000000..20d96a1
--- /dev/null
+++ b/luarocks/Makefile.install.inc
@@ -0,0 +1,22 @@
+
+.PHONY: install_bins install_luas
+
+install_bins:
+ mkdir -p "$(DESTDIR)$(BINDIR)"
+ cd src/bin && \
+ luaver="$(LUA_VERSION)" && [ -n "$$luaver" ] || luaver=`$(LUA) -e 'print(_VERSION:sub(5))'`; \
+ for f in $(BIN_FILES); \
+ do \
+ cp "$$f" "$(DESTDIR)$(BINDIR)/$$f-$$luaver"; \
+ ln -nfs "$$f-$$luaver" "$(DESTDIR)$(BINDIR)/$$f"; \
+ done
+
+install_luas:
+ mkdir -p "$(DESTDIR)$(LUADIR)/luarocks"
+ cd src/luarocks && for f in $(LUAROCKS_FILES); \
+ do \
+ d="$(DESTDIR)$(LUADIR)/luarocks"/`dirname "$$f"` && \
+ mkdir -p "$$d" && \
+ cp "$$f" "$$d" || exit 1; \
+ done
+
diff --git a/luarocks/Makefile.luarocks b/luarocks/Makefile.luarocks
new file mode 100644
index 0000000..1eecfea
--- /dev/null
+++ b/luarocks/Makefile.luarocks
@@ -0,0 +1,15 @@
+
+include Makefile.setup.inc
+include Makefile.install.inc
+
+.PHONY: all install copy_site_config
+
+all:
+ @echo This Makefile is used by the LuaRocks rockspec for upgrading itself.
+
+install: install_bins install_luas copy_site_config
+
+copy_site_config:
+ luaver="$(LUA_VERSION)" && [ -n "$$luaver" ] || luaver=`$(LUA) -e 'print(_VERSION:sub(5))'`; \
+ mkdir -p "$(DESTDIR)$(LUADIR)/luarocks"; \
+ cp $(LUAROCKS_PREFIX)/share/lua/$$luaver/luarocks/site_config.lua "$(DESTDIR)$(LUADIR)/luarocks"
diff --git a/luarocks/Makefile.setup.inc b/luarocks/Makefile.setup.inc
new file mode 100644
index 0000000..c228e78
--- /dev/null
+++ b/luarocks/Makefile.setup.inc
@@ -0,0 +1,20 @@
+
+DESTDIR =
+PREFIX ?= /usr/local
+BINDIR ?= $(PREFIX)/bin
+LUADIR ?= $(PREFIX)/share/lua/$(LUA_VERSION)/
+
+BIN_FILES = luarocks luarocks-admin
+LUAROCKS_FILES = fs/unix/tools.lua fs/unix.lua fs/win32/tools.lua fs/win32.lua \
+fs/lua.lua persist.lua list.lua require.lua repos.lua dir.lua make_manifest.lua \
+command_line.lua config_cmd.lua install.lua build/command.lua build/cmake.lua \
+build/make.lua build/builtin.lua fetch/cvs.lua fetch/git.lua fetch/sscm.lua \
+tools/patch.lua fetch/svn.lua tools/zip.lua tools/tar.lua pack.lua type_check.lua \
+make.lua remove.lua fs.lua manif.lua add.lua deps.lua build.lua search.lua \
+show.lua manif_core.lua fetch.lua unpack.lua validate.lua cfg.lua download.lua \
+help.lua util.lua index.lua cache.lua refresh_cache.lua loader.lua \
+admin_remove.lua fetch/hg.lua fetch/git_file.lua new_version.lua lint.lua \
+purge.lua path.lua path_cmd.lua write_rockspec.lua doc.lua upload.lua \
+upload/api.lua upload/multipart.lua fetch/git_http.lua fetch/hg_http.lua \
+fetch/hg_https.lua fetch/hg_ssh.lua fetch/git_https.lua
+
diff --git a/luarocks/README.md b/luarocks/README.md
index c779c3d..02543ef 100644
--- a/luarocks/README.md
+++ b/luarocks/README.md
@@ -1,22 +1,23 @@
-LuaRocks
-========
+<p align="center"><a href="http://luarocks.org"><img border="0" src="http://keplerproject.github.io/luarocks/luarocks.png" alt="LuaRocks" width="500px"></a></p>
A package manager for Lua modules.
[![Build Status](https://travis-ci.org/keplerproject/luarocks.png?branch=master)](https://travis-ci.org/keplerproject/luarocks)
+[![Build status](https://ci.appveyor.com/api/projects/status/4x4630tcf64da48i/branch/master?svg=true)](https://ci.appveyor.com/project/hishamhm/luarocks/branch/master)
+[![Coverage Status](https://coveralls.io/repos/keplerproject/luarocks/badge.svg?branch=master)](https://coveralls.io/r/keplerproject/luarocks?branch=master)
Main website: [luarocks.org](http://www.luarocks.org)
It allows you to install Lua modules as self-contained packages called
[*rocks*][1], which also contain version [dependency][2] information. This
-information is used both during installation, so that when one rock is
-requested all rocks it depends on are installed as well, and at run time, so
-that when a module is required, the correct version is loaded. LuaRocks
-supports both local and [remote][3] repositories, and multiple local rocks
-trees. You can [download][4] and install LuaRocks on [Unix][5] and
+information can be used both during installation, so that when one rock is
+requested all rocks it depends on are installed as well, and also optionally
+at run time, so that when a module is required, the correct version is loaded.
+LuaRocks supports both local and [remote][3] repositories, and multiple local
+rocks trees. You can [download][4] and install LuaRocks on [Unix][5] and
[Windows][6].
-LuaRocks is free software and uses the same [license][7] as Lua 5.1.
+LuaRocks is free software and uses the same [license][7] as Lua 5.x.
[1]: http://luarocks.org/en/Types_of_rocks
[2]: http://luarocks.org/en/Dependencies
diff --git a/luarocks/appveyor.yml b/luarocks/appveyor.yml
new file mode 100644
index 0000000..d7fc7cc
--- /dev/null
+++ b/luarocks/appveyor.yml
@@ -0,0 +1,30 @@
+version: 2.2.1.{build}-test
+
+shallow_clone: true
+
+environment:
+ LUAROCKS_VER: 2.2.1
+
+ matrix:
+ - LUA_VER: 5.1.5
+ - LUA_VER: 5.2.4
+ - LUA_VER: 5.3.1
+ - LJ_VER: 2.0.4
+ - LJ_VER: 2.1
+
+init:
+# Setup Lua development/build environment
+# Make VS 2015 command line tools available
+- call "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %platform%
+
+install:
+# Setup Lua development/build environment
+- call .appveyor\install.bat
+
+build_script:
+- call .appveyor\build.bat
+
+test_script:
+- echo "Testing..."
+- cd test
+- call testing.bat
diff --git a/luarocks/configure b/luarocks/configure
index a7b8529..8b99b2a 100755
--- a/luarocks/configure
+++ b/luarocks/configure
@@ -40,7 +40,7 @@ system's package manager.
Default is \$PREFIX
--lua-version=VERSION Use specific Lua version: 5.1, 5.2, or 5.3
- Default is "$LUA_VERSION"
+ Default is auto-detected.
--lua-suffix=SUFFIX Versioning suffix to use in Lua filenames.
Default is "$LUA_SUFFIX" (lua$LUA_SUFFIX...)
--with-lua=PREFIX Use Lua from given prefix.
@@ -71,26 +71,7 @@ EOF
# Helper functions
find_program() {
- path="$PATH"
- item="`echo "$path" | sed 's/\([^:]*\):.*/\1/'`"
- path="`echo "$path" | sed -n 's/[^:]*::*\(.*\)/\1/p'`"
- found="no"
- while [ -n "$item" ]
- do
- if [ -f "$item/$1" ]
- then
- found="yes"
- break
- fi
- item="`echo "$path" | sed 's/\([^:]*\):.*/\1/'`"
- path="`echo "$path" | sed -n 's/[^:]*::*\(.*\)/\1/p'`"
- done
- if [ "$found" = "yes" ]
- then
- echo "$item"
- else
- echo ""
- fi
+ command -v "$1" 2>/dev/null
}
die() {
@@ -177,7 +158,7 @@ do
LUA_SUFFIX="$value"
LUA_SUFFIX_SET=yes
;;
- --lua-version)
+ --lua-version|--with-lua-version)
[ -n "$value" ] || die "Missing value in flag $key."
LUA_VERSION="$value"
[ "$LUA_VERSION" = "5.1" -o "$LUA_VERSION" = "5.2" -o "$LUA_VERSION" = "5.3" ] || die "Invalid Lua version in flag $key."
@@ -250,13 +231,13 @@ detect_lua_version() {
LUA_VERSION=$detected_lua
elif [ "$LUA_VERSION" != "$detected_lua" ]
then
- die "This clashes with the value of --with-lua-version. Please check your configuration."
+ die "This clashes with the value of --lua-version. Please check your configuration."
fi
fi
}
search_interpreter() {
- LUA_SUFFIX="$1"
+ suffix="$1"
if [ "$LUA_BINDIR_SET" = "yes" ]
then
find_lua="$LUA_BINDIR"
@@ -269,10 +250,11 @@ search_interpreter() {
else
find_lua=`find_program lua$suffix`
fi
- if [ -n "$find_lua" ]
+ if [ -n "$find_lua" -a -x "$find_lua/lua$suffix" ]
then
- echo "Lua interpreter: $find_lua/lua$suffix..."
- detect_lua_version "$find_lua/lua$suffix"
+ echo "Lua interpreter found: $find_lua/lua$suffix..."
+ LUA_SUFFIX=$suffix
+ detect_lua_version "$find_lua/lua$LUA_SUFFIX"
return 0
fi
return 1
@@ -292,9 +274,13 @@ then
else
suffixes="5.3 53 -5.3 -53 5.2 52 -5.2 -52 5.1 51 -5.1 -51"
fi
- for suffix in `echo $suffixes` ""
+ lua_interp_found=no
+ for suffix in "" `echo $suffixes`
do
- search_interpreter "$suffix" && break
+ search_interpreter "$suffix" && {
+ lua_interp_found=yes
+ break
+ }
done
fi
@@ -313,7 +299,7 @@ then
echo "lua$LUA_SUFFIX found in \$PATH: $find_lua"
else
echo "lua$LUA_SUFFIX not found in \$PATH."
- die "You may want to use the flags --with-lua and/or --lua-suffix. See --help."
+ die "You may want to use the flags --with-lua, --with-lua-bin and/or --lua-suffix. See --help."
fi
fi
@@ -332,6 +318,18 @@ then
LUA_BINDIR="$LUA_DIR/bin"
fi
+if [ "$lua_interp_found" != "yes" ]
+then
+ echo_n "Checking Lua interpreter... "
+ if [ -x "$LUA_BINDIR/lua$LUA_SUFFIX" ]
+ then
+ echo "lua$LUA_SUFFIX found in $LUA_BINDIR"
+ else
+ echo "lua$LUA_SUFFIX not found (looked in $LUA_BINDIR)"
+ die "You may want to use the flag --with-lua or --with-lua-bin. See --help."
+ fi
+fi
+
echo_n "Checking Lua includes... "
lua_h="$LUA_INCDIR/lua.h"
if [ -f "$lua_h" ]
@@ -419,6 +417,10 @@ then
if [ -n "$GCC_ARCH" -a -d "/usr/lib/$GCC_ARCH" ]
then
MULTIARCH_SUBDIR="lib/$GCC_ARCH"
+ elif [ -d "/usr/lib64" ]
+ then
+ # Useful for Fedora systems
+ MULTIARCH_SUBDIR="lib64"
fi
fi
diff --git a/luarocks/install.bat b/luarocks/install.bat
index ad3573c..e362b31 100644
--- a/luarocks/install.bat
+++ b/luarocks/install.bat
@@ -8,6 +8,9 @@ local vars = {}
vars.PREFIX = nil
vars.VERSION = "2.2"
vars.SYSCONFDIR = nil
+vars.CONFBACKUPDIR = nil
+vars.SYSCONFFILENAME = nil
+vars.CONFIG_FILE = nil
vars.TREE_ROOT = nil
vars.TREE_BIN = nil
vars.TREE_LMODULE = nil
@@ -77,7 +80,7 @@ end
local function exec(cmd)
--print(cmd)
- local status = os.execute(cmd)
+ local status = os.execute("type NUL && "..cmd)
return (status == 0 or status == true) -- compat 5.1/5.2
end
@@ -90,12 +93,12 @@ local function mkdir (dir)
return exec([[.\win32\tools\mkdir -p "]]..dir..[[" >NUL]])
end
--- does the current user have admin priviledges ( = elevated)
+-- does the current user have admin privileges ( = elevated)
local function permission()
return exec("net session >NUL 2>&1") -- fails if not admin
end
--- rename file (full path) to backup (name only), appending number if required
+-- rename filename (full path) to backupname (name only), appending number if required
-- returns the new name (name only)
local function backup(filename, backupname)
local path = filename:match("(.+)%\\.-$").."\\"
@@ -119,14 +122,12 @@ local function print_help()
Installs LuaRocks.
/P [dir] Where to install LuaRocks.
- Note that version; $VERSION, will be appended to this
- path, so "/P c:\luarocks\" will install in
- "c:\luarocks\$VERSION\"
Default is %PROGRAMFILES%\LuaRocks
Configuring the destinations:
-/TREE [dir] Root of the local tree of installed rocks.
- Default is %PROGRAMFILES%\LuaRocks\systree
+/TREE [dir] Root of the local system tree of installed rocks.
+ Default is {BIN}\..\ if {BIN} ends with '\bin'
+ otherwise it is {BIN}\systree.
/SCRIPTS [dir] Where to install commandline scripts installed by
rocks. Default is {TREE}\bin.
/LUAMOD [dir] Where to install Lua modules installed by rocks.
@@ -175,7 +176,7 @@ Other options:
/F Remove installation directory if it already exists.
/NOREG Do not load registry info to register '.rockspec'
extension with LuaRocks commands (right-click).
-/NOADMIN The installer requires admin priviledges. If not
+/NOADMIN The installer requires admin privileges. If not
available it will elevate a new process. Use this
switch to prevent elevation, but make sure the
destination paths are all accessible for the current
@@ -253,7 +254,7 @@ local function check_flags()
die("Cannot combine option /L with any of /LUA /BIN /LIB /INC")
end
if vars.LUA_VERSION ~= "5.1" then
- die("Bundled Lua version is 5.1, cannot install 5.2")
+ die("Bundled Lua version is 5.1, cannot install "..vars.LUA_VERSION)
end
end
if vars.LUA_VERSION ~= "5.1" then
@@ -319,7 +320,7 @@ local function look_for_interpreter (directory)
return true
end
end
- print(" No Lua interpreter found")
+ --print(" No Lua interpreter found")
return false
end
@@ -360,7 +361,14 @@ local function look_for_headers (directory)
die(S"lua.h not found in $LUA_INCDIR")
end
- for _, e in ipairs{ [[\]], [[\include\]]} do
+ for _, e in ipairs{
+ S([[\include\lua\$LUA_VERSION]]),
+ S([[\include\lua$LUA_SHORTV]]),
+ S([[\include\lua$LUA_VERSION]]),
+ S([[\include\$LUA_VERSION]]),
+ [[\include\]],
+ [[\]],
+ } do
print(" checking for "..directory..e.."\\lua.h")
if exists(directory..e.."\\lua.h") then
vars.LUA_INCDIR = directory..e
@@ -470,6 +478,28 @@ local function look_for_lua_install ()
return false
end
+-- backup config[x.x].lua[.bak] and site_config[_x_x].lua
+local function backup_config_files()
+ local temppath
+ while not temppath do
+ temppath = os.getenv("temp").."\\LR-config-backup-"..tostring(math.random(10000))
+ if exists(temppath) then temppath = nil end
+ end
+ vars.CONFBACKUPDIR = temppath
+ mkdir(vars.CONFBACKUPDIR)
+ exec(S[[COPY "$PREFIX\config*.*" "$CONFBACKUPDIR" >NUL]])
+ exec(S[[COPY "$PREFIX\lua\luarocks\site_config*.*" "$CONFBACKUPDIR" >NUL]])
+end
+
+-- restore previously backed up config files
+local function restore_config_files()
+ if not vars.CONFBACKUPDIR then return end -- there is no backup to restore
+ exec(S[[COPY "$CONFBACKUPDIR\config*.*" "$PREFIX" >NUL]])
+ exec(S[[COPY "$CONFBACKUPDIR\site_config*.*" "$PREFIX\lua\luarocks" >NUL]])
+ -- cleanup
+ exec(S[[RD /S /Q "$CONFBACKUPDIR"]])
+ vars.CONFBACKUPDIR = nil
+end
-- ***********************************************************
-- Installer script start
@@ -550,12 +580,12 @@ check_flags()
if not permission() then
if not NOADMIN then
- -- must elevate the process with admin priviledges
+ -- must elevate the process with admin privileges
if not exec("PowerShell /? >NUL 2>&1") then
-- powershell is not available, so error out
- die("No administrative priviledges detected and cannot auto-elevate. Please run with admin priviledges or use the /NOADMIN switch")
+ die("No administrative privileges detected and cannot auto-elevate. Please run with admin privileges or use the /NOADMIN switch")
end
- print("Need admin priviledges, now elevating a new process to continue installing...")
+ print("Need admin privileges, now elevating a new process to continue installing...")
local runner = os.getenv("TEMP").."\\".."LuaRocks_Installer.bat"
local f = io.open(runner, "w")
f:write("@echo off\n")
@@ -567,21 +597,20 @@ if not permission() then
f:close()
-- run the created temp batch file in elevated mode
exec("PowerShell -Command (New-Object -com 'Shell.Application').ShellExecute('"..runner.."', '', '', 'runas')\n")
- print("Now exiting unpriviledged installer")
+ print("Now exiting unprivileged installer")
os.exit() -- exit here, the newly created elevated process will do the installing
else
- print("Attempting to install without admin priviledges...")
+ print("Attempting to install without admin privileges...")
end
else
- print("Admin priviledges available for installing")
+ print("Admin privileges available for installing")
end
vars.PREFIX = vars.PREFIX or os.getenv("PROGRAMFILES")..[[\LuaRocks]]
-vars.FULL_PREFIX = S"$PREFIX\\$VERSION"
-vars.BINDIR = vars.FULL_PREFIX
-vars.LIBDIR = vars.FULL_PREFIX
-vars.LUADIR = S"$FULL_PREFIX\\lua"
-vars.INCDIR = S"$FULL_PREFIX\\include"
+vars.BINDIR = vars.PREFIX
+vars.LIBDIR = vars.PREFIX
+vars.LUADIR = S"$PREFIX\\lua"
+vars.INCDIR = S"$PREFIX\\include"
vars.LUA_SHORTV = vars.LUA_VERSION:gsub("%.", "")
if INSTALL_LUA then
@@ -602,15 +631,23 @@ else
vars.UNAME_M = get_architecture() -- can only do when installation was found
end
-local datapath
-if vars.UNAME_M == "x86" then
- datapath = os.getenv("PROGRAMFILES") .. [[\LuaRocks]]
-else
- -- our target interpreter is 64bit, so the tree (with binaries) should go into 64bit program files
- datapath = os.getenv("ProgramW6432") .. [[\LuaRocks]]
+-- check location of system tree
+if not vars.TREE_ROOT then
+ -- no system tree location given, so we need to construct a default value
+ if vars.LUA_BINDIR:lower():match([[([\/]+bin[\/]*)$]]) then
+ -- lua binary is located in a 'bin' subdirectory, so assume
+ -- default Lua layout and match rocktree on top
+ vars.TREE_ROOT = vars.LUA_BINDIR:lower():gsub([[[\/]+bin[\/]*$]], [[\]])
+ else
+ -- no 'bin', so use a named tree next to the Lua executable
+ vars.TREE_ROOT = vars.LUA_BINDIR .. [[\systree]]
+ end
end
+
+local datapath
vars.SYSCONFDIR = vars.SYSCONFDIR or vars.PREFIX
-vars.TREE_ROOT = vars.TREE_ROOT or datapath..[[\systree]]
+vars.SYSCONFFILENAME = S"config-$LUA_VERSION.lua"
+vars.CONFIG_FILE = vars.SYSCONFDIR.."\\"..vars.SYSCONFFILENAME
if SELFCONTAINED then
vars.SYSCONFDIR = vars.PREFIX
vars.TREE_ROOT = vars.PREFIX..[[\systree]]
@@ -624,8 +661,8 @@ print(S[[
==========================
Will configure LuaRocks with the following paths:
-LuaRocks : $FULL_PREFIX
-Config file : $SYSCONFDIR\config.lua
+LuaRocks : $PREFIX
+Config file : $CONFIG_FILE
Rocktree : $TREE_ROOT
Lua interpreter : $LUA_BINDIR\$LUA_INTERPRETER
@@ -653,17 +690,19 @@ print([[
-- ***********************************************************
-- Install LuaRocks files
-- ***********************************************************
-if FORCE then
- print(S"Removing $FULL_PREFIX...")
- exec(S[[RD /S /Q "$FULL_PREFIX"]])
- print()
-end
-if exists(vars.FULL_PREFIX) then
- die(S"$FULL_PREFIX exists. Use /F to force removal and reinstallation.")
+if exists(vars.PREFIX) then
+ if not FORCE then
+ die(S"$PREFIX exists. Use /F to force removal and reinstallation.")
+ else
+ backup_config_files()
+ print(S"Removing $PREFIX...")
+ exec(S[[RD /S /Q "$PREFIX"]])
+ print()
+ end
end
-print(S"Installing LuaRocks in $FULL_PREFIX...")
+print(S"Installing LuaRocks in $PREFIX...")
if not exists(vars.BINDIR) then
if not mkdir(vars.BINDIR) then
die()
@@ -729,7 +768,8 @@ IF NOT "%LUA_PATH_5_3%"=="" (
)
SET "PATH=$BINDIR;%PATH%"
"$LUA_BINDIR\$LUA_INTERPRETER" "$BINDIR\]]..c..[[.lua" %*
-IF NOT "%ERRORLEVEL%"=="2" GOTO EXITLR
+SET EXITCODE=%ERRORLEVEL%
+IF NOT "%EXITCODE%"=="2" GOTO EXITLR
REM Permission denied error, try and auto elevate...
REM already an admin? (checking to prevent loops)
@@ -754,48 +794,33 @@ ECHO ECHO Press any key to close this window... >> "%TMPFILE%"
ECHO PAUSE ^> NUL >> "%TMPFILE%"
ECHO DEL "%TMPFILE%" >> "%TMPFILE%"
-ECHO Now retrying as a priviledged user...
+ECHO Now retrying as a privileged user...
PowerShell -Command (New-Object -com 'Shell.Application').ShellExecute('%TMPFILE%', '', '', 'runas')
:EXITLR
-ENDLOCAL
+exit /b %EXITCODE%
]])
f:close()
print(S"Created LuaRocks command: $BINDIR\\"..c..".bat")
end
--- part below was commented out as its purpose was unclear
--- see https://github.com/keplerproject/luarocks/pull/197#issuecomment-30176548
-
--- configure 'scripts' directory
--- if vars.TREE_BIN then
--- mkdir(vars.TREE_BIN)
--- if not USE_MINGW then
--- -- definitly not for MinGW because of conflicting runtimes
--- -- but is it ok to do it for others???
--- exec(S[[COPY lua5.1\bin\*.dll "$TREE_BIN" >NUL]])
--- end
--- else
--- if not USE_MINGW then
--- mkdir(S[[$TREE_ROOT\bin]])
--- -- definitly not for MinGW because of conflicting runtimes
--- -- but is it ok to do it for others???
--- exec(S[[COPY lua5.1\bin\*.dll "$TREE_ROOT"\bin >NUL]])
--- end
--- end
-
-- ***********************************************************
-- Configure LuaRocks
-- ***********************************************************
+restore_config_files()
print()
print("Configuring LuaRocks...")
-- Create a site-config file
-if exists(S[[$LUADIR\luarocks\site_config.lua]]) then
- exec(S[[RENAME "$LUADIR\luarocks\site_config.lua" site_config.lua.bak]])
+local site_config = S("site_config_$LUA_VERSION"):gsub("%.","_")
+if exists(S([[$LUADIR\luarocks\]]..site_config..[[.lua]])) then
+ local nname = backup(S([[$LUADIR\luarocks\]]..site_config..[[.lua]]), site_config..".lua.bak")
+ print("***************")
+ print("*** WARNING *** LuaRocks site_config file already exists: '"..site_config..".lua'. The old file has been renamed to '"..nname.."'")
+ print("***************")
end
-local f = io.open(vars.LUADIR.."\\luarocks\\site_config.lua", "w")
+local f = io.open(vars.LUADIR.."\\luarocks\\"..site_config..".lua", "w")
f:write(S[=[
local site_config = {}
site_config.LUA_INCDIR=[[$LUA_INCDIR]]
@@ -810,7 +835,7 @@ else
end
f:write(S[=[
site_config.LUAROCKS_UNAME_M=[[$UNAME_M]]
-site_config.LUAROCKS_SYSCONFIG=[[$SYSCONFDIR\config.lua]]
+site_config.LUAROCKS_SYSCONFIG=[[$CONFIG_FILE]]
site_config.LUAROCKS_ROCKS_TREE=[[$TREE_ROOT]]
site_config.LUAROCKS_PREFIX=[[$PREFIX]]
site_config.LUAROCKS_DOWNLOADER=[[wget]]
@@ -819,24 +844,16 @@ site_config.LUAROCKS_MD5CHECKER=[[md5sum]]
if FORCE_CONFIG then
f:write("site_config.LUAROCKS_FORCE_CONFIG=true\n")
end
-if exists(vars.LUADIR.."\\luarocks\\site_config.lua.bak") then
- for line in io.lines(vars.LUADIR.."\\luarocks\\site_config.lua.bak", "r") do
- f:write(line)
- f:write("\n")
- end
- exec(S[[DEL /F /Q "$LUADIR\luarocks\site_config.lua.bak"]])
-end
f:write("return site_config\n")
f:close()
-print(S[[Created LuaRocks site-config file: $LUADIR\luarocks\site_config.lua]])
+print(S([[Created LuaRocks site-config file: $LUADIR\luarocks\]]..site_config..[[.lua]]))
-- create config file
-vars.CONFIG_FILE = vars.SYSCONFDIR.."\\config.lua"
if not exists(vars.SYSCONFDIR) then
mkdir(vars.SYSCONFDIR)
end
if exists(vars.CONFIG_FILE) then
- local nname = backup(vars.CONFIG_FILE, "config.bak")
+ local nname = backup(vars.CONFIG_FILE, vars.SYSCONFFILENAME..".bak")
print("***************")
print(S"*** WARNING *** LuaRocks config file already exists: '$CONFIG_FILE'. The old file has been renamed to '"..nname.."'")
print("***************")
@@ -905,17 +922,17 @@ if REGISTRY then
-- expand template with correct path information
print()
print([[Loading registry information for ".rockspec" files]])
- exec( S[[win32\lua5.1\bin\lua5.1.exe "$FULL_PREFIX\LuaRocks.reg.lua" "$FULL_PREFIX\LuaRocks.reg.template"]] )
- exec( S[[regedit /S "$FULL_PREFIX\\LuaRocks.reg"]] )
+ exec( S[[win32\lua5.1\bin\lua5.1.exe "$PREFIX\LuaRocks.reg.lua" "$PREFIX\LuaRocks.reg.template"]] )
+ exec( S[[regedit /S "$PREFIX\\LuaRocks.reg"]] )
end
-- ***********************************************************
-- Cleanup
-- ***********************************************************
-- remove regsitry related files, no longer needed
-exec( S[[del "$FULL_PREFIX\LuaRocks.reg.*" >NUL]] )
+exec( S[[del "$PREFIX\LuaRocks.reg.*" >NUL]] )
-- remove pe-parser module
-exec( S[[del "$FULL_PREFIX\pe-parser.lua" >NUL]] )
+exec( S[[del "$PREFIX\pe-parser.lua" >NUL]] )
-- ***********************************************************
-- Exit handlers
@@ -935,8 +952,8 @@ Lua interpreter;
PATH : $LUA_BINDIR
PATHEXT : .LUA
LuaRocks;
- PATH : $FULL_PREFIX
- LUA_PATH : $FULL_PREFIX\lua\?.lua;$FULL_PREFIX\lua\?\init.lua
+ PATH : $PREFIX
+ LUA_PATH : $PREFIX\lua\?.lua;$PREFIX\lua\?\init.lua
Local user rocktree (Note: %APPDATA% is user dependent);
PATH : %APPDATA%\LuaRocks\bin
LUA_PATH : %APPDATA%\LuaRocks\share\lua\$LUA_VERSION\?.lua;%APPDATA%\LuaRocks\share\lua\$LUA_VERSION\?\init.lua
diff --git a/luarocks/makedist b/luarocks/makedist
index 141f670..1a9ca99 100755
--- a/luarocks/makedist
+++ b/luarocks/makedist
@@ -39,8 +39,8 @@ do
cp "$i" "$out/$dir"
if echo "$i" | grep -v "/bin/" | grep -q "^src/"
then
- grep -qw `basename "$i"` Makefile || {
- echo "Missing ref in makefile: $i"
+ grep -qw `basename "$i"` Makefile.setup.inc || {
+ echo "Missing ref in Makefile.setup.inc: $i"
touch "missing_ref"
exit 1
}
@@ -61,14 +61,14 @@ mkdir "release-windows"
mv "$out" "release-windows/$out-win32"
cd "release-unix/$out"
-rm -rf makedist install.bat COPYING_lua COPYING_7z COPYING_win win32 lfw .travis.yml .gitignore
+rm -rf makedist install.bat COPYING_lua COPYING_7z COPYING_win win32 lfw .travis.yml .gitignore appveyor* .appveyor
cd ..
tar czvpf ../"$out.tar.gz" "$out"
cd ..
rm -rf "release-unix"
cd "release-windows/$out-win32"
-rm -rf makedist Makefile configure lfw .travis.yml .gitignore
+rm -rf makedist Makefile* configure lfw .travis.yml .gitignore test appveyor* .appveyor
cd ..
zip -r ../"$out-win32.zip" "$out-win32"
cd ..
diff --git a/luarocks/rockspec b/luarocks/rockspec
index 16ac635..bb7645f 100644
--- a/luarocks/rockspec
+++ b/luarocks/rockspec
@@ -1,7 +1,10 @@
package = "LuaRocks"
-local VER = "2.2.0beta1"
-local REV = "1"
-version = VER.."-"..REV
+local VER = "scm"
+version = VER .. "-1"
+
+source = {
+ url = "--this rockspec is used by `make bootstrap` only--",
+}
description = {
summary = "A deployment and management system for Lua modules.",
@@ -23,16 +26,13 @@ dependencies = {
"lua >= 5.1"
}
-source = {
- url = "http://luarocks.org/releases/luarocks-"..VER..".tar.gz",
-}
-
build = {
type = "make",
install_target = "install_rock",
build_pass=false,
install_variables = {
BINDIR="$(BINDIR)",
- LUADIR="$(LUADIR)"
+ LUADIR="$(LUADIR)",
+ LUA="$(LUA)",
}
}
diff --git a/luarocks/src/bin/luarocks.in b/luarocks/src/bin/luarocks.in
index 05f5c66..ae88687 100755
--- a/luarocks/src/bin/luarocks.in
+++ b/luarocks/src/bin/luarocks.in
@@ -29,6 +29,7 @@ commands = {
purge = "luarocks.purge",
doc = "luarocks.doc",
upload = "luarocks.upload",
+ config = "luarocks.config_cmd",
}
command_line.run_command(...)
diff --git a/luarocks/src/luarocks/add.lua b/luarocks/src/luarocks/add.lua
index fc913c9..81adff9 100644
--- a/luarocks/src/luarocks/add.lua
+++ b/luarocks/src/luarocks/add.lua
@@ -50,7 +50,7 @@ local function add_files_to_server(refresh, rockfiles, server, upload_server)
if not ok then return nil, err end
local files = {}
- for i, rockfile in ipairs(rockfiles) do
+ for _, rockfile in ipairs(rockfiles) do
if fs.exists(rockfile) then
util.printout("Copying file "..rockfile.." to "..local_cache.."...")
local absolute = fs.absolute_name(rockfile)
diff --git a/luarocks/src/luarocks/admin_remove.lua b/luarocks/src/luarocks/admin_remove.lua
index 839121d..5a1cf20 100644
--- a/luarocks/src/luarocks/admin_remove.lua
+++ b/luarocks/src/luarocks/admin_remove.lua
@@ -46,7 +46,7 @@ local function remove_files_from_server(refresh, rockfiles, server, upload_serve
if not ok then return nil, err end
local nr_files = 0
- for i, rockfile in ipairs(rockfiles) do
+ for _, rockfile in ipairs(rockfiles) do
local basename = dir.base_name(rockfile)
local file = dir.path(local_cache, basename)
util.printout("Removing file "..file.."...")
diff --git a/luarocks/src/luarocks/build.lua b/luarocks/src/luarocks/build.lua
index 01bfa9d..68f2026 100644
--- a/luarocks/src/luarocks/build.lua
+++ b/luarocks/src/luarocks/build.lua
@@ -37,6 +37,8 @@ or the name of a rock to be fetched from a repository.
rockspec. Allows to specify a different branch to
fetch. Particularly for SCM rocks.
+--only-deps Installs only the dependencies of the rock.
+
]]..util.deps_mode_help()
--- Install files to a given location.
@@ -130,17 +132,17 @@ function build.apply_patches(rockspec)
end
local function install_default_docs(name, version)
- local patterns = { "readme", "license", "copying" }
+ local patterns = { "readme", "license", "copying", ".*%.md" }
local dest = dir.path(path.install_dir(name, version), "doc")
local has_dir = false
- for name in fs.dir() do
+ for file in fs.dir() do
for _, pattern in ipairs(patterns) do
- if name:lower():match("^"..pattern) then
+ if file:lower():match("^"..pattern) then
if not has_dir then
fs.make_dir(dest)
has_dir = true
end
- fs.copy(name, dest)
+ fs.copy(file, dest)
break
end
end
@@ -157,9 +159,10 @@ end
-- @param deps_mode string: Dependency mode: "one" for the current default tree,
-- "all" for all trees, "order" for all trees with priority >= the current default,
-- "none" for no trees.
+-- @param build_only_deps boolean: true to build the listed dependencies only.
-- @return (string, string) or (nil, string, [string]): Name and version of
-- installed rock if succeeded or nil and an error message followed by an error code.
-function build.build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode)
+function build.build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode, build_only_deps)
assert(type(rockspec_file) == "string")
assert(type(need_to_fetch) == "boolean")
@@ -181,12 +184,19 @@ function build.build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_m
end
end
- local ok, err, errcode = deps.check_external_deps(rockspec, "build")
+ local name, version = rockspec.name, rockspec.version
+ if build_only_deps then
+ util.printout("Stopping after installing dependencies for " ..name.." "..version)
+ util.printout()
+ return name, version
+ end
+
+ local ok
+ ok, err, errcode = deps.check_external_deps(rockspec, "build")
if err then
return nil, err, errcode
end
- local name, version = rockspec.name, rockspec.version
if repos.is_installed(name, version) then
repos.delete_version(name, version)
end
@@ -340,37 +350,41 @@ end
-- @param deps_mode: string: Which trees to check dependencies for:
-- "one" for the current default tree, "all" for all trees,
-- "order" for all trees with priority >= the current default, "none" for no trees.
+-- @param build_only_deps boolean: true to build the listed dependencies only.
-- @return boolean or (nil, string, [string]): True if build was successful,
-- or false and an error message and an optional error code.
-function build.build_rock(rock_file, need_to_fetch, deps_mode)
+function build.build_rock(rock_file, need_to_fetch, deps_mode, build_only_deps)
assert(type(rock_file) == "string")
assert(type(need_to_fetch) == "boolean")
-
- local unpack_dir, err, errcode = fetch.fetch_and_unpack_rock(rock_file)
+
+ local ok, err, errcode
+ local unpack_dir
+ unpack_dir, err, errcode = fetch.fetch_and_unpack_rock(rock_file)
if not unpack_dir then
return nil, err, errcode
end
local rockspec_file = path.rockspec_name_from_rock(rock_file)
- local ok, err = fs.change_dir(unpack_dir)
+ ok, err = fs.change_dir(unpack_dir)
if not ok then return nil, err end
- local ok, err, errcode = build.build_rockspec(rockspec_file, need_to_fetch, false, deps_mode)
+ ok, err, errcode = build.build_rockspec(rockspec_file, need_to_fetch, false, deps_mode, build_only_deps)
fs.pop_dir()
return ok, err, errcode
end
-local function do_build(name, version, deps_mode)
+local function do_build(name, version, deps_mode, build_only_deps)
if name:match("%.rockspec$") then
- return build.build_rockspec(name, true, false, deps_mode)
+ return build.build_rockspec(name, true, false, deps_mode, build_only_deps)
elseif name:match("%.src%.rock$") then
- return build.build_rock(name, false, deps_mode)
+ return build.build_rock(name, false, deps_mode, build_only_deps)
elseif name:match("%.all%.rock$") then
local install = require("luarocks.install")
- return install.install_binary_rock(name, deps_mode)
+ local install_fun = build_only_deps and install.install_binary_rock_deps or install.install_binary_rock
+ return install_fun(name, deps_mode)
elseif name:match("%.rock$") then
- return build.build_rock(name, true, deps_mode)
+ return build.build_rock(name, true, deps_mode, build_only_deps)
elseif not name:match(dir.separator) then
local search = require("luarocks.search")
- return search.act_on_src_or_rockspec(build.run, name:lower(), version, deps.deps_mode_to_flag(deps_mode))
+ return search.act_on_src_or_rockspec(build.run, name:lower(), version, deps.deps_mode_to_flag(deps_mode), build_only_deps and "--only-deps")
end
return nil, "Don't know what to do with "..name
end
@@ -395,9 +409,12 @@ function build.run(...)
else
local ok, err = fs.check_command_permissions(flags)
if not ok then return nil, err, cfg.errorcodes.PERMISSIONDENIED end
- ok, err = do_build(name, version, deps.get_deps_mode(flags))
+ ok, err = do_build(name, version, deps.get_deps_mode(flags), flags["only-deps"])
if not ok then return nil, err end
local name, version = ok, err
+ if flags["only-deps"] then
+ return name, version
+ end
if (not flags["keep"]) and not cfg.keep_other_versions then
local ok, err = remove.remove_other_versions(name, version, flags["force"])
if not ok then util.printerr(err) end
diff --git a/luarocks/src/luarocks/build/builtin.lua b/luarocks/src/luarocks/build/builtin.lua
index 47aa71f..00fd09e 100644
--- a/luarocks/src/luarocks/build/builtin.lua
+++ b/luarocks/src/luarocks/build/builtin.lua
@@ -74,7 +74,7 @@ function builtin.run(rockspec)
add_flags(extras, "-I%s", incdirs)
return execute(variables.CC.." "..variables.CFLAGS, "-c", "-o", object, "-I"..variables.LUA_INCDIR, source, unpack(extras))
end
- compile_library = function(library, objects, libraries, libdirs, name)
+ compile_library = function(library, objects, libraries, libdirs)
local extras = { unpack(objects) }
add_flags(extras, "-L%s", libdirs)
add_flags(extras, "-l%s", libraries)
@@ -138,7 +138,7 @@ function builtin.run(rockspec)
local resname = basename..".res"
local wrapname = basename..".exe"
make_rc(fullname, fullbasename..".rc")
- local ok = execute(variables.RC, "-r", "-fo"..resname, rcname)
+ local ok = execute(variables.RC, "-nologo", "-r", "-fo"..resname, rcname)
if not ok then return ok end
ok = execute(variables.CC.." "..variables.CFLAGS, "-c", "-Fo"..object,
"-I"..variables.LUA_INCDIR, variables.WRAPPER)
@@ -170,7 +170,7 @@ function builtin.run(rockspec)
end
return execute(variables.LD.." "..variables.LIBFLAG, "-o", library, "-L"..variables.LUA_LIBDIR, unpack(extras))
end
- compile_wrapper_binary = function(fullname, name) return true, name end
+ compile_wrapper_binary = function(_, name) return true, name end
--TODO EXEWRAPPER
end
@@ -196,7 +196,9 @@ function builtin.run(rockspec)
end
end
-
+ if not build.modules then
+ return nil, "Missing build.modules table"
+ end
for name, info in pairs(build.modules) do
local moddir = path.module_to_path(name)
if type(info) == "string" then
diff --git a/luarocks/src/luarocks/build/cmake.lua b/luarocks/src/luarocks/build/cmake.lua
index ed2af3f..7b16fa5 100644
--- a/luarocks/src/luarocks/build/cmake.lua
+++ b/luarocks/src/luarocks/build/cmake.lua
@@ -15,7 +15,7 @@ function cmake.run(rockspec)
assert(type(rockspec) == "table")
local build = rockspec.build
local variables = build.variables or {}
-
+
-- Pass Env variables
variables.CMAKE_MODULE_PATH=os.getenv("CMAKE_MODULE_PATH")
variables.CMAKE_LIBRARY_PATH=os.getenv("CMAKE_LIBRARY_PATH")
@@ -23,10 +23,11 @@ function cmake.run(rockspec)
util.variable_substitutions(variables, rockspec.variables)
- if not fs.execute_quiet(rockspec.variables.CMAKE, "--help") then
- return nil, "'"..rockspec.variables.CMAKE.."' program not found. Is cmake installed? You may want to edit variables.CMAKE"
+ local ok, err_msg = fs.is_tool_available(rockspec.variables.CMAKE, "CMake")
+ if not ok then
+ return nil, err_msg
end
-
+
-- If inline cmake is present create CMakeLists.txt from it.
if type(build.cmake) == "string" then
local cmake_handler = assert(io.open(fs.current_dir().."/CMakeLists.txt", "w"))
@@ -34,25 +35,29 @@ function cmake.run(rockspec)
cmake_handler:close()
end
-
-- Execute cmake with variables.
local args = ""
+
+ -- Try to pick the best generator. With msvc and x64, CMake does not select it by default so we need to be explicit.
if cfg.cmake_generator then
args = args .. ' -G"'..cfg.cmake_generator.. '"'
+ elseif cfg.is_platform("windows") and cfg.target_cpu:match("x86_64$") then
+ args = args .. " -DCMAKE_GENERATOR_PLATFORM=x64"
end
+
for k,v in pairs(variables) do
- args = args .. ' -D' ..k.. '="' ..v.. '"'
+ args = args .. ' -D' ..k.. '="' ..tostring(v).. '"'
end
- if not fs.execute_string(rockspec.variables.CMAKE.." . " ..args) then
+ if not fs.execute_string(rockspec.variables.CMAKE.." -H. -Bbuild.luarocks "..args) then
return nil, "Failed cmake."
end
-
- if not fs.execute_string(rockspec.variables.MAKE.." -fMakefile") then
+
+ if not fs.execute_string(rockspec.variables.CMAKE.." --build build.luarocks --config Release") then
return nil, "Failed building."
end
- if not fs.execute_string(rockspec.variables.MAKE.." -fMakefile install") then
+ if not fs.execute_string(rockspec.variables.CMAKE.." --build build.luarocks --target install --config Release") then
return nil, "Failed installing."
end
return true
diff --git a/luarocks/src/luarocks/cfg.lua b/luarocks/src/luarocks/cfg.lua
index 9a782c9..21bb5d0 100644
--- a/luarocks/src/luarocks/cfg.lua
+++ b/luarocks/src/luarocks/cfg.lua
@@ -32,10 +32,12 @@ if not ok then
site_config = {}
end
-cfg.site_config = site_config
-
-cfg.program_version = "2.2.0beta1"
-cfg.major_version = cfg.program_version:match("([^.]%.[^.])")
+cfg.program_version = "scm"
+cfg.program_series = "2.2"
+cfg.major_version = (cfg.program_version:match("([^.]%.[^.])")) or cfg.program_series
+cfg.variables = {}
+cfg.rocks_trees = {}
+cfg.platforms = {}
local persist = require("luarocks.persist")
@@ -43,6 +45,8 @@ cfg.errorcodes = setmetatable({
OK = 0,
UNSPECIFIED = 1,
PERMISSIONDENIED = 2,
+ CONFIGFILE = 3,
+ CRASH = 99
},{
__index = function(t, key)
local val = rawget(t, key)
@@ -67,67 +71,86 @@ end
-- System detection:
-local detected = {}
-local system,proc
-
-- A proper installation of LuaRocks will hardcode the system
-- and proc values with site_config.LUAROCKS_UNAME_S and site_config.LUAROCKS_UNAME_M,
-- so that this detection does not run every time. When it is
-- performed, we use the Unix way to identify the system,
-- even on Windows (assuming UnxUtils or Cygwin).
-system = site_config.LUAROCKS_UNAME_S or io.popen("uname -s"):read("*l")
-proc = site_config.LUAROCKS_UNAME_M or io.popen("uname -m"):read("*l")
+local system = site_config.LUAROCKS_UNAME_S or io.popen("uname -s"):read("*l")
+local proc = site_config.LUAROCKS_UNAME_M or io.popen("uname -m"):read("*l")
if proc:match("i[%d]86") then
- proc = "x86"
+ cfg.target_cpu = "x86"
elseif proc:match("amd64") or proc:match("x86_64") then
- proc = "x86_64"
+ cfg.target_cpu = "x86_64"
elseif proc:match("Power Macintosh") then
- proc = "powerpc"
+ cfg.target_cpu = "powerpc"
+ else
+ cfg.target_cpu = proc
end
if system == "FreeBSD" then
- detected.unix = true
- detected.freebsd = true
- detected.bsd = true
+ cfg.platforms.unix = true
+ cfg.platforms.freebsd = true
+ cfg.platforms.bsd = true
elseif system == "OpenBSD" then
- detected.unix = true
- detected.openbsd = true
- detected.bsd = true
+ cfg.platforms.unix = true
+ cfg.platforms.openbsd = true
+ cfg.platforms.bsd = true
elseif system == "NetBSD" then
- detected.unix = true
- detected.netbsd = true
- detected.bsd = true
+ cfg.platforms.unix = true
+ cfg.platforms.netbsd = true
+ cfg.platforms.bsd = true
elseif system == "Darwin" then
- detected.unix = true
- detected.macosx = true
- detected.bsd = true
+ cfg.platforms.unix = true
+ cfg.platforms.macosx = true
+ cfg.platforms.bsd = true
elseif system == "Linux" then
- detected.unix = true
- detected.linux = true
+ cfg.platforms.unix = true
+ cfg.platforms.linux = true
elseif system == "SunOS" then
- detected.unix = true
- detected.solaris = true
+ cfg.platforms.unix = true
+ cfg.platforms.solaris = true
elseif system and system:match("^CYGWIN") then
- detected.unix = true
- detected.cygwin = true
+ cfg.platforms.unix = true
+ cfg.platforms.cygwin = true
elseif system and system:match("^Windows") then
- detected.windows = true
+ cfg.platforms.windows = true
+ cfg.platforms.win32 = true
elseif system and system:match("^MINGW") then
- detected.windows = true
- detected.mingw32 = true
+ cfg.platforms.windows = true
+ cfg.platforms.mingw32 = true
+ cfg.platforms.win32 = true
else
- detected.unix = true
+ cfg.platforms.unix = true
-- Fall back to Unix in unknown systems.
end
--- Path configuration:
+-- Set order for platform overrides
+local platform_order = {
+ -- Unixes
+ unix = 1,
+ bsd = 2,
+ solaris = 3,
+ netbsd = 4,
+ openbsd = 5,
+ freebsd = 6,
+ linux = 7,
+ macosx = 8,
+ cygwin = 9,
+ -- Windows
+ win32 = 10,
+ mingw32 = 11,
+ windows = 12 }
+
+-- Path configuration:
local sys_config_file, home_config_file
+local sys_config_file_default, home_config_file_default
local sys_config_dir, home_config_dir
local sys_config_ok, home_config_ok = false, false
local extra_luarocks_module_dir
sys_config_dir = site_config.LUAROCKS_SYSCONFDIR
-if detected.windows then
+if cfg.platforms.windows then
cfg.home = os.getenv("APPDATA") or "c:"
sys_config_dir = sys_config_dir or "c:/luarocks"
home_config_dir = cfg.home.."/luarocks"
@@ -136,54 +159,105 @@ else
cfg.home = os.getenv("HOME") or ""
sys_config_dir = sys_config_dir or "/etc/luarocks"
home_config_dir = cfg.home.."/.luarocks"
- cfg.home_tree = cfg.home.."/.luarocks/"
+ cfg.home_tree = (os.getenv("USER") ~= "root") and cfg.home.."/.luarocks/"
end
-cfg.variables = {}
-cfg.rocks_trees = {}
+-- Create global environment for the config files;
+local env_for_config_file = function()
+ local e
+ e = {
+ home = cfg.home,
+ lua_version = cfg.lua_version,
+ platforms = util.make_shallow_copy(cfg.platforms),
+ processor = cfg.target_cpu, -- remains for compat reasons
+ target_cpu = cfg.target_cpu, -- replaces `processor`
+ os_getenv = os.getenv,
+ dump_env = function()
+ -- debug function, calling it from a config file will show all
+ -- available globals to that config file
+ print(util.show_table(e, "global environment"))
+ end,
+ }
+ return e
+end
-sys_config_file = site_config.LUAROCKS_SYSCONFIG or sys_config_dir.."/config-"..cfg.lua_version..".lua"
-local err
-sys_config_ok, err = persist.load_into_table(sys_config_file, cfg)
+-- Merge values from config files read into the `cfg` table
+local merge_overrides = function(overrides)
+ -- remove some stuff we do not want to integrate
+ overrides.os_getenv = nil
+ overrides.dump_env = nil
+ -- remove tables to be copied verbatim instead of deeply merged
+ if overrides.rocks_trees then cfg.rocks_trees = nil end
+ if overrides.rocks_servers then cfg.rocks_servers = nil end
+ -- perform actual merge
+ util.deep_merge(cfg, overrides)
+end
-if not sys_config_ok then
- sys_config_file = sys_config_dir.."/config.lua"
- sys_config_ok, err = persist.load_into_table(sys_config_file, cfg)
+-- load config file from a list until first succesful one. Info is
+-- added to `cfg` module table, returns filepath of succesfully loaded
+-- file or nil if it failed
+local load_config_file = function(list)
+ for _, filepath in ipairs(list) do
+ local result, err, errcode = persist.load_into_table(filepath, env_for_config_file())
+ if (not result) and errcode ~= "open" then
+ -- errcode is either "load" or "run"; bad config file, so error out
+ io.stderr:write(err.."\n")
+ os.exit(cfg.errorcodes.CONFIGFILE)
+ end
+ if result then
+ -- succes in loading and running, merge contents and exit
+ merge_overrides(result)
+ return filepath
+ end
+ end
+ return nil -- nothing was loaded
end
-if err and sys_config_ok == nil then
- io.stderr:write(err.."\n")
+
+
+-- Load system configuration file
+do
+ sys_config_file_default = sys_config_dir.."/config-"..cfg.lua_version..".lua"
+ sys_config_file = load_config_file({
+ site_config.LUAROCKS_SYSCONFIG or sys_config_file_default,
+ sys_config_dir.."/config.lua",
+ })
+ sys_config_ok = (sys_config_file ~= nil)
end
+-- Load user configuration file (if allowed)
if not site_config.LUAROCKS_FORCE_CONFIG then
- local home_overrides, err
- home_config_file = os.getenv("LUAROCKS_CONFIG_" .. version_suffix) or os.getenv("LUAROCKS_CONFIG")
- if home_config_file then
- home_overrides, err = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version })
- else
- home_config_file = home_config_dir.."/config-"..cfg.lua_version..".lua"
- home_overrides, err = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version })
- if not home_overrides then
- home_config_file = home_config_dir.."/config.lua"
- home_overrides, err = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version })
- end
+
+ home_config_file_default = home_config_dir.."/config-"..cfg.lua_version..".lua"
+
+ local config_env_var = "LUAROCKS_CONFIG_" .. version_suffix
+ local config_env_value = os.getenv(config_env_var)
+ if not config_env_value then
+ config_env_var = "LUAROCKS_CONFIG"
+ config_env_value = os.getenv(config_env_var)
end
- if home_overrides then
- home_config_ok = true
- if home_overrides.rocks_trees then
- cfg.rocks_trees = nil
- end
- if home_overrides.rocks_servers then
- cfg.rocks_servers = nil
- end
- util.deep_merge(cfg, home_overrides)
- else -- nil or false
- home_config_ok = home_overrides
- if err and home_config_ok == nil then
- io.stderr:write(err.."\n")
+
+ -- first try environment provided file, so we can explicitly warn when it is missing
+ if config_env_value then
+ local list = { config_env_value }
+ home_config_file = load_config_file(list)
+ home_config_ok = (home_config_file ~= nil)
+ if not home_config_ok then
+ io.stderr:write("Warning: could not load configuration file `"..config_env_value.."` given in environment variable "..config_env_var.."\n")
end
end
+
+ -- try the alternative defaults if there was no environment specified file or it didn't work
+ if not home_config_ok then
+ local list = {
+ home_config_file_default,
+ home_config_dir.."/config.lua",
+ }
+ home_config_file = load_config_file(list)
+ home_config_ok = (home_config_file ~= nil)
+ end
end
+
if not next(cfg.rocks_trees) then
if cfg.home_tree then
table.insert(cfg.rocks_trees, { name = "user", root = cfg.home_tree } )
@@ -193,17 +267,37 @@ if not next(cfg.rocks_trees) then
end
end
--- Configure defaults:
-local root = cfg.rocks_trees[#cfg.rocks_trees]
+-- update platforms list; keyed -> array
+do
+ local lst = {} -- use temp array to not confuse `pairs` in loop
+ for plat in pairs(cfg.platforms) do
+ if cfg.platforms[plat] then -- entries set to 'false' skipped
+ if not platform_order[plat] then
+ local pl = ""
+ for k,_ in pairs(platform_order) do pl = pl .. ", " .. k end
+ io.stderr:write("Bad platform given; "..tostring(plat)..". Valid entries are: "..pl:sub(3,-1) ..".\n")
+ os.exit(cfg.errorcodes.CONFIGFILE)
+ end
+ table.insert(lst, plat)
+ else
+ cfg.platforms[plat] = nil
+ end
+ end
+ -- platform overrides depent on the order, so set priorities
+ table.sort(lst, function(key1, key2) return platform_order[key1] < platform_order[key2] end)
+ util.deep_merge(cfg.platforms, lst)
+end
+
+-- Configure defaults:
local defaults = {
local_by_default = false,
- use_extensions = false,
accept_unknown_fields = false,
fs_use_modules = true,
hooks_enabled = true,
deps_mode = "one",
+ check_certificates = false,
lua_modules_path = "/share/lua/"..cfg.lua_version,
lib_modules_path = "/lib/lua/"..cfg.lua_version,
@@ -216,14 +310,17 @@ local defaults = {
rocks_servers = {
{
"https://raw.githubusercontent.com/torch/rocks/master",
- "https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master"
+ "https://luarocks.org",
+ "https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/",
+ "http://luafr.org/moonrocks/",
+ "http://luarocks.logiceditor.com/rocks",
}
},
disabled_servers = {},
-
+
upload = {
- server = "https://rocks.moonscript.org",
- tool_version = "0.0.1",
+ server = "https://luarocks.org",
+ tool_version = "1.0.0",
api_version = "1",
},
@@ -258,7 +355,6 @@ local defaults = {
FIND = "find",
TEST = "test",
CHMOD = "chmod",
- PATCH = "patch",
ZIP = "zip",
UNZIP = "unzip -n",
@@ -270,12 +366,15 @@ local defaults = {
OPENSSL = "openssl",
MD5 = "md5",
STAT = "stat",
+ TOUCH = "touch",
CMAKE = "cmake",
SEVENZ = "7z",
RSYNCFLAGS = "--exclude=.git -Oavz",
STATFLAG = "-c '%a'",
+ CURLNOCERTFLAG = "",
+ WGETNOCERTFLAG = "",
},
external_deps_subdirs = site_config.LUAROCKS_EXTERNAL_DEPS_SUBDIRS or {
@@ -292,14 +391,13 @@ local defaults = {
rocks_provided = {}
}
-if detected.windows then
- local full_prefix = site_config.LUAROCKS_PREFIX.."\\"..cfg.major_version
+if cfg.platforms.windows then
+ local full_prefix = (site_config.LUAROCKS_PREFIX or (os.getenv("PROGRAMFILES")..[[\LuaRocks]]))
extra_luarocks_module_dir = full_prefix.."\\lua\\?.lua"
home_config_file = home_config_file and home_config_file:gsub("\\","/")
defaults.fs_use_modules = false
- defaults.arch = "win32-"..proc
- defaults.platforms = {"win32", "windows" }
+ defaults.arch = "win32-"..cfg.target_cpu
defaults.lib_extension = "dll"
defaults.external_lib_extension = "dll"
defaults.obj_extension = "obj"
@@ -307,7 +405,7 @@ if detected.windows then
defaults.variables.LUA_BINDIR = site_config.LUA_BINDIR and site_config.LUA_BINDIR:gsub("\\", "/") or "c:/lua"..cfg.lua_version.."/bin"
defaults.variables.LUA_INCDIR = site_config.LUA_INCDIR and site_config.LUA_INCDIR:gsub("\\", "/") or "c:/lua"..cfg.lua_version.."/include"
defaults.variables.LUA_LIBDIR = site_config.LUA_LIBDIR and site_config.LUA_LIBDIR:gsub("\\", "/") or "c:/lua"..cfg.lua_version.."/lib"
- defaults.cmake_generator = "MinGW Makefiles"
+
defaults.makefile = "Makefile.win"
defaults.variables.MAKE = "nmake"
defaults.variables.CC = "cl"
@@ -316,8 +414,8 @@ if detected.windows then
defaults.variables.LD = "link"
defaults.variables.MT = "mt"
defaults.variables.LUALIB = "lua"..cfg.lua_version..".lib"
- defaults.variables.CFLAGS = "/MD /O2"
- defaults.variables.LIBFLAG = "/dll"
+ defaults.variables.CFLAGS = "/nologo /MD /O2"
+ defaults.variables.LIBFLAG = "/nologo /dll"
local bins = { "SEVENZ", "CP", "FIND", "LS", "MD5SUM",
"MKDIR", "MV", "PWD", "RMDIR", "TEST", "UNAME", "WGET" }
@@ -352,8 +450,7 @@ if detected.windows then
defaults.web_browser = "start"
end
-if detected.mingw32 then
- defaults.platforms = { "win32", "mingw32", "windows" }
+if cfg.platforms.mingw32 then
defaults.obj_extension = "o"
defaults.cmake_generator = "MinGW Makefiles"
defaults.variables.MAKE = "mingw32-make"
@@ -377,7 +474,7 @@ if detected.mingw32 then
end
-if detected.unix then
+if cfg.platforms.unix then
defaults.lib_extension = "so"
defaults.external_lib_extension = "so"
defaults.obj_extension = "o"
@@ -387,7 +484,6 @@ if detected.unix then
defaults.variables.LUA_LIBDIR = site_config.LUA_LIBDIR or "/usr/local/lib"
defaults.variables.CFLAGS = "-O2"
defaults.cmake_generator = "Unix Makefiles"
- defaults.platforms = { "unix" }
defaults.variables.CC = "gcc"
defaults.variables.LD = "gcc"
defaults.gcc_rpath = true
@@ -414,66 +510,63 @@ if detected.unix then
defaults.web_browser = "xdg-open"
end
-if detected.cygwin then
+if cfg.platforms.cygwin then
defaults.lib_extension = "so" -- can be overridden in the config file for mingw builds
- defaults.arch = "cygwin-"..proc
- defaults.platforms = {"unix", "cygwin"}
+ defaults.arch = "cygwin-"..cfg.target_cpu
defaults.cmake_generator = "Unix Makefiles"
defaults.variables.CC = "echo -llua | xargs gcc"
defaults.variables.LD = "echo -llua | xargs gcc"
defaults.variables.LIBFLAG = "-shared"
end
-if detected.bsd then
+if cfg.platforms.bsd then
defaults.variables.MAKE = "gmake"
defaults.variables.STATFLAG = "-f '%OLp'"
end
-if detected.macosx then
+if cfg.platforms.macosx then
defaults.variables.MAKE = "make"
defaults.external_lib_extension = "dylib"
- defaults.arch = "macosx-"..proc
- defaults.platforms = {"unix", "bsd", "macosx"}
+ defaults.arch = "macosx-"..cfg.target_cpu
defaults.variables.LIBFLAG = "-bundle -undefined dynamic_lookup -all_load"
+ defaults.variables.STAT = "/usr/bin/stat"
defaults.variables.STATFLAG = "-f '%A'"
local version = io.popen("sw_vers -productVersion"):read("*l")
version = tonumber(version and version:match("^[^.]+%.([^.]+)")) or 3
- if version >= 5 then
+ if version >= 10 then
+ version = 8
+ elseif version >= 5 then
version = 5
else
defaults.gcc_rpath = false
end
- defaults.variables.CC = "export MACOSX_DEPLOYMENT_TARGET=10."..version.."; gcc"
- defaults.variables.LD = "export MACOSX_DEPLOYMENT_TARGET=10."..version.."; gcc"
+ defaults.variables.CC = "env MACOSX_DEPLOYMENT_TARGET=10."..version.." gcc"
+ defaults.variables.LD = "env MACOSX_DEPLOYMENT_TARGET=10."..version.." gcc"
defaults.web_browser = "open"
end
-if detected.linux then
- defaults.arch = "linux-"..proc
- defaults.platforms = {"unix", "linux"}
+if cfg.platforms.linux then
+ defaults.arch = "linux-"..cfg.target_cpu
end
-if detected.freebsd then
- defaults.arch = "freebsd-"..proc
- defaults.platforms = {"unix", "bsd", "freebsd"}
+if cfg.platforms.freebsd then
+ defaults.arch = "freebsd-"..cfg.target_cpu
defaults.gcc_rpath = false
defaults.variables.CC = "cc"
defaults.variables.LD = "cc"
end
-if detected.openbsd then
- defaults.arch = "openbsd-"..proc
- defaults.platforms = {"unix", "bsd", "openbsd"}
+if cfg.platforms.openbsd then
+ defaults.arch = "openbsd-"..cfg.target_cpu
end
-if detected.netbsd then
- defaults.arch = "netbsd-"..proc
- defaults.platforms = {"unix", "bsd", "netbsd"}
+if cfg.platforms.netbsd then
+ defaults.arch = "netbsd-"..cfg.target_cpu
end
-if detected.solaris then
- defaults.arch = "solaris-"..proc
- defaults.platforms = {"unix", "solaris"}
+if cfg.platforms.solaris then
+ defaults.arch = "solaris-"..cfg.target_cpu
+ --defaults.platforms = {"unix", "solaris"}
defaults.variables.MAKE = "gmake"
end
@@ -530,6 +623,11 @@ local cfg_mt = {
}
setmetatable(cfg, cfg_mt)
+if not cfg.check_certificates then
+ cfg.variables.CURLNOCERTFLAG = "-k"
+ cfg.variables.WGETNOCERTFLAG = "--no-check-certificate"
+end
+
function cfg.make_paths_from_tree(tree)
local lua_path, lib_path, bin_path
if type(tree) == "string" then
@@ -553,7 +651,7 @@ function cfg.package_paths()
table.insert(new_cpath, lib_path.."/?."..cfg.lib_extension)
table.insert(new_bin, bin_path)
end
- if extra_luarocks_module_dir then
+ if extra_luarocks_module_dir then
table.insert(new_path, extra_luarocks_module_dir)
end
return table.concat(new_path, ";"), table.concat(new_cpath, ";"), table.concat(new_bin, cfg.export_path_separator)
@@ -566,11 +664,24 @@ function cfg.init_package_paths()
end
function cfg.which_config()
- return sys_config_file, sys_config_ok, home_config_file, home_config_ok
+ return {
+ system = {
+ file = sys_config_file or sys_config_file_default,
+ ok = sys_config_ok,
+ },
+ user = {
+ file = home_config_file or home_config_file_default,
+ ok = home_config_ok,
+ }
+ }
end
cfg.user_agent = "LuaRocks/"..cfg.program_version.." "..cfg.arch
+cfg.http_proxy = os.getenv("http_proxy")
+cfg.https_proxy = os.getenv("https_proxy")
+cfg.no_proxy = os.getenv("no_proxy")
+
--- Check if platform was detected
-- @param query string: The platform name to check.
-- @return boolean: true if LuaRocks is currently running on queried platform.
diff --git a/luarocks/src/luarocks/command_line.lua b/luarocks/src/luarocks/command_line.lua
index cc2e168..dbf64b9 100644
--- a/luarocks/src/luarocks/command_line.lua
+++ b/luarocks/src/luarocks/command_line.lua
@@ -10,6 +10,7 @@ local cfg = require("luarocks.cfg")
local path = require("luarocks.path")
local dir = require("luarocks.dir")
local deps = require("luarocks.deps")
+local fs = require("luarocks.fs")
local program = util.this_program("luarocks")
@@ -21,7 +22,7 @@ local function die(message, exitcode)
local ok, err = pcall(util.run_scheduled_functions)
if not ok then
- util.printerr("\nLuaRocks "..cfg.program_version.." internal bug (please report at luarocks-developers@lists.sourceforge.net):\n"..err)
+ util.printerr("\nLuaRocks "..cfg.program_version.." internal bug (please report at https://github.com/keplerproject/luarocks/issues):\n"..err)
end
util.printerr("\nError: "..message)
os.exit(exitcode or cfg.errorcodes.UNSPECIFIED)
@@ -63,6 +64,9 @@ function command_line.run_command(...)
end
local nonflags = { util.parse_flags(unpack(args)) }
local flags = table.remove(nonflags, 1)
+ if flags.ERROR then
+ die(flags.ERROR.." See --help.")
+ end
if flags["from"] then flags["server"] = flags["from"] end
if flags["only-from"] then flags["only-server"] = flags["only-from"] end
@@ -79,7 +83,6 @@ function command_line.run_command(...)
if flags["verbose"] then -- setting it in the config file will kick-in earlier in the process
cfg.verbose = true
- local fs = require("luarocks.fs")
fs.verbose()
end
@@ -110,12 +113,6 @@ function command_line.run_command(...)
end
end
command = command:gsub("-", "_")
-
- if flags["extensions"] then
- cfg.use_extensions = true
- local type_check = require("luarocks.type_check")
- type_check.load_extensions()
- end
if cfg.local_by_default then
flags["local"] = true
@@ -126,16 +123,10 @@ function command_line.run_command(...)
end
if flags["branch"] then
- if flags["branch"] == true or flags["branch"] == "" then
- die("Argument error: use --branch=<branch-name>")
- end
cfg.branch = flags["branch"]
end
if flags["tree"] then
- if flags["tree"] == true or flags["tree"] == "" then
- die("Argument error: use --tree=<path>")
- end
local named = false
for _, tree in ipairs(cfg.rocks_trees) do
if type(tree) == "table" and flags["tree"] == tree.name then
@@ -153,6 +144,11 @@ function command_line.run_command(...)
replace_tree(flags, args, root_dir)
end
elseif flags["local"] then
+ if not cfg.home_tree then
+ die("The --local flag is meant for operating in a user's home directory.\n"..
+ "You are running as a superuser, which is intended for system-wide operation.\n"..
+ "To force using the superuser's home, use --tree explicitly.")
+ end
replace_tree(flags, args, cfg.home_tree)
else
local trees = cfg.rocks_trees
@@ -173,17 +169,11 @@ function command_line.run_command(...)
cfg.variables.SCRIPTS_DIR = cfg.deploy_bin_dir
if flags["server"] then
- if flags["server"] == true then
- die("Argument error: use --server=<url>")
- end
local protocol, path = dir.split_url(flags["server"])
table.insert(cfg.rocks_servers, 1, protocol.."://"..path)
end
if flags["only-server"] then
- if flags["only-server"] == true then
- die("Argument error: use --only-server=<url>")
- end
cfg.rocks_servers = { flags["only-server"] }
end
@@ -196,6 +186,10 @@ function command_line.run_command(...)
cfg.variables[k] = v
end
end
+
+ if not fs.current_dir() or fs.current_dir() == "" then
+ die("Current directory does not exist. Please run LuaRocks from an existing directory.")
+ end
if commands[command] then
-- TODO the interface of run should be modified, to receive the
@@ -207,8 +201,8 @@ function command_line.run_command(...)
local cmd = require(commands[command])
local xp, ok, err, exitcode = xpcall(function() return cmd.run(unpack(args)) end, function(err)
die(debug.traceback("LuaRocks "..cfg.program_version
- .." bug (please report at luarocks-developers@lists.sourceforge.net).\n"
- ..err, 2))
+ .." bug (please report at https://github.com/keplerproject/luarocks/issues).\n"
+ ..err, 2), cfg.errorcodes.CRASH)
end)
if xp and (not ok) then
die(err, exitcode)
diff --git a/luarocks/src/luarocks/config_cmd.lua b/luarocks/src/luarocks/config_cmd.lua
new file mode 100644
index 0000000..bf282a7
--- /dev/null
+++ b/luarocks/src/luarocks/config_cmd.lua
@@ -0,0 +1,73 @@
+--- Module implementing the LuaRocks "config" command.
+-- Queries information about the LuaRocks configuration.
+local config_cmd = {}
+
+local cfg = require("luarocks.cfg")
+local util = require("luarocks.util")
+local dir = require("luarocks.dir")
+
+config_cmd.help_summary = "Query information about the LuaRocks configuration."
+config_cmd.help_arguments = "<flag>"
+config_cmd.help = [[
+--lua-incdir Path to Lua header files.
+
+--lua-libdir Path to Lua library files.
+
+--lua-ver Lua version (in major.minor format). e.g. 5.1
+
+--system-config Location of the system config file.
+
+--user-config Location of the user config file.
+
+--rock-trees Rocks trees in use. First the user tree, then the system tree.
+]]
+
+local function config_file(conf)
+ print(dir.normalize(conf.file))
+ if conf.ok then
+ return true
+ else
+ return nil, "file not found"
+ end
+end
+
+--- Driver function for "config" command.
+-- @return boolean: True if succeeded, nil on errors.
+function config_cmd.run(...)
+ local flags = util.parse_flags(...)
+
+ if flags["lua-incdir"] then
+ print(cfg.variables.LUA_INCDIR)
+ return true
+ end
+ if flags["lua-libdir"] then
+ print(cfg.variables.LUA_LIBDIR)
+ return true
+ end
+ if flags["lua-ver"] then
+ print(cfg.lua_version)
+ return true
+ end
+ local conf = cfg.which_config()
+ if flags["system-config"] then
+ return config_file(conf.system)
+ end
+ if flags["user-config"] then
+ return config_file(conf.user)
+ end
+ if flags["rock-trees"] then
+ for _, tree in ipairs(cfg.rocks_trees) do
+ if type(tree) == "string" then
+ util.printout(dir.normalize(tree))
+ else
+ local name = tree.name and "\t"..tree.name or ""
+ util.printout(dir.normalize(tree.root)..name)
+ end
+ end
+ return true
+ end
+
+ return nil, "Please provide a flag for querying configuration values. "..util.see_help("config")
+end
+
+return config_cmd
diff --git a/luarocks/src/luarocks/deps.lua b/luarocks/src/luarocks/deps.lua
index 3f75f9b..0e3265b 100644
--- a/luarocks/src/luarocks/deps.lua
+++ b/luarocks/src/luarocks/deps.lua
@@ -608,10 +608,12 @@ function deps.check_external_deps(rockspec, mode)
local found = false
failed_file = nil
for _, f in pairs(files) do
+
-- small convenience hack
if f:match("%.so$") or f:match("%.dylib$") or f:match("%.dll$") then
f = f:gsub("%.[^.]+$", "."..cfg.external_lib_extension)
end
+
for _, d in ipairs(paths) do
if f:match("%*") then
local replaced = f:gsub("%.", "%%."):gsub("%*", ".*")
diff --git a/luarocks/src/luarocks/doc.lua b/luarocks/src/luarocks/doc.lua
index 6dee106..53ed011 100644
--- a/luarocks/src/luarocks/doc.lua
+++ b/luarocks/src/luarocks/doc.lua
@@ -13,7 +13,7 @@ local fetch = require("luarocks.fetch")
local fs = require("luarocks.fs")
local download = require("luarocks.download")
-doc.help_summary = "Shows documentation for an installed rock."
+doc.help_summary = "Show documentation for an installed rock."
doc.help = [[
<argument> is an existing package name.
@@ -21,7 +21,7 @@ Without any flags, tries to load the documentation
using a series of heuristics.
With these flags, return only the desired information:
---homepage Open the home page of project.
+--home Open the home page of project.
--list List documentation files only.
For more information about a rock, see the 'show' command.
@@ -75,7 +75,7 @@ function doc.run(...)
if not rockspec then return nil,err end
local descript = rockspec.description or {}
- if flags["homepage"] then
+ if flags["home"] then
return show_homepage(descript.homepage, name, version)
end
diff --git a/luarocks/src/luarocks/fetch.lua b/luarocks/src/luarocks/fetch.lua
index 980c8fe..e92aedd 100644
--- a/luarocks/src/luarocks/fetch.lua
+++ b/luarocks/src/luarocks/fetch.lua
@@ -37,11 +37,11 @@ function fetch.fetch_url(url, filename, cache)
if protocol == "file" then
return fs.absolute_name(pathname)
elseif fetch.is_basic_protocol(protocol, true) then
- local ok, filename = fs.download(url, filename, cache)
+ local ok, name = fs.download(url, filename, cache)
if not ok then
return nil, "Failed downloading "..url..(filename and " - "..filename or ""), "network"
end
- return filename
+ return name
else
return nil, "Unsupported protocol "..protocol
end
@@ -170,8 +170,13 @@ function fetch.fetch_and_unpack_rock(rock_file, dest)
end
function fetch.url_to_base_dir(url)
+ -- for extensions like foo.tar.gz, "gz" is stripped first
+ local known_exts = {}
+ for _, ext in ipairs{"zip", "git", "tgz", "tar", "gz", "bz2"} do
+ known_exts[ext] = ""
+ end
local base = dir.base_name(url)
- return base:gsub("%.[^.]*$", ""):gsub("%.tar$", "")
+ return (base:gsub("%.([^.]*)$", known_exts):gsub("%.tar", ""))
end
--- Back-end function that actually loads the local rockspec.
@@ -193,9 +198,8 @@ function fetch.load_local_rockspec(filename, quick)
end
local globals = err
- local ok, err = true, nil
if not quick then
- ok, err = type_check.type_check_rockspec(rockspec, globals)
+ local ok, err = type_check.type_check_rockspec(rockspec, globals)
if not ok then
return nil, filename..": "..err
end
@@ -319,9 +323,10 @@ function fetch.get_sources(rockspec, extract, dest_dir)
local url = rockspec.source.url
local name = rockspec.name.."-"..rockspec.version
local filename = rockspec.source.file
- local source_file, store_dir, err, errcode
+ local source_file, store_dir
+ local ok, err, errcode
if dest_dir then
- local ok, err = fs.change_dir(dest_dir)
+ ok, err = fs.change_dir(dest_dir)
if not ok then return nil, err, "dest_dir" end
source_file, err, errcode = fetch.fetch_url(url, filename)
fs.pop_dir()
diff --git a/luarocks/src/luarocks/fetch/cvs.lua b/luarocks/src/luarocks/fetch/cvs.lua
index cc9fd65..ccf928c 100644
--- a/luarocks/src/luarocks/fetch/cvs.lua
+++ b/luarocks/src/luarocks/fetch/cvs.lua
@@ -20,9 +20,15 @@ function cvs.get_sources(rockspec, extract, dest_dir)
assert(type(rockspec) == "table")
assert(type(dest_dir) == "string" or not dest_dir)
+ local cvs_cmd = rockspec.variables.CVS
+ local ok, err_msg = fs.is_tool_available(cvs_cmd, "CVS")
+ if not ok then
+ return nil, err_msg
+ end
+
local name_version = rockspec.name .. "-" .. rockspec.version
local module = rockspec.source.module or dir.base_name(rockspec.source.url)
- local command = {rockspec.variables.CVS, "-d"..rockspec.source.pathname, "export", module}
+ local command = {cvs_cmd, "-d"..rockspec.source.pathname, "export", module}
if rockspec.source.tag then
table.insert(command, 4, "-r")
table.insert(command, 5, rockspec.source.tag)
diff --git a/luarocks/src/luarocks/fetch/git.lua b/luarocks/src/luarocks/fetch/git.lua
index 53fd444..a635f19 100644
--- a/luarocks/src/luarocks/fetch/git.lua
+++ b/luarocks/src/luarocks/fetch/git.lua
@@ -40,6 +40,11 @@ function git.get_sources(rockspec, extract, dest_dir, depth)
-- Strip off .git from base name if present
module = module:gsub("%.git$", "")
+ local ok, err_msg = fs.is_tool_available(git_cmd, "Git")
+ if not ok then
+ return nil, err_msg
+ end
+
local store_dir
if not dest_dir then
store_dir = fs.make_temp_dir(name_version)
@@ -63,7 +68,7 @@ function git.get_sources(rockspec, extract, dest_dir, depth)
if git_can_clone_by_tag(git_cmd) then
-- The argument to `--branch` can actually be a branch or a tag as of
-- Git 1.7.10.
- table.insert(command, 4, "--branch=" .. tag_or_branch)
+ table.insert(command, 3, "--branch=" .. tag_or_branch)
end
end
if not fs.execute(unpack(command)) then
diff --git a/luarocks/src/luarocks/fetch/git_https.lua b/luarocks/src/luarocks/fetch/git_https.lua
new file mode 100644
index 0000000..67f8ad6
--- /dev/null
+++ b/luarocks/src/luarocks/fetch/git_https.lua
@@ -0,0 +1,7 @@
+--- Fetch back-end for retrieving sources from Git repositories
+-- that use https:// transport. For example, for fetching a repository
+-- that requires the following command line:
+-- `git clone https://example.com/foo.git`
+-- you can use this in the rockspec:
+-- source = { url = "git+https://example.com/foo.git" }
+return require "luarocks.fetch.git_http"
diff --git a/luarocks/src/luarocks/fetch/hg.lua b/luarocks/src/luarocks/fetch/hg.lua
index b2ba56e..518130b 100644
--- a/luarocks/src/luarocks/fetch/hg.lua
+++ b/luarocks/src/luarocks/fetch/hg.lua
@@ -21,16 +21,21 @@ function hg.get_sources(rockspec, extract, dest_dir)
assert(type(dest_dir) == "string" or not dest_dir)
local hg_cmd = rockspec.variables.HG
+ local ok, err_msg = fs.is_tool_available(hg_cmd, "Mercurial")
+ if not ok then
+ return nil, err_msg
+ end
+
local name_version = rockspec.name .. "-" .. rockspec.version
-- Strip off special hg:// protocol type
- local url = rockspec.source.url:gsub("^hg://", "")
+ local url = rockspec.source.url:gsub("^hg://", "")
local module = dir.base_name(url)
local command = {hg_cmd, "clone", url, module}
local tag_or_branch = rockspec.source.tag or rockspec.source.branch
if tag_or_branch then
- command = {hg_cmd, "clone", "--rev", url, module}
+ command = {hg_cmd, "clone", "--rev", tag_or_branch, url, module}
end
local store_dir
if not dest_dir then
diff --git a/luarocks/src/luarocks/fetch/hg_http.lua b/luarocks/src/luarocks/fetch/hg_http.lua
new file mode 100644
index 0000000..8f506da
--- /dev/null
+++ b/luarocks/src/luarocks/fetch/hg_http.lua
@@ -0,0 +1,24 @@
+
+--- Fetch back-end for retrieving sources from hg repositories
+-- that use http:// transport. For example, for fetching a repository
+-- that requires the following command line:
+-- `hg clone http://example.com/foo`
+-- you can use this in the rockspec:
+-- source = { url = "hg+http://example.com/foo" }
+local hg_http = {}
+
+local hg = require("luarocks.fetch.hg")
+
+--- Download sources for building a rock, using hg over http.
+-- @param rockspec table: The rockspec table
+-- @param extract boolean: Unused in this module (required for API purposes.)
+-- @param dest_dir string or nil: If set, will extract to the given directory.
+-- @return (string, string) or (nil, string): The absolute pathname of
+-- the fetched source tarball and the temporary directory created to
+-- store it; or nil and an error message.
+function hg_http.get_sources(rockspec, extract, dest_dir)
+ rockspec.source.url = rockspec.source.url:gsub("^hg.", "")
+ return hg.get_sources(rockspec, extract, dest_dir)
+end
+
+return hg_http
diff --git a/luarocks/src/luarocks/fetch/hg_https.lua b/luarocks/src/luarocks/fetch/hg_https.lua
new file mode 100644
index 0000000..e67417f
--- /dev/null
+++ b/luarocks/src/luarocks/fetch/hg_https.lua
@@ -0,0 +1,8 @@
+
+--- Fetch back-end for retrieving sources from hg repositories
+-- that use https:// transport. For example, for fetching a repository
+-- that requires the following command line:
+-- `hg clone https://example.com/foo`
+-- you can use this in the rockspec:
+-- source = { url = "hg+https://example.com/foo" }
+return require "luarocks.fetch.hg_http"
diff --git a/luarocks/src/luarocks/fetch/hg_ssh.lua b/luarocks/src/luarocks/fetch/hg_ssh.lua
new file mode 100644
index 0000000..0c365fa
--- /dev/null
+++ b/luarocks/src/luarocks/fetch/hg_ssh.lua
@@ -0,0 +1,8 @@
+
+--- Fetch back-end for retrieving sources from hg repositories
+-- that use ssh:// transport. For example, for fetching a repository
+-- that requires the following command line:
+-- `hg clone ssh://example.com/foo`
+-- you can use this in the rockspec:
+-- source = { url = "hg+ssh://example.com/foo" }
+return require "luarocks.fetch.hg_http"
diff --git a/luarocks/src/luarocks/fetch/svn.lua b/luarocks/src/luarocks/fetch/svn.lua
index abeacf9..755e5e3 100644
--- a/luarocks/src/luarocks/fetch/svn.lua
+++ b/luarocks/src/luarocks/fetch/svn.lua
@@ -21,6 +21,11 @@ function svn.get_sources(rockspec, extract, dest_dir)
assert(type(dest_dir) == "string" or not dest_dir)
local svn_cmd = rockspec.variables.SVN
+ local ok, err_msg = fs.is_tool_available(svn_cmd, "--version", "Subversion")
+ if not ok then
+ return nil, err_msg
+ end
+
local name_version = rockspec.name .. "-" .. rockspec.version
local module = rockspec.source.module or dir.base_name(rockspec.source.url)
local url = rockspec.source.url:gsub("^svn://", "")
diff --git a/luarocks/src/luarocks/fs.lua b/luarocks/src/luarocks/fs.lua
index 72e11c0..57302c7 100644
--- a/luarocks/src/luarocks/fs.lua
+++ b/luarocks/src/luarocks/fs.lua
@@ -31,7 +31,8 @@ fs.verbose = function() -- patch io.popen and os.execute to display commands
old_exec = os.execute
os.execute = function(cmd)
- print("\nos.execute: ", cmd)
+ -- redact api keys if present
+ print("\nos.execute: ", (cmd:gsub("(/api/[^/]+/)([^/]+)/", function(cap, key) return cap.."<redacted>/" end)) )
local code = pack(old_exec(cmd))
print("Results: "..tostring(code.n))
for i = 1,code.n do
diff --git a/luarocks/src/luarocks/fs/lua.lua b/luarocks/src/luarocks/fs/lua.lua
index b261905..73ae269 100644
--- a/luarocks/src/luarocks/fs/lua.lua
+++ b/luarocks/src/luarocks/fs/lua.lua
@@ -122,6 +122,27 @@ function fs_lua.execute_quiet(command, ...)
end
end
+--- Checks if the given tool is available.
+-- The tool is executed using a flag, usually just to ask its version.
+-- @param tool_cmd string: The command to be used to check the tool's presence (e.g. hg in case of Mercurial)
+-- @param tool_name string: The actual name of the tool (e.g. Mercurial)
+-- @param arg string: The flag to pass to the tool. '--version' by default.
+function fs_lua.is_tool_available(tool_cmd, tool_name, arg)
+ assert(type(tool_cmd) == "string")
+ assert(type(tool_name) == "string")
+
+ arg = arg or "--version"
+ assert(type(arg) == "string")
+
+ if not fs.execute_quiet(tool_cmd, arg) then
+ local msg = "'%s' program not found. Make sure %s is installed and is available in your PATH " ..
+ "(or you may want to edit the 'variables.%s' value in file 'config.lua')"
+ return nil, msg:format(tool_cmd, tool_name, tool_cmd:upper())
+ else
+ return true
+ end
+end
+
--- Check the MD5 checksum for a file.
-- @param file string: The file to be checked.
-- @param md5sum string: The string with the expected MD5 checksum.
@@ -207,8 +228,13 @@ end
-- Allows leaving a directory (e.g. for deleting it) in
-- a crossplatform way.
function fs_lua.change_dir_to_root()
- table.insert(dir_stack, lfs.currentdir())
+ local current = lfs.currentdir()
+ if not current or current == "" then
+ return false
+ end
+ table.insert(dir_stack, current)
lfs.chdir("/") -- works on Windows too
+ return true
end
--- Change working directory to the previous in the dir stack.
@@ -540,7 +566,7 @@ local redirect_protocols = {
local function request(url, method, http, loop_control)
local result = {}
- local proxy = cfg.proxy
+ local proxy = cfg.http_proxy
if type(proxy) ~= "string" then proxy = nil end
-- LuaSocket's http.request crashes when given URLs missing the scheme part.
if proxy and not proxy:find("://") then
@@ -648,6 +674,11 @@ function fs_lua.download(url, filename, cache)
assert(type(filename) == "string" or not filename)
filename = fs.absolute_name(filename or dir.base_name(url))
+
+ -- delegate to the configured downloader so we don't have to deal with whitelists
+ if cfg.no_proxy then
+ return fs.use_downloader(url, filename, cache)
+ end
local content, err, https_err
if util.starts_with(url, "http:") then
@@ -655,7 +686,8 @@ function fs_lua.download(url, filename, cache)
elseif util.starts_with(url, "ftp:") then
content, err = ftp.get(url)
elseif util.starts_with(url, "https:") then
- if luasec_ok then
+ -- skip LuaSec when proxy is enabled since it is not supported
+ if luasec_ok and not cfg.https_proxy then
content, err = http_request(url, https, cache and filename)
else
https_err = true
@@ -732,7 +764,7 @@ function fs_lua.chmod(file, mode)
-- LuaPosix (as of 5.1.15) does not support octal notation...
if mode:sub(1,1) == "0" then
local new_mode = {}
- for c in mode:sub(2):gmatch(".") do
+ for c in mode:sub(-3):gmatch(".") do
table.insert(new_mode, octal_to_rwx[c])
end
mode = table.concat(new_mode)
diff --git a/luarocks/src/luarocks/fs/unix/tools.lua b/luarocks/src/luarocks/fs/unix/tools.lua
index f36e815..442004c 100644
--- a/luarocks/src/luarocks/fs/unix/tools.lua
+++ b/luarocks/src/luarocks/fs/unix/tools.lua
@@ -12,7 +12,7 @@ local dir_stack = {}
local vars = cfg.variables
local function command_at(directory, cmd)
- return "cd " .. fs.Q(directory) .. " && " .. cmd
+ return "cd " .. fs.Q(fs.absolute_name(directory)) .. " && " .. cmd
end
--- Obtain current directory.
@@ -21,7 +21,7 @@ end
function tools.current_dir()
local current = cfg.cache_pwd
if not current then
- local pipe = io.popen(fs.Q(vars.PWD))
+ local pipe = io.popen(fs.Q(vars.PWD).." 2> /dev/null")
current = pipe:read("*l")
pipe:close()
cfg.cache_pwd = current
@@ -38,7 +38,9 @@ end
-- @return boolean: true if command succeeds (status code 0), false
-- otherwise.
function tools.execute_string(cmd)
- local code, err = os.execute(command_at(fs.current_dir(), cmd))
+ local current = fs.current_dir()
+ if not current then return false end
+ local code, err = os.execute(command_at(current, cmd))
if code == 0 or code == true then
return true
else
@@ -246,7 +248,7 @@ function tools.use_downloader(url, filename, cache)
local ok
if cfg.downloader == "wget" then
- local wget_cmd = fs.Q(vars.WGET).." --no-check-certificate --no-cache --user-agent='"..cfg.user_agent.." via wget' --quiet "
+ local wget_cmd = fs.Q(vars.WGET).." "..vars.WGETNOCERTFLAG.." --no-cache --user-agent='"..cfg.user_agent.." via wget' --quiet "
if cfg.connection_timeout and cfg.connection_timeout > 0 then
wget_cmd = wget_cmd .. "--timeout="..tonumber(cfg.connection_timeout).." --tries=1 "
end
@@ -262,7 +264,7 @@ function tools.use_downloader(url, filename, cache)
ok = fs.execute_quiet(wget_cmd, url)
end
elseif cfg.downloader == "curl" then
- local curl_cmd = fs.Q(vars.CURL).." -f -k -L --user-agent '"..cfg.user_agent.." via curl' "
+ local curl_cmd = fs.Q(vars.CURL).." "..vars.CURLNOCERTFLAG.." -f -L --user-agent '"..cfg.user_agent.." via curl' "
if cfg.connection_timeout and cfg.connection_timeout > 0 then
curl_cmd = curl_cmd .. "--connect-timeout "..tonumber(cfg.connection_timeout).." "
end
@@ -283,12 +285,6 @@ function tools.chmod(pathname, mode)
end
end
---- Apply a patch.
--- @param patchname string: The filename of the patch.
-function tools.apply_patch(patchname)
- return fs.execute(vars.PATCH.." -p1 -f -i ", patchname)
-end
-
--- Unpack an archive.
-- Extract the contents of an archive, detecting its format by
-- filename extension.
@@ -350,4 +346,9 @@ function tools.browser(url)
return fs.execute(cfg.web_browser, url)
end
+function tools.set_time(file, time)
+ file = dir.normalize(file)
+ return fs.execute(vars.TOUCH, "-d", "@"..tostring(time), file)
+end
+
return tools
diff --git a/luarocks/src/luarocks/fs/win32.lua b/luarocks/src/luarocks/fs/win32.lua
index 12d86d1..32766e5 100644
--- a/luarocks/src/luarocks/fs/win32.lua
+++ b/luarocks/src/luarocks/fs/win32.lua
@@ -125,6 +125,7 @@ function win32.wrap_script(file, dest, name, version)
local ppaths = "package.path="..util.LQ(lpath..";").."..package.path; package.cpath="..util.LQ(lcpath..";").."..package.cpath"
local addctx = "local k,l,_=pcall(require,"..util.LQ("luarocks.loader")..") _=k and l.add_context("..util.LQ(name)..","..util.LQ(version)..")"
wrapper:write(fs.Qb(lua)..' -e '..fs.Qb(ppaths)..' -e '..fs.Qb(addctx)..' '..fs.Qb(file)..' %*\n')
+ wrapper:write("exit /b %ERRORLEVEL%\n")
wrapper:close()
return true
end
diff --git a/luarocks/src/luarocks/fs/win32/tools.lua b/luarocks/src/luarocks/fs/win32/tools.lua
index f970f36..b9dce85 100644
--- a/luarocks/src/luarocks/fs/win32/tools.lua
+++ b/luarocks/src/luarocks/fs/win32/tools.lua
@@ -39,7 +39,7 @@ end
function tools.current_dir()
local current = cfg.cache_pwd
if not current then
- local pipe = io.popen(fs.Q(vars.PWD))
+ local pipe = io.popen(fs.Q(vars.PWD).. " 2> NUL")
current = pipe:read("*l")
pipe:close()
cfg.cache_pwd = current
@@ -56,7 +56,9 @@ end
-- @return boolean: true if command succeeds (status code 0), false
-- otherwise.
function tools.execute_string(cmd)
- cmd = command_at(fs.current_dir(), cmd)
+ local current = fs.current_dir()
+ if not current then return false end
+ cmd = command_at(current, cmd)
local code = os.execute(cmd)
if code == 0 or code == true then
return true
@@ -149,7 +151,7 @@ end
-- plus an error message.
function tools.copy_contents(src, dest)
assert(src and dest)
- if fs.execute_quiet(fs.Q(vars.CP).." -dR "..src.."\\*.* "..fs.Q(dest)) then
+ if fs.execute_quiet(fs.Q(vars.CP), "-dR", src.."\\*.*", dest) then
return true
else
return false, "Failed copying "..src.." to "..dest
@@ -256,7 +258,7 @@ function tools.use_downloader(url, filename, cache)
local ok
if cfg.downloader == "wget" then
- local wget_cmd = fs.Q(vars.WGET).." --no-check-certificate --no-cache --user-agent=\""..cfg.user_agent.." via wget\" --quiet "
+ local wget_cmd = fs.Q(vars.WGET).." "..vars.WGETNOCERTFLAG.." --no-cache --user-agent=\""..cfg.user_agent.." via wget\" --quiet "
if cfg.connection_timeout and cfg.connection_timeout > 0 then
wget_cmd = wget_cmd .. "--timeout="..tonumber(cfg.connection_timeout).." --tries=1 "
end
@@ -272,7 +274,7 @@ function tools.use_downloader(url, filename, cache)
ok = fs.execute_quiet(wget_cmd, url)
end
elseif cfg.downloader == "curl" then
- local curl_cmd = vars.CURL.." -f -k -L --user-agent \""..cfg.user_agent.." via curl\" "
+ local curl_cmd = fs.Q(vars.CURL).." "..vars.CURLNOCERTFLAG.." -f -L --user-agent \""..cfg.user_agent.." via curl\" "
if cfg.connection_timeout and cfg.connection_timeout > 0 then
curl_cmd = curl_cmd .. "--connect-timeout "..tonumber(cfg.connection_timeout).." "
end
diff --git a/luarocks/src/luarocks/help.lua b/luarocks/src/luarocks/help.lua
index 0a15550..92458b2 100644
--- a/luarocks/src/luarocks/help.lua
+++ b/luarocks/src/luarocks/help.lua
@@ -31,10 +31,8 @@ end
local function get_status(status)
if status then
return "ok"
- elseif status == false then
- return "not found"
else
- return "failed"
+ return "not found"
end
end
@@ -47,7 +45,7 @@ function help.run(...)
local flags, command = util.parse_flags(...)
if not command then
- local sys_file, sys_ok, home_file, home_ok = cfg.which_config()
+ local conf = cfg.which_config()
print_banner()
print_section("NAME")
util.printout("\t"..program..[[ - ]]..program_description)
@@ -83,9 +81,9 @@ function help.run(...)
print_section("CONFIGURATION")
util.printout("\tLua version: " .. cfg.lua_version)
util.printout("\tConfiguration files:")
- util.printout("\t\tSystem: ".. dir.normalize(sys_file) .. " (" .. get_status(sys_ok) ..")")
- if home_file then
- util.printout("\t\tUser : ".. dir.normalize(home_file) .. " (" .. get_status(home_ok) ..")\n")
+ util.printout("\t\tSystem: ".. dir.normalize(conf.system.file) .. " (" .. get_status(conf.system.ok) ..")")
+ if conf.user.file then
+ util.printout("\t\tUser : ".. dir.normalize(conf.user.file) .. " (" .. get_status(conf.user.ok) ..")\n")
else
util.printout("\t\tUser : disabled in this LuaRocks installation.\n")
end
@@ -100,7 +98,7 @@ function help.run(...)
end
else
command = command:gsub("-", "_")
- local cmd = require(commands[command])
+ local cmd = commands[command] and require(commands[command])
if cmd then
local arguments = cmd.help_arguments or "<argument>"
print_banner()
diff --git a/luarocks/src/luarocks/install.lua b/luarocks/src/luarocks/install.lua
index 7678c0c..6d457fc 100644
--- a/luarocks/src/luarocks/install.lua
+++ b/luarocks/src/luarocks/install.lua
@@ -26,6 +26,8 @@ or a filename of a locally available rock.
rock after installing a new one. This behavior can
be made permanent by setting keep_other_versions=true
in the configuration file.
+
+--only-deps Installs only the dependencies of the rock.
]]..util.deps_mode_help()
@@ -109,6 +111,43 @@ function install.install_binary_rock(rock_file, deps_mode)
return name, version
end
+--- Installs the dependencies of a binary rock.
+-- @param rock_file string: local or remote filename of a rock.
+-- @param deps_mode: string: Which trees to check dependencies for:
+-- "one" for the current default tree, "all" for all trees,
+-- "order" for all trees with priority >= the current default, "none" for no trees.
+-- @return (string, string) or (nil, string, [string]): Name and version of
+-- the rock whose dependencies were installed if succeeded or nil and an error message
+-- followed by an error code.
+function install.install_binary_rock_deps(rock_file, deps_mode)
+ assert(type(rock_file) == "string")
+
+ local name, version, arch = path.parse_name(rock_file)
+ if not name then
+ return nil, "Filename "..rock_file.." does not match format 'name-version-revision.arch.rock'."
+ end
+
+ if arch ~= "all" and arch ~= cfg.arch then
+ return nil, "Incompatible architecture "..arch, "arch"
+ end
+
+ local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, path.install_dir(name, version))
+ if not ok then return nil, err, errcode end
+
+ local rockspec, err, errcode = fetch.load_rockspec(path.rockspec_file(name, version))
+ if err then
+ return nil, "Failed loading rockspec for installed package: "..err, errcode
+ end
+
+ ok, err, errcode = deps.fulfill_dependencies(rockspec, deps_mode)
+ if err then return nil, err, errcode end
+
+ util.printout()
+ util.printout("Succesfully installed dependencies for " ..name.." "..version)
+
+ return name, version
+end
+
--- Driver function for the "install" command.
-- @param name string: name of a binary rock. If an URL or pathname
-- to a binary rock is given, fetches and installs it. If a rockspec or a
@@ -131,12 +170,16 @@ function install.run(...)
if name:match("%.rockspec$") or name:match("%.src%.rock$") then
util.printout("Using "..name.."... switching to 'build' mode")
local build = require("luarocks.build")
- return build.run(name, util.forward_flags(flags, "local", "keep", "deps-mode"))
+ return build.run(name, util.forward_flags(flags, "local", "keep", "deps-mode", "only-deps"))
elseif name:match("%.rock$") then
- ok, err = install.install_binary_rock(name, deps.get_deps_mode(flags))
+ if flags["only-deps"] then
+ ok, err = install.install_binary_rock_deps(name, deps.get_deps_mode(flags))
+ else
+ ok, err = install.install_binary_rock(name, deps.get_deps_mode(flags))
+ end
if not ok then return nil, err end
local name, version = ok, err
- if (not flags["keep"]) and not cfg.keep_other_versions then
+ if (not flags["only-deps"]) and (not flags["keep"]) and not cfg.keep_other_versions then
local ok, err = remove.remove_other_versions(name, version, flags["force"])
if not ok then util.printerr(err) end
end
diff --git a/luarocks/src/luarocks/list.lua b/luarocks/src/luarocks/list.lua
index 319909d..fddded0 100644
--- a/luarocks/src/luarocks/list.lua
+++ b/luarocks/src/luarocks/list.lua
@@ -6,33 +6,97 @@ local list = {}
package.loaded["luarocks.list"] = list
local search = require("luarocks.search")
+local deps = require("luarocks.deps")
local cfg = require("luarocks.cfg")
local util = require("luarocks.util")
local path = require("luarocks.path")
-list.help_summary = "Lists currently installed rocks."
+list.help_summary = "List currently installed rocks."
list.help_arguments = "[--porcelain] <filter>"
list.help = [[
<filter> is a substring of a rock name to filter by.
+--outdated List only rocks for which there is a
+ higher version available in the rocks server.
+
--porcelain Produce machine-friendly output.
]]
+local function check_outdated(trees, query)
+ local results_installed = {}
+ for _, tree in ipairs(trees) do
+ search.manifest_search(results_installed, path.rocks_dir(tree), query)
+ end
+ local outdated = {}
+ for name, versions in util.sortedpairs(results_installed) do
+ local latest_installed
+ local latest_available, latest_available_repo
+
+ for version, _ in util.sortedpairs(versions) do
+ latest_installed = version
+ break
+ end
+
+ local query_available = search.make_query(name:lower())
+ query.exact_name = true
+ local results_available, err = search.search_repos(query_available)
+
+ if results_available[name] then
+ for version, repos in util.sortedpairs(results_available[name], deps.compare_versions) do
+ latest_available = version
+ for _, repo in ipairs(repos) do
+ latest_available_repo = repo.repo
+ break
+ end
+ break
+ end
+
+ if deps.compare_versions(latest_available, latest_installed) then
+ table.insert(outdated, { name = name, installed = latest_installed, available = latest_available, repo = latest_available_repo })
+ end
+ end
+ end
+ return outdated
+end
+
+local function list_outdated(trees, query, porcelain)
+ util.title("Outdated rocks:", porcelain)
+ local outdated = check_outdated(trees, query)
+ for _, item in ipairs(outdated) do
+ if porcelain then
+ util.printout(item.name, item.installed, item.available, item.repo)
+ else
+ util.printout(item.name)
+ util.printout(" "..item.installed.." < "..item.available.." at "..item.repo)
+ util.printout()
+ end
+ end
+ return true
+end
+
--- Driver function for "list" command.
-- @param filter string or nil: A substring of a rock name to filter by.
-- @param version string or nil: a version may also be passed.
-- @return boolean: True if succeeded, nil on errors.
function list.run(...)
local flags, filter, version = util.parse_flags(...)
- local results = {}
local query = search.make_query(filter and filter:lower() or "", version)
query.exact_name = false
local trees = cfg.rocks_trees
if flags["tree"] then
trees = { flags["tree"] }
end
+
+ if flags["outdated"] then
+ return list_outdated(trees, query, flags["porcelain"])
+ end
+
+ local results = {}
for _, tree in ipairs(trees) do
- search.manifest_search(results, path.rocks_dir(tree), query)
+ local ok, err = search.manifest_search(results, path.rocks_dir(tree), query)
+ if not ok then
+ util.warning(err)
+ end
end
util.title("Installed rocks:", flags["porcelain"])
search.print_results(results, flags["porcelain"])
diff --git a/luarocks/src/luarocks/manif_core.lua b/luarocks/src/luarocks/manif_core.lua
index 1a2c111..d719caa 100644
--- a/luarocks/src/luarocks/manif_core.lua
+++ b/luarocks/src/luarocks/manif_core.lua
@@ -9,7 +9,6 @@ local persist = require("luarocks.persist")
local type_check = require("luarocks.type_check")
local dir = require("luarocks.dir")
local util = require("luarocks.util")
-local cfg = require("luarocks.cfg")
local path = require("luarocks.path")
manif_core.manifest_cache = {}
diff --git a/luarocks/src/luarocks/path.lua b/luarocks/src/luarocks/path.lua
index 598e51d..fb5eec7 100644
--- a/luarocks/src/luarocks/path.lua
+++ b/luarocks/src/luarocks/path.lua
@@ -339,6 +339,8 @@ function path.map_trees(deps_mode, fn, ...)
return result
end
+local is_src_extension = { [".lua"] = true, [".tl"] = true, [".tld"] = true, [".moon"] = true }
+
--- Return the pathname of the file that would be loaded for a module, indexed.
-- @param module_name string: module name (eg. "socket.core")
-- @param name string: name of the package (eg. "luasocket")
@@ -349,7 +351,8 @@ end
-- @return string: filename of the module (eg. "/usr/local/lib/lua/5.1/socket/core.so")
function path.which_i(module_name, name, version, tree, i)
local deploy_dir
- if module_name:match("%.lua$") then
+ local extension = module_name:match("%.[a-z]+$")
+ if is_src_extension[extension] then
deploy_dir = path.deploy_lua_dir(tree)
module_name = dir.path(deploy_dir, module_name)
else
diff --git a/luarocks/src/luarocks/path_cmd.lua b/luarocks/src/luarocks/path_cmd.lua
index 95532f9..2bee4cb 100644
--- a/luarocks/src/luarocks/path_cmd.lua
+++ b/luarocks/src/luarocks/path_cmd.lua
@@ -6,7 +6,6 @@ local path_cmd = {}
local util = require("luarocks.util")
local deps = require("luarocks.deps")
local cfg = require("luarocks.cfg")
-local path = require("luarocks.path")
path_cmd.help_summary = "Return the currently configured package path."
path_cmd.help_arguments = ""
diff --git a/luarocks/src/luarocks/persist.lua b/luarocks/src/luarocks/persist.lua
index 9d601a4..354b17c 100644
--- a/luarocks/src/luarocks/persist.lua
+++ b/luarocks/src/luarocks/persist.lua
@@ -9,60 +9,85 @@ package.loaded["luarocks.persist"] = persist
local util = require("luarocks.util")
+--- Load and run a Lua file in an environment.
+-- @param filename string: the name of the file.
+-- @param env table: the environment table.
+-- @return (true, any) or (nil, string, string): true and the return value
+-- of the file, or nil, an error message and an error code ("open", "load"
+-- or "run") in case of errors.
+local function run_file(filename, env)
+ local fd, err = io.open(filename)
+ if not fd then
+ return nil, err, "open"
+ end
+ local str, err = fd:read("*a")
+ fd:close()
+ if not str then
+ return nil, err, "open"
+ end
+ str = str:gsub("^#![^\n]*\n", "")
+ local chunk, ran
+ if _VERSION == "Lua 5.1" then -- Lua 5.1
+ chunk, err = loadstring(str, filename)
+ if chunk then
+ setfenv(chunk, env)
+ ran, err = pcall(chunk)
+ end
+ else -- Lua 5.2
+ chunk, err = load(str, filename, "t", env)
+ if chunk then
+ ran, err = pcall(chunk)
+ end
+ end
+ if not chunk then
+ return nil, "Error loading file: "..err, "load"
+ end
+ if not ran then
+ return nil, "Error running file: "..err, "run"
+ end
+ return true, err
+end
+
--- Load a Lua file containing assignments, storing them in a table.
-- The global environment is not propagated to the loaded file.
-- @param filename string: the name of the file.
-- @param tbl table or nil: if given, this table is used to store
-- loaded values.
--- @return table or (nil, string): a table with the file's assignments
--- as fields, or nil and a message in case of errors.
+-- @return (table, table) or (nil, string, string): a table with the file's assignments
+-- as fields and set of undefined globals accessed in file,
+-- or nil, an error message and an error code ("open"; couldn't open the file,
+-- "load"; compile-time error, or "run"; run-time error)
+-- in case of errors.
function persist.load_into_table(filename, tbl)
assert(type(filename) == "string")
assert(type(tbl) == "table" or not tbl)
- local result, chunk, ran, err
- result = tbl or {}
+ local result = tbl or {}
local globals = {}
local globals_mt = {
- __index = function(t, n)
- globals[n] = true
- return rawget(t, n)
+ __index = function(t, k)
+ globals[k] = true
end
}
local save_mt = getmetatable(result)
setmetatable(result, globals_mt)
- if _VERSION == "Lua 5.1" then -- Lua 5.1
- chunk, err = loadfile(filename)
- if chunk then
- setfenv(chunk, result)
- ran, err = pcall(chunk)
- end
- else -- Lua 5.2
- chunk, err = loadfile(filename, "t", result)
- if chunk then
- ran, err = pcall(chunk)
- end
- end
- setmetatable(result, save_mt)
- if not chunk then
- if err:sub(1,5) ~= filename:sub(1,5) then
- return false, err
- end
- return nil, "Error loading file: "..err
- end
- if not ran then
- return nil, "Error running file: "..err
+ local ok, err, errcode = run_file(filename, result)
+
+ setmetatable(result, save_mt)
+
+ if not ok then
+ return nil, err, errcode
end
return result, globals
end
local write_table
---- Write a value as Lua code, invoking write_table.
--- This function handles only numbers, strings and tables
--- are keys (tables are handled recursively).
--- @param out userdata: a file object, open for writing.
+--- Write a value as Lua code.
+-- This function handles only numbers and strings, invoking write_table
+-- to write tables.
+-- @param out table or userdata: a writer object supporting :write() method.
-- @param v: the value to be written.
-- @param level number: the indentation level
-- @param sub_order table: optional prioritization table
@@ -71,28 +96,27 @@ local function write_value(out, v, level, sub_order)
if type(v) == "table" then
write_table(out, v, level + 1, sub_order)
elseif type(v) == "string" then
- if v:match("\n") then
+ if v:match("[\r\n]") then
local open, close = "[[", "]]"
local equals = 0
- while v:find(open,1,true) or v:find(close,1,true) do
+ while v:find(close, 1, true) do
equals = equals + 1
local eqs = ("="):rep(equals)
open, close = "["..eqs.."[", "]"..eqs.."]"
end
out:write(open.."\n"..v..close)
else
- out:write("\""..v:gsub("\"", "\\\"").."\"")
+ out:write("\""..v:gsub("\\", "\\\\"):gsub("\"", "\\\"").."\"")
end
else
out:write(tostring(v))
end
end
---- Write a table as Lua code representing a table to disk
--- (that is, in curly brackets notation).
--- This function handles only numbers, strings and tables
--- are keys (tables are handled recursively).
--- @param out userdata: a file object, open for writing.
+--- Write a table as Lua code in curly brackets notation to a writer object.
+-- Only numbers, strings and tables (containing numbers, strings
+-- or other recursively processed tables) are supported.
+-- @param out table or userdata: a writer object supporting :write() method.
-- @param tbl table: the table to be written.
-- @param level number: the indentation level
-- @param field_order table: optional prioritization table
@@ -107,28 +131,29 @@ write_table = function(out, tbl, level, field_order)
if indent then
for n = 1,level do out:write(indentation) end
end
- sep = ",\n"
- indent = true
- if type(k) == "number" then
- if k ~= i then
- out:write("["..tostring(k).."]=")
- else
- i = i + 1
- end
- indent = false
- sep = ", "
- elseif type(k) == "table" then
- out:write("[")
- write_table(out, k, level + 1)
- out:write("] = ")
+
+ if k == i then
+ i = i + 1
else
- if k:match("^[a-zA-Z_][a-zA-Z0-9_]*$") then
- out:write(k.." = ")
+ if type(k) == "string" and k:match("^[a-zA-Z_][a-zA-Z0-9_]*$") then
+ out:write(k)
else
- out:write("['"..k:gsub("'", "\\'").."'] = ")
+ out:write("[")
+ write_value(out, k, level)
+ out:write("]")
end
+
+ out:write(" = ")
end
+
write_value(out, v, level, sub_order)
+ if type(k) == "number" then
+ sep = ", "
+ indent = false
+ else
+ sep = ",\n"
+ indent = true
+ end
end
if sep ~= "\n" then
out:write("\n")
@@ -137,18 +162,16 @@ write_table = function(out, tbl, level, field_order)
out:write("}")
end
---- Writes a table to an io-like object.
--- @param out userdata: a file object, open for writing.
+--- Write a table as series of assignments to a writer object.
+-- @param out table or userdata: a writer object supporting :write() method.
-- @param tbl table: the table to be written.
-- @param field_order table: optional prioritization table
--- @return userdata The file object originally passed in as the `out` parameter.
-local function write_table(out, tbl, field_order)
+local function write_table_as_assignments(out, tbl, field_order)
for k, v, sub_order in util.sortedpairs(tbl, field_order) do
out:write(k.." = ")
write_value(out, v, 0, sub_order)
out:write("\n")
end
- return out
end
--- Save the contents of a table to a string.
@@ -161,7 +184,7 @@ end
function persist.save_from_table_to_string(tbl, field_order)
local out = {buffer = {}}
function out:write(data) table.insert(self.buffer, data) end
- write_table(out, tbl, field_order)
+ write_table_as_assignments(out, tbl, field_order)
return table.concat(out.buffer)
end
@@ -179,7 +202,7 @@ function persist.save_from_table(filename, tbl, field_order)
if not out then
return nil, "Cannot create file at "..filename
end
- write_table(out, tbl, field_order)
+ write_table_as_assignments(out, tbl, field_order)
out:close()
return true
end
diff --git a/luarocks/src/luarocks/remove.lua b/luarocks/src/luarocks/remove.lua
index e1cd44f..5d41981 100644
--- a/luarocks/src/luarocks/remove.lua
+++ b/luarocks/src/luarocks/remove.lua
@@ -159,7 +159,7 @@ function remove.run(...)
local results = {}
search.manifest_search(results, cfg.rocks_dir, search.make_query(name, version))
if not results[name] then
- return nil, "Could not find rock '"..name..(version and " "..version or "").."' in "..cfg.root_dir
+ return nil, "Could not find rock '"..name..(version and " "..version or "").."' in "..path.rocks_tree_to_string(cfg.root_dir)
end
return remove.remove_search_results(results, name, deps_mode, flags["force"])
diff --git a/luarocks/src/luarocks/search.lua b/luarocks/src/luarocks/search.lua
index 5343938..f1a82d5 100644
--- a/luarocks/src/luarocks/search.lua
+++ b/luarocks/src/luarocks/search.lua
@@ -155,10 +155,11 @@ function search.disk_search(repo, query, results)
return results
end
---- Perform search on a rocks server.
+--- Perform search on a rocks server or tree.
-- @param results table: The results table, where keys are package names and
-- versions are tables matching version strings to an array of servers.
--- @param repo string: The URL of the rocks server.
+-- @param repo string: The URL of a rocks server or
+-- the pathname of a rocks tree (as returned by path.rocks_dir()).
-- @param query table: A table describing the query in dependency
-- format (for example, {name = "filesystem", exact_name = false,
-- constraints = {op = "~>", version = {1,0}}}, arch = "rockspec").
diff --git a/luarocks/src/luarocks/show.lua b/luarocks/src/luarocks/show.lua
index 3243c0c..08b2673 100644
--- a/luarocks/src/luarocks/show.lua
+++ b/luarocks/src/luarocks/show.lua
@@ -11,7 +11,7 @@ local path = require("luarocks.path")
local deps = require("luarocks.deps")
local fetch = require("luarocks.fetch")
local manif = require("luarocks.manif")
-show.help_summary = "Shows information about an installed rock."
+show.help_summary = "Show information about an installed rock."
show.help = [[
<argument> is an existing package name.
diff --git a/luarocks/src/luarocks/tools/patch.lua b/luarocks/src/luarocks/tools/patch.lua
index 8df3093..debaf63 100644
--- a/luarocks/src/luarocks/tools/patch.lua
+++ b/luarocks/src/luarocks/tools/patch.lua
@@ -22,8 +22,8 @@ local format = string.format
-- logging
local debugmode = false
-local function debug(s) end
-local function info(s) end
+local function debug(_) end
+local function info(_) end
local function warning(s) io.stderr:write(s .. '\n') end
-- Returns boolean whether string s2 starts with string s.
@@ -57,27 +57,30 @@ end
local function isfile() return true end --FIX?
local function read_file(filename)
- local fh, err, oserr = io.open(filename, 'rb')
+ local fh, data, err, oserr
+ fh, err, oserr = io.open(filename, 'rb')
if not fh then return fh, err, oserr end
- local data, err, oserr = fh:read'*a'
+ data, err, oserr = fh:read'*a'
fh:close()
if not data then return nil, err, oserr end
return data
end
local function write_file(filename, data)
- local fh, err, oserr = io.open(filename 'wb')
+ local fh, status, err, oserr
+ fh, err, oserr = io.open(filename 'wb')
if not fh then return fh, err, oserr end
- local status, err, oserr = fh:write(data)
+ status, err, oserr = fh:write(data)
fh:close()
if not status then return nil, err, oserr end
return true
end
local function file_copy(src, dest)
- local data, err, oserr = read_file(src)
+ local data, status, err, oserr
+ data, err, oserr = read_file(src)
if not data then return data, err, oserr end
- local status, err, oserr = write_file(dest)
+ status, err, oserr = write_file(dest)
if not status then return status, err, oserr end
return true
end
@@ -197,8 +200,13 @@ function patch.read_patch(filename, data)
if state == 'hunkbody' then
-- skip hunkskip and hunkbody code until definition of hunkhead read
+ if line:match"^[\r\n]*$" then
+ -- prepend space to empty lines to interpret them as context properly
+ line = " " .. line
+ end
+
-- process line first
- if line:match"^[- +\\]" or line:match"^[\r\n]*$" then
+ if line:match"^[- +\\]" then
-- gather stats about line endings
local he = files.hunkends[nextfileno]
if endswith(line, "\r\n") then
@@ -420,7 +428,7 @@ local function find_hunk(file, h, hno)
end
h.startsrc = location
h.starttgt = h.starttgt + offset
- for i=1,fuzz do
+ for _=1,fuzz do
table.remove(h.text, 1)
table.remove(h.text, #h.text)
end
@@ -452,16 +460,15 @@ local function find_hunks(file, hunks)
end
local function check_patched(file, hunks)
- local matched = true
local lineno = 1
local ok, err = pcall(function()
if #file == 0 then
- error 'nomatch'
+ error('nomatch', 0)
end
for hno, h in ipairs(hunks) do
-- skip to line just before hunk starts
if #file < h.starttgt then
- error 'nomatch'
+ error('nomatch', 0)
end
lineno = h.starttgt
for _, hline in ipairs(h.text) do
@@ -470,22 +477,18 @@ local function check_patched(file, hunks)
local line = file[lineno]
lineno = lineno + 1
if #line == 0 then
- error 'nomatch'
+ error('nomatch', 0)
end
if endlstrip(line) ~= endlstrip(hline:sub(2)) then
warning(format("file is not patched - failed hunk: %d", hno))
- error 'nomatch'
+ error('nomatch', 0)
end
end
end
end
end)
- if err == 'nomatch' then
- matched = false
- end
- -- todo: display failed hunk, i.e. expected/found
-
- return matched
+ -- todo: display failed hunk, i.e. expected/found
+ return err ~= 'nomatch'
end
local function patch_hunks(srcname, tgtname, hunks)
@@ -532,7 +535,7 @@ local function patch_hunks(srcname, tgtname, hunks)
local line2write = hline:sub(2)
-- detect if line ends are consistent in source file
local sum = 0
- for k,v in pairs(lineends) do if v > 0 then sum=sum+1 end end
+ for _,v in pairs(lineends) do if v > 0 then sum=sum+1 end end
if sum == 1 then
local newline
for k,v in pairs(lineends) do if v ~= 0 then newline = k end end
@@ -553,7 +556,7 @@ end
local function strip_dirs(filename, strip)
if strip == nil then return filename end
- for i=1,strip do
+ for _=1,strip do
filename=filename:gsub("^[^/]*/", "")
end
return filename
@@ -593,7 +596,6 @@ function patch.apply_patch(the_patch, strip)
local hunkno = 1
local hunk = hunks[hunkno]
local hunkfind = {}
- local hunkreplace = {}
local validhunks = 0
local canpatch = false
local hunklineno
@@ -610,15 +612,10 @@ function patch.apply_patch(the_patch, strip)
elseif lineno == hunk.startsrc then
hunkfind = {}
for _,x in ipairs(hunk.text) do
- if x:sub(1,1) == ' ' or x:sub(1,1) == '-' then
- hunkfind[#hunkfind+1] = endlstrip(x:sub(2))
- end end
- hunkreplace = {}
- for _,x in ipairs(hunk.text) do
- if x:sub(1,1) == ' ' or x:sub(1,1) == '+' then
- hunkreplace[#hunkreplace+1] = endlstrip(x:sub(2))
- end end
- --pprint(hunkreplace)
+ if x:sub(1,1) == ' ' or x:sub(1,1) == '-' then
+ hunkfind[#hunkfind+1] = endlstrip(x:sub(2))
+ end
+ end
hunklineno = 1
-- todo \ No newline at end of file
diff --git a/luarocks/src/luarocks/tools/tar.lua b/luarocks/src/luarocks/tools/tar.lua
index 03f7de3..b2bd930 100644
--- a/luarocks/src/luarocks/tools/tar.lua
+++ b/luarocks/src/luarocks/tools/tar.lua
@@ -31,9 +31,10 @@ local function octal_to_number(octal)
local number = 0
for i = #octal,1,-1 do
local digit = tonumber(octal:sub(i,i))
- if not digit then break end
- number = number + (digit * 8^exp)
- exp = exp + 1
+ if digit then
+ number = number + (digit * 8^exp)
+ exp = exp + 1
+ end
end
return number
end
@@ -143,6 +144,7 @@ function tar.untar(filename, destdir)
util.printout()
--]]
end
+ tar_handle:close()
return true
end
diff --git a/luarocks/src/luarocks/tools/zip.lua b/luarocks/src/luarocks/tools/zip.lua
index 40cc089..101cae8 100644
--- a/luarocks/src/luarocks/tools/zip.lua
+++ b/luarocks/src/luarocks/tools/zip.lua
@@ -1,6 +1,6 @@
--- A Lua implementation of .zip file archiving (used for creating .rock files),
--- using only lua-zlib.
+-- using only lzlib.
--module("luarocks.tools.zip", package.seeall)
local zip = {}
@@ -10,7 +10,7 @@ local dir = require("luarocks.dir")
local function number_to_bytestring(number, nbytes)
local out = {}
- for i = 1, nbytes do
+ for _ = 1, nbytes do
local byte = number % 256
table.insert(out, string.char(byte))
number = (number - byte) / 256
@@ -237,7 +237,7 @@ function zip.zip(zipfile, ...)
end
end
- local ok = zw:close()
+ ok = zw:close()
if not ok then
return false, "error closing "..zipfile
end
diff --git a/luarocks/src/luarocks/type_check.lua b/luarocks/src/luarocks/type_check.lua
index a78c484..65b4fc1 100644
--- a/luarocks/src/luarocks/type_check.lua
+++ b/luarocks/src/luarocks/type_check.lua
@@ -6,72 +6,97 @@ local type_check = {}
package.loaded["luarocks.type_check"] = type_check
local cfg = require("luarocks.cfg")
+local deps = require("luarocks.deps")
-type_check.rockspec_format = "1.0"
+type_check.rockspec_format = "1.1"
+
+local string_1 = { _type = "string" }
+local number_1 = { _type = "number" }
+local mandatory_string_1 = { _type = "string", _mandatory = true }
+
+-- Syntax for type-checking tables:
+--
+-- A type-checking table describes typing data for a value.
+-- Any key starting with an underscore has a special meaning:
+-- _type (string) is the Lua type of the value. Default is "table".
+-- _version (string) is the minimum rockspec_version that supports this value. Default is "1.0".
+-- _mandatory (boolean) indicates if the value is a mandatory key in its container table. Default is false.
+-- For "string" types only:
+-- _pattern (string) is the string-matching pattern, valid for string types only. Default is ".*".
+-- For "table" types only:
+-- _any (table) is the type-checking table for unspecified keys, recursively checked.
+-- _more (boolean) indicates that the table accepts unspecified keys and does not type-check them.
+-- Any other string keys that don't start with an underscore represent known keys and are type-checking tables, recursively checked.
local rockspec_types = {
- rockspec_format = "string",
- MUST_package = "string",
- MUST_version = "[%w.]+-[%d]+",
+ rockspec_format = string_1,
+ package = mandatory_string_1,
+ version = { _type = "string", _pattern = "[%w.]+-[%d]+", _mandatory = true },
description = {
- summary = "string",
- detailed = "string",
- homepage = "string",
- license = "string",
- maintainer = "string"
+ summary = string_1,
+ detailed = string_1,
+ homepage = string_1,
+ license = string_1,
+ maintainer = string_1,
},
dependencies = {
- platforms = {},
- ANY = "string"
+ platforms = {}, -- recursively defined below
+ _any = string_1,
},
supported_platforms = {
- ANY = "string"
+ _any = string_1,
},
external_dependencies = {
- platforms = {},
- ANY = {
- program = "string",
- header = "string",
- library = "string"
+ platforms = {}, -- recursively defined below
+ _any = {
+ program = string_1,
+ header = string_1,
+ library = string_1,
}
},
- MUST_source = {
- platforms = {},
- MUST_url = "string",
- md5 = "string",
- file = "string",
- dir = "string",
- tag = "string",
- branch = "string",
- module = "string",
- cvs_tag = "string",
- cvs_module = "string"
+ source = {
+ _mandatory = true,
+ platforms = {}, -- recursively defined below
+ url = mandatory_string_1,
+ md5 = string_1,
+ file = string_1,
+ dir = string_1,
+ tag = string_1,
+ branch = string_1,
+ module = string_1,
+ cvs_tag = string_1,
+ cvs_module = string_1,
},
build = {
- platforms = {},
- type = "string",
+ platforms = {}, -- recursively defined below
+ type = string_1,
install = {
lua = {
- MORE = true
+ _more = true
},
lib = {
- MORE = true
+ _more = true
},
conf = {
- MORE = true
+ _more = true
},
bin = {
- MORE = true
+ _more = true
}
},
copy_directories = {
- ANY = "string"
+ _any = string_1,
},
- MORE = true
+ _more = true,
+ _mandatory = true
},
hooks = {
- platforms = {},
- post_install = "string"
+ platforms = {}, -- recursively defined below
+ post_install = string_1,
+ },
+ deploy = {
+ _version = "1.1",
+ wrap_bin_scripts = { _type = "boolean", _version = "1.1" },
}
}
@@ -82,69 +107,61 @@ type_check.rockspec_order = {"rockspec_format", "package", "version",
{ "build", {"type", "modules", "copy_directories", "platforms"} },
"hooks"}
-function type_check.load_extensions()
- type_check.rockspec_format = "1.1"
- rockspec_types.deploy = {
- wrap_bin_scripts = true,
- }
-end
-
-if cfg.use_extensions then
- type_check.load_extensions()
-end
-
-rockspec_types.build.platforms.ANY = rockspec_types.build
-rockspec_types.dependencies.platforms.ANY = rockspec_types.dependencies
-rockspec_types.external_dependencies.platforms.ANY = rockspec_types.external_dependencies
-rockspec_types.MUST_source.platforms.ANY = rockspec_types.MUST_source
-rockspec_types.hooks.platforms.ANY = rockspec_types.hooks
+rockspec_types.build.platforms._any = rockspec_types.build
+rockspec_types.dependencies.platforms._any = rockspec_types.dependencies
+rockspec_types.external_dependencies.platforms._any = rockspec_types.external_dependencies
+rockspec_types.source.platforms._any = rockspec_types.source
+rockspec_types.hooks.platforms._any = rockspec_types.hooks
local manifest_types = {
- MUST_repository = {
+ repository = {
+ _mandatory = true,
-- packages
- ANY = {
+ _any = {
-- versions
- ANY = {
+ _any = {
-- items
- ANY = {
- MUST_arch = "string",
- modules = { ANY = "string" },
- commands = { ANY = "string" },
- dependencies = { ANY = "string" },
+ _any = {
+ arch = mandatory_string_1,
+ modules = { _any = string_1 },
+ commands = { _any = string_1 },
+ dependencies = { _any = string_1 },
-- TODO: to be extended with more metadata.
}
}
}
},
- MUST_modules = {
+ modules = {
+ _mandatory = true,
-- modules
- ANY = {
+ _any = {
-- providers
- ANY = "string"
+ _any = string_1
}
},
- MUST_commands = {
+ commands = {
+ _mandatory = true,
-- modules
- ANY = {
+ _any = {
-- commands
- ANY = "string"
+ _any = string_1
}
},
dependencies = {
-- each module
- ANY = {
+ _any = {
-- each version
- ANY = {
+ _any = {
-- each dependency
- ANY = {
- name = "string",
+ _any = {
+ name = string_1,
constraints = {
- ANY = {
- no_upgrade = "boolean",
- op = "string",
+ _any = {
+ no_upgrade = { _type = "boolean" },
+ op = string_1,
version = {
- string = "string",
- ANY = 0,
+ string = string_1,
+ _any = number_1,
}
}
}
@@ -154,54 +171,75 @@ local manifest_types = {
}
}
+local function check_version(version, typetbl, context)
+ local typetbl_version = typetbl._version or "1.0"
+ if deps.compare_versions(typetbl_version, version) then
+ if context == "" then
+ return nil, "Invalid rockspec_format version number in rockspec? Please fix rockspec accordingly."
+ else
+ return nil, context.." is not supported in rockspec format "..version.." (requires version "..typetbl_version.."), please fix the rockspec_format field accordingly."
+ end
+ end
+ return true
+end
+
local type_check_table
--- Type check an object.
-- The object is compared against an archetypical value
-- matching the expected type -- the actual values don't matter,
-- only their types. Tables are type checked recursively.
--- @param name any: The object name (for error messages).
+-- @param version string: The version of the item.
-- @param item any: The object being checked.
--- @param expected any: The reference object. In case of a table,
--- its is structured as a type reference table.
+-- @param typetbl any: The type-checking table for the object.
-- @param context string: A string indicating the "context" where the
--- error occurred (such as the name of the table the item is a part of),
--- to be used by error messages.
+-- error occurred (the full table path), for error messages.
-- @return boolean or (nil, string): true if type checking
-- succeeded, or nil and an error message if it failed.
-- @see type_check_table
-local function type_check_item(name, item, expected, context)
- name = tostring(name)
-
- local item_type = type(item)
- local expected_type = type(expected)
+local function type_check_item(version, item, typetbl, context)
+ assert(type(version) == "string")
+
+ local ok, err = check_version(version, typetbl, context)
+ if not ok then
+ return nil, err
+ end
+
+ local item_type = type(item) or "nil"
+ local expected_type = typetbl._type or "table"
+
if expected_type == "number" then
if not tonumber(item) then
- return nil, "Type mismatch on field "..context..name..": expected a number"
+ return nil, "Type mismatch on field "..context..": expected a number"
end
elseif expected_type == "string" then
- if type(item) ~= "string" then
- return nil, "Type mismatch on field "..context..name..": expected a string"
+ if item_type ~= "string" then
+ return nil, "Type mismatch on field "..context..": expected a string, got "..item_type
end
- if expected ~= "string" then
- if item_type ~= "string" then
- return nil, "Type mismatch on field "..context..name..": expected a string, got a "..type(item)
- elseif not item:match("^"..expected.."$") then
- return nil, "Type mismatch on field "..context..name..": invalid value "..item.." does not match '"..expected.."'"
+ if typetbl._pattern then
+ if not item:match("^"..typetbl._pattern.."$") then
+ return nil, "Type mismatch on field "..context..": invalid value "..item.." does not match '"..typetbl._pattern.."'"
end
end
elseif expected_type == "table" then
if item_type ~= expected_type then
- return nil, "Type mismatch on field "..context..name..": expected a table"
+ return nil, "Type mismatch on field "..context..": expected a table"
else
- return type_check_table(item, expected, context..name..".")
+ return type_check_table(version, item, typetbl, context)
end
elseif item_type ~= expected_type then
- return nil, "Type mismatch on field "..context..name..": expected a "..expected_type
+ return nil, "Type mismatch on field "..context..": expected "..expected_type
end
return true
end
+local function mkfield(context, field)
+ if context == "" then
+ return field
+ end
+ return context.."."..field
+end
+
--- Type check the contents of a table.
-- The table's contents are compared against a reference table,
-- which contains the recognized fields, with archetypical values
@@ -215,23 +253,31 @@ end
-- with MUST_, it is mandatory; its absence from the table is
-- a type error.
-- Tables are type checked recursively.
+-- @param version string: The version of tbl.
-- @param tbl table: The table to be type checked.
--- @param types table: The reference table, containing
+-- @param typetbl table: The type-checking table, containing
-- values for recognized fields in the checked table.
-- @param context string: A string indicating the "context" where the
-- error occurred (such as the name of the table the item is a part of),
-- to be used by error messages.
-- @return boolean or (nil, string): true if type checking
-- succeeded, or nil and an error message if it failed.
-type_check_table = function(tbl, types, context)
+type_check_table = function(version, tbl, typetbl, context)
+ assert(type(version) == "string")
assert(type(tbl) == "table")
- assert(type(types) == "table")
+ assert(type(typetbl) == "table")
+
+ local ok, err = check_version(version, typetbl, context)
+ if not ok then
+ return nil, err
+ end
+
for k, v in pairs(tbl) do
- local t = types[k] or (type(k) == "string" and types["MUST_"..k]) or types.ANY
+ local t = typetbl[k] or typetbl._any
if t then
- local ok, err = type_check_item(k, v, t, context)
+ local ok, err = type_check_item(version, v, t, mkfield(context, k))
if not ok then return nil, err end
- elseif types.MORE then
+ elseif typetbl._more then
-- Accept unknown field
else
if not cfg.accept_unknown_fields then
@@ -239,21 +285,20 @@ type_check_table = function(tbl, types, context)
end
end
end
- for k, v in pairs(types) do
- local mandatory_key = k:match("^MUST_(.+)")
- if mandatory_key then
- if not tbl[mandatory_key] then
- return nil, "Mandatory field "..context..mandatory_key.." is missing."
+ for k, v in pairs(typetbl) do
+ if k:sub(1,1) ~= "_" and v._mandatory then
+ if not tbl[k] then
+ return nil, "Mandatory field "..mkfield(context, k).." is missing."
end
end
end
return true
end
-local function check_undeclared_globals(globals, types)
+local function check_undeclared_globals(globals, typetbl)
local undeclared = {}
for glob, _ in pairs(globals) do
- if not (types[glob] or types["MUST_"..glob]) then
+ if not (typetbl[glob] or typetbl["MUST_"..glob]) then
table.insert(undeclared, glob)
end
end
@@ -273,13 +318,12 @@ end
-- succeeded, or nil and an error message if it failed.
function type_check.type_check_rockspec(rockspec, globals)
assert(type(rockspec) == "table")
- if rockspec.rockspec_format then
- -- relies on global state
- type_check.load_extensions()
+ if not rockspec.rockspec_format then
+ rockspec.rockspec_format = "1.0"
end
local ok, err = check_undeclared_globals(globals, rockspec_types)
if not ok then return nil, err end
- return type_check_table(rockspec, rockspec_types, "")
+ return type_check_table(rockspec.rockspec_format, rockspec, rockspec_types, "")
end
--- Type check a manifest table.
@@ -292,7 +336,7 @@ function type_check.type_check_manifest(manifest, globals)
assert(type(manifest) == "table")
local ok, err = check_undeclared_globals(globals, manifest_types)
if not ok then return nil, err end
- return type_check_table(manifest, manifest_types, "")
+ return type_check_table("1.0", manifest, manifest_types, "")
end
return type_check
diff --git a/luarocks/src/luarocks/unpack.lua b/luarocks/src/luarocks/unpack.lua
index 9204e26..a889bac 100644
--- a/luarocks/src/luarocks/unpack.lua
+++ b/luarocks/src/luarocks/unpack.lua
@@ -43,9 +43,10 @@ local function unpack_rockspec(rockspec_file, dir_name)
end
ok, err = fs.change_dir(sources_dir)
if not ok then return nil, err end
- build.apply_patches(rockspec)
+ ok, err = build.apply_patches(rockspec)
fs.pop_dir()
fs.pop_dir()
+ if not ok then return nil, err end
return rockspec
end
@@ -79,8 +80,9 @@ local function unpack_rock(rock_file, dir_name, kind)
end
ok, err = fs.change_dir(rockspec.source.dir)
if not ok then return nil, err end
- build.apply_patches(rockspec)
+ ok, err = build.apply_patches(rockspec)
fs.pop_dir()
+ if not ok then return nil, err end
end
end
return rockspec
diff --git a/luarocks/src/luarocks/upload.lua b/luarocks/src/luarocks/upload.lua
index d87313a..19ddee8 100644
--- a/luarocks/src/luarocks/upload.lua
+++ b/luarocks/src/luarocks/upload.lua
@@ -54,7 +54,7 @@ function upload.run(...)
end
local rock_fname
- if not flags["skip-pack"] then
+ if not flags["skip-pack"] and not rockspec.version:match("^scm") then
util.printout("Packing " .. tostring(rockspec.package))
rock_fname, err = pack.pack_source_rock(fname)
if not rock_fname then
@@ -77,7 +77,7 @@ function upload.run(...)
if rock_fname then
util.printout(("Sending " .. tostring(rock_fname) .. " ..."))
- res, err = api:method("upload_rock/" .. tostring(res.version.id), nil, {
+ res, err = api:method("upload_rock/" .. ("%d"):format(res.version.id), nil, {
rock_file = multipart.new_file(rock_fname)
})
if not res then return nil, err end
diff --git a/luarocks/src/luarocks/upload/api.lua b/luarocks/src/luarocks/upload/api.lua
index c588335..2cf462f 100644
--- a/luarocks/src/luarocks/upload/api.lua
+++ b/luarocks/src/luarocks/upload/api.lua
@@ -10,16 +10,15 @@ local multipart = require("luarocks.upload.multipart")
local Api = {}
local function upload_config_file()
- local _, _, home_conf, home_ok = cfg.which_config()
- if not home_conf then
+ local conf = cfg.which_config()
+ if not conf.user.file then
return nil
end
- return (home_conf:gsub("/[^/]+$", "/upload_config.lua"))
+ return (conf.user.file:gsub("/[^/]+$", "/upload_config.lua"))
end
function Api:load_config()
local upload_conf = upload_config_file()
- print(upload_conf)
if not upload_conf then return nil end
local cfg, err = persist.load_into_table(upload_conf)
return cfg
@@ -116,6 +115,11 @@ local function require_json()
return nil
end
+local function redact_api_url(url)
+ url = tostring(url)
+ return (url:gsub(".*/api/[^/]+/[^/]+", "")) or ""
+end
+
local ltn12_ok, ltn12 = pcall(require, "ltn12")
if not ltn12_ok then -- If not using LuaSocket and/or LuaSec...
@@ -155,25 +159,28 @@ function Api:request(url, params, post_params)
if cfg.connection_timeout and cfg.connection_timeout > 0 then
curl_cmd = curl_cmd .. "--connect-timeout "..tonumber(cfg.connection_timeout).." "
end
- ok = fs.execute_string(curl_cmd..fs.Q(url).." -o "..fs.Q(tmpfile))
+ local ok = fs.execute_string(curl_cmd..fs.Q(url).." -o "..fs.Q(tmpfile))
+ if not ok then
+ return nil, "API failure: " .. redact_api_url(url)
+ end
else
local ok, err = fs.download(url, tmpfile)
if not ok then
- return nil, "API failure: " .. tostring(err) .. " - " .. tostring(url)
+ return nil, "API failure: " .. tostring(err) .. " - " .. redact_api_url(url)
end
end
local tmpfd = io.open(tmpfile)
if not tmpfd then
os.remove(tmpfile)
- return nil, "API failure reading temporary file - " .. tostring(url)
+ return nil, "API failure reading temporary file - " .. redact_api_url(url)
end
out = tmpfd:read("*a")
tmpfd:close()
os.remove(tmpfile)
if self.debug then
- util.printout("[" .. tostring(method) .. " via curl] " .. tostring(url) .. " ... ")
+ util.printout("[" .. tostring(method) .. " via curl] " .. redact_api_url(url) .. " ... ")
end
return json.decode(out)
@@ -226,7 +233,7 @@ function Api:request(url, params, post_params)
end
local method = post_params and "POST" or "GET"
if self.debug then
- util.printout("[" .. tostring(method) .. " via "..via.."] " .. tostring(url) .. " ... ")
+ util.printout("[" .. tostring(method) .. " via "..via.."] " .. redact_api_url(url) .. " ... ")
end
local out = {}
local _, status = http.request({
@@ -240,14 +247,14 @@ function Api:request(url, params, post_params)
util.printout(tostring(status))
end
if status ~= 200 then
- return nil, "API returned " .. tostring(status) .. " - " .. tostring(url)
+ return nil, "API returned " .. tostring(status) .. " - " .. redact_api_url(url)
end
return json.decode(table.concat(out))
end
end
-function api.new(flags, name)
+function api.new(flags)
local self = {}
setmetatable(self, { __index = Api })
self.config = self:load_config() or {}
diff --git a/luarocks/src/luarocks/upload/multipart.lua b/luarocks/src/luarocks/upload/multipart.lua
index 5677657..aad2e43 100644
--- a/luarocks/src/luarocks/upload/multipart.lua
+++ b/luarocks/src/luarocks/upload/multipart.lua
@@ -19,15 +19,14 @@ function File:mime()
local mimetypes_ok, mimetypes = pcall(require, "mimetypes")
if mimetypes_ok then
self.mimetype = mimetypes.guess(self.fname)
- else
- self.mimetype = "application/octet-stream"
end
+ self.mimetype = self.mimetype or "application/octet-stream"
end
return self.mimetype
end
function File:content()
- local fd = io.open(self.fname)
+ local fd = io.open(self.fname, "rb")
if not fd then
return nil, "Failed to open file: "..self.fname
end
diff --git a/luarocks/src/luarocks/util.lua b/luarocks/src/luarocks/util.lua
index 8772883..c06c835 100644
--- a/luarocks/src/luarocks/util.lua
+++ b/luarocks/src/luarocks/util.lua
@@ -63,6 +63,76 @@ function util.matchquote(s)
return (s:gsub("[?%-+*%[%].%%()$^]","%%%1"))
end
+--- List of supported arguments.
+-- Arguments that take no parameters are marked with the boolean true.
+-- Arguments that take a parameter are marked with a descriptive string.
+-- Arguments that may take an empty string are described in quotes,
+-- (as in the value for --detailed="<text>").
+-- For all other string values, it means the parameter is mandatory.
+local supported_flags = {
+ ["all"] = true,
+ ["api-key"] = "<key>",
+ ["append"] = true,
+ ["arch"] = "<arch>",
+ ["bin"] = true,
+ ["binary"] = true,
+ ["branch"] = "<branch-name>",
+ ["debug"] = true,
+ ["deps"] = true,
+ ["deps-mode"] = "<mode>",
+ ["detailed"] = "\"<text>\"",
+ ["force"] = true,
+ ["from"] = "<server>",
+ ["help"] = true,
+ ["home"] = true,
+ ["homepage"] = "\"<url>\"",
+ ["keep"] = true,
+ ["lib"] = "<library>",
+ ["license"] = "\"<text>\"",
+ ["list"] = true,
+ ["local"] = true,
+ ["local-tree"] = true,
+ ["lr-bin"] = true,
+ ["lr-cpath"] = true,
+ ["lr-path"] = true,
+ ["lua-version"] = "<vers>",
+ ["lua-ver"] = true,
+ ["lua-incdir"] = true,
+ ["lua-libdir"] = true,
+ ["modules"] = true,
+ ["mversion"] = true,
+ ["no-refresh"] = true,
+ ["nodeps"] = true,
+ ["old-versions"] = true,
+ ["only-deps"] = true,
+ ["only-from"] = "<server>",
+ ["only-server"] = "<server>",
+ ["only-sources"] = "<url>",
+ ["only-sources-from"] = "<url>",
+ ["outdated"] = true,
+ ["output"] = "<file>",
+ ["pack-binary-rock"] = true,
+ ["porcelain"] = true,
+ ["quick"] = true,
+ ["rock-dir"] = true,
+ ["rock-tree"] = true,
+ ["rock-trees"] = true,
+ ["rockspec"] = true,
+ ["rockspec-format"] = "<ver>",
+ ["server"] = "<server>",
+ ["skip-pack"] = true,
+ ["source"] = true,
+ ["summary"] = "\"<text>\"",
+ ["system-config"] = true,
+ ["tag"] = "<tag>",
+ ["timeout"] = "<seconds>",
+ ["to"] = "<path>",
+ ["tree"] = "<path>",
+ ["user-config"] = true,
+ ["verbose"] = true,
+ ["version"] = true,
+}
+
--- Extract flags from an arguments list.
-- Given string arguments, extract flag arguments into a flags set.
-- For example, given "foo", "--tux=beep", "--bla", "bar", "--baz",
@@ -71,19 +141,59 @@ end
function util.parse_flags(...)
local args = {...}
local flags = {}
- for i = #args, 1, -1 do
+ local i = 1
+ local out = {}
+ local ignore_flags = false
+ while i <= #args do
local flag = args[i]:match("^%-%-(.*)")
- if flag then
+ if flag == "--" then
+ ignore_flags = true
+ end
+ if flag and not ignore_flags then
local var,val = flag:match("([a-z_%-]*)=(.*)")
if val then
- flags[var] = val
+ local vartype = supported_flags[var]
+ if type(vartype) == "string" then
+ if val == "" and vartype:sub(1,1) ~= '"' then
+ return { ERROR = "Invalid argument: parameter to flag --"..var.."="..vartype.." cannot be empty." }
+ end
+ flags[var] = val
+ else
+ if vartype then
+ return { ERROR = "Invalid argument: flag --"..var.." does not take an parameter." }
+ else
+ return { ERROR = "Invalid argument: unknown flag --"..var.."." }
+ end
+ end
else
- flags[flag] = true
+ local var = flag
+ local vartype = supported_flags[var]
+ if type(vartype) == "string" then
+ i = i + 1
+ local val = args[i]
+ if not val then
+ return { ERROR = "Invalid argument: flag --"..var.."="..vartype.." expects a parameter." }
+ end
+ if val:match("^%-%-.*") then
+ return { ERROR = "Invalid argument: flag --"..var.."="..vartype.." expects a parameter (if you really want to pass "..val.." as an argument to --"..var..", use --"..var.."="..val..")." }
+ else
+ if val == "" and vartype:sub(1,1) ~= '"' then
+ return { ERROR = "Invalid argument: parameter to flag --"..var.."="..vartype.." cannot be empty." }
+ end
+ flags[var] = val
+ end
+ elseif vartype == true then
+ flags[var] = true
+ else
+ return { ERROR = "Invalid argument: unknown flag --"..var.."." }
+ end
end
- table.remove(args, i)
+ else
+ table.insert(out, args[i])
end
+ i = i + 1
end
- return flags, unpack(args)
+ return flags, unpack(out)
end
--- Build a sequence of flags for forwarding from one command to
@@ -177,7 +287,7 @@ local var_format_pattern = "%$%((%a[%a%d_]+)%)"
-- the original table (ie, does not copy recursively).
-- @param tbl table: the input table
-- @return table: a new table with the same contents.
-local function make_shallow_copy(tbl)
+function util.make_shallow_copy(tbl)
local copy = {}
for k,v in pairs(tbl) do
copy[k] = v
@@ -196,7 +306,7 @@ end
-- needed variables.
-- @param msg string: the warning message to display.
function util.warn_if_not_used(var_defs, needed_set, msg)
- needed_set = make_shallow_copy(needed_set)
+ needed_set = util.make_shallow_copy(needed_set)
for _, val in pairs(var_defs) do
for used in val:gmatch(var_format_pattern) do
needed_set[used] = nil
diff --git a/luarocks/src/luarocks/write_rockspec.lua b/luarocks/src/luarocks/write_rockspec.lua
index 403cbc8..972562c 100644
--- a/luarocks/src/luarocks/write_rockspec.lua
+++ b/luarocks/src/luarocks/write_rockspec.lua
@@ -24,18 +24,19 @@ If a repository URL is given with no version, it creates an 'scm' rock.
Note that the generated file is a _starting point_ for writing a
rockspec, and is not guaranteed to be complete or correct.
---output=<file> Write the rockspec with the given filename.
- If not given, a file is written in the current
- directory with a filename based on given name and version.
---license="<string>" A license string, such as "MIT/X11" or "GNU GPL v3".
---summary="<txt>" A short one-line description summary.
---detailed="<txt>" A longer description string.
---homepage=<url> Project homepage.
---lua-version=<ver> Supported Lua versions. Accepted values are "5.1", "5.2",
- "5.3", "5.1,5.2", "5.2,5.3", or "5.1,5.2,5.3".
---tag=<tag> Tag to use. Will attempt to extract version number from it.
---lib=<lib>[,<lib>] A comma-separated list of libraries that C files need to
- link to.
+--output=<file> Write the rockspec with the given filename.
+ If not given, a file is written in the current
+ directory with a filename based on given name and version.
+--license="<string>" A license string, such as "MIT/X11" or "GNU GPL v3".
+--summary="<txt>" A short one-line description summary.
+--detailed="<txt>" A longer description string.
+--homepage=<url> Project homepage.
+--lua-version=<ver> Supported Lua versions. Accepted values are "5.1", "5.2",
+ "5.3", "5.1,5.2", "5.2,5.3", or "5.1,5.2,5.3".
+--rockspec-format=<ver> Rockspec format version, such as "1.0" or "1.1".
+--tag=<tag> Tag to use. Will attempt to extract version number from it.
+--lib=<lib>[,<lib>] A comma-separated list of libraries that C files need to
+ link to.
]]
local function open_file(name)
@@ -76,25 +77,24 @@ local function configure_lua_version(rockspec, luaver)
end
end
-local function detect_description(rockspec)
+local function detect_description()
local fd = open_file("README.md") or open_file("README")
if not fd then return end
local data = fd:read("*a")
fd:close()
local paragraph = data:match("\n\n([^%[].-)\n\n")
if not paragraph then paragraph = data:match("\n\n(.*)") end
+ local summary, detailed
if paragraph then
+ detailed = paragraph
+
if #paragraph < 80 then
- rockspec.description.summary = paragraph:gsub("\n", "")
- rockspec.description.detailed = paragraph
+ summary = paragraph:gsub("\n", "")
else
- local summary = paragraph:gsub("\n", " "):match("([^.]*%.) ")
- if summary then
- rockspec.description.summary = summary:gsub("\n", "")
- end
- rockspec.description.detailed = paragraph
+ summary = paragraph:gsub("\n", " "):match("([^.]*%.) ")
end
end
+ return summary, detailed
end
local function detect_mit_license(data)
@@ -209,17 +209,13 @@ function write_rockspec.run(...)
elseif not url_or_dir then
url_or_dir = version
end
-
- if flags["tag"] == true then
- return nil, "Incorrect usage: --tag requires an argument. "..util.see_help("write_rockspec")
- end
if flags["tag"] then
if not version then
version = flags["tag"]:gsub("^v", "")
end
end
-
+
local protocol, pathname = dir.split_url(url_or_dir)
if not fetch.is_basic_protocol(protocol) then
if not name then
@@ -251,6 +247,7 @@ function write_rockspec.run(...)
end
local rockspec = {
+ rockspec_format = flags["rockspec-format"],
package = name,
name = name:lower(),
version = version.."-1",
@@ -316,7 +313,11 @@ function write_rockspec.run(...)
local ok, err = fs.change_dir(local_dir)
if not ok then return nil, "Failed reaching files from project - error entering directory "..local_dir end
- detect_description(rockspec)
+ if (not flags["summary"]) or (not flags["detailed"]) then
+ local summary, detailed = detect_description()
+ rockspec.description.summary = flags["summary"] or summary
+ rockspec.description.detailed = flags["detailed"] or detailed
+ end
local is_mit = show_license(rockspec)
diff --git a/luarocks/test/testfiles/invalid_patch-0.1-1.rockspec b/luarocks/test/testfiles/invalid_patch-0.1-1.rockspec
new file mode 100644
index 0000000..c2ecd16
--- /dev/null
+++ b/luarocks/test/testfiles/invalid_patch-0.1-1.rockspec
@@ -0,0 +1,29 @@
+package = "invalid_patch"
+version = "0.1-1"
+source = {
+ -- any valid URL
+ url = "https://raw.github.com/keplerproject/luarocks/master/src/luarocks/build.lua"
+}
+description = {
+ summary = "A rockspec with an invalid patch",
+}
+dependencies = {
+ "lua >= 5.1"
+}
+build = {
+ type = "builtin",
+ modules = {
+ build = "build.lua"
+ },
+ patches = {
+ ["I_am_an_invalid_patch.patch"] =
+[[
+diff -Naur luadoc-3.0.1/src/luadoc/doclet/html.lua luadoc-3.0.1-new/src/luadoc/doclet/html.lua
+--- luadoc-3.0.1/src/luadoc/doclet/html.lua2007-12-21 15:50:48.000000000 -0200
++++ luadoc-3.0.1-new/src/luadoc/doclet/html.lua2008-02-28 01:59:53.000000000 -0300
+@@ -18,6 +18,7 @@
+- gabba gabba gabba
++ gobo gobo gobo
+]]
+ }
+}
diff --git a/luarocks/test/testfiles/no_build_table-0.1-1.rockspec b/luarocks/test/testfiles/no_build_table-0.1-1.rockspec
new file mode 100644
index 0000000..5d79e9a
--- /dev/null
+++ b/luarocks/test/testfiles/no_build_table-0.1-1.rockspec
@@ -0,0 +1,12 @@
+package = "no_build_table"
+version = "0.1-1"
+source = {
+ -- any valid URL
+ url = "https://raw.github.com/keplerproject/luarocks/master/src/luarocks/build.lua"
+}
+description = {
+ summary = "A rockspec with no build field",
+}
+dependencies = {
+ "lua >= 5.1"
+}
diff --git a/luarocks/test/testfiles/not_a_zipfile-1.0-1.src.rock b/luarocks/test/testfiles/not_a_zipfile-1.0-1.src.rock
new file mode 100644
index 0000000..e36f8bb
--- /dev/null
+++ b/luarocks/test/testfiles/not_a_zipfile-1.0-1.src.rock
@@ -0,0 +1 @@
+I am not a .zip file!
diff --git a/luarocks/test/testfiles/type_mismatch_string-1.0-1.rockspec b/luarocks/test/testfiles/type_mismatch_string-1.0-1.rockspec
new file mode 100644
index 0000000..7a607cf
--- /dev/null
+++ b/luarocks/test/testfiles/type_mismatch_string-1.0-1.rockspec
@@ -0,0 +1,4 @@
+
+package="type_mismatch_version"
+version=1.0
+
diff --git a/luarocks/test/testfiles/type_mismatch_table-1.0-1.rockspec b/luarocks/test/testfiles/type_mismatch_table-1.0-1.rockspec
new file mode 100644
index 0000000..f348b79
--- /dev/null
+++ b/luarocks/test/testfiles/type_mismatch_table-1.0-1.rockspec
@@ -0,0 +1,5 @@
+
+package="type_mismatch_table"
+version="1.0-1"
+
+source = "not a table"
diff --git a/luarocks/test/testfiles/type_mismatch_version-1.0-1.rockspec b/luarocks/test/testfiles/type_mismatch_version-1.0-1.rockspec
new file mode 100644
index 0000000..5e30dae
--- /dev/null
+++ b/luarocks/test/testfiles/type_mismatch_version-1.0-1.rockspec
@@ -0,0 +1,4 @@
+
+package="type_mismatch_version"
+version="1.0"
+
diff --git a/luarocks/test/testing.bat b/luarocks/test/testing.bat
new file mode 100644
index 0000000..319e12c
--- /dev/null
+++ b/luarocks/test/testing.bat
@@ -0,0 +1,9 @@
+@echo off
+Setlocal EnableDelayedExpansion EnableExtensions
+
+if not defined LUAROCKS_REPO set LUAROCKS_REPO=http://rocks.moonscript.org
+
+appveyor DownloadFile %LUAROCKS_REPO%/stdlib-41.0.0-1.src.rock
+luarocks build stdlib
+
+endlocal
diff --git a/luarocks/test/testing.lua b/luarocks/test/testing.lua
new file mode 100644
index 0000000..63dead2
--- /dev/null
+++ b/luarocks/test/testing.lua
@@ -0,0 +1,457 @@
+
+local variables = {}
+
+-- Expand variables in the format $foo or ${foo} according
+-- to the variables table.
+local function expand_variables(str)
+ return str:gsub("%$({?)([A-Za-z0-9_]+)(}?)", function(o, v, c)
+ return #o <= #c and (variables[v] or "") .. (#o < #c and c or "")
+ end)
+end
+
+-- @param cmd command to run
+-- @param envtable optional table of temporary environment variables
+local function run(cmd, envtable)
+ cmd = expand_variables(cmd)
+ local env = {}
+ for var, val in pairs(envtable) do
+ table.insert(env, var.."='"..expand_variables(val).."' ")
+ end
+ local code = os.execute(table.concat(env)..cmd)
+ return (code == 0 or code == true)
+end
+
+local function cd_run(dir, cmd, envtable)
+ return run("cd "..dir.." && "..cmd, envtable)
+end
+
+local function run_get_contents(cmd)
+end
+
+local function mkdir(dirname)
+ cmd = expand_variables(dirname)
+ -- TODO
+end
+
+local function rm_rf(...)
+ -- TODO
+end
+
+local function mv(src, dst)
+ -- TODO
+end
+
+local function exists(filename)
+ filename = expand_variables(filename)
+ -- TODO
+end
+
+local function glob(patt)
+ -- TODO
+end
+
+local function touch(filename)
+ -- TODO
+end
+
+local function rm(...)
+ for _, filename in ipairs {...} do
+ filename = expand_variables(filename)
+ -- TODO
+ end
+ return true
+end
+
+local function file_set_contents(filename, contents)
+ filename = expand_variables(filename)
+
+ local fd, err = io.open(filename, "w")
+ if not fd then return nil, err end
+ fd:write(contents)
+ fd:close()
+ return true
+end
+
+local function need_luasocket()
+ -- TODO
+end
+
+local tests = {
+
+ test_version = function() return run "$luarocks --version" end,
+ fail_unknown_command = function() return run "$luarocks unknown_command" end,
+ fail_arg_boolean_parameter = function() return run "$luarocks --porcelain=invalid" end,
+ fail_arg_boolean_unknown = function() return run "$luarocks --invalid-flag" end,
+ fail_arg_string_no_parameter = function() return run "$luarocks --server" end,
+ fail_arg_string_followed_by_flag = function() return run "$luarocks --server --porcelain" end,
+ fail_arg_string_unknown = function() return run "$luarocks --invalid-flag=abc" end,
+ test_empty_list = function() return run "$luarocks list" end,
+ fail_sysconfig_err = function()
+ mkdir "$testing_lrprefix/etc/luarocks"
+ file_set_contents("$testing_lrprefix/etc/luarocks/config.lua", "aoeui")
+ return run "$luarocks list"
+ and rm "$testing_lrprefix/etc/luarocks/config.lua"
+ end,
+ fail_sysconfig_default_err = function()
+ mkdir "$testing_lrprefix/etc/luarocks"
+ file_set_contents("$testing_lrprefix/etc/luarocks/config-$luashortversion.lua", "aoeui")
+ return run "$luarocks list"
+ and rm "$testing_lrprefix/etc/luarocks/config-$luashortversion.lua"
+ end,
+ fail_build_noarg = function() return run "$luarocks build" end,
+ fail_download_noarg = function() return run "$luarocks download" end,
+ fail_install_noarg = function() return run "$luarocks install" end,
+ fail_lint_noarg = function() return run "$luarocks lint" end,
+ fail_search_noarg = function() return run "$luarocks search" end,
+ fail_show_noarg = function() return run "$luarocks show" end,
+ fail_unpack_noarg = function() return run "$luarocks unpack" end,
+ fail_upload_noarg = function() return run "$luarocks upload" end,
+ fail_remove_noarg = function() return run "$luarocks remove" end,
+ fail_doc_noarg = function() return run "$luarocks doc" end,
+ fail_new_version_noarg = function() return run "$luarocks new_version" end,
+ fail_write_rockspec_noarg = function() return run "$luarocks write_rockspec" end,
+ fail_build_invalid = function() return run "$luarocks build invalid" end,
+ fail_download_invalid = function() return run "$luarocks download invalid" end,
+ fail_install_invalid = function() return run "$luarocks install invalid" end,
+ fail_lint_invalid = function() return run "$luarocks lint invalid" end,
+ fail_show_invalid = function() return run "$luarocks show invalid" end,
+ fail_new_version_invalid = function() return run "$luarocks new_version invalid" end,
+ test_list_invalidtree = function() return run "$luarocks --tree=/some/invalid/tree list" end,
+ fail_inexistent_dir = function()
+ -- Unix only?
+ return run "mkdir idontexist; cd idontexist; rmdir ../idontexist; $luarocks; err=$?; cd ..; return $err"
+ end,
+ fail_make_norockspec = function() return run "$luarocks make" end,
+ fail_build_permissions = function() return run "$luarocks build --tree=/usr lpeg" end,
+ fail_build_permissions_parent = function() return run "$luarocks build --tree=/usr/invalid lpeg" end,
+ test_build_verbose = function() return run "$luarocks build --verbose lpeg" end,
+ fail_build_blank_arg = function() return run "$luarocks build --tree="" lpeg" end,
+ test_build_withpatch = function() need_luasocket(); return run "$luarocks build luadoc" end,
+ test_build_diffversion = function() return run "$luarocks build luacov ${version_luacov}" end,
+ test_build_command = function() return run "$luarocks build stdlib" end,
+ test_build_install_bin = function() return run "$luarocks build luarepl" end,
+ test_build_nohttps = function()
+ need_luasocket()
+ return run "$luarocks download --rockspec validate-args ${verrev_validate_args}"
+ and run "$luarocks build ./validate-args-${version_validate_args}-1.rockspec"
+ and rm "./validate-args-${version_validate_args}-1.rockspec"
+ end,
+ test_build_https = function()
+ need_luasocket()
+ return run "$luarocks download --rockspec validate-args ${verrev_validate_args}"
+ and run "$luarocks install luasec"
+ and run "$luarocks build ./validate-args-${verrev_validate_args}.rockspec"
+ and rm "./validate-args-${verrev_validate_args}.rockspec"
+ end,
+ test_build_supported_platforms = function() return run "$luarocks build lpty" end,
+ test_build_only_deps_rockspec = function()
+ return run "$luarocks download --rockspec lxsh ${verrev_lxsh}"
+ and run "$luarocks build ./lxsh-${verrev_lxsh}.rockspec --only-deps"
+ and (not run "$luarocks show lxsh")
+ end,
+ test_build_only_deps_src_rock = function()
+ return run "$luarocks download --source lxsh ${verrev_lxsh}"
+ and run "$luarocks build ./lxsh-${verrev_lxsh}.src.rock --only-deps"
+ and (not run "$luarocks show lxsh")
+ end,
+ test_build_only_deps = function() return run "$luarocks build luasec --only-deps" and (not run "$luarocks show luasec") end,
+ test_install_only_deps = function() return run "$luarocks install lxsh ${verrev_lxsh} --only-deps" and (not run "$luarocks show lxsh") end,
+ fail_build_missing_external = function() return run '$luarocks build "$testing_dir/testfiles/missing_external-0.1-1.rockspec" INEXISTENT_INCDIR="/invalid/dir"' end,
+ fail_build_invalidpatch = function()
+ need_luasocket()
+ return run '$luarocks build "$testing_dir/testfiles/invalid_patch-0.1-1.rockspec"'
+ end,
+ test_build_deps_partial_match = function() return run "$luarocks build lmathx" end,
+ test_build_show_downloads = function()
+ return run("$luarocks build alien", { LUAROCKS_CONFIG="$testing_dir/testing_config_show_downloads.lua" })
+ end,
+ test_download_all = function()
+ return run "$luarocks download --all validate-args"
+ and rm(glob("validate-args-*"))
+ end,
+ test_download_rockspecversion = function()
+ return run "$luarocks download --rockspec validate-args ${verrev_validate_args}"
+ and rm(glob("validate-args-*"))
+ end,
+ test_help = function() return run "$luarocks help" end,
+ fail_help_invalid = function() return run "$luarocks help invalid" end,
+ test_install_binaryrock = function()
+ return run "$luarocks build --pack-binary-rock cprint"
+ and run "$luarocks install ./cprint-${verrev_cprint}.${platform}.rock"
+ and rm "./cprint-${verrev_cprint}.${platform}.rock"
+ end,
+ test_install_with_bin = function() return run "$luarocks install wsapi" end,
+ fail_install_notazipfile = function() return run '$luarocks install "$testing_dir/testfiles/not_a_zipfile-1.0-1.src.rock"' end,
+ fail_install_invalidpatch = function()
+ need_luasocket()
+ return run '$luarocks install "$testing_dir/testfiles/invalid_patch-0.1-1.rockspec"'
+ end,
+ fail_install_invalid_filename = function() return run '$luarocks install "invalid.rock"' end,
+ fail_install_invalid_arch = function() return run '$luarocks install "foo-1.0-1.impossible-x86.rock"' end,
+ test_install_reinstall = function()
+ return run '$luarocks install "$testing_cache/luasocket-$verrev_luasocket.$platform.rock"'
+ and run '$luarocks install --deps-mode=none "$testing_cache/luasocket-$verrev_luasocket.$platform.rock"'
+ end,
+ fail_local_root = function() return run("$luarocks install --local luasocket", { USER="root" }) end,
+ test_site_config = function()
+ mv("../src/luarocks/site_config.lua", "../src/luarocks/site_config.lua.tmp")
+ local ok = run "$luarocks"
+ mv("../src/luarocks/site_config.lua.tmp", "../src/luarocks/site_config.lua")
+ return ok
+ end,
+ test_lint_ok = function()
+ return run "$luarocks download --rockspec validate-args ${verrev_validate_args}"
+ and run "$luarocks lint ./validate-args-${verrev_validate_args}.rockspec"
+ and rm "./validate-args-${verrev_validate_args}.rockspec"
+ end,
+ fail_lint_type_mismatch_string = function() return run '$luarocks lint "$testing_dir/testfiles/type_mismatch_string-1.0-1.rockspec"' end,
+ fail_lint_type_mismatch_version = function() return run '$luarocks lint "$testing_dir/testfiles/type_mismatch_version-1.0-1.rockspec"' end,
+ fail_lint_type_mismatch_table = function() return run '$luarocks lint "$testing_dir/testfiles/type_mismatch_table-1.0-1.rockspec"' end,
+ fail_lint_no_build_table = function() return run '$luarocks lint "$testing_dir/testfiles/no_build_table-0.1-1.rockspec"' end,
+ test_list = function() return run "$luarocks list" end,
+ test_list_porcelain = function() return run "$luarocks list --porcelain" end,
+ test_make_with_rockspec = function()
+ return rm_rf "./luasocket-${verrev_luasocket}"
+ and run "$luarocks download --source luasocket"
+ and run "$luarocks unpack ./luasocket-${verrev_luasocket}.src.rock"
+ and cd_run("luasocket-${verrev_luasocket}/${srcdir_luasocket}", "$luarocks make luasocket-${verrev_luasocket}.rockspec")
+ and rm_rf "./luasocket-${verrev_luasocket}"
+ end,
+ test_make_default_rockspec = function()
+ return rm_rf "./lxsh-${verrev_lxsh}"
+ and run "$luarocks download --source lxsh ${verrev_lxsh}"
+ and run "$luarocks unpack ./lxsh-${verrev_lxsh}.src.rock"
+ and cd_run("lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1", "$luarocks make")
+ and rm_rf "./lxsh-${verrev_lxsh}"
+ end,
+ test_make_pack_binary_rock = function()
+ return rm_rf "./lxsh-${verrev_lxsh}"
+ and run "$luarocks download --source lxsh ${verrev_lxsh}"
+ and run "$luarocks unpack ./lxsh-${verrev_lxsh}.src.rock"
+ and cd_run("lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1", "$luarocks make --deps-mode=none --pack-binary-rock")
+ and exists "lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1/lxsh-${verrev_lxsh}.all.rock"
+ and rm_rf "./lxsh-${verrev_lxsh}"
+ end,
+ fail_make_which_rockspec = function()
+ rm_rf "./luasocket-${verrev_luasocket}"
+ run "$luarocks download --source luasocket"
+ run "$luarocks unpack ./luasocket-${verrev_luasocket}.src.rock"
+ local ok = cd_run("luasocket-${verrev_luasocket}/${srcdir_luasocket}", "$luarocks make")
+ rm_rf "./luasocket-${verrev_luasocket}"
+ return ok
+ end,
+ test_new_version = function()
+ return run "$luarocks download --rockspec luacov ${version_luacov}"
+ and run "$luarocks new_version ./luacov-${version_luacov}-1.rockspec 0.2"
+ and rm(glob("./luacov-0.*"))
+ end,
+ test_new_version_url = function()
+ return run "$luarocks download --rockspec abelhas 1.0"
+ and run "$luarocks new_version ./abelhas-1.0-1.rockspec 1.1 https://github.com/downloads/ittner/abelhas/abelhas-1.1.tar.gz"
+ and rm(glob("./abelhas-*"))
+ end,
+ test_pack = function()
+ return run "$luarocks list"
+ and run "$luarocks pack luacov"
+ and rm(glob("./luacov-*.rock"))
+ end,
+ test_pack_src = function()
+ return run "$luarocks install luasec"
+ and run "$luarocks download --rockspec luasocket"
+ and run "$luarocks pack ./luasocket-${verrev_luasocket}.rockspec"
+ and rm(glob("./luasocket-${version_luasocket}-*.rock"))
+ end,
+ test_path = function() return run "$luarocks path --bin" end,
+ test_path_lr_path = function() return run "$luarocks path --lr-path" end,
+ test_path_lr_cpath = function() return run "$luarocks path --lr-cpath" end,
+ test_path_lr_bin = function() return run "$luarocks path --lr-bin" end,
+ fail_purge_missing_tree = function() return run '$luarocks purge --tree="$testing_tree"' end,
+ test_purge = function() return run '$luarocks purge --tree="$testing_sys_tree"' end,
+ test_remove = function()
+ return run "$luarocks build abelhas ${version_abelhas}"
+ and run "$luarocks remove abelhas ${version_abelhas}"
+ end,
+ test_remove_force = function()
+ need_luasocket()
+ return run "$luarocks build lualogging"
+ and run "$luarocks remove --force luasocket"
+ end,
+ fail_remove_deps = function()
+ need_luasocket()
+ return run "$luarocks build lualogging"
+ and run "$luarocks remove luasocket"
+ end,
+ fail_remove_missing = function() return run "$luarocks remove missing_rock" end,
+ fail_remove_invalid_name = function() return run "$luarocks remove invalid.rock" end,
+ test_search_found = function() return run "$luarocks search zlib" end,
+ test_search_missing = function() return run "$luarocks search missing_rock" end,
+ test_show = function() return run "$luarocks show luacov" end,
+ test_show_modules = function() return run "$luarocks show --modules luacov" end,
+ test_show_home = function() return run "$luarocks show --home luacov" end,
+ test_show_depends = function()
+ need_luasocket()
+ return run "$luarocks install luasec"
+ and run "$luarocks show luasec"
+ end,
+ test_show_oldversion = function()
+ return run "$luarocks install luacov ${version_luacov}"
+ and run "$luarocks show luacov ${version_luacov}"
+ end,
+ test_unpack_download = function()
+ return rm_rf "./cprint-${verrev_cprint}"
+ and run "$luarocks unpack cprint"
+ and rm_rf "./cprint-${verrev_cprint}"
+ end,
+ test_unpack_src = function()
+ return rm_rf "./cprint-${verrev_cprint}"
+ and run "$luarocks download --source cprint"
+ and run "$luarocks unpack ./cprint-${verrev_cprint}.src.rock"
+ and rm_rf "./cprint-${verrev_cprint}"
+ end,
+ test_unpack_rockspec = function()
+ return rm_rf "./cprint-${verrev_cprint}"
+ and run "$luarocks download --rockspec cprint"
+ and run "$luarocks unpack ./cprint-${verrev_cprint}.rockspec"
+ and rm_rf "./cprint-${verrev_cprint}"
+ end,
+ test_unpack_binary = function()
+ return rm_rf "./cprint-${verrev_cprint}"
+ and run "$luarocks build cprint"
+ and run "$luarocks pack cprint"
+ and run "$luarocks unpack ./cprint-${verrev_cprint}.${platform}.rock"
+ and rm_rf "./cprint-${verrev_cprint}"
+ end,
+ fail_unpack_invalidpatch = function()
+ need_luasocket()
+ return run '$luarocks unpack "$testing_dir/testfiles/invalid_patch-0.1-1.rockspec"'
+ end,
+ fail_unpack_invalidrockspec = function()
+ need_luasocket()
+ return run '$luarocks unpack "invalid.rockspec"'
+ end,
+ fail_upload_invalidrockspec = function() return run '$luarocks upload "invalid.rockspec"' end,
+ fail_upload_invalidkey = function() return run '$luarocks upload --api-key="invalid" "invalid.rockspec"' end,
+ test_admin_help = function() return run "$luarocks_admin help" end,
+ test_admin_make_manifest = function() return run "$luarocks_admin make_manifest" end,
+ test_admin_add_rsync = function() return run '$luarocks_admin --server=testing add "$testing_server/luasocket-${verrev_luasocket}.src.rock"' end,
+ test_admin_add_sftp = function()
+ return run("$luarocks_admin --server=testing add ./luasocket-${verrev_luasocket}.src.rock", { LUAROCKS_CONFIG="$testing_dir/testing_config_sftp.lua" })
+ end,
+ fail_admin_add_missing = function() return run "$luarocks_admin --server=testing add" end,
+ fail_admin_invalidserver = function() return run '$luarocks_admin --server=invalid add "$testing_server/luasocket-${verrev_luasocket}.src.rock"' end,
+ fail_admin_invalidrock = function() return run "$luarocks_admin --server=testing add invalid" end,
+ test_admin_refresh_cache = function() return run "$luarocks_admin --server=testing refresh_cache" end,
+ test_admin_remove = function() return run "$luarocks_admin --server=testing remove luasocket-${verrev_luasocket}.src.rock" end,
+ fail_admin_remove_missing = function() return run "$luarocks_admin --server=testing remove" end,
+ fail_deps_mode_invalid_arg = function() return run "$luarocks remove luacov --deps-mode" end,
+
+ test_deps_mode_one = function()
+ return run '$luarocks build --tree="system" lpeg'
+ and run '$luarocks list'
+ and run '$luarocks build --deps-mode=one --tree="$testing_tree" lxsh'
+ and run_get_contents '$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg' ~= ""
+ end,
+ test_deps_mode_order = function()
+ return run '$luarocks build --tree="system" lpeg'
+ and run '$luarocks build --deps-mode=order --tree="$testing_tree" lxsh'
+ and run '$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg'
+ and run_get_contents '$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg' == ""
+ end,
+ test_deps_mode_order_sys = function()
+ return run '$luarocks build --tree="$testing_tree" lpeg'
+ and run '$luarocks build --deps-mode=order --tree="$testing_sys_tree" lxsh'
+ and run_get_contents '$luarocks_noecho list --tree="$testing_sys_tree" --porcelain lpeg' ~= ""
+ end,
+ test_deps_mode_all_sys = function()
+ return run '$luarocks build --tree="$testing_tree" lpeg'
+ and run '$luarocks build --deps-mode=all --tree="$testing_sys_tree" lxsh'
+ and run_get_contents '$luarocks_noecho list --tree="$testing_sys_tree" --porcelain lpeg' == ""
+ end,
+
+ test_deps_mode_none = function()
+ return run '$luarocks build --tree="$testing_tree" --deps-mode=none lxsh'
+ and run_get_contents '$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg' == ""
+ end,
+ test_deps_mode_nodeps_alias = function()
+ return run '$luarocks build --tree="$testing_tree" --nodeps lxsh'
+ and run_get_contents '$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg' == ""
+ end,
+ test_deps_mode_make_order = function()
+ local ok = run '$luarocks build --tree="$testing_sys_tree" lpeg'
+ and rm_rf "./lxsh-${verrev_lxsh}"
+ and run "$luarocks download --source lxsh ${verrev_lxsh}"
+ and run "$luarocks unpack ./lxsh-${verrev_lxsh}.src.rock"
+ and cd_run("lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1", '$luarocks make --tree="$testing_tree" --deps-mode=order')
+ if not ok then
+ return false
+ end
+ local found = run_get_contents '$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg'
+ rm_rf "./lxsh-${verrev_lxsh}"
+ return found == ""
+ end,
+ test_deps_mode_make_order_sys = function()
+ local ok = run '$luarocks build --tree="$testing_tree" lpeg'
+ and rm_rf "./lxsh-${verrev_lxsh}"
+ and run "$luarocks download --source lxsh ${verrev_lxsh}"
+ and run "$luarocks unpack ./lxsh-${verrev_lxsh}.src.rock"
+ and cd_run("lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1", '$luarocks make --tree="$testing_sys_tree" --deps-mode=order')
+ if not ok then
+ return false
+ end
+ local found = run_get_contents '$luarocks_noecho list --tree="$testing_sys_tree" --porcelain lpeg'
+ rm_rf "./lxsh-${verrev_lxsh}"
+ return found ~= ""
+ end,
+ test_write_rockspec = function() return run "$luarocks write_rockspec git://github.com/keplerproject/luarocks" end,
+ test_write_rockspec_lib = function() return run '$luarocks write_rockspec git://github.com/mbalmer/luafcgi --lib=fcgi --license="3-clause BSD" --lua-version=5.1,5.2' end,
+ test_write_rockspec_format = function() return run '$luarocks write_rockspec git://github.com/keplerproject/luarocks --rockspec-format=1.1 --lua-version=5.1,5.2' end,
+ test_write_rockspec_fullargs = function() return run '$luarocks write_rockspec git://github.com/keplerproject/luarocks --lua-version=5.1,5.2 --license="MIT/X11" --homepage="http://www.luarocks.org" --summary="A package manager for Lua modules"' end,
+ fail_write_rockspec_args = function() return run "$luarocks write_rockspec invalid" end,
+ fail_write_rockspec_args_url = function() return run "$luarocks write_rockspec http://example.com/invalid.zip" end,
+ test_write_rockspec_http = function() return run "$luarocks write_rockspec http://luarocks.org/releases/luarocks-2.1.0.tar.gz --lua-version=5.1" end,
+ test_write_rockspec_basedir = function() return run "$luarocks write_rockspec https://github.com/downloads/Olivine-Labs/luassert/luassert-1.2.tar.gz --lua-version=5.1" end,
+
+ fail_config_noflags = function() return run "$luarocks config; " end,
+ test_config_lua_incdir = function() return run "$luarocks config --lua-incdir; " end,
+ test_config_lua_libdir = function() return run "$luarocks config --lua-libdir; " end,
+ test_config_lua_ver = function() return run "$luarocks config --lua-ver; " end,
+ fail_config_system_config = function()
+ return rm "$testing_lrprefix/etc/luarocks/config.lua"
+ and run "$luarocks config --system-config; "
+ end,
+ test_config_system_config = function()
+ local ok = mkdir "$testing_lrprefix/etc/luarocks"
+ and touch "$testing_lrprefix/etc/luarocks/config.lua"
+ and run "$luarocks config --system-config; "
+ rm "$testing_lrprefix/etc/luarocks/config.lua"
+ return ok
+ end,
+ fail_config_system_config_invalid = function()
+ local ok = mkdir "$testing_lrprefix/etc/luarocks"
+ and run "echo 'if if if' > '$testing_lrprefix/etc/luarocks/config.lua' ;"
+ and run "$luarocks config --system-config"
+ rm "$testing_lrprefix/etc/luarocks/config.lua"
+ return ok
+ end,
+ test_config_user_config = function() return run "$luarocks config --user-config; " end,
+ fail_config_user_config = function() return run "LUAROCKS_CONFIG='/missing_file.lua' $luarocks config --user-config; " end,
+ test_config_rock_trees = function() return run "$luarocks config --rock-trees;" end,
+ test_config_help = function() return run "$luarocks help config;" end,
+ test_doc = function()
+ return run "$luarocks install luarepl"
+ and run "$luarocks doc luarepl"
+ end,
+
+ -- Tests for https://github.com/keplerproject/luarocks/issues/375
+ test_fetch_base_dir = function()
+ local fetch = require "luarocks.fetch"
+
+ return assert("v0.3" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2/archive/v0.3.zip"))
+ and assert("lua-compat-5.2" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2.zip"))
+ and assert("lua-compat-5.2" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2.tar.gz"))
+ and assert("lua-compat-5.2" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2.tar.bz2"))
+ and assert("parser.moon" == fetch.url_to_base_dir("git://github.com/Cirru/parser.moon"))
+ and assert("v0.3" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2/archive/v0.3"))
+ end
+
+}
diff --git a/luarocks/test/testing.sh b/luarocks/test/testing.sh
index b0d95c3..26bdde5 100755
--- a/luarocks/test/testing.sh
+++ b/luarocks/test/testing.sh
@@ -30,8 +30,11 @@ then
shift
fi
+luashortversion=`echo $luaversion | cut -d. -f 1-2`
+
testing_dir="$PWD"
+testing_lrprefix="$testing_dir/testing_lrprefix-$luaversion"
testing_tree="$testing_dir/testing-$luaversion"
testing_sys_tree="$testing_dir/testing_sys-$luaversion"
testing_tree_copy="$testing_dir/testing_copy-$luaversion"
@@ -39,7 +42,6 @@ testing_sys_tree_copy="$testing_dir/testing_sys_copy-$luaversion"
testing_cache="$testing_dir/testing_cache-$luaversion"
testing_server="$testing_dir/testing_server-$luaversion"
-
if [ "$1" == "--clean" ]
then
shift
@@ -51,6 +53,7 @@ fi
rm -f luacov.report.out
rm -rf /tmp/luarocks_testing
mkdir /tmp/luarocks_testing
+rm -rf "$testing_lrprefix"
rm -rf "$testing_tree"
rm -rf "$testing_sys_tree"
rm -rf "$testing_tree_copy"
@@ -77,7 +80,7 @@ rocks_servers = {
}
local_cache = "$testing_cache"
upload_server = "testing"
-upload_user = "hisham"
+upload_user = "$USER"
upload_servers = {
testing = {
rsync = "localhost/tmp/luarocks_testing",
@@ -107,7 +110,7 @@ rocks_trees = {
}
local_cache = "$testing_cache"
upload_server = "testing"
-upload_user = "hisham"
+upload_user = "$USER"
upload_servers = {
testing = {
sftp = "localhost/tmp/luarocks_testing",
@@ -153,8 +156,16 @@ then
make install INSTALL_TOP="$luadir" &> /dev/null
fi
popd
+ [ -e ~/.ssh/id_rsa.pub ] || ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
+ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
+ chmod og-wx ~/.ssh/authorized_keys
+ ssh-keyscan localhost >> ~/.ssh/known_hosts
else
luadir="/Programs/Lua/Current"
+ if [ ! -e "$luadir" ]
+ then
+ luadir="/usr/local"
+ fi
fi
if [ `uname -m` = i686 ]
@@ -171,19 +182,21 @@ verrev_luasocket=${version_luasocket}-1
srcdir_luasocket=luasocket-3.0-rc1
version_cprint=0.1
-verrev_cprint=0.1-1
+verrev_cprint=0.1-2
-version_luacov=0.5
-verrev_luacov=0.5-1
+version_luacov=0.8
+verrev_luacov=${version_luacov}-1
version_lxsh=0.8.6
version_validate_args=1.5.4
verrev_validate_args=1.5.4-1
verrev_lxsh=${version_lxsh}-2
+version_abelhas=1.0
+verrev_abelhas=${version_abelhas}-1
luasec=luasec
cd ..
-./configure --with-lua="$luadir"
+./configure --with-lua="$luadir" --prefix="$testing_lrprefix"
make clean
make src/luarocks/site_config.lua
make dev
@@ -217,8 +230,7 @@ luarocks_admin_nocov="run_lua --nocov luarocks-admin"
mkdir -p "$testing_server"
(
cd "$testing_server"
- luarocks_repo="http://luarocks.org/repositories/rocks"
- luarocks_scm_repo="http://luarocks.org/repositories/rocks-scm"
+ luarocks_repo="http://rocks.moonscript.org"
get() { [ -e `basename "$1"` ] || wget -c "$1"; }
get "$luarocks_repo/luacov-${verrev_luacov}.src.rock"
get "$luarocks_repo/luacov-${verrev_luacov}.rockspec"
@@ -226,26 +238,32 @@ mkdir -p "$testing_server"
get "$luarocks_repo/lualogging-1.3.0-1.src.rock"
get "$luarocks_repo/luasocket-${verrev_luasocket}.src.rock"
get "$luarocks_repo/luasocket-${verrev_luasocket}.rockspec"
- get "$luarocks_repo/luafilesystem-1.6.2-1.src.rock"
- get "$luarocks_repo/stdlib-35-1.src.rock"
+ get "$luarocks_repo/luafilesystem-1.6.3-1.src.rock"
+ get "$luarocks_repo/stdlib-41.0.0-1.src.rock"
get "$luarocks_repo/luarepl-0.4-1.src.rock"
get "$luarocks_repo/validate-args-1.5.4-1.rockspec"
- get "$luarocks_scm_repo/luasec-scm-1.rockspec"
+ get "$luarocks_repo/luasec-0.5-2.rockspec"
get "$luarocks_repo/luabitop-1.0.2-1.rockspec"
get "$luarocks_repo/lpty-1.0.1-1.src.rock"
get "$luarocks_repo/cprint-${verrev_cprint}.src.rock"
get "$luarocks_repo/cprint-${verrev_cprint}.rockspec"
get "$luarocks_repo/wsapi-1.6-1.src.rock"
get "$luarocks_repo/lxsh-${verrev_lxsh}.src.rock"
- get "$luarocks_repo/abelhas-1.0-1.rockspec"
- get "$luarocks_repo/lzlib-0.4.work3-1.src.rock"
+ get "$luarocks_repo/lxsh-${verrev_lxsh}.rockspec"
+ get "$luarocks_repo/abelhas-${verrev_abelhas}.rockspec"
+ get "$luarocks_repo/lzlib-0.4.1.53-1.src.rock"
get "$luarocks_repo/lpeg-0.12-1.src.rock"
- get "$luarocks_repo/luaposix-31-1.src.rock"
+ get "$luarocks_repo/luaposix-33.2.1-1.src.rock"
get "$luarocks_repo/md5-1.2-1.src.rock"
- get "$luarocks_repo/lrandom-20120430.51-1.src.rock"
- get "$luarocks_repo/lrandom-20120430.52-1.src.rock"
- get "$luarocks_repo/lrandom-20120430.51-1.rockspec"
- get "$luarocks_repo/lrandom-20120430.52-1.rockspec"
+ get "$luarocks_repo/lmathx-20120430.51-1.src.rock"
+ get "$luarocks_repo/lmathx-20120430.51-1.rockspec"
+ get "$luarocks_repo/lmathx-20120430.52-1.src.rock"
+ get "$luarocks_repo/lmathx-20120430.52-1.rockspec"
+ get "$luarocks_repo/lmathx-20150505-1.src.rock"
+ get "$luarocks_repo/lmathx-20150505-1.rockspec"
+ get "$luarocks_repo/lua-path-0.2.3-1.src.rock"
+ get "$luarocks_repo/lua-cjson-2.1.0-1.src.rock"
+ get "$luarocks_repo/luacov-coveralls-0.1.1-1.src.rock"
)
$luarocks_admin_nocov make_manifest "$testing_server"
@@ -270,6 +288,8 @@ build_environment() {
$luarocks_nocov pack --tree="$testing_sys_tree" $package; mv $package-*.rock "$testing_cache"
}
done
+ export LUA_PATH=
+ export LUA_CPATH=
eval `$luarocks_noecho_nocov path --bin`
cp -a "$testing_tree" "$testing_tree_copy"
cp -a "$testing_sys_tree" "$testing_sys_tree_copy"
@@ -316,12 +336,19 @@ need_luasocket() { need luasocket $verrev_luasocket; }
test_version() { $luarocks --version; }
-fail_arg_server() { $luarocks --server; }
-fail_arg_only_server() { $luarocks --only-server; }
fail_unknown_command() { $luarocks unknown_command; }
+fail_arg_boolean_parameter() { $luarocks --porcelain=invalid; }
+fail_arg_boolean_unknown() { $luarocks --invalid-flag; }
+fail_arg_string_no_parameter() { $luarocks --server; }
+fail_arg_string_followed_by_flag() { $luarocks --server --porcelain; }
+fail_arg_string_unknown() { $luarocks --invalid-flag=abc; }
+
test_empty_list() { $luarocks list; }
+fail_sysconfig_err() { local err=0; local scdir="$testing_lrprefix/etc/luarocks/"; mkdir -p "$scdir"; local sysconfig="$scdir/config.lua"; echo "aoeui" > "$sysconfig"; echo $sysconfig; $luarocks list; err=$?; rm "$sysconfig"; return "$err"; }
+fail_sysconfig_default_err() { local err=0; local scdir="$testing_lrprefix/etc/luarocks/"; mkdir -p "$scdir"; local sysconfig="$scdir/config-$luashortversion.lua"; echo "aoeui" > "$sysconfig"; echo $sysconfig; $luarocks list; err=$?; rm "$sysconfig"; return "$err"; }
+
fail_build_noarg() { $luarocks build; }
fail_download_noarg() { $luarocks download; }
fail_install_noarg() { $luarocks install; }
@@ -329,6 +356,7 @@ fail_lint_noarg() { $luarocks lint; }
fail_search_noarg() { $luarocks search; }
fail_show_noarg() { $luarocks show; }
fail_unpack_noarg() { $luarocks unpack; }
+fail_upload_noarg() { $luarocks upload; }
fail_remove_noarg() { $luarocks remove; }
fail_doc_noarg() { $luarocks doc; }
fail_new_version_noarg() { $luarocks new_version; }
@@ -341,8 +369,16 @@ fail_lint_invalid() { $luarocks lint invalid; }
fail_show_invalid() { $luarocks show invalid; }
fail_new_version_invalid() { $luarocks new_version invalid; }
+test_list_invalidtree() { $luarocks --tree=/some/invalid/tree list; }
+
+fail_inexistent_dir() { mkdir idontexist; cd idontexist; rmdir ../idontexist; $luarocks; err=$?; cd ..; return $err; }
+
fail_make_norockspec() { $luarocks make; }
+fail_build_permissions() { $luarocks build --tree=/usr lpeg; }
+fail_build_permissions_parent() { $luarocks build --tree=/usr/invalid lpeg; }
+
+test_build_verbose() { $luarocks build --verbose lpeg; }
fail_build_blank_arg() { $luarocks build --tree="" lpeg; }
test_build_withpatch() { need_luasocket; $luarocks build luadoc; }
test_build_diffversion() { $luarocks build luacov ${version_luacov}; }
@@ -351,32 +387,47 @@ test_build_install_bin() { $luarocks build luarepl; }
test_build_nohttps() { need_luasocket; $luarocks download --rockspec validate-args ${verrev_validate_args} && $luarocks build ./validate-args-${version_validate_args}-1.rockspec && rm ./validate-args-${version_validate_args}-1.rockspec; }
test_build_https() { need_luasocket; $luarocks download --rockspec validate-args ${verrev_validate_args} && $luarocks install $luasec && $luarocks build ./validate-args-${verrev_validate_args}.rockspec && rm ./validate-args-${verrev_validate_args}.rockspec; }
test_build_supported_platforms() { $luarocks build lpty; }
+test_build_only_deps_rockspec() { $luarocks download --rockspec lxsh ${verrev_lxsh} && $luarocks build ./lxsh-${verrev_lxsh}.rockspec --only-deps && { $luarocks show lxsh; [ $? -ne 0 ]; }; }
+test_build_only_deps_src_rock() { $luarocks download --source lxsh ${verrev_lxsh} && $luarocks build ./lxsh-${verrev_lxsh}.src.rock --only-deps && { $luarocks show lxsh; [ $? -ne 0 ]; }; }
+test_build_only_deps() { $luarocks build luasec --only-deps && { $luarocks show luasec; [ $? -ne 0 ]; }; }
+test_install_only_deps() { $luarocks install lxsh ${verrev_lxsh} --only-deps && { $luarocks show lxsh; [ $? -ne 0 ]; }; }
fail_build_missing_external() { $luarocks build "$testing_dir/testfiles/missing_external-0.1-1.rockspec" INEXISTENT_INCDIR="/invalid/dir"; }
+fail_build_invalidpatch() { need_luasocket; $luarocks build "$testing_dir/testfiles/invalid_patch-0.1-1.rockspec"; }
-test_build_deps_partial_match() { $luarocks build lrandom; }
+test_build_deps_partial_match() { $luarocks build lmathx; }
test_build_show_downloads() { export LUAROCKS_CONFIG="$testing_dir/testing_config_show_downloads.lua" && $luarocks build alien; export LUAROCKS_CONFIG="$testing_dir/testing_config.lua"; }
test_download_all() { $luarocks download --all validate-args && rm validate-args-*; }
test_download_rockspecversion() { $luarocks download --rockspec validate-args ${verrev_validate_args} && rm validate-args-*; }
test_help() { $luarocks help; }
+fail_help_invalid() { $luarocks help invalid; }
test_install_binaryrock() { $luarocks build --pack-binary-rock cprint && $luarocks install ./cprint-${verrev_cprint}.${platform}.rock && rm ./cprint-${verrev_cprint}.${platform}.rock; }
test_install_with_bin() { $luarocks install wsapi; }
fail_install_notazipfile() { $luarocks install "$testing_dir/testfiles/not_a_zipfile-1.0-1.src.rock"; }
+fail_install_invalidpatch() { need_luasocket; $luarocks install "$testing_dir/testfiles/invalid_patch-0.1-1.rockspec"; }
+fail_install_invalid_filename() { $luarocks install "invalid.rock"; }
+fail_install_invalid_arch() { $luarocks install "foo-1.0-1.impossible-x86.rock"; }
+test_install_reinstall() { $luarocks install "$testing_cache/luasocket-$verrev_luasocket.$platform.rock"; $luarocks install --deps-mode=none "$testing_cache/luasocket-$verrev_luasocket.$platform.rock"; }
+
+fail_local_root() { USER=root $luarocks install --local luasocket; }
+
+test_site_config() { mv ../src/luarocks/site_config.lua ../src/luarocks/site_config.lua.tmp; $luarocks; mv ../src/luarocks/site_config.lua.tmp ../src/luarocks/site_config.lua; }
test_lint_ok() { $luarocks download --rockspec validate-args ${verrev_validate_args} && $luarocks lint ./validate-args-${verrev_validate_args}.rockspec && rm ./validate-args-${verrev_validate_args}.rockspec; }
fail_lint_type_mismatch_string() { $luarocks lint "$testing_dir/testfiles/type_mismatch_string-1.0-1.rockspec"; }
fail_lint_type_mismatch_version() { $luarocks lint "$testing_dir/testfiles/type_mismatch_version-1.0-1.rockspec"; }
fail_lint_type_mismatch_table() { $luarocks lint "$testing_dir/testfiles/type_mismatch_table-1.0-1.rockspec"; }
+fail_lint_no_build_table() { $luarocks lint "$testing_dir/testfiles/no_build_table-0.1-1.rockspec"; }
test_list() { $luarocks list; }
test_list_porcelain() { $luarocks list --porcelain; }
-test_make_with_rockspec() { rm -rf ./luasocket-${verrev_luasocket} && $luarocks download --src luasocket && $luarocks unpack ./luasocket-${verrev_luasocket}.src.rock && cd luasocket-${verrev_luasocket}/${srcdir_luasocket} && $luarocks make luasocket-${verrev_luasocket}.rockspec && cd ../.. && rm -rf ./luasocket-${verrev_luasocket}; }
-test_make_default_rockspec() { rm -rf ./lxsh-${verrev_lxsh} && $luarocks download --src lxsh ${verrev_lxsh} && $luarocks unpack ./lxsh-${verrev_lxsh}.src.rock && cd lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1 && $luarocks make && cd ../.. && rm -rf ./lxsh-${verrev_lxsh}; }
-test_make_pack_binary_rock() { rm -rf ./lxsh-${verrev_lxsh} && $luarocks download --src lxsh ${verrev_lxsh} && $luarocks unpack ./lxsh-${verrev_lxsh}.src.rock && cd lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1 && $luarocks make --deps-mode=none --pack-binary-rock && [ -e ./lxsh-${verrev_lxsh}.all.rock ] && cd ../.. && rm -rf ./lxsh-${verrev_lxsh}; }
-fail_make_which_rockspec() { rm -rf ./luasocket-${verrev_luasocket} && $luarocks download --src luasocket && $luarocks unpack ./luasocket-${verrev_luasocket}.src.rock && cd luasocket-${verrev_luasocket}/${srcdir_luasocket} && $luarocks make && cd ../.. && rm -rf ./luasocket-${verrev_luasocket}; }
+test_make_with_rockspec() { rm -rf ./luasocket-${verrev_luasocket} && $luarocks download --source luasocket && $luarocks unpack ./luasocket-${verrev_luasocket}.src.rock && cd luasocket-${verrev_luasocket}/${srcdir_luasocket} && $luarocks make luasocket-${verrev_luasocket}.rockspec && cd ../.. && rm -rf ./luasocket-${verrev_luasocket}; }
+test_make_default_rockspec() { rm -rf ./lxsh-${verrev_lxsh} && $luarocks download --source lxsh ${verrev_lxsh} && $luarocks unpack ./lxsh-${verrev_lxsh}.src.rock && cd lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1 && $luarocks make && cd ../.. && rm -rf ./lxsh-${verrev_lxsh}; }
+test_make_pack_binary_rock() { rm -rf ./lxsh-${verrev_lxsh} && $luarocks download --source lxsh ${verrev_lxsh} && $luarocks unpack ./lxsh-${verrev_lxsh}.src.rock && cd lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1 && $luarocks make --deps-mode=none --pack-binary-rock && [ -e ./lxsh-${verrev_lxsh}.all.rock ] && cd ../.. && rm -rf ./lxsh-${verrev_lxsh}; }
+fail_make_which_rockspec() { rm -rf ./luasocket-${verrev_luasocket} && $luarocks download --source luasocket && $luarocks unpack ./luasocket-${verrev_luasocket}.src.rock && cd luasocket-${verrev_luasocket}/${srcdir_luasocket} && $luarocks make && cd ../.. && rm -rf ./luasocket-${verrev_luasocket}; }
test_new_version() { $luarocks download --rockspec luacov ${version_luacov} && $luarocks new_version ./luacov-${version_luacov}-1.rockspec 0.2 && rm ./luacov-0.*; }
test_new_version_url() { $luarocks download --rockspec abelhas 1.0 && $luarocks new_version ./abelhas-1.0-1.rockspec 1.1 https://github.com/downloads/ittner/abelhas/abelhas-1.1.tar.gz && rm ./abelhas-*; }
@@ -392,9 +443,10 @@ test_path_lr_bin() { $luarocks path --lr-bin; }
fail_purge_missing_tree() { $luarocks purge --tree="$testing_tree"; }
test_purge() { $luarocks purge --tree="$testing_sys_tree"; }
-test_remove() { $luarocks build luacov ${version_luacov} && $luarocks remove luacov ${version_luacov}; }
+test_remove() { $luarocks build abelhas ${version_abelhas} && $luarocks remove abelhas ${version_abelhas}; }
test_remove_force() { need_luasocket; $luarocks build lualogging && $luarocks remove --force luasocket; }
fail_remove_deps() { need_luasocket; $luarocks build lualogging && $luarocks remove luasocket; }
+fail_remove_missing() { $luarocks remove missing_rock; }
fail_remove_invalid_name() { $luarocks remove invalid.rock; }
test_search_found() { $luarocks search zlib; }
@@ -402,24 +454,30 @@ test_search_missing() { $luarocks search missing_rock; }
test_show() { $luarocks show luacov; }
test_show_modules() { $luarocks show --modules luacov; }
+test_show_home() { $luarocks show --home luacov; }
test_show_depends() { need_luasocket; $luarocks install $luasec && $luarocks show luasec; }
test_show_oldversion() { $luarocks install luacov ${version_luacov} && $luarocks show luacov ${version_luacov}; }
test_unpack_download() { rm -rf ./cprint-${verrev_cprint} && $luarocks unpack cprint && rm -rf ./cprint-${verrev_cprint}; }
-test_unpack_src() { rm -rf ./cprint-${verrev_cprint} && $luarocks download --src cprint && $luarocks unpack ./cprint-${verrev_cprint}.src.rock && rm -rf ./cprint-${verrev_cprint}; }
+test_unpack_src() { rm -rf ./cprint-${verrev_cprint} && $luarocks download --source cprint && $luarocks unpack ./cprint-${verrev_cprint}.src.rock && rm -rf ./cprint-${verrev_cprint}; }
test_unpack_rockspec() { rm -rf ./cprint-${verrev_cprint} && $luarocks download --rockspec cprint && $luarocks unpack ./cprint-${verrev_cprint}.rockspec && rm -rf ./cprint-${verrev_cprint}; }
test_unpack_binary() { rm -rf ./cprint-${verrev_cprint} && $luarocks build cprint && $luarocks pack cprint && $luarocks unpack ./cprint-${verrev_cprint}.${platform}.rock && rm -rf ./cprint-${verrev_cprint}; }
+fail_unpack_invalidpatch() { need_luasocket; $luarocks unpack "$testing_dir/testfiles/invalid_patch-0.1-1.rockspec"; }
+fail_unpack_invalidrockspec() { need_luasocket; $luarocks unpack "invalid.rockspec"; }
+
+fail_upload_invalidrockspec() { $luarocks upload "invalid.rockspec"; }
+fail_upload_invalidkey() { $luarocks upload --api-key="invalid" "invalid.rockspec"; }
test_admin_help() { $luarocks_admin help; }
test_admin_make_manifest() { $luarocks_admin make_manifest; }
-test_admin_add_rsync() { if [ "$travis" ]; then return; fi; $luarocks_admin --server=testing add "$testing_server/luasocket-${verrev_luasocket}.src.rock"; }
-test_admin_add_sftp() { if [ "$travis" ]; then return; fi; export LUAROCKS_CONFIG="$testing_dir/testing_config_sftp.lua" && $luarocks_admin --server=testing add ./luasocket-${verrev_luasocket}.src.rock; export LUAROCKS_CONFIG="$testing_dir/testing_config.lua"; }
+test_admin_add_rsync() { $luarocks_admin --server=testing add "$testing_server/luasocket-${verrev_luasocket}.src.rock"; }
+test_admin_add_sftp() { export LUAROCKS_CONFIG="$testing_dir/testing_config_sftp.lua" && $luarocks_admin --server=testing add ./luasocket-${verrev_luasocket}.src.rock; export LUAROCKS_CONFIG="$testing_dir/testing_config.lua"; }
fail_admin_add_missing() { $luarocks_admin --server=testing add; }
fail_admin_invalidserver() { $luarocks_admin --server=invalid add "$testing_server/luasocket-${verrev_luasocket}.src.rock"; }
-fail_admin_invalidrock() { if [ "$travis" ]; then return 1; fi; $luarocks_admin --server=testing add invalid; }
-test_admin_refresh_cache() { if [ "$travis" ]; then return; fi; $luarocks_admin --server=testing refresh_cache; }
-test_admin_remove() { if [ "$travis" ]; then return; fi; $luarocks_admin --server=testing remove luasocket-${verrev_luasocket}.src.rock; }
+fail_admin_invalidrock() { $luarocks_admin --server=testing add invalid; }
+test_admin_refresh_cache() { $luarocks_admin --server=testing refresh_cache; }
+test_admin_remove() { $luarocks_admin --server=testing remove luasocket-${verrev_luasocket}.src.rock; }
fail_admin_remove_missing() { $luarocks_admin --server=testing remove; }
fail_deps_mode_invalid_arg() { $luarocks remove luacov --deps-mode; }
@@ -429,17 +487,43 @@ test_deps_mode_order_sys() { $luarocks build --tree="$testing_tree" lpeg && $lua
test_deps_mode_all_sys() { $luarocks build --tree="$testing_tree" lpeg && $luarocks build --deps-mode=all --tree="$testing_sys_tree" lxsh && [ `$luarocks_noecho list --tree="$testing_sys_tree" --porcelain lpeg | wc -l` = 0 ]; }
test_deps_mode_none() { $luarocks build --tree="$testing_tree" --deps-mode=none lxsh; [ `$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg | wc -l` = 0 ]; }
test_deps_mode_nodeps_alias() { $luarocks build --tree="$testing_tree" --nodeps lxsh; [ `$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg | wc -l` = 0 ]; }
-test_deps_mode_make_order() { $luarocks build --tree="$testing_sys_tree" lpeg && rm -rf ./lxsh-${verrev_lxsh} && $luarocks download --src lxsh ${verrev_lxsh} && $luarocks unpack ./lxsh-${verrev_lxsh}.src.rock && cd lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1 && $luarocks make --tree="$testing_tree" --deps-mode=order && cd ../.. && [ `$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg | wc -l` = 0 ] && rm -rf ./lxsh-${verrev_lxsh}; }
-test_deps_mode_make_order_sys() { $luarocks build --tree="$testing_tree" lpeg && rm -rf ./lxsh-${verrev_lxsh} && $luarocks download --src lxsh ${verrev_lxsh} && $luarocks unpack ./lxsh-${verrev_lxsh}.src.rock && cd lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1 && $luarocks make --tree="$testing_sys_tree" --deps-mode=order && cd ../.. && [ `$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg | wc -l` = 1 ] && rm -rf ./lxsh-${verrev_lxsh}; }
+test_deps_mode_make_order() { $luarocks build --tree="$testing_sys_tree" lpeg && rm -rf ./lxsh-${verrev_lxsh} && $luarocks download --source lxsh ${verrev_lxsh} && $luarocks unpack ./lxsh-${verrev_lxsh}.src.rock && cd lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1 && $luarocks make --tree="$testing_tree" --deps-mode=order && cd ../.. && [ `$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg | wc -l` = 0 ] && rm -rf ./lxsh-${verrev_lxsh}; }
+test_deps_mode_make_order_sys() { $luarocks build --tree="$testing_tree" lpeg && rm -rf ./lxsh-${verrev_lxsh} && $luarocks download --source lxsh ${verrev_lxsh} && $luarocks unpack ./lxsh-${verrev_lxsh}.src.rock && cd lxsh-${verrev_lxsh}/lxsh-${version_lxsh}-1 && $luarocks make --tree="$testing_sys_tree" --deps-mode=order && cd ../.. && [ `$luarocks_noecho list --tree="$testing_tree" --porcelain lpeg | wc -l` = 1 ] && rm -rf ./lxsh-${verrev_lxsh}; }
test_write_rockspec() { $luarocks write_rockspec git://github.com/keplerproject/luarocks; }
test_write_rockspec_lib() { $luarocks write_rockspec git://github.com/mbalmer/luafcgi --lib=fcgi --license="3-clause BSD" --lua-version=5.1,5.2; }
+test_write_rockspec_format() { $luarocks write_rockspec git://github.com/keplerproject/luarocks --rockspec-format=1.1 --lua-version=5.1,5.2; }
test_write_rockspec_fullargs() { $luarocks write_rockspec git://github.com/keplerproject/luarocks --lua-version=5.1,5.2 --license="MIT/X11" --homepage="http://www.luarocks.org" --summary="A package manager for Lua modules"; }
fail_write_rockspec_args() { $luarocks write_rockspec invalid; }
fail_write_rockspec_args_url() { $luarocks write_rockspec http://example.com/invalid.zip; }
test_write_rockspec_http() { $luarocks write_rockspec http://luarocks.org/releases/luarocks-2.1.0.tar.gz --lua-version=5.1; }
test_write_rockspec_basedir() { $luarocks write_rockspec https://github.com/downloads/Olivine-Labs/luassert/luassert-1.2.tar.gz --lua-version=5.1; }
+fail_config_noflags() { $luarocks config; }
+test_config_lua_incdir() { $luarocks config --lua-incdir; }
+test_config_lua_libdir() { $luarocks config --lua-libdir; }
+test_config_lua_ver() { $luarocks config --lua-ver; }
+fail_config_system_config() { rm -f "$testing_lrprefix/etc/luarocks/config.lua"; $luarocks config --system-config; }
+test_config_system_config() { mkdir -p "$testing_lrprefix/etc/luarocks"; touch "$testing_lrprefix/etc/luarocks/config.lua"; $luarocks config --system-config; err=$?; rm -f "$testing_lrprefix/etc/luarocks/config.lua"; return $err; }
+fail_config_system_config_invalid() { mkdir -p "$testing_lrprefix/etc/luarocks"; echo "if if if" > "$testing_lrprefix/etc/luarocks/config.lua"; $luarocks config --system-config; err=$?; rm -f "$testing_lrprefix/etc/luarocks/config.lua"; return $err; }
+test_config_user_config() { $luarocks config --user-config; }
+fail_config_user_config() { LUAROCKS_CONFIG="/missing_file.lua" $luarocks config --user-config; }
+test_config_rock_trees() { $luarocks config --rock-trees; }
+test_config_help() { $luarocks help config; }
+
+# Tests for https://github.com/keplerproject/luarocks/issues/375
+test_fetch_base_dir() { $lua <<EOF
+ local fetch = require "luarocks.fetch"
+
+ assert("v0.3" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2/archive/v0.3.zip"))
+ assert("lua-compat-5.2" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2.zip"))
+ assert("lua-compat-5.2" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2.tar.gz"))
+ assert("lua-compat-5.2" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2.tar.bz2"))
+ assert("parser.moon" == fetch.url_to_base_dir("git://github.com/Cirru/parser.moon"))
+ assert("v0.3" == fetch.url_to_base_dir("https://github.com/hishamhm/lua-compat-5.2/archive/v0.3"))
+EOF
+}
+
test_doc() { $luarocks install luarepl; $luarocks doc luarepl; }
# Driver #########################################
@@ -452,8 +536,13 @@ run_tests() {
echo "-------------------------------------------"
reset_environment
if $test
- then echo "OK: Expected success."
- else echo "FAIL: Unexpected failure."; exit 1
+ then
+ echo "OK: Expected success."
+ else
+ if [ $? = 99 ]
+ then echo "FAIL: Unexpected crash!"; exit 99
+ fi
+ echo "FAIL: Unexpected failure."; exit 1
fi
done
grep "^fail_$1.*(" < $testing_dir/testing.sh | cut -d'(' -f1 | while read test
@@ -464,7 +553,11 @@ run_tests() {
reset_environment
if $test
then echo "FAIL: Unexpected success."; exit 1
- else echo "OK: Expected failure."
+ else
+ if [ $? = 99 ]
+ then echo "FAIL: Unexpected crash!"; exit 99
+ fi
+ echo "OK: Expected failure."
fi
done
}
@@ -481,7 +574,11 @@ run_with_full_environment() {
echo "==========================================="
echo "Running with full environment"
echo "==========================================="
- build_environment luacov luafilesystem luasocket luabitop luaposix md5 lzlib
+
+ local bitop=
+ [ "$luaversion" = "5.1.5" ] && bitop=luabitop
+
+ build_environment luacov luafilesystem luasocket $bitop luaposix md5 lzlib
run_tests $1
}
@@ -493,12 +590,16 @@ run_all_tests() {
run_all_tests $1
#run_with_minimal_environment $1
-$testing_sys_tree/bin/luacov -c $testing_dir/luacov.config src/luarocks src/bin
-
if [ "$travis" ]
then
+ if [ "$TRAVIS" ]
+ then
+ build_environment luacov luafilesystem luacov-coveralls
+ ( cd $testing_dir; $testing_sys_tree/bin/luacov-coveralls || echo "ok" )
+ fi
+ $testing_sys_tree/bin/luacov -c $testing_dir/luacov.config src/luarocks src/bin
grep "Summary" -B1 -A1000 $testing_dir/luacov.report.out
else
+ $testing_sys_tree/bin/luacov -c $testing_dir/luacov.config src/luarocks src/bin
cat "$testing_dir/luacov.report.out"
fi
-
diff --git a/luarocks/win32/pe-parser.lua b/luarocks/win32/pe-parser.lua
index 30bb839..9cd36ff 100644
--- a/luarocks/win32/pe-parser.lua
+++ b/luarocks/win32/pe-parser.lua
@@ -1,7 +1,11 @@
---------------------------------------------------------------------------------------
-- Lua module to parse a Portable Executable (.exe , .dll, etc.) file and extract metadata.
--
--- Version 0.1, [copyright (c) 2013 - Thijs Schreijer](http://www.thijsschreijer.nl)
+-- NOTE: numerical information is extracted as strings (hex) to prevent numerical overflows in
+-- case of 64 bit fields (bit/flag fields). Pointer arithmetic is still done numerically, so for
+-- very large files this could lead to undefined results. Use with care!
+--
+-- Version 0.4, [copyright (c) 2013-2015 Thijs Schreijer](http://www.thijsschreijer.nl)
-- @name pe-parser
-- @class module
@@ -238,7 +242,7 @@ local function readstring(f)
end
--- Parses a file and extracts the information.
--- All numbers are delivered as "string" types containing hex values, see `toHex` and `toDec` conversion functions.
+-- All numbers are delivered as "string" types containing hex values (to prevent numerical overflows in case of 64bit sizes or bit-fields), see `toHex` and `toDec` conversion functions.
-- @return table with data, or nil + error
-- @usage local pe = require("pe-parser")
-- local obj = pe.parse("c:\lua\lua.exe")
@@ -524,9 +528,12 @@ function M.msvcrt(infile)
for i, dll in ipairs(obj.DataDirectory.ImportTable) do
dll = dll.Name:upper()
- local result = dll:match('(MSVCR%d*)%.DLL')
+ local result = dll:match('(MSVCR%d*D?)%.DLL')
+ if not result then
+ result = dll:match('(MSVCRTD?)%.DLL')
+ end
if not result then
- result = dll:match('(MSVCRT)%.DLL')
+ result = dll:match('(VCRUNTIME%d*D?)%.DLL')
end
-- success, found it return name + binary where it was found
if result then return result, infile end