diff --git a/.github/workflows/build-toml.yml b/.github/workflows/build-toml.yml index 5bec3d347..ccf0764bd 100644 --- a/.github/workflows/build-toml.yml +++ b/.github/workflows/build-toml.yml @@ -26,10 +26,12 @@ jobs: - name: Install Luarocks uses: hishamhm/gh-actions-luarocks@master - name: Install TOML Package + id: toml run: | luarocks --local --lua-version=5.1 install toml - luarocks --local --lua-version=5.1 show toml --mversion >> $ROCK_VERSION + echo "version=$(luarocks --local --lua-version=5.1 show toml --mversion)" >> $GITHUB_OUTPUT luarocks pack toml - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "chore: update build artifacts" + file_pattern: "toml-${{ steps.toml.outputs.version }}.${{ matrix.os.host }}-x86_64.rock" diff --git a/.lua/bin/lua b/.lua/bin/lua deleted file mode 100755 index 0ce858ca3..000000000 Binary files a/.lua/bin/lua and /dev/null differ diff --git a/.lua/bin/luac b/.lua/bin/luac deleted file mode 100755 index 52538db4a..000000000 Binary files a/.lua/bin/luac and /dev/null differ diff --git a/.lua/include/lauxlib.h b/.lua/include/lauxlib.h deleted file mode 100644 index 34258235d..000000000 --- a/.lua/include/lauxlib.h +++ /dev/null @@ -1,174 +0,0 @@ -/* -** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lauxlib_h -#define lauxlib_h - - -#include -#include - -#include "lua.h" - - -#if defined(LUA_COMPAT_GETN) -LUALIB_API int (luaL_getn) (lua_State *L, int t); -LUALIB_API void (luaL_setn) (lua_State *L, int t, int n); -#else -#define luaL_getn(L,i) ((int)lua_objlen(L, i)) -#define luaL_setn(L,i,j) ((void)0) /* no op! */ -#endif - -#if defined(LUA_COMPAT_OPENLIB) -#define luaI_openlib luaL_openlib -#endif - - -/* extra error code for `luaL_load' */ -#define LUA_ERRFILE (LUA_ERRERR+1) - - -typedef struct luaL_Reg { - const char *name; - lua_CFunction func; -} luaL_Reg; - - - -LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname, - const luaL_Reg *l, int nup); -LUALIB_API void (luaL_register) (lua_State *L, const char *libname, - const luaL_Reg *l); -LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); -LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); -LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname); -LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg); -LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, - size_t *l); -LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, - const char *def, size_t *l); -LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg); -LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def); - -LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); -LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, - lua_Integer def); - -LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); -LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); -LUALIB_API void (luaL_checkany) (lua_State *L, int narg); - -LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); -LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); - -LUALIB_API void (luaL_where) (lua_State *L, int lvl); -LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); - -LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, - const char *const lst[]); - -LUALIB_API int (luaL_ref) (lua_State *L, int t); -LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); - -LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); -LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, - const char *name); -LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); - -LUALIB_API lua_State *(luaL_newstate) (void); - - -LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, - const char *r); - -LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, - const char *fname, int szhint); - - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define luaL_argcheck(L, cond,numarg,extramsg) \ - ((void)((cond) || luaL_argerror(L, (numarg), (extramsg)))) -#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) -#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) -#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) -#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) -#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) -#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) - -#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) - -#define luaL_dofile(L, fn) \ - (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) - -#define luaL_dostring(L, s) \ - (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) - -#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) - -#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - - -typedef struct luaL_Buffer { - char *p; /* current position in buffer */ - int lvl; /* number of strings in the stack (level) */ - lua_State *L; - char buffer[LUAL_BUFFERSIZE]; -} luaL_Buffer; - -#define luaL_addchar(B,c) \ - ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ - (*(B)->p++ = (char)(c))) - -/* compatibility only */ -#define luaL_putchar(B,c) luaL_addchar(B,c) - -#define luaL_addsize(B,n) ((B)->p += (n)) - -LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); -LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B); -LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); -LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); -LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); -LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); - - -/* }====================================================== */ - - -/* compatibility with ref system */ - -/* pre-defined references */ -#define LUA_NOREF (-2) -#define LUA_REFNIL (-1) - -#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \ - (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) - -#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) - -#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref)) - - -#define luaL_reg luaL_Reg - -#endif - - diff --git a/.lua/include/lua.h b/.lua/include/lua.h deleted file mode 100644 index a4b73e743..000000000 --- a/.lua/include/lua.h +++ /dev/null @@ -1,388 +0,0 @@ -/* -** $Id: lua.h,v 1.218.1.7 2012/01/13 20:36:20 roberto Exp $ -** Lua - An Extensible Extension Language -** Lua.org, PUC-Rio, Brazil (http://www.lua.org) -** See Copyright Notice at the end of this file -*/ - - -#ifndef lua_h -#define lua_h - -#include -#include - - -#include "luaconf.h" - - -#define LUA_VERSION "Lua 5.1" -#define LUA_RELEASE "Lua 5.1.5" -#define LUA_VERSION_NUM 501 -#define LUA_COPYRIGHT "Copyright (C) 1994-2012 Lua.org, PUC-Rio" -#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" - - -/* mark for precompiled code (`Lua') */ -#define LUA_SIGNATURE "\033Lua" - -/* option for multiple returns in `lua_pcall' and `lua_call' */ -#define LUA_MULTRET (-1) - - -/* -** pseudo-indices -*/ -#define LUA_REGISTRYINDEX (-10000) -#define LUA_ENVIRONINDEX (-10001) -#define LUA_GLOBALSINDEX (-10002) -#define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) - - -/* thread status; 0 is OK */ -#define LUA_YIELD 1 -#define LUA_ERRRUN 2 -#define LUA_ERRSYNTAX 3 -#define LUA_ERRMEM 4 -#define LUA_ERRERR 5 - - -typedef struct lua_State lua_State; - -typedef int (*lua_CFunction) (lua_State *L); - - -/* -** functions that read/write blocks when loading/dumping Lua chunks -*/ -typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); - -typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud); - - -/* -** prototype for memory-allocation functions -*/ -typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); - - -/* -** basic types -*/ -#define LUA_TNONE (-1) - -#define LUA_TNIL 0 -#define LUA_TBOOLEAN 1 -#define LUA_TLIGHTUSERDATA 2 -#define LUA_TNUMBER 3 -#define LUA_TSTRING 4 -#define LUA_TTABLE 5 -#define LUA_TFUNCTION 6 -#define LUA_TUSERDATA 7 -#define LUA_TTHREAD 8 - - - -/* minimum Lua stack available to a C function */ -#define LUA_MINSTACK 20 - - -/* -** generic extra include file -*/ -#if defined(LUA_USER_H) -#include LUA_USER_H -#endif - - -/* type of numbers in Lua */ -typedef LUA_NUMBER lua_Number; - - -/* type for integer functions */ -typedef LUA_INTEGER lua_Integer; - - - -/* -** state manipulation -*/ -LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); -LUA_API void (lua_close) (lua_State *L); -LUA_API lua_State *(lua_newthread) (lua_State *L); - -LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); - - -/* -** basic stack manipulation -*/ -LUA_API int (lua_gettop) (lua_State *L); -LUA_API void (lua_settop) (lua_State *L, int idx); -LUA_API void (lua_pushvalue) (lua_State *L, int idx); -LUA_API void (lua_remove) (lua_State *L, int idx); -LUA_API void (lua_insert) (lua_State *L, int idx); -LUA_API void (lua_replace) (lua_State *L, int idx); -LUA_API int (lua_checkstack) (lua_State *L, int sz); - -LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); - - -/* -** access functions (stack -> C) -*/ - -LUA_API int (lua_isnumber) (lua_State *L, int idx); -LUA_API int (lua_isstring) (lua_State *L, int idx); -LUA_API int (lua_iscfunction) (lua_State *L, int idx); -LUA_API int (lua_isuserdata) (lua_State *L, int idx); -LUA_API int (lua_type) (lua_State *L, int idx); -LUA_API const char *(lua_typename) (lua_State *L, int tp); - -LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); - -LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); -LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); -LUA_API int (lua_toboolean) (lua_State *L, int idx); -LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); -LUA_API size_t (lua_objlen) (lua_State *L, int idx); -LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); -LUA_API void *(lua_touserdata) (lua_State *L, int idx); -LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); -LUA_API const void *(lua_topointer) (lua_State *L, int idx); - - -/* -** push functions (C -> stack) -*/ -LUA_API void (lua_pushnil) (lua_State *L); -LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); -LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); -LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l); -LUA_API void (lua_pushstring) (lua_State *L, const char *s); -LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, - va_list argp); -LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); -LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); -LUA_API void (lua_pushboolean) (lua_State *L, int b); -LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); -LUA_API int (lua_pushthread) (lua_State *L); - - -/* -** get functions (Lua -> stack) -*/ -LUA_API void (lua_gettable) (lua_State *L, int idx); -LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_rawget) (lua_State *L, int idx); -LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); -LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); -LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); -LUA_API int (lua_getmetatable) (lua_State *L, int objindex); -LUA_API void (lua_getfenv) (lua_State *L, int idx); - - -/* -** set functions (stack -> Lua) -*/ -LUA_API void (lua_settable) (lua_State *L, int idx); -LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_rawset) (lua_State *L, int idx); -LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); -LUA_API int (lua_setmetatable) (lua_State *L, int objindex); -LUA_API int (lua_setfenv) (lua_State *L, int idx); - - -/* -** `load' and `call' functions (load and run Lua code) -*/ -LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); -LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); -LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); -LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, - const char *chunkname); - -LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); - - -/* -** coroutine functions -*/ -LUA_API int (lua_yield) (lua_State *L, int nresults); -LUA_API int (lua_resume) (lua_State *L, int narg); -LUA_API int (lua_status) (lua_State *L); - -/* -** garbage-collection function and options -*/ - -#define LUA_GCSTOP 0 -#define LUA_GCRESTART 1 -#define LUA_GCCOLLECT 2 -#define LUA_GCCOUNT 3 -#define LUA_GCCOUNTB 4 -#define LUA_GCSTEP 5 -#define LUA_GCSETPAUSE 6 -#define LUA_GCSETSTEPMUL 7 - -LUA_API int (lua_gc) (lua_State *L, int what, int data); - - -/* -** miscellaneous functions -*/ - -LUA_API int (lua_error) (lua_State *L); - -LUA_API int (lua_next) (lua_State *L, int idx); - -LUA_API void (lua_concat) (lua_State *L, int n); - -LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); -LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define lua_pop(L,n) lua_settop(L, -(n)-1) - -#define lua_newtable(L) lua_createtable(L, 0, 0) - -#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) - -#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) - -#define lua_strlen(L,i) lua_objlen(L, (i)) - -#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) -#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) -#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) -#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) -#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) -#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) -#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) -#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) - -#define lua_pushliteral(L, s) \ - lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) - -#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s)) -#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) - -#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) - - - -/* -** compatibility macros and functions -*/ - -#define lua_open() luaL_newstate() - -#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX) - -#define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0) - -#define lua_Chunkreader lua_Reader -#define lua_Chunkwriter lua_Writer - - -/* hack */ -LUA_API void lua_setlevel (lua_State *from, lua_State *to); - - -/* -** {====================================================================== -** Debug API -** ======================================================================= -*/ - - -/* -** Event codes -*/ -#define LUA_HOOKCALL 0 -#define LUA_HOOKRET 1 -#define LUA_HOOKLINE 2 -#define LUA_HOOKCOUNT 3 -#define LUA_HOOKTAILRET 4 - - -/* -** Event masks -*/ -#define LUA_MASKCALL (1 << LUA_HOOKCALL) -#define LUA_MASKRET (1 << LUA_HOOKRET) -#define LUA_MASKLINE (1 << LUA_HOOKLINE) -#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) - -typedef struct lua_Debug lua_Debug; /* activation record */ - - -/* Functions to be called by the debuger in specific events */ -typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n); -LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n); - -LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); -LUA_API lua_Hook lua_gethook (lua_State *L); -LUA_API int lua_gethookmask (lua_State *L); -LUA_API int lua_gethookcount (lua_State *L); - - -struct lua_Debug { - int event; - const char *name; /* (n) */ - const char *namewhat; /* (n) `global', `local', `field', `method' */ - const char *what; /* (S) `Lua', `C', `main', `tail' */ - const char *source; /* (S) */ - int currentline; /* (l) */ - int nups; /* (u) number of upvalues */ - int linedefined; /* (S) */ - int lastlinedefined; /* (S) */ - char short_src[LUA_IDSIZE]; /* (S) */ - /* private part */ - int i_ci; /* active function */ -}; - -/* }====================================================================== */ - - -/****************************************************************************** -* Copyright (C) 1994-2012 Lua.org, PUC-Rio. All rights reserved. -* -* Permission is hereby granted, free of charge, to any person obtaining -* a copy of this software and associated documentation files (the -* "Software"), to deal in the Software without restriction, including -* without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to -* permit persons to whom the Software is furnished to do so, subject to -* the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -******************************************************************************/ - - -#endif diff --git a/.lua/include/lua.hpp b/.lua/include/lua.hpp deleted file mode 100644 index ec417f594..000000000 --- a/.lua/include/lua.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// lua.hpp -// Lua header files for C++ -// <> not supplied automatically because Lua also compiles as C++ - -extern "C" { -#include "lua.h" -#include "lualib.h" -#include "lauxlib.h" -} diff --git a/.lua/include/luaconf.h b/.lua/include/luaconf.h deleted file mode 100644 index e2cb26163..000000000 --- a/.lua/include/luaconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* -** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $ -** Configuration file for Lua -** See Copyright Notice in lua.h -*/ - - -#ifndef lconfig_h -#define lconfig_h - -#include -#include - - -/* -** ================================================================== -** Search for "@@" to find all configurable definitions. -** =================================================================== -*/ - - -/* -@@ LUA_ANSI controls the use of non-ansi features. -** CHANGE it (define it) if you want Lua to avoid the use of any -** non-ansi feature or library. -*/ -#if defined(__STRICT_ANSI__) -#define LUA_ANSI -#endif - - -#if !defined(LUA_ANSI) && defined(_WIN32) -#define LUA_WIN -#endif - -#if defined(LUA_USE_LINUX) -#define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ -#define LUA_USE_READLINE /* needs some extra libraries */ -#endif - -#if defined(LUA_USE_MACOSX) -#define LUA_USE_POSIX -#define LUA_DL_DYLD /* does not need extra library */ -#endif - - - -/* -@@ LUA_USE_POSIX includes all functionallity listed as X/Open System -@* Interfaces Extension (XSI). -** CHANGE it (define it) if your system is XSI compatible. -*/ -#if defined(LUA_USE_POSIX) -#define LUA_USE_MKSTEMP -#define LUA_USE_ISATTY -#define LUA_USE_POPEN -#define LUA_USE_ULONGJMP -#endif - - -/* -@@ LUA_PATH and LUA_CPATH are the names of the environment variables that -@* Lua check to set its paths. -@@ LUA_INIT is the name of the environment variable that Lua -@* checks for initialization code. -** CHANGE them if you want different names. -*/ -#define LUA_PATH "LUA_PATH" -#define LUA_CPATH "LUA_CPATH" -#define LUA_INIT "LUA_INIT" - - -/* -@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for -@* Lua libraries. -@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for -@* C libraries. -** CHANGE them if your machine has a non-conventional directory -** hierarchy or if you want to install your libraries in -** non-conventional directories. -*/ -#if defined(_WIN32) -/* -** In Windows, any exclamation mark ('!') in the path is replaced by the -** path of the directory of the executable file of the current process. -*/ -#define LUA_LDIR "!\\lua\\" -#define LUA_CDIR "!\\" -#define LUA_PATH_DEFAULT \ - ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" -#define LUA_CPATH_DEFAULT \ - ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" - -#else -#define LUA_ROOT "/usr/local/" -#define LUA_LDIR LUA_ROOT "share/lua/5.1/" -#define LUA_CDIR LUA_ROOT "lib/lua/5.1/" -#define LUA_PATH_DEFAULT \ - "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" -#define LUA_CPATH_DEFAULT \ - "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" -#endif - - -/* -@@ LUA_DIRSEP is the directory separator (for submodules). -** CHANGE it if your machine does not use "/" as the directory separator -** and is not Windows. (On Windows Lua automatically uses "\".) -*/ -#if defined(_WIN32) -#define LUA_DIRSEP "\\" -#else -#define LUA_DIRSEP "/" -#endif - - -/* -@@ LUA_PATHSEP is the character that separates templates in a path. -@@ LUA_PATH_MARK is the string that marks the substitution points in a -@* template. -@@ LUA_EXECDIR in a Windows path is replaced by the executable's -@* directory. -@@ LUA_IGMARK is a mark to ignore all before it when bulding the -@* luaopen_ function name. -** CHANGE them if for some reason your system cannot use those -** characters. (E.g., if one of those characters is a common character -** in file/directory names.) Probably you do not need to change them. -*/ -#define LUA_PATHSEP ";" -#define LUA_PATH_MARK "?" -#define LUA_EXECDIR "!" -#define LUA_IGMARK "-" - - -/* -@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger. -** CHANGE that if ptrdiff_t is not adequate on your machine. (On most -** machines, ptrdiff_t gives a good choice between int or long.) -*/ -#define LUA_INTEGER ptrdiff_t - - -/* -@@ LUA_API is a mark for all core API functions. -@@ LUALIB_API is a mark for all standard library functions. -** CHANGE them if you need to define those functions in some special way. -** For instance, if you want to create one Windows DLL with the core and -** the libraries, you may want to use the following definition (define -** LUA_BUILD_AS_DLL to get it). -*/ -#if defined(LUA_BUILD_AS_DLL) - -#if defined(LUA_CORE) || defined(LUA_LIB) -#define LUA_API __declspec(dllexport) -#else -#define LUA_API __declspec(dllimport) -#endif - -#else - -#define LUA_API extern - -#endif - -/* more often than not the libs go together with the core */ -#define LUALIB_API LUA_API - - -/* -@@ LUAI_FUNC is a mark for all extern functions that are not to be -@* exported to outside modules. -@@ LUAI_DATA is a mark for all extern (const) variables that are not to -@* be exported to outside modules. -** CHANGE them if you need to mark them in some special way. Elf/gcc -** (versions 3.2 and later) mark them as "hidden" to optimize access -** when Lua is compiled as a shared library. -*/ -#if defined(luaall_c) -#define LUAI_FUNC static -#define LUAI_DATA /* empty */ - -#elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ - defined(__ELF__) -#define LUAI_FUNC __attribute__((visibility("hidden"))) extern -#define LUAI_DATA LUAI_FUNC - -#else -#define LUAI_FUNC extern -#define LUAI_DATA extern -#endif - - - -/* -@@ LUA_QL describes how error messages quote program elements. -** CHANGE it if you want a different appearance. -*/ -#define LUA_QL(x) "'" x "'" -#define LUA_QS LUA_QL("%s") - - -/* -@@ LUA_IDSIZE gives the maximum size for the description of the source -@* of a function in debug information. -** CHANGE it if you want a different size. -*/ -#define LUA_IDSIZE 60 - - -/* -** {================================================================== -** Stand-alone configuration -** =================================================================== -*/ - -#if defined(lua_c) || defined(luaall_c) - -/* -@@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that -@* is, whether we're running lua interactively). -** CHANGE it if you have a better definition for non-POSIX/non-Windows -** systems. -*/ -#if defined(LUA_USE_ISATTY) -#include -#define lua_stdin_is_tty() isatty(0) -#elif defined(LUA_WIN) -#include -#include -#define lua_stdin_is_tty() _isatty(_fileno(stdin)) -#else -#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ -#endif - - -/* -@@ LUA_PROMPT is the default prompt used by stand-alone Lua. -@@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua. -** CHANGE them if you want different prompts. (You can also change the -** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.) -*/ -#define LUA_PROMPT "> " -#define LUA_PROMPT2 ">> " - - -/* -@@ LUA_PROGNAME is the default name for the stand-alone Lua program. -** CHANGE it if your stand-alone interpreter has a different name and -** your system is not able to detect that name automatically. -*/ -#define LUA_PROGNAME "lua" - - -/* -@@ LUA_MAXINPUT is the maximum length for an input line in the -@* stand-alone interpreter. -** CHANGE it if you need longer lines. -*/ -#define LUA_MAXINPUT 512 - - -/* -@@ lua_readline defines how to show a prompt and then read a line from -@* the standard input. -@@ lua_saveline defines how to "save" a read line in a "history". -@@ lua_freeline defines how to free a line read by lua_readline. -** CHANGE them if you want to improve this functionality (e.g., by using -** GNU readline and history facilities). -*/ -#if defined(LUA_USE_READLINE) -#include -#include -#include -#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) -#define lua_saveline(L,idx) \ - if (lua_strlen(L,idx) > 0) /* non-empty line? */ \ - add_history(lua_tostring(L, idx)); /* add it to history */ -#define lua_freeline(L,b) ((void)L, free(b)) -#else -#define lua_readline(L,b,p) \ - ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ - fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ -#define lua_saveline(L,idx) { (void)L; (void)idx; } -#define lua_freeline(L,b) { (void)L; (void)b; } -#endif - -#endif - -/* }================================================================== */ - - -/* -@@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles -@* as a percentage. -** CHANGE it if you want the GC to run faster or slower (higher values -** mean larger pauses which mean slower collection.) You can also change -** this value dynamically. -*/ -#define LUAI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */ - - -/* -@@ LUAI_GCMUL defines the default speed of garbage collection relative to -@* memory allocation as a percentage. -** CHANGE it if you want to change the granularity of the garbage -** collection. (Higher values mean coarser collections. 0 represents -** infinity, where each step performs a full collection.) You can also -** change this value dynamically. -*/ -#define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ - - - -/* -@@ LUA_COMPAT_GETN controls compatibility with old getn behavior. -** CHANGE it (define it) if you want exact compatibility with the -** behavior of setn/getn in Lua 5.0. -*/ -#undef LUA_COMPAT_GETN - -/* -@@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib. -** CHANGE it to undefined as soon as you do not need a global 'loadlib' -** function (the function is still available as 'package.loadlib'). -*/ -#undef LUA_COMPAT_LOADLIB - -/* -@@ LUA_COMPAT_VARARG controls compatibility with old vararg feature. -** CHANGE it to undefined as soon as your programs use only '...' to -** access vararg parameters (instead of the old 'arg' table). -*/ -#define LUA_COMPAT_VARARG - -/* -@@ LUA_COMPAT_MOD controls compatibility with old math.mod function. -** CHANGE it to undefined as soon as your programs use 'math.fmod' or -** the new '%' operator instead of 'math.mod'. -*/ -#define LUA_COMPAT_MOD - -/* -@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting -@* facility. -** CHANGE it to 2 if you want the old behaviour, or undefine it to turn -** off the advisory error when nesting [[...]]. -*/ -#define LUA_COMPAT_LSTR 1 - -/* -@@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name. -** CHANGE it to undefined as soon as you rename 'string.gfind' to -** 'string.gmatch'. -*/ -#define LUA_COMPAT_GFIND - -/* -@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib' -@* behavior. -** CHANGE it to undefined as soon as you replace to 'luaL_register' -** your uses of 'luaL_openlib' -*/ -#define LUA_COMPAT_OPENLIB - - - -/* -@@ luai_apicheck is the assert macro used by the Lua-C API. -** CHANGE luai_apicheck if you want Lua to perform some checks in the -** parameters it gets from API calls. This may slow down the interpreter -** a bit, but may be quite useful when debugging C code that interfaces -** with Lua. A useful redefinition is to use assert.h. -*/ -#if defined(LUA_USE_APICHECK) -#include -#define luai_apicheck(L,o) { (void)L; assert(o); } -#else -#define luai_apicheck(L,o) { (void)L; } -#endif - - -/* -@@ LUAI_BITSINT defines the number of bits in an int. -** CHANGE here if Lua cannot automatically detect the number of bits of -** your machine. Probably you do not need to change this. -*/ -/* avoid overflows in comparison */ -#if INT_MAX-20 < 32760 -#define LUAI_BITSINT 16 -#elif INT_MAX > 2147483640L -/* int has at least 32 bits */ -#define LUAI_BITSINT 32 -#else -#error "you must define LUA_BITSINT with number of bits in an integer" -#endif - - -/* -@@ LUAI_UINT32 is an unsigned integer with at least 32 bits. -@@ LUAI_INT32 is an signed integer with at least 32 bits. -@@ LUAI_UMEM is an unsigned integer big enough to count the total -@* memory used by Lua. -@@ LUAI_MEM is a signed integer big enough to count the total memory -@* used by Lua. -** CHANGE here if for some weird reason the default definitions are not -** good enough for your machine. (The definitions in the 'else' -** part always works, but may waste space on machines with 64-bit -** longs.) Probably you do not need to change this. -*/ -#if LUAI_BITSINT >= 32 -#define LUAI_UINT32 unsigned int -#define LUAI_INT32 int -#define LUAI_MAXINT32 INT_MAX -#define LUAI_UMEM size_t -#define LUAI_MEM ptrdiff_t -#else -/* 16-bit ints */ -#define LUAI_UINT32 unsigned long -#define LUAI_INT32 long -#define LUAI_MAXINT32 LONG_MAX -#define LUAI_UMEM unsigned long -#define LUAI_MEM long -#endif - - -/* -@@ LUAI_MAXCALLS limits the number of nested calls. -** CHANGE it if you need really deep recursive calls. This limit is -** arbitrary; its only purpose is to stop infinite recursion before -** exhausting memory. -*/ -#define LUAI_MAXCALLS 20000 - - -/* -@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function -@* can use. -** CHANGE it if you need lots of (Lua) stack space for your C -** functions. This limit is arbitrary; its only purpose is to stop C -** functions to consume unlimited stack space. (must be smaller than -** -LUA_REGISTRYINDEX) -*/ -#define LUAI_MAXCSTACK 8000 - - - -/* -** {================================================================== -** CHANGE (to smaller values) the following definitions if your system -** has a small C stack. (Or you may want to change them to larger -** values if your system has a large C stack and these limits are -** too rigid for you.) Some of these constants control the size of -** stack-allocated arrays used by the compiler or the interpreter, while -** others limit the maximum number of recursive calls that the compiler -** or the interpreter can perform. Values too large may cause a C stack -** overflow for some forms of deep constructs. -** =================================================================== -*/ - - -/* -@@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and -@* syntactical nested non-terminals in a program. -*/ -#define LUAI_MAXCCALLS 200 - - -/* -@@ LUAI_MAXVARS is the maximum number of local variables per function -@* (must be smaller than 250). -*/ -#define LUAI_MAXVARS 200 - - -/* -@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function -@* (must be smaller than 250). -*/ -#define LUAI_MAXUPVALUES 60 - - -/* -@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. -*/ -#define LUAL_BUFFERSIZE BUFSIZ - -/* }================================================================== */ - - - - -/* -** {================================================================== -@@ LUA_NUMBER is the type of numbers in Lua. -** CHANGE the following definitions only if you want to build Lua -** with a number type different from double. You may also need to -** change lua_number2int & lua_number2integer. -** =================================================================== -*/ - -#define LUA_NUMBER_DOUBLE -#define LUA_NUMBER double - -/* -@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' -@* over a number. -*/ -#define LUAI_UACNUMBER double - - -/* -@@ LUA_NUMBER_SCAN is the format for reading numbers. -@@ LUA_NUMBER_FMT is the format for writing numbers. -@@ lua_number2str converts a number to a string. -@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. -@@ lua_str2number converts a string to a number. -*/ -#define LUA_NUMBER_SCAN "%lf" -#define LUA_NUMBER_FMT "%.14g" -#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) -#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ -#define lua_str2number(s,p) strtod((s), (p)) - - -/* -@@ The luai_num* macros define the primitive operations over numbers. -*/ -#if defined(LUA_CORE) -#include -#define luai_numadd(a,b) ((a)+(b)) -#define luai_numsub(a,b) ((a)-(b)) -#define luai_nummul(a,b) ((a)*(b)) -#define luai_numdiv(a,b) ((a)/(b)) -#define luai_nummod(a,b) ((a) - floor((a)/(b))*(b)) -#define luai_numpow(a,b) (pow(a,b)) -#define luai_numunm(a) (-(a)) -#define luai_numeq(a,b) ((a)==(b)) -#define luai_numlt(a,b) ((a)<(b)) -#define luai_numle(a,b) ((a)<=(b)) -#define luai_numisnan(a) (!luai_numeq((a), (a))) -#endif - - -/* -@@ lua_number2int is a macro to convert lua_Number to int. -@@ lua_number2integer is a macro to convert lua_Number to lua_Integer. -** CHANGE them if you know a faster way to convert a lua_Number to -** int (with any rounding method and without throwing errors) in your -** system. In Pentium machines, a naive typecast from double to int -** in C is extremely slow, so any alternative is worth trying. -*/ - -/* On a Pentium, resort to a trick */ -#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ - (defined(__i386) || defined (_M_IX86) || defined(__i386__)) - -/* On a Microsoft compiler, use assembler */ -#if defined(_MSC_VER) - -#define lua_number2int(i,d) __asm fld d __asm fistp i -#define lua_number2integer(i,n) lua_number2int(i, n) - -/* the next trick should work on any Pentium, but sometimes clashes - with a DirectX idiosyncrasy */ -#else - -union luai_Cast { double l_d; long l_l; }; -#define lua_number2int(i,d) \ - { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } -#define lua_number2integer(i,n) lua_number2int(i, n) - -#endif - - -/* this option always works, but may be slow */ -#else -#define lua_number2int(i,d) ((i)=(int)(d)) -#define lua_number2integer(i,d) ((i)=(lua_Integer)(d)) - -#endif - -/* }================================================================== */ - - -/* -@@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment. -** CHANGE it if your system requires alignments larger than double. (For -** instance, if your system supports long doubles and they must be -** aligned in 16-byte boundaries, then you should add long double in the -** union.) Probably you do not need to change this. -*/ -#define LUAI_USER_ALIGNMENT_T union { double u; void *s; long l; } - - -/* -@@ LUAI_THROW/LUAI_TRY define how Lua does exception handling. -** CHANGE them if you prefer to use longjmp/setjmp even with C++ -** or if want/don't to use _longjmp/_setjmp instead of regular -** longjmp/setjmp. By default, Lua handles errors with exceptions when -** compiling as C++ code, with _longjmp/_setjmp when asked to use them, -** and with longjmp/setjmp otherwise. -*/ -#if defined(__cplusplus) -/* C++ exceptions */ -#define LUAI_THROW(L,c) throw(c) -#define LUAI_TRY(L,c,a) try { a } catch(...) \ - { if ((c)->status == 0) (c)->status = -1; } -#define luai_jmpbuf int /* dummy variable */ - -#elif defined(LUA_USE_ULONGJMP) -/* in Unix, try _longjmp/_setjmp (more efficient) */ -#define LUAI_THROW(L,c) _longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf - -#else -/* default handling with long jumps */ -#define LUAI_THROW(L,c) longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf - -#endif - - -/* -@@ LUA_MAXCAPTURES is the maximum number of captures that a pattern -@* can do during pattern-matching. -** CHANGE it if you need more captures. This limit is arbitrary. -*/ -#define LUA_MAXCAPTURES 32 - - -/* -@@ lua_tmpnam is the function that the OS library uses to create a -@* temporary name. -@@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam. -** CHANGE them if you have an alternative to tmpnam (which is considered -** insecure) or if you want the original tmpnam anyway. By default, Lua -** uses tmpnam except when POSIX is available, where it uses mkstemp. -*/ -#if defined(loslib_c) || defined(luaall_c) - -#if defined(LUA_USE_MKSTEMP) -#include -#define LUA_TMPNAMBUFSIZE 32 -#define lua_tmpnam(b,e) { \ - strcpy(b, "/tmp/lua_XXXXXX"); \ - e = mkstemp(b); \ - if (e != -1) close(e); \ - e = (e == -1); } - -#else -#define LUA_TMPNAMBUFSIZE L_tmpnam -#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } -#endif - -#endif - - -/* -@@ lua_popen spawns a new process connected to the current one through -@* the file streams. -** CHANGE it if you have a way to implement it in your system. -*/ -#if defined(LUA_USE_POPEN) - -#define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m)) -#define lua_pclose(L,file) ((void)L, (pclose(file) != -1)) - -#elif defined(LUA_WIN) - -#define lua_popen(L,c,m) ((void)L, _popen(c,m)) -#define lua_pclose(L,file) ((void)L, (_pclose(file) != -1)) - -#else - -#define lua_popen(L,c,m) ((void)((void)c, m), \ - luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0) -#define lua_pclose(L,file) ((void)((void)L, file), 0) - -#endif - -/* -@@ LUA_DL_* define which dynamic-library system Lua should use. -** CHANGE here if Lua has problems choosing the appropriate -** dynamic-library system for your platform (either Windows' DLL, Mac's -** dyld, or Unix's dlopen). If your system is some kind of Unix, there -** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for -** it. To use dlopen you also need to adapt the src/Makefile (probably -** adding -ldl to the linker options), so Lua does not select it -** automatically. (When you change the makefile to add -ldl, you must -** also add -DLUA_USE_DLOPEN.) -** If you do not want any kind of dynamic library, undefine all these -** options. -** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD. -*/ -#if defined(LUA_USE_DLOPEN) -#define LUA_DL_DLOPEN -#endif - -#if defined(LUA_WIN) -#define LUA_DL_DLL -#endif - - -/* -@@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State -@* (the data goes just *before* the lua_State pointer). -** CHANGE (define) this if you really need that. This value must be -** a multiple of the maximum alignment required for your machine. -*/ -#define LUAI_EXTRASPACE 0 - - -/* -@@ luai_userstate* allow user-specific actions on threads. -** CHANGE them if you defined LUAI_EXTRASPACE and need to do something -** extra when a thread is created/deleted/resumed/yielded. -*/ -#define luai_userstateopen(L) ((void)L) -#define luai_userstateclose(L) ((void)L) -#define luai_userstatethread(L,L1) ((void)L) -#define luai_userstatefree(L) ((void)L) -#define luai_userstateresume(L,n) ((void)L) -#define luai_userstateyield(L,n) ((void)L) - - -/* -@@ LUA_INTFRMLEN is the length modifier for integer conversions -@* in 'string.format'. -@@ LUA_INTFRM_T is the integer type correspoding to the previous length -@* modifier. -** CHANGE them if your system supports long long or does not support long. -*/ - -#if defined(LUA_USELONGLONG) - -#define LUA_INTFRMLEN "ll" -#define LUA_INTFRM_T long long - -#else - -#define LUA_INTFRMLEN "l" -#define LUA_INTFRM_T long - -#endif - - - -/* =================================================================== */ - -/* -** Local configuration. You can use this space to add your redefinitions -** without modifying the main part of the file. -*/ - - - -#endif - diff --git a/.lua/include/lualib.h b/.lua/include/lualib.h deleted file mode 100644 index 469417f67..000000000 --- a/.lua/include/lualib.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $ -** Lua standard libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lualib_h -#define lualib_h - -#include "lua.h" - - -/* Key to file-handle type */ -#define LUA_FILEHANDLE "FILE*" - - -#define LUA_COLIBNAME "coroutine" -LUALIB_API int (luaopen_base) (lua_State *L); - -#define LUA_TABLIBNAME "table" -LUALIB_API int (luaopen_table) (lua_State *L); - -#define LUA_IOLIBNAME "io" -LUALIB_API int (luaopen_io) (lua_State *L); - -#define LUA_OSLIBNAME "os" -LUALIB_API int (luaopen_os) (lua_State *L); - -#define LUA_STRLIBNAME "string" -LUALIB_API int (luaopen_string) (lua_State *L); - -#define LUA_MATHLIBNAME "math" -LUALIB_API int (luaopen_math) (lua_State *L); - -#define LUA_DBLIBNAME "debug" -LUALIB_API int (luaopen_debug) (lua_State *L); - -#define LUA_LOADLIBNAME "package" -LUALIB_API int (luaopen_package) (lua_State *L); - - -/* open all previous libraries */ -LUALIB_API void (luaL_openlibs) (lua_State *L); - - - -#ifndef lua_assert -#define lua_assert(x) ((void)0) -#endif - - -#endif diff --git a/.lua/lib/liblua.a b/.lua/lib/liblua.a deleted file mode 100644 index 9e58e4c71..000000000 Binary files a/.lua/lib/liblua.a and /dev/null differ diff --git a/.lua/man/man1/lua.1 b/.lua/man/man1/lua.1 deleted file mode 100644 index 24809cc6c..000000000 --- a/.lua/man/man1/lua.1 +++ /dev/null @@ -1,163 +0,0 @@ -.\" $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $ -.TH LUA 1 "$Date: 2006/01/06 16:03:34 $" -.SH NAME -lua \- Lua interpreter -.SH SYNOPSIS -.B lua -[ -.I options -] -[ -.I script -[ -.I args -] -] -.SH DESCRIPTION -.B lua -is the stand-alone Lua interpreter. -It loads and executes Lua programs, -either in textual source form or -in precompiled binary form. -(Precompiled binaries are output by -.BR luac , -the Lua compiler.) -.B lua -can be used as a batch interpreter and also interactively. -.LP -The given -.I options -(see below) -are executed and then -the Lua program in file -.I script -is loaded and executed. -The given -.I args -are available to -.I script -as strings in a global table named -.BR arg . -If these arguments contain spaces or other characters special to the shell, -then they should be quoted -(but note that the quotes will be removed by the shell). -The arguments in -.B arg -start at 0, -which contains the string -.RI ' script '. -The index of the last argument is stored in -.BR arg.n . -The arguments given in the command line before -.IR script , -including the name of the interpreter, -are available in negative indices in -.BR arg . -.LP -At the very start, -before even handling the command line, -.B lua -executes the contents of the environment variable -.BR LUA_INIT , -if it is defined. -If the value of -.B LUA_INIT -is of the form -.RI '@ filename ', -then -.I filename -is executed. -Otherwise, the string is assumed to be a Lua statement and is executed. -.LP -Options start with -.B '\-' -and are described below. -You can use -.B "'\--'" -to signal the end of options. -.LP -If no arguments are given, -then -.B "\-v \-i" -is assumed when the standard input is a terminal; -otherwise, -.B "\-" -is assumed. -.LP -In interactive mode, -.B lua -prompts the user, -reads lines from the standard input, -and executes them as they are read. -If a line does not contain a complete statement, -then a secondary prompt is displayed and -lines are read until a complete statement is formed or -a syntax error is found. -So, one way to interrupt the reading of an incomplete statement is -to force a syntax error: -adding a -.B ';' -in the middle of a statement is a sure way of forcing a syntax error -(except inside multiline strings and comments; these must be closed explicitly). -If a line starts with -.BR '=' , -then -.B lua -displays the values of all the expressions in the remainder of the -line. The expressions must be separated by commas. -The primary prompt is the value of the global variable -.BR _PROMPT , -if this value is a string; -otherwise, the default prompt is used. -Similarly, the secondary prompt is the value of the global variable -.BR _PROMPT2 . -So, -to change the prompts, -set the corresponding variable to a string of your choice. -You can do that after calling the interpreter -or on the command line -(but in this case you have to be careful with quotes -if the prompt string contains a space; otherwise you may confuse the shell.) -The default prompts are "> " and ">> ". -.SH OPTIONS -.TP -.B \- -load and execute the standard input as a file, -that is, -not interactively, -even when the standard input is a terminal. -.TP -.BI \-e " stat" -execute statement -.IR stat . -You need to quote -.I stat -if it contains spaces, quotes, -or other characters special to the shell. -.TP -.B \-i -enter interactive mode after -.I script -is executed. -.TP -.BI \-l " name" -call -.BI require(' name ') -before executing -.IR script . -Typically used to load libraries. -.TP -.B \-v -show version information. -.SH "SEE ALSO" -.BR luac (1) -.br -http://www.lua.org/ -.SH DIAGNOSTICS -Error messages should be self explanatory. -.SH AUTHORS -R. Ierusalimschy, -L. H. de Figueiredo, -and -W. Celes -.\" EOF diff --git a/.lua/man/man1/luac.1 b/.lua/man/man1/luac.1 deleted file mode 100644 index d8146782d..000000000 --- a/.lua/man/man1/luac.1 +++ /dev/null @@ -1,136 +0,0 @@ -.\" $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $ -.TH LUAC 1 "$Date: 2006/01/06 16:03:34 $" -.SH NAME -luac \- Lua compiler -.SH SYNOPSIS -.B luac -[ -.I options -] [ -.I filenames -] -.SH DESCRIPTION -.B luac -is the Lua compiler. -It translates programs written in the Lua programming language -into binary files that can be later loaded and executed. -.LP -The main advantages of precompiling chunks are: -faster loading, -protecting source code from accidental user changes, -and -off-line syntax checking. -.LP -Pre-compiling does not imply faster execution -because in Lua chunks are always compiled into bytecodes before being executed. -.B luac -simply allows those bytecodes to be saved in a file for later execution. -.LP -Pre-compiled chunks are not necessarily smaller than the corresponding source. -The main goal in pre-compiling is faster loading. -.LP -The binary files created by -.B luac -are portable only among architectures with the same word size and byte order. -.LP -.B luac -produces a single output file containing the bytecodes -for all source files given. -By default, -the output file is named -.BR luac.out , -but you can change this with the -.B \-o -option. -.LP -In the command line, -you can mix -text files containing Lua source and -binary files containing precompiled chunks. -This is useful to combine several precompiled chunks, -even from different (but compatible) platforms, -into a single precompiled chunk. -.LP -You can use -.B "'\-'" -to indicate the standard input as a source file -and -.B "'\--'" -to signal the end of options -(that is, -all remaining arguments will be treated as files even if they start with -.BR "'\-'" ). -.LP -The internal format of the binary files produced by -.B luac -is likely to change when a new version of Lua is released. -So, -save the source files of all Lua programs that you precompile. -.LP -.SH OPTIONS -Options must be separate. -.TP -.B \-l -produce a listing of the compiled bytecode for Lua's virtual machine. -Listing bytecodes is useful to learn about Lua's virtual machine. -If no files are given, then -.B luac -loads -.B luac.out -and lists its contents. -.TP -.BI \-o " file" -output to -.IR file , -instead of the default -.BR luac.out . -(You can use -.B "'\-'" -for standard output, -but not on platforms that open standard output in text mode.) -The output file may be a source file because -all files are loaded before the output file is written. -Be careful not to overwrite precious files. -.TP -.B \-p -load files but do not generate any output file. -Used mainly for syntax checking and for testing precompiled chunks: -corrupted files will probably generate errors when loaded. -Lua always performs a thorough integrity test on precompiled chunks. -Bytecode that passes this test is completely safe, -in the sense that it will not break the interpreter. -However, -there is no guarantee that such code does anything sensible. -(None can be given, because the halting problem is unsolvable.) -If no files are given, then -.B luac -loads -.B luac.out -and tests its contents. -No messages are displayed if the file passes the integrity test. -.TP -.B \-s -strip debug information before writing the output file. -This saves some space in very large chunks, -but if errors occur when running a stripped chunk, -then the error messages may not contain the full information they usually do. -For instance, -line numbers and names of local variables are lost. -.TP -.B \-v -show version information. -.SH FILES -.TP 15 -.B luac.out -default output file -.SH "SEE ALSO" -.BR lua (1) -.br -http://www.lua.org/ -.SH DIAGNOSTICS -Error messages should be self explanatory. -.SH AUTHORS -L. H. de Figueiredo, -R. Ierusalimschy and -W. Celes -.\" EOF diff --git a/.luarocks/bin/luarocks b/.luarocks/bin/luarocks deleted file mode 100755 index 4e345f673..000000000 --- a/.luarocks/bin/luarocks +++ /dev/null @@ -1,38 +0,0 @@ -#!/home/runner/work/rocks-binaries/rocks-binaries/.lua/bin/lua -package.loaded["luarocks.core.hardcoded"] = { SYSCONFDIR = [[/home/runner/work/rocks-binaries/rocks-binaries/.luarocks/etc/luarocks]] } -package.path=[[/home/runner/work/rocks-binaries/rocks-binaries/.luarocks/share/lua/5.1/?.lua;]] .. package.path -local list = package.searchers or package.loaders; table.insert(list, 1, function(name) if name:match("^luarocks%.") then return loadfile([[/home/runner/work/rocks-binaries/rocks-binaries/.luarocks/share/lua/5.1/]] .. name:gsub([[%.]], [[/]]) .. [[.lua]]) end end) - --- Load cfg first so that the loader knows it is running inside LuaRocks -local cfg = require("luarocks.core.cfg") - -local loader = require("luarocks.loader") -local cmd = require("luarocks.cmd") - -local description = "LuaRocks main command-line interface" - -local commands = { - init = "luarocks.cmd.init", - pack = "luarocks.cmd.pack", - unpack = "luarocks.cmd.unpack", - build = "luarocks.cmd.build", - install = "luarocks.cmd.install", - search = "luarocks.cmd.search", - list = "luarocks.cmd.list", - remove = "luarocks.cmd.remove", - make = "luarocks.cmd.make", - download = "luarocks.cmd.download", - path = "luarocks.cmd.path", - show = "luarocks.cmd.show", - new_version = "luarocks.cmd.new_version", - lint = "luarocks.cmd.lint", - write_rockspec = "luarocks.cmd.write_rockspec", - purge = "luarocks.cmd.purge", - doc = "luarocks.cmd.doc", - upload = "luarocks.cmd.upload", - config = "luarocks.cmd.config", - which = "luarocks.cmd.which", - test = "luarocks.cmd.test", -} - -cmd.run_command(description, commands, "luarocks.cmd.external", ...) diff --git a/.luarocks/bin/luarocks-admin b/.luarocks/bin/luarocks-admin deleted file mode 100755 index 89a986a6c..000000000 --- a/.luarocks/bin/luarocks-admin +++ /dev/null @@ -1,21 +0,0 @@ -#!/home/runner/work/rocks-binaries/rocks-binaries/.lua/bin/lua -package.loaded["luarocks.core.hardcoded"] = { SYSCONFDIR = [[/home/runner/work/rocks-binaries/rocks-binaries/.luarocks/etc/luarocks]] } -package.path=[[/home/runner/work/rocks-binaries/rocks-binaries/.luarocks/share/lua/5.1/?.lua;]] .. package.path -local list = package.searchers or package.loaders; table.insert(list, 1, function(name) if name:match("^luarocks%.") then return loadfile([[/home/runner/work/rocks-binaries/rocks-binaries/.luarocks/share/lua/5.1/]] .. name:gsub([[%.]], [[/]]) .. [[.lua]]) end end) - --- Load cfg first so that luarocks.loader knows it is running inside LuaRocks -local cfg = require("luarocks.core.cfg") - -local loader = require("luarocks.loader") -local cmd = require("luarocks.cmd") - -local description = "LuaRocks repository administration interface" - -local commands = { - make_manifest = "luarocks.admin.cmd.make_manifest", - add = "luarocks.admin.cmd.add", - remove = "luarocks.admin.cmd.remove", - refresh_cache = "luarocks.admin.cmd.refresh_cache", -} - -cmd.run_command(description, commands, "luarocks.admin.cmd.external", ...) diff --git a/.luarocks/etc/luarocks/config-5.1.lua b/.luarocks/etc/luarocks/config-5.1.lua deleted file mode 100644 index cdaf4d7ca..000000000 --- a/.luarocks/etc/luarocks/config-5.1.lua +++ /dev/null @@ -1,11 +0,0 @@ --- LuaRocks configuration - -rocks_trees = { - { name = "user", root = home .. "/.luarocks" }; - { name = "system", root = "/home/runner/work/rocks-binaries/rocks-binaries/.luarocks" }; -} -lua_interpreter = "lua"; -variables = { - LUA_DIR = "/home/runner/work/rocks-binaries/rocks-binaries/.lua"; - LUA_BINDIR = "/home/runner/work/rocks-binaries/rocks-binaries/.lua/bin"; -} diff --git a/.luarocks/share/lua/5.1/luarocks/admin/cache.lua b/.luarocks/share/lua/5.1/luarocks/admin/cache.lua deleted file mode 100644 index 10b273eaf..000000000 --- a/.luarocks/share/lua/5.1/luarocks/admin/cache.lua +++ /dev/null @@ -1,88 +0,0 @@ - ---- Module handling the LuaRocks local cache. --- Adds a rock or rockspec to a rocks server. -local cache = {} - -local fs = require("luarocks.fs") -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.dir") -local util = require("luarocks.util") - -function cache.get_upload_server(server) - if not server then server = cfg.upload_server end - if not server then - return nil, "No server specified and no default configured with upload_server." - end - return server, cfg.upload_servers and cfg.upload_servers[server] -end - -function cache.get_server_urls(server, upload_server) - local download_url = server - local login_url = nil - if upload_server then - if upload_server.rsync then download_url = "rsync://"..upload_server.rsync - elseif upload_server.http then download_url = "http://"..upload_server.http - elseif upload_server.ftp then download_url = "ftp://"..upload_server.ftp - end - - if upload_server.ftp then login_url = "ftp://"..upload_server.ftp - elseif upload_server.sftp then login_url = "sftp://"..upload_server.sftp - end - end - return download_url, login_url -end - -function cache.split_server_url(url, user, password) - local protocol, server_path = dir.split_url(url) - if protocol == "file" then - server_path = fs.absolute_name(server_path) - elseif server_path:match("@") then - local credentials - credentials, server_path = server_path:match("([^@]*)@(.*)") - if credentials:match(":") then - user, password = credentials:match("([^:]*):(.*)") - else - user = credentials - end - end - local local_cache = cfg.local_cache .. "/" .. server_path:gsub("[\\/]", "_") - return local_cache, protocol, server_path, user, password -end - -local function download_cache(protocol, server_path, user, password) - os.remove("index.html") - -- TODO abstract away explicit 'wget' call - if protocol == "rsync" then - local srv, path = server_path:match("([^/]+)(/.+)") - return fs.execute(cfg.variables.RSYNC.." "..cfg.variables.RSYNCFLAGS.." -e ssh "..user.."@"..srv..":"..path.."/ ./") - elseif protocol == "file" then - return fs.copy_contents(server_path, ".") - else - local login_info = "" - if user then login_info = " --user="..user end - if password then login_info = login_info .. " --password="..password end - return fs.execute(cfg.variables.WGET.." --no-cache -q -m -np -nd "..protocol.."://"..server_path..login_info) - end -end - -function cache.refresh_local_cache(url, given_user, given_password) - local local_cache, protocol, server_path, user, password = cache.split_server_url(url, given_user, given_password) - - local ok, err = fs.make_dir(local_cache) - if not ok then - return nil, "Failed creating local cache dir: "..err - end - - fs.change_dir(local_cache) - - util.printout("Refreshing cache "..local_cache.."...") - - ok = download_cache(protocol, server_path, user, password) - if not ok then - return nil, "Failed downloading cache." - end - - return local_cache, protocol, server_path, user, password -end - -return cache diff --git a/.luarocks/share/lua/5.1/luarocks/admin/cmd/add.lua b/.luarocks/share/lua/5.1/luarocks/admin/cmd/add.lua deleted file mode 100644 index aa444c506..000000000 --- a/.luarocks/share/lua/5.1/luarocks/admin/cmd/add.lua +++ /dev/null @@ -1,134 +0,0 @@ - ---- Module implementing the luarocks-admin "add" command. --- Adds a rock or rockspec to a rocks server. -local add = {} - -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local dir = require("luarocks.dir") -local writer = require("luarocks.manif.writer") -local fs = require("luarocks.fs") -local cache = require("luarocks.admin.cache") -local index = require("luarocks.admin.index") - -function add.add_to_parser(parser) - local cmd = parser:command("add", "Add a rock or rockspec to a rocks server.", util.see_also()) - - cmd:argument("rock", "A local rockspec or rock file.") - :args("+") - - cmd:option("--server", "The server to use. If not given, the default server ".. - "set in the upload_server variable from the configuration file is used instead.") - :target("add_server") - cmd:flag("--no-refresh", "Do not refresh the local cache prior to ".. - "generation of the updated manifest.") - cmd:flag("--index", "Produce an index.html file for the manifest. This ".. - "flag is automatically set if an index.html file already exists.") -end - -local function zip_manifests() - for ver in util.lua_versions() do - local file = "manifest-"..ver - local zip = file..".zip" - fs.delete(dir.path(fs.current_dir(), zip)) - fs.zip(zip, file) - end -end - -local function add_files_to_server(refresh, rockfiles, server, upload_server, do_index) - assert(type(refresh) == "boolean" or not refresh) - assert(type(rockfiles) == "table") - assert(type(server) == "string") - assert(type(upload_server) == "table" or not upload_server) - - local download_url, login_url = cache.get_server_urls(server, upload_server) - local at = fs.current_dir() - local refresh_fn = refresh and cache.refresh_local_cache or cache.split_server_url - - local local_cache, protocol, server_path, user, password = refresh_fn(download_url, cfg.upload_user, cfg.upload_password) - if not local_cache then - return nil, protocol - end - - if not login_url then - login_url = protocol.."://"..server_path - end - - local ok, err = fs.change_dir(at) - if not ok then return nil, err end - - local files = {} - 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) - fs.copy(absolute, local_cache, "read") - table.insert(files, dir.base_name(absolute)) - else - util.printerr("File "..rockfile.." not found") - end - end - if #files == 0 then - return nil, "No files found" - end - - local ok, err = fs.change_dir(local_cache) - if not ok then return nil, err end - - util.printout("Updating manifest...") - writer.make_manifest(local_cache, "one", true) - - zip_manifests() - - if fs.exists("index.html") then - do_index = true - end - - if do_index then - util.printout("Updating index.html...") - index.make_index(local_cache) - end - - local login_info = "" - if user then login_info = " -u "..user end - if password then login_info = login_info..":"..password end - if not login_url:match("/$") then - login_url = login_url .. "/" - end - - if do_index then - table.insert(files, "index.html") - end - table.insert(files, "manifest") - for ver in util.lua_versions() do - table.insert(files, "manifest-"..ver) - table.insert(files, "manifest-"..ver..".zip") - end - - -- TODO abstract away explicit 'curl' call - - local cmd - if protocol == "rsync" then - local srv, path = server_path:match("([^/]+)(/.+)") - cmd = cfg.variables.RSYNC.." "..cfg.variables.RSYNCFLAGS.." -e ssh "..local_cache.."/ "..user.."@"..srv..":"..path.."/" - elseif protocol == "file" then - return fs.copy_contents(local_cache, server_path) - elseif upload_server and upload_server.sftp then - local part1, part2 = upload_server.sftp:match("^([^/]*)/(.*)$") - cmd = cfg.variables.SCP.." "..table.concat(files, " ").." "..user.."@"..part1..":/"..part2 - else - cmd = cfg.variables.CURL.." "..login_info.." -T '{"..table.concat(files, ",").."}' "..login_url - end - - util.printout(cmd) - return fs.execute(cmd) -end - -function add.command(args) - local server, server_table = cache.get_upload_server(args.add_server or args.server) - if not server then return nil, server_table end - return add_files_to_server(not args.no_refresh, args.rock, server, server_table, args.index) -end - - -return add diff --git a/.luarocks/share/lua/5.1/luarocks/admin/cmd/make_manifest.lua b/.luarocks/share/lua/5.1/luarocks/admin/cmd/make_manifest.lua deleted file mode 100644 index 18f74b5db..000000000 --- a/.luarocks/share/lua/5.1/luarocks/admin/cmd/make_manifest.lua +++ /dev/null @@ -1,50 +0,0 @@ - ---- Module implementing the luarocks-admin "make_manifest" command. --- Compile a manifest file for a repository. -local make_manifest = {} - -local writer = require("luarocks.manif.writer") -local index = require("luarocks.admin.index") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local deps = require("luarocks.deps") -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") - -function make_manifest.add_to_parser(parser) - local cmd = parser:command("make_manifest", "Compile a manifest file for a repository.", util.see_also()) - - cmd:argument("repository", "Local repository pathname.") - :args("?") - - cmd:flag("--local-tree", "If given, do not write versioned versions of the manifest file.\n".. - "Use this when rebuilding the manifest of a local rocks tree.") - util.deps_mode_option(cmd) -end - ---- Driver function for "make_manifest" command. --- @return boolean or (nil, string): True if manifest was generated, --- or nil and an error message. -function make_manifest.command(args) - local repo = args.repository or cfg.rocks_dir - - util.printout("Making manifest for "..repo) - - if repo:match("/lib/luarocks") and not args.local_tree then - util.warning("This looks like a local rocks tree, but you did not pass --local-tree.") - end - - local ok, err = writer.make_manifest(repo, deps.get_deps_mode(args), not args.local_tree) - if ok and not args.local_tree then - util.printout("Generating index.html for "..repo) - index.make_index(repo) - end - if args.local_tree then - for luaver in util.lua_versions() do - fs.delete(dir.path(repo, "manifest-"..luaver)) - end - end - return ok, err -end - -return make_manifest diff --git a/.luarocks/share/lua/5.1/luarocks/admin/cmd/refresh_cache.lua b/.luarocks/share/lua/5.1/luarocks/admin/cmd/refresh_cache.lua deleted file mode 100644 index f8d51893f..000000000 --- a/.luarocks/share/lua/5.1/luarocks/admin/cmd/refresh_cache.lua +++ /dev/null @@ -1,31 +0,0 @@ - ---- Module implementing the luarocks-admin "refresh_cache" command. -local refresh_cache = {} - -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local cache = require("luarocks.admin.cache") - -function refresh_cache.add_to_parser(parser) - local cmd = parser:command("refresh_cache", "Refresh local cache of a remote rocks server.", util.see_also()) - - cmd:option("--from", "The server to use. If not given, the default server ".. - "set in the upload_server variable from the configuration file is used instead.") - :argname("") -end - -function refresh_cache.command(args) - local server, upload_server = cache.get_upload_server(args.server) - if not server then return nil, upload_server end - local download_url = cache.get_server_urls(server, upload_server) - - local ok, err = cache.refresh_local_cache(download_url, cfg.upload_user, cfg.upload_password) - if not ok then - return nil, err - else - return true - end -end - - -return refresh_cache diff --git a/.luarocks/share/lua/5.1/luarocks/admin/cmd/remove.lua b/.luarocks/share/lua/5.1/luarocks/admin/cmd/remove.lua deleted file mode 100644 index 5d4c5fbb5..000000000 --- a/.luarocks/share/lua/5.1/luarocks/admin/cmd/remove.lua +++ /dev/null @@ -1,87 +0,0 @@ - ---- Module implementing the luarocks-admin "remove" command. --- Removes a rock or rockspec from a rocks server. -local admin_remove = {} - -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local dir = require("luarocks.dir") -local writer = require("luarocks.manif.writer") -local fs = require("luarocks.fs") -local cache = require("luarocks.admin.cache") -local index = require("luarocks.admin.index") - -function admin_remove.add_to_parser(parser) - local cmd = parser:command("remove", "Remove a rock or rockspec from a rocks server.", util.see_also()) - - cmd:argument("rock", "A local rockspec or rock file.") - :args("+") - - cmd:option("--server", "The server to use. If not given, the default server ".. - "set in the upload_server variable from the configuration file is used instead.") - cmd:flag("--no-refresh", "Do not refresh the local cache prior to ".. - "generation of the updated manifest.") -end - -local function remove_files_from_server(refresh, rockfiles, server, upload_server) - assert(type(refresh) == "boolean" or not refresh) - assert(type(rockfiles) == "table") - assert(type(server) == "string") - assert(type(upload_server) == "table" or not upload_server) - - local download_url, login_url = cache.get_server_urls(server, upload_server) - local at = fs.current_dir() - local refresh_fn = refresh and cache.refresh_local_cache or cache.split_server_url - - local local_cache, protocol, server_path, user, password = refresh_fn(download_url, cfg.upload_user, cfg.upload_password) - if not local_cache then - return nil, protocol - end - if protocol ~= "rsync" then - return nil, "This command requires 'rsync', check your configuration." - end - - local ok, err = fs.change_dir(at) - if not ok then return nil, err end - - local nr_files = 0 - for _, rockfile in ipairs(rockfiles) do - local basename = dir.base_name(rockfile) - local file = dir.path(local_cache, basename) - util.printout("Removing file "..file.."...") - fs.delete(file) - if not fs.exists(file) then - nr_files = nr_files + 1 - else - util.printerr("Failed removing "..file) - end - end - if nr_files == 0 then - return nil, "No files removed." - end - - local ok, err = fs.change_dir(local_cache) - if not ok then return nil, err end - - util.printout("Updating manifest...") - writer.make_manifest(local_cache, "one", true) - util.printout("Updating index.html...") - index.make_index(local_cache) - - local srv, path = server_path:match("([^/]+)(/.+)") - local cmd = cfg.variables.RSYNC.." "..cfg.variables.RSYNCFLAGS.." --delete -e ssh "..local_cache.."/ "..user.."@"..srv..":"..path.."/" - - util.printout(cmd) - fs.execute(cmd) - - return true -end - -function admin_remove.command(args) - local server, server_table = cache.get_upload_server(args.server) - if not server then return nil, server_table end - return remove_files_from_server(not args.no_refresh, args.rock, server, server_table) -end - - -return admin_remove diff --git a/.luarocks/share/lua/5.1/luarocks/admin/index.lua b/.luarocks/share/lua/5.1/luarocks/admin/index.lua deleted file mode 100644 index 64c8c1eb3..000000000 --- a/.luarocks/share/lua/5.1/luarocks/admin/index.lua +++ /dev/null @@ -1,185 +0,0 @@ - ---- Module which builds the index.html page to be used in rocks servers. -local index = {} - -local util = require("luarocks.util") -local fs = require("luarocks.fs") -local vers = require("luarocks.core.vers") -local persist = require("luarocks.persist") -local dir = require("luarocks.dir") -local manif = require("luarocks.manif") - -local ext_url_target = ' target="_blank"' - -local index_header = [[ - - - -Available rocks - - - - -

Available rocks

-

-Lua modules available from this location for use with LuaRocks: -

- -]] - -local index_package_begin = [[ - - - -]] - -local index_footer_begin = [[ -
-

$package - $summary
-

$detailed
-$externaldependencies -latest sources $homepage | License: $license

-
-]] - -local index_package_end = [[ -
-

-manifest file -]] -local index_manifest_ver = [[ -• Lua $VER manifest file (zip) -]] -local index_footer_end = [[ -

- - -]] - -function index.format_external_dependencies(rockspec) - if rockspec.external_dependencies then - local deplist = {} - local listed_set = {} - local plats = nil - for name, desc in util.sortedpairs(rockspec.external_dependencies) do - if name ~= "platforms" then - table.insert(deplist, name:lower()) - listed_set[name] = true - else - plats = desc - end - end - if plats then - for plat, entries in util.sortedpairs(plats) do - for name, desc in util.sortedpairs(entries) do - if not listed_set[name] then - table.insert(deplist, name:lower() .. " (on "..plat..")") - end - end - end - end - return '

External dependencies: ' .. table.concat(deplist, ', ').. '

' - else - return "" - end -end - -function index.make_index(repo) - if not fs.is_dir(repo) then - return nil, "Cannot access repository at "..repo - end - local manifest = manif.load_manifest(repo) - local out = io.open(dir.path(repo, "index.html"), "w") - - out:write(index_header) - for package, version_list in util.sortedpairs(manifest.repository) do - local latest_rockspec = nil - local output = index_package_begin - for version, data in util.sortedpairs(version_list, vers.compare_versions) do - local versions = {} - output = output..version..': ' - table.sort(data, function(a,b) return a.arch < b.arch end) - for _, item in ipairs(data) do - local file - if item.arch == 'rockspec' then - file = ("%s-%s.rockspec"):format(package, version) - if not latest_rockspec then latest_rockspec = file end - else - file = ("%s-%s.%s.rock"):format(package, version, item.arch) - end - table.insert(versions, ''..item.arch..'') - end - output = output .. table.concat(versions, ', ') .. '
' - end - output = output .. index_package_end - if latest_rockspec then - local rockspec = persist.load_into_table(dir.path(repo, latest_rockspec)) - local descript = rockspec.description or {} - local vars = { - anchor = package, - package = rockspec.package, - original = rockspec.source.url, - summary = descript.summary or "", - detailed = descript.detailed or "", - license = descript.license or "N/A", - homepage = descript.homepage and ('| project homepage') or "", - externaldependencies = index.format_external_dependencies(rockspec) - } - vars.detailed = vars.detailed:gsub("\n\n", "

"):gsub("%s+", " ") - vars.detailed = vars.detailed:gsub("(https?://[a-zA-Z0-9%.%%-_%+%[%]=%?&/$@;:]+)", '%1') - output = output:gsub("$(%w+)", vars) - else - output = output:gsub("$anchor", package) - output = output:gsub("$package", package) - output = output:gsub("$(%w+)", "") - end - out:write(output) - end - out:write(index_footer_begin) - for ver in util.lua_versions() do - out:write((index_manifest_ver:gsub("$VER", ver))) - end - out:write(index_footer_end) - out:close() -end - -return index diff --git a/.luarocks/share/lua/5.1/luarocks/argparse.lua b/.luarocks/share/lua/5.1/luarocks/argparse.lua deleted file mode 100644 index 2c2585ddb..000000000 --- a/.luarocks/share/lua/5.1/luarocks/argparse.lua +++ /dev/null @@ -1,2103 +0,0 @@ --- The MIT License (MIT) - --- Copyright (c) 2013 - 2018 Peter Melnichenko --- 2019 Paul Ouellette - --- Permission is hereby granted, free of charge, to any person obtaining a copy of --- this software and associated documentation files (the "Software"), to deal in --- the Software without restriction, including without limitation the rights to --- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of --- the Software, and to permit persons to whom the Software is furnished to do so, --- subject to the following conditions: - --- The above copyright notice and this permission notice shall be included in all --- copies or substantial portions of the Software. - --- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS --- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR --- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER --- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN --- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -local function deep_update(t1, t2) - for k, v in pairs(t2) do - if type(v) == "table" then - v = deep_update({}, v) - end - - t1[k] = v - end - - return t1 -end - --- A property is a tuple {name, callback}. --- properties.args is number of properties that can be set as arguments --- when calling an object. -local function class(prototype, properties, parent) - -- Class is the metatable of its instances. - local cl = {} - cl.__index = cl - - if parent then - cl.__prototype = deep_update(deep_update({}, parent.__prototype), prototype) - else - cl.__prototype = prototype - end - - if properties then - local names = {} - - -- Create setter methods and fill set of property names. - for _, property in ipairs(properties) do - local name, callback = property[1], property[2] - - cl[name] = function(self, value) - if not callback(self, value) then - self["_" .. name] = value - end - - return self - end - - names[name] = true - end - - function cl.__call(self, ...) - -- When calling an object, if the first argument is a table, - -- interpret keys as property names, else delegate arguments - -- to corresponding setters in order. - if type((...)) == "table" then - for name, value in pairs((...)) do - if names[name] then - self[name](self, value) - end - end - else - local nargs = select("#", ...) - - for i, property in ipairs(properties) do - if i > nargs or i > properties.args then - break - end - - local arg = select(i, ...) - - if arg ~= nil then - self[property[1]](self, arg) - end - end - end - - return self - end - end - - -- If indexing class fails, fallback to its parent. - local class_metatable = {} - class_metatable.__index = parent - - function class_metatable.__call(self, ...) - -- Calling a class returns its instance. - -- Arguments are delegated to the instance. - local object = deep_update({}, self.__prototype) - setmetatable(object, self) - return object(...) - end - - return setmetatable(cl, class_metatable) -end - -local function typecheck(name, types, value) - for _, type_ in ipairs(types) do - if type(value) == type_ then - return true - end - end - - error(("bad property '%s' (%s expected, got %s)"):format(name, table.concat(types, " or "), type(value))) -end - -local function typechecked(name, ...) - local types = {...} - return {name, function(_, value) typecheck(name, types, value) end} -end - -local multiname = {"name", function(self, value) - typecheck("name", {"string"}, value) - - for alias in value:gmatch("%S+") do - self._name = self._name or alias - table.insert(self._aliases, alias) - table.insert(self._public_aliases, alias) - -- If alias contains '_', accept '-' also. - if alias:find("_", 1, true) then - table.insert(self._aliases, (alias:gsub("_", "-"))) - end - end - - -- Do not set _name as with other properties. - return true -end} - -local multiname_hidden = {"hidden_name", function(self, value) - typecheck("hidden_name", {"string"}, value) - - for alias in value:gmatch("%S+") do - table.insert(self._aliases, alias) - if alias:find("_", 1, true) then - table.insert(self._aliases, (alias:gsub("_", "-"))) - end - end - - return true -end} - -local function parse_boundaries(str) - if tonumber(str) then - return tonumber(str), tonumber(str) - end - - if str == "*" then - return 0, math.huge - end - - if str == "+" then - return 1, math.huge - end - - if str == "?" then - return 0, 1 - end - - if str:match "^%d+%-%d+$" then - local min, max = str:match "^(%d+)%-(%d+)$" - return tonumber(min), tonumber(max) - end - - if str:match "^%d+%+$" then - local min = str:match "^(%d+)%+$" - return tonumber(min), math.huge - end -end - -local function boundaries(name) - return {name, function(self, value) - typecheck(name, {"number", "string"}, value) - - local min, max = parse_boundaries(value) - - if not min then - error(("bad property '%s'"):format(name)) - end - - self["_min" .. name], self["_max" .. name] = min, max - end} -end - -local actions = {} - -local option_action = {"action", function(_, value) - typecheck("action", {"function", "string"}, value) - - if type(value) == "string" and not actions[value] then - error(("unknown action '%s'"):format(value)) - end -end} - -local option_init = {"init", function(self) - self._has_init = true -end} - -local option_default = {"default", function(self, value) - if type(value) ~= "string" then - self._init = value - self._has_init = true - return true - end -end} - -local add_help = {"add_help", function(self, value) - typecheck("add_help", {"boolean", "string", "table"}, value) - - if self._help_option_idx then - table.remove(self._options, self._help_option_idx) - self._help_option_idx = nil - end - - if value then - local help = self:flag() - :description "Show this help message and exit." - :action(function() - print(self:get_help()) - os.exit(0) - end) - - if value ~= true then - help = help(value) - end - - if not help._name then - help "-h" "--help" - end - - self._help_option_idx = #self._options - end -end} - -local Parser = class({ - _arguments = {}, - _options = {}, - _commands = {}, - _mutexes = {}, - _groups = {}, - _require_command = true, - _handle_options = true -}, { - args = 3, - typechecked("name", "string"), - typechecked("description", "string"), - typechecked("epilog", "string"), - typechecked("usage", "string"), - typechecked("help", "string"), - typechecked("require_command", "boolean"), - typechecked("handle_options", "boolean"), - typechecked("action", "function"), - typechecked("command_target", "string"), - typechecked("help_vertical_space", "number"), - typechecked("usage_margin", "number"), - typechecked("usage_max_width", "number"), - typechecked("help_usage_margin", "number"), - typechecked("help_description_margin", "number"), - typechecked("help_max_width", "number"), - add_help -}) - -local Command = class({ - _aliases = {}, - _public_aliases = {} -}, { - args = 3, - multiname, - typechecked("description", "string"), - typechecked("epilog", "string"), - multiname_hidden, - typechecked("summary", "string"), - typechecked("target", "string"), - typechecked("usage", "string"), - typechecked("help", "string"), - typechecked("require_command", "boolean"), - typechecked("handle_options", "boolean"), - typechecked("action", "function"), - typechecked("command_target", "string"), - typechecked("help_vertical_space", "number"), - typechecked("usage_margin", "number"), - typechecked("usage_max_width", "number"), - typechecked("help_usage_margin", "number"), - typechecked("help_description_margin", "number"), - typechecked("help_max_width", "number"), - typechecked("hidden", "boolean"), - add_help -}, Parser) - -local Argument = class({ - _minargs = 1, - _maxargs = 1, - _mincount = 1, - _maxcount = 1, - _defmode = "unused", - _show_default = true -}, { - args = 5, - typechecked("name", "string"), - typechecked("description", "string"), - option_default, - typechecked("convert", "function", "table"), - boundaries("args"), - typechecked("target", "string"), - typechecked("defmode", "string"), - typechecked("show_default", "boolean"), - typechecked("argname", "string", "table"), - typechecked("choices", "table"), - typechecked("hidden", "boolean"), - option_action, - option_init -}) - -local Option = class({ - _aliases = {}, - _public_aliases = {}, - _mincount = 0, - _overwrite = true -}, { - args = 6, - multiname, - typechecked("description", "string"), - option_default, - typechecked("convert", "function", "table"), - boundaries("args"), - boundaries("count"), - multiname_hidden, - typechecked("target", "string"), - typechecked("defmode", "string"), - typechecked("show_default", "boolean"), - typechecked("overwrite", "boolean"), - typechecked("argname", "string", "table"), - typechecked("choices", "table"), - typechecked("hidden", "boolean"), - option_action, - option_init -}, Argument) - -function Parser:_inherit_property(name, default) - local element = self - - while true do - local value = element["_" .. name] - - if value ~= nil then - return value - end - - if not element._parent then - return default - end - - element = element._parent - end -end - -function Argument:_get_argument_list() - local buf = {} - local i = 1 - - while i <= math.min(self._minargs, 3) do - local argname = self:_get_argname(i) - - if self._default and self._defmode:find "a" then - argname = "[" .. argname .. "]" - end - - table.insert(buf, argname) - i = i+1 - end - - while i <= math.min(self._maxargs, 3) do - table.insert(buf, "[" .. self:_get_argname(i) .. "]") - i = i+1 - - if self._maxargs == math.huge then - break - end - end - - if i < self._maxargs then - table.insert(buf, "...") - end - - return buf -end - -function Argument:_get_usage() - local usage = table.concat(self:_get_argument_list(), " ") - - if self._default and self._defmode:find "u" then - if self._maxargs > 1 or (self._minargs == 1 and not self._defmode:find "a") then - usage = "[" .. usage .. "]" - end - end - - return usage -end - -function actions.store_true(result, target) - result[target] = true -end - -function actions.store_false(result, target) - result[target] = false -end - -function actions.store(result, target, argument) - result[target] = argument -end - -function actions.count(result, target, _, overwrite) - if not overwrite then - result[target] = result[target] + 1 - end -end - -function actions.append(result, target, argument, overwrite) - result[target] = result[target] or {} - table.insert(result[target], argument) - - if overwrite then - table.remove(result[target], 1) - end -end - -function actions.concat(result, target, arguments, overwrite) - if overwrite then - error("'concat' action can't handle too many invocations") - end - - result[target] = result[target] or {} - - for _, argument in ipairs(arguments) do - table.insert(result[target], argument) - end -end - -function Argument:_get_action() - local action, init - - if self._maxcount == 1 then - if self._maxargs == 0 then - action, init = "store_true", nil - else - action, init = "store", nil - end - else - if self._maxargs == 0 then - action, init = "count", 0 - else - action, init = "append", {} - end - end - - if self._action then - action = self._action - end - - if self._has_init then - init = self._init - end - - if type(action) == "string" then - action = actions[action] - end - - return action, init -end - --- Returns placeholder for `narg`-th argument. -function Argument:_get_argname(narg) - local argname = self._argname or self:_get_default_argname() - - if type(argname) == "table" then - return argname[narg] - else - return argname - end -end - -function Argument:_get_choices_list() - return "{" .. table.concat(self._choices, ",") .. "}" -end - -function Argument:_get_default_argname() - if self._choices then - return self:_get_choices_list() - else - return "<" .. self._name .. ">" - end -end - -function Option:_get_default_argname() - if self._choices then - return self:_get_choices_list() - else - return "<" .. self:_get_default_target() .. ">" - end -end - --- Returns labels to be shown in the help message. -function Argument:_get_label_lines() - if self._choices then - return {self:_get_choices_list()} - else - return {self._name} - end -end - -function Option:_get_label_lines() - local argument_list = self:_get_argument_list() - - if #argument_list == 0 then - -- Don't put aliases for simple flags like `-h` on different lines. - return {table.concat(self._public_aliases, ", ")} - end - - local longest_alias_length = -1 - - for _, alias in ipairs(self._public_aliases) do - longest_alias_length = math.max(longest_alias_length, #alias) - end - - local argument_list_repr = table.concat(argument_list, " ") - local lines = {} - - for i, alias in ipairs(self._public_aliases) do - local line = (" "):rep(longest_alias_length - #alias) .. alias .. " " .. argument_list_repr - - if i ~= #self._public_aliases then - line = line .. "," - end - - table.insert(lines, line) - end - - return lines -end - -function Command:_get_label_lines() - return {table.concat(self._public_aliases, ", ")} -end - -function Argument:_get_description() - if self._default and self._show_default then - if self._description then - return ("%s (default: %s)"):format(self._description, self._default) - else - return ("default: %s"):format(self._default) - end - else - return self._description or "" - end -end - -function Command:_get_description() - return self._summary or self._description or "" -end - -function Option:_get_usage() - local usage = self:_get_argument_list() - table.insert(usage, 1, self._name) - usage = table.concat(usage, " ") - - if self._mincount == 0 or self._default then - usage = "[" .. usage .. "]" - end - - return usage -end - -function Argument:_get_default_target() - return self._name -end - -function Option:_get_default_target() - local res - - for _, alias in ipairs(self._public_aliases) do - if alias:sub(1, 1) == alias:sub(2, 2) then - res = alias:sub(3) - break - end - end - - res = res or self._name:sub(2) - return (res:gsub("-", "_")) -end - -function Option:_is_vararg() - return self._maxargs ~= self._minargs -end - -function Parser:_get_fullname(exclude_root) - local parent = self._parent - if exclude_root and not parent then - return "" - end - local buf = {self._name} - - while parent do - if not exclude_root or parent._parent then - table.insert(buf, 1, parent._name) - end - parent = parent._parent - end - - return table.concat(buf, " ") -end - -function Parser:_update_charset(charset) - charset = charset or {} - - for _, command in ipairs(self._commands) do - command:_update_charset(charset) - end - - for _, option in ipairs(self._options) do - for _, alias in ipairs(option._aliases) do - charset[alias:sub(1, 1)] = true - end - end - - return charset -end - -function Parser:argument(...) - local argument = Argument(...) - table.insert(self._arguments, argument) - return argument -end - -function Parser:option(...) - local option = Option(...) - table.insert(self._options, option) - return option -end - -function Parser:flag(...) - return self:option():args(0)(...) -end - -function Parser:command(...) - local command = Command():add_help(true)(...) - command._parent = self - table.insert(self._commands, command) - return command -end - -function Parser:mutex(...) - local elements = {...} - - for i, element in ipairs(elements) do - local mt = getmetatable(element) - assert(mt == Option or mt == Argument, ("bad argument #%d to 'mutex' (Option or Argument expected)"):format(i)) - end - - table.insert(self._mutexes, elements) - return self -end - -function Parser:group(name, ...) - assert(type(name) == "string", ("bad argument #1 to 'group' (string expected, got %s)"):format(type(name))) - - local group = {name = name, ...} - - for i, element in ipairs(group) do - local mt = getmetatable(element) - assert(mt == Option or mt == Argument or mt == Command, - ("bad argument #%d to 'group' (Option or Argument or Command expected)"):format(i + 1)) - end - - table.insert(self._groups, group) - return self -end - -local usage_welcome = "Usage: " - -function Parser:get_usage() - if self._usage then - return self._usage - end - - local usage_margin = self:_inherit_property("usage_margin", #usage_welcome) - local max_usage_width = self:_inherit_property("usage_max_width", 70) - local lines = {usage_welcome .. self:_get_fullname()} - - local function add(s) - if #lines[#lines]+1+#s <= max_usage_width then - lines[#lines] = lines[#lines] .. " " .. s - else - lines[#lines+1] = (" "):rep(usage_margin) .. s - end - end - - -- Normally options are before positional arguments in usage messages. - -- However, vararg options should be after, because they can't be reliable used - -- before a positional argument. - -- Mutexes come into play, too, and are shown as soon as possible. - -- Overall, output usages in the following order: - -- 1. Mutexes that don't have positional arguments or vararg options. - -- 2. Options that are not in any mutexes and are not vararg. - -- 3. Positional arguments - on their own or as a part of a mutex. - -- 4. Remaining mutexes. - -- 5. Remaining options. - - local elements_in_mutexes = {} - local added_elements = {} - local added_mutexes = {} - local argument_to_mutexes = {} - - local function add_mutex(mutex, main_argument) - if added_mutexes[mutex] then - return - end - - added_mutexes[mutex] = true - local buf = {} - - for _, element in ipairs(mutex) do - if not element._hidden and not added_elements[element] then - if getmetatable(element) == Option or element == main_argument then - table.insert(buf, element:_get_usage()) - added_elements[element] = true - end - end - end - - if #buf == 1 then - add(buf[1]) - elseif #buf > 1 then - add("(" .. table.concat(buf, " | ") .. ")") - end - end - - local function add_element(element) - if not element._hidden and not added_elements[element] then - add(element:_get_usage()) - added_elements[element] = true - end - end - - for _, mutex in ipairs(self._mutexes) do - local is_vararg = false - local has_argument = false - - for _, element in ipairs(mutex) do - if getmetatable(element) == Option then - if element:_is_vararg() then - is_vararg = true - end - else - has_argument = true - argument_to_mutexes[element] = argument_to_mutexes[element] or {} - table.insert(argument_to_mutexes[element], mutex) - end - - elements_in_mutexes[element] = true - end - - if not is_vararg and not has_argument then - add_mutex(mutex) - end - end - - for _, option in ipairs(self._options) do - if not elements_in_mutexes[option] and not option:_is_vararg() then - add_element(option) - end - end - - -- Add usages for positional arguments, together with one mutex containing them, if they are in a mutex. - for _, argument in ipairs(self._arguments) do - -- Pick a mutex as a part of which to show this argument, take the first one that's still available. - local mutex - - if elements_in_mutexes[argument] then - for _, argument_mutex in ipairs(argument_to_mutexes[argument]) do - if not added_mutexes[argument_mutex] then - mutex = argument_mutex - end - end - end - - if mutex then - add_mutex(mutex, argument) - else - add_element(argument) - end - end - - for _, mutex in ipairs(self._mutexes) do - add_mutex(mutex) - end - - for _, option in ipairs(self._options) do - add_element(option) - end - - if #self._commands > 0 then - if self._require_command then - add("") - else - add("[]") - end - - add("...") - end - - return table.concat(lines, "\n") -end - -local function split_lines(s) - if s == "" then - return {} - end - - local lines = {} - - if s:sub(-1) ~= "\n" then - s = s .. "\n" - end - - for line in s:gmatch("([^\n]*)\n") do - table.insert(lines, line) - end - - return lines -end - -local function autowrap_line(line, max_length) - -- Algorithm for splitting lines is simple and greedy. - local result_lines = {} - - -- Preserve original indentation of the line, put this at the beginning of each result line. - -- If the first word looks like a list marker ('*', '+', or '-'), add spaces so that starts - -- of the second and the following lines vertically align with the start of the second word. - local indentation = line:match("^ *") - - if line:find("^ *[%*%+%-]") then - indentation = indentation .. " " .. line:match("^ *[%*%+%-]( *)") - end - - -- Parts of the last line being assembled. - local line_parts = {} - - -- Length of the current line. - local line_length = 0 - - -- Index of the next character to consider. - local index = 1 - - while true do - local word_start, word_finish, word = line:find("([^ ]+)", index) - - if not word_start then - -- Ignore trailing spaces, if any. - break - end - - local preceding_spaces = line:sub(index, word_start - 1) - index = word_finish + 1 - - if (#line_parts == 0) or (line_length + #preceding_spaces + #word <= max_length) then - -- Either this is the very first word or it fits as an addition to the current line, add it. - table.insert(line_parts, preceding_spaces) -- For the very first word this adds the indentation. - table.insert(line_parts, word) - line_length = line_length + #preceding_spaces + #word - else - -- Does not fit, finish current line and put the word into a new one. - table.insert(result_lines, table.concat(line_parts)) - line_parts = {indentation, word} - line_length = #indentation + #word - end - end - - if #line_parts > 0 then - table.insert(result_lines, table.concat(line_parts)) - end - - if #result_lines == 0 then - -- Preserve empty lines. - result_lines[1] = "" - end - - return result_lines -end - --- Automatically wraps lines within given array, --- attempting to limit line length to `max_length`. --- Existing line splits are preserved. -local function autowrap(lines, max_length) - local result_lines = {} - - for _, line in ipairs(lines) do - local autowrapped_lines = autowrap_line(line, max_length) - - for _, autowrapped_line in ipairs(autowrapped_lines) do - table.insert(result_lines, autowrapped_line) - end - end - - return result_lines -end - -function Parser:_get_element_help(element) - local label_lines = element:_get_label_lines() - local description_lines = split_lines(element:_get_description()) - - local result_lines = {} - - -- All label lines should have the same length (except the last one, it has no comma). - -- If too long, start description after all the label lines. - -- Otherwise, combine label and description lines. - - local usage_margin_len = self:_inherit_property("help_usage_margin", 3) - local usage_margin = (" "):rep(usage_margin_len) - local description_margin_len = self:_inherit_property("help_description_margin", 25) - local description_margin = (" "):rep(description_margin_len) - - local help_max_width = self:_inherit_property("help_max_width") - - if help_max_width then - local description_max_width = math.max(help_max_width - description_margin_len, 10) - description_lines = autowrap(description_lines, description_max_width) - end - - if #label_lines[1] >= (description_margin_len - usage_margin_len) then - for _, label_line in ipairs(label_lines) do - table.insert(result_lines, usage_margin .. label_line) - end - - for _, description_line in ipairs(description_lines) do - table.insert(result_lines, description_margin .. description_line) - end - else - for i = 1, math.max(#label_lines, #description_lines) do - local label_line = label_lines[i] - local description_line = description_lines[i] - - local line = "" - - if label_line then - line = usage_margin .. label_line - end - - if description_line and description_line ~= "" then - line = line .. (" "):rep(description_margin_len - #line) .. description_line - end - - table.insert(result_lines, line) - end - end - - return table.concat(result_lines, "\n") -end - -local function get_group_types(group) - local types = {} - - for _, element in ipairs(group) do - types[getmetatable(element)] = true - end - - return types -end - -function Parser:_add_group_help(blocks, added_elements, label, elements) - local buf = {label} - - for _, element in ipairs(elements) do - if not element._hidden and not added_elements[element] then - added_elements[element] = true - table.insert(buf, self:_get_element_help(element)) - end - end - - if #buf > 1 then - table.insert(blocks, table.concat(buf, ("\n"):rep(self:_inherit_property("help_vertical_space", 0) + 1))) - end -end - -function Parser:get_help() - if self._help then - return self._help - end - - local blocks = {self:get_usage()} - - local help_max_width = self:_inherit_property("help_max_width") - - if self._description then - local description = self._description - - if help_max_width then - description = table.concat(autowrap(split_lines(description), help_max_width), "\n") - end - - table.insert(blocks, description) - end - - -- 1. Put groups containing arguments first, then other arguments. - -- 2. Put remaining groups containing options, then other options. - -- 3. Put remaining groups containing commands, then other commands. - -- Assume that an element can't be in several groups. - local groups_by_type = { - [Argument] = {}, - [Option] = {}, - [Command] = {} - } - - for _, group in ipairs(self._groups) do - local group_types = get_group_types(group) - - for _, mt in ipairs({Argument, Option, Command}) do - if group_types[mt] then - table.insert(groups_by_type[mt], group) - break - end - end - end - - local default_groups = { - {name = "Arguments", type = Argument, elements = self._arguments}, - {name = "Options", type = Option, elements = self._options}, - {name = "Commands", type = Command, elements = self._commands} - } - - local added_elements = {} - - for _, default_group in ipairs(default_groups) do - local type_groups = groups_by_type[default_group.type] - - for _, group in ipairs(type_groups) do - self:_add_group_help(blocks, added_elements, group.name .. ":", group) - end - - local default_label = default_group.name .. ":" - - if #type_groups > 0 then - default_label = "Other " .. default_label:gsub("^.", string.lower) - end - - self:_add_group_help(blocks, added_elements, default_label, default_group.elements) - end - - if self._epilog then - local epilog = self._epilog - - if help_max_width then - epilog = table.concat(autowrap(split_lines(epilog), help_max_width), "\n") - end - - table.insert(blocks, epilog) - end - - return table.concat(blocks, "\n\n") -end - -function Parser:add_help_command(value) - if value then - assert(type(value) == "string" or type(value) == "table", - ("bad argument #1 to 'add_help_command' (string or table expected, got %s)"):format(type(value))) - end - - local help = self:command() - :description "Show help for commands." - help:argument "command" - :description "The command to show help for." - :args "?" - :action(function(_, _, cmd) - if not cmd then - print(self:get_help()) - os.exit(0) - else - for _, command in ipairs(self._commands) do - for _, alias in ipairs(command._aliases) do - if alias == cmd then - print(command:get_help()) - os.exit(0) - end - end - end - end - help:error(("unknown command '%s'"):format(cmd)) - end) - - if value then - help = help(value) - end - - if not help._name then - help "help" - end - - help._is_help_command = true - return self -end - -function Parser:_is_shell_safe() - if self._basename then - if self._basename:find("[^%w_%-%+%.]") then - return false - end - else - for _, alias in ipairs(self._aliases) do - if alias:find("[^%w_%-%+%.]") then - return false - end - end - end - for _, option in ipairs(self._options) do - for _, alias in ipairs(option._aliases) do - if alias:find("[^%w_%-%+%.]") then - return false - end - end - if option._choices then - for _, choice in ipairs(option._choices) do - if choice:find("[%s'\"]") then - return false - end - end - end - end - for _, argument in ipairs(self._arguments) do - if argument._choices then - for _, choice in ipairs(argument._choices) do - if choice:find("[%s'\"]") then - return false - end - end - end - end - for _, command in ipairs(self._commands) do - if not command:_is_shell_safe() then - return false - end - end - return true -end - -function Parser:add_complete(value) - if value then - assert(type(value) == "string" or type(value) == "table", - ("bad argument #1 to 'add_complete' (string or table expected, got %s)"):format(type(value))) - end - - local complete = self:option() - :description "Output a shell completion script for the specified shell." - :args(1) - :choices {"bash", "zsh", "fish"} - :action(function(_, _, shell) - io.write(self["get_" .. shell .. "_complete"](self)) - os.exit(0) - end) - - if value then - complete = complete(value) - end - - if not complete._name then - complete "--completion" - end - - return self -end - -function Parser:add_complete_command(value) - if value then - assert(type(value) == "string" or type(value) == "table", - ("bad argument #1 to 'add_complete_command' (string or table expected, got %s)"):format(type(value))) - end - - local complete = self:command() - :description "Output a shell completion script." - complete:argument "shell" - :description "The shell to output a completion script for." - :choices {"bash", "zsh", "fish"} - :action(function(_, _, shell) - io.write(self["get_" .. shell .. "_complete"](self)) - os.exit(0) - end) - - if value then - complete = complete(value) - end - - if not complete._name then - complete "completion" - end - - return self -end - -local function base_name(pathname) - return pathname:gsub("[/\\]*$", ""):match(".*[/\\]([^/\\]*)") or pathname -end - -local function get_short_description(element) - local short = element:_get_description():match("^(.-)%.%s") - return short or element:_get_description():match("^(.-)%.?$") -end - -function Parser:_get_options() - local options = {} - for _, option in ipairs(self._options) do - for _, alias in ipairs(option._aliases) do - table.insert(options, alias) - end - end - return table.concat(options, " ") -end - -function Parser:_get_commands() - local commands = {} - for _, command in ipairs(self._commands) do - for _, alias in ipairs(command._aliases) do - table.insert(commands, alias) - end - end - return table.concat(commands, " ") -end - -function Parser:_bash_option_args(buf, indent) - local opts = {} - for _, option in ipairs(self._options) do - if option._choices or option._minargs > 0 then - local compreply - if option._choices then - compreply = 'COMPREPLY=($(compgen -W "' .. table.concat(option._choices, " ") .. '" -- "$cur"))' - else - compreply = 'COMPREPLY=($(compgen -f -- "$cur"))' - end - table.insert(opts, (" "):rep(indent + 4) .. table.concat(option._aliases, "|") .. ")") - table.insert(opts, (" "):rep(indent + 8) .. compreply) - table.insert(opts, (" "):rep(indent + 8) .. "return 0") - table.insert(opts, (" "):rep(indent + 8) .. ";;") - end - end - - if #opts > 0 then - table.insert(buf, (" "):rep(indent) .. 'case "$prev" in') - table.insert(buf, table.concat(opts, "\n")) - table.insert(buf, (" "):rep(indent) .. "esac\n") - end -end - -function Parser:_bash_get_cmd(buf, indent) - if #self._commands == 0 then - return - end - - table.insert(buf, (" "):rep(indent) .. 'args=("${args[@]:1}")') - table.insert(buf, (" "):rep(indent) .. 'for arg in "${args[@]}"; do') - table.insert(buf, (" "):rep(indent + 4) .. 'case "$arg" in') - - for _, command in ipairs(self._commands) do - table.insert(buf, (" "):rep(indent + 8) .. table.concat(command._aliases, "|") .. ")") - if self._parent then - table.insert(buf, (" "):rep(indent + 12) .. 'cmd="$cmd ' .. command._name .. '"') - else - table.insert(buf, (" "):rep(indent + 12) .. 'cmd="' .. command._name .. '"') - end - table.insert(buf, (" "):rep(indent + 12) .. 'opts="$opts ' .. command:_get_options() .. '"') - command:_bash_get_cmd(buf, indent + 12) - table.insert(buf, (" "):rep(indent + 12) .. "break") - table.insert(buf, (" "):rep(indent + 12) .. ";;") - end - - table.insert(buf, (" "):rep(indent + 4) .. "esac") - table.insert(buf, (" "):rep(indent) .. "done") -end - -function Parser:_bash_cmd_completions(buf) - local cmd_buf = {} - if self._parent then - self:_bash_option_args(cmd_buf, 12) - end - if #self._commands > 0 then - table.insert(cmd_buf, (" "):rep(12) .. 'COMPREPLY=($(compgen -W "' .. self:_get_commands() .. '" -- "$cur"))') - elseif self._is_help_command then - table.insert(cmd_buf, (" "):rep(12) - .. 'COMPREPLY=($(compgen -W "' - .. self._parent:_get_commands() - .. '" -- "$cur"))') - end - if #cmd_buf > 0 then - table.insert(buf, (" "):rep(8) .. "'" .. self:_get_fullname(true) .. "')") - table.insert(buf, table.concat(cmd_buf, "\n")) - table.insert(buf, (" "):rep(12) .. ";;") - end - - for _, command in ipairs(self._commands) do - command:_bash_cmd_completions(buf) - end -end - -function Parser:get_bash_complete() - self._basename = base_name(self._name) - assert(self:_is_shell_safe()) - local buf = {([[ -_%s() { - local IFS=$' \t\n' - local args cur prev cmd opts arg - args=("${COMP_WORDS[@]}") - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="%s" -]]):format(self._basename, self:_get_options())} - - self:_bash_option_args(buf, 4) - self:_bash_get_cmd(buf, 4) - if #self._commands > 0 then - table.insert(buf, "") - table.insert(buf, (" "):rep(4) .. 'case "$cmd" in') - self:_bash_cmd_completions(buf) - table.insert(buf, (" "):rep(4) .. "esac\n") - end - - table.insert(buf, ([=[ - if [[ "$cur" = -* ]]; then - COMPREPLY=($(compgen -W "$opts" -- "$cur")) - fi -} - -complete -F _%s -o bashdefault -o default %s -]=]):format(self._basename, self._basename)) - - return table.concat(buf, "\n") -end - -function Parser:_zsh_arguments(buf, cmd_name, indent) - if self._parent then - table.insert(buf, (" "):rep(indent) .. "options=(") - table.insert(buf, (" "):rep(indent + 2) .. "$options") - else - table.insert(buf, (" "):rep(indent) .. "local -a options=(") - end - - for _, option in ipairs(self._options) do - local line = {} - if #option._aliases > 1 then - if option._maxcount > 1 then - table.insert(line, '"*"') - end - table.insert(line, "{" .. table.concat(option._aliases, ",") .. '}"') - else - table.insert(line, '"') - if option._maxcount > 1 then - table.insert(line, "*") - end - table.insert(line, option._name) - end - if option._description then - local description = get_short_description(option):gsub('["%]:`$]', "\\%0") - table.insert(line, "[" .. description .. "]") - end - if option._maxargs == math.huge then - table.insert(line, ":*") - end - if option._choices then - table.insert(line, ": :(" .. table.concat(option._choices, " ") .. ")") - elseif option._maxargs > 0 then - table.insert(line, ": :_files") - end - table.insert(line, '"') - table.insert(buf, (" "):rep(indent + 2) .. table.concat(line)) - end - - table.insert(buf, (" "):rep(indent) .. ")") - table.insert(buf, (" "):rep(indent) .. "_arguments -s -S \\") - table.insert(buf, (" "):rep(indent + 2) .. "$options \\") - - if self._is_help_command then - table.insert(buf, (" "):rep(indent + 2) .. '": :(' .. self._parent:_get_commands() .. ')" \\') - else - for _, argument in ipairs(self._arguments) do - local spec - if argument._choices then - spec = ": :(" .. table.concat(argument._choices, " ") .. ")" - else - spec = ": :_files" - end - if argument._maxargs == math.huge then - table.insert(buf, (" "):rep(indent + 2) .. '"*' .. spec .. '" \\') - break - end - for _ = 1, argument._maxargs do - table.insert(buf, (" "):rep(indent + 2) .. '"' .. spec .. '" \\') - end - end - - if #self._commands > 0 then - table.insert(buf, (" "):rep(indent + 2) .. '": :_' .. cmd_name .. '_cmds" \\') - table.insert(buf, (" "):rep(indent + 2) .. '"*:: :->args" \\') - end - end - - table.insert(buf, (" "):rep(indent + 2) .. "&& return 0") -end - -function Parser:_zsh_cmds(buf, cmd_name) - table.insert(buf, "\n_" .. cmd_name .. "_cmds() {") - table.insert(buf, " local -a commands=(") - - for _, command in ipairs(self._commands) do - local line = {} - if #command._aliases > 1 then - table.insert(line, "{" .. table.concat(command._aliases, ",") .. '}"') - else - table.insert(line, '"' .. command._name) - end - if command._description then - table.insert(line, ":" .. get_short_description(command):gsub('["`$]', "\\%0")) - end - table.insert(buf, " " .. table.concat(line) .. '"') - end - - table.insert(buf, ' )\n _describe "command" commands\n}') -end - -function Parser:_zsh_complete_help(buf, cmds_buf, cmd_name, indent) - if #self._commands == 0 then - return - end - - self:_zsh_cmds(cmds_buf, cmd_name) - table.insert(buf, "\n" .. (" "):rep(indent) .. "case $words[1] in") - - for _, command in ipairs(self._commands) do - local name = cmd_name .. "_" .. command._name - table.insert(buf, (" "):rep(indent + 2) .. table.concat(command._aliases, "|") .. ")") - command:_zsh_arguments(buf, name, indent + 4) - command:_zsh_complete_help(buf, cmds_buf, name, indent + 4) - table.insert(buf, (" "):rep(indent + 4) .. ";;\n") - end - - table.insert(buf, (" "):rep(indent) .. "esac") -end - -function Parser:get_zsh_complete() - self._basename = base_name(self._name) - assert(self:_is_shell_safe()) - local buf = {("#compdef %s\n"):format(self._basename)} - local cmds_buf = {} - table.insert(buf, "_" .. self._basename .. "() {") - if #self._commands > 0 then - table.insert(buf, " local context state state_descr line") - table.insert(buf, " typeset -A opt_args\n") - end - self:_zsh_arguments(buf, self._basename, 2) - self:_zsh_complete_help(buf, cmds_buf, self._basename, 2) - table.insert(buf, "\n return 1") - table.insert(buf, "}") - - local result = table.concat(buf, "\n") - if #cmds_buf > 0 then - result = result .. "\n" .. table.concat(cmds_buf, "\n") - end - return result .. "\n\n_" .. self._basename .. "\n" -end - -local function fish_escape(string) - return string:gsub("[\\']", "\\%0") -end - -function Parser:_fish_get_cmd(buf, indent) - if #self._commands == 0 then - return - end - - table.insert(buf, (" "):rep(indent) .. "set -e cmdline[1]") - table.insert(buf, (" "):rep(indent) .. "for arg in $cmdline") - table.insert(buf, (" "):rep(indent + 4) .. "switch $arg") - - for _, command in ipairs(self._commands) do - table.insert(buf, (" "):rep(indent + 8) .. "case " .. table.concat(command._aliases, " ")) - table.insert(buf, (" "):rep(indent + 12) .. "set cmd $cmd " .. command._name) - command:_fish_get_cmd(buf, indent + 12) - table.insert(buf, (" "):rep(indent + 12) .. "break") - end - - table.insert(buf, (" "):rep(indent + 4) .. "end") - table.insert(buf, (" "):rep(indent) .. "end") -end - -function Parser:_fish_complete_help(buf, basename) - local prefix = "complete -c " .. basename - table.insert(buf, "") - - for _, command in ipairs(self._commands) do - local aliases = table.concat(command._aliases, " ") - local line - if self._parent then - line = ("%s -n '__fish_%s_using_command %s' -xa '%s'") - :format(prefix, basename, self:_get_fullname(true), aliases) - else - line = ("%s -n '__fish_%s_using_command' -xa '%s'"):format(prefix, basename, aliases) - end - if command._description then - line = ("%s -d '%s'"):format(line, fish_escape(get_short_description(command))) - end - table.insert(buf, line) - end - - if self._is_help_command then - local line = ("%s -n '__fish_%s_using_command %s' -xa '%s'") - :format(prefix, basename, self:_get_fullname(true), self._parent:_get_commands()) - table.insert(buf, line) - end - - for _, option in ipairs(self._options) do - local parts = {prefix} - - if self._parent then - table.insert(parts, "-n '__fish_" .. basename .. "_seen_command " .. self:_get_fullname(true) .. "'") - end - - for _, alias in ipairs(option._aliases) do - if alias:match("^%-.$") then - table.insert(parts, "-s " .. alias:sub(2)) - elseif alias:match("^%-%-.+") then - table.insert(parts, "-l " .. alias:sub(3)) - end - end - - if option._choices then - table.insert(parts, "-xa '" .. table.concat(option._choices, " ") .. "'") - elseif option._minargs > 0 then - table.insert(parts, "-r") - end - - if option._description then - table.insert(parts, "-d '" .. fish_escape(get_short_description(option)) .. "'") - end - - table.insert(buf, table.concat(parts, " ")) - end - - for _, command in ipairs(self._commands) do - command:_fish_complete_help(buf, basename) - end -end - -function Parser:get_fish_complete() - self._basename = base_name(self._name) - assert(self:_is_shell_safe()) - local buf = {} - - if #self._commands > 0 then - table.insert(buf, ([[ -function __fish_%s_print_command - set -l cmdline (commandline -poc) - set -l cmd]]):format(self._basename)) - self:_fish_get_cmd(buf, 4) - table.insert(buf, ([[ - echo "$cmd" -end - -function __fish_%s_using_command - test (__fish_%s_print_command) = "$argv" - and return 0 - or return 1 -end - -function __fish_%s_seen_command - string match -q "$argv*" (__fish_%s_print_command) - and return 0 - or return 1 -end]]):format(self._basename, self._basename, self._basename, self._basename)) - end - - self:_fish_complete_help(buf, self._basename) - return table.concat(buf, "\n") .. "\n" -end - -local function get_tip(context, wrong_name) - local context_pool = {} - local possible_name - local possible_names = {} - - for name in pairs(context) do - if type(name) == "string" then - for i = 1, #name do - possible_name = name:sub(1, i - 1) .. name:sub(i + 1) - - if not context_pool[possible_name] then - context_pool[possible_name] = {} - end - - table.insert(context_pool[possible_name], name) - end - end - end - - for i = 1, #wrong_name + 1 do - possible_name = wrong_name:sub(1, i - 1) .. wrong_name:sub(i + 1) - - if context[possible_name] then - possible_names[possible_name] = true - elseif context_pool[possible_name] then - for _, name in ipairs(context_pool[possible_name]) do - possible_names[name] = true - end - end - end - - local first = next(possible_names) - - if first then - if next(possible_names, first) then - local possible_names_arr = {} - - for name in pairs(possible_names) do - table.insert(possible_names_arr, "'" .. name .. "'") - end - - table.sort(possible_names_arr) - return "\nDid you mean one of these: " .. table.concat(possible_names_arr, " ") .. "?" - else - return "\nDid you mean '" .. first .. "'?" - end - else - return "" - end -end - -local ElementState = class({ - invocations = 0 -}) - -function ElementState:__call(state, element) - self.state = state - self.result = state.result - self.element = element - self.target = element._target or element:_get_default_target() - self.action, self.result[self.target] = element:_get_action() - return self -end - -function ElementState:error(fmt, ...) - self.state:error(fmt, ...) -end - -function ElementState:convert(argument, index) - local converter = self.element._convert - - if converter then - local ok, err - - if type(converter) == "function" then - ok, err = converter(argument) - elseif type(converter[index]) == "function" then - ok, err = converter[index](argument) - else - ok = converter[argument] - end - - if ok == nil then - self:error(err and "%s" or "malformed argument '%s'", err or argument) - end - - argument = ok - end - - return argument -end - -function ElementState:default(mode) - return self.element._defmode:find(mode) and self.element._default -end - -local function bound(noun, min, max, is_max) - local res = "" - - if min ~= max then - res = "at " .. (is_max and "most" or "least") .. " " - end - - local number = is_max and max or min - return res .. tostring(number) .. " " .. noun .. (number == 1 and "" or "s") -end - -function ElementState:set_name(alias) - self.name = ("%s '%s'"):format(alias and "option" or "argument", alias or self.element._name) -end - -function ElementState:invoke() - self.open = true - self.overwrite = false - - if self.invocations >= self.element._maxcount then - if self.element._overwrite then - self.overwrite = true - else - local num_times_repr = bound("time", self.element._mincount, self.element._maxcount, true) - self:error("%s must be used %s", self.name, num_times_repr) - end - else - self.invocations = self.invocations + 1 - end - - self.args = {} - - if self.element._maxargs <= 0 then - self:close() - end - - return self.open -end - -function ElementState:check_choices(argument) - if self.element._choices then - for _, choice in ipairs(self.element._choices) do - if argument == choice then - return - end - end - local choices_list = "'" .. table.concat(self.element._choices, "', '") .. "'" - local is_option = getmetatable(self.element) == Option - self:error("%s%s must be one of %s", is_option and "argument for " or "", self.name, choices_list) - end -end - -function ElementState:pass(argument) - self:check_choices(argument) - argument = self:convert(argument, #self.args + 1) - table.insert(self.args, argument) - - if #self.args >= self.element._maxargs then - self:close() - end - - return self.open -end - -function ElementState:complete_invocation() - while #self.args < self.element._minargs do - self:pass(self.element._default) - end -end - -function ElementState:close() - if self.open then - self.open = false - - if #self.args < self.element._minargs then - if self:default("a") then - self:complete_invocation() - else - if #self.args == 0 then - if getmetatable(self.element) == Argument then - self:error("missing %s", self.name) - elseif self.element._maxargs == 1 then - self:error("%s requires an argument", self.name) - end - end - - self:error("%s requires %s", self.name, bound("argument", self.element._minargs, self.element._maxargs)) - end - end - - local args - - if self.element._maxargs == 0 then - args = self.args[1] - elseif self.element._maxargs == 1 then - if self.element._minargs == 0 and self.element._mincount ~= self.element._maxcount then - args = self.args - else - args = self.args[1] - end - else - args = self.args - end - - self.action(self.result, self.target, args, self.overwrite) - end -end - -local ParseState = class({ - result = {}, - options = {}, - arguments = {}, - argument_i = 1, - element_to_mutexes = {}, - mutex_to_element_state = {}, - command_actions = {} -}) - -function ParseState:__call(parser, error_handler) - self.parser = parser - self.error_handler = error_handler - self.charset = parser:_update_charset() - self:switch(parser) - return self -end - -function ParseState:error(fmt, ...) - self.error_handler(self.parser, fmt:format(...)) -end - -function ParseState:switch(parser) - self.parser = parser - - if parser._action then - table.insert(self.command_actions, {action = parser._action, name = parser._name}) - end - - for _, option in ipairs(parser._options) do - option = ElementState(self, option) - table.insert(self.options, option) - - for _, alias in ipairs(option.element._aliases) do - self.options[alias] = option - end - end - - for _, mutex in ipairs(parser._mutexes) do - for _, element in ipairs(mutex) do - if not self.element_to_mutexes[element] then - self.element_to_mutexes[element] = {} - end - - table.insert(self.element_to_mutexes[element], mutex) - end - end - - for _, argument in ipairs(parser._arguments) do - argument = ElementState(self, argument) - table.insert(self.arguments, argument) - argument:set_name() - argument:invoke() - end - - self.handle_options = parser._handle_options - self.argument = self.arguments[self.argument_i] - self.commands = parser._commands - - for _, command in ipairs(self.commands) do - for _, alias in ipairs(command._aliases) do - self.commands[alias] = command - end - end -end - -function ParseState:get_option(name) - local option = self.options[name] - - if not option then - self:error("unknown option '%s'%s", name, get_tip(self.options, name)) - else - return option - end -end - -function ParseState:get_command(name) - local command = self.commands[name] - - if not command then - if #self.commands > 0 then - self:error("unknown command '%s'%s", name, get_tip(self.commands, name)) - else - self:error("too many arguments") - end - else - return command - end -end - -function ParseState:check_mutexes(element_state) - if self.element_to_mutexes[element_state.element] then - for _, mutex in ipairs(self.element_to_mutexes[element_state.element]) do - local used_element_state = self.mutex_to_element_state[mutex] - - if used_element_state and used_element_state ~= element_state then - self:error("%s can not be used together with %s", element_state.name, used_element_state.name) - else - self.mutex_to_element_state[mutex] = element_state - end - end - end -end - -function ParseState:invoke(option, name) - self:close() - option:set_name(name) - self:check_mutexes(option, name) - - if option:invoke() then - self.option = option - end -end - -function ParseState:pass(arg) - if self.option then - if not self.option:pass(arg) then - self.option = nil - end - elseif self.argument then - self:check_mutexes(self.argument) - - if not self.argument:pass(arg) then - self.argument_i = self.argument_i + 1 - self.argument = self.arguments[self.argument_i] - end - else - local command = self:get_command(arg) - self.result[command._target or command._name] = true - - if self.parser._command_target then - self.result[self.parser._command_target] = command._name - end - - self:switch(command) - end -end - -function ParseState:close() - if self.option then - self.option:close() - self.option = nil - end -end - -function ParseState:finalize() - self:close() - - for i = self.argument_i, #self.arguments do - local argument = self.arguments[i] - if #argument.args == 0 and argument:default("u") then - argument:complete_invocation() - else - argument:close() - end - end - - if self.parser._require_command and #self.commands > 0 then - self:error("a command is required") - end - - for _, option in ipairs(self.options) do - option.name = option.name or ("option '%s'"):format(option.element._name) - - if option.invocations == 0 then - if option:default("u") then - option:invoke() - option:complete_invocation() - option:close() - end - end - - local mincount = option.element._mincount - - if option.invocations < mincount then - if option:default("a") then - while option.invocations < mincount do - option:invoke() - option:close() - end - elseif option.invocations == 0 then - self:error("missing %s", option.name) - else - self:error("%s must be used %s", option.name, bound("time", mincount, option.element._maxcount)) - end - end - end - - for i = #self.command_actions, 1, -1 do - self.command_actions[i].action(self.result, self.command_actions[i].name) - end -end - -function ParseState:parse(args) - for _, arg in ipairs(args) do - local plain = true - - if self.handle_options then - local first = arg:sub(1, 1) - - if self.charset[first] then - if #arg > 1 then - plain = false - - if arg:sub(2, 2) == first then - if #arg == 2 then - if self.options[arg] then - local option = self:get_option(arg) - self:invoke(option, arg) - else - self:close() - end - - self.handle_options = false - else - local equals = arg:find "=" - if equals then - local name = arg:sub(1, equals - 1) - local option = self:get_option(name) - - if option.element._maxargs <= 0 then - self:error("option '%s' does not take arguments", name) - end - - self:invoke(option, name) - self:pass(arg:sub(equals + 1)) - else - local option = self:get_option(arg) - self:invoke(option, arg) - end - end - else - for i = 2, #arg do - local name = first .. arg:sub(i, i) - local option = self:get_option(name) - self:invoke(option, name) - - if i ~= #arg and option.element._maxargs > 0 then - self:pass(arg:sub(i + 1)) - break - end - end - end - end - end - end - - if plain then - self:pass(arg) - end - end - - self:finalize() - return self.result -end - -function Parser:error(msg) - io.stderr:write(("%s\n\nError: %s\n"):format(self:get_usage(), msg)) - os.exit(1) -end - --- Compatibility with strict.lua and other checkers: -local default_cmdline = rawget(_G, "arg") or {} - -function Parser:_parse(args, error_handler) - return ParseState(self, error_handler):parse(args or default_cmdline) -end - -function Parser:parse(args) - return self:_parse(args, self.error) -end - -local function xpcall_error_handler(err) - if not debug then - return tostring(err) - end - return tostring(err) .. "\noriginal " .. debug.traceback("", 2):sub(2) -end - -function Parser:pparse(args) - local parse_error - - local ok, result = xpcall(function() - return self:_parse(args, function(_, err) - parse_error = err - error(err, 0) - end) - end, xpcall_error_handler) - - if ok then - return true, result - elseif not parse_error then - error(result, 0) - else - return false, parse_error - end -end - -local argparse = {} - -argparse.version = "0.7.0" - -setmetatable(argparse, {__call = function(_, ...) - return Parser(default_cmdline[0]):add_help(true)(...) -end}) - -return argparse diff --git a/.luarocks/share/lua/5.1/luarocks/build.lua b/.luarocks/share/lua/5.1/luarocks/build.lua deleted file mode 100644 index 0b82174b0..000000000 --- a/.luarocks/share/lua/5.1/luarocks/build.lua +++ /dev/null @@ -1,458 +0,0 @@ - -local build = {} - -local path = require("luarocks.path") -local util = require("luarocks.util") -local fun = require("luarocks.fun") -local fetch = require("luarocks.fetch") -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local deps = require("luarocks.deps") -local cfg = require("luarocks.core.cfg") -local vers = require("luarocks.core.vers") -local repos = require("luarocks.repos") -local writer = require("luarocks.manif.writer") -local deplocks = require("luarocks.deplocks") - -build.opts = util.opts_table("build.opts", { - need_to_fetch = "boolean", - minimal_mode = "boolean", - deps_mode = "string", - build_only_deps = "boolean", - namespace = "string?", - branch = "string?", - verify = "boolean", - check_lua_versions = "boolean", - pin = "boolean", - no_install = "boolean" -}) - -do - --- Write to the current directory the contents of a table, - -- where each key is a file name and its value is the file content. - -- @param files table: The table of files to be written. - local function extract_from_rockspec(files) - for name, content in pairs(files) do - local fd = io.open(dir.path(fs.current_dir(), name), "w+") - fd:write(content) - fd:close() - end - end - - --- Applies patches inlined in the build.patches section - -- and extracts files inlined in the build.extra_files section - -- of a rockspec. - -- @param rockspec table: A rockspec table. - -- @return boolean or (nil, string): True if succeeded or - -- nil and an error message. - function build.apply_patches(rockspec) - assert(rockspec:type() == "rockspec") - - if not (rockspec.build.extra_files or rockspec.build.patches) then - return true - end - - local fd = io.open(fs.absolute_name(".luarocks.patches.applied"), "r") - if fd then - fd:close() - return true - end - - if rockspec.build.extra_files then - extract_from_rockspec(rockspec.build.extra_files) - end - if rockspec.build.patches then - extract_from_rockspec(rockspec.build.patches) - for patch, patchdata in util.sortedpairs(rockspec.build.patches) do - util.printout("Applying patch "..patch.."...") - local create_delete = rockspec:format_is_at_least("3.0") - local ok, err = fs.apply_patch(tostring(patch), patchdata, create_delete) - if not ok then - return nil, "Failed applying patch "..patch - end - end - end - - fd = io.open(fs.absolute_name(".luarocks.patches.applied"), "w") - if fd then - fd:close() - end - return true - end -end - -local function check_macosx_deployment_target(rockspec) - local target = rockspec.build.macosx_deployment_target - local function patch_variable(var) - if rockspec.variables[var]:match("MACOSX_DEPLOYMENT_TARGET") then - rockspec.variables[var] = (rockspec.variables[var]):gsub("MACOSX_DEPLOYMENT_TARGET=[^ ]*", "MACOSX_DEPLOYMENT_TARGET="..target) - else - rockspec.variables[var] = "env MACOSX_DEPLOYMENT_TARGET="..target.." "..rockspec.variables[var] - end - end - if cfg.is_platform("macosx") and rockspec:format_is_at_least("3.0") and target then - local version = util.popen_read("sw_vers -productVersion") - if version:match("^%d+%.%d+%.%d+$") or version:match("^%d+%.%d+$") then - if vers.compare_versions(target, version) then - return nil, ("This rock requires Mac OSX %s, and you are running %s."):format(target, version) - end - end - patch_variable("CC") - patch_variable("LD") - end - return true -end - -local function process_dependencies(rockspec, opts) - if not opts.build_only_deps then - local ok, err, errcode = deps.check_external_deps(rockspec, "build") - if err then - return nil, err, errcode - end - end - - local ok, err, errcode = deps.check_lua_incdir(rockspec.variables) - if not ok then - return nil, err, errcode - end - - if cfg.link_lua_explicitly then - local ok, err, errcode = deps.check_lua_libdir(rockspec.variables) - if not ok then - return nil, err, errcode - end - end - - if opts.deps_mode == "none" then - return true - end - - if not opts.build_only_deps then - if next(rockspec.build_dependencies) then - local ok, err, errcode = deps.fulfill_dependencies(rockspec, "build_dependencies", opts.deps_mode, opts.verify) - if err then - return nil, err, errcode - end - end - end - ok, err, errcode = deps.fulfill_dependencies(rockspec, "dependencies", opts.deps_mode, opts.verify) - if err then - return nil, err, errcode - end - return true -end - -local function fetch_and_change_to_source_dir(rockspec, opts) - if opts.minimal_mode or opts.build_only_deps then - return true - end - if opts.need_to_fetch then - if opts.branch then - rockspec.source.branch = opts.branch - end - local ok, source_dir, errcode = fetch.fetch_sources(rockspec, true) - if not ok then - return nil, source_dir, errcode - end - local err - ok, err = fs.change_dir(source_dir) - if not ok then - return nil, err - end - elseif rockspec.source.file then - local ok, err = fs.unpack_archive(rockspec.source.file) - if not ok then - return nil, err - end - end - fs.change_dir(rockspec.source.dir) - return true -end - -local function prepare_install_dirs(name, version) - local dirs = { - lua = { name = path.lua_dir(name, version), is_module_path = true, perms = "read" }, - lib = { name = path.lib_dir(name, version), is_module_path = true, perms = "exec" }, - bin = { name = path.bin_dir(name, version), is_module_path = false, perms = "exec" }, - conf = { name = path.conf_dir(name, version), is_module_path = false, perms = "read" }, - } - - for _, d in pairs(dirs) do - local ok, err = fs.make_dir(d.name) - if not ok then - return nil, err - end - end - - return dirs -end - -local function run_build_driver(rockspec, no_install) - local btype = rockspec.build.type - if btype == "none" then - return true - end - -- Temporary compatibility - if btype == "module" then - util.printout("Do not use 'module' as a build type. Use 'builtin' instead.") - btype = "builtin" - rockspec.build.type = btype - end - if cfg.accepted_build_types and not fun.contains(cfg.accepted_build_types, btype) then - return nil, "This rockspec uses the '"..btype.."' build type, which is blocked by the 'accepted_build_types' setting in your LuaRocks configuration." - end - local pok, driver = pcall(require, "luarocks.build." .. btype) - if not pok or type(driver) ~= "table" then - return nil, "Failed initializing build back-end for build type '"..btype.."': "..driver - end - local ok, err = driver.run(rockspec, no_install) - if not ok then - return nil, "Build error: " .. err - end - return true -end - -local install_files -do - --- Install files to a given location. - -- Takes a table where the array part is a list of filenames to be copied. - -- In the hash part, other keys, if is_module_path is set, are identifiers - -- in Lua module format, to indicate which subdirectory the file should be - -- copied to. For example, install_files({["foo.bar"] = "src/bar.lua"}, "boo") - -- will copy src/bar.lua to boo/foo. - -- @param files table or nil: A table containing a list of files to copy in - -- the format described above. If nil is passed, this function is a no-op. - -- Directories should be delimited by forward slashes as in internet URLs. - -- @param location string: The base directory files should be copied to. - -- @param is_module_path boolean: True if string keys in files should be - -- interpreted as dotted module paths. - -- @param perms string ("read" or "exec"): Permissions of the newly created - -- files installed. - -- Directories are always created with the default permissions. - -- @return boolean or (nil, string): True if succeeded or - -- nil and an error message. - local function install_to(files, location, is_module_path, perms) - assert(type(files) == "table" or not files) - assert(type(location) == "string") - if not files then - return true - end - for k, file in pairs(files) do - local dest = location - local filename = dir.base_name(file) - if type(k) == "string" then - local modname = k - if is_module_path then - dest = dir.path(location, path.module_to_path(modname)) - local ok, err = fs.make_dir(dest) - if not ok then return nil, err end - if filename:match("%.lua$") then - local basename = modname:match("([^.]+)$") - filename = basename..".lua" - end - else - dest = dir.path(location, dir.dir_name(modname)) - local ok, err = fs.make_dir(dest) - if not ok then return nil, err end - filename = dir.base_name(modname) - end - else - local ok, err = fs.make_dir(dest) - if not ok then return nil, err end - end - local ok = fs.copy(dir.path(file), dir.path(dest, filename), perms) - if not ok then - return nil, "Failed copying "..file - end - end - return true - end - - local function install_default_docs(name, version) - local patterns = { "readme", "license", "copying", ".*%.md" } - local dest = dir.path(path.install_dir(name, version), "doc") - local has_dir = false - for file in fs.dir() do - for _, pattern in ipairs(patterns) do - if file:lower():match("^"..pattern) then - if not has_dir then - fs.make_dir(dest) - has_dir = true - end - fs.copy(file, dest, "read") - break - end - end - end - end - - install_files = function(rockspec, dirs) - local name, version = rockspec.name, rockspec.version - - if rockspec.build.install then - for k, d in pairs(dirs) do - local ok, err = install_to(rockspec.build.install[k], d.name, d.is_module_path, d.perms) - if not ok then return nil, err end - end - end - - local copy_directories = rockspec.build.copy_directories - local copying_default = false - if not copy_directories then - copy_directories = {"doc"} - copying_default = true - end - - local any_docs = false - for _, copy_dir in pairs(copy_directories) do - if fs.is_dir(copy_dir) then - local dest = dir.path(path.install_dir(name, version), copy_dir) - fs.make_dir(dest) - fs.copy_contents(copy_dir, dest) - any_docs = true - else - if not copying_default then - return nil, "Directory '"..copy_dir.."' not found" - end - end - end - if not any_docs then - install_default_docs(name, version) - end - - return true - end -end - -local function write_rock_dir_files(rockspec, opts) - local name, version = rockspec.name, rockspec.version - - fs.copy(rockspec.local_abs_filename, path.rockspec_file(name, version), "read") - - local deplock_file = deplocks.get_abs_filename(rockspec.name) - if deplock_file then - fs.copy(deplock_file, dir.path(path.install_dir(name, version), "luarocks.lock"), "read") - end - - local ok, err = writer.make_rock_manifest(name, version) - if not ok then return nil, err end - - ok, err = writer.make_namespace_file(name, version, opts.namespace) - if not ok then return nil, err end - - return true -end - ---- Build and install a rock given a rockspec. --- @param opts table: build options table --- @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, opts) - assert(rockspec:type() == "rockspec") - assert(opts:type() == "build.opts") - - if not rockspec.build then - if rockspec:format_is_at_least("3.0") then - rockspec.build = { - type = "builtin" - } - else - return nil, "Rockspec error: build table not specified" - end - end - - if not rockspec.build.type then - if rockspec:format_is_at_least("3.0") then - rockspec.build.type = "builtin" - else - return nil, "Rockspec error: build type not specified" - end - end - - local ok, err = fetch_and_change_to_source_dir(rockspec, opts) - if not ok then return nil, err end - - if opts.pin then - deplocks.init(rockspec.name, ".") - end - - ok, err = process_dependencies(rockspec, opts) - if not ok then return nil, err end - - local name, version = rockspec.name, rockspec.version - if opts.build_only_deps then - if opts.pin then - deplocks.write_file() - end - return name, version - end - - local dirs, err - local rollback - if not opts.no_install then - if repos.is_installed(name, version) then - repos.delete_version(name, version, opts.deps_mode) - end - - dirs, err = prepare_install_dirs(name, version) - if not dirs then return nil, err end - - rollback = util.schedule_function(function() - fs.delete(path.install_dir(name, version)) - fs.remove_dir_if_empty(path.versions_dir(name)) - end) - end - - ok, err = build.apply_patches(rockspec) - if not ok then return nil, err end - - ok, err = check_macosx_deployment_target(rockspec) - if not ok then return nil, err end - - ok, err = run_build_driver(rockspec, opts.no_install) - if not ok then return nil, err end - - if opts.no_install then - fs.pop_dir() - if opts.need_to_fetch then - fs.pop_dir() - end - return name, version - end - - ok, err = install_files(rockspec, dirs) - if not ok then return nil, err end - - for _, d in pairs(dirs) do - fs.remove_dir_if_empty(d.name) - end - - fs.pop_dir() - if opts.need_to_fetch then - fs.pop_dir() - end - - if opts.pin then - deplocks.write_file() - end - - ok, err = write_rock_dir_files(rockspec, opts) - if not ok then return nil, err end - - ok, err = repos.deploy_files(name, version, repos.should_wrap_bin_scripts(rockspec), opts.deps_mode) - if not ok then return nil, err end - - util.remove_scheduled_function(rollback) - rollback = util.schedule_function(function() - repos.delete_version(name, version, opts.deps_mode) - end) - - ok, err = repos.run_hook(rockspec, "post_install") - if not ok then return nil, err end - - util.announce_install(rockspec) - util.remove_scheduled_function(rollback) - return name, version -end - -return build diff --git a/.luarocks/share/lua/5.1/luarocks/build/builtin.lua b/.luarocks/share/lua/5.1/luarocks/build/builtin.lua deleted file mode 100644 index e7c0ae38c..000000000 --- a/.luarocks/share/lua/5.1/luarocks/build/builtin.lua +++ /dev/null @@ -1,371 +0,0 @@ - ---- A builtin build system: back-end to provide a portable way of building C-based Lua modules. -local builtin = {} - -local unpack = unpack or table.unpack - -local fs = require("luarocks.fs") -local path = require("luarocks.path") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.dir") - -function builtin.autodetect_external_dependencies(build) - if not build or not build.modules then - return nil - end - local extdeps = {} - local any = false - for _, data in pairs(build.modules) do - if type(data) == "table" and data.libraries then - local libraries = data.libraries - if type(libraries) == "string" then - libraries = { libraries } - end - local incdirs = {} - local libdirs = {} - for _, lib in ipairs(libraries) do - local upper = lib:upper():gsub("%+", "P"):gsub("[^%w]", "_") - any = true - extdeps[upper] = { library = lib } - table.insert(incdirs, "$(" .. upper .. "_INCDIR)") - table.insert(libdirs, "$(" .. upper .. "_LIBDIR)") - end - if not data.incdirs then - data.incdirs = incdirs - end - if not data.libdirs then - data.libdirs = libdirs - end - end - end - return any and extdeps or nil -end - -local function autoextract_libs(external_dependencies, variables) - if not external_dependencies then - return nil, nil, nil - end - local libs = {} - local incdirs = {} - local libdirs = {} - for name, data in pairs(external_dependencies) do - if data.library then - table.insert(libs, data.library) - table.insert(incdirs, variables[name .. "_INCDIR"]) - table.insert(libdirs, variables[name .. "_LIBDIR"]) - end - end - return libs, incdirs, libdirs -end - -do - local function get_cmod_name(file) - local fd = io.open(dir.path(fs.current_dir(), file), "r") - if not fd then return nil end - local data = fd:read("*a") - fd:close() - return (data:match("int%s+luaopen_([a-zA-Z0-9_]+)")) - end - - local skiplist = { - ["spec"] = true, - [".luarocks"] = true, - ["lua_modules"] = true, - ["test.lua"] = true, - ["tests.lua"] = true, - } - - function builtin.autodetect_modules(libs, incdirs, libdirs) - local modules = {} - local install - local copy_directories - - local prefix = "" - for _, parent in ipairs({"src", "lua", "lib"}) do - if fs.is_dir(parent) then - fs.change_dir(parent) - prefix = parent.."/" - break - end - end - - for _, file in ipairs(fs.find()) do - local base = file:match("^([^\\/]*)") - if not skiplist[base] then - local luamod = file:match("(.*)%.lua$") - if luamod then - modules[path.path_to_module(file)] = prefix..file - else - local cmod = file:match("(.*)%.c$") - if cmod then - local modname = get_cmod_name(file) or path.path_to_module(file:gsub("%.c$", ".lua")) - modules[modname] = { - sources = prefix..file, - libraries = libs, - incdirs = incdirs, - libdirs = libdirs, - } - end - end - end - end - - if prefix ~= "" then - fs.pop_dir() - end - - local bindir = (fs.is_dir("src/bin") and "src/bin") - or (fs.is_dir("bin") and "bin") - if bindir then - install = { bin = {} } - for _, file in ipairs(fs.list_dir(bindir)) do - table.insert(install.bin, dir.path(bindir, file)) - end - end - - for _, directory in ipairs({ "doc", "docs", "samples", "tests" }) do - if fs.is_dir(directory) then - if not copy_directories then - copy_directories = {} - end - table.insert(copy_directories, directory) - end - end - - return modules, install, copy_directories - end -end - ---- Run a command displaying its execution on standard output. --- @return boolean: true if command succeeds (status code 0), false --- otherwise. -local function execute(...) - io.stdout:write(table.concat({...}, " ").."\n") - return fs.execute(...) -end - ---- Driver function for the builtin build back-end. --- @param rockspec table: the loaded rockspec. --- @return boolean or (nil, string): true if no errors occurred, --- nil and an error message otherwise. -function builtin.run(rockspec, no_install) - assert(rockspec:type() == "rockspec") - local compile_object, compile_library, compile_static_library - - local build = rockspec.build - local variables = rockspec.variables - local checked_lua_h = false - - for _, var in ipairs{ "CC", "CFLAGS", "LDFLAGS" } do - variables[var] = variables[var] or os.getenv(var) or "" - end - - local function add_flags(extras, flag, flags) - if flags then - if type(flags) ~= "table" then - flags = { tostring(flags) } - end - util.variable_substitutions(flags, variables) - for _, v in ipairs(flags) do - table.insert(extras, flag:format(v)) - end - end - end - - if cfg.is_platform("mingw32") then - compile_object = function(object, source, defines, incdirs) - local extras = {} - add_flags(extras, "-D%s", defines) - 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) - local extras = { unpack(objects) } - add_flags(extras, "-L%s", libdirs) - add_flags(extras, "-l%s", libraries) - extras[#extras+1] = dir.path(variables.LUA_LIBDIR, variables.LUALIB) - extras[#extras+1] = "-l" .. (variables.MSVCRT or "m") - local ok = execute(variables.LD.." "..variables.LDFLAGS.." "..variables.LIBFLAG, "-o", library, unpack(extras)) - return ok - end - --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format. - compile_static_library = function(library, objects, libraries, libdirs, name) - local ok = execute(variables.AR, "rc", library, unpack(objects)) - if ok then - ok = execute(variables.RANLIB, library) - end - return ok - end - ]] - elseif cfg.is_platform("win32") then - compile_object = function(object, source, defines, incdirs) - local extras = {} - add_flags(extras, "-D%s", defines) - add_flags(extras, "-I%s", incdirs) - return execute(variables.CC.." "..variables.CFLAGS, "-c", "-Fo"..object, "-I"..variables.LUA_INCDIR, source, unpack(extras)) - end - compile_library = function(library, objects, libraries, libdirs, name) - local extras = { unpack(objects) } - add_flags(extras, "-libpath:%s", libdirs) - add_flags(extras, "%s.lib", libraries) - local basename = dir.base_name(library):gsub(".[^.]*$", "") - local deffile = basename .. ".def" - local def = io.open(dir.path(fs.current_dir(), deffile), "w+") - local exported_name = name:gsub("%.", "_") - exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name - def:write("EXPORTS\n") - def:write("luaopen_"..exported_name.."\n") - def:close() - local ok = execute(variables.LD, "-dll", "-def:"..deffile, "-out:"..library, dir.path(variables.LUA_LIBDIR, variables.LUALIB), unpack(extras)) - local basedir = "" - if name:find("%.") ~= nil then - basedir = name:gsub("%.%w+$", "\\") - basedir = basedir:gsub("%.", "\\") - end - local manifestfile = basedir .. basename..".dll.manifest" - - if ok and fs.exists(manifestfile) then - ok = execute(variables.MT, "-manifest", manifestfile, "-outputresource:"..basedir..basename..".dll;2") - end - return ok - end - --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format. - compile_static_library = function(library, objects, libraries, libdirs, name) - local ok = execute(variables.AR, "-out:"..library, unpack(objects)) - return ok - end - ]] - else - compile_object = function(object, source, defines, incdirs) - local extras = {} - add_flags(extras, "-D%s", defines) - add_flags(extras, "-I%s", incdirs) - return execute(variables.CC.." "..variables.CFLAGS, "-I"..variables.LUA_INCDIR, "-c", source, "-o", object, unpack(extras)) - end - compile_library = function (library, objects, libraries, libdirs) - local extras = { unpack(objects) } - add_flags(extras, "-L%s", libdirs) - if cfg.gcc_rpath then - add_flags(extras, "-Wl,-rpath,%s", libdirs) - end - add_flags(extras, "-l%s", libraries) - if cfg.link_lua_explicitly then - extras[#extras+1] = "-L"..variables.LUA_LIBDIR - extras[#extras+1] = "-llua" - end - return execute(variables.LD.." "..variables.LDFLAGS.." "..variables.LIBFLAG, "-o", library, unpack(extras)) - end - compile_static_library = function(library, objects, libraries, libdirs, name) -- luacheck: ignore 211 - local ok = execute(variables.AR, "rc", library, unpack(objects)) - if ok then - ok = execute(variables.RANLIB, library) - end - return ok - end - end - - local ok, err - local lua_modules = {} - local lib_modules = {} - local luadir = path.lua_dir(rockspec.name, rockspec.version) - local libdir = path.lib_dir(rockspec.name, rockspec.version) - - if not build.modules then - if rockspec:format_is_at_least("3.0") then - local libs, incdirs, libdirs = autoextract_libs(rockspec.external_dependencies, rockspec.variables) - local install, copy_directories - build.modules, install, copy_directories = builtin.autodetect_modules(libs, incdirs, libdirs) - build.install = build.install or install - build.copy_directories = build.copy_directories or copy_directories - else - return nil, "Missing build.modules table" - end - end - for name, info in pairs(build.modules) do - local moddir = path.module_to_path(name) - if type(info) == "string" then - local ext = info:match("%.([^.]+)$") - if ext == "lua" then - local filename = dir.base_name(info) - if filename == "init.lua" and not name:match("%.init$") then - moddir = path.module_to_path(name..".init") - else - local basename = name:match("([^.]+)$") - filename = basename..".lua" - end - local dest = dir.path(luadir, moddir, filename) - lua_modules[info] = dest - else - info = {info} - end - end - if type(info) == "table" then - if not checked_lua_h then - local lua_incdir, lua_h = variables.LUA_INCDIR, "lua.h" - if not fs.exists(dir.path(lua_incdir, lua_h)) then - return nil, "Lua header file "..lua_h.." not found (looked in "..lua_incdir.."). \n" .. - "You need to install the Lua development package for your system." - end - checked_lua_h = true - end - local objects = {} - local sources = info.sources - if info[1] then sources = info end - if type(sources) == "string" then sources = {sources} end - for _, source in ipairs(sources) do - local object = source:gsub("%.[^.]*$", "."..cfg.obj_extension) - if not object then - object = source.."."..cfg.obj_extension - end - ok = compile_object(object, source, info.defines, info.incdirs) - if not ok then - return nil, "Failed compiling object "..object - end - table.insert(objects, object) - end - local module_name = name:match("([^.]*)$").."."..util.matchquote(cfg.lib_extension) - if moddir ~= "" then - module_name = dir.path(moddir, module_name) - ok, err = fs.make_dir(moddir) - if not ok then return nil, err end - end - lib_modules[module_name] = dir.path(libdir, module_name) - ok = compile_library(module_name, objects, info.libraries, info.libdirs, name) - if not ok then - return nil, "Failed compiling module "..module_name - end - --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format. - module_name = name:match("([^.]*)$").."."..util.matchquote(cfg.static_lib_extension) - if moddir ~= "" then - module_name = dir.path(moddir, module_name) - end - lib_modules[module_name] = dir.path(libdir, module_name) - ok = compile_static_library(module_name, objects, info.libraries, info.libdirs, name) - if not ok then - return nil, "Failed compiling static library "..module_name - end - ]] - end - end - if not no_install then - for _, mods in ipairs({{ tbl = lua_modules, perms = "read" }, { tbl = lib_modules, perms = "exec" }}) do - for name, dest in pairs(mods.tbl) do - fs.make_dir(dir.dir_name(dest)) - ok, err = fs.copy(name, dest, mods.perms) - if not ok then - return nil, "Failed installing "..name.." in "..dest..": "..err - end - end - end - if fs.is_dir("lua") then - ok, err = fs.copy_contents("lua", luadir) - if not ok then - return nil, "Failed copying contents of 'lua' directory: "..err - end - end - end - return true -end - -return builtin diff --git a/.luarocks/share/lua/5.1/luarocks/build/cmake.lua b/.luarocks/share/lua/5.1/luarocks/build/cmake.lua deleted file mode 100644 index b7a4786ef..000000000 --- a/.luarocks/share/lua/5.1/luarocks/build/cmake.lua +++ /dev/null @@ -1,78 +0,0 @@ - ---- Build back-end for CMake-based modules. -local cmake = {} - -local fs = require("luarocks.fs") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") - ---- Driver function for the "cmake" build back-end. --- @param rockspec table: the loaded rockspec. --- @return boolean or (nil, string): true if no errors occurred, --- nil and an error message otherwise. -function cmake.run(rockspec, no_install) - assert(rockspec:type() == "rockspec") - 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") - variables.CMAKE_INCLUDE_PATH=os.getenv("CMAKE_INCLUDE_PATH") - - util.variable_substitutions(variables, rockspec.variables) - - 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")) - cmake_handler:write(build.cmake) - 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.. '="' ..tostring(v).. '"' - end - - if not fs.execute_string(rockspec.variables.CMAKE.." -H. -Bbuild.luarocks "..args) then - return nil, "Failed cmake." - end - - local do_build, do_install - if rockspec:format_is_at_least("3.0") then - do_build = (build.build_pass == nil) and true or build.build_pass - do_install = (build.install_pass == nil) and true or build.install_pass - else - do_build = true - do_install = true - end - - if do_build then - if not fs.execute_string(rockspec.variables.CMAKE.." --build build.luarocks --config Release") then - return nil, "Failed building." - end - end - if do_install and not no_install then - if not fs.execute_string(rockspec.variables.CMAKE.." --build build.luarocks --target install --config Release") then - return nil, "Failed installing." - end - end - - return true -end - -return cmake diff --git a/.luarocks/share/lua/5.1/luarocks/build/command.lua b/.luarocks/share/lua/5.1/luarocks/build/command.lua deleted file mode 100644 index b0c4aa791..000000000 --- a/.luarocks/share/lua/5.1/luarocks/build/command.lua +++ /dev/null @@ -1,41 +0,0 @@ - ---- Build back-end for raw listing of commands in rockspec files. -local command = {} - -local fs = require("luarocks.fs") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") - ---- Driver function for the "command" build back-end. --- @param rockspec table: the loaded rockspec. --- @return boolean or (nil, string): true if no errors occurred, --- nil and an error message otherwise. -function command.run(rockspec, not_install) - assert(rockspec:type() == "rockspec") - - local build = rockspec.build - - util.variable_substitutions(build, rockspec.variables) - - local env = { - CC = cfg.variables.CC, - --LD = cfg.variables.LD, - --CFLAGS = cfg.variables.CFLAGS, - } - - if build.build_command then - util.printout(build.build_command) - if not fs.execute_env(env, build.build_command) then - return nil, "Failed building." - end - end - if build.install_command and not not_install then - util.printout(build.install_command) - if not fs.execute_env(env, build.install_command) then - return nil, "Failed installing." - end - end - return true -end - -return command diff --git a/.luarocks/share/lua/5.1/luarocks/build/make.lua b/.luarocks/share/lua/5.1/luarocks/build/make.lua deleted file mode 100644 index 4345ddffb..000000000 --- a/.luarocks/share/lua/5.1/luarocks/build/make.lua +++ /dev/null @@ -1,98 +0,0 @@ - ---- Build back-end for using Makefile-based packages. -local make = {} - -local unpack = unpack or table.unpack - -local fs = require("luarocks.fs") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") - ---- Call "make" with given target and variables --- @param make_cmd string: the make command to be used (typically --- configured through variables.MAKE in the config files, or --- the appropriate platform-specific default). --- @param pass boolean: If true, run make; if false, do nothing. --- @param target string: The make target; an empty string indicates --- the default target. --- @param variables table: A table containing string-string key-value --- pairs representing variable assignments to be passed to make. --- @return boolean: false if any errors occurred, true otherwise. -local function make_pass(make_cmd, pass, target, variables) - assert(type(pass) == "boolean") - assert(type(target) == "string") - assert(type(variables) == "table") - - local assignments = {} - for k,v in pairs(variables) do - table.insert(assignments, k.."="..v) - end - if pass then - return fs.execute(make_cmd.." "..target, unpack(assignments)) - else - return true - end -end - ---- Driver function for the "make" build back-end. --- @param rockspec table: the loaded rockspec. --- @return boolean or (nil, string): true if no errors occurred, --- nil and an error message otherwise. -function make.run(rockspec, not_install) - assert(rockspec:type() == "rockspec") - - local build = rockspec.build - - if build.build_pass == nil then build.build_pass = true end - if build.install_pass == nil then build.install_pass = true end - build.build_variables = build.build_variables or {} - build.install_variables = build.install_variables or {} - build.build_target = build.build_target or "" - build.install_target = build.install_target or "install" - local makefile = build.makefile or cfg.makefile - if makefile then - -- Assumes all make's accept -f. True for POSIX make, GNU make and Microsoft nmake. - build.build_target = "-f "..makefile.." "..build.build_target - build.install_target = "-f "..makefile.." "..build.install_target - end - - if build.variables then - for var, val in pairs(build.variables) do - build.build_variables[var] = val - build.install_variables[var] = val - end - end - - util.warn_if_not_used(build.build_variables, { CFLAGS=true }, "variable %s was not passed in build_variables") - - util.variable_substitutions(build.build_variables, rockspec.variables) - util.variable_substitutions(build.install_variables, rockspec.variables) - - local auto_variables = { "CC" } - - for _, variable in pairs(auto_variables) do - if not build.build_variables[variable] then - build.build_variables[variable] = rockspec.variables[variable] - end - if not build.install_variables[variable] then - build.install_variables[variable] = rockspec.variables[variable] - end - end - - -- backwards compatibility - local make_cmd = cfg.make or rockspec.variables.MAKE - - local ok = make_pass(make_cmd, build.build_pass, build.build_target, build.build_variables) - if not ok then - return nil, "Failed building." - end - if not not_install then - ok = make_pass(make_cmd, build.install_pass, build.install_target, build.install_variables) - if not ok then - return nil, "Failed installing." - end - end - return true -end - -return make diff --git a/.luarocks/share/lua/5.1/luarocks/cmd.lua b/.luarocks/share/lua/5.1/luarocks/cmd.lua deleted file mode 100644 index 3abad7892..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd.lua +++ /dev/null @@ -1,684 +0,0 @@ - ---- Functions for command-line scripts. -local cmd = {} - -local manif = require("luarocks.manif") -local util = require("luarocks.util") -local path = require("luarocks.path") -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.dir") -local fun = require("luarocks.fun") -local fs = require("luarocks.fs") -local argparse = require("luarocks.argparse") - -local unpack = table.unpack or unpack -local pack = table.pack or function(...) return { n = select("#", ...), ... } end - -local hc_ok, hardcoded = pcall(require, "luarocks.core.hardcoded") -if not hc_ok then - hardcoded = {} -end - -local program = util.this_program("luarocks") - -cmd.errorcodes = { - OK = 0, - UNSPECIFIED = 1, - PERMISSIONDENIED = 2, - CONFIGFILE = 3, - CRASH = 99 -} - -local function check_popen() - local popen_ok, popen_result = pcall(io.popen, "") - if popen_ok then - if popen_result then - popen_result:close() - end - else - io.stderr:write("Your version of Lua does not support io.popen,\n") - io.stderr:write("which is required by LuaRocks. Please check your Lua installation.\n") - os.exit(cmd.errorcodes.UNSPECIFIED) - end -end - -local process_tree_args -do - local function replace_tree(args, root, tree) - root = dir.normalize(root) - args.tree = root - path.use_tree(tree or root) - end - - local function strip_trailing_slashes() - if type(cfg.root_dir) == "string" then - cfg.root_dir = cfg.root_dir:gsub("/+$", "") - else - cfg.root_dir.root = cfg.root_dir.root:gsub("/+$", "") - end - cfg.rocks_dir = cfg.rocks_dir:gsub("/+$", "") - cfg.deploy_bin_dir = cfg.deploy_bin_dir:gsub("/+$", "") - cfg.deploy_lua_dir = cfg.deploy_lua_dir:gsub("/+$", "") - cfg.deploy_lib_dir = cfg.deploy_lib_dir:gsub("/+$", "") - end - - process_tree_args = function(args, project_dir) - - if args.global then - cfg.local_by_default = false - end - - if args.tree then - local named = false - for _, tree in ipairs(cfg.rocks_trees) do - if type(tree) == "table" and args.tree == tree.name then - if not tree.root then - return nil, "Configuration error: tree '"..tree.name.."' has no 'root' field." - end - replace_tree(args, tree.root, tree) - named = true - break - end - end - if not named then - local root_dir = fs.absolute_name(args.tree) - replace_tree(args, root_dir) - end - elseif args["local"] then - if fs.is_superuser() then - return nil, "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." - else - replace_tree(args, cfg.home_tree) - end - elseif args.project_tree then - local tree = args.project_tree - table.insert(cfg.rocks_trees, 1, { name = "project", root = tree } ) - manif.load_rocks_tree_manifests() - path.use_tree(tree) - elseif cfg.local_by_default then - if cfg.home_tree then - replace_tree(args, cfg.home_tree) - end - elseif project_dir then - local project_tree = project_dir .. "/lua_modules" - table.insert(cfg.rocks_trees, 1, { name = "project", root = project_tree } ) - manif.load_rocks_tree_manifests() - path.use_tree(project_tree) - else - local trees = cfg.rocks_trees - path.use_tree(trees[#trees]) - end - - strip_trailing_slashes() - - cfg.variables.ROCKS_TREE = cfg.rocks_dir - cfg.variables.SCRIPTS_DIR = cfg.deploy_bin_dir - - return true - end -end - -local function process_server_args(args) - if args.server then - local protocol, pathname = dir.split_url(args.server) - table.insert(cfg.rocks_servers, 1, protocol.."://"..pathname) - end - - if args.dev then - local append_dev = function(s) return dir.path(s, "dev") end - local dev_servers = fun.traverse(cfg.rocks_servers, append_dev) - cfg.rocks_servers = fun.concat(dev_servers, cfg.rocks_servers) - end - - if args.only_server then - if args.dev then - return nil, "--only-server cannot be used with --dev" - end - if args.server then - return nil, "--only-server cannot be used with --server" - end - cfg.rocks_servers = { args.only_server } - end - - return true -end - -local function error_handler(err) - if not debug then - return err - end - local mode = "Arch.: " .. (cfg and cfg.arch or "unknown") - if package.config:sub(1, 1) == "\\" then - if cfg and cfg.fs_use_modules then - mode = mode .. " (fs_use_modules = true)" - end - end - if cfg and cfg.is_binary then - mode = mode .. " (binary)" - end - return debug.traceback("LuaRocks "..cfg.program_version.. - " bug (please report at https://github.com/luarocks/luarocks/issues).\n".. - mode.."\n"..err, 2) -end - ---- Display an error message and exit. --- @param message string: The error message. --- @param exitcode number: the exitcode to use -local function die(message, exitcode) - assert(type(message) == "string", "bad error, expected string, got: " .. type(message)) - assert(exitcode == nil or type(exitcode) == "number", "bad error, expected number, got: " .. type(exitcode) .. " - " .. tostring(exitcode)) - util.printerr("\nError: "..message) - - local ok, err = xpcall(util.run_scheduled_functions, error_handler) - if not ok then - util.printerr("\nError: "..err) - exitcode = cmd.errorcodes.CRASH - end - - os.exit(exitcode or cmd.errorcodes.UNSPECIFIED) -end - -local function search_lua_in_path(lua_version, verbose) - local path_sep = (package.config:sub(1, 1) == "\\" and ";" or ":") - local all_tried = {} - for bindir in (os.getenv("PATH") or ""):gmatch("[^"..path_sep.."]+") do - local parentdir = dir.path((bindir:gsub("[\\/][^\\/]+[\\/]?$", ""))) - local detected, tried = util.find_lua(parentdir, lua_version) - if detected then - return detected - else - table.insert(all_tried, tried) - end - bindir = dir.path(bindir) - detected = util.find_lua(bindir, lua_version) - if detected then - return detected - else - table.insert(all_tried, tried) - end - end - return nil, "Could not find " .. - (lua_version and "Lua " .. lua_version or "Lua") .. - " in PATH." .. - (verbose and " Tried:\n" .. table.concat(all_tried, "\n") or "") -end - -local init_config -do - local detect_config_via_args - do - local function find_project_dir(project_tree) - if project_tree then - return project_tree:gsub("[/\\][^/\\]+$", ""), true - else - local try = "." - for _ = 1, 10 do -- FIXME detect when root dir was hit instead - if util.exists(try .. "/.luarocks") and util.exists(try .. "/lua_modules") then - return try, false - elseif util.exists(try .. "/.luarocks-no-project") then - break - end - try = try .. "/.." - end - end - return nil - end - - local function find_default_lua_version(args, project_dir) - if hardcoded.FORCE_CONFIG then - return nil - end - - local dirs = {} - if project_dir then - table.insert(dirs, dir.path(project_dir, ".luarocks")) - end - if cfg.homeconfdir then - table.insert(dirs, cfg.homeconfdir) - end - table.insert(dirs, cfg.sysconfdir) - for _, d in ipairs(dirs) do - local f = dir.path(d, "default-lua-version.lua") - local mod, err = loadfile(f, "t") - if mod then - local pok, ver = pcall(mod) - if pok and type(ver) == "string" and ver:match("%d+.%d+") then - if args.verbose then - util.printout("Defaulting to Lua " .. ver .. " based on " .. f .. " ...") - end - return ver - end - end - end - return nil - end - - local function find_version_from_config(dirname) - return fun.find(util.lua_versions("descending"), function(v) - if util.exists(dir.path(dirname, ".luarocks", "config-"..v..".lua")) then - return v - end - end) - end - - local function detect_lua_via_args(args, project_dir) - local lua_version = args.lua_version - or find_default_lua_version(args, project_dir) - or (project_dir and find_version_from_config(project_dir)) - - if args.lua_dir then - local detected, err = util.find_lua(args.lua_dir, lua_version) - if not detected then - local suggestion = (not args.lua_version) - and "\nYou may want to specify a different Lua version with --lua-version\n" - or "" - die(err .. suggestion) - end - return detected - end - - if lua_version then - local detected = search_lua_in_path(lua_version) - if detected then - return detected - end - return { - lua_version = lua_version, - } - end - - return {} - end - - detect_config_via_args = function(args) - local project_dir, given - if not args.no_project then - project_dir, given = find_project_dir(args.project_tree) - end - - local detected = detect_lua_via_args(args, project_dir) - if args.lua_version then - detected.given_lua_version = args.lua_version - end - if args.lua_dir then - detected.given_lua_dir = args.lua_dir - end - if given then - detected.given_project_dir = project_dir - end - detected.project_dir = project_dir - return detected - end - end - - init_config = function(args) - local detected = detect_config_via_args(args) - - local ok, err = cfg.init(detected, util.warning) - if not ok then - return nil, err - end - - return (detected.lua_dir ~= nil) - end -end - -local variables_help = [[ -Variables: - Variables from the "variables" table of the configuration file can be - overridden with VAR=VALUE assignments. - -]] - -local function get_status(status) - return status and "ok" or "not found" -end - -local function use_to_fix_location(key) - local buf = " ****************************************\n" - buf = buf .. " Use the command\n\n" - buf = buf .. " luarocks config " .. key .. "

\n\n" - buf = buf .. " to fix the location\n" - buf = buf .. " ****************************************\n" - return buf -end - -local function get_config_text(cfg) -- luacheck: ignore 431 - local deps = require("luarocks.deps") - - local libdir_ok = deps.check_lua_libdir(cfg.variables) - local incdir_ok = deps.check_lua_incdir(cfg.variables) - local bindir_ok = fs.exists(cfg.variables.LUA_BINDIR) - local luadir_ok = fs.exists(cfg.variables.LUA_DIR) - local lua_ok = fs.exists(cfg.variables.LUA) - - local buf = "Configuration:\n" - buf = buf.." Lua:\n" - buf = buf.." Version : "..cfg.lua_version.."\n" - if cfg.luajit_version then - buf = buf.." LuaJIT : "..cfg.luajit_version.."\n" - end - buf = buf.." Interpreter: "..(cfg.variables.LUA or "").." ("..get_status(lua_ok)..")\n" - buf = buf.." LUA_DIR : "..(cfg.variables.LUA_DIR or "").." ("..get_status(luadir_ok)..")\n" - if not lua_ok then - buf = buf .. use_to_fix_location("lua_dir") - end - buf = buf.." LUA_BINDIR : "..(cfg.variables.LUA_BINDIR or "").." ("..get_status(bindir_ok)..")\n" - buf = buf.." LUA_INCDIR : "..(cfg.variables.LUA_INCDIR or "").." ("..get_status(incdir_ok)..")\n" - if lua_ok and not incdir_ok then - buf = buf .. use_to_fix_location("variables.LUA_INCDIR") - end - buf = buf.." LUA_LIBDIR : "..(cfg.variables.LUA_LIBDIR or "").." ("..get_status(libdir_ok)..")\n" - if lua_ok and not libdir_ok then - buf = buf .. use_to_fix_location("variables.LUA_LIBDIR") - end - - buf = buf.."\n Configuration files:\n" - local conf = cfg.config_files - buf = buf.." System : "..fs.absolute_name(conf.system.file).." ("..get_status(conf.system.found)..")\n" - if conf.user.file then - buf = buf.." User : "..fs.absolute_name(conf.user.file).." ("..get_status(conf.user.found)..")\n" - else - buf = buf.." User : disabled in this LuaRocks installation.\n" - end - if conf.project then - buf = buf.." Project : "..fs.absolute_name(conf.project.file).." ("..get_status(conf.project.found)..")\n" - end - buf = buf.."\n Rocks trees in use: \n" - for _, tree in ipairs(cfg.rocks_trees) do - if type(tree) == "string" then - buf = buf.." "..fs.absolute_name(tree) - else - local name = tree.name and " (\""..tree.name.."\")" or "" - buf = buf.." "..fs.absolute_name(tree.root)..name - end - buf = buf .. "\n" - end - - return buf -end - -local function get_parser(description, cmd_modules) - local basename = dir.base_name(program) - local parser = argparse( - basename, "LuaRocks "..cfg.program_version..", the Lua package manager\n\n".. - program.." - "..description, variables_help.."Run '"..basename.. - "' without any arguments to see the configuration.") - :help_max_width(80) - :add_help_command() - :add_complete_command({ - help_max_width = 100, - summary = "Output a shell completion script.", - description = [[ -Output a shell completion script. - -Enabling completions for Bash: - - Add the following line to your ~/.bashrc: - source <(]]..basename..[[ completion bash) - or save the completion script to the local completion directory: - ]]..basename..[[ completion bash > ~/.local/share/bash-completion/completions/]]..basename..[[ - - -Enabling completions for Zsh: - - Save the completion script to a file in your $fpath. - You can add a new directory to your $fpath by adding e.g. - fpath=(~/.zfunc $fpath) - to your ~/.zshrc. - Then run: - ]]..basename..[[ completion zsh > ~/.zfunc/_]]..basename..[[ - - -Enabling completion for Fish: - - Add the following line to your ~/.config/fish/config.fish: - ]]..basename..[[ completion fish | source - or save the completion script to the local completion directory: - ]]..basename..[[ completion fish > ~/.config/fish/completions/]]..basename..[[.fish -]]}) - :command_target("command") - :require_command(false) - - parser:flag("--version", "Show version info and exit.") - :action(function() - util.printout(program.." "..cfg.program_version) - util.printout(description) - util.printout() - os.exit(cmd.errorcodes.OK) - end) - parser:flag("--dev", "Enable the sub-repositories in rocks servers for ".. - "rockspecs of in-development versions.") - parser:option("--server", "Fetch rocks/rockspecs from this server ".. - "(takes priority over config file).") - :hidden_name("--from") - parser:option("--only-server", "Fetch rocks/rockspecs from this server only ".. - "(overrides any entries in the config file).") - :argname("") - :hidden_name("--only-from") - parser:option("--only-sources", "Restrict downloads to paths matching the given URL.") - :argname("") - :hidden_name("--only-sources-from") - parser:option("--namespace", "Specify the rocks server namespace to use.") - :convert(string.lower) - parser:option("--lua-dir", "Which Lua installation to use.") - :argname("") - parser:option("--lua-version", "Which Lua version to use.") - :argname("") - :convert(function(s) return (s:match("^%d+%.%d+$")) end) - parser:option("--tree", "Which tree to operate on.") - :hidden_name("--to") - parser:flag("--local", "Use the tree in the user's home directory.\n".. - "To enable it, see '"..program.." help path'.") - parser:flag("--global", "Use the system tree when `local_by_default` is `true`.") - parser:flag("--no-project", "Do not use project tree even if running from a project folder.") - parser:flag("--verbose", "Display verbose output of commands executed.") - parser:option("--timeout", "Timeout on network operations, in seconds.\n".. - "0 means no timeout (wait forever). Default is ".. - tostring(cfg.connection_timeout)..".") - :argname("") - :convert(tonumber) - - -- Used internally to force the use of a particular project tree - parser:option("--project-tree"):hidden(true) - - for _, module in util.sortedpairs(cmd_modules) do - module.add_to_parser(parser) - end - - return parser -end - ---- Main command-line processor. --- Parses input arguments and calls the appropriate driver function --- to execute the action requested on the command-line, forwarding --- to it any additional arguments passed by the user. --- @param description string: Short summary description of the program. --- @param commands table: contains the loaded modules representing commands. --- @param external_namespace string: where to look for external commands. --- @param ... string: Arguments given on the command-line. -function cmd.run_command(description, commands, external_namespace, ...) - - check_popen() - - -- Preliminary initialization - cfg.init() - - fs.init() - - for _, module_name in ipairs(fs.modules(external_namespace)) do - if not commands[module_name] then - commands[module_name] = external_namespace.."."..module_name - end - end - - local cmd_modules = {} - for name, module in pairs(commands) do - local pok, mod = pcall(require, module) - if pok and type(mod) == "table" then - local original_command = mod.command - if original_command then - if not mod.add_to_parser then - mod.add_to_parser = function(parser) - parser:command(name, mod.help, util.see_also()) - :summary(mod.help_summary) - :handle_options(false) - :argument("input") - :args("*") - end - - mod.command = function(args) - return original_command(args, unpack(args.input)) - end - end - cmd_modules[name] = mod - else - util.warning("command module " .. module .. " does not implement command(), skipping") - end - else - util.warning("failed to load command module " .. module) - end - end - - local function process_cmdline_vars(...) - local args = pack(...) - local cmdline_vars = {} - local last = args.n - for i = 1, args.n do - if args[i] == "--" then - last = i - 1 - break - end - end - for i = last, 1, -1 do - local arg = args[i] - if arg:match("^[^-][^=]*=") then - local var, val = arg:match("^([A-Z_][A-Z0-9_]*)=(.*)") - if val then - cmdline_vars[var] = val - table.remove(args, i) - else - die("Invalid assignment: "..arg) - end - end - end - - return args, cmdline_vars - end - - local args, cmdline_vars = process_cmdline_vars(...) - local parser = get_parser(description, cmd_modules) - args = parser:parse(args) - - -- Compatibility for old flag - if args.nodeps then - args.deps_mode = "none" - end - - if args.timeout then -- setting it in the config file will kick-in earlier in the process - cfg.connection_timeout = args.timeout - end - - if args.command == "config" then - if args.key == "lua_version" and args.value then - args.lua_version = args.value - elseif args.key == "lua_dir" and args.value then - args.lua_dir = args.value - end - end - - ----------------------------------------------------------------------------- - local lua_found, err = init_config(args) - if err then - die(err) - end - ----------------------------------------------------------------------------- - - -- Now that the config is fully loaded, reinitialize fs using the full - -- feature set. - fs.init() - - -- if the Lua interpreter wasn't explicitly found before cfg.init, - -- try again now. - local tried - if not lua_found then - if cfg.variables.LUA_DIR then - lua_found, tried = util.find_lua(cfg.variables.LUA_DIR, cfg.lua_version, args.verbose) - else - lua_found, tried = search_lua_in_path(cfg.lua_version, args.verbose) - end - end - - if not lua_found and args.command ~= "config" and args.command ~= "help" then - util.warning(tried .. - "\nModules may not install with the correct configurations. " .. - "You may want to configure the path prefix to your build " .. - "of Lua " .. cfg.lua_version .. " using\n\n" .. - " luarocks config --local lua_dir \n") - end - cfg.lua_found = lua_found - - if cfg.project_dir then - cfg.project_dir = fs.absolute_name(cfg.project_dir) - end - - if args.verbose then - cfg.verbose = true - fs.verbose() - 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 - - local ok, err = process_tree_args(args, cfg.project_dir) - if not ok then - die(err) - end - - ok, err = process_server_args(args) - if not ok then - die(err) - end - - if args.only_sources then - cfg.only_sources_from = args.only_sources - end - - for k, v in pairs(cmdline_vars) do - cfg.variables[k] = v - end - - -- if running as superuser, use system cache dir - if fs.is_superuser() then - cfg.local_cache = dir.path(fs.system_cache_dir(), "luarocks") - end - - if args.no_manifest then - cfg.no_manifest = true - end - - if not args.command then - parser:epilog(variables_help..get_config_text(cfg)) - util.printout() - util.printout(parser:get_help()) - util.printout() - os.exit(cmd.errorcodes.OK) - end - - local cmd_mod = cmd_modules[args.command] - local call_ok, ok, err, exitcode = xpcall(function() - return cmd_mod.command(args) - end, error_handler) - - if not call_ok then - die(ok, cmd.errorcodes.CRASH) - elseif not ok then - die(err, exitcode) - end - util.run_scheduled_functions() -end - -return cmd diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/build.lua b/.luarocks/share/lua/5.1/luarocks/cmd/build.lua deleted file mode 100644 index 56f0e7576..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/build.lua +++ /dev/null @@ -1,183 +0,0 @@ - ---- Module implementing the LuaRocks "build" command. --- Builds a rock, compiling its C parts if any. -local cmd_build = {} - -local pack = require("luarocks.pack") -local path = require("luarocks.path") -local util = require("luarocks.util") -local fetch = require("luarocks.fetch") -local fs = require("luarocks.fs") -local deps = require("luarocks.deps") -local remove = require("luarocks.remove") -local cfg = require("luarocks.core.cfg") -local build = require("luarocks.build") -local writer = require("luarocks.manif.writer") -local search = require("luarocks.search") -local make = require("luarocks.cmd.make") -local cmd = require("luarocks.cmd") - -function cmd_build.add_to_parser(parser) - local cmd = parser:command("build", "Build and install a rock, compiling its C parts if any.\n".. -- luacheck: ignore 431 - "If the sources contain a luarocks.lock file, uses it as an authoritative source for ".. - "exact version of dependencies.\n".. - "If no arguments are given, behaves as luarocks make.", util.see_also()) - :summary("Build/compile a rock.") - - cmd:argument("rock", "A rockspec file, a source rock file, or the name of ".. - "a rock to be fetched from a repository.") - :args("?") - :action(util.namespaced_name_action) - cmd:argument("version", "Rock version.") - :args("?") - - cmd:flag("--only-deps --deps-only", "Install only the dependencies of the rock.") - cmd:option("--branch", "Override the `source.branch` field in the loaded ".. - "rockspec. Allows to specify a different branch to fetch. Particularly ".. - 'for "dev" rocks.') - :argname("") - cmd:flag("--pin", "Create a luarocks.lock file listing the exact ".. - "versions of each dependency found for this rock (recursively), ".. - "and store it in the rock's directory. ".. - "Ignores any existing luarocks.lock file in the rock's sources.") - make.cmd_options(cmd) -end - ---- Build and install a rock. --- @param rock_filename string: local or remote filename of a rock. --- @param opts table: build options --- @return boolean or (nil, string, [string]): True if build was successful, --- or false and an error message and an optional error code. -local function build_rock(rock_filename, opts) - assert(type(rock_filename) == "string") - assert(opts:type() == "build.opts") - - local ok, err, errcode - - local unpack_dir - unpack_dir, err, errcode = fetch.fetch_and_unpack_rock(rock_filename, nil, opts.verify) - if not unpack_dir then - return nil, err, errcode - end - - local rockspec_filename = path.rockspec_name_from_rock(rock_filename) - - ok, err = fs.change_dir(unpack_dir) - if not ok then return nil, err end - - local rockspec - rockspec, err, errcode = fetch.load_rockspec(rockspec_filename) - if not rockspec then - return nil, err, errcode - end - - ok, err, errcode = build.build_rockspec(rockspec, opts) - - fs.pop_dir() - return ok, err, errcode -end - -local function do_build(name, namespace, version, opts) - assert(type(name) == "string") - assert(type(namespace) == "string" or not namespace) - assert(version == nil or type(version) == "string") - assert(opts:type() == "build.opts") - - local url, err - if name:match("%.rockspec$") or name:match("%.rock$") then - url = name - else - url, err = search.find_src_or_rockspec(name, namespace, version, opts.check_lua_versions) - if not url then - return nil, err - end - end - - if url:match("%.rockspec$") then - local rockspec, err = fetch.load_rockspec(url, nil, opts.verify) - if not rockspec then - return nil, err - end - return build.build_rockspec(rockspec, opts) - end - - if url:match("%.src%.rock$") then - opts.need_to_fetch = false - end - - return build_rock(url, opts) -end - ---- Driver function for "build" command. --- If a package name is given, forwards the request to "search" and, --- if returned a result, installs the matching rock. --- When passing a package name, a version number may also be given. --- @return boolean or (nil, string, exitcode): True if build was successful; nil and an --- error message otherwise. exitcode is optionally returned. -function cmd_build.command(args) - if not args.rock then - return make.command(args) - end - - local opts = build.opts({ - need_to_fetch = true, - minimal_mode = false, - deps_mode = deps.get_deps_mode(args), - build_only_deps = not not (args.only_deps and not args.pack_binary_rock), - namespace = args.namespace, - branch = args.branch, - verify = not not args.verify, - check_lua_versions = not not args.check_lua_versions, - pin = not not args.pin, - no_install = false - }) - - if args.sign and not args.pack_binary_rock then - return nil, "In the build command, --sign is meant to be used only with --pack-binary-rock" - end - - if args.pack_binary_rock then - return pack.pack_binary_rock(args.rock, args.namespace, args.version, args.sign, function() - local name, version = do_build(args.rock, args.namespace, args.version, opts) - if name and args.no_doc then - util.remove_doc_dir(name, version) - end - return name, version - end) - end - - local ok, err = fs.check_command_permissions(args) - if not ok then - return nil, err, cmd.errorcodes.PERMISSIONDENIED - end - - local name, version = do_build(args.rock, args.namespace, args.version, opts) - if not name then - return nil, version - end - - if args.no_doc then - util.remove_doc_dir(name, version) - end - - if opts.build_only_deps then - util.printout("Stopping after installing dependencies for " ..name.." "..version) - util.printout() - else - if (not args.keep) and not cfg.keep_other_versions then - local ok, err, warn = remove.remove_other_versions(name, version, args.force, args.force_fast) - if not ok then - return nil, err - elseif warn then - util.printerr(err) - end - end - end - - if opts.deps_mode ~= "none" then - writer.check_dependencies(nil, deps.get_deps_mode(args)) - end - return name, version -end - -return cmd_build diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/config.lua b/.luarocks/share/lua/5.1/luarocks/cmd/config.lua deleted file mode 100644 index 6a73c7ff1..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/config.lua +++ /dev/null @@ -1,326 +0,0 @@ ---- Module implementing the LuaRocks "config" command. --- Queries information about the LuaRocks configuration. -local config_cmd = {} - -local persist = require("luarocks.persist") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local deps = require("luarocks.deps") -local dir = require("luarocks.dir") -local fs = require("luarocks.fs") - -function config_cmd.add_to_parser(parser) - local cmd = parser:command("config", [[ -Query information about the LuaRocks configuration. - -* When given a configuration key, it prints the value of that key according to - the currently active configuration (taking into account all config files and - any command-line flags passed) - - Examples: - luarocks config lua_interpreter - luarocks config variables.LUA_INCDIR - luarocks config lua_version - -* When given a configuration key and a value, it overwrites the config file (see - the --scope option below to determine which) and replaces the value of the - given key with the given value. - - * `lua_dir` is a special key as it checks for a valid Lua installation - (equivalent to --lua-dir) and sets several keys at once. - * `lua_version` is a special key as it changes the default Lua version - used by LuaRocks commands (equivalent to passing --lua-version). - - Examples: - luarocks config variables.OPENSSL_DIR /usr/local/openssl - luarocks config lua_dir /usr/local - luarocks config lua_version 5.3 - -* When given a configuration key and --unset, it overwrites the config file (see - the --scope option below to determine which) and deletes that key from the - file. - - Example: luarocks config variables.OPENSSL_DIR --unset - -* When given no arguments, it prints the entire currently active configuration, - resulting from reading the config files from all scopes. - - Example: luarocks config]], util.see_also([[ - https://github.com/luarocks/luarocks/wiki/Config-file-format - for detailed information on the LuaRocks config file format. -]])) - :summary("Query information about the LuaRocks configuration.") - - cmd:argument("key", "The configuration key.") - :args("?") - cmd:argument("value", "The configuration value.") - :args("?") - - cmd:option("--scope", "The scope indicates which config file should be rewritten.\n".. - '* Using a wrapper created with `luarocks init`, the default is "project".\n'.. - '* Using --local (or when `local_by_default` is `true`), the default is "user".\n'.. - '* Otherwise, the default is "system".') - :choices({"system", "user", "project"}) - cmd:flag("--unset", "Delete the key from the configuration file.") - cmd:flag("--json", "Output as JSON.") - - -- Deprecated flags - cmd:flag("--lua-incdir"):hidden(true) - cmd:flag("--lua-libdir"):hidden(true) - cmd:flag("--lua-ver"):hidden(true) - cmd:flag("--system-config"):hidden(true) - cmd:flag("--user-config"):hidden(true) - cmd:flag("--rock-trees"):hidden(true) -end - -local function config_file(conf) - print(dir.normalize(conf.file)) - if conf.found then - return true - else - return nil, "file not found" - end -end - -local cfg_skip = { - errorcodes = true, - flags = true, - platforms = true, - root_dir = true, - upload_servers = true, -} - -local function should_skip(k, v) - return type(v) == "function" or cfg_skip[k] -end - -local function cleanup(tbl) - local copy = {} - for k, v in pairs(tbl) do - if not should_skip(k, v) then - copy[k] = v - end - end - return copy -end - -local function traverse_varstring(var, tbl, fn, missing_parent) - local k, r = var:match("^%[([0-9]+)%]%.(.*)$") - if k then - k = tonumber(k) - else - k, r = var:match("^([^.[]+)%.(.*)$") - if not k then - k, r = var:match("^([^[]+)(%[.*)$") - end - end - - if k then - if not tbl[k] and missing_parent then - missing_parent(tbl, k) - end - - if tbl[k] then - return traverse_varstring(r, tbl[k], fn, missing_parent) - else - return nil, "Unknown entry " .. k - end - end - - local i = var:match("^%[([0-9]+)%]$") - if i then - var = tonumber(i) - end - - return fn(tbl, var) -end - -local function print_json(value) - local json_ok, json = util.require_json() - if not json_ok then - return nil, "A JSON library is required for this command. "..json - end - - print(json.encode(value)) - return true -end - -local function print_entry(var, tbl, is_json) - return traverse_varstring(var, tbl, function(t, k) - if not t[k] then - return nil, "Unknown entry " .. k - end - local val = t[k] - - if not should_skip(var, val) then - if is_json then - return print_json(val) - elseif type(val) == "string" then - print(val) - else - persist.write_value(io.stdout, val) - end - end - return true - end) -end - -local function infer_type(var) - local typ - traverse_varstring(var, cfg, function(t, k) - if t[k] ~= nil then - typ = type(t[k]) - end - end) - return typ -end - -local function write_entries(keys, scope, do_unset) - if scope == "project" and not cfg.config_files.project then - return nil, "Current directory is not part of a project. You may want to run `luarocks init`." - end - - local tbl, err = persist.load_config_file_if_basic(cfg.config_files[scope].file, cfg) - if not tbl then - return nil, err - end - - for var, val in util.sortedpairs(keys) do - traverse_varstring(var, tbl, function(t, k) - if do_unset then - t[k] = nil - else - local typ = infer_type(var) - local v - if typ == "number" and tonumber(val) then - v = tonumber(val) - elseif typ == "boolean" and val == "true" then - v = true - elseif typ == "boolean" and val == "false" then - v = false - else - v = val - end - t[k] = v - keys[var] = v - end - return true - end, function(p, k) - p[k] = {} - end) - end - - local ok, err = persist.save_from_table(cfg.config_files[scope].file, tbl) - if ok then - print(do_unset and "Removed" or "Wrote") - for var, val in util.sortedpairs(keys) do - if do_unset then - print(("\t%s"):format(var)) - else - print(("\t%s = %q"):format(var, val)) - end - end - print(do_unset and "from" or "to") - print("\t" .. cfg.config_files[scope].file) - return true - else - return nil, err - end -end - -local function get_scope(args) - return args.scope - or (args["local"] and "user") - or (args.project_tree and "project") - or (cfg.local_by_default and "user") - or (fs.is_writable(cfg.config_files["system"].file and "system")) - or "user" -end - ---- Driver function for "config" command. --- @return boolean: True if succeeded, nil on errors. -function config_cmd.command(args) - deps.check_lua_incdir(cfg.variables, args.lua_version or cfg.lua_version) - deps.check_lua_libdir(cfg.variables, args.lua_version or cfg.lua_version) - - -- deprecated flags - if args.lua_incdir then - print(cfg.variables.LUA_INCDIR) - return true - end - if args.lua_libdir then - print(cfg.variables.LUA_LIBDIR) - return true - end - if args.lua_ver then - print(cfg.lua_version) - return true - end - if args.system_config then - return config_file(cfg.config_files.system) - end - if args.user_config then - return config_file(cfg.config_files.user) - end - if args.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 - - if args.key == "lua_version" and args.value then - local scope = get_scope(args) - if scope == "project" and not cfg.config_files.project then - return nil, "Current directory is not part of a project. You may want to run `luarocks init`." - end - - local prefix = dir.dir_name(cfg.config_files[scope].file) - local ok, err = persist.save_default_lua_version(prefix, args.value) - if not ok then - return nil, "could not set default Lua version: " .. err - end - print("Lua version will default to " .. args.value .. " in " .. prefix) - end - - if args.key == "lua_dir" and args.value then - local scope = get_scope(args) - local keys = { - ["variables.LUA_DIR"] = cfg.variables.LUA_DIR, - ["variables.LUA_BINDIR"] = cfg.variables.LUA_BINDIR, - ["variables.LUA_INCDIR"] = cfg.variables.LUA_INCDIR, - ["variables.LUA_LIBDIR"] = cfg.variables.LUA_LIBDIR, - ["lua_interpreter"] = cfg.lua_interpreter, - } - if args.lua_version then - local prefix = dir.dir_name(cfg.config_files[scope].file) - persist.save_default_lua_version(prefix, args.lua_version) - end - return write_entries(keys, scope, args.unset) - end - - if args.key then - if args.value or args.unset then - local scope = get_scope(args) - return write_entries({ [args.key] = args.value or args.unset }, scope, args.unset) - else - return print_entry(args.key, cfg, args.json) - end - end - - local cleancfg = cleanup(cfg) - - if args.json then - return print_json(cleancfg) - else - print(persist.save_from_table_to_string(cleancfg)) - return true - end -end - -return config_cmd diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/doc.lua b/.luarocks/share/lua/5.1/luarocks/cmd/doc.lua deleted file mode 100644 index ae4712302..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/doc.lua +++ /dev/null @@ -1,153 +0,0 @@ - ---- Module implementing the LuaRocks "doc" command. --- Shows documentation for an installed rock. -local doc = {} - -local util = require("luarocks.util") -local queries = require("luarocks.queries") -local search = require("luarocks.search") -local path = require("luarocks.path") -local dir = require("luarocks.dir") -local fetch = require("luarocks.fetch") -local fs = require("luarocks.fs") -local download = require("luarocks.download") - -function doc.add_to_parser(parser) - local cmd = parser:command("doc", "Show documentation for an installed rock.\n\n".. - "Without any flags, tries to load the documentation using a series of heuristics.\n".. - "With flags, return only the desired information.", util.see_also([[ - For more information about a rock, see the 'show' command. -]])) - :summary("Show documentation for an installed rock.") - - cmd:argument("rock", "Name of the rock.") - :action(util.namespaced_name_action) - cmd:argument("version", "Version of the rock.") - :args("?") - - cmd:flag("--home", "Open the home page of project.") - cmd:flag("--list", "List documentation files only.") - cmd:flag("--porcelain", "Produce machine-friendly output.") -end - -local function show_homepage(homepage, name, namespace, version) - if not homepage then - return nil, "No 'homepage' field in rockspec for "..util.format_rock_name(name, namespace, version) - end - util.printout("Opening "..homepage.." ...") - fs.browser(homepage) - return true -end - -local function try_to_open_homepage(name, namespace, version) - local temp_dir, err = fs.make_temp_dir("doc-"..name.."-"..(version or "")) - if not temp_dir then - return nil, "Failed creating temporary directory: "..err - end - util.schedule_function(fs.delete, temp_dir) - local ok, err = fs.change_dir(temp_dir) - if not ok then return nil, err end - local filename, err = download.download("rockspec", name, namespace, version) - if not filename then return nil, err end - local rockspec, err = fetch.load_local_rockspec(filename) - if not rockspec then return nil, err end - fs.pop_dir() - local descript = rockspec.description or {} - return show_homepage(descript.homepage, name, namespace, version) -end - ---- Driver function for "doc" command. --- @return boolean: True if succeeded, nil on errors. -function doc.command(args) - local query = queries.new(args.rock, args.namespace, args.version) - local iname, iversion, repo = search.pick_installed_rock(query, args.tree) - if not iname then - local rock = util.format_rock_name(args.rock, args.namespace, args.version) - util.printout(rock.." is not installed. Looking for it in the rocks servers...") - return try_to_open_homepage(args.rock, args.namespace, args.version) - end - local name, version = iname, iversion - - local rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version, repo)) - if not rockspec then return nil,err end - local descript = rockspec.description or {} - - if args.home then - return show_homepage(descript.homepage, name, args.namespace, version) - end - - local directory = path.install_dir(name, version, repo) - - local docdir - local directories = { "doc", "docs" } - for _, d in ipairs(directories) do - local dirname = dir.path(directory, d) - if fs.is_dir(dirname) then - docdir = dirname - break - end - end - if not docdir then - if descript.homepage and not args.list then - util.printout("Local documentation directory not found -- opening "..descript.homepage.." ...") - fs.browser(descript.homepage) - return true - end - return nil, "Documentation directory not found for "..name.." "..version - end - - docdir = dir.normalize(docdir):gsub("/+", "/") - local files = fs.find(docdir) - local htmlpatt = "%.html?$" - local extensions = { htmlpatt, "%.md$", "%.txt$", "%.textile$", "" } - local basenames = { "index", "readme", "manual" } - - local porcelain = args.porcelain - if #files > 0 then - util.title("Documentation files for "..name.." "..version, porcelain) - if porcelain then - for _, file in ipairs(files) do - util.printout(docdir.."/"..file) - end - else - util.printout(docdir.."/") - for _, file in ipairs(files) do - util.printout("\t"..file) - end - end - end - - if args.list then - return true - end - - for _, extension in ipairs(extensions) do - for _, basename in ipairs(basenames) do - local filename = basename..extension - local found - for _, file in ipairs(files) do - if file:lower():match(filename) and ((not found) or #file < #found) then - found = file - end - end - if found then - local pathname = dir.path(docdir, found) - util.printout() - util.printout("Opening "..pathname.." ...") - util.printout() - local ok = fs.browser(pathname) - if not ok and not pathname:match(htmlpatt) then - local fd = io.open(pathname, "r") - util.printout(fd:read("*a")) - fd:close() - end - return true - end - end - end - - return true -end - - -return doc diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/download.lua b/.luarocks/share/lua/5.1/luarocks/cmd/download.lua deleted file mode 100644 index eae824395..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/download.lua +++ /dev/null @@ -1,51 +0,0 @@ - ---- Module implementing the luarocks "download" command. --- Download a rock from the repository. -local cmd_download = {} - -local util = require("luarocks.util") -local download = require("luarocks.download") - -function cmd_download.add_to_parser(parser) - local cmd = parser:command("download", "Download a specific rock file from a rocks server.", util.see_also()) - - cmd:argument("name", "Name of the rock.") - :args("?") - :action(util.namespaced_name_action) - cmd:argument("version", "Version of the rock.") - :args("?") - - cmd:flag("--all", "Download all files if there are multiple matches.") - cmd:mutex( - cmd:flag("--source", "Download .src.rock if available."), - cmd:flag("--rockspec", "Download .rockspec if available."), - cmd:option("--arch", "Download rock for a specific architecture.")) - cmd:flag("--check-lua-versions", "If the rock can't be found, check repository ".. - "and report if it is available for another Lua version.") -end - ---- Driver function for the "download" command. --- @return boolean or (nil, string): true if successful or nil followed --- by an error message. -function cmd_download.command(args) - if not args.name and not args.all then - return nil, "Argument missing. "..util.see_help("download") - end - - args.name = args.name or "" - - local arch - - if args.source then - arch = "src" - elseif args.rockspec then - arch = "rockspec" - elseif args.arch then - arch = args.arch - end - - local dl, err = download.download(arch, args.name, args.namespace, args.version, args.all, args.check_lua_versions) - return dl and true, err -end - -return cmd_download diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/init.lua b/.luarocks/share/lua/5.1/luarocks/cmd/init.lua deleted file mode 100644 index 8bccb23f0..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/init.lua +++ /dev/null @@ -1,176 +0,0 @@ - -local init = {} - -local cfg = require("luarocks.core.cfg") -local fs = require("luarocks.fs") -local path = require("luarocks.path") -local deps = require("luarocks.deps") -local dir = require("luarocks.dir") -local util = require("luarocks.util") -local persist = require("luarocks.persist") -local write_rockspec = require("luarocks.cmd.write_rockspec") - -function init.add_to_parser(parser) - local cmd = parser:command("init", "Initialize a directory for a Lua project using LuaRocks.", util.see_also()) - - cmd:argument("name", "The project name.") - :args("?") - cmd:argument("version", "An optional project version.") - :args("?") - cmd:flag("--reset", "Delete .luarocks/config-5.x.lua and ./lua and generate new ones.") - - cmd:group("Options for specifying rockspec data", write_rockspec.cmd_options(cmd)) -end - -local function write_gitignore(entries) - local gitignore = "" - local fd = io.open(".gitignore", "r") - if fd then - gitignore = fd:read("*a") - fd:close() - gitignore = "\n" .. gitignore .. "\n" - end - - fd = io.open(".gitignore", gitignore and "a" or "w") - for _, entry in ipairs(entries) do - entry = "/" .. entry - if not gitignore:find("\n"..entry.."\n", 1, true) then - fd:write(entry.."\n") - end - end - fd:close() -end - ---- Driver function for "init" command. --- @return boolean: True if succeeded, nil on errors. -function init.command(args) - - local pwd = fs.current_dir() - - if not args.name then - args.name = dir.base_name(pwd) - if args.name == "/" then - return nil, "When running from the root directory, please specify the argument" - end - end - - util.title("Initializing project '" .. args.name .. "' for Lua " .. cfg.lua_version .. " ...") - - util.printout("Checking your Lua installation ...") - if not cfg.lua_found then - return nil, "Lua installation is not found." - end - local ok, err = deps.check_lua_incdir(cfg.variables) - if not ok then - return nil, err - end - - local has_rockspec = false - for file in fs.dir() do - if file:match("%.rockspec$") then - has_rockspec = true - break - end - end - - if not has_rockspec then - args.version = args.version or "dev" - args.location = pwd - local ok, err = write_rockspec.command(args) - if not ok then - util.printerr(err) - end - end - - local ext = cfg.wrapper_suffix - local luarocks_wrapper = "luarocks" .. ext - local lua_wrapper = "lua" .. ext - - util.printout("Adding entries to .gitignore ...") - write_gitignore({ luarocks_wrapper, lua_wrapper, "lua_modules", ".luarocks" }) - - util.printout("Preparing ./.luarocks/ ...") - fs.make_dir(".luarocks") - local config_file = ".luarocks/config-" .. cfg.lua_version .. ".lua" - - if args.reset then - fs.delete(lua_wrapper) - fs.delete(config_file) - end - - local config_tbl, err = persist.load_config_file_if_basic(config_file, cfg) - if config_tbl then - local globals = { - "lua_interpreter", - } - for _, v in ipairs(globals) do - if cfg[v] then - config_tbl[v] = cfg[v] - end - end - - local varnames = { - "LUA_DIR", - "LUA_INCDIR", - "LUA_LIBDIR", - "LUA_BINDIR", - "LUA_INTERPRETER", - } - for _, varname in ipairs(varnames) do - if cfg.variables[varname] then - config_tbl.variables = config_tbl.variables or {} - config_tbl.variables[varname] = cfg.variables[varname] - end - end - local ok, err = persist.save_from_table(config_file, config_tbl) - if ok then - util.printout("Wrote " .. config_file) - else - util.printout("Failed writing " .. config_file .. ": " .. err) - end - else - util.printout("Will not attempt to overwrite " .. config_file) - end - - ok, err = persist.save_default_lua_version(".luarocks", cfg.lua_version) - if not ok then - util.printout("Failed setting default Lua version: " .. err) - end - - util.printout("Preparing ./lua_modules/ ...") - - fs.make_dir("lua_modules/lib/luarocks/rocks-" .. cfg.lua_version) - local tree = dir.path(pwd, "lua_modules") - - luarocks_wrapper = dir.path(".", luarocks_wrapper) - if not fs.exists(luarocks_wrapper) then - util.printout("Preparing " .. luarocks_wrapper .. " ...") - fs.wrap_script(arg[0], luarocks_wrapper, "none", nil, nil, "--project-tree", tree) - else - util.printout(luarocks_wrapper .. " already exists. Not overwriting it!") - end - - lua_wrapper = dir.path(".", lua_wrapper) - local write_lua_wrapper = true - if fs.exists(lua_wrapper) then - if not util.lua_is_wrapper(lua_wrapper) then - util.printout(lua_wrapper .. " already exists and does not look like a wrapper script. Not overwriting.") - write_lua_wrapper = false - end - end - - if write_lua_wrapper then - local interp = dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter) - if util.check_lua_version(interp, cfg.lua_version) then - util.printout("Preparing " .. lua_wrapper .. " for version " .. cfg.lua_version .. "...") - path.use_tree(tree) - fs.wrap_script(nil, lua_wrapper, "all") - else - util.warning("No Lua interpreter detected for version " .. cfg.lua_version .. ". Not creating " .. lua_wrapper) - end - end - - return true -end - -return init diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/install.lua b/.luarocks/share/lua/5.1/luarocks/cmd/install.lua deleted file mode 100644 index c2e947b20..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/install.lua +++ /dev/null @@ -1,258 +0,0 @@ ---- Module implementing the LuaRocks "install" command. --- Installs binary rocks. -local install = {} - -local path = require("luarocks.path") -local repos = require("luarocks.repos") -local fetch = require("luarocks.fetch") -local util = require("luarocks.util") -local fs = require("luarocks.fs") -local deps = require("luarocks.deps") -local writer = require("luarocks.manif.writer") -local remove = require("luarocks.remove") -local search = require("luarocks.search") -local queries = require("luarocks.queries") -local cfg = require("luarocks.core.cfg") -local cmd = require("luarocks.cmd") - -function install.add_to_parser(parser) - local cmd = parser:command("install", "Install a rock.", util.see_also()) -- luacheck: ignore 431 - - cmd:argument("rock", "The name of a rock to be fetched from a repository ".. - "or a filename of a locally available rock.") - :action(util.namespaced_name_action) - cmd:argument("version", "Version of the rock.") - :args("?") - - cmd:flag("--keep", "Do not remove previously installed versions of the ".. - "rock after building a new one. This behavior can be made permanent by ".. - "setting keep_other_versions=true in the configuration file.") - cmd:flag("--force", "If --keep is not specified, force removal of ".. - "previously installed versions if it would break dependencies.") - cmd:flag("--force-fast", "Like --force, but performs a forced removal ".. - "without reporting dependency issues.") - cmd:flag("--only-deps --deps-only", "Install only the dependencies of the rock.") - cmd:flag("--no-doc", "Install the rock without its documentation.") - cmd:flag("--verify", "Verify signature of the rockspec or src.rock being ".. - "built. If the rockspec or src.rock is being downloaded, LuaRocks will ".. - "attempt to download the signature as well. Otherwise, the signature ".. - "file should be already available locally in the same directory.\n".. - "You need the signer’s public key in your local keyring for this ".. - "option to work properly.") - cmd:flag("--check-lua-versions", "If the rock can't be found, check repository ".. - "and report if it is available for another Lua version.") - util.deps_mode_option(cmd) - cmd:flag("--no-manifest", "Skip creating/updating the manifest") - cmd:flag("--pin", "If the installed rock is a Lua module, create a ".. - "luarocks.lock file listing the exact versions of each dependency found for ".. - "this rock (recursively), and store it in the rock's directory. ".. - "Ignores any existing luarocks.lock file in the rock's sources.") - -- luarocks build options - parser:flag("--pack-binary-rock"):hidden(true) - parser:option("--branch"):hidden(true) - parser:flag("--sign"):hidden(true) -end - -install.opts = util.opts_table("install.opts", { - namespace = "string?", - keep = "boolean", - force = "boolean", - force_fast = "boolean", - no_doc = "boolean", - deps_mode = "string", - verify = "boolean", -}) - ---- Install a binary rock. --- @param rock_file string: local or remote filename of a rock. --- @param opts table: installation options --- @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 install.install_binary_rock(rock_file, opts) - assert(type(rock_file) == "string") - assert(opts:type() == "install.opts") - - local namespace = opts.namespace - local deps_mode = opts.deps_mode - - 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 - if repos.is_installed(name, version) then - repos.delete_version(name, version, opts.deps_mode) - end - - local install_dir = path.install_dir(name, version) - - local rollback = util.schedule_function(function() - fs.delete(install_dir) - fs.remove_dir_if_empty(path.versions_dir(name)) - end) - - local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, install_dir, opts.verify) - if not ok then return nil, err, errcode end - - local rockspec, err = fetch.load_rockspec(path.rockspec_file(name, version)) - if err then - return nil, "Failed loading rockspec for installed package: "..err, errcode - end - - if opts.deps_mode ~= "none" then - ok, err, errcode = deps.check_external_deps(rockspec, "install") - if err then return nil, err, errcode end - end - - -- For compatibility with .rock files built with LuaRocks 1 - if not fs.exists(path.rock_manifest_file(name, version)) then - ok, err = writer.make_rock_manifest(name, version) - if err then return nil, err end - end - - if namespace then - ok, err = writer.make_namespace_file(name, version, namespace) - if err then return nil, err end - end - - if deps_mode ~= "none" then - ok, err, errcode = deps.fulfill_dependencies(rockspec, "dependencies", deps_mode, opts.verify, install_dir) - if err then return nil, err, errcode end - end - - ok, err = repos.deploy_files(name, version, repos.should_wrap_bin_scripts(rockspec), deps_mode) - if err then return nil, err end - - util.remove_scheduled_function(rollback) - rollback = util.schedule_function(function() - repos.delete_version(name, version, deps_mode) - end) - - ok, err = repos.run_hook(rockspec, "post_install") - if err then return nil, err end - - util.announce_install(rockspec) - util.remove_scheduled_function(rollback) - return name, version -end - ---- Installs the dependencies of a binary rock. --- @param rock_file string: local or remote filename of a rock. --- @param opts table: installation options --- @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, opts) - assert(type(rock_file) == "string") - assert(opts:type() == "install.opts") - - 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 install_dir = path.install_dir(name, version) - - local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, install_dir, opts.verify) - if not ok then return nil, err, errcode end - - local rockspec, err = 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, "dependencies", opts.deps_mode, opts.verify, install_dir) - if err then return nil, err, errcode end - - util.printout() - util.printout("Successfully installed dependencies for " ..name.." "..version) - - return name, version -end - -local function install_rock_file_deps(filename, opts) - assert(opts:type() == "install.opts") - - local name, version = install.install_binary_rock_deps(filename, opts) - if not name then return nil, version end - - writer.check_dependencies(nil, opts.deps_mode) - return name, version -end - -local function install_rock_file(filename, opts) - assert(type(filename) == "string") - assert(opts:type() == "install.opts") - - local name, version = install.install_binary_rock(filename, opts) - if not name then return nil, version end - - if opts.no_doc then - util.remove_doc_dir(name, version) - end - - if (not opts.keep) and not cfg.keep_other_versions then - local ok, err, warn = remove.remove_other_versions(name, version, opts.force, opts.force_fast) - if not ok then - return nil, err - elseif warn then - util.printerr(err) - end - end - - writer.check_dependencies(nil, opts.deps_mode) - return name, version -end - ---- Driver function for the "install" command. --- If an URL or pathname to a binary rock is given, fetches and installs it. --- If a rockspec or a source rock is given, forwards the request to the "build" --- command. --- If a package name is given, forwards the request to "search" and, --- if returned a result, installs the matching rock. --- @return boolean or (nil, string, exitcode): True if installation was --- successful, nil and an error message otherwise. exitcode is optionally returned. -function install.command(args) - local ok, err = fs.check_command_permissions(args) - if not ok then return nil, err, cmd.errorcodes.PERMISSIONDENIED end - - if args.rock:match("%.rockspec$") or args.rock:match("%.src%.rock$") then - local build = require("luarocks.cmd.build") - return build.command(args) - elseif args.rock:match("%.rock$") then - local deps_mode = deps.get_deps_mode(args) - local opts = install.opts({ - namespace = args.namespace, - keep = not not args.keep, - force = not not args.force, - force_fast = not not args.force_fast, - no_doc = not not args.no_doc, - deps_mode = deps_mode, - verify = not not args.verify, - }) - if args.only_deps then - return install_rock_file_deps(args.rock, opts) - else - return install_rock_file(args.rock, opts) - end - else - local url, err = search.find_rock_checking_lua_versions( - queries.new(args.rock, args.namespace, args.version), - args.check_lua_versions) - if not url then - return nil, err - end - util.printout("Installing "..url) - args.rock = url - return install.command(args) - end -end - -return install diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/lint.lua b/.luarocks/share/lua/5.1/luarocks/cmd/lint.lua deleted file mode 100644 index 47a3da906..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/lint.lua +++ /dev/null @@ -1,50 +0,0 @@ - ---- Module implementing the LuaRocks "lint" command. --- Utility function that checks syntax of the rockspec. -local lint = {} - -local util = require("luarocks.util") -local download = require("luarocks.download") -local fetch = require("luarocks.fetch") - -function lint.add_to_parser(parser) - local cmd = parser:command("lint", "Check syntax of a rockspec.\n\n".. - "Returns success if the text of the rockspec is syntactically correct, else failure.", - util.see_also()) - :summary("Check syntax of a rockspec.") - - cmd:argument("rockspec", "The rockspec to check.") -end - -function lint.command(args) - - local filename = args.rockspec - if not filename:match(".rockspec$") then - local err - filename, err = download.download("rockspec", filename:lower()) - if not filename then - return nil, err - end - end - - local rs, err = fetch.load_local_rockspec(filename) - if not rs then - return nil, "Failed loading rockspec: "..err - end - - local ok = true - - -- This should have been done in the type checker, - -- but it would break compatibility of other commands. - -- Making 'lint' alone be stricter shouldn't be a problem, - -- because extra-strict checks is what lint-type commands - -- are all about. - if not rs.description.license then - util.printerr("Rockspec has no license field.") - ok = false - end - - return ok, ok or filename.." failed consistency checks." -end - -return lint diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/list.lua b/.luarocks/share/lua/5.1/luarocks/cmd/list.lua deleted file mode 100644 index 7b2682f64..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/list.lua +++ /dev/null @@ -1,96 +0,0 @@ - ---- Module implementing the LuaRocks "list" command. --- Lists currently installed rocks. -local list = {} - -local search = require("luarocks.search") -local queries = require("luarocks.queries") -local vers = require("luarocks.core.vers") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local path = require("luarocks.path") - -function list.add_to_parser(parser) - local cmd = parser:command("list", "List currently installed rocks.", util.see_also()) - - cmd:argument("filter", "A substring of a rock name to filter by.") - :args("?") - cmd:argument("version", "Rock version to filter by.") - :args("?") - - cmd:flag("--outdated", "List only rocks for which there is a higher ".. - "version available in the rocks server.") - cmd:flag("--porcelain", "Produce machine-friendly output.") -end - -local function check_outdated(trees, query) - local results_installed = {} - for _, tree in ipairs(trees) do - search.local_manifest_search(results_installed, path.rocks_dir(tree), query) - end - local outdated = {} - for name, versions in util.sortedpairs(results_installed) do - versions = util.keys(versions) - table.sort(versions, vers.compare_versions) - local latest_installed = versions[1] - - local query_available = queries.new(name:lower()) - local results_available, err = search.search_repos(query_available) - - if results_available[name] then - local available_versions = util.keys(results_available[name]) - table.sort(available_versions, vers.compare_versions) - local latest_available = available_versions[1] - local latest_available_repo = results_available[name][latest_available][1].repo - - if vers.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. --- @return boolean: True if succeeded, nil on errors. -function list.command(args) - local query = queries.new(args.filter and args.filter:lower() or "", args.namespace, args.version, true) - local trees = cfg.rocks_trees - local title = "Rocks installed for Lua "..cfg.lua_version - if args.tree then - trees = { args.tree } - title = title .. " in " .. args.tree - end - - if args.outdated then - return list_outdated(trees, query, args.porcelain) - end - - local results = {} - for _, tree in ipairs(trees) do - local ok, err, errcode = search.local_manifest_search(results, path.rocks_dir(tree), query) - if not ok and errcode ~= "open" then - util.warning(err) - end - end - util.title(title, args.porcelain) - search.print_result_tree(results, args.porcelain) - return true -end - -return list diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/make.lua b/.luarocks/share/lua/5.1/luarocks/cmd/make.lua deleted file mode 100644 index 8b313bb93..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/make.lua +++ /dev/null @@ -1,158 +0,0 @@ - ---- Module implementing the LuaRocks "make" command. --- Builds sources in the current directory, but unlike "build", --- it does not fetch sources, etc., assuming everything is --- available in the current directory. -local make = {} - -local build = require("luarocks.build") -local fs = require("luarocks.fs") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") -local fetch = require("luarocks.fetch") -local pack = require("luarocks.pack") -local remove = require("luarocks.remove") -local deps = require("luarocks.deps") -local writer = require("luarocks.manif.writer") -local cmd = require("luarocks.cmd") - -function make.cmd_options(parser) - parser:flag("--no-install", "Do not install the rock.") - parser:flag("--no-doc", "Install the rock without its documentation.") - parser:flag("--pack-binary-rock", "Do not install rock. Instead, produce a ".. - ".rock file with the contents of compilation in the current directory.") - parser:flag("--keep", "Do not remove previously installed versions of the ".. - "rock after building a new one. This behavior can be made permanent by ".. - "setting keep_other_versions=true in the configuration file.") - parser:flag("--force", "If --keep is not specified, force removal of ".. - "previously installed versions if it would break dependencies.") - parser:flag("--force-fast", "Like --force, but performs a forced removal ".. - "without reporting dependency issues.") - parser:flag("--verify", "Verify signature of the rockspec or src.rock being ".. - "built. If the rockspec or src.rock is being downloaded, LuaRocks will ".. - "attempt to download the signature as well. Otherwise, the signature ".. - "file should be already available locally in the same directory.\n".. - "You need the signer’s public key in your local keyring for this ".. - "option to work properly.") - parser:flag("--sign", "To be used with --pack-binary-rock. Also produce a ".. - "signature file for the generated .rock file.") - parser:flag("--check-lua-versions", "If the rock can't be found, check repository ".. - "and report if it is available for another Lua version.") - parser:flag("--pin", "Pin the exact dependencies used for the rockspec".. - "being built into a luarocks.lock file in the current directory.") - parser:flag("--no-manifest", "Skip creating/updating the manifest") - parser:flag("--only-deps --deps-only", "Install only the dependencies of the rock.") - util.deps_mode_option(parser) -end - -function make.add_to_parser(parser) - -- luacheck: push ignore 431 - local cmd = parser:command("make", [[ -Builds sources in the current directory, but unlike "build", it does not fetch -sources, etc., assuming everything is available in the current directory. If no -argument is given, it looks for a rockspec in the current directory and in -"rockspec/" and "rockspecs/" subdirectories, picking the rockspec with newest -version or without version name. If rockspecs for different rocks are found or -there are several rockspecs without version, you must specify which to use, -through the command-line. - -This command is useful as a tool for debugging rockspecs. -To install rocks, you'll normally want to use the "install" and "build" -commands. See the help on those for details. - -If the current directory contains a luarocks.lock file, it is used as the -authoritative source for exact version of dependencies. The --pin flag -overrides and recreates this file scanning dependency based on ranges. -]], util.see_also()) - :summary("Compile package in current directory using a rockspec.") - -- luacheck: pop - - cmd:argument("rockspec", "Rockspec for the rock to build.") - :args("?") - - make.cmd_options(cmd) -end - ---- Driver function for "make" command. --- @return boolean or (nil, string, exitcode): True if build was successful; nil and an --- error message otherwise. exitcode is optionally returned. -function make.command(args) - local rockspec_filename = args.rockspec - if not rockspec_filename then - local err - rockspec_filename, err = util.get_default_rockspec() - if not rockspec_filename then - return nil, err - end - end - if not rockspec_filename:match("rockspec$") then - return nil, "Invalid argument: 'make' takes a rockspec as a parameter. "..util.see_help("make") - end - - local rockspec, err, errcode = fetch.load_rockspec(rockspec_filename) - if not rockspec then - return nil, err - end - - local name, namespace = util.split_namespace(rockspec.name) - namespace = namespace or args.namespace - - local opts = build.opts({ - need_to_fetch = false, - minimal_mode = true, - deps_mode = deps.get_deps_mode(args), - build_only_deps = not not (args.only_deps and not args.pack_binary_rock), - namespace = namespace, - branch = args.branch, - verify = not not args.verify, - check_lua_versions = not not args.check_lua_versions, - pin = not not args.pin, - no_install = not not args.no_install - }) - - if args.sign and not args.pack_binary_rock then - return nil, "In the make command, --sign is meant to be used only with --pack-binary-rock" - end - - if args.no_install then - return build.build_rockspec(rockspec, opts) - elseif args.pack_binary_rock then - return pack.pack_binary_rock(name, namespace, rockspec.version, args.sign, function() - local name, version = build.build_rockspec(rockspec, opts) -- luacheck: ignore 431 - if name and args.no_doc then - util.remove_doc_dir(name, version) - end - return name, version - end) - else - local ok, err = fs.check_command_permissions(args) - if not ok then return nil, err, cmd.errorcodes.PERMISSIONDENIED end - ok, err = build.build_rockspec(rockspec, opts) - if not ok then return nil, err end - local name, version = ok, err -- luacheck: ignore 421 - - if opts.build_only_deps then - util.printout("Stopping after installing dependencies for " ..name.." "..version) - util.printout() - return name, version - end - - if args.no_doc then - util.remove_doc_dir(name, version) - end - - if (not args.keep) and not cfg.keep_other_versions then - local ok, err, warn = remove.remove_other_versions(name, version, args.force, args.force_fast) - if not ok then - return nil, err - elseif warn then - util.printerr(warn) - end - end - - writer.check_dependencies(nil, deps.get_deps_mode(args)) - return name, version - end -end - -return make diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/new_version.lua b/.luarocks/share/lua/5.1/luarocks/cmd/new_version.lua deleted file mode 100644 index 49479910c..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/new_version.lua +++ /dev/null @@ -1,228 +0,0 @@ - ---- Module implementing the LuaRocks "new_version" command. --- Utility function that writes a new rockspec, updating data from a previous one. -local new_version = {} - -local util = require("luarocks.util") -local download = require("luarocks.download") -local fetch = require("luarocks.fetch") -local persist = require("luarocks.persist") -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local type_rockspec = require("luarocks.type.rockspec") - -function new_version.add_to_parser(parser) - local cmd = parser:command("new_version", [[ -This is a utility function that writes a new rockspec, updating data from a -previous one. - -If a package name is given, it downloads the latest rockspec from the default -server. If a rockspec is given, it uses it instead. If no argument is given, it -looks for a rockspec same way 'luarocks make' does. - -If the version number is not given and tag is passed using --tag, it is used as -the version, with 'v' removed from beginning. Otherwise, it only increments the -revision number of the given (or downloaded) rockspec. - -If a URL is given, it replaces the one from the old rockspec with the given URL. -If a URL is not given and a new version is given, it tries to guess the new URL -by replacing occurrences of the version number in the URL or tag; if the guessed -URL is invalid, the old URL is restored. It also tries to download the new URL -to determine the new MD5 checksum. - -If a tag is given, it replaces the one from the old rockspec. If there is an old -tag but no new one passed, it is guessed in the same way URL is. - -If a directory is not given, it defaults to the current directory. - -WARNING: it writes the new rockspec to the given directory, overwriting the file -if it already exists.]], util.see_also()) - :summary("Auto-write a rockspec for a new version of a rock.") - - cmd:argument("rock", "Package name or rockspec.") - :args("?") - cmd:argument("new_version", "New version of the rock.") - :args("?") - cmd:argument("new_url", "New URL of the rock.") - :args("?") - - cmd:option("--dir", "Output directory for the new rockspec.") - cmd:option("--tag", "New SCM tag.") -end - - -local function try_replace(tbl, field, old, new) - if not tbl[field] then - return false - end - local old_field = tbl[field] - local new_field = tbl[field]:gsub(old, new) - if new_field ~= old_field then - util.printout("Guessing new '"..field.."' field as "..new_field) - tbl[field] = new_field - return true - end - return false -end - --- Try to download source file using URL from a rockspec. --- If it specified MD5, update it. --- @return (true, false) if MD5 was not specified or it stayed same, --- (true, true) if MD5 changed, (nil, string) on error. -local function check_url_and_update_md5(out_rs, invalid_is_error) - local file, temp_dir = fetch.fetch_url_at_temp_dir(out_rs.source.url, "luarocks-new-version-"..out_rs.package) - if not file then - if invalid_is_error then - return nil, "invalid URL - "..temp_dir - end - util.warning("invalid URL - "..temp_dir) - return true, false - end - - local inferred_dir, found_dir = fetch.find_base_dir(file, temp_dir, out_rs.source.url, out_rs.source.dir) - if not inferred_dir then - return nil, found_dir - end - - if found_dir and found_dir ~= inferred_dir then - out_rs.source.dir = found_dir - end - - if file then - if out_rs.source.md5 then - util.printout("File successfully downloaded. Updating MD5 checksum...") - local new_md5, err = fs.get_md5(file) - if not new_md5 then - return nil, err - end - local old_md5 = out_rs.source.md5 - out_rs.source.md5 = new_md5 - return true, new_md5 ~= old_md5 - else - util.printout("File successfully downloaded.") - return true, false - end - end -end - -local function update_source_section(out_rs, url, tag, old_ver, new_ver) - if tag then - out_rs.source.tag = tag - end - if url then - out_rs.source.url = url - return check_url_and_update_md5(out_rs) - end - if new_ver == old_ver then - return true - end - if out_rs.source.dir then - try_replace(out_rs.source, "dir", old_ver, new_ver) - end - if out_rs.source.file then - try_replace(out_rs.source, "file", old_ver, new_ver) - end - - local old_url = out_rs.source.url - if try_replace(out_rs.source, "url", old_ver, new_ver) then - local ok, md5_changed = check_url_and_update_md5(out_rs, true) - if ok then - return ok, md5_changed - end - out_rs.source.url = old_url - end - if tag or try_replace(out_rs.source, "tag", old_ver, new_ver) then - return true - end - -- Couldn't replace anything significant, use the old URL. - local ok, md5_changed = check_url_and_update_md5(out_rs) - if not ok then - return nil, md5_changed - end - if md5_changed then - util.warning("URL is the same, but MD5 has changed. Old rockspec is broken.") - end - return true -end - -function new_version.command(args) - if not args.rock then - local err - args.rock, err = util.get_default_rockspec() - if not args.rock then - return nil, err - end - end - - local filename, err - if args.rock:match("rockspec$") then - filename, err = fetch.fetch_url(args.rock) - if not filename then - return nil, err - end - else - filename, err = download.download("rockspec", args.rock:lower()) - if not filename then - return nil, err - end - end - - local valid_rs, err = fetch.load_rockspec(filename) - if not valid_rs then - return nil, err - end - - local old_ver, old_rev = valid_rs.version:match("(.*)%-(%d+)$") - local new_ver, new_rev - - if args.tag and not args.new_version then - args.new_version = args.tag:gsub("^v", "") - end - - local out_dir - if args.dir then - out_dir = dir.normalize(args.dir) - end - - if args.new_version then - new_ver, new_rev = args.new_version:match("(.*)%-(%d+)$") - new_rev = tonumber(new_rev) - if not new_rev then - new_ver = args.new_version - new_rev = 1 - end - else - new_ver = old_ver - new_rev = tonumber(old_rev) + 1 - end - local new_rockver = new_ver:gsub("-", "") - - local out_rs, err = persist.load_into_table(filename) - local out_name = out_rs.package:lower() - out_rs.version = new_rockver.."-"..new_rev - - local ok, err = update_source_section(out_rs, args.new_url, args.tag, old_ver, new_ver) - if not ok then return nil, err end - - if out_rs.build and out_rs.build.type == "module" then - out_rs.build.type = "builtin" - end - - local out_filename = out_name.."-"..new_rockver.."-"..new_rev..".rockspec" - if out_dir then - out_filename = dir.path(out_dir, out_filename) - fs.make_dir(out_dir) - end - persist.save_from_table(out_filename, out_rs, type_rockspec.order) - - util.printout("Wrote "..out_filename) - - local valid_out_rs, err = fetch.load_local_rockspec(out_filename) - if not valid_out_rs then - return nil, "Failed loading generated rockspec: "..err - end - - return true -end - -return new_version diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/pack.lua b/.luarocks/share/lua/5.1/luarocks/cmd/pack.lua deleted file mode 100644 index 29a43e7b0..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/pack.lua +++ /dev/null @@ -1,36 +0,0 @@ - ---- Module implementing the LuaRocks "pack" command. --- Creates a rock, packing sources or binaries. -local cmd_pack = {} - -local util = require("luarocks.util") -local pack = require("luarocks.pack") -local queries = require("luarocks.queries") - -function cmd_pack.add_to_parser(parser) - local cmd = parser:command("pack", "Create a rock, packing sources or binaries.", util.see_also()) - - cmd:argument("rock", "A rockspec file, for creating a source rock, or the ".. - "name of an installed package, for creating a binary rock.") - :action(util.namespaced_name_action) - cmd:argument("version", "A version may be given if the first argument is a rock name.") - :args("?") - - cmd:flag("--sign", "Produce a signature file as well.") -end - ---- Driver function for the "pack" command. --- @return boolean or (nil, string): true if successful or nil followed --- by an error message. -function cmd_pack.command(args) - local file, err - if args.rock:match(".*%.rockspec") then - file, err = pack.pack_source_rock(args.rock) - else - local query = queries.new(args.rock, args.namespace, args.version) - file, err = pack.pack_installed_rock(query, args.tree) - end - return pack.report_and_sign_local_file(file, err, args.sign) -end - -return cmd_pack diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/path.lua b/.luarocks/share/lua/5.1/luarocks/cmd/path.lua deleted file mode 100644 index 9b6fee71a..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/path.lua +++ /dev/null @@ -1,70 +0,0 @@ - ---- @module luarocks.path_cmd --- Driver for the `luarocks path` command. -local path_cmd = {} - -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") -local fs = require("luarocks.fs") - -function path_cmd.add_to_parser(parser) - local cmd = parser:command("path", [[ -Returns the package path currently configured for this installation -of LuaRocks, formatted as shell commands to update LUA_PATH and LUA_CPATH. - -On Unix systems, you may run: - eval `luarocks path` -And on Windows: - luarocks path > "%temp%\_lrp.bat" && call "%temp%\_lrp.bat" && del "%temp%\_lrp.bat"]], - util.see_also()) - :summary("Return the currently configured package path.") - - cmd:flag("--no-bin", "Do not export the PATH variable.") - cmd:flag("--append", "Appends the paths to the existing paths. Default is ".. - "to prefix the LR paths to the existing paths.") - cmd:flag("--lr-path", "Exports the Lua path (not formatted as shell command).") - cmd:flag("--lr-cpath", "Exports the Lua cpath (not formatted as shell command).") - cmd:flag("--lr-bin", "Exports the system path (not formatted as shell command).") - cmd:flag("--bin"):hidden(true) -end - ---- Driver function for "path" command. --- @return boolean This function always succeeds. -function path_cmd.command(args) - local lr_path, lr_cpath, lr_bin = cfg.package_paths(args.tree) - local path_sep = cfg.export_path_separator - - if args.lr_path then - util.printout(util.cleanup_path(lr_path, ';', cfg.lua_version, true)) - return true - elseif args.lr_cpath then - util.printout(util.cleanup_path(lr_cpath, ';', cfg.lua_version, true)) - return true - elseif args.lr_bin then - util.printout(util.cleanup_path(lr_bin, path_sep, nil, true)) - return true - end - - local clean_path = util.cleanup_path(os.getenv("PATH") or "", path_sep, nil, true) - - if args.append then - lr_path = package.path .. ";" .. lr_path - lr_cpath = package.cpath .. ";" .. lr_cpath - lr_bin = clean_path .. path_sep .. lr_bin - else - lr_path = lr_path.. ";" .. package.path - lr_cpath = lr_cpath .. ";" .. package.cpath - lr_bin = lr_bin .. path_sep .. clean_path - end - - local lpath_var, lcpath_var = util.lua_path_variables() - - util.printout(fs.export_cmd(lpath_var, util.cleanup_path(lr_path, ';', cfg.lua_version, args.append))) - util.printout(fs.export_cmd(lcpath_var, util.cleanup_path(lr_cpath, ';', cfg.lua_version, args.append))) - if not args.no_bin then - util.printout(fs.export_cmd("PATH", util.cleanup_path(lr_bin, path_sep, nil, args.append))) - end - return true -end - -return path_cmd diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/purge.lua b/.luarocks/share/lua/5.1/luarocks/cmd/purge.lua deleted file mode 100644 index c300e286e..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/purge.lua +++ /dev/null @@ -1,84 +0,0 @@ - ---- Module implementing the LuaRocks "purge" command. --- Remove all rocks from a given tree. -local purge = {} - -local util = require("luarocks.util") -local fs = require("luarocks.fs") -local path = require("luarocks.path") -local search = require("luarocks.search") -local vers = require("luarocks.core.vers") -local repos = require("luarocks.repos") -local writer = require("luarocks.manif.writer") -local cfg = require("luarocks.core.cfg") -local remove = require("luarocks.remove") -local queries = require("luarocks.queries") -local cmd = require("luarocks.cmd") - -function purge.add_to_parser(parser) - -- luacheck: push ignore 431 - local cmd = parser:command("purge", [[ -This command removes rocks en masse from a given tree. -By default, it removes all rocks from a tree. - -The --tree option is mandatory: luarocks purge does not assume a default tree.]], - util.see_also()) - :summary("Remove all installed rocks from a tree.") - -- luacheck: pop - - cmd:flag("--old-versions", "Keep the highest-numbered version of each ".. - "rock and remove the other ones. By default it only removes old ".. - "versions if they are not needed as dependencies. This can be ".. - "overridden with the flag --force.") - cmd:flag("--force", "If --old-versions is specified, force removal of ".. - "previously installed versions if it would break dependencies.") - cmd:flag("--force-fast", "Like --force, but performs a forced removal ".. - "without reporting dependency issues.") -end - -function purge.command(args) - local tree = args.tree - - if type(tree) ~= "string" then - return nil, "The --tree argument is mandatory. "..util.see_help("purge") - end - - local results = {} - if not fs.is_dir(tree) then - return nil, "Directory not found: "..tree - end - - local ok, err = fs.check_command_permissions(args) - if not ok then return nil, err, cmd.errorcodes.PERMISSIONDENIED end - - search.local_manifest_search(results, path.rocks_dir(tree), queries.all()) - - local sort = function(a,b) return vers.compare_versions(b,a) end - if args.old_versions then - sort = vers.compare_versions - end - - for package, versions in util.sortedpairs(results) do - for version, _ in util.sortedpairs(versions, sort) do - if args.old_versions then - util.printout("Keeping "..package.." "..version.."...") - local ok, err, warn = remove.remove_other_versions(package, version, args.force, args.force_fast) - if not ok then - util.printerr(err) - elseif warn then - util.printerr(err) - end - break - else - util.printout("Removing "..package.." "..version.."...") - local ok, err = repos.delete_version(package, version, "none", true) - if not ok then - util.printerr(err) - end - end - end - end - return writer.make_manifest(cfg.rocks_dir, "one") -end - -return purge diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/remove.lua b/.luarocks/share/lua/5.1/luarocks/cmd/remove.lua deleted file mode 100644 index 6bb69ad63..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/remove.lua +++ /dev/null @@ -1,75 +0,0 @@ - ---- Module implementing the LuaRocks "remove" command. --- Uninstalls rocks. -local cmd_remove = {} - -local remove = require("luarocks.remove") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") -local fs = require("luarocks.fs") -local search = require("luarocks.search") -local path = require("luarocks.path") -local deps = require("luarocks.deps") -local writer = require("luarocks.manif.writer") -local queries = require("luarocks.queries") -local cmd = require("luarocks.cmd") - -function cmd_remove.add_to_parser(parser) - -- luacheck: push ignore 431 - local cmd = parser:command("remove", [[ -Uninstall a rock. - -If a version is not given, try to remove all versions at once. -Will only perform the removal if it does not break dependencies. -To override this check and force the removal, use --force or --force-fast.]], - util.see_also()) - :summary("Uninstall a rock.") - -- luacheck: pop - - cmd:argument("rock", "Name of the rock to be uninstalled.") - :action(util.namespaced_name_action) - cmd:argument("version", "Version of the rock to uninstall.") - :args("?") - - cmd:flag("--force", "Force removal if it would break dependencies.") - cmd:flag("--force-fast", "Perform a forced removal without reporting dependency issues.") - util.deps_mode_option(cmd) -end - ---- Driver function for the "remove" command. --- @return boolean or (nil, string, exitcode): True if removal was --- successful, nil and an error message otherwise. exitcode is optionally returned. -function cmd_remove.command(args) - local name = args.rock - local deps_mode = deps.get_deps_mode(args) - - local ok, err = fs.check_command_permissions(args) - if not ok then return nil, err, cmd.errorcodes.PERMISSIONDENIED end - - local rock_type = name:match("%.(rock)$") or name:match("%.(rockspec)$") - local version = args.version - local filename = name - if rock_type then - name, version = path.parse_name(filename) - if not name then return nil, "Invalid "..rock_type.." filename: "..filename end - end - - name = name:lower() - - local results = {} - search.local_manifest_search(results, cfg.rocks_dir, queries.new(name, args.namespace, version)) - if not results[name] then - local rock = util.format_rock_name(name, args.namespace, version) - return nil, "Could not find rock '"..rock.."' in "..path.rocks_tree_to_string(cfg.root_dir) - end - - ok, err = remove.remove_search_results(results, name, deps_mode, args.force, args.force_fast) - if not ok then - return nil, err - end - - writer.check_dependencies(nil, deps.get_deps_mode(args)) - return true -end - -return cmd_remove diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/search.lua b/.luarocks/share/lua/5.1/luarocks/cmd/search.lua deleted file mode 100644 index 6cab6d800..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/search.lua +++ /dev/null @@ -1,84 +0,0 @@ - ---- Module implementing the LuaRocks "search" command. --- Queries LuaRocks servers. -local cmd_search = {} - -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local search = require("luarocks.search") -local queries = require("luarocks.queries") -local results = require("luarocks.results") - -function cmd_search.add_to_parser(parser) - local cmd = parser:command("search", "Query the LuaRocks servers.", util.see_also()) - - cmd:argument("name", "Name of the rock to search for.") - :args("?") - :action(util.namespaced_name_action) - cmd:argument("version", "Rock version to search for.") - :args("?") - - cmd:flag("--source", "Return only rockspecs and source rocks, to be used ".. - 'with the "build" command.') - cmd:flag("--binary", "Return only pure Lua and binary rocks (rocks that ".. - 'can be used with the "install" command without requiring a C toolchain).') - cmd:flag("--all", "List all contents of the server that are suitable to ".. - "this platform, do not filter by name.") - cmd:flag("--porcelain", "Return a machine readable format.") -end - ---- Splits a list of search results into two lists, one for "source" results --- to be used with the "build" command, and one for "binary" results to be --- used with the "install" command. --- @param result_tree table: A search results table. --- @return (table, table): Two tables, one for source and one for binary --- results. -local function split_source_and_binary_results(result_tree) - local sources, binaries = {}, {} - for name, versions in pairs(result_tree) do - for version, repositories in pairs(versions) do - for _, repo in ipairs(repositories) do - local where = sources - if repo.arch == "all" or repo.arch == cfg.arch then - where = binaries - end - local entry = results.new(name, version, repo.repo, repo.arch) - search.store_result(where, entry) - end - end - end - return sources, binaries -end - ---- Driver function for "search" command. --- @return boolean or (nil, string): True if build was successful; nil and an --- error message otherwise. -function cmd_search.command(args) - local name = args.name - - if args.all then - name, args.version = "", nil - end - - if not args.name and not args.all then - return nil, "Enter name and version or use --all. "..util.see_help("search") - end - - local query = queries.new(name, args.namespace, args.version, true) - local result_tree, err = search.search_repos(query) - local porcelain = args.porcelain - local full_name = util.format_rock_name(name, args.namespace, args.version) - util.title(full_name .. " - Search results for Lua "..cfg.lua_version..":", porcelain, "=") - local sources, binaries = split_source_and_binary_results(result_tree) - if next(sources) and not args.binary then - util.title("Rockspecs and source rocks:", porcelain) - search.print_result_tree(sources, porcelain) - end - if next(binaries) and not args.source then - util.title("Binary and pure-Lua rocks:", porcelain) - search.print_result_tree(binaries, porcelain) - end - return true -end - -return cmd_search diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/show.lua b/.luarocks/share/lua/5.1/luarocks/cmd/show.lua deleted file mode 100644 index d93459fd2..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/show.lua +++ /dev/null @@ -1,315 +0,0 @@ ---- Module implementing the LuaRocks "show" command. --- Shows information about an installed rock. -local show = {} - -local queries = require("luarocks.queries") -local search = require("luarocks.search") -local dir = require("luarocks.core.dir") -local fs = require("luarocks.fs") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local path = require("luarocks.path") -local fetch = require("luarocks.fetch") -local manif = require("luarocks.manif") -local repos = require("luarocks.repos") - -function show.add_to_parser(parser) - local cmd = parser:command("show", [[ -Show information about an installed rock. - -Without any flags, show all module information. -With flags, return only the desired information.]], util.see_also()) - :summary("Show information about an installed rock.") - - cmd:argument("rock", "Name of an installed rock.") - :action(util.namespaced_name_action) - cmd:argument("version", "Rock version.") - :args("?") - - cmd:flag("--home", "Show home page of project.") - cmd:flag("--modules", "Show all modules provided by the package as used by require().") - cmd:flag("--deps", "Show packages the package depends on.") - cmd:flag("--build-deps", "Show build-only dependencies for the package.") - cmd:flag("--test-deps", "Show dependencies for testing the package.") - cmd:flag("--rockspec", "Show the full path of the rockspec file.") - cmd:flag("--mversion", "Show the package version.") - cmd:flag("--rock-tree", "Show local tree where rock is installed.") - cmd:flag("--rock-namespace", "Show rock namespace.") - cmd:flag("--rock-dir", "Show data directory of the installed rock.") - cmd:flag("--rock-license", "Show rock license.") - cmd:flag("--issues", "Show URL for project's issue tracker.") - cmd:flag("--labels", "List the labels of the rock.") - cmd:flag("--porcelain", "Produce machine-friendly output.") -end - -local friendly_template = [[ - : -?namespace:${namespace}/${package} ${version} - ${summary} -!namespace:${package} ${version} - ${summary} - : -*detailed :${detailed} -?detailed : -?license :License: \t${license} -?homepage :Homepage: \t${homepage} -?issues :Issues: \t${issues} -?labels :Labels: \t${labels} -?location :Installed in: \t${location} -?commands : -?commands :Commands: -*commands :\t${name} (${file}) -?modules : -?modules :Modules: -*modules :\t${name} (${file}) -?bdeps : -?bdeps :Has build dependency on: -*bdeps :\t${name} (${label}) -?tdeps : -?tdeps :Tests depend on: -*tdeps :\t${name} (${label}) -?deps : -?deps :Depends on: -*deps :\t${name} (${label}) -?ideps : -?ideps :Indirectly pulling: -*ideps :\t${name} (${label}) - : -]] - -local porcelain_template = [[ -?namespace:namespace\t${namespace} -?package :package\t${package} -?version :version\t${version} -?summary :summary\t${summary} -*detailed :detailed\t${detailed} -?license :license\t${license} -?homepage :homepage\t${homepage} -?issues :issues\t${issues} -?labels :labels\t${labels} -?location :location\t${location} -*commands :command\t${name}\t${file} -*modules :module\t${name}\t${file} -*bdeps :build_dependency\t${name}\t${label} -*tdeps :test_dependency\t${name}\t${label} -*deps :dependency\t${name}\t${label} -*ideps :indirect_dependency\t${name}\t${label} -]] - -local function keys_as_string(t, sep) - local keys = util.keys(t) - table.sort(keys) - return table.concat(keys, sep or " ") -end - -local function word_wrap(line) - local width = tonumber(os.getenv("COLUMNS")) or 80 - if width > 80 then width = 80 end - if #line > width then - local brk = width - while brk > 0 and line:sub(brk, brk) ~= " " do - brk = brk - 1 - end - if brk > 0 then - return line:sub(1, brk-1) .. "\n" .. word_wrap(line:sub(brk+1)) - end - end - return line -end - -local function format_text(text) - text = text:gsub("^%s*",""):gsub("%s$", ""):gsub("\n[ \t]+","\n"):gsub("([^\n])\n([^\n])","%1 %2") - local paragraphs = util.split_string(text, "\n\n") - for n, line in ipairs(paragraphs) do - paragraphs[n] = word_wrap(line) - end - return (table.concat(paragraphs, "\n\n"):gsub("%s$", "")) -end - -local function installed_rock_label(dep, tree) - local installed, version - local rocks_provided = util.get_rocks_provided() - if rocks_provided[dep.name] then - installed, version = true, rocks_provided[dep.name] - else - installed, version = search.pick_installed_rock(dep, tree) - end - return installed and "using "..version or "missing" -end - -local function render(template, data) - local out = {} - for cmd, var, line in template:gmatch("(.)([a-z]*)%s*:([^\n]*)\n") do - line = line:gsub("\\t", "\t") - local d = data[var] - if cmd == " " then - table.insert(out, line) - elseif cmd == "?" or cmd == "*" or cmd == "!" then - if (cmd == "!" and d == nil) - or (cmd ~= "!" and (type(d) == "string" - or (type(d) == "table" and next(d)))) then - local n = cmd == "*" and #d or 1 - for i = 1, n do - local tbl = cmd == "*" and d[i] or data - if type(tbl) == "string" then - tbl = tbl:gsub("%%", "%%%%") - end - table.insert(out, (line:gsub("${([a-z]+)}", tbl))) - end - end - end - end - return table.concat(out, "\n") -end - -local function adjust_path(name, version, basedir, pathname, suffix) - pathname = dir.path(basedir, pathname) - local vpathname = path.versioned_name(pathname, basedir, name, version) - return (fs.exists(vpathname) - and vpathname - or pathname) .. (suffix or "") -end - -local function modules_to_list(name, version, repo) - local ret = {} - local rock_manifest = manif.load_rock_manifest(name, version, repo) - - local lua_dir = path.deploy_lua_dir(repo) - local lib_dir = path.deploy_lib_dir(repo) - repos.recurse_rock_manifest_entry(rock_manifest.lua, function(pathname) - table.insert(ret, { - name = path.path_to_module(pathname), - file = adjust_path(name, version, lua_dir, pathname), - }) - end) - repos.recurse_rock_manifest_entry(rock_manifest.lib, function(pathname) - table.insert(ret, { - name = path.path_to_module(pathname), - file = adjust_path(name, version, lib_dir, pathname), - }) - end) - table.sort(ret, function(a, b) - if a.name == b.name then - return a.file < b.file - end - return a.name < b.name - end) - return ret -end - -local function commands_to_list(name, version, repo) - local ret = {} - local rock_manifest = manif.load_rock_manifest(name, version, repo) - - local bin_dir = path.deploy_bin_dir(repo) - repos.recurse_rock_manifest_entry(rock_manifest.bin, function(pathname) - pathname = adjust_path(name, version, bin_dir, pathname) - table.insert(ret, { - name = pathname, - file = adjust_path(name, version, bin_dir, pathname, cfg.wrapper_suffix), - }) - end) - table.sort(ret, function(a, b) - if a.name == b.name then - return a.file < b.file - end - return a.name < b.name - end) - return ret -end - -local function deps_to_list(dependencies, tree) - local ret = {} - for _, dep in ipairs(dependencies or {}) do - table.insert(ret, { name = tostring(dep), label = installed_rock_label(dep, tree) }) - end - return ret -end - -local function indirect_deps(mdeps, rdeps, tree) - local ret = {} - local direct_deps = {} - for _, dep in ipairs(rdeps) do - direct_deps[dep] = true - end - for dep_name in util.sortedpairs(mdeps or {}) do - if not direct_deps[dep_name] then - table.insert(ret, { name = tostring(dep_name), label = installed_rock_label(queries.new(dep_name), tree) }) - end - end - return ret -end - -local function show_rock(template, namespace, name, version, rockspec, repo, minfo, tree) - local desc = rockspec.description or {} - local data = { - namespace = namespace, - package = rockspec.package, - version = rockspec.version, - summary = desc.summary or "", - detailed = desc.detailed and util.split_string(format_text(desc.detailed), "\n"), - license = desc.license, - homepage = desc.homepage, - issues = desc.issues_url, - labels = desc.labels and table.concat(desc.labels, ", "), - location = path.rocks_tree_to_string(repo), - commands = commands_to_list(name, version, repo), - modules = modules_to_list(name, version, repo), - bdeps = deps_to_list(rockspec.build_dependencies, tree), - tdeps = deps_to_list(rockspec.test_dependencies, tree), - deps = deps_to_list(rockspec.dependencies, tree), - ideps = indirect_deps(minfo.dependencies, rockspec.dependencies, tree), - } - util.printout(render(template, data)) -end - ---- Driver function for "show" command. --- @return boolean: True if succeeded, nil on errors. -function show.command(args) - local query = queries.new(args.rock, args.namespace, args.version, true) - - local name, version, repo, repo_url = search.pick_installed_rock(query, args.tree) - if not name then - return nil, version - end - local tree = path.rocks_tree_to_string(repo) - local directory = path.install_dir(name, version, repo) - local namespace = path.read_namespace(name, version, tree) - local rockspec_file = path.rockspec_file(name, version, repo) - local rockspec, err = fetch.load_local_rockspec(rockspec_file) - if not rockspec then return nil,err end - - local descript = rockspec.description or {} - local manifest, err = manif.load_manifest(repo_url) - if not manifest then return nil,err end - local minfo = manifest.repository[name][version][1] - - if args.rock_tree then util.printout(tree) - elseif args.rock_namespace then util.printout(namespace) - elseif args.rock_dir then util.printout(directory) - elseif args.home then util.printout(descript.homepage) - elseif args.rock_license then util.printout(descript.license) - elseif args.issues then util.printout(descript.issues_url) - elseif args.labels then util.printout(descript.labels and table.concat(descript.labels, "\n")) - elseif args.modules then util.printout(keys_as_string(minfo.modules, "\n")) - elseif args.deps then - for _, dep in ipairs(rockspec.dependencies) do - util.printout(tostring(dep)) - end - elseif args.build_deps then - for _, dep in ipairs(rockspec.build_dependencies) do - util.printout(tostring(dep)) - end - elseif args.test_deps then - for _, dep in ipairs(rockspec.test_dependencies) do - util.printout(tostring(dep)) - end - elseif args.rockspec then util.printout(rockspec_file) - elseif args.mversion then util.printout(version) - elseif args.porcelain then - show_rock(porcelain_template, namespace, name, version, rockspec, repo, minfo, args.tree) - else - show_rock(friendly_template, namespace, name, version, rockspec, repo, minfo, args.tree) - end - return true -end - -return show diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/test.lua b/.luarocks/share/lua/5.1/luarocks/cmd/test.lua deleted file mode 100644 index b353bd80b..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/test.lua +++ /dev/null @@ -1,48 +0,0 @@ - ---- Module implementing the LuaRocks "test" command. --- Tests a rock, compiling its C parts if any. -local cmd_test = {} - -local util = require("luarocks.util") -local test = require("luarocks.test") - -function cmd_test.add_to_parser(parser) - local cmd = parser:command("test", [[ -Run the test suite for the Lua project in the current directory. - -If the first argument is a rockspec, it will use it to determine the parameters -for running tests; otherwise, it will attempt to detect the rockspec. - -Any additional arguments are forwarded to the test suite. -To make sure that test suite flags are not interpreted as LuaRocks flags, use -- -to separate LuaRocks arguments from test suite arguments.]], - util.see_also()) - :summary("Run the test suite in the current directory.") - - cmd:argument("rockspec", "Project rockspec.") - :args("?") - cmd:argument("args", "Test suite arguments.") - :args("*") - cmd:flag("--prepare", "Only install dependencies needed for testing only, but do not run the test") - - cmd:option("--test-type", "Specify the test suite type manually if it was ".. - "not specified in the rockspec and it could not be auto-detected.") - :argname("") -end - -function cmd_test.command(args) - if args.rockspec and args.rockspec:match("rockspec$") then - return test.run_test_suite(args.rockspec, args.test_type, args.args, args.prepare) - end - - table.insert(args.args, 1, args.rockspec) - - local rockspec, err = util.get_default_rockspec() - if not rockspec then - return nil, err - end - - return test.run_test_suite(rockspec, args.test_type, args.args, args.prepare) -end - -return cmd_test diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/unpack.lua b/.luarocks/share/lua/5.1/luarocks/cmd/unpack.lua deleted file mode 100644 index 94da2c9f8..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/unpack.lua +++ /dev/null @@ -1,168 +0,0 @@ - ---- Module implementing the LuaRocks "unpack" command. --- Unpack the contents of a rock. -local unpack = {} - -local fetch = require("luarocks.fetch") -local fs = require("luarocks.fs") -local util = require("luarocks.util") -local build = require("luarocks.build") -local dir = require("luarocks.dir") -local search = require("luarocks.search") - -function unpack.add_to_parser(parser) - local cmd = parser:command("unpack", [[ -Unpacks the contents of a rock in a newly created directory. -Argument may be a rock file, or the name of a rock in a rocks server. -In the latter case, the rock version may be given as a second argument.]], - util.see_also()) - :summary("Unpack the contents of a rock.") - - cmd:argument("rock", "A rock file or the name of a rock.") - :action(util.namespaced_name_action) - cmd:argument("version", "Rock version.") - :args("?") - - cmd:flag("--force", "Unpack files even if the output directory already exists.") - cmd:flag("--check-lua-versions", "If the rock can't be found, check repository ".. - "and report if it is available for another Lua version.") -end - ---- Load a rockspec file to the given directory, fetches the source --- files specified in the rockspec, and unpack them inside the directory. --- @param rockspec_file string: The URL for a rockspec file. --- @param dir_name string: The directory where to store and unpack files. --- @return table or (nil, string): the loaded rockspec table or --- nil and an error message. -local function unpack_rockspec(rockspec_file, dir_name) - assert(type(rockspec_file) == "string") - assert(type(dir_name) == "string") - - local rockspec, err = fetch.load_rockspec(rockspec_file) - if not rockspec then - return nil, "Failed loading rockspec "..rockspec_file..": "..err - end - local ok, err = fs.change_dir(dir_name) - if not ok then return nil, err end - local ok, sources_dir = fetch.fetch_sources(rockspec, true, ".") - if not ok then - return nil, sources_dir - end - ok, err = fs.change_dir(sources_dir) - if not ok then return nil, err end - ok, err = build.apply_patches(rockspec) - fs.pop_dir() - if not ok then return nil, err end - return rockspec -end - ---- Load a .rock file to the given directory and unpack it inside it. --- @param rock_file string: The URL for a .rock file. --- @param dir_name string: The directory where to unpack. --- @param kind string: the kind of rock file, as in the second-level --- extension in the rock filename (eg. "src", "all", "linux-x86") --- @return table or (nil, string): the loaded rockspec table or --- nil and an error message. -local function unpack_rock(rock_file, dir_name, kind) - assert(type(rock_file) == "string") - assert(type(dir_name) == "string") - - local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, dir_name) - if not ok then - return nil, err, errcode - end - ok, err = fs.change_dir(dir_name) - if not ok then return nil, err end - local rockspec_file = dir_name..".rockspec" - local rockspec, err = fetch.load_rockspec(rockspec_file) - if not rockspec then - return nil, "Failed loading rockspec "..rockspec_file..": "..err - end - if kind == "src" then - if rockspec.source.file then - local ok, err = fs.unpack_archive(rockspec.source.file) - if not ok then - return nil, err - end - ok, err = fs.change_dir(rockspec.source.dir) - if not ok then return nil, err end - ok, err = build.apply_patches(rockspec) - fs.pop_dir() - if not ok then return nil, err end - end - end - return rockspec -end - ---- Create a directory and perform the necessary actions so that --- the sources for the rock and its rockspec are unpacked inside it, --- laid out properly so that the 'make' command is able to build the module. --- @param file string: A rockspec or .rock URL. --- @return boolean or (nil, string): true if successful or nil followed --- by an error message. -local function run_unpacker(file, force) - assert(type(file) == "string") - - local base_name = dir.base_name(file) - local dir_name, kind, extension = base_name:match("(.*)%.([^.]+)%.(rock)$") - if not extension then - dir_name, extension = base_name:match("(.*)%.(rockspec)$") - kind = "rockspec" - end - if not extension then - return nil, file.." does not seem to be a valid filename." - end - - local exists = fs.exists(dir_name) - if exists and not force then - return nil, "Directory "..dir_name.." already exists." - end - if not exists then - local ok, err = fs.make_dir(dir_name) - if not ok then return nil, err end - end - local rollback = util.schedule_function(fs.delete, fs.absolute_name(dir_name)) - - local rockspec, err - if extension == "rock" then - rockspec, err = unpack_rock(file, dir_name, kind) - elseif extension == "rockspec" then - rockspec, err = unpack_rockspec(file, dir_name) - end - if not rockspec then - return nil, err - end - if kind == "src" or kind == "rockspec" then - if rockspec.source.dir ~= "." then - local ok = fs.copy(rockspec.local_abs_filename, rockspec.source.dir, "read") - if not ok then - return nil, "Failed copying unpacked rockspec into unpacked source directory." - end - end - util.printout() - util.printout("Done. You may now enter directory ") - util.printout(dir.path(dir_name, rockspec.source.dir)) - util.printout("and type 'luarocks make' to build.") - end - util.remove_scheduled_function(rollback) - return true -end - ---- Driver function for the "unpack" command. --- @return boolean or (nil, string): true if successful or nil followed --- by an error message. -function unpack.command(args) - local url, err - if args.rock:match(".*%.rock") or args.rock:match(".*%.rockspec") then - url = args.rock - else - url, err = search.find_src_or_rockspec(args.rock, args.namespace, args.version, args.check_lua_versions) - if not url then - return nil, err - end - end - - return run_unpacker(url, args.force) -end - -return unpack diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/upload.lua b/.luarocks/share/lua/5.1/luarocks/cmd/upload.lua deleted file mode 100644 index 6b84e452f..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/upload.lua +++ /dev/null @@ -1,128 +0,0 @@ - -local upload = {} - -local signing = require("luarocks.signing") -local util = require("luarocks.util") -local fetch = require("luarocks.fetch") -local pack = require("luarocks.pack") -local cfg = require("luarocks.core.cfg") -local Api = require("luarocks.upload.api") - -function upload.add_to_parser(parser) - local cmd = parser:command("upload", "Pack a source rock file (.src.rock extension) ".. - "and upload it and the rockspec to the public rocks repository.", util.see_also()) - :summary("Upload a rockspec to the public rocks repository.") - - cmd:argument("rockspec", "Rockspec for the rock to upload.") - cmd:argument("src-rock", "A corresponding .src.rock file; if not given it will be generated.") - :args("?") - - cmd:flag("--skip-pack", "Do not pack and send source rock.") - cmd:option("--api-key", "Pass an API key. It will be stored for subsequent uses.") - :argname("") - cmd:option("--temp-key", "Use the given a temporary API key in this ".. - "invocation only. It will not be stored.") - :argname("") - cmd:flag("--force", "Replace existing rockspec if the same revision of a ".. - "module already exists. This should be used only in case of upload ".. - "mistakes: when updating a rockspec, increment the revision number ".. - "instead.") - cmd:flag("--sign", "Upload a signature file alongside each file as well.") - cmd:flag("--debug"):hidden(true) -end - -local function is_dev_version(version) - return version:match("^dev") or version:match("^scm") -end - -function upload.command(args) - local api, err = Api.new(args) - if not api then - return nil, err - end - if cfg.verbose then - api.debug = true - end - - local rockspec, err, errcode = fetch.load_rockspec(args.rockspec) - if err then - return nil, err, errcode - end - - util.printout("Sending " .. tostring(args.rockspec) .. " ...") - local res, err = api:method("check_rockspec", { - package = rockspec.package, - version = rockspec.version - }) - if not res then return nil, err end - - if not res.module then - util.printout("Will create new module (" .. tostring(rockspec.package) .. ")") - end - if res.version and not args.force then - return nil, "Revision "..rockspec.version.." already exists on the server. "..util.see_help("upload") - end - - local sigfname - local rock_sigfname - - if args.sign then - sigfname, err = signing.sign_file(args.rockspec) - if err then - return nil, "Failed signing rockspec: " .. err - end - util.printout("Signed rockspec: "..sigfname) - end - - local rock_fname - if args.src_rock then - rock_fname = args.src_rock - elseif not args.skip_pack and not is_dev_version(rockspec.version) then - util.printout("Packing " .. tostring(rockspec.package)) - rock_fname, err = pack.pack_source_rock(args.rockspec) - if not rock_fname then - return nil, err - end - end - - if rock_fname and args.sign then - rock_sigfname, err = signing.sign_file(rock_fname) - if err then - return nil, "Failed signing rock: " .. err - end - util.printout("Signed packed rock: "..rock_sigfname) - end - - local multipart = require("luarocks.upload.multipart") - - res, err = api:method("upload", nil, { - rockspec_file = multipart.new_file(args.rockspec), - rockspec_sig = sigfname and multipart.new_file(sigfname), - }) - if not res then return nil, err end - - if res.is_new and #res.manifests == 0 then - util.printerr("Warning: module not added to root manifest due to name taken.") - end - - local module_url = res.module_url - - if rock_fname then - if (not res.version) or (not res.version.id) then - return nil, "Invalid response from server." - end - util.printout(("Sending " .. tostring(rock_fname) .. " ...")) - res, err = api:method("upload_rock/" .. ("%d"):format(res.version.id), nil, { - rock_file = multipart.new_file(rock_fname), - rock_sig = rock_sigfname and multipart.new_file(rock_sigfname), - }) - if not res then return nil, err end - end - - util.printout() - util.printout("Done: " .. tostring(module_url)) - util.printout() - return true -end - -return upload diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/which.lua b/.luarocks/share/lua/5.1/luarocks/cmd/which.lua deleted file mode 100644 index f50a43c33..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/which.lua +++ /dev/null @@ -1,40 +0,0 @@ - ---- @module luarocks.which_cmd --- Driver for the `luarocks which` command. -local which_cmd = {} - -local loader = require("luarocks.loader") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") - -function which_cmd.add_to_parser(parser) - local cmd = parser:command("which", 'Given a module name like "foo.bar", '.. - "output which file would be loaded to resolve that module by ".. - 'luarocks.loader, like "/usr/local/lua/'..cfg.lua_version..'/foo/bar.lua".', - util.see_also()) - :summary("Tell which file corresponds to a given module name.") - - cmd:argument("modname", "Module name.") -end - ---- Driver function for "which" command. --- @return boolean This function terminates the interpreter. -function which_cmd.command(args) - local pathname, rock_name, rock_version, where = loader.which(args.modname, "lp") - - if pathname then - util.printout(pathname) - if where == "l" then - util.printout("(provided by " .. tostring(rock_name) .. " " .. tostring(rock_version) .. ")") - else - local key = rock_name - util.printout("(found directly via package." .. key.. " -- not installed as a rock?)") - end - return true - end - - return nil, "Module '" .. args.modname .. "' not found." -end - -return which_cmd - diff --git a/.luarocks/share/lua/5.1/luarocks/cmd/write_rockspec.lua b/.luarocks/share/lua/5.1/luarocks/cmd/write_rockspec.lua deleted file mode 100644 index 871cdd44c..000000000 --- a/.luarocks/share/lua/5.1/luarocks/cmd/write_rockspec.lua +++ /dev/null @@ -1,408 +0,0 @@ - -local write_rockspec = {} - -local builtin = require("luarocks.build.builtin") -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.dir") -local fetch = require("luarocks.fetch") -local fs = require("luarocks.fs") -local persist = require("luarocks.persist") -local rockspecs = require("luarocks.rockspecs") -local type_rockspec = require("luarocks.type.rockspec") -local util = require("luarocks.util") - -local lua_versions = { - "5.1", - "5.2", - "5.3", - "5.4", - "5.1,5.2", - "5.2,5.3", - "5.3,5.4", - "5.1,5.2,5.3", - "5.2,5.3,5.4", - "5.1,5.2,5.3,5.4" -} - -function write_rockspec.cmd_options(parser) - return parser:option("--output", "Write the rockspec with the given filename.\n".. - "If not given, a file is written in the current directory with a ".. - "filename based on given name and version.") - :argname(""), - parser:option("--license", 'A license string, such as "MIT/X11" or "GNU GPL v3".') - :argname(""), - parser:option("--summary", "A short one-line description summary.") - :argname(""), - parser:option("--detailed", "A longer description string.") - :argname(""), - parser:option("--homepage", "Project homepage.") - :argname(""), - parser:option("--lua-versions", 'Supported Lua versions. Accepted values are: "'.. - table.concat(lua_versions, '", "')..'".') - :argname("") - :choices(lua_versions), - parser:option("--rockspec-format", 'Rockspec format version, such as "1.0" or "1.1".') - :argname(""), - parser:option("--tag", "Tag to use. Will attempt to extract version number from it."), - parser:option("--lib", "A comma-separated list of libraries that C files need to link to.") - :argname("") -end - -function write_rockspec.add_to_parser(parser) - local cmd = parser:command("write_rockspec", [[ -This command writes an initial version of a rockspec file, -based on a name, a version, and a location (an URL or a local path). -If only two arguments are given, the first one is considered the name and the -second one is the location. -If only one argument is given, it must be the location. -If no arguments are given, current directory is used as the location. -LuaRocks will attempt to infer name and version if not given, -using 'dev' as a fallback default version. - -Note that the generated file is a _starting point_ for writing a -rockspec, and is not guaranteed to be complete or correct. ]], util.see_also()) - :summary("Write a template for a rockspec file.") - - cmd:argument("name", "Name of the rock.") - :args("?") - cmd:argument("version", "Rock version.") - :args("?") - cmd:argument("location", "URL or path to the rock sources.") - :args("?") - - write_rockspec.cmd_options(cmd) -end - -local function open_file(name) - return io.open(dir.path(fs.current_dir(), name), "r") -end - -local function fetch_url(rockspec) - local file, temp_dir, err_code, err_file, err_temp_dir = fetch.fetch_sources(rockspec, false) - if err_code == "source.dir" then - file, temp_dir = err_file, err_temp_dir - elseif not file then - util.warning("Could not fetch sources - "..temp_dir) - return false - end - util.printout("File successfully downloaded. Making checksum and checking base dir...") - if dir.is_basic_protocol(rockspec.source.protocol) then - rockspec.source.md5 = fs.get_md5(file) - end - local inferred_dir, found_dir = fetch.find_base_dir(file, temp_dir, rockspec.source.url) - return true, found_dir or inferred_dir, temp_dir -end - -local lua_version_dep = { - ["5.1"] = "lua ~> 5.1", - ["5.2"] = "lua ~> 5.2", - ["5.3"] = "lua ~> 5.3", - ["5.4"] = "lua ~> 5.4", - ["5.1,5.2"] = "lua >= 5.1, < 5.3", - ["5.2,5.3"] = "lua >= 5.2, < 5.4", - ["5.3,5.4"] = "lua >= 5.3, < 5.5", - ["5.1,5.2,5.3"] = "lua >= 5.1, < 5.4", - ["5.2,5.3,5.4"] = "lua >= 5.2, < 5.5", - ["5.1,5.2,5.3,5.4"] = "lua >= 5.1, < 5.5", -} - -local simple_scm_protocols = { - git = true, - ["git+http"] = true, - ["git+https"] = true, - ["git+ssh"] = true, - hg = true, - ["hg+http"] = true, - ["hg+https"] = true, - ["hg+ssh"] = true, -} - -local detect_url -do - local function detect_url_from_command(program, args, directory) - local command = fs.Q(cfg.variables[program:upper()]).. " "..args - local pipe = io.popen(fs.command_at(directory, fs.quiet_stderr(command))) - if not pipe then return nil end - local url = pipe:read("*a"):match("^([^\r\n]+)") - pipe:close() - if not url then return nil end - if url:match("^[^@:/]+@[^@:/]+:.*$") then - local u, h, p = url:match("^([^@]+)@([^:]+):(.*)$") - url = program.."+ssh://"..u.."@"..h.."/"..p - elseif not util.starts_with(url, program.."://") then - url = program.."+"..url - end - - if simple_scm_protocols[dir.split_url(url)] then - return url - end - end - - local function detect_scm_url(directory) - return detect_url_from_command("git", "config --get remote.origin.url", directory) or - detect_url_from_command("hg", "paths default", directory) - end - - detect_url = function(url_or_dir) - if url_or_dir:match("://") then - return url_or_dir - else - return detect_scm_url(url_or_dir) or "*** please add URL for source tarball, zip or repository here ***" - end - end -end - -local function detect_homepage(url, homepage) - if homepage then - return homepage - end - local url_protocol, url_path = dir.split_url(url) - - if simple_scm_protocols[url_protocol] then - for _, domain in ipairs({"github.com", "bitbucket.org", "gitlab.com"}) do - if util.starts_with(url_path, domain) then - return "https://"..url_path:gsub("%.git$", "") - end - end - end - - return "*** please enter a project homepage ***" -end - -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 - summary = paragraph:gsub("\n", "") - else - summary = paragraph:gsub("\n", " "):match("([^.]*%.) ") - end - end - return summary, detailed -end - -local licenses = { - [78656] = "MIT", - [49311] = "ISC", -} - -local function detect_license(data) - local strip_copyright = (data:gsub("^Copyright [^\n]*\n", "")) - local sum = 0 - for i = 1, #strip_copyright do - local num = string.byte(strip_copyright:sub(i,i)) - if num > 32 and num <= 128 then - sum = sum + num - end - end - return licenses[sum] -end - -local function check_license() - local fd = open_file("COPYING") or open_file("LICENSE") or open_file("MIT-LICENSE.txt") - if not fd then return nil end - local data = fd:read("*a") - fd:close() - local license = detect_license(data) - if license then - return license, data - end - return nil, data -end - -local function fill_as_builtin(rockspec, libs) - rockspec.build.type = "builtin" - - local incdirs, libdirs - if libs then - incdirs, libdirs = {}, {} - for _, lib in ipairs(libs) do - local upper = lib:upper() - incdirs[#incdirs+1] = "$("..upper.."_INCDIR)" - libdirs[#libdirs+1] = "$("..upper.."_LIBDIR)" - end - end - - rockspec.build.modules, rockspec.build.install, rockspec.build.copy_directories = builtin.autodetect_modules(libs, incdirs, libdirs) -end - -local function rockspec_cleanup(rockspec) - rockspec.source.file = nil - rockspec.source.protocol = nil - rockspec.source.identifier = nil - rockspec.source.dir = nil - rockspec.source.dir_set = nil - rockspec.source.pathname = nil - rockspec.variables = nil - rockspec.name = nil - rockspec.format_is_at_least = nil - rockspec.local_abs_filename = nil - rockspec.rocks_provided = nil - for _, list in ipairs({"dependencies", "build_dependencies", "test_dependencies"}) do - if rockspec[list] and not next(rockspec[list]) then - rockspec[list] = nil - end - end - for _, list in ipairs({"dependencies", "build_dependencies", "test_dependencies"}) do - if rockspec[list] then - for i, entry in ipairs(rockspec[list]) do - rockspec[list][i] = tostring(entry) - end - end - end -end - -function write_rockspec.command(args) - local name, version = args.name, args.version - local location = args.location - - if not name then - location = "." - elseif not version then - location = name - name = nil - elseif not location then - location = version - version = nil - end - - if args.tag then - if not version then - version = args.tag:gsub("^v", "") - end - end - - local protocol, pathname = dir.split_url(location) - if protocol == "file" then - if pathname == "." then - name = name or dir.base_name(fs.current_dir()) - end - elseif dir.is_basic_protocol(protocol) then - local filename = dir.base_name(location) - local newname, newversion = filename:match("(.*)-([^-]+)") - if newname then - name = name or newname - version = version or newversion:gsub("%.[a-z]+$", ""):gsub("%.tar$", "") - end - else - name = name or dir.base_name(location):gsub("%.[^.]+$", "") - end - - if not name then - return nil, "Could not infer rock name. "..util.see_help("write_rockspec") - end - version = version or "dev" - - local filename = args.output or dir.path(fs.current_dir(), name:lower().."-"..version.."-1.rockspec") - - local url = detect_url(location) - local homepage = detect_homepage(url, args.homepage) - - local rockspec, err = rockspecs.from_persisted_table(filename, { - rockspec_format = args.rockspec_format, - package = name, - version = version.."-1", - source = { - url = url, - tag = args.tag, - }, - description = { - summary = args.summary or "*** please specify description summary ***", - detailed = args.detailed or "*** please enter a detailed description ***", - homepage = homepage, - license = args.license or "*** please specify a license ***", - }, - dependencies = { - lua_version_dep[args.lua_versions], - }, - build = {}, - }) - assert(not err, err) - rockspec.source.protocol = protocol - - if not next(rockspec.dependencies) then - util.warning("Please specify supported Lua versions with --lua-versions=. "..util.see_help("write_rockspec")) - end - - local local_dir = location - - if location:match("://") then - rockspec.source.file = dir.base_name(location) - if not dir.is_basic_protocol(rockspec.source.protocol) then - if version ~= "dev" then - rockspec.source.tag = args.tag or "v" .. version - end - end - rockspec.source.dir = nil - local ok, base_dir, temp_dir = fetch_url(rockspec) - if ok then - if base_dir ~= dir.base_name(location) then - rockspec.source.dir = base_dir - end - end - if base_dir then - local_dir = dir.path(temp_dir, base_dir) - else - local_dir = nil - end - end - - if not local_dir then - local_dir = "." - end - - local libs = nil - if args.lib then - libs = {} - rockspec.external_dependencies = {} - for lib in args.lib:gmatch("([^,]+)") do - table.insert(libs, lib) - rockspec.external_dependencies[lib:upper()] = { - library = lib - } - end - end - - 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 - - if not (args.summary and args.detailed) then - local summary, detailed = detect_description() - rockspec.description.summary = args.summary or summary - rockspec.description.detailed = args.detailed or detailed - end - - if not args.license then - local license, fulltext = check_license() - if license then - rockspec.description.license = license - elseif license then - util.title("Could not auto-detect type for project license:") - util.printout(fulltext) - util.printout() - util.title("Please fill in the source.license field manually or use --license.") - end - end - - fill_as_builtin(rockspec, libs) - - rockspec_cleanup(rockspec) - - persist.save_from_table(filename, rockspec, type_rockspec.order) - - util.printout() - util.printout("Wrote template at "..filename.." -- you should now edit and finish it.") - util.printout() - - return true -end - -return write_rockspec diff --git a/.luarocks/share/lua/5.1/luarocks/core/cfg.lua b/.luarocks/share/lua/5.1/luarocks/core/cfg.lua deleted file mode 100644 index 623167822..000000000 --- a/.luarocks/share/lua/5.1/luarocks/core/cfg.lua +++ /dev/null @@ -1,904 +0,0 @@ - ---- Configuration for LuaRocks. --- Tries to load the user's configuration file and --- defines defaults for unset values. See the --- config --- file format documentation for details. --- --- End-users shouldn't edit this file. They can override any defaults --- set in this file using their system-wide or user-specific configuration --- files. Run `luarocks` with no arguments to see the locations of --- these files in your platform. - -local table, pairs, require, os, pcall, ipairs, package, type, assert = - table, pairs, require, os, pcall, ipairs, package, type, assert - -local util = require("luarocks.core.util") -local persist = require("luarocks.core.persist") -local sysdetect = require("luarocks.core.sysdetect") -local vers = require("luarocks.core.vers") - --------------------------------------------------------------------------------- - -local program_version = "3.9.1" - -local is_windows = package.config:sub(1,1) == "\\" - --- Set order for platform overrides. --- More general platform identifiers should be listed first, --- more specific ones later. -local platform_order = { - -- Unixes - "unix", - "bsd", - "solaris", - "netbsd", - "openbsd", - "freebsd", - "dragonfly", - "linux", - "macosx", - "cygwin", - "msys", - "haiku", - -- Windows - "windows", - "win32", - "mingw", - "mingw32", - "msys2_mingw_w64", -} - -local function detect_sysconfdir() - if not debug then - return - end - local src = debug.getinfo(1, "S").source:gsub("\\", "/"):gsub("/+", "/") - if src:sub(1, 1) == "@" then - src = src:sub(2) - end - local basedir = src:match("^(.*)/luarocks/core/cfg.lua$") - if not basedir then - return - end - -- If installed in a Unix-like tree, use a Unix-like sysconfdir - local installdir = basedir:match("^(.*)/share/lua/[^/]*$") - if installdir then - if installdir == "/usr" then - return "/etc/luarocks" - end - return installdir .. "/etc/luarocks" - end - -- Otherwise, use base directory of sources - return basedir -end - -local load_config_file -do - -- Create global environment for the config files; - local function env_for_config_file(cfg, platforms) - local platforms_copy = {} - for k,v in pairs(platforms) do - platforms_copy[k] = v - end - - local e - e = { - home = cfg.home, - lua_version = cfg.lua_version, - platforms = platforms_copy, - processor = cfg.target_cpu, -- remains for compat reasons - target_cpu = cfg.target_cpu, -- replaces `processor` - os_getenv = os.getenv, - variables = cfg.variables or {}, - 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 - - -- Merge values from config files read into the `cfg` table - local function merge_overrides(cfg, 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 - - local function update_platforms(platforms, overrides) - if overrides[1] then - for k, _ in pairs(platforms) do - platforms[k] = nil - end - for _, v in ipairs(overrides) do - platforms[v] = true - end - -- set some fallback default in case the user provides an incomplete configuration. - -- LuaRocks expects a set of defaults to be available. - if not (platforms.unix or platforms.windows) then - platforms[is_windows and "windows" or "unix"] = true - end - end - end - - -- Load config file and merge its contents into the `cfg` module table. - -- @return filepath of successfully loaded file or nil if it failed - load_config_file = function(cfg, platforms, filepath) - local result, err, errcode = persist.load_into_table(filepath, env_for_config_file(cfg, platforms)) - if (not result) and errcode ~= "open" then - -- errcode is either "load" or "run"; bad config file, so error out - return nil, err, "config" - end - if result then - -- success in loading and running, merge contents and exit - update_platforms(platforms, result.platforms) - result.platforms = nil - merge_overrides(cfg, result) - return filepath - end - return nil -- nothing was loaded - end -end - -local platform_sets = { - freebsd = { unix = true, bsd = true, freebsd = true }, - openbsd = { unix = true, bsd = true, openbsd = true }, - dragonfly = { unix = true, bsd = true, dragonfly = true }, - solaris = { unix = true, solaris = true }, - windows = { windows = true, win32 = true }, - cygwin = { unix = true, cygwin = true }, - macosx = { unix = true, bsd = true, macosx = true, macos = true }, - netbsd = { unix = true, bsd = true, netbsd = true }, - haiku = { unix = true, haiku = true }, - linux = { unix = true, linux = true }, - mingw = { windows = true, win32 = true, mingw32 = true, mingw = true }, - msys = { unix = true, cygwin = true, msys = true }, - msys2_mingw_w64 = { windows = true, win32 = true, mingw32 = true, mingw = true, msys = true, msys2_mingw_w64 = true }, -} - -local function make_platforms(system) - -- fallback to Unix in unknown systems - return platform_sets[system] or { unix = true } -end - --------------------------------------------------------------------------------- - -local function make_defaults(lua_version, target_cpu, platforms, home) - - -- Configure defaults: - local defaults = { - - lua_interpreter = "lua", - local_by_default = false, - accept_unknown_fields = false, - fs_use_modules = true, - hooks_enabled = true, - deps_mode = "one", - no_manifest = false, - check_certificates = false, - - cache_timeout = 60, - cache_fail_timeout = 86400, - - lua_modules_path = "/share/lua/"..lua_version, - lib_modules_path = "/lib/lua/"..lua_version, - rocks_subdir = "/lib/luarocks/rocks-"..lua_version, - - arch = "unknown", - lib_extension = "unknown", - obj_extension = "unknown", - link_lua_explicitly = false, - - rocks_servers = { - { - "https://luarocks.org", - "https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/", - "https://luafr.org/luarocks/", - } - }, - disabled_servers = {}, - - upload = { - server = "https://luarocks.org", - tool_version = "1.0.0", - api_version = "1", - }, - - lua_extension = "lua", - connection_timeout = 30, -- 0 = no timeout - - variables = { - MAKE = "make", - CC = "cc", - LD = "ld", - AR = "ar", - RANLIB = "ranlib", - - CVS = "cvs", - GIT = "git", - SSCM = "sscm", - SVN = "svn", - HG = "hg", - - GPG = "gpg", - - RSYNC = "rsync", - WGET = "wget", - SCP = "scp", - CURL = "curl", - - PWD = "pwd", - MKDIR = "mkdir", - RMDIR = "rmdir", - CP = "cp", - LS = "ls", - RM = "rm", - FIND = "find", - CHMOD = "chmod", - ICACLS = "icacls", - MKTEMP = "mktemp", - - ZIP = "zip", - UNZIP = "unzip -n", - GUNZIP = "gunzip", - BUNZIP2 = "bunzip2", - TAR = "tar", - - MD5SUM = "md5sum", - OPENSSL = "openssl", - MD5 = "md5", - TOUCH = "touch", - - CMAKE = "cmake", - SEVENZ = "7z", - - RSYNCFLAGS = "--exclude=.git -Oavz", - CURLNOCERTFLAG = "", - WGETNOCERTFLAG = "", - }, - - external_deps_subdirs = { - bin = "bin", - lib = "lib", - include = "include" - }, - runtime_external_deps_subdirs = { - bin = "bin", - lib = "lib", - include = "include" - }, - } - - if platforms.windows then - - defaults.arch = "win32-"..target_cpu - defaults.lib_extension = "dll" - defaults.external_lib_extension = "dll" - defaults.static_lib_extension = "lib" - defaults.obj_extension = "obj" - defaults.external_deps_dirs = { "c:/external/", "c:/windows/system32" } - - defaults.makefile = "Makefile.win" - defaults.variables.PWD = "echo %cd%" - defaults.variables.MAKE = "nmake" - defaults.variables.CC = "cl" - defaults.variables.RC = "rc" - defaults.variables.LD = "link" - defaults.variables.MT = "mt" - defaults.variables.AR = "lib" - defaults.variables.LUALIB = "lua"..lua_version..".lib" - defaults.variables.CFLAGS = os.getenv("CFLAGS") or "/nologo /MD /O2" - defaults.variables.LDFLAGS = os.getenv("LDFLAGS") - defaults.variables.LIBFLAG = "/nologo /dll" - - defaults.external_deps_patterns = { - bin = { "?.exe", "?.bat" }, - lib = { "?.lib", "?.dll", "lib?.dll" }, - include = { "?.h" } - } - defaults.runtime_external_deps_patterns = { - bin = { "?.exe", "?.bat" }, - lib = { "?.dll", "lib?.dll" }, - include = { "?.h" } - } - defaults.export_path_separator = ";" - defaults.wrapper_suffix = ".bat" - - local localappdata = os.getenv("LOCALAPPDATA") - if not localappdata then - -- for Windows versions below Vista - localappdata = (os.getenv("USERPROFILE") or "c:/Users/All Users").."/Local Settings/Application Data" - end - defaults.local_cache = localappdata.."/LuaRocks/Cache" - defaults.web_browser = "start" - - defaults.external_deps_subdirs.lib = { "", "lib", "bin" } - defaults.runtime_external_deps_subdirs.lib = { "", "lib", "bin" } - defaults.link_lua_explicitly = true - defaults.fs_use_modules = false - end - - if platforms.mingw32 then - defaults.obj_extension = "o" - defaults.static_lib_extension = "a" - defaults.external_deps_dirs = { "c:/external/", "c:/mingw", "c:/windows/system32" } - defaults.cmake_generator = "MinGW Makefiles" - defaults.variables.MAKE = "mingw32-make" - defaults.variables.CC = "mingw32-gcc" - defaults.variables.RC = "windres" - defaults.variables.LD = "mingw32-gcc" - defaults.variables.AR = "ar" - defaults.variables.RANLIB = "ranlib" - defaults.variables.CFLAGS = os.getenv("CFLAGS") or "-O2" - defaults.variables.LDFLAGS = os.getenv("LDFLAGS") - defaults.variables.LIBFLAG = "-shared" - defaults.makefile = "Makefile" - defaults.external_deps_patterns = { - bin = { "?.exe", "?.bat" }, - -- mingw lookup list from http://stackoverflow.com/a/15853231/1793220 - -- ...should we keep ?.lib at the end? It's not in the above list. - lib = { "lib?.dll.a", "?.dll.a", "lib?.a", "cyg?.dll", "lib?.dll", "?.dll", "?.lib" }, - include = { "?.h" } - } - defaults.runtime_external_deps_patterns = { - bin = { "?.exe", "?.bat" }, - lib = { "cyg?.dll", "?.dll", "lib?.dll" }, - include = { "?.h" } - } - defaults.link_lua_explicitly = true - end - - if platforms.unix then - defaults.lib_extension = "so" - defaults.static_lib_extension = "a" - defaults.external_lib_extension = "so" - defaults.obj_extension = "o" - defaults.external_deps_dirs = { "/usr/local", "/usr", "/" } - - defaults.variables.CFLAGS = os.getenv("CFLAGS") or "-O2" - -- we pass -fPIC via CFLAGS because of old Makefile-based Lua projects - -- which didn't have -fPIC in their Makefiles but which honor CFLAGS - if not defaults.variables.CFLAGS:match("-fPIC") then - defaults.variables.CFLAGS = defaults.variables.CFLAGS.." -fPIC" - end - - defaults.variables.LDFLAGS = os.getenv("LDFLAGS") - - defaults.cmake_generator = "Unix Makefiles" - defaults.variables.CC = "gcc" - defaults.variables.LD = "gcc" - defaults.gcc_rpath = true - defaults.variables.LIBFLAG = "-shared" - defaults.variables.TEST = "test" - - defaults.external_deps_patterns = { - bin = { "?" }, - lib = { "lib?.a", "lib?.so", "lib?.so.*" }, - include = { "?.h" } - } - defaults.runtime_external_deps_patterns = { - bin = { "?" }, - lib = { "lib?.so", "lib?.so.*" }, - include = { "?.h" } - } - defaults.export_path_separator = ":" - defaults.wrapper_suffix = "" - local xdg_cache_home = os.getenv("XDG_CACHE_HOME") or home.."/.cache" - defaults.local_cache = xdg_cache_home.."/luarocks" - defaults.web_browser = "xdg-open" - end - - if platforms.cygwin then - defaults.lib_extension = "so" -- can be overridden in the config file for mingw builds - defaults.arch = "cygwin-"..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" - defaults.link_lua_explicitly = true - end - - if platforms.msys then - -- msys is basically cygwin made out of mingw, meaning the subsytem is unixish - -- enough, yet we can freely mix with native win32 - defaults.external_deps_patterns = { - bin = { "?.exe", "?.bat", "?" }, - lib = { "lib?.so", "lib?.so.*", "lib?.dll.a", "?.dll.a", - "lib?.a", "lib?.dll", "?.dll", "?.lib" }, - include = { "?.h" } - } - defaults.runtime_external_deps_patterns = { - bin = { "?.exe", "?.bat" }, - lib = { "lib?.so", "?.dll", "lib?.dll" }, - include = { "?.h" } - } - if platforms.mingw then - -- MSYS2 can build Windows programs that depend on - -- msys-2.0.dll (based on Cygwin) but MSYS2 is also designed - -- for building native Windows programs by MinGW. These - -- programs don't depend on msys-2.0.dll. - local pipe = io.popen("cygpath --windows %MINGW_PREFIX%") - local mingw_prefix = pipe:read("*l") - pipe:close() - defaults.external_deps_dirs = { mingw_prefix, "c:/windows/system32" } - defaults.makefile = "Makefile" - defaults.cmake_generator = "MSYS Makefiles" - defaults.local_cache = home.."/.cache/luarocks" - defaults.variables.MAKE = "make" - defaults.variables.CC = "gcc" - defaults.variables.RC = "windres" - defaults.variables.LD = "gcc" - defaults.variables.MT = nil - defaults.variables.AR = "ar" - defaults.variables.RANLIB = "ranlib" - defaults.variables.LUALIB = "liblua"..lua_version..".dll.a" - - defaults.variables.CFLAGS = os.getenv("CFLAGS") or "-O2 -fPIC" - if not defaults.variables.CFLAGS:match("-fPIC") then - defaults.variables.CFLAGS = defaults.variables.CFLAGS.." -fPIC" - end - - defaults.variables.LIBFLAG = "-shared" - end - end - - if platforms.bsd then - defaults.variables.MAKE = "gmake" - defaults.gcc_rpath = false - defaults.variables.CC = "cc" - defaults.variables.LD = defaults.variables.CC - end - - if platforms.macosx then - defaults.variables.MAKE = "make" - defaults.external_lib_extension = "dylib" - defaults.arch = "macosx-"..target_cpu - defaults.variables.LIBFLAG = "-bundle -undefined dynamic_lookup -all_load" - local version = util.popen_read("sw_vers -productVersion") - if not (version:match("^%d+%.%d+%.%d+$") or version:match("^%d+%.%d+$")) then - version = "10.3" - end - version = vers.parse_version(version) - if version >= vers.parse_version("11.0") then - version = vers.parse_version("11.0") - elseif version >= vers.parse_version("10.10") then - version = vers.parse_version("10.8") - elseif version >= vers.parse_version("10.5") then - version = vers.parse_version("10.5") - else - defaults.gcc_rpath = false - end - defaults.variables.CC = "env MACOSX_DEPLOYMENT_TARGET="..tostring(version).." gcc" - defaults.variables.LD = "env MACOSX_DEPLOYMENT_TARGET="..tostring(version).." gcc" - defaults.web_browser = "open" - - -- XCode SDK - local sdk_path = util.popen_read("xcrun --show-sdk-path 2>/dev/null") - if sdk_path then - table.insert(defaults.external_deps_dirs, sdk_path .. "/usr") - table.insert(defaults.external_deps_patterns.lib, 1, "lib?.tbd") - table.insert(defaults.runtime_external_deps_patterns.lib, 1, "lib?.tbd") - end - - -- Homebrew - table.insert(defaults.external_deps_dirs, "/usr/local/opt") - defaults.external_deps_subdirs.lib = { "", "lib", } - defaults.runtime_external_deps_subdirs.lib = { "", "lib", } - table.insert(defaults.external_deps_patterns.lib, 1, "/?/lib/lib?.dylib") - table.insert(defaults.runtime_external_deps_patterns.lib, 1, "/?/lib/lib?.dylib") - end - - if platforms.linux then - defaults.arch = "linux-"..target_cpu - - local gcc_arch = util.popen_read("gcc -print-multiarch 2>/dev/null") - if gcc_arch and gcc_arch ~= "" then - defaults.external_deps_subdirs.lib = { "lib", "lib/" .. gcc_arch, "lib64" } - defaults.runtime_external_deps_subdirs.lib = { "lib", "lib/" .. gcc_arch, "lib64" } - else - defaults.external_deps_subdirs.lib = { "lib", "lib64" } - defaults.runtime_external_deps_subdirs.lib = { "lib", "lib64" } - end - end - - if platforms.freebsd then - defaults.arch = "freebsd-"..target_cpu - elseif platforms.dragonfly then - defaults.arch = "dragonfly-"..target_cpu - elseif platforms.openbsd then - defaults.arch = "openbsd-"..target_cpu - elseif platforms.netbsd then - defaults.arch = "netbsd-"..target_cpu - elseif platforms.solaris then - defaults.arch = "solaris-"..target_cpu - defaults.variables.MAKE = "gmake" - end - - -- Expose some more values detected by LuaRocks for use by rockspec authors. - defaults.variables.LIB_EXTENSION = defaults.lib_extension - defaults.variables.OBJ_EXTENSION = defaults.obj_extension - - return defaults -end - -local function use_defaults(cfg, defaults) - - -- Populate variables with values from their 'defaults' counterparts - -- if they were not already set by user. - if not cfg.variables then - cfg.variables = {} - end - for k,v in pairs(defaults.variables) do - if not cfg.variables[k] then - cfg.variables[k] = v - end - end - - util.deep_merge_under(cfg, defaults) - - -- FIXME get rid of this - if not cfg.check_certificates then - cfg.variables.CURLNOCERTFLAG = "-k" - cfg.variables.WGETNOCERTFLAG = "--no-check-certificate" - end -end - -local function get_first_arg() - if not arg then - return - end - local first_arg = arg[0] - local i = -1 - while arg[i] do - first_arg = arg[i] - i = i -1 - end - return first_arg -end - --------------------------------------------------------------------------------- - -local cfg = {} - ---- Initializes the LuaRocks configuration for variables, paths --- and OS detection. --- @param detected table containing information detected about the --- environment. All fields below are optional: --- * lua_version (in x.y format, e.g. "5.3") --- * lua_bindir (e.g. "/usr/local/bin") --- * lua_dir (e.g. "/usr/local") --- * lua_interpreter (e.g. "lua-5.3") --- * project_dir (a string with the path of the project directory --- when using per-project environments, as created with `luarocks init`) --- @param warning a logging function for warnings that takes a string --- @return true on success; nil and an error message on failure. -function cfg.init(detected, warning) - detected = detected or {} - - local exit_ok = true - local exit_err = nil - local exit_what = nil - - local hc_ok, hardcoded = pcall(require, "luarocks.core.hardcoded") - if not hc_ok then - hardcoded = {} - end - - local init = cfg.init - - ---------------------------------------- - -- Reset the cfg table. - ---------------------------------------- - - for k, _ in pairs(cfg) do - cfg[k] = nil - end - - cfg.program_version = program_version - - if hardcoded.IS_BINARY then - cfg.is_binary = true - end - - -- Use detected values as defaults, overridable via config files or CLI args - - local first_arg = get_first_arg() - - cfg.lua_version = detected.lua_version or hardcoded.LUA_VERSION or _VERSION:sub(5) - cfg.lua_interpreter = detected.lua_interpreter or hardcoded.LUA_INTERPRETER or (first_arg and first_arg:gsub(".*[\\/]", "")) or (is_windows and "lua.exe" or "lua") - cfg.project_dir = (not hardcoded.FORCE_CONFIG) and detected.project_dir - - do - local lua_bindir = detected.lua_bindir or hardcoded.LUA_BINDIR or (first_arg and first_arg:gsub("[\\/][^\\/]+$", "")) - local lua_dir = detected.lua_dir or hardcoded.LUA_DIR or (lua_bindir and lua_bindir:gsub("[\\/]bin$", "")) - cfg.variables = { - LUA_DIR = lua_dir, - LUA_BINDIR = lua_bindir, - LUA_LIBDIR = hardcoded.LUA_LIBDIR, - LUA_INCDIR = hardcoded.LUA_INCDIR, - } - end - - cfg.init = init - - ---------------------------------------- - -- System detection. - ---------------------------------------- - - -- A proper build of LuaRocks will hardcode the system - -- and proc values with hardcoded.SYSTEM and hardcoded.PROCESSOR. - -- If that is not available, we try to identify the system. - local system, processor = sysdetect.detect() - if hardcoded.SYSTEM then - system = hardcoded.SYSTEM - end - if hardcoded.PROCESSOR then - processor = hardcoded.PROCESSOR - end - - if system == "windows" then - if os.getenv("VCINSTALLDIR") then - -- running from the Development Command prompt for VS 2017 - system = "windows" - else - local msystem = os.getenv("MSYSTEM") - if msystem == nil then - system = "mingw" - elseif msystem == "MSYS" then - system = "msys" - else - -- MINGW32 or MINGW64 - system = "msys2_mingw_w64" - end - end - end - - cfg.target_cpu = processor - - local platforms = make_platforms(system) - - ---------------------------------------- - -- Platform is determined. - -- Let's load the config files. - ---------------------------------------- - - local sys_config_file - local home_config_file - local project_config_file - - local config_file_name = "config-"..cfg.lua_version..".lua" - - do - local sysconfdir = os.getenv("LUAROCKS_SYSCONFDIR") or hardcoded.SYSCONFDIR - if platforms.windows and not platforms.msys2_mingw_w64 then - cfg.home = os.getenv("APPDATA") or "c:" - cfg.home_tree = cfg.home.."/luarocks" - cfg.sysconfdir = sysconfdir or ((os.getenv("PROGRAMFILES") or "c:") .. "/luarocks") - else - cfg.home = os.getenv("HOME") or "" - cfg.home_tree = cfg.home.."/.luarocks" - cfg.sysconfdir = sysconfdir or detect_sysconfdir() or "/etc/luarocks" - end - end - - -- Load system configuration file - sys_config_file = (cfg.sysconfdir .. "/" .. config_file_name):gsub("\\", "/") - local sys_config_ok, err = load_config_file(cfg, platforms, sys_config_file) - if err then - exit_ok, exit_err, exit_what = nil, err, "config" - end - - -- Load user configuration file (if allowed) - local home_config_ok - local project_config_ok - if not hardcoded.FORCE_CONFIG then - local env_var = "LUAROCKS_CONFIG_" .. cfg.lua_version:gsub("%.", "_") - local env_value = os.getenv(env_var) - if not env_value then - env_var = "LUAROCKS_CONFIG" - env_value = os.getenv(env_var) - end - -- first try environment provided file, so we can explicitly warn when it is missing - if env_value then - local env_ok, err = load_config_file(cfg, platforms, env_value) - if err then - exit_ok, exit_err, exit_what = nil, err, "config" - elseif warning and not env_ok then - warning("Warning: could not load configuration file `"..env_value.."` given in environment variable "..env_var.."\n") - end - if env_ok then - home_config_ok = true - home_config_file = env_value - end - end - - -- try XDG config home - if platforms.unix and not home_config_ok then - local xdg_config_home = os.getenv("XDG_CONFIG_HOME") or cfg.home .. "/.config" - cfg.homeconfdir = xdg_config_home .. "/luarocks" - home_config_file = (cfg.homeconfdir .. "/" .. config_file_name):gsub("\\", "/") - home_config_ok, err = load_config_file(cfg, platforms, home_config_file) - if err then - exit_ok, exit_err, exit_what = nil, err, "config" - end - end - - -- try the alternative defaults if there was no environment specified file or it didn't work - if not home_config_ok then - cfg.homeconfdir = cfg.home_tree - home_config_file = (cfg.homeconfdir .. "/" .. config_file_name):gsub("\\", "/") - home_config_ok, err = load_config_file(cfg, platforms, home_config_file) - if err then - exit_ok, exit_err, exit_what = nil, err, "config" - end - end - - -- finally, use the project-specific config file if any - if cfg.project_dir then - project_config_file = cfg.project_dir .. "/.luarocks/" .. config_file_name - project_config_ok, err = load_config_file(cfg, platforms, project_config_file) - if err then - exit_ok, exit_err, exit_what = nil, err, "config" - end - end - end - - ---------------------------------------- - -- Config files are loaded. - -- Let's finish up the cfg table. - ---------------------------------------- - - -- Settings given via the CLI (i.e. --lua-dir) take precedence over config files. - cfg.project_dir = detected.given_project_dir or cfg.project_dir - cfg.lua_version = detected.given_lua_version or cfg.lua_version - if detected.given_lua_dir then - cfg.variables.LUA_DIR = detected.given_lua_dir - cfg.variables.LUA_BINDIR = detected.lua_bindir - cfg.variables.LUA_LIBDIR = nil - cfg.variables.LUA_INCDIR = nil - cfg.lua_interpreter = detected.lua_interpreter - end - - -- Build a default list of rocks trees if not given - if cfg.rocks_trees == nil then - cfg.rocks_trees = {} - if cfg.home_tree then - table.insert(cfg.rocks_trees, { name = "user", root = cfg.home_tree } ) - end - if hardcoded.PREFIX and hardcoded.PREFIX ~= cfg.home_tree then - table.insert(cfg.rocks_trees, { name = "system", root = hardcoded.PREFIX } ) - end - end - - local defaults = make_defaults(cfg.lua_version, processor, platforms, cfg.home) - - if platforms.windows and hardcoded.WIN_TOOLS then - local tools = { "SEVENZ", "CP", "FIND", "LS", "MD5SUM", "WGET", } - for _, tool in ipairs(tools) do - defaults.variables[tool] = '"' .. hardcoded.WIN_TOOLS .. "/" .. defaults.variables[tool] .. '.exe"' - end - else - defaults.fs_use_modules = true - end - - use_defaults(cfg, defaults) - - cfg.variables.LUA = cfg.variables.LUA or (cfg.variables.LUA_BINDIR and (cfg.variables.LUA_BINDIR .. "/" .. cfg.lua_interpreter):gsub("//", "/")) - cfg.user_agent = "LuaRocks/"..cfg.program_version.." "..cfg.arch - - cfg.config_files = { - project = cfg.project_dir and { - file = project_config_file, - found = not not project_config_ok, - }, - system = { - file = sys_config_file, - found = not not sys_config_ok, - }, - user = { - file = home_config_file, - found = not not home_config_ok, - }, - nearest = project_config_ok - and project_config_file - or (home_config_ok - and home_config_file - or sys_config_file), - } - - cfg.cache = {} - - ---------------------------------------- - -- Attributes of cfg are set. - -- Let's add some methods. - ---------------------------------------- - - do - local function make_paths_from_tree(tree) - local lua_path, lib_path, bin_path - if type(tree) == "string" then - lua_path = tree..cfg.lua_modules_path - lib_path = tree..cfg.lib_modules_path - bin_path = tree.."/bin" - else - lua_path = tree.lua_dir or tree.root..cfg.lua_modules_path - lib_path = tree.lib_dir or tree.root..cfg.lib_modules_path - bin_path = tree.bin_dir or tree.root.."/bin" - end - return lua_path, lib_path, bin_path - end - - function cfg.package_paths(current) - local new_path, new_cpath, new_bin = {}, {}, {} - local function add_tree_to_paths(tree) - local lua_path, lib_path, bin_path = make_paths_from_tree(tree) - table.insert(new_path, lua_path.."/?.lua") - table.insert(new_path, lua_path.."/?/init.lua") - table.insert(new_cpath, lib_path.."/?."..cfg.lib_extension) - table.insert(new_bin, bin_path) - end - if current then - add_tree_to_paths(current) - end - for _,tree in ipairs(cfg.rocks_trees) do - add_tree_to_paths(tree) - end - return table.concat(new_path, ";"), table.concat(new_cpath, ";"), table.concat(new_bin, cfg.export_path_separator) - end - end - - function cfg.init_package_paths() - local lr_path, lr_cpath, lr_bin = cfg.package_paths() - package.path = util.cleanup_path(package.path .. ";" .. lr_path, ";", cfg.lua_version, true) - package.cpath = util.cleanup_path(package.cpath .. ";" .. lr_cpath, ";", cfg.lua_version, true) - end - - --- Check if platform was detected - -- @param name string: The platform name to check. - -- @return boolean: true if LuaRocks is currently running on queried platform. - function cfg.is_platform(name) - assert(type(name) == "string") - return platforms[name] - end - - -- @param direction (optional) "least-specific-first" (default) or "most-specific-first" - function cfg.each_platform(direction) - direction = direction or "least-specific-first" - local i, delta - if direction == "least-specific-first" then - i = 0 - delta = 1 - else - i = #platform_order + 1 - delta = -1 - end - return function() - local p - repeat - i = i + delta - p = platform_order[i] - until (not p) or platforms[p] - return p - end - end - - function cfg.print_platforms() - local platform_keys = {} - for k,_ in pairs(platforms) do - table.insert(platform_keys, k) - end - table.sort(platform_keys) - return table.concat(platform_keys, ", ") - end - - return exit_ok, exit_err, exit_what -end - -return cfg diff --git a/.luarocks/share/lua/5.1/luarocks/core/dir.lua b/.luarocks/share/lua/5.1/luarocks/core/dir.lua deleted file mode 100644 index 0da889979..000000000 --- a/.luarocks/share/lua/5.1/luarocks/core/dir.lua +++ /dev/null @@ -1,88 +0,0 @@ - -local dir = {} - -local require = nil --------------------------------------------------------------------------------- - -local function unquote(c) - local first, last = c:sub(1,1), c:sub(-1) - if (first == '"' and last == '"') or - (first == "'" and last == "'") then - return c:sub(2,-2) - end - return c -end - ---- Describe a path in a cross-platform way. --- Use this function to avoid platform-specific directory --- separators in other modules. Removes trailing slashes from --- each component given, to avoid repeated separators. --- Separators inside strings are kept, to handle URLs containing --- protocols. --- @param ... strings representing directories --- @return string: a string with a platform-specific representation --- of the path. -function dir.path(...) - local t = {...} - while t[1] == "" do - table.remove(t, 1) - end - for i, c in ipairs(t) do - t[i] = unquote(c) - end - return (table.concat(t, "/"):gsub("([^:])/+", "%1/"):gsub("^/+", "/"):gsub("/*$", "")) -end - ---- Split protocol and path from an URL or local pathname. --- URLs should be in the "protocol://path" format. --- For local pathnames, "file" is returned as the protocol. --- @param url string: an URL or a local pathname. --- @return string, string: the protocol, and the pathname without the protocol. -function dir.split_url(url) - assert(type(url) == "string") - - url = unquote(url) - local protocol, pathname = url:match("^([^:]*)://(.*)") - if not protocol then - protocol = "file" - pathname = url - end - return protocol, pathname -end - ---- Normalize a url or local path. --- URLs should be in the "protocol://path" format. System independent --- forward slashes are used, removing trailing and double slashes --- @param url string: an URL or a local pathname. --- @return string: Normalized result. -function dir.normalize(name) - local protocol, pathname = dir.split_url(name) - pathname = pathname:gsub("\\", "/"):gsub("(.)/*$", "%1"):gsub("//", "/") - local pieces = {} - local drive = "" - if pathname:match("^.:") then - drive, pathname = pathname:match("^(.:)(.*)$") - end - for piece in pathname:gmatch("(.-)/") do - if piece == ".." then - local prev = pieces[#pieces] - if not prev or prev == ".." then - table.insert(pieces, "..") - elseif prev ~= "" then - table.remove(pieces) - end - elseif piece ~= "." then - table.insert(pieces, piece) - end - end - local basename = pathname:match("[^/]+$") - if basename then - table.insert(pieces, basename) - end - pathname = drive .. table.concat(pieces, "/") - if protocol ~= "file" then pathname = protocol .."://"..pathname end - return pathname -end - -return dir - diff --git a/.luarocks/share/lua/5.1/luarocks/core/manif.lua b/.luarocks/share/lua/5.1/luarocks/core/manif.lua deleted file mode 100644 index 3925f6365..000000000 --- a/.luarocks/share/lua/5.1/luarocks/core/manif.lua +++ /dev/null @@ -1,114 +0,0 @@ - ---- Core functions for querying manifest files. -local manif = {} - -local persist = require("luarocks.core.persist") -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.core.dir") -local util = require("luarocks.core.util") -local vers = require("luarocks.core.vers") -local path = require("luarocks.core.path") -local require = nil --------------------------------------------------------------------------------- - --- Table with repository identifiers as keys and tables mapping --- Lua versions to cached loaded manifests as values. -local manifest_cache = {} - ---- Cache a loaded manifest. --- @param repo_url string: The repository identifier. --- @param lua_version string: Lua version in "5.x" format, defaults to installed version. --- @param manifest table: the manifest to be cached. -function manif.cache_manifest(repo_url, lua_version, manifest) - lua_version = lua_version or cfg.lua_version - manifest_cache[repo_url] = manifest_cache[repo_url] or {} - manifest_cache[repo_url][lua_version] = manifest -end - ---- Attempt to get cached loaded manifest. --- @param repo_url string: The repository identifier. --- @param lua_version string: Lua version in "5.x" format, defaults to installed version. --- @return table or nil: loaded manifest or nil if cache is empty. -function manif.get_cached_manifest(repo_url, lua_version) - lua_version = lua_version or cfg.lua_version - return manifest_cache[repo_url] and manifest_cache[repo_url][lua_version] -end - ---- Back-end function that actually loads the manifest --- and stores it in the manifest cache. --- @param file string: The local filename of the manifest file. --- @param repo_url string: The repository identifier. --- @param lua_version string: Lua version in "5.x" format, defaults to installed version. --- @return table or (nil, string, string): the manifest or nil, --- error message and error code ("open", "load", "run"). -function manif.manifest_loader(file, repo_url, lua_version) - local manifest, err, errcode = persist.load_into_table(file) - if not manifest then - return nil, "Failed loading manifest for "..repo_url..": "..err, errcode - end - manif.cache_manifest(repo_url, lua_version, manifest) - return manifest, err, errcode -end - ---- Load a local manifest describing a repository. --- This is used by the luarocks.loader only. --- @param repo_url string: URL or pathname for the repository. --- @return table or (nil, string, string): A table representing the manifest, --- or nil followed by an error message and an error code, see manifest_loader. -function manif.fast_load_local_manifest(repo_url) - assert(type(repo_url) == "string") - - local cached_manifest = manif.get_cached_manifest(repo_url) - if cached_manifest then - return cached_manifest - end - - local pathname = dir.path(repo_url, "manifest") - return manif.manifest_loader(pathname, repo_url, nil, true) -end - -function manif.load_rocks_tree_manifests(deps_mode) - local trees = {} - path.map_trees(deps_mode, function(tree) - local manifest, err = manif.fast_load_local_manifest(path.rocks_dir(tree)) - if manifest then - table.insert(trees, {tree=tree, manifest=manifest}) - end - end) - return trees -end - -function manif.scan_dependencies(name, version, tree_manifests, dest) - if dest[name] then - return - end - dest[name] = version - - for _, tree in ipairs(tree_manifests) do - local manifest = tree.manifest - - local pkgdeps - if manifest.dependencies and manifest.dependencies[name] then - pkgdeps = manifest.dependencies[name][version] - end - if pkgdeps then - for _, dep in ipairs(pkgdeps) do - local pkg, constraints = dep.name, dep.constraints - - for _, t in ipairs(tree_manifests) do - local entries = t.manifest.repository[pkg] - if entries then - for ver, _ in util.sortedpairs(entries, vers.compare_versions) do - if (not constraints) or vers.match_constraints(vers.parse_version(ver), constraints) then - manif.scan_dependencies(pkg, ver, tree_manifests, dest) - end - end - end - end - end - return - end - end -end - -return manif diff --git a/.luarocks/share/lua/5.1/luarocks/core/path.lua b/.luarocks/share/lua/5.1/luarocks/core/path.lua deleted file mode 100644 index bf6bdc2d5..000000000 --- a/.luarocks/share/lua/5.1/luarocks/core/path.lua +++ /dev/null @@ -1,150 +0,0 @@ - ---- Core LuaRocks-specific path handling functions. -local path = {} - -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.core.dir") -local require = nil --------------------------------------------------------------------------------- - -function path.rocks_dir(tree) - if tree == nil then - tree = cfg.root_dir - end - if type(tree) == "string" then - return dir.path(tree, cfg.rocks_subdir) - end - assert(type(tree) == "table") - return tree.rocks_dir or dir.path(tree.root, cfg.rocks_subdir) -end - ---- Produce a versioned version of a filename. --- @param file string: filename (must start with prefix) --- @param prefix string: Path prefix for file --- @param name string: Rock name --- @param version string: Rock version --- @return string: a pathname with the same directory parts and a versioned basename. -function path.versioned_name(file, prefix, name, version) - assert(type(file) == "string") - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - local rest = file:sub(#prefix+1):gsub("^/*", "") - local name_version = (name.."_"..version):gsub("%-", "_"):gsub("%.", "_") - return dir.path(prefix, name_version.."-"..rest) -end - ---- Convert a pathname to a module identifier. --- In Unix, for example, a path "foo/bar/baz.lua" is converted to --- "foo.bar.baz"; "bla/init.lua" returns "bla.init"; "foo.so" returns "foo". --- @param file string: Pathname of module --- @return string: The module identifier, or nil if given path is --- not a conformant module path (the function does not check if the --- path actually exists). -function path.path_to_module(file) - assert(type(file) == "string") - - local name = file:match("(.*)%."..cfg.lua_extension.."$") - if name then - name = name:gsub("/", ".") - else - name = file:match("(.*)%."..cfg.lib_extension.."$") - if name then - name = name:gsub("/", ".") - --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format. - else - name = file:match("(.*)%."..cfg.static_lib_extension.."$") - if name then - name = name:gsub("/", ".") - end - ]] - end - end - if not name then name = file end - name = name:gsub("^%.+", ""):gsub("%.+$", "") - return name -end - -function path.deploy_lua_dir(tree) - if type(tree) == "string" then - return dir.path(tree, cfg.lua_modules_path) - else - assert(type(tree) == "table") - return tree.lua_dir or dir.path(tree.root, cfg.lua_modules_path) - end -end - -function path.deploy_lib_dir(tree) - if type(tree) == "string" then - return dir.path(tree, cfg.lib_modules_path) - else - assert(type(tree) == "table") - return tree.lib_dir or dir.path(tree.root, cfg.lib_modules_path) - end -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 file_name string: module file name as in manifest (eg. "socket/core.so") --- @param name string: name of the package (eg. "luasocket") --- @param version string: version number (eg. "2.0.2-1") --- @param tree string: repository path (eg. "/usr/local") --- @param i number: the index, 1 if version is the current default, > 1 otherwise. --- This is done this way for use by select_module in luarocks.loader. --- @return string: filename of the module (eg. "/usr/local/lib/lua/5.1/socket/core.so") -function path.which_i(file_name, name, version, tree, i) - local deploy_dir - local extension = file_name:match("%.[a-z]+$") - if is_src_extension[extension] then - deploy_dir = path.deploy_lua_dir(tree) - file_name = dir.path(deploy_dir, file_name) - else - deploy_dir = path.deploy_lib_dir(tree) - file_name = dir.path(deploy_dir, file_name) - end - if i > 1 then - file_name = path.versioned_name(file_name, deploy_dir, name, version) - end - return file_name -end - -function path.rocks_tree_to_string(tree) - if type(tree) == "string" then - return tree - else - assert(type(tree) == "table") - return tree.root - end -end - ---- Apply a given function to the active rocks trees based on chosen dependency mode. --- @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 (this function becomes a nop). --- @param fn function: function to be applied, with the tree dir (string) as the first --- argument and the remaining varargs of map_trees as the following arguments. --- @return a table with all results of invocations of fn collected. -function path.map_trees(deps_mode, fn, ...) - local result = {} - local current = cfg.root_dir or cfg.rocks_trees[1] - if deps_mode == "one" then - table.insert(result, (fn(current, ...)) or 0) - else - local use = false - if deps_mode == "all" then - use = true - end - for _, tree in ipairs(cfg.rocks_trees or {}) do - if dir.normalize(path.rocks_tree_to_string(tree)) == dir.normalize(path.rocks_tree_to_string(current)) then - use = true - end - if use then - table.insert(result, (fn(tree, ...)) or 0) - end - end - end - return result -end - -return path diff --git a/.luarocks/share/lua/5.1/luarocks/core/persist.lua b/.luarocks/share/lua/5.1/luarocks/core/persist.lua deleted file mode 100644 index 57e7b5d42..000000000 --- a/.luarocks/share/lua/5.1/luarocks/core/persist.lua +++ /dev/null @@ -1,81 +0,0 @@ - -local persist = {} - -local require = nil --------------------------------------------------------------------------------- - ---- 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. -function persist.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, 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 = tbl or {} - local globals = {} - local globals_mt = { - __index = function(t, k) - globals[k] = true - end - } - local save_mt = getmetatable(result) - setmetatable(result, globals_mt) - - local ok, err, errcode = persist.run_file(filename, result) - - setmetatable(result, save_mt) - - if not ok then - return nil, err, errcode - end - return result, globals -end - -return persist - diff --git a/.luarocks/share/lua/5.1/luarocks/core/sysdetect.lua b/.luarocks/share/lua/5.1/luarocks/core/sysdetect.lua deleted file mode 100644 index d999203ae..000000000 --- a/.luarocks/share/lua/5.1/luarocks/core/sysdetect.lua +++ /dev/null @@ -1,419 +0,0 @@ --- Detect the operating system and architecture without forking a subprocess. --- --- We are not going for exhaustive list of every historical system here, --- but aiming to cover every platform where LuaRocks is known to run. --- If your system is not detected, patches are welcome! - -local sysdetect = {} - -local function hex(s) - return s:gsub("$(..)", function(x) - return string.char(tonumber(x, 16)) - end) -end - -local function read_int8(fd) - if io.type(fd) == "closed file" then - return nil - end - local s = fd:read(1) - if not s then - fd:close() - return nil - end - return s:byte() -end - -local LITTLE = 1 --- local BIG = 2 - -local function bytes2number(s, endian) - local r = 0 - if endian == LITTLE then - for i = #s, 1, -1 do - r = r*256 + s:byte(i,i) - end - else - for i = 1, #s do - r = r*256 + s:byte(i,i) - end - end - return r -end - -local function read(fd, bytes, endian) - if io.type(fd) == "closed file" then - return nil - end - local s = fd:read(bytes) - if not s - then fd:close() - return nil - end - return bytes2number(s, endian) -end - -local function read_int32le(fd) - return read(fd, 4, LITTLE) -end - --------------------------------------------------------------------------------- --- @section ELF --------------------------------------------------------------------------------- - -local e_osabi = { - [0x00] = "sysv", - [0x01] = "hpux", - [0x02] = "netbsd", - [0x03] = "linux", - [0x04] = "hurd", - [0x06] = "solaris", - [0x07] = "aix", - [0x08] = "irix", - [0x09] = "freebsd", - [0x0c] = "openbsd", -} - -local e_machines = { - [0x02] = "sparc", - [0x03] = "x86", - [0x08] = "mips", - [0x0f] = "hppa", - [0x12] = "sparcv8", - [0x14] = "ppc", - [0x15] = "ppc64", - [0x16] = "s390", - [0x28] = "arm", - [0x2a] = "superh", - [0x2b] = "sparcv9", - [0x32] = "ia_64", - [0x3E] = "x86_64", - [0xB6] = "alpha", - [0xB7] = "aarch64", - [0xF3] = "riscv64", - [0x9026] = "alpha", -} - -local SHT_NOTE = 7 - -local function read_elf_section_headers(fd, hdr) - local endian = hdr.endian - local word = hdr.word - - local strtab_offset - local sections = {} - for i = 0, hdr.e_shnum - 1 do - fd:seek("set", hdr.e_shoff + (i * hdr.e_shentsize)) - local section = {} - section.sh_name_off = read(fd, 4, endian) - section.sh_type = read(fd, 4, endian) - section.sh_flags = read(fd, word, endian) - section.sh_addr = read(fd, word, endian) - section.sh_offset = read(fd, word, endian) - section.sh_size = read(fd, word, endian) - section.sh_link = read(fd, 4, endian) - section.sh_info = read(fd, 4, endian) - if section.sh_type == SHT_NOTE then - fd:seek("set", section.sh_offset) - section.namesz = read(fd, 4, endian) - section.descsz = read(fd, 4, endian) - section.type = read(fd, 4, endian) - section.namedata = fd:read(section.namesz):gsub("%z.*", "") - section.descdata = fd:read(section.descsz) - elseif i == hdr.e_shstrndx then - strtab_offset = section.sh_offset - end - table.insert(sections, section) - end - if strtab_offset then - for _, section in ipairs(sections) do - fd:seek("set", strtab_offset + section.sh_name_off) - section.name = fd:read(32):gsub("%z.*", "") - sections[section.name] = section - end - end - return sections -end - -local function detect_elf_system(fd, hdr, sections) - local system = e_osabi[hdr.osabi] - local endian = hdr.endian - - if system == "sysv" then - local abitag = sections[".note.ABI-tag"] - if abitag then - if abitag.namedata == "GNU" and abitag.type == 1 - and abitag.descdata:sub(0, 4) == "\0\0\0\0" then - return "linux" - end - elseif sections[".SUNW_version"] - or sections[".SUNW_signature"] then - return "solaris" - elseif sections[".note.netbsd.ident"] then - return "netbsd" - elseif sections[".note.openbsd.ident"] then - return "openbsd" - elseif sections[".note.tag"] and - sections[".note.tag"].namedata == "DragonFly" then - return "dragonfly" - end - - local gnu_version_r = sections[".gnu.version_r"] - if gnu_version_r then - - local dynstr = sections[".dynstr"].sh_offset - - local idx = 0 - for _ = 0, gnu_version_r.sh_info - 1 do - fd:seek("set", gnu_version_r.sh_offset + idx) - assert(read(fd, 2, endian)) -- vn_version - local vn_cnt = read(fd, 2, endian) - local vn_file = read(fd, 4, endian) - local vn_next = read(fd, 2, endian) - - fd:seek("set", dynstr + vn_file) - local libname = fd:read(64):gsub("%z.*", "") - - if hdr.e_type == 0x03 and libname == "libroot.so" then - return "haiku" - elseif libname:match("linux") then - return "linux" - end - - idx = idx + (vn_next * (vn_cnt + 1)) - end - end - - local procfile = io.open("/proc/sys/kernel/ostype") - if procfile then - local version = procfile:read(6) - procfile:close() - if version == "Linux\n" then - return "linux" - end - end - end - - return system -end - -local function read_elf_header(fd) - local hdr = {} - - hdr.bits = read_int8(fd) - hdr.endian = read_int8(fd) - hdr.elf_version = read_int8(fd) - if hdr.elf_version ~= 1 then - return nil - end - hdr.osabi = read_int8(fd) - if not hdr.osabi then - return nil - end - - local endian = hdr.endian - fd:seek("set", 0x10) - hdr.e_type = read(fd, 2, endian) - local machine = read(fd, 2, endian) - local processor = e_machines[machine] or "unknown" - if endian == 1 and processor == "ppc64" then - processor = "ppc64le" - end - - local elfversion = read(fd, 4, endian) - if elfversion ~= 1 then - return nil - end - - local word = (hdr.bits == 1) and 4 or 8 - hdr.word = word - - hdr.e_entry = read(fd, word, endian) - hdr.e_phoff = read(fd, word, endian) - hdr.e_shoff = read(fd, word, endian) - hdr.e_flags = read(fd, 4, endian) - hdr.e_ehsize = read(fd, 2, endian) - hdr.e_phentsize = read(fd, 2, endian) - hdr.e_phnum = read(fd, 2, endian) - hdr.e_shentsize = read(fd, 2, endian) - hdr.e_shnum = read(fd, 2, endian) - hdr.e_shstrndx = read(fd, 2, endian) - - return hdr, processor -end - -local function detect_elf(fd) - local hdr, processor = read_elf_header(fd) - if not hdr then - return nil - end - local sections = read_elf_section_headers(fd, hdr) - local system = detect_elf_system(fd, hdr, sections) - return system, processor -end - --------------------------------------------------------------------------------- --- @section Mach Objects (Apple) --------------------------------------------------------------------------------- - -local mach_l64 = { - [7] = "x86_64", - [12] = "aarch64", -} - -local mach_b64 = { - [0] = "ppc64", -} - -local mach_l32 = { - [7] = "x86", - [12] = "arm", -} - -local mach_b32 = { - [0] = "ppc", -} - -local function detect_mach(magic, fd) - if not magic then - return nil - end - - if magic == hex("$CA$FE$BA$BE") then - -- fat binary, go for the first one - fd:seek("set", 0x12) - local offs = read_int8(fd) - if not offs then - return nil - end - fd:seek("set", offs * 256) - magic = fd:read(4) - return detect_mach(magic, fd) - end - - local cputype = read_int8(fd) - - if magic == hex("$CF$FA$ED$FE") then - return "macosx", mach_l64[cputype] or "unknown" - elseif magic == hex("$FE$ED$CF$FA") then - return "macosx", mach_b64[cputype] or "unknown" - elseif magic == hex("$CE$FA$ED$FE") then - return "macosx", mach_l32[cputype] or "unknown" - elseif magic == hex("$FE$ED$FA$CE") then - return "macosx", mach_b32[cputype] or "unknown" - end -end - --------------------------------------------------------------------------------- --- @section PE (Windows) --------------------------------------------------------------------------------- - -local pe_machine = { - [0x8664] = "x86_64", - [0x01c0] = "arm", - [0x01c4] = "armv7l", - [0xaa64] = "arm64", - [0x014c] = "x86", -} - -local function detect_pe(fd) - fd:seek("set", 60) -- position of PE header position - local peoffset = read_int32le(fd) -- read position of PE header - if not peoffset then - return nil - end - local system = "windows" - fd:seek("set", peoffset + 4) -- move to position of Machine section - local machine = read(fd, 2, LITTLE) - local processor = pe_machine[machine] - - local rdata_pos = fd:read(736):match(".rdata%z%z............(....)") - if rdata_pos then - rdata_pos = bytes2number(rdata_pos, LITTLE) - fd:seek("set", rdata_pos) - local data = fd:read(512) - if data:match("cygwin") or data:match("cyggcc") then - system = "cygwin" - end - end - - return system, processor or "unknown" -end - --------------------------------------------------------------------------------- --- @section API --------------------------------------------------------------------------------- - -function sysdetect.detect_file(file) - assert(type(file) == "string") - local fd = io.open(file, "rb") - if not fd then - return nil - end - local magic = fd:read(4) - if magic == hex("$7FELF") then - return detect_elf(fd) - end - if magic == hex("MZ$90$00") then - return detect_pe(fd) - end - return detect_mach(magic, fd) -end - -local cache_system -local cache_processor - -function sysdetect.detect(input_file) - local dirsep = package.config:sub(1,1) - local files - - if input_file then - files = { input_file } - else - if cache_system then - return cache_system, cache_processor - end - - local PATHsep - local interp = arg and arg[-1] - if dirsep == "/" then - -- Unix - files = { - "/bin/sh", -- Unix: well-known POSIX path - "/proc/self/exe", -- Linux: this should always have a working binary - } - PATHsep = ":" - else - -- Windows - local systemroot = os.getenv("SystemRoot") - files = { - systemroot .. "\\system32\\notepad.exe", -- well-known Windows path - systemroot .. "\\explorer.exe", -- well-known Windows path - } - if interp and not interp:lower():match("exe$") then - interp = interp .. ".exe" - end - PATHsep = ";" - end - if interp then - if interp:match(dirsep) then - -- interpreter path is absolute - table.insert(files, interp) - else - for d in (os.getenv("PATH") or ""):gmatch("[^"..PATHsep.."]+") do - table.insert(files, d .. dirsep .. interp) - end - end - end - end - for _, f in ipairs(files) do - local system, processor = sysdetect.detect_file(f) - if system then - cache_system = system - cache_processor = processor - return system, processor - end - end -end - -return sysdetect diff --git a/.luarocks/share/lua/5.1/luarocks/core/util.lua b/.luarocks/share/lua/5.1/luarocks/core/util.lua deleted file mode 100644 index 26e783698..000000000 --- a/.luarocks/share/lua/5.1/luarocks/core/util.lua +++ /dev/null @@ -1,318 +0,0 @@ - -local util = {} - -local require = nil --------------------------------------------------------------------------------- - ---- Run a process and read a its output. --- Equivalent to io.popen(cmd):read("*l"), except that it --- closes the fd right away. --- @param cmd string: The command to execute --- @param spec string: "*l" by default, to read a single line. --- May be used to read more, passing, for instance, "*a". --- @return string: the output of the program. -function util.popen_read(cmd, spec) - local dir_sep = package.config:sub(1, 1) - local tmpfile = (dir_sep == "\\") - and (os.getenv("TMP") .. "/luarocks-" .. tostring(math.floor(math.random() * 10000))) - or os.tmpname() - os.execute(cmd .. " > " .. tmpfile) - local fd = io.open(tmpfile, "rb") - if not fd then - os.remove(tmpfile) - return "" - end - local out = fd:read(spec or "*l") - fd:close() - os.remove(tmpfile) - return out or "" -end - ---- --- Formats tables with cycles recursively to any depth. --- References to other tables are shown as values. --- Self references are indicated. --- The string returned is "Lua code", which can be processed --- (in the case in which indent is composed by spaces or "--"). --- Userdata and function keys and values are shown as strings, --- which logically are exactly not equivalent to the original code. --- This routine can serve for pretty formating tables with --- proper indentations, apart from printing them: --- io.write(table.show(t, "t")) -- a typical use --- Written by Julio Manuel Fernandez-Diaz, --- Heavily based on "Saving tables with cycles", PIL2, p. 113. --- @param t table: is the table. --- @param tname string: is the name of the table (optional) --- @param top_indent string: is a first indentation (optional). --- @return string: the pretty-printed table -function util.show_table(t, tname, top_indent) - local cart -- a container - local autoref -- for self references - - local function is_empty_table(tbl) return next(tbl) == nil end - - local function basic_serialize(o) - local so = tostring(o) - if type(o) == "function" then - local info = debug and debug.getinfo(o, "S") - if not info then - return ("%q"):format(so) - end - -- info.name is nil because o is not a calling level - if info.what == "C" then - return ("%q"):format(so .. ", C function") - else - -- the information is defined through lines - return ("%q"):format(so .. ", defined in (" .. info.linedefined .. "-" .. info.lastlinedefined .. ")" .. info.source) - end - elseif type(o) == "number" then - return so - else - return ("%q"):format(so) - end - end - - local function add_to_cart(value, name, indent, saved, field) - indent = indent or "" - saved = saved or {} - field = field or name - - cart = cart .. indent .. field - - if type(value) ~= "table" then - cart = cart .. " = " .. basic_serialize(value) .. ";\n" - else - if saved[value] then - cart = cart .. " = {}; -- " .. saved[value] .. " (self reference)\n" - autoref = autoref .. name .. " = " .. saved[value] .. ";\n" - else - saved[value] = name - if is_empty_table(value) then - cart = cart .. " = {};\n" - else - cart = cart .. " = {\n" - for k, v in pairs(value) do - k = basic_serialize(k) - local fname = ("%s[%s]"):format(name, k) - field = ("[%s]"):format(k) - -- three spaces between levels - add_to_cart(v, fname, indent .. " ", saved, field) - end - cart = cart .. indent .. "};\n" - end - end - end - end - - tname = tname or "__unnamed__" - if type(t) ~= "table" then - return tname .. " = " .. basic_serialize(t) - end - cart, autoref = "", "" - add_to_cart(t, tname, top_indent) - return cart .. autoref -end - ---- Merges contents of src on top of dst's contents --- (i.e. if an key from src already exists in dst, replace it). --- @param dst Destination table, which will receive src's contents. --- @param src Table which provides new contents to dst. -function util.deep_merge(dst, src) - for k, v in pairs(src) do - if type(v) == "table" then - if dst[k] == nil then - dst[k] = {} - end - if type(dst[k]) == "table" then - util.deep_merge(dst[k], v) - else - dst[k] = v - end - else - dst[k] = v - end - end -end - ---- Merges contents of src below those of dst's contents --- (i.e. if an key from src already exists in dst, do not replace it). --- @param dst Destination table, which will receive src's contents. --- @param src Table which provides new contents to dst. -function util.deep_merge_under(dst, src) - for k, v in pairs(src) do - if type(v) == "table" then - if dst[k] == nil then - dst[k] = {} - end - if type(dst[k]) == "table" then - util.deep_merge_under(dst[k], v) - end - elseif dst[k] == nil then - dst[k] = v - end - end -end - ---- Clean up a path-style string ($PATH, $LUA_PATH/package.path, etc.), --- removing repeated entries and making sure only the relevant --- Lua version is used. --- Example: given ("a;b;c;a;b;d", ";"), returns "a;b;c;d". --- @param list string: A path string (from $PATH or package.path) --- @param sep string: The separator --- @param lua_version (optional) string: The Lua version to use. --- @param keep_first (optional) if true, keep first occurrence in case --- of duplicates; otherwise keep last occurrence. The default is false. -function util.cleanup_path(list, sep, lua_version, keep_first) - assert(type(list) == "string") - assert(type(sep) == "string") - local parts = util.split_string(list, sep) - local final, entries = {}, {} - local start, stop, step - - if keep_first then - start, stop, step = 1, #parts, 1 - else - start, stop, step = #parts, 1, -1 - end - - for i = start, stop, step do - local part = parts[i]:gsub("//", "/") - if lua_version then - part = part:gsub("/lua/([%d.]+)/", function(part_version) - if part_version:sub(1, #lua_version) ~= lua_version then - return "/lua/"..lua_version.."/" - end - end) - end - if not entries[part] then - local at = keep_first and #final+1 or 1 - table.insert(final, at, part) - entries[part] = true - end - end - - return table.concat(final, sep) -end - --- from http://lua-users.org/wiki/SplitJoin --- by Philippe Lhoste -function util.split_string(str, delim, maxNb) - -- Eliminate bad cases... - if string.find(str, delim) == nil then - return { str } - end - if maxNb == nil or maxNb < 1 then - maxNb = 0 -- No limit - end - local result = {} - local pat = "(.-)" .. delim .. "()" - local nb = 0 - local lastPos - for part, pos in string.gmatch(str, pat) do - nb = nb + 1 - result[nb] = part - lastPos = pos - if nb == maxNb then break end - end - -- Handle the last field - if nb ~= maxNb then - result[nb + 1] = string.sub(str, lastPos) - end - return result -end - ---- Return an array of keys of a table. --- @param tbl table: The input table. --- @return table: The array of keys. -function util.keys(tbl) - local ks = {} - for k,_ in pairs(tbl) do - table.insert(ks, k) - end - return ks -end - ---- Print a line to standard error -function util.printerr(...) - io.stderr:write(table.concat({...},"\t")) - io.stderr:write("\n") -end - ---- Display a warning message. --- @param msg string: the warning message -function util.warning(msg) - util.printerr("Warning: "..msg) -end - ---- Simple sort function used as a default for util.sortedpairs. -local function default_sort(a, b) - local ta = type(a) - local tb = type(b) - if ta == "number" and tb == "number" then - return a < b - elseif ta == "number" then - return true - elseif tb == "number" then - return false - else - return tostring(a) < tostring(b) - end -end - ---- A table iterator generator that returns elements sorted by key, --- to be used in "for" loops. --- @param tbl table: The table to be iterated. --- @param sort_function function or table or nil: An optional comparison function --- to be used by table.sort when sorting keys, or an array listing an explicit order --- for keys. If a value itself is an array, it is taken so that the first element --- is a string representing the field name, and the second element is a priority table --- for that key, which is returned by the iterator as the third value after the key --- and the value. --- @return function: the iterator function. -function util.sortedpairs(tbl, sort_function) - sort_function = sort_function or default_sort - local keys = util.keys(tbl) - local sub_orders = {} - - if type(sort_function) == "function" then - table.sort(keys, sort_function) - else - local order = sort_function - local ordered_keys = {} - local all_keys = keys - keys = {} - - for _, order_entry in ipairs(order) do - local key, sub_order - if type(order_entry) == "table" then - key = order_entry[1] - sub_order = order_entry[2] - else - key = order_entry - end - - if tbl[key] then - ordered_keys[key] = true - sub_orders[key] = sub_order - table.insert(keys, key) - end - end - - table.sort(all_keys, default_sort) - for _, key in ipairs(all_keys) do - if not ordered_keys[key] then - table.insert(keys, key) - end - end - end - - local i = 1 - return function() - local key = keys[i] - i = i + 1 - return key, tbl[key], sub_orders[key] - end -end - -return util - diff --git a/.luarocks/share/lua/5.1/luarocks/core/vers.lua b/.luarocks/share/lua/5.1/luarocks/core/vers.lua deleted file mode 100644 index 8e617984a..000000000 --- a/.luarocks/share/lua/5.1/luarocks/core/vers.lua +++ /dev/null @@ -1,207 +0,0 @@ - -local vers = {} - -local util = require("luarocks.core.util") -local require = nil --------------------------------------------------------------------------------- - -local deltas = { - dev = 120000000, - scm = 110000000, - cvs = 100000000, - rc = -1000, - pre = -10000, - beta = -100000, - alpha = -1000000 -} - -local version_mt = { - --- Equality comparison for versions. - -- All version numbers must be equal. - -- If both versions have revision numbers, they must be equal; - -- otherwise the revision number is ignored. - -- @param v1 table: version table to compare. - -- @param v2 table: version table to compare. - -- @return boolean: true if they are considered equivalent. - __eq = function(v1, v2) - if #v1 ~= #v2 then - return false - end - for i = 1, #v1 do - if v1[i] ~= v2[i] then - return false - end - end - if v1.revision and v2.revision then - return (v1.revision == v2.revision) - end - return true - end, - --- Size comparison for versions. - -- All version numbers are compared. - -- If both versions have revision numbers, they are compared; - -- otherwise the revision number is ignored. - -- @param v1 table: version table to compare. - -- @param v2 table: version table to compare. - -- @return boolean: true if v1 is considered lower than v2. - __lt = function(v1, v2) - for i = 1, math.max(#v1, #v2) do - local v1i, v2i = v1[i] or 0, v2[i] or 0 - if v1i ~= v2i then - return (v1i < v2i) - end - end - if v1.revision and v2.revision then - return (v1.revision < v2.revision) - end - return false - end, - -- @param v1 table: version table to compare. - -- @param v2 table: version table to compare. - -- @return boolean: true if v1 is considered lower than or equal to v2. - __le = function(v1, v2) - return not (v2 < v1) -- luacheck: ignore - end, - --- Return version as a string. - -- @param v The version table. - -- @return The string representation. - __tostring = function(v) - return v.string - end, -} - -local version_cache = {} -setmetatable(version_cache, { - __mode = "kv" -}) - ---- Parse a version string, converting to table format. --- A version table contains all components of the version string --- converted to numeric format, stored in the array part of the table. --- If the version contains a revision, it is stored numerically --- in the 'revision' field. The original string representation of --- the string is preserved in the 'string' field. --- Returned version tables use a metatable --- allowing later comparison through relational operators. --- @param vstring string: A version number in string format. --- @return table or nil: A version table or nil --- if the input string contains invalid characters. -function vers.parse_version(vstring) - if not vstring then return nil end - assert(type(vstring) == "string") - - local cached = version_cache[vstring] - if cached then - return cached - end - - local version = {} - local i = 1 - - local function add_token(number) - version[i] = version[i] and version[i] + number/100000 or number - i = i + 1 - end - - -- trim leading and trailing spaces - local v = vstring:match("^%s*(.*)%s*$") - version.string = v - -- store revision separately if any - local main, revision = v:match("(.*)%-(%d+)$") - if revision then - v = main - version.revision = tonumber(revision) - end - while #v > 0 do - -- extract a number - local token, rest = v:match("^(%d+)[%.%-%_]*(.*)") - if token then - add_token(tonumber(token)) - else - -- extract a word - token, rest = v:match("^(%a+)[%.%-%_]*(.*)") - if not token then - util.warning("version number '"..v.."' could not be parsed.") - version[i] = 0 - break - end - version[i] = deltas[token] or (token:byte() / 1000) - end - v = rest - end - setmetatable(version, version_mt) - version_cache[vstring] = version - return version -end - ---- Utility function to compare version numbers given as strings. --- @param a string: one version. --- @param b string: another version. --- @return boolean: True if a > b. -function vers.compare_versions(a, b) - if a == b then - return false - end - return vers.parse_version(a) > vers.parse_version(b) -end - ---- A more lenient check for equivalence between versions. --- This returns true if the requested components of a version --- match and ignore the ones that were not given. For example, --- when requesting "2", then "2", "2.1", "2.3.5-9"... all match. --- When requesting "2.1", then "2.1", "2.1.3" match, but "2.2" --- doesn't. --- @param version string or table: Version to be tested; may be --- in string format or already parsed into a table. --- @param requested string or table: Version requested; may be --- in string format or already parsed into a table. --- @return boolean: True if the tested version matches the requested --- version, false otherwise. -local function partial_match(version, requested) - assert(type(version) == "string" or type(version) == "table") - assert(type(requested) == "string" or type(version) == "table") - - if type(version) ~= "table" then version = vers.parse_version(version) end - if type(requested) ~= "table" then requested = vers.parse_version(requested) end - if not version or not requested then return false end - - for i, ri in ipairs(requested) do - local vi = version[i] or 0 - if ri ~= vi then return false end - end - if requested.revision then - return requested.revision == version.revision - end - return true -end - ---- Check if a version satisfies a set of constraints. --- @param version table: A version in table format --- @param constraints table: An array of constraints in table format. --- @return boolean: True if version satisfies all constraints, --- false otherwise. -function vers.match_constraints(version, constraints) - assert(type(version) == "table") - assert(type(constraints) == "table") - local ok = true - setmetatable(version, version_mt) - for _, constr in pairs(constraints) do - if type(constr.version) == "string" then - constr.version = vers.parse_version(constr.version) - end - local constr_version, constr_op = constr.version, constr.op - setmetatable(constr_version, version_mt) - if constr_op == "==" then ok = version == constr_version - elseif constr_op == "~=" then ok = version ~= constr_version - elseif constr_op == ">" then ok = version > constr_version - elseif constr_op == "<" then ok = version < constr_version - elseif constr_op == ">=" then ok = version >= constr_version - elseif constr_op == "<=" then ok = version <= constr_version - elseif constr_op == "~>" then ok = partial_match(version, constr_version) - end - if not ok then break end - end - return ok -end - -return vers diff --git a/.luarocks/share/lua/5.1/luarocks/deplocks.lua b/.luarocks/share/lua/5.1/luarocks/deplocks.lua deleted file mode 100644 index d62908f46..000000000 --- a/.luarocks/share/lua/5.1/luarocks/deplocks.lua +++ /dev/null @@ -1,106 +0,0 @@ -local deplocks = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local util = require("luarocks.util") -local persist = require("luarocks.persist") - -local deptable = {} -local deptable_mode = "start" -local deplock_abs_filename -local deplock_root_rock_name - -function deplocks.init(root_rock_name, dirname) - if deptable_mode ~= "start" then - return - end - deptable_mode = "create" - - local filename = dir.path(dirname, "luarocks.lock") - deplock_abs_filename = fs.absolute_name(filename) - deplock_root_rock_name = root_rock_name - - deptable = {} -end - -function deplocks.get_abs_filename(root_rock_name) - if root_rock_name == deplock_root_rock_name then - return deplock_abs_filename - end -end - -function deplocks.load(root_rock_name, dirname) - if deptable_mode ~= "start" then - return true, nil - end - deptable_mode = "locked" - - local filename = dir.path(dirname, "luarocks.lock") - local ok, result, errcode = persist.run_file(filename, {}) - if errcode == "load" or errcode == "run" then - -- bad config file or depends on env, so error out - return nil, nil, "Could not read existing lockfile " .. filename - end - - if errcode == "open" then - -- could not open, maybe file does not exist - return true, nil - end - - deplock_abs_filename = fs.absolute_name(filename) - deplock_root_rock_name = root_rock_name - - deptable = result - return true, filename -end - -function deplocks.add(depskey, name, version) - if deptable_mode == "locked" then - return - end - - local dk = deptable[depskey] - if not dk then - dk = {} - deptable[depskey] = dk - end - - if not dk[name] then - dk[name] = version - end -end - -function deplocks.get(depskey, name) - local dk = deptable[depskey] - if not dk then - return nil - end - - return deptable[name] -end - -function deplocks.write_file() - if deptable_mode ~= "create" then - return true - end - - return persist.save_as_module(deplock_abs_filename, deptable) -end - --- a table-like interface to deplocks -function deplocks.proxy(depskey) - return setmetatable({}, { - __index = function(_, k) - return deplocks.get(depskey, k) - end, - __newindex = function(_, k, v) - return deplocks.add(depskey, k, v) - end, - }) -end - -function deplocks.each(depskey) - return util.sortedpairs(deptable[depskey] or {}) -end - -return deplocks diff --git a/.luarocks/share/lua/5.1/luarocks/deps.lua b/.luarocks/share/lua/5.1/luarocks/deps.lua deleted file mode 100644 index 2b8795ad4..000000000 --- a/.luarocks/share/lua/5.1/luarocks/deps.lua +++ /dev/null @@ -1,777 +0,0 @@ - ---- High-level dependency related functions. -local deps = {} - -local cfg = require("luarocks.core.cfg") -local manif = require("luarocks.manif") -local path = require("luarocks.path") -local dir = require("luarocks.dir") -local fun = require("luarocks.fun") -local util = require("luarocks.util") -local vers = require("luarocks.core.vers") -local queries = require("luarocks.queries") -local builtin = require("luarocks.build.builtin") -local deplocks = require("luarocks.deplocks") - ---- Generate a function that matches dep queries against the manifest, --- taking into account rocks_provided, the list of versions to skip, --- and the lockfile. --- @param deps_mode "one", "none", "all" or "order" --- @param rocks_provided a one-level table mapping names to versions, --- listing rocks to consider provided by the VM --- @param rocks_provided table: A table of auto-provided dependencies. --- by this Lua implementation for the given dependency. --- @param depskey key to use when matching the lockfile ("dependencies", --- "build_dependencies", etc.) --- @param skip_set a two-level table mapping names to versions to --- boolean, listing rocks that should not be matched --- @return function(dep): {string}, {string:string}, string, boolean --- * array of matching versions --- * map of versions to locations --- * version matched via lockfile if any --- * true if rock matched via rocks_provided -local function prepare_get_versions(deps_mode, rocks_provided, depskey, skip_set) - assert(type(deps_mode) == "string") - assert(type(rocks_provided) == "table") - assert(type(depskey) == "string") - assert(type(skip_set) == "table" or skip_set == nil) - - return function(dep) - local versions, locations - local provided = rocks_provided[dep.name] - if provided then - -- Provided rocks have higher priority than manifest's rocks. - versions, locations = { provided }, {} - else - if deps_mode == "none" then - deps_mode = "one" - end - versions, locations = manif.get_versions(dep, deps_mode) - end - - if skip_set and skip_set[dep.name] then - for i = #versions, 1, -1 do - local v = versions[i] - if skip_set[dep.name][v] then - table.remove(versions, i) - end - end - end - - local lockversion = deplocks.get(depskey, dep.name) - - return versions, locations, lockversion, provided ~= nil - end -end - ---- Attempt to match a dependency to an installed rock. --- @param get_versions a getter function obtained via prepare_get_versions --- @return (string, string, table) or (nil, nil, table): --- 1. latest installed version of the rock matching the dependency --- 2. location where the installed version is installed --- 3. the 'dep' query table --- 4. true if provided via VM --- or --- 1. nil --- 2. nil --- 3. either 'dep' or an alternative query to be used --- 4. false -local function match_dep(dep, get_versions) - assert(type(dep) == "table") - assert(type(get_versions) == "function") - - local versions, locations, lockversion, provided = get_versions(dep) - - local latest_version - local latest_vstring - for _, vstring in ipairs(versions) do - local version = vers.parse_version(vstring) - if vers.match_constraints(version, dep.constraints) then - if not latest_version or version > latest_version then - latest_version = version - latest_vstring = vstring - end - end - end - - if lockversion and not locations[lockversion] then - local latest_matching_msg = "" - if latest_vstring and latest_vstring ~= lockversion then - latest_matching_msg = " (latest matching is " .. latest_vstring .. ")" - end - util.printout("Forcing " .. dep.name .. " to pinned version " .. lockversion .. latest_matching_msg) - return nil, nil, queries.new(dep.name, dep.namespace, lockversion) - end - - return latest_vstring, locations[latest_vstring], dep, provided -end - -local function match_all_deps(dependencies, get_versions) - assert(type(dependencies) == "table") - assert(type(get_versions) == "function") - - local matched, missing, no_upgrade = {}, {}, {} - - for _, dep in ipairs(dependencies) do - local found, _, provided - found, _, dep, provided = match_dep(dep, get_versions) - if found then - if not provided then - matched[dep] = {name = dep.name, version = found} - end - else - if dep.constraints[1] and dep.constraints[1].no_upgrade then - no_upgrade[dep.name] = dep - else - missing[dep.name] = dep - end - end - end - return matched, missing, no_upgrade -end - ---- Attempt to match dependencies of a rockspec to installed rocks. --- @param dependencies table: The table of dependencies. --- @param rocks_provided table: The table of auto-provided dependencies. --- @param skip_set table or nil: Program versions to not use as valid matches. --- Table where keys are program names and values are tables where keys --- are program versions and values are 'true'. --- @param deps_mode string: Which trees to check dependencies for --- @return table, table, table: A table where keys are dependencies parsed --- in table format and values are tables containing fields 'name' and --- version' representing matches; a table of missing dependencies --- parsed as tables; and a table of "no-upgrade" missing dependencies --- (to be used in plugin modules so that a plugin does not force upgrade of --- its parent application). -function deps.match_deps(dependencies, rocks_provided, skip_set, deps_mode) - assert(type(dependencies) == "table") - assert(type(rocks_provided) == "table") - assert(type(skip_set) == "table" or skip_set == nil) - assert(type(deps_mode) == "string") - - local get_versions = prepare_get_versions(deps_mode, rocks_provided, "dependencies", skip_set) - return match_all_deps(dependencies, get_versions) -end - -local function rock_status(dep, get_versions) - assert(dep:type() == "query") - assert(type(get_versions) == "function") - - local installed, _, _, provided = match_dep(dep, get_versions) - local installation_type = provided and "provided by VM" or "installed" - return installed and installed.." "..installation_type or "not installed" -end - ---- Check depenendencies of a package and report any missing ones. --- @param name string: package name. --- @param version string: package version. --- @param dependencies table: array of dependencies. --- @param deps_mode string: Which trees to check dependencies for --- @param rocks_provided table: A table of auto-dependencies provided --- by this Lua implementation for the given dependency. --- "one" for the current default tree, "all" for all trees, --- "order" for all trees with priority >= the current default, "none" for no trees. -function deps.report_missing_dependencies(name, version, dependencies, deps_mode, rocks_provided) - assert(type(name) == "string") - assert(type(version) == "string") - assert(type(dependencies) == "table") - assert(type(deps_mode) == "string") - assert(type(rocks_provided) == "table") - - if deps_mode == "none" then - return - end - - local get_versions = prepare_get_versions(deps_mode, rocks_provided, "dependencies") - - local first_missing_dep = true - - for _, dep in ipairs(dependencies) do - local found, _ - found, _, dep = match_dep(dep, get_versions) - if not found then - if first_missing_dep then - util.printout(("Missing dependencies for %s %s:"):format(name, version)) - first_missing_dep = false - end - - util.printout((" %s (%s)"):format(tostring(dep), rock_status(dep, get_versions))) - end - end -end - -function deps.fulfill_dependency(dep, deps_mode, rocks_provided, verify, depskey) - assert(dep:type() == "query") - assert(type(deps_mode) == "string" or deps_mode == nil) - assert(type(rocks_provided) == "table" or rocks_provided == nil) - assert(type(verify) == "boolean" or verify == nil) - assert(type(depskey) == "string") - - deps_mode = deps_mode or "all" - rocks_provided = rocks_provided or {} - - local get_versions = prepare_get_versions(deps_mode, rocks_provided, depskey) - - local found, where - found, where, dep = match_dep(dep, get_versions) - if found then - local tree_manifests = manif.load_rocks_tree_manifests(deps_mode) - manif.scan_dependencies(dep.name, found, tree_manifests, deplocks.proxy(depskey)) - return true, found, where - end - - local search = require("luarocks.search") - local install = require("luarocks.cmd.install") - - local url, search_err = search.find_suitable_rock(dep) - if not url then - return nil, "Could not satisfy dependency "..tostring(dep)..": "..search_err - end - util.printout("Installing "..url) - local install_args = { - rock = url, - deps_mode = deps_mode, - namespace = dep.namespace, - verify = verify, - } - local ok, install_err, errcode = install.command(install_args) - if not ok then - return nil, "Failed installing dependency: "..url.." - "..install_err, errcode - end - - found, where = match_dep(dep, get_versions) - assert(found) - return true, found, where -end - -local function check_supported_platforms(rockspec) - if rockspec.supported_platforms and next(rockspec.supported_platforms) then - local all_negative = true - local supported = false - for _, plat in pairs(rockspec.supported_platforms) do - local neg - neg, plat = plat:match("^(!?)(.*)") - if neg == "!" then - if cfg.is_platform(plat) then - return nil, "This rockspec for "..rockspec.package.." does not support "..plat.." platforms." - end - else - all_negative = false - if cfg.is_platform(plat) then - supported = true - break - end - end - end - if supported == false and not all_negative then - local plats = cfg.print_platforms() - return nil, "This rockspec for "..rockspec.package.." does not support "..plats.." platforms." - end - end - - return true -end - ---- Check dependencies of a rock and attempt to install any missing ones. --- Packages are installed using the LuaRocks "install" command. --- Aborts the program if a dependency could not be fulfilled. --- @param rockspec table: A rockspec in table format. --- @param depskey string: Rockspec key to fetch to get dependency table --- ("dependencies", "build_dependencies", etc.). --- @param deps_mode string --- @param verify boolean --- @param deplock_dir string: dirname of the deplock file --- @return boolean or (nil, string, [string]): True if no errors occurred, or --- nil and an error message if any test failed, followed by an optional --- error code. -function deps.fulfill_dependencies(rockspec, depskey, deps_mode, verify, deplock_dir) - assert(type(rockspec) == "table") - assert(type(depskey) == "string") - assert(type(deps_mode) == "string") - assert(type(verify) == "boolean" or verify == nil) - assert(type(deplock_dir) == "string" or deplock_dir == nil) - - local name = rockspec.name - local version = rockspec.version - local rocks_provided = rockspec.rocks_provided - - local ok, filename, err = deplocks.load(name, deplock_dir or ".") - if filename then - util.printout("Using dependencies pinned in lockfile: " .. filename) - - local get_versions = prepare_get_versions("none", rocks_provided, depskey) - for dnsname, dversion in deplocks.each(depskey) do - local dname, dnamespace = util.split_namespace(dnsname) - local dep = queries.new(dname, dnamespace, dversion) - - util.printout(("%s %s is pinned to %s (%s)"):format( - name, version, tostring(dep), rock_status(dep, get_versions))) - - local ok, err = deps.fulfill_dependency(dep, "none", rocks_provided, verify, depskey) - if not ok then - return nil, err - end - end - util.printout() - return true - elseif err then - util.warning(err) - end - - ok, err = check_supported_platforms(rockspec) - if not ok then - return nil, err - end - - deps.report_missing_dependencies(name, version, rockspec[depskey], deps_mode, rocks_provided) - - util.printout() - - local get_versions = prepare_get_versions(deps_mode, rocks_provided, depskey) - for _, dep in ipairs(rockspec[depskey]) do - - util.printout(("%s %s depends on %s (%s)"):format( - name, version, tostring(dep), rock_status(dep, get_versions))) - - local ok, found_or_err, _, no_upgrade = deps.fulfill_dependency(dep, deps_mode, rocks_provided, verify, depskey) - if ok then - deplocks.add(depskey, dep.name, found_or_err) - else - if no_upgrade then - util.printerr("This version of "..name.." is designed for use with") - util.printerr(tostring(dep)..", but is configured to avoid upgrading it") - util.printerr("automatically. Please upgrade "..dep.name.." with") - util.printerr(" luarocks install "..dep.name) - util.printerr("or look for a suitable version of "..name.." with") - util.printerr(" luarocks search "..name) - end - return nil, found_or_err - end - end - - return true -end - ---- If filename matches a pattern, return the capture. --- For example, given "libfoo.so" and "lib?.so" is a pattern, --- returns "foo" (which can then be used to build names --- based on other patterns. --- @param file string: a filename --- @param pattern string: a pattern, where ? is to be matched by the filename. --- @return string The pattern, if found, or nil. -local function deconstruct_pattern(file, pattern) - local depattern = "^"..(pattern:gsub("%.", "%%."):gsub("%*", ".*"):gsub("?", "(.*)")).."$" - return (file:match(depattern)) -end - ---- Construct all possible patterns for a name and add to the files array. --- Run through the patterns array replacing all occurrences of "?" --- with the given file name and store them in the files array. --- @param file string A raw name (e.g. "foo") --- @param array of string An array of patterns with "?" as the wildcard --- (e.g. {"?.so", "lib?.so"}) --- @param files The array of constructed names -local function add_all_patterns(file, patterns, files) - for _, pattern in ipairs(patterns) do - table.insert(files, {#files + 1, (pattern:gsub("?", file))}) - end -end - -local function get_external_deps_dirs(mode) - local patterns = cfg.external_deps_patterns - local subdirs = cfg.external_deps_subdirs - if mode == "install" then - patterns = cfg.runtime_external_deps_patterns - subdirs = cfg.runtime_external_deps_subdirs - end - local dirs = { - BINDIR = { subdir = subdirs.bin, testfile = "program", pattern = patterns.bin }, - INCDIR = { subdir = subdirs.include, testfile = "header", pattern = patterns.include }, - LIBDIR = { subdir = subdirs.lib, testfile = "library", pattern = patterns.lib } - } - if mode == "install" then - dirs.INCDIR = nil - end - return dirs -end - -local function resolve_prefix(prefix, dirs) - if type(prefix) == "string" then - return prefix - elseif type(prefix) == "table" then - if prefix.bin then - dirs.BINDIR.subdir = prefix.bin - end - if prefix.include then - if dirs.INCDIR then - dirs.INCDIR.subdir = prefix.include - end - end - if prefix.lib then - dirs.LIBDIR.subdir = prefix.lib - end - return prefix.prefix - end -end - -local function add_patterns_for_file(files, file, patterns) - -- If it doesn't look like it contains a filename extension - if not (file:match("%.[a-z]+$") or file:match("%.[a-z]+%.")) then - add_all_patterns(file, patterns, files) - else - for _, pattern in ipairs(patterns) do - local matched = deconstruct_pattern(file, pattern) - if matched then - add_all_patterns(matched, patterns, files) - end - end - table.insert(files, {#files + 1, file}) - end -end - -local function check_external_dependency_at(prefix, name, ext_files, vars, dirs, err_files, cache) - local fs = require("luarocks.fs") - cache = cache or {} - - for dirname, dirdata in util.sortedpairs(dirs) do - local paths - local path_var_value = vars[name.."_"..dirname] - if path_var_value then - paths = { path_var_value } - elseif type(dirdata.subdir) == "table" then - paths = {} - for i,v in ipairs(dirdata.subdir) do - paths[i] = dir.path(prefix, v) - end - else - paths = { dir.path(prefix, dirdata.subdir) } - end - dirdata.dir = paths[1] - local file_or_files = ext_files[dirdata.testfile] - if file_or_files then - local files = {} - if type(file_or_files) == "string" then - add_patterns_for_file(files, file_or_files, dirdata.pattern) - elseif type(file_or_files) == "table" then - for _, f in ipairs(file_or_files) do - add_patterns_for_file(files, f, dirdata.pattern) - end - end - - local found = false - table.sort(files, function(a, b) - if (not a[2]:match("%*")) and b[2]:match("%*") then - return true - elseif a[2]:match("%*") and (not b[2]:match("%*")) then - return false - else - return a[1] < b[1] - end - end) - for _, fa in ipairs(files) do - - local f = fa[2] - -- small convenience hack - if f:match("%.so$") or f:match("%.dylib$") or f:match("%.dll$") then - f = f:gsub("%.[^.]+$", "."..cfg.external_lib_extension) - end - - local pattern - if f:match("%*") then - pattern = "^" .. f:gsub("([-.+])", "%%%1"):gsub("%*", ".*") .. "$" - f = "matching "..f - end - - for _, d in ipairs(paths) do - if pattern then - if not cache[d] then - cache[d] = fs.list_dir(d) - end - local match = string.match - for _, entry in ipairs(cache[d]) do - if match(entry, pattern) then - found = true - break - end - end - else - found = fs.is_file(dir.path(d, f)) - end - if found then - dirdata.dir = d - dirdata.file = f - break - else - table.insert(err_files[dirdata.testfile], f.." in "..d) - end - end - if found then - break - end - end - if not found then - return nil, dirname, dirdata.testfile - end - end - end - - for dirname, dirdata in pairs(dirs) do - vars[name.."_"..dirname] = dirdata.dir - vars[name.."_"..dirname.."_FILE"] = dirdata.file - end - vars[name.."_DIR"] = prefix - return true -end - -local function check_external_dependency(name, ext_files, vars, mode, cache) - local ok - local err_dirname - local err_testfile - local err_files = {program = {}, header = {}, library = {}} - - local dirs = get_external_deps_dirs(mode) - - local prefixes - if vars[name .. "_DIR"] then - prefixes = { vars[name .. "_DIR"] } - elseif vars.DEPS_DIR then - prefixes = { vars.DEPS_DIR } - else - prefixes = cfg.external_deps_dirs - end - - for _, prefix in ipairs(prefixes) do - prefix = resolve_prefix(prefix, dirs) - if cfg.is_platform("mingw32") and name == "LUA" then - dirs.LIBDIR.pattern = fun.filter(util.deep_copy(dirs.LIBDIR.pattern), function(s) - return not s:match("%.a$") - end) - elseif cfg.is_platform("windows") and name == "LUA" then - dirs.LIBDIR.pattern = fun.filter(util.deep_copy(dirs.LIBDIR.pattern), function(s) - return not s:match("%.dll$") - end) - end - ok, err_dirname, err_testfile = check_external_dependency_at(prefix, name, ext_files, vars, dirs, err_files, cache) - if ok then - return true - end - end - - return nil, err_dirname, err_testfile, err_files -end - ---- Set up path-related variables for external dependencies. --- For each key in the external_dependencies table in the --- rockspec file, four variables are created: _DIR, _BINDIR, --- _INCDIR and _LIBDIR. These are not overwritten --- if already set (e.g. by the LuaRocks config file or through the --- command-line). Values in the external_dependencies table --- are tables that may contain a "header" or a "library" field, --- with filenames to be tested for existence. --- @param rockspec table: The rockspec table. --- @param mode string: if "build" is given, checks all files; --- if "install" is given, do not scan for headers. --- @return boolean or (nil, string): True if no errors occurred, or --- nil and an error message if any test failed. -function deps.check_external_deps(rockspec, mode) - assert(rockspec:type() == "rockspec") - - if not rockspec.external_dependencies then - rockspec.external_dependencies = builtin.autodetect_external_dependencies(rockspec.build) - end - if not rockspec.external_dependencies then - return true - end - - for name, ext_files in util.sortedpairs(rockspec.external_dependencies) do - local ok, err_dirname, err_testfile, err_files = check_external_dependency(name, ext_files, rockspec.variables, mode) - if not ok then - local lines = {"Could not find "..err_testfile.." file for "..name} - - local err_paths = {} - for _, err_file in ipairs(err_files[err_testfile]) do - if not err_paths[err_file] then - err_paths[err_file] = true - table.insert(lines, " No file "..err_file) - end - end - - table.insert(lines, "You may have to install "..name.." in your system and/or pass "..name.."_DIR or "..name.."_"..err_dirname.." to the luarocks command.") - table.insert(lines, "Example: luarocks install "..rockspec.name.." "..name.."_DIR=/usr/local") - - return nil, table.concat(lines, "\n"), "dependency" - end - end - return true -end - ---- Recursively add satisfied dependencies of a package to a table, --- to build a transitive closure of all dependent packages. --- Additionally ensures that `dependencies` table of the manifest is up-to-date. --- @param results table: The results table being built, maps package names to versions. --- @param manifest table: The manifest table containing dependencies. --- @param name string: Package name. --- @param version string: Package version. -function deps.scan_deps(results, manifest, name, version, deps_mode) - assert(type(results) == "table") - assert(type(manifest) == "table") - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - local fetch = require("luarocks.fetch") - - if results[name] then - return - end - if not manifest.dependencies then manifest.dependencies = {} end - local md = manifest.dependencies - if not md[name] then md[name] = {} end - local mdn = md[name] - local dependencies = mdn[version] - local rocks_provided - if not dependencies then - local rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version), false) - if not rockspec then - util.printerr("Couldn't load rockspec for "..name.." "..version..": "..err) - return - end - dependencies = rockspec.dependencies - rocks_provided = rockspec.rocks_provided - mdn[version] = dependencies - else - rocks_provided = util.get_rocks_provided() - end - - local get_versions = prepare_get_versions(deps_mode, rocks_provided, "dependencies") - - local matched = match_all_deps(dependencies, get_versions) - results[name] = version - for _, match in pairs(matched) do - deps.scan_deps(results, manifest, match.name, match.version, deps_mode) - end -end - -local function lua_h_exists(d, luaver) - local n = tonumber(luaver) - local major = math.floor(n) - local minor = (n - major) * 10 - local luanum = math.floor(major * 100 + minor) - - local lua_h = dir.path(d, "lua.h") - local fd = io.open(lua_h) - if fd then - local data = fd:read("*a") - fd:close() - if data:match("LUA_VERSION_NUM%s*" .. tostring(luanum)) then - return d - end - return nil, "Lua header found at " .. d .. " does not match Lua version " .. luaver .. ". You may want to override this by configuring LUA_INCDIR.", "dependency", 2 - end - - return nil, "Failed finding Lua header files. You may need to install them or configure LUA_INCDIR.", "dependency", 1 -end - -local function find_lua_incdir(prefix, luaver, luajitver) - luajitver = luajitver and luajitver:gsub("%-.*", "") - local shortv = luaver:gsub("%.", "") - local incdirs = { - prefix .. "/include/lua/" .. luaver, - prefix .. "/include/lua" .. luaver, - prefix .. "/include/lua-" .. luaver, - prefix .. "/include/lua" .. shortv, - prefix .. "/include", - prefix, - luajitver and (prefix .. "/include/luajit-" .. (luajitver:match("^(%d+%.%d+)") or "")), - } - local errprio = 0 - local mainerr - for _, d in ipairs(incdirs) do - local ok, err, _, prio = lua_h_exists(d, luaver) - if ok then - return d - end - if prio > errprio then - mainerr = err - errprio = prio - end - end - - -- not found, will fallback to a default - return nil, mainerr -end - -function deps.check_lua_incdir(vars) - local ljv = util.get_luajit_version() - - if vars.LUA_INCDIR then - return lua_h_exists(vars.LUA_INCDIR, cfg.lua_version) - end - - if vars.LUA_DIR then - local d, err = find_lua_incdir(vars.LUA_DIR, cfg.lua_version, ljv) - if d then - vars.LUA_INCDIR = d - return true - end - return nil, err - end - - return nil, "Failed finding Lua header files. You may need to install them or configure LUA_INCDIR.", "dependency" -end - -function deps.check_lua_libdir(vars) - local fs = require("luarocks.fs") - local ljv = util.get_luajit_version() - - if vars.LUA_LIBDIR and vars.LUALIB and fs.exists(dir.path(vars.LUA_LIBDIR, vars.LUALIB)) then - return true - end - - local shortv = cfg.lua_version:gsub("%.", "") - local libnames = { - "lua" .. cfg.lua_version, - "lua" .. shortv, - "lua-" .. cfg.lua_version, - "lua-" .. shortv, - "lua", - } - if ljv then - table.insert(libnames, 1, "luajit-" .. cfg.lua_version) - end - local cache = {} - local save_LUA_INCDIR = vars.LUA_INCDIR - local ok = check_external_dependency("LUA", { library = libnames }, vars, "build", cache) - vars.LUA_INCDIR = save_LUA_INCDIR - local err - if ok then - local filename = dir.path(vars.LUA_LIBDIR, vars.LUA_LIBDIR_FILE) - local fd = io.open(filename, "r") - if fd then - if not vars.LUA_LIBDIR_FILE:match((cfg.lua_version:gsub("%.", "%%.?"))) then - -- if filename isn't versioned, check file contents - local txt = fd:read("*a") - ok = txt:match("Lua " .. cfg.lua_version, 1, true) - or txt:match("lua" .. (cfg.lua_version:gsub("%.", "")), 1, true) - if not ok then - err = "Lua library at " .. filename .. " does not match Lua version " .. cfg.lua_version .. ". You may want to override this by configuring LUA_LIBDIR." - end - end - - fd:close() - end - end - - if ok then - vars.LUALIB = vars.LUA_LIBDIR_FILE - return true - else - err = err or "Failed finding Lua library. You may need to configure LUA_LIBDIR." - return nil, err, "dependency" - end -end - -function deps.get_deps_mode(args) - return args.deps_mode or cfg.deps_mode -end - -return deps diff --git a/.luarocks/share/lua/5.1/luarocks/dir.lua b/.luarocks/share/lua/5.1/luarocks/dir.lua deleted file mode 100644 index 74adbea2b..000000000 --- a/.luarocks/share/lua/5.1/luarocks/dir.lua +++ /dev/null @@ -1,48 +0,0 @@ - ---- Generic utilities for handling pathnames. -local dir = {} - -local core = require("luarocks.core.dir") - -dir.path = core.path -dir.split_url = core.split_url -dir.normalize = core.normalize - ---- Strip the path off a path+filename. --- @param pathname string: A path+name, such as "/a/b/c" --- or "\a\b\c". --- @return string: The filename without its path, such as "c". -function dir.base_name(pathname) - assert(type(pathname) == "string") - - local base = pathname:gsub("[/\\]*$", ""):match(".*[/\\]([^/\\]*)") - return base or pathname -end - ---- Strip the name off a path+filename. --- @param pathname string: A path+name, such as "/a/b/c". --- @return string: The filename without its path, such as "/a/b". --- For entries such as "/a/b/", "/a" is returned. If there are --- no directory separators in input, "" is returned. -function dir.dir_name(pathname) - assert(type(pathname) == "string") - return (pathname:gsub("/*$", ""):match("(.*)[/]+[^/]*")) or "" -end - ---- Returns true if protocol does not require additional tools. --- @param protocol The protocol name -function dir.is_basic_protocol(protocol) - return protocol == "http" or protocol == "https" or protocol == "ftp" or protocol == "file" -end - -function dir.deduce_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("%.([^.]*)$", known_exts):gsub("%.tar", "")) -end - -return dir diff --git a/.luarocks/share/lua/5.1/luarocks/download.lua b/.luarocks/share/lua/5.1/luarocks/download.lua deleted file mode 100644 index 07a2a65f0..000000000 --- a/.luarocks/share/lua/5.1/luarocks/download.lua +++ /dev/null @@ -1,68 +0,0 @@ -local download = {} - -local path = require("luarocks.path") -local fetch = require("luarocks.fetch") -local search = require("luarocks.search") -local queries = require("luarocks.queries") -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local util = require("luarocks.util") - -local function get_file(filename) - local protocol, pathname = dir.split_url(filename) - if protocol == "file" then - local ok, err = fs.copy(pathname, fs.current_dir(), "read") - if ok then - return pathname - else - return nil, err - end - else - -- discard third result - local ok, err = fetch.fetch_url(filename) - return ok, err - end -end - -function download.download(arch, name, namespace, version, all, check_lua_versions) - local substring = (all and name == "") - local query = queries.new(name, namespace, version, substring, arch) - local search_err - - if all then - local results = search.search_repos(query) - local has_result = false - local all_ok = true - local any_err = "" - for name, result in pairs(results) do -- luacheck: ignore 422 - for version, items in pairs(result) do -- luacheck: ignore 422 - for _, item in ipairs(items) do - -- Ignore provided rocks. - if item.arch ~= "installed" then - has_result = true - local filename = path.make_url(item.repo, name, version, item.arch) - local ok, err = get_file(filename) - if not ok then - all_ok = false - any_err = any_err .. "\n" .. err - end - end - end - end - end - - if has_result then - return all_ok, any_err - end - else - local url - url, search_err = search.find_rock_checking_lua_versions(query, check_lua_versions) - if url then - return get_file(url) - end - end - local rock = util.format_rock_name(name, namespace, version) - return nil, "Could not find a result named "..rock..(search_err and ": "..search_err or ".") -end - -return download diff --git a/.luarocks/share/lua/5.1/luarocks/fetch.lua b/.luarocks/share/lua/5.1/luarocks/fetch.lua deleted file mode 100644 index 90e7c79ec..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch.lua +++ /dev/null @@ -1,537 +0,0 @@ - ---- Functions related to fetching and loading local and remote files. -local fetch = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local rockspecs = require("luarocks.rockspecs") -local signing = require("luarocks.signing") -local persist = require("luarocks.persist") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") - - ---- Fetch a local or remote file, using a local cache directory. --- Make a remote or local URL/pathname local, fetching the file if necessary. --- Other "fetch" and "load" functions use this function to obtain files. --- If a local pathname is given, it is returned as a result. --- @param url string: a local pathname or a remote URL. --- @param mirroring string: mirroring mode. --- If set to "no_mirror", then rocks_servers mirror configuration is not used. --- @return (string, nil, nil, boolean) or (nil, string, [string]): --- in case of success: --- * the absolute local pathname for the fetched file --- * nil --- * nil --- * `true` if the file was fetched from cache --- in case of failure: --- * nil --- * an error message --- * an optional error code. -function fetch.fetch_caching(url, mirroring) - local repo_url, filename = url:match("^(.*)/([^/]+)$") - local name = repo_url:gsub("[/:]","_") - local cache_dir = dir.path(cfg.local_cache, name) - local ok = fs.make_dir(cache_dir) - if not ok then - cfg.local_cache = fs.make_temp_dir("local_cache") - cache_dir = dir.path(cfg.local_cache, name) - ok = fs.make_dir(cache_dir) - if not ok then - return nil, "Failed creating temporary cache directory "..cache_dir - end - end - - local cachefile = dir.path(cache_dir, filename) - if cfg.aggressive_cache and (not name:match("^manifest")) and fs.exists(cachefile) then - return cachefile, nil, nil, true - end - - local file, err, errcode, from_cache = fetch.fetch_url(url, cachefile, true, mirroring) - if not file then - return nil, err or "Failed downloading "..url, errcode - end - return file, nil, nil, from_cache -end - -local function ensure_trailing_slash(url) - return (url:gsub("/*$", "/")) -end - -local function is_url_relative_to_rocks_servers(url, servers) - for _, item in ipairs(servers) do - if type(item) == "table" then - for i, s in ipairs(item) do - local base = ensure_trailing_slash(s) - if string.find(url, base, 1, true) == 1 then - return i, url:sub(#base + 1), item - end - end - end - end -end - -local function download_with_mirrors(url, filename, cache, servers) - local idx, rest, mirrors = is_url_relative_to_rocks_servers(url, servers) - - if not idx then - -- URL is not from a rock server - return fs.download(url, filename, cache) - end - - -- URL is from a rock server: try to download it falling back to mirrors. - local err = "\n" - for i = idx, #mirrors do - local try_url = ensure_trailing_slash(mirrors[i]) .. rest - if i > idx then - util.warning("Failed downloading. Attempting mirror at " .. try_url) - end - local ok, name, from_cache = fs.download(try_url, filename, cache) - if ok then - return ok, name, from_cache - else - err = err .. name .. "\n" - end - end - - return nil, err -end - ---- Fetch a local or remote file. --- Make a remote or local URL/pathname local, fetching the file if necessary. --- Other "fetch" and "load" functions use this function to obtain files. --- If a local pathname is given, it is returned as a result. --- @param url string: a local pathname or a remote URL. --- @param filename string or nil: this function attempts to detect the --- resulting local filename of the remote file as the basename of the URL; --- if that is not correct (due to a redirection, for example), the local --- filename can be given explicitly as this second argument. --- @param cache boolean: compare remote timestamps via HTTP HEAD prior to --- re-downloading the file. --- @param mirroring string: mirroring mode. --- If set to "no_mirror", then rocks_servers mirror configuration is not used. --- @return (string, nil, nil, boolean) or (nil, string, [string]): --- in case of success: --- * the absolute local pathname for the fetched file --- * nil --- * nil --- * `true` if the file was fetched from cache --- in case of failure: --- * nil --- * an error message --- * an optional error code. -function fetch.fetch_url(url, filename, cache, mirroring) - assert(type(url) == "string") - assert(type(filename) == "string" or not filename) - - local protocol, pathname = dir.split_url(url) - if protocol == "file" then - local fullname = dir.normalize(fs.absolute_name(pathname)) - if not fs.exists(fullname) then - local hint = (not pathname:match("^/")) - and (" - note that given path in rockspec is not absolute: " .. url) - or "" - return nil, "Local file not found: " .. fullname .. hint - end - filename = filename or dir.base_name(pathname) - local dstname = dir.normalize(fs.absolute_name(dir.path(".", filename))) - local ok, err - if fullname == dstname then - ok = true - else - ok, err = fs.copy(fullname, dstname) - end - if ok then - return dstname - else - return nil, "Failed copying local file " .. fullname .. " to " .. dstname .. ": " .. err - end - elseif dir.is_basic_protocol(protocol) then - local ok, name, from_cache - if mirroring ~= "no_mirror" then - ok, name, from_cache = download_with_mirrors(url, filename, cache, cfg.rocks_servers) - else - ok, name, from_cache = fs.download(url, filename, cache) - end - if not ok then - return nil, "Failed downloading "..url..(name and " - "..name or ""), "network" - end - return name, nil, nil, from_cache - else - return nil, "Unsupported protocol "..protocol - end -end - ---- For remote URLs, create a temporary directory and download URL inside it. --- This temporary directory will be deleted on program termination. --- For local URLs, just return the local pathname and its directory. --- @param url string: URL to be downloaded --- @param tmpname string: name pattern to use for avoiding conflicts --- when creating temporary directory. --- @param filename string or nil: local filename of URL to be downloaded, --- in case it can't be inferred from the URL. --- @return (string, string) or (nil, string, [string]): absolute local pathname of --- the fetched file and temporary directory name; or nil and an error message --- followed by an optional error code -function fetch.fetch_url_at_temp_dir(url, tmpname, filename, cache) - assert(type(url) == "string") - assert(type(tmpname) == "string") - assert(type(filename) == "string" or not filename) - filename = filename or dir.base_name(url) - - local protocol, pathname = dir.split_url(url) - if protocol == "file" then - if fs.exists(pathname) then - return pathname, dir.dir_name(fs.absolute_name(pathname)) - else - return nil, "File not found: "..pathname - end - else - local temp_dir, err = fs.make_temp_dir(tmpname) - if not temp_dir then - return nil, "Failed creating temporary directory "..tmpname..": "..err - end - util.schedule_function(fs.delete, temp_dir) - local ok, err = fs.change_dir(temp_dir) - if not ok then return nil, err end - - local file, err, errcode - - if cache then - local cachefile - cachefile, err, errcode = fetch.fetch_caching(url) - - if cachefile then - file = dir.path(temp_dir, filename) - fs.copy(cachefile, file) - end - else - file, err, errcode = fetch.fetch_url(url, filename, cache) - end - - fs.pop_dir() - if not file then - return nil, "Error fetching file: "..err, errcode - end - - return file, temp_dir - end -end - --- Determine base directory of a fetched URL by extracting its --- archive and looking for a directory in the root. --- @param file string: absolute local pathname of the fetched file --- @param temp_dir string: temporary directory in which URL was fetched. --- @param src_url string: URL to use when inferring base directory. --- @param src_dir string or nil: expected base directory (inferred --- from src_url if not given). --- @return (string, string) or (string, nil) or (nil, string): --- The inferred base directory and the one actually found (which may --- be nil if not found), or nil followed by an error message. --- The inferred dir is returned first to avoid confusion with errors, --- because it is never nil. -function fetch.find_base_dir(file, temp_dir, src_url, src_dir) - local ok, err = fs.change_dir(temp_dir) - if not ok then return nil, err end - fs.unpack_archive(file) - local inferred_dir = src_dir or dir.deduce_base_dir(src_url) - local found_dir = nil - if fs.exists(inferred_dir) then - found_dir = inferred_dir - else - util.printerr("Directory "..inferred_dir.." not found") - local files = fs.list_dir() - if files then - table.sort(files) - for i,filename in ipairs(files) do - if fs.is_dir(filename) then - util.printerr("Found "..filename) - found_dir = filename - break - end - end - end - end - fs.pop_dir() - return inferred_dir, found_dir -end - -local function fetch_and_verify_signature_for(url, filename, tmpdir) - local sig_url = signing.signature_url(url) - local sig_file, err, errcode = fetch.fetch_url_at_temp_dir(sig_url, tmpdir) - if not sig_file then - return nil, "Could not fetch signature file for verification: " .. err, errcode - end - - local ok, err = signing.verify_signature(filename, sig_file) - if not ok then - return nil, "Failed signature verification: " .. err - end - - return fs.absolute_name(sig_file) -end - ---- Obtain a rock and unpack it. --- If a directory is not given, a temporary directory will be created, --- which will be deleted on program termination. --- @param rock_file string: URL or filename of the rock. --- @param dest string or nil: if given, directory will be used as --- a permanent destination. --- @param verify boolean: if true, download and verify signature for rockspec --- @return string or (nil, string, [string]): the directory containing the contents --- of the unpacked rock. -function fetch.fetch_and_unpack_rock(url, dest, verify) - assert(type(url) == "string") - assert(type(dest) == "string" or not dest) - - local name = dir.base_name(url):match("(.*)%.[^.]*%.rock") - local tmpname = "luarocks-rock-" .. name - - local rock_file, err, errcode = fetch.fetch_url_at_temp_dir(url, tmpname, nil, true) - if not rock_file then - return nil, "Could not fetch rock file: " .. err, errcode - end - - local sig_file - if verify then - sig_file, err = fetch_and_verify_signature_for(url, rock_file, tmpname) - if err then - return nil, err - end - end - - rock_file = fs.absolute_name(rock_file) - - local unpack_dir - if dest then - unpack_dir = dest - local ok, err = fs.make_dir(unpack_dir) - if not ok then - return nil, "Failed unpacking rock file: " .. err - end - else - unpack_dir, err = fs.make_temp_dir(name) - if not unpack_dir then - return nil, "Failed creating temporary dir: " .. err - end - end - if not dest then - util.schedule_function(fs.delete, unpack_dir) - end - local ok, err = fs.change_dir(unpack_dir) - if not ok then return nil, err end - ok, err = fs.unzip(rock_file) - if not ok then - return nil, "Failed unpacking rock file: " .. rock_file .. ": " .. err - end - if sig_file then - ok, err = fs.copy(sig_file, ".") - if not ok then - return nil, "Failed copying signature file" - end - end - fs.pop_dir() - return unpack_dir -end - ---- Back-end function that actually loads the local rockspec. --- Performs some validation and postprocessing of the rockspec contents. --- @param rel_filename string: The local filename of the rockspec file. --- @param quick boolean: if true, skips some steps when loading --- rockspec. --- @return table or (nil, string): A table representing the rockspec --- or nil followed by an error message. -function fetch.load_local_rockspec(rel_filename, quick) - assert(type(rel_filename) == "string") - local abs_filename = fs.absolute_name(rel_filename) - - local basename = dir.base_name(abs_filename) - if basename ~= "rockspec" then - if not basename:match("(.*)%-[^-]*%-[0-9]*") then - return nil, "Expected filename in format 'name-version-revision.rockspec'." - end - end - - local tbl, err = persist.load_into_table(abs_filename) - if not tbl then - return nil, "Could not load rockspec file "..abs_filename.." ("..err..")" - end - - local rockspec, err = rockspecs.from_persisted_table(abs_filename, tbl, err, quick) - if not rockspec then - return nil, abs_filename .. ": " .. err - end - - local name_version = rockspec.package:lower() .. "-" .. rockspec.version - if basename ~= "rockspec" and basename ~= name_version .. ".rockspec" then - return nil, "Inconsistency between rockspec filename ("..basename..") and its contents ("..name_version..".rockspec)." - end - - return rockspec -end - ---- Load a local or remote rockspec into a table. --- This is the entry point for the LuaRocks tools. --- Only the LuaRocks runtime loader should use --- load_local_rockspec directly. --- @param filename string: Local or remote filename of a rockspec. --- @param location string or nil: Where to download. If not given, --- a temporary dir is created. --- @param verify boolean: if true, download and verify signature for rockspec --- @return table or (nil, string, [string]): A table representing the rockspec --- or nil followed by an error message and optional error code. -function fetch.load_rockspec(url, location, verify) - assert(type(url) == "string") - - local name - local basename = dir.base_name(url) - if basename == "rockspec" then - name = "rockspec" - else - name = basename:match("(.*)%.rockspec") - if not name then - return nil, "Filename '"..url.."' does not look like a rockspec." - end - end - - local tmpname = "luarocks-rockspec-"..name - local filename, err, errcode - if location then - local ok, err = fs.change_dir(location) - if not ok then return nil, err end - filename, err = fetch.fetch_url(url) - fs.pop_dir() - else - filename, err, errcode = fetch.fetch_url_at_temp_dir(url, tmpname, nil, true) - end - if not filename then - return nil, err, errcode - end - - if verify then - local _, err = fetch_and_verify_signature_for(url, filename, tmpname) - if err then - return nil, err - end - end - - return fetch.load_local_rockspec(filename) -end - ---- Download sources for building a rock using the basic URL downloader. --- @param rockspec table: The rockspec table --- @param extract boolean: Whether to extract the sources from --- the fetched source tarball or not. --- @param dest_dir string or nil: If set, will extract to the given directory; --- if not given, will extract to a temporary directory. --- @return (string, string) or (nil, string, [string]): The absolute pathname of --- the fetched source tarball and the temporary directory created to --- store it; or nil and an error message and optional error code. -function fetch.get_sources(rockspec, extract, dest_dir) - assert(rockspec:type() == "rockspec") - assert(type(extract) == "boolean") - assert(type(dest_dir) == "string" or not dest_dir) - - local url = rockspec.source.url - local name = rockspec.name.."-"..rockspec.version - local filename = rockspec.source.file - local source_file, store_dir - local ok, err, errcode - if dest_dir then - 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() - store_dir = dest_dir - else - source_file, store_dir, errcode = fetch.fetch_url_at_temp_dir(url, "luarocks-source-"..name, filename) - end - if not source_file then - return nil, err or store_dir, errcode - end - if rockspec.source.md5 then - if not fs.check_md5(source_file, rockspec.source.md5) then - return nil, "MD5 check for "..filename.." has failed.", "md5" - end - end - if extract then - local ok, err = fs.change_dir(store_dir) - if not ok then return nil, err end - ok, err = fs.unpack_archive(rockspec.source.file) - if not ok then return nil, err end - if not fs.exists(rockspec.source.dir) then - - -- If rockspec.source.dir can't be found, see if we only have one - -- directory in store_dir. If that's the case, assume it's what - -- we're looking for. - -- We only do this if the rockspec source.dir was not set, and only - -- with rockspecs newer than 3.0. - local file_count, found_dir = 0 - - if not rockspec.source.dir_set and rockspec:format_is_at_least("3.0") then - for file in fs.dir() do - file_count = file_count + 1 - if fs.is_dir(file) then - found_dir = file - end - end - end - - if file_count == 1 and found_dir then - rockspec.source.dir = found_dir - else - return nil, "Directory "..rockspec.source.dir.." not found inside archive "..rockspec.source.file, "source.dir", source_file, store_dir - end - end - fs.pop_dir() - end - return source_file, store_dir -end - ---- Download sources for building a rock, calling the appropriate protocol method. --- @param rockspec table: The rockspec table --- @param extract boolean: When downloading compressed formats, whether to extract --- the sources from the fetched archive or not. --- @param dest_dir string or nil: If set, will extract to the given directory. --- if not given, will extract to a temporary 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 fetch.fetch_sources(rockspec, extract, dest_dir) - assert(rockspec:type() == "rockspec") - assert(type(extract) == "boolean") - assert(type(dest_dir) == "string" or not dest_dir) - - -- auto-convert git://github.com URLs to use git+https - -- see https://github.blog/2021-09-01-improving-git-protocol-security-github/ - if rockspec.source.url:match("^git://github%.com/") - or rockspec.source.url:match("^git://www%.github%.com/") then - rockspec.source.url = rockspec.source.url:gsub("^git://", "git+https://") - rockspec.source.protocol = "git+https" - end - - local protocol = rockspec.source.protocol - local ok, proto - if dir.is_basic_protocol(protocol) then - proto = fetch - else - ok, proto = pcall(require, "luarocks.fetch."..protocol:gsub("[+-]", "_")) - if not ok then - return nil, "Unknown protocol "..protocol - end - end - - if cfg.only_sources_from - and rockspec.source.pathname - and #rockspec.source.pathname > 0 then - if #cfg.only_sources_from == 0 then - return nil, "Can't download "..rockspec.source.url.." -- download from remote servers disabled" - elseif rockspec.source.pathname:find(cfg.only_sources_from, 1, true) ~= 1 then - return nil, "Can't download "..rockspec.source.url.." -- only downloading from "..cfg.only_sources_from - end - end - - return proto.get_sources(rockspec, extract, dest_dir) -end - -return fetch diff --git a/.luarocks/share/lua/5.1/luarocks/fetch/cvs.lua b/.luarocks/share/lua/5.1/luarocks/fetch/cvs.lua deleted file mode 100644 index d78e6e605..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/cvs.lua +++ /dev/null @@ -1,55 +0,0 @@ - ---- Fetch back-end for retrieving sources from CVS. -local cvs = {} - -local unpack = unpack or table.unpack - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local util = require("luarocks.util") - ---- Download sources for building a rock, using CVS. --- @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 cvs.get_sources(rockspec, extract, dest_dir) - assert(rockspec:type() == "rockspec") - 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 = {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) - end - local store_dir - if not dest_dir then - store_dir = fs.make_temp_dir(name_version) - if not store_dir then - return nil, "Failed creating temporary directory." - end - util.schedule_function(fs.delete, store_dir) - else - store_dir = dest_dir - end - local ok, err = fs.change_dir(store_dir) - if not ok then return nil, err end - if not fs.execute(unpack(command)) then - return nil, "Failed fetching files from CVS." - end - fs.pop_dir() - return module, store_dir -end - - -return cvs diff --git a/.luarocks/share/lua/5.1/luarocks/fetch/git.lua b/.luarocks/share/lua/5.1/luarocks/fetch/git.lua deleted file mode 100644 index 29892e927..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/git.lua +++ /dev/null @@ -1,165 +0,0 @@ - ---- Fetch back-end for retrieving sources from GIT. -local git = {} - -local unpack = unpack or table.unpack - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local vers = require("luarocks.core.vers") -local util = require("luarocks.util") - -local cached_git_version - ---- Get git version. --- @param git_cmd string: name of git command. --- @return table: git version as returned by luarocks.core.vers.parse_version. -local function git_version(git_cmd) - if not cached_git_version then - local version_line = io.popen(fs.Q(git_cmd)..' --version'):read() - local version_string = version_line:match('%d-%.%d+%.?%d*') - cached_git_version = vers.parse_version(version_string) - end - - return cached_git_version -end - ---- Check if git satisfies version requirement. --- @param git_cmd string: name of git command. --- @param version string: required version. --- @return boolean: true if git matches version or is newer, false otherwise. -local function git_is_at_least(git_cmd, version) - return git_version(git_cmd) >= vers.parse_version(version) -end - ---- Git >= 1.7.10 can clone a branch **or tag**, < 1.7.10 by branch only. We --- need to know this in order to build the appropriate command; if we can't --- clone by tag then we'll have to issue a subsequent command to check out the --- given tag. --- @param git_cmd string: name of git command. --- @return boolean: Whether Git can clone by tag. -local function git_can_clone_by_tag(git_cmd) - return git_is_at_least(git_cmd, "1.7.10") -end - ---- Git >= 1.8.4 can fetch submodules shallowly, saving bandwidth and time for --- submodules with large history. --- @param git_cmd string: name of git command. --- @return boolean: Whether Git can fetch submodules shallowly. -local function git_supports_shallow_submodules(git_cmd) - return git_is_at_least(git_cmd, "1.8.4") -end - ---- Git >= 2.10 can fetch submodules shallowly according to .gitmodules configuration, allowing more granularity. --- @param git_cmd string: name of git command. --- @return boolean: Whether Git can fetch submodules shallowly according to .gitmodules. -local function git_supports_shallow_recommendations(git_cmd) - return git_is_at_least(git_cmd, "2.10.0") -end - -local function git_identifier(git_cmd, ver) - if not (ver:match("^dev%-%d+$") or ver:match("^scm%-%d+$")) then - return nil - end - local pd = io.popen(fs.command_at(fs.current_dir(), fs.Q(git_cmd).." log --pretty=format:%ai_%h -n 1")) - if not pd then - return nil - end - local date_hash = pd:read("*l") - pd:close() - if not date_hash then - return nil - end - local date, time, tz, hash = date_hash:match("([^%s]+) ([^%s]+) ([^%s]+)_([^%s]+)") - date = date:gsub("%-", "") - time = time:gsub(":", "") - return date .. "." .. time .. "." .. hash -end - ---- Download sources for building a rock, using git. --- @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 git.get_sources(rockspec, extract, dest_dir, depth) - assert(rockspec:type() == "rockspec") - assert(type(dest_dir) == "string" or not dest_dir) - - local git_cmd = rockspec.variables.GIT - local name_version = rockspec.name .. "-" .. rockspec.version - local module = dir.base_name(rockspec.source.url) - -- 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) - if not store_dir then - return nil, "Failed creating temporary directory." - end - util.schedule_function(fs.delete, store_dir) - else - store_dir = dest_dir - end - store_dir = fs.absolute_name(store_dir) - local ok, err = fs.change_dir(store_dir) - if not ok then return nil, err end - - local command = {fs.Q(git_cmd), "clone", depth or "--depth=1", rockspec.source.url, module} - local tag_or_branch = rockspec.source.tag or rockspec.source.branch - -- If the tag or branch is explicitly set to "master" in the rockspec, then - -- we can avoid passing it to Git since it's the default. - if tag_or_branch == "master" then tag_or_branch = nil end - if tag_or_branch then - 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, 3, "--branch=" .. tag_or_branch) - end - end - if not fs.execute(unpack(command)) then - return nil, "Failed cloning git repository." - end - ok, err = fs.change_dir(module) - if not ok then return nil, err end - if tag_or_branch and not git_can_clone_by_tag() then - if not fs.execute(fs.Q(git_cmd), "checkout", tag_or_branch) then - return nil, 'Failed to check out the "' .. tag_or_branch ..'" tag or branch.' - end - end - - -- Fetching git submodules is supported only when rockspec format is >= 3.0. - if rockspec:format_is_at_least("3.0") then - command = {fs.Q(git_cmd), "submodule", "update", "--init", "--recursive"} - - if git_supports_shallow_recommendations(git_cmd) then - table.insert(command, 5, "--recommend-shallow") - elseif git_supports_shallow_submodules(git_cmd) then - -- Fetch only the last commit of each submodule. - table.insert(command, 5, "--depth=1") - end - - if not fs.execute(unpack(command)) then - return nil, 'Failed to fetch submodules.' - end - end - - if not rockspec.source.tag then - rockspec.source.identifier = git_identifier(git_cmd, rockspec.version) - end - - fs.delete(dir.path(store_dir, module, ".git")) - fs.delete(dir.path(store_dir, module, ".gitignore")) - fs.pop_dir() - fs.pop_dir() - return module, store_dir -end - -return git diff --git a/.luarocks/share/lua/5.1/luarocks/fetch/git_file.lua b/.luarocks/share/lua/5.1/luarocks/fetch/git_file.lua deleted file mode 100644 index 8d46bbca3..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/git_file.lua +++ /dev/null @@ -1,19 +0,0 @@ - ---- Fetch back-end for retrieving sources from local Git repositories. -local git_file = {} - -local git = require("luarocks.fetch.git") - ---- Fetch sources for building a rock from a local Git repository. --- @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 git_file.get_sources(rockspec, extract, dest_dir) - rockspec.source.url = rockspec.source.url:gsub("^git.file://", "") - return git.get_sources(rockspec, extract, dest_dir) -end - -return git_file diff --git a/.luarocks/share/lua/5.1/luarocks/fetch/git_http.lua b/.luarocks/share/lua/5.1/luarocks/fetch/git_http.lua deleted file mode 100644 index d85e2572d..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/git_http.lua +++ /dev/null @@ -1,26 +0,0 @@ - ---- Fetch back-end for retrieving sources from Git repositories --- that use http:// transport. For example, for fetching a repository --- that requires the following command line: --- `git clone http://example.com/foo.git` --- you can use this in the rockspec: --- source = { url = "git+http://example.com/foo.git" } --- Prefer using the normal git:// fetch mode as it is more widely --- available in older versions of LuaRocks. -local git_http = {} - -local git = require("luarocks.fetch.git") - ---- Fetch sources for building a rock from a local Git repository. --- @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 git_http.get_sources(rockspec, extract, dest_dir) - rockspec.source.url = rockspec.source.url:gsub("^git.", "") - return git.get_sources(rockspec, extract, dest_dir, "--") -end - -return git_http diff --git a/.luarocks/share/lua/5.1/luarocks/fetch/git_https.lua b/.luarocks/share/lua/5.1/luarocks/fetch/git_https.lua deleted file mode 100644 index 67f8ad6cc..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/git_https.lua +++ /dev/null @@ -1,7 +0,0 @@ ---- 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/share/lua/5.1/luarocks/fetch/git_ssh.lua b/.luarocks/share/lua/5.1/luarocks/fetch/git_ssh.lua deleted file mode 100644 index 0c2c0750f..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/git_ssh.lua +++ /dev/null @@ -1,32 +0,0 @@ ---- Fetch back-end for retrieving sources from Git repositories --- that use ssh:// transport. For example, for fetching a repository --- that requires the following command line: --- `git clone ssh://git@example.com/path/foo.git --- you can use this in the rockspec: --- source = { url = "git+ssh://git@example.com/path/foo.git" } --- It also handles scp-style ssh urls: git@example.com:path/foo.git, --- but you have to prepend the "git+ssh://" and why not use the "newer" --- style anyway? -local git_ssh = {} - -local git = require("luarocks.fetch.git") - ---- Fetch sources for building a rock from a local Git repository. --- @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 git_ssh.get_sources(rockspec, extract, dest_dir) - rockspec.source.url = rockspec.source.url:gsub("^git.", "") - - -- Handle old-style scp-like git ssh urls - if rockspec.source.url:match("^ssh://[^/]+:[^%d]") then - rockspec.source.url = rockspec.source.url:gsub("^ssh://", "") - end - - return git.get_sources(rockspec, extract, dest_dir, "--") -end - -return git_ssh diff --git a/.luarocks/share/lua/5.1/luarocks/fetch/hg.lua b/.luarocks/share/lua/5.1/luarocks/fetch/hg.lua deleted file mode 100644 index 0ef0f5e4a..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/hg.lua +++ /dev/null @@ -1,65 +0,0 @@ - ---- Fetch back-end for retrieving sources from HG. -local hg = {} - -local unpack = unpack or table.unpack - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local util = require("luarocks.util") - ---- Download sources for building a rock, using hg. --- @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.get_sources(rockspec, extract, dest_dir) - assert(rockspec:type() == "rockspec") - 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 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", tag_or_branch, url, module} - end - local store_dir - if not dest_dir then - store_dir = fs.make_temp_dir(name_version) - if not store_dir then - return nil, "Failed creating temporary directory." - end - util.schedule_function(fs.delete, store_dir) - else - store_dir = dest_dir - end - local ok, err = fs.change_dir(store_dir) - if not ok then return nil, err end - if not fs.execute(unpack(command)) then - return nil, "Failed cloning hg repository." - end - ok, err = fs.change_dir(module) - if not ok then return nil, err end - - fs.delete(dir.path(store_dir, module, ".hg")) - fs.delete(dir.path(store_dir, module, ".hgignore")) - fs.pop_dir() - fs.pop_dir() - return module, store_dir -end - - -return hg diff --git a/.luarocks/share/lua/5.1/luarocks/fetch/hg_http.lua b/.luarocks/share/lua/5.1/luarocks/fetch/hg_http.lua deleted file mode 100644 index 8f506daff..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/hg_http.lua +++ /dev/null @@ -1,24 +0,0 @@ - ---- 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/share/lua/5.1/luarocks/fetch/hg_https.lua b/.luarocks/share/lua/5.1/luarocks/fetch/hg_https.lua deleted file mode 100644 index e67417fe8..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/hg_https.lua +++ /dev/null @@ -1,8 +0,0 @@ - ---- 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/share/lua/5.1/luarocks/fetch/hg_ssh.lua b/.luarocks/share/lua/5.1/luarocks/fetch/hg_ssh.lua deleted file mode 100644 index 0c365fabe..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/hg_ssh.lua +++ /dev/null @@ -1,8 +0,0 @@ - ---- 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/share/lua/5.1/luarocks/fetch/sscm.lua b/.luarocks/share/lua/5.1/luarocks/fetch/sscm.lua deleted file mode 100644 index 32bb2eccf..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/sscm.lua +++ /dev/null @@ -1,44 +0,0 @@ - ---- Fetch back-end for retrieving sources from Surround SCM Server -local sscm = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") - ---- Download sources via Surround SCM Server for building a rock. --- @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 sscm.get_sources(rockspec, extract, dest_dir) - assert(rockspec:type() == "rockspec") - assert(type(dest_dir) == "string" or not dest_dir) - - local sscm_cmd = rockspec.variables.SSCM - local module = rockspec.source.module or dir.base_name(rockspec.source.url) - local branch, repository = string.match(rockspec.source.pathname, "^([^/]*)/(.*)") - if not branch or not repository then - return nil, "Error retrieving branch and repository from rockspec." - end - -- Search for working directory. - local working_dir - local tmp = io.popen(string.format(sscm_cmd..[[ property "/" -d -b%s -p%s]], branch, repository)) - for line in tmp:lines() do - --%c because a chr(13) comes in the end. - working_dir = string.match(line, "Working directory:[%s]*(.*)%c$") - if working_dir then break end - end - tmp:close() - if not working_dir then - return nil, "Error retrieving working directory from SSCM." - end - if not fs.execute(sscm_cmd, "get", "*", "-e" , "-r", "-b"..branch, "-p"..repository, "-tmodify", "-wreplace") then - return nil, "Failed fetching files from SSCM." - end - -- FIXME: This function does not honor the dest_dir parameter. - return module, working_dir -end - -return sscm diff --git a/.luarocks/share/lua/5.1/luarocks/fetch/svn.lua b/.luarocks/share/lua/5.1/luarocks/fetch/svn.lua deleted file mode 100644 index b6618afcf..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fetch/svn.lua +++ /dev/null @@ -1,64 +0,0 @@ - ---- Fetch back-end for retrieving sources from Subversion. -local svn = {} - -local unpack = unpack or table.unpack - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local util = require("luarocks.util") - ---- Download sources for building a rock, using Subversion. --- @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 svn.get_sources(rockspec, extract, dest_dir) - assert(rockspec:type() == "rockspec") - 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, "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://", "") - local command = {svn_cmd, "checkout", url, module} - if rockspec.source.tag then - table.insert(command, 5, "-r") - table.insert(command, 6, rockspec.source.tag) - end - local store_dir - if not dest_dir then - store_dir = fs.make_temp_dir(name_version) - if not store_dir then - return nil, "Failed creating temporary directory." - end - util.schedule_function(fs.delete, store_dir) - else - store_dir = dest_dir - end - local ok, err = fs.change_dir(store_dir) - if not ok then return nil, err end - if not fs.execute(unpack(command)) then - return nil, "Failed fetching files from Subversion." - end - ok, err = fs.change_dir(module) - if not ok then return nil, err end - for _, d in ipairs(fs.find(".")) do - if dir.base_name(d) == ".svn" then - fs.delete(dir.path(store_dir, module, d)) - end - end - fs.pop_dir() - fs.pop_dir() - return module, store_dir -end - - -return svn diff --git a/.luarocks/share/lua/5.1/luarocks/fs.lua b/.luarocks/share/lua/5.1/luarocks/fs.lua deleted file mode 100644 index ecfc5a286..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs.lua +++ /dev/null @@ -1,140 +0,0 @@ - ---- Proxy module for filesystem and platform abstractions. --- All code using "fs" code should require "luarocks.fs", --- and not the various platform-specific implementations. --- However, see the documentation of the implementation --- for the API reference. - -local pairs = pairs - -local fs = {} --- To avoid a loop when loading the other fs modules. -package.loaded["luarocks.fs"] = fs - -local cfg = require("luarocks.core.cfg") - -local pack = table.pack or function(...) return { n = select("#", ...), ... } end -local unpack = table.unpack or unpack - -math.randomseed(os.time()) - -local fs_is_verbose = false - -do - local old_popen, old_execute - - -- patch io.popen and os.execute to display commands in verbose mode - function fs.verbose() - fs_is_verbose = true - - if old_popen or old_execute then return end - old_popen = io.popen - -- luacheck: push globals io os - io.popen = function(one, two) - if two == nil then - print("\nio.popen: ", one) - else - print("\nio.popen: ", one, "Mode:", two) - end - return old_popen(one, two) - end - - old_execute = os.execute - os.execute = function(cmd) - -- redact api keys if present - print("\nos.execute: ", (cmd:gsub("(/api/[^/]+/)([^/]+)/", function(cap, key) return cap.."/" end)) ) - local code = pack(old_execute(cmd)) - print("Results: "..tostring(code.n)) - for i = 1,code.n do - print(" "..tostring(i).." ("..type(code[i]).."): "..tostring(code[i])) - end - return unpack(code, 1, code.n) - end - -- luacheck: pop - end -end - -do - local function load_fns(fs_table, inits) - for name, fn in pairs(fs_table) do - if name ~= "init" and not fs[name] then - fs[name] = function(...) - if fs_is_verbose then - local args = pack(...) - for i=1, args.n do - local arg = args[i] - local pok, v = pcall(string.format, "%q", arg) - args[i] = pok and v or tostring(arg) - end - print("fs." .. name .. "(" .. table.concat(args, ", ") .. ")") - end - return fn(...) - end - end - end - if fs_table.init then - table.insert(inits, fs_table.init) - end - end - - local function load_platform_fns(patt, inits) - local each_platform = cfg.each_platform - - -- FIXME A quick hack for the experimental Windows build - if os.getenv("LUAROCKS_CROSS_COMPILING") then - each_platform = function() - local i = 0 - local plats = { "linux", "unix" } - return function() - i = i + 1 - return plats[i] - end - end - end - - for platform in each_platform("most-specific-first") do - local ok, fs_plat = pcall(require, patt:format(platform)) - if ok and fs_plat then - load_fns(fs_plat, inits) - end - end - end - - function fs.init() - local inits = {} - - if fs.current_dir then - -- unload luarocks fs so it can be reloaded using all modules - -- providing extra functionality in the current package paths - for k, _ in pairs(fs) do - if k ~= "init" and k ~= "verbose" then - fs[k] = nil - end - end - for m, _ in pairs(package.loaded) do - if m:match("luarocks%.fs%.") then - package.loaded[m] = nil - end - end - end - - -- Load platform-specific functions - load_platform_fns("luarocks.fs.%s", inits) - - -- Load platform-independent pure-Lua functionality - load_fns(require("luarocks.fs.lua"), inits) - - -- Load platform-specific fallbacks for missing Lua modules - load_platform_fns("luarocks.fs.%s.tools", inits) - - -- Load platform-independent external tool functionality - load_fns(require("luarocks.fs.tools"), inits) - - -- Run platform-specific initializations after everything is loaded - for _, init in ipairs(inits) do - init() - end - end -end - -return fs diff --git a/.luarocks/share/lua/5.1/luarocks/fs/linux.lua b/.luarocks/share/lua/5.1/luarocks/fs/linux.lua deleted file mode 100644 index c1b057c23..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs/linux.lua +++ /dev/null @@ -1,50 +0,0 @@ ---- Linux-specific implementation of filesystem and platform abstractions. -local linux = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") - -function linux.is_dir(file) - file = fs.absolute_name(file) - file = dir.normalize(file) .. "/." - local fd, _, code = io.open(file, "r") - if code == 2 then -- "No such file or directory" - return false - end - if code == 20 then -- "Not a directory", regardless of permissions - return false - end - if code == 13 then -- "Permission denied", but is a directory - return true - end - if fd then - local _, _, ecode = fd:read(1) - fd:close() - if ecode == 21 then -- "Is a directory" - return true - end - end - return false -end - -function linux.is_file(file) - file = fs.absolute_name(file) - if fs.is_dir(file) then - return false - end - file = dir.normalize(file) - local fd, _, code = io.open(file, "r") - if code == 2 then -- "No such file or directory" - return false - end - if code == 13 then -- "Permission denied", but it exists - return true - end - if fd then - fd:close() - return true - end - return false -end - -return linux diff --git a/.luarocks/share/lua/5.1/luarocks/fs/lua.lua b/.luarocks/share/lua/5.1/luarocks/fs/lua.lua deleted file mode 100644 index 145a60de1..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs/lua.lua +++ /dev/null @@ -1,1226 +0,0 @@ - ---- Native Lua implementation of filesystem and platform abstractions, --- using LuaFileSystem, LuaSocket, LuaSec, lua-zlib, LuaPosix, MD5. --- module("luarocks.fs.lua") -local fs_lua = {} - -local fs = require("luarocks.fs") - -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.dir") -local util = require("luarocks.util") - -local pack = table.pack or function(...) return { n = select("#", ...), ... } end - -local socket_ok, zip_ok, lfs_ok, md5_ok, posix_ok, bz2_ok, _ -local http, ftp, zip, lfs, md5, posix, bz2 - -if cfg.fs_use_modules then - socket_ok, http = pcall(require, "socket.http") - _, ftp = pcall(require, "socket.ftp") - zip_ok, zip = pcall(require, "luarocks.tools.zip") - bz2_ok, bz2 = pcall(require, "bz2") - lfs_ok, lfs = pcall(require, "lfs") - md5_ok, md5 = pcall(require, "md5") - posix_ok, posix = pcall(require, "posix") -end - -local patch = require("luarocks.tools.patch") -local tar = require("luarocks.tools.tar") - -local dir_stack = {} - ---- Test is file/dir is writable. --- Warning: testing if a file/dir is writable does not guarantee --- that it will remain writable and therefore it is no replacement --- for checking the result of subsequent operations. --- @param file string: filename to test --- @return boolean: true if file exists, false otherwise. -function fs_lua.is_writable(file) - assert(file) - file = dir.normalize(file) - local result - if fs.is_dir(file) then - local file2 = dir.path(file, '.tmpluarockstestwritable') - local fh = io.open(file2, 'wb') - result = fh ~= nil - if fh then fh:close() end - os.remove(file2) - else - local fh = io.open(file, 'r+b') - result = fh ~= nil - if fh then fh:close() end - end - return result -end - -local function quote_args(command, ...) - local out = { command } - local args = pack(...) - for i=1, args.n do - local arg = args[i] - assert(type(arg) == "string") - out[#out+1] = fs.Q(arg) - end - return table.concat(out, " ") -end - ---- Run the given command, quoting its arguments. --- The command is executed in the current directory in the dir stack. --- @param command string: The command to be executed. No quoting/escaping --- is applied. --- @param ... Strings containing additional arguments, which are quoted. --- @return boolean: true if command succeeds (status code 0), false --- otherwise. -function fs_lua.execute(command, ...) - assert(type(command) == "string") - return fs.execute_string(quote_args(command, ...)) -end - ---- Run the given command, quoting its arguments, silencing its output. --- The command is executed in the current directory in the dir stack. --- Silencing is omitted if 'verbose' mode is enabled. --- @param command string: The command to be executed. No quoting/escaping --- is applied. --- @param ... Strings containing additional arguments, which will be quoted. --- @return boolean: true if command succeeds (status code 0), false --- otherwise. -function fs_lua.execute_quiet(command, ...) - assert(type(command) == "string") - if cfg.verbose then -- omit silencing output - return fs.execute_string(quote_args(command, ...)) - else - return fs.execute_string(fs.quiet(quote_args(command, ...))) - end -end - -function fs.execute_env(env, command, ...) - assert(type(command) == "string") - local envstr = {} - for var, val in pairs(env) do - table.insert(envstr, fs.export_cmd(var, val)) - end - return fs.execute_string(table.concat(envstr, "\n") .. "\n" .. quote_args(command, ...)) -end - -local tool_available_cache = {} - -function fs_lua.set_tool_available(tool_name, value) - assert(type(value) == "boolean") - tool_available_cache[tool_name] = value -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) -function fs_lua.is_tool_available(tool_cmd, tool_name) - assert(type(tool_cmd) == "string") - assert(type(tool_name) == "string") - - local ok - if tool_available_cache[tool_name] ~= nil then - ok = tool_available_cache[tool_name] - else - local tool_cmd_no_args = tool_cmd:gsub(" [^\"]*$", "") - - -- if it looks like the tool has a pathname, try that first - if tool_cmd_no_args:match("[/\\]") then - local fd = io.open(tool_cmd_no_args, "r") - if fd then - fd:close() - ok = true - end - end - - if not ok then - ok = fs.search_in_path(tool_cmd_no_args) - end - - tool_available_cache[tool_name] = (ok == true) - end - - if ok then - return true - else - 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 '%s')" - return nil, msg:format(tool_cmd, tool_name, tool_name:upper(), cfg.config_files.nearest) - 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. --- @return boolean: true if the MD5 checksum for 'file' equals 'md5sum', false + msg if not --- or if it could not perform the check for any reason. -function fs_lua.check_md5(file, md5sum) - file = dir.normalize(file) - local computed, msg = fs.get_md5(file) - if not computed then - return false, msg - end - if computed:match("^"..md5sum) then - return true - else - return false, "Mismatch MD5 hash for file "..file - end -end - ---- List the contents of a directory. --- @param at string or nil: directory to list (will be the current --- directory if none is given). --- @return table: an array of strings with the filenames representing --- the contents of a directory. -function fs_lua.list_dir(at) - local result = {} - for file in fs.dir(at) do - result[#result+1] = file - end - return result -end - ---- Iterate over the contents of a directory. --- @param at string or nil: directory to list (will be the current --- directory if none is given). --- @return function: an iterator function suitable for use with --- the for statement. -function fs_lua.dir(at) - if not at then - at = fs.current_dir() - end - at = dir.normalize(at) - if not fs.is_dir(at) then - return function() end - end - return coroutine.wrap(function() fs.dir_iterator(at) end) -end - ---- List the Lua modules at a specific require path. --- eg. `modules("luarocks.cmd")` would return a list of all LuaRocks command --- modules, in the current Lua path. -function fs_lua.modules(at) - at = at or "" - if #at > 0 then - -- turn require path into file path - at = at:gsub("%.", package.config:sub(1,1)) .. package.config:sub(1,1) - end - - local path = package.path:sub(-1, -1) == ";" and package.path or package.path .. ";" - local paths = {} - for location in path:gmatch("(.-);") do - if location:lower() == "?.lua" then - location = "./?.lua" - end - local _, q_count = location:gsub("%?", "") -- only use the ones with a single '?' - if location:match("%?%.[lL][uU][aA]$") and q_count == 1 then -- only use when ending with "?.lua" - location = location:gsub("%?%.[lL][uU][aA]$", at) - table.insert(paths, location) - end - end - - if #paths == 0 then - return {} - end - - local modules = {} - local is_duplicate = {} - for _, path in ipairs(paths) do -- luacheck: ignore 421 - local files = fs.list_dir(path) - for _, filename in ipairs(files or {}) do - if filename:match("%.[lL][uU][aA]$") then - filename = filename:sub(1,-5) -- drop the extension - if not is_duplicate[filename] then - is_duplicate[filename] = true - table.insert(modules, filename) - end - end - end - end - - return modules -end - -function fs_lua.filter_file(fn, input_filename, output_filename) - local fd, err = io.open(input_filename, "rb") - if not fd then - return nil, err - end - - local input, err = fd:read("*a") - fd:close() - if not input then - return nil, err - end - - local output, err = fn(input) - if not output then - return nil, err - end - - fd, err = io.open(output_filename, "wb") - if not fd then - return nil, err - end - - local ok, err = fd:write(output) - fd:close() - if not ok then - return nil, err - end - - return true -end - -function fs_lua.system_temp_dir() - return os.getenv("TMPDIR") or os.getenv("TEMP") or "/tmp" -end - ---------------------------------------------------------------------- --- LuaFileSystem functions ---------------------------------------------------------------------- - -if lfs_ok then - ---- Run the given command. --- The command is executed in the current directory in the dir stack. --- @param cmd string: No quoting/escaping is applied to the command. --- @return boolean: true if command succeeds (status code 0), false --- otherwise. -function fs_lua.execute_string(cmd) - local code = os.execute(cmd) - return (code == 0 or code == true) -end - ---- Obtain current directory. --- Uses the module's internal dir stack. --- @return string: the absolute pathname of the current directory. -function fs_lua.current_dir() - return lfs.currentdir() -end - ---- Change the current directory. --- Uses the module's internal dir stack. This does not have exact --- semantics of chdir, as it does not handle errors the same way, --- but works well for our purposes for now. --- @param d string: The directory to switch to. -function fs_lua.change_dir(d) - table.insert(dir_stack, lfs.currentdir()) - d = dir.normalize(d) - return lfs.chdir(d) -end - ---- Change directory to root. --- Allows leaving a directory (e.g. for deleting it) in --- a crossplatform way. -function fs_lua.change_dir_to_root() - 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. --- @return true if a pop occurred, false if the stack was empty. -function fs_lua.pop_dir() - local d = table.remove(dir_stack) - if d then - lfs.chdir(d) - return true - else - return false - end -end - ---- Create a directory if it does not already exist. --- If any of the higher levels in the path name do not exist --- too, they are created as well. --- @param directory string: pathname of directory to create. --- @return boolean or (boolean, string): true on success or (false, error message) on failure. -function fs_lua.make_dir(directory) - assert(type(directory) == "string") - directory = dir.normalize(directory) - local path = nil - if directory:sub(2, 2) == ":" then - path = directory:sub(1, 2) - directory = directory:sub(4) - else - if directory:match("^/") then - path = "" - end - end - for d in directory:gmatch("([^/]+)/*") do - path = path and path .. "/" .. d or d - local mode = lfs.attributes(path, "mode") - if not mode then - local ok, err = lfs.mkdir(path) - if not ok then - return false, err - end - ok, err = fs.set_permissions(path, "exec", "all") - if not ok then - return false, err - end - elseif mode ~= "directory" then - return false, path.." is not a directory" - end - end - return true -end - ---- Remove a directory if it is empty. --- Does not return errors (for example, if directory is not empty or --- if already does not exist) --- @param d string: pathname of directory to remove. -function fs_lua.remove_dir_if_empty(d) - assert(d) - d = dir.normalize(d) - lfs.rmdir(d) -end - ---- Remove a directory if it is empty. --- Does not return errors (for example, if directory is not empty or --- if already does not exist) --- @param d string: pathname of directory to remove. -function fs_lua.remove_dir_tree_if_empty(d) - assert(d) - d = dir.normalize(d) - for i=1,10 do - lfs.rmdir(d) - d = dir.dir_name(d) - end -end - -local function are_the_same_file(f1, f2) - if f1 == f2 then - return true - end - if cfg.is_platform("unix") then - local i1 = lfs.attributes(f1, "ino") - local i2 = lfs.attributes(f2, "ino") - if i1 ~= nil and i1 == i2 then - return true - end - end - return false -end - ---- Copy a file. --- @param src string: Pathname of source --- @param dest string: Pathname of destination --- @param perms string ("read" or "exec") or nil: Permissions for destination --- file or nil to use the source file permissions --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message. -function fs_lua.copy(src, dest, perms) - assert(src and dest) - src = dir.normalize(src) - dest = dir.normalize(dest) - local destmode = lfs.attributes(dest, "mode") - if destmode == "directory" then - dest = dir.path(dest, dir.base_name(src)) - end - if are_the_same_file(src, dest) then - return nil, "The source and destination are the same files" - end - local src_h, err = io.open(src, "rb") - if not src_h then return nil, err end - local dest_h, err = io.open(dest, "w+b") - if not dest_h then src_h:close() return nil, err end - while true do - local block = src_h:read(8192) - if not block then break end - dest_h:write(block) - end - src_h:close() - dest_h:close() - - local fullattrs - if not perms then - fullattrs = lfs.attributes(src, "permissions") - end - if fullattrs and posix_ok then - return posix.chmod(dest, fullattrs) - else - if not perms then - perms = fullattrs:match("x") and "exec" or "read" - end - return fs.set_permissions(dest, perms, "all") - end -end - ---- Implementation function for recursive copy of directory contents. --- Assumes paths are normalized. --- @param src string: Pathname of source --- @param dest string: Pathname of destination --- @param perms string ("read" or "exec") or nil: Optional permissions. --- If not given, permissions of the source are copied over to the destination. --- @return boolean or (boolean, string): true on success, false on failure -local function recursive_copy(src, dest, perms) - local srcmode = lfs.attributes(src, "mode") - - if srcmode == "file" then - local ok = fs.copy(src, dest, perms) - if not ok then return false end - elseif srcmode == "directory" then - local subdir = dir.path(dest, dir.base_name(src)) - local ok, err = fs.make_dir(subdir) - if not ok then return nil, err end - if pcall(lfs.dir, src) == false then - return false - end - for file in lfs.dir(src) do - if file ~= "." and file ~= ".." then - local ok = recursive_copy(dir.path(src, file), subdir, perms) - if not ok then return false end - end - end - end - return true -end - ---- Recursively copy the contents of a directory. --- @param src string: Pathname of source --- @param dest string: Pathname of destination --- @param perms string ("read" or "exec") or nil: Optional permissions. --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message. -function fs_lua.copy_contents(src, dest, perms) - assert(src and dest) - src = dir.normalize(src) - dest = dir.normalize(dest) - if not fs.is_dir(src) then - return false, src .. " is not a directory" - end - if pcall(lfs.dir, src) == false then - return false, "Permission denied" - end - for file in lfs.dir(src) do - if file ~= "." and file ~= ".." then - local ok = recursive_copy(dir.path(src, file), dest, perms) - if not ok then - return false, "Failed copying "..src.." to "..dest - end - end - end - return true -end - ---- Implementation function for recursive removal of directories. --- Assumes paths are normalized. --- @param name string: Pathname of file --- @return boolean or (boolean, string): true on success, --- or nil and an error message on failure. -local function recursive_delete(name) - local ok = os.remove(name) - if ok then return true end - local pok, ok, err = pcall(function() - for file in lfs.dir(name) do - if file ~= "." and file ~= ".." then - local ok, err = recursive_delete(dir.path(name, file)) - if not ok then return nil, err end - end - end - local ok, err = lfs.rmdir(name) - return ok, (not ok) and err - end) - if pok then - return ok, err - else - return pok, ok - end -end - ---- Delete a file or a directory and all its contents. --- @param name string: Pathname of source --- @return nil -function fs_lua.delete(name) - name = dir.normalize(name) - recursive_delete(name) -end - ---- Internal implementation function for fs.dir. --- Yields a filename on each iteration. --- @param at string: directory to list --- @return nil or (nil and string): an error message on failure -function fs_lua.dir_iterator(at) - local pok, iter, arg = pcall(lfs.dir, at) - if not pok then - return nil, iter - end - for file in iter, arg do - if file ~= "." and file ~= ".." then - coroutine.yield(file) - end - end -end - ---- Implementation function for recursive find. --- Assumes paths are normalized. --- @param cwd string: Current working directory in recursion. --- @param prefix string: Auxiliary prefix string to form pathname. --- @param result table: Array of strings where results are collected. -local function recursive_find(cwd, prefix, result) - local pok, iter, arg = pcall(lfs.dir, cwd) - if not pok then - return nil - end - for file in iter, arg do - if file ~= "." and file ~= ".." then - local item = prefix .. file - table.insert(result, item) - local pathname = dir.path(cwd, file) - if lfs.attributes(pathname, "mode") == "directory" then - recursive_find(pathname, item.."/", result) - end - end - end -end - ---- Recursively scan the contents of a directory. --- @param at string or nil: directory to scan (will be the current --- directory if none is given). --- @return table: an array of strings with the filenames representing --- the contents of a directory. -function fs_lua.find(at) - assert(type(at) == "string" or not at) - if not at then - at = fs.current_dir() - end - at = dir.normalize(at) - local result = {} - recursive_find(at, "", result) - return result -end - ---- Test for existence of a file. --- @param file string: filename to test --- @return boolean: true if file exists, false otherwise. -function fs_lua.exists(file) - assert(file) - file = dir.normalize(file) - return type(lfs.attributes(file)) == "table" -end - ---- Test is pathname is a directory. --- @param file string: pathname to test --- @return boolean: true if it is a directory, false otherwise. -function fs_lua.is_dir(file) - assert(file) - file = dir.normalize(file) - return lfs.attributes(file, "mode") == "directory" -end - ---- Test is pathname is a regular file. --- @param file string: pathname to test --- @return boolean: true if it is a file, false otherwise. -function fs_lua.is_file(file) - assert(file) - file = dir.normalize(file) - return lfs.attributes(file, "mode") == "file" -end - --- Set access and modification times for a file. --- @param filename File to set access and modification times for. --- @param time may be a number containing the format returned --- by os.time, or a table ready to be processed via os.time; if --- nil, current time is assumed. -function fs_lua.set_time(file, time) - assert(time == nil or type(time) == "table" or type(time) == "number") - file = dir.normalize(file) - if type(time) == "table" then - time = os.time(time) - end - return lfs.touch(file, time) -end - -else -- if not lfs_ok - -function fs_lua.exists(file) - assert(file) - file = dir.normalize(fs.absolute_name(file)) - -- check if file exists by attempting to open it - return util.exists(file) -end - -end - ---------------------------------------------------------------------- --- lua-bz2 functions ---------------------------------------------------------------------- - -if bz2_ok then - -local function bunzip2_string(data) - local decompressor = bz2.initDecompress() - local output, err = decompressor:update(data) - if not output then - return nil, err - end - decompressor:close() - return output -end - ---- Uncompresses a .bz2 file. --- @param infile string: pathname of .bz2 file to be extracted. --- @param outfile string or nil: pathname of output file to be produced. --- If not given, name is derived from input file. --- @return boolean: true on success; nil and error message on failure. -function fs_lua.bunzip2(infile, outfile) - assert(type(infile) == "string") - assert(outfile == nil or type(outfile) == "string") - if not outfile then - outfile = infile:gsub("%.bz2$", "") - end - - return fs.filter_file(bunzip2_string, infile, outfile) -end - -end - ---------------------------------------------------------------------- --- luarocks.tools.zip functions ---------------------------------------------------------------------- - -if zip_ok then - -function fs_lua.zip(zipfile, ...) - return zip.zip(zipfile, ...) -end - -function fs_lua.unzip(zipfile) - return zip.unzip(zipfile) -end - -function fs_lua.gunzip(infile, outfile) - return zip.gunzip(infile, outfile) -end - -end - ---------------------------------------------------------------------- --- LuaSocket functions ---------------------------------------------------------------------- - -if socket_ok then - -local ltn12 = require("ltn12") -local luasec_ok, https = pcall(require, "ssl.https") - -local redirect_protocols = { - http = http, - https = luasec_ok and https, -} - -local function request(url, method, http, loop_control) -- luacheck: ignore 431 - local result = {} - - if cfg.verbose then - print(method, url) - end - - local proxy = os.getenv("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 - proxy = "http://" .. proxy - end - - if cfg.show_downloads then - io.write(method.." "..url.." ...\n") - end - local dots = 0 - if cfg.connection_timeout and cfg.connection_timeout > 0 then - http.TIMEOUT = cfg.connection_timeout - end - local res, status, headers, err = http.request { - url = url, - proxy = proxy, - method = method, - redirect = false, - sink = ltn12.sink.table(result), - step = cfg.show_downloads and function(...) - io.write(".") - io.flush() - dots = dots + 1 - if dots == 70 then - io.write("\n") - dots = 0 - end - return ltn12.pump.step(...) - end, - headers = { - ["user-agent"] = cfg.user_agent.." via LuaSocket" - }, - } - if cfg.show_downloads then - io.write("\n") - end - if not res then - return nil, status - elseif status == 301 or status == 302 then - local location = headers.location - if location then - local protocol, rest = dir.split_url(location) - if redirect_protocols[protocol] then - if not loop_control then - loop_control = {} - elseif loop_control[location] then - return nil, "Redirection loop -- broken URL?" - end - loop_control[url] = true - return request(location, method, redirect_protocols[protocol], loop_control) - else - return nil, "URL redirected to unsupported protocol - install luasec to get HTTPS support.", "https" - end - end - return nil, err - elseif status ~= 200 then - return nil, err - else - return result, status, headers, err - end -end - -local function write_timestamp(filename, data) - local fd = io.open(filename, "w") - if fd then - fd:write(data) - fd:close() - end -end - -local function read_timestamp(filename) - local fd = io.open(filename, "r") - if fd then - local data = fd:read("*a") - fd:close() - return data - end -end - -local function fail_with_status(filename, status, headers) - write_timestamp(filename .. ".unixtime", os.time()) - write_timestamp(filename .. ".status", status) - return nil, status, headers -end - --- @param url string: URL to fetch. --- @param filename string: local filename of the file to fetch. --- @param http table: The library to use (http from LuaSocket or LuaSec) --- @param cache boolean: Whether to use a `.timestamp` file to check --- via the HTTP Last-Modified header if the full download is needed. --- @return (boolean | (nil, string, string?)): True if successful, or --- nil, error message and optionally HTTPS error in case of errors. -local function http_request(url, filename, http, cache) -- luacheck: ignore 431 - if cache then - local status = read_timestamp(filename..".status") - local timestamp = read_timestamp(filename..".timestamp") - if status or timestamp then - local unixtime = read_timestamp(filename..".unixtime") - if tonumber(unixtime) then - local diff = os.time() - tonumber(unixtime) - if status then - if diff < cfg.cache_fail_timeout then - return nil, status, {} - end - else - if diff < cfg.cache_timeout then - return true, nil, nil, true - end - end - end - - local result, status, headers, err = request(url, "HEAD", http) -- luacheck: ignore 421 - if not result then - return fail_with_status(filename, status, headers) - end - if status == 200 and headers["last-modified"] == timestamp then - write_timestamp(filename .. ".unixtime", os.time()) - return true, nil, nil, true - end - end - end - local result, status, headers, err = request(url, "GET", http) - if not result then - if status then - return fail_with_status(filename, status, headers) - end - end - if cache and headers["last-modified"] then - write_timestamp(filename .. ".timestamp", headers["last-modified"]) - write_timestamp(filename .. ".unixtime", os.time()) - end - local file = io.open(filename, "wb") - if not file then return nil, 0, {} end - for _, data in ipairs(result) do - file:write(data) - end - file:close() - return true -end - -local function ftp_request(url, filename) - local content, err = ftp.get(url) - if not content then - return false, err - end - local file = io.open(filename, "wb") - if not file then return false, err end - file:write(content) - file:close() - return true -end - -local downloader_warning = false - ---- Download a remote file. --- @param url string: URL to be fetched. --- @param filename string or nil: this function attempts to detect the --- resulting local filename of the remote file as the basename of the URL; --- if that is not correct (due to a redirection, for example), the local --- filename can be given explicitly as this second argument. --- @return (boolean, string, boolean): --- In case of success: --- * true --- * a string with the filename --- * true if the file was retrieved from local cache --- In case of failure: --- * false --- * error message -function fs_lua.download(url, filename, cache) - assert(type(url) == "string") - 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 os.getenv("no_proxy") then - return fs.use_downloader(url, filename, cache) - end - - local ok, err, https_err, from_cache - if util.starts_with(url, "http:") then - ok, err, https_err, from_cache = http_request(url, filename, http, cache) - elseif util.starts_with(url, "ftp:") then - ok, err = ftp_request(url, filename) - elseif util.starts_with(url, "https:") then - -- skip LuaSec when proxy is enabled since it is not supported - if luasec_ok and not os.getenv("https_proxy") then - local _ - ok, err, _, from_cache = http_request(url, filename, https, cache) - else - https_err = true - end - else - err = "Unsupported protocol" - end - if https_err then - local downloader, err = fs.which_tool("downloader") - if not downloader then - return nil, err - end - if not downloader_warning then - util.warning("falling back to "..downloader.." - install luasec to get native HTTPS support") - downloader_warning = true - end - return fs.use_downloader(url, filename, cache) - elseif not ok then - return nil, err - end - return true, filename, from_cache -end - -else --...if socket_ok == false then - -function fs_lua.download(url, filename, cache) - return fs.use_downloader(url, filename, cache) -end - -end ---------------------------------------------------------------------- --- MD5 functions ---------------------------------------------------------------------- - -if md5_ok then - --- Support the interface of lmd5 by lhf in addition to md5 by Roberto --- and the keplerproject. -if not md5.sumhexa and md5.digest then - md5.sumhexa = function(msg) - return md5.digest(msg) - end -end - -if md5.sumhexa then - ---- Get the MD5 checksum for a file. --- @param file string: The file to be computed. --- @return string: The MD5 checksum or nil + error -function fs_lua.get_md5(file) - file = fs.absolute_name(file) - local file_handler = io.open(file, "rb") - if not file_handler then return nil, "Failed to open file for reading: "..file end - local computed = md5.sumhexa(file_handler:read("*a")) - file_handler:close() - if computed then return computed end - return nil, "Failed to compute MD5 hash for file "..file -end - -end -end - ---------------------------------------------------------------------- --- POSIX functions ---------------------------------------------------------------------- - -function fs_lua._unix_rwx_to_number(rwx, neg) - local num = 0 - neg = neg or false - for i = 1, 9 do - local c = rwx:sub(10 - i, 10 - i) == "-" - if neg == c then - num = num + 2^(i-1) - end - end - return math.floor(num) -end - -if posix_ok then - -local octal_to_rwx = { - ["0"] = "---", - ["1"] = "--x", - ["2"] = "-w-", - ["3"] = "-wx", - ["4"] = "r--", - ["5"] = "r-x", - ["6"] = "rw-", - ["7"] = "rwx", -} - -do - local umask_cache - function fs_lua._unix_umask() - if umask_cache then - return umask_cache - end - -- LuaPosix (as of 34.0.4) only returns the umask as rwx - local rwx = posix.umask() - local num = fs_lua._unix_rwx_to_number(rwx, true) - umask_cache = ("%03o"):format(num) - return umask_cache - end -end - -function fs_lua.set_permissions(filename, mode, scope) - local perms - if mode == "read" and scope == "user" then - perms = fs._unix_moderate_permissions("600") - elseif mode == "exec" and scope == "user" then - perms = fs._unix_moderate_permissions("700") - elseif mode == "read" and scope == "all" then - perms = fs._unix_moderate_permissions("644") - elseif mode == "exec" and scope == "all" then - perms = fs._unix_moderate_permissions("755") - else - return false, "Invalid permission " .. mode .. " for " .. scope - end - - -- LuaPosix (as of 5.1.15) does not support octal notation... - local new_perms = {} - for c in perms:sub(-3):gmatch(".") do - table.insert(new_perms, octal_to_rwx[c]) - end - perms = table.concat(new_perms) - local err = posix.chmod(filename, perms) - return err == 0 -end - -function fs_lua.current_user() - return posix.getpwuid(posix.geteuid()).pw_name -end - -function fs_lua.is_superuser() - return posix.geteuid() == 0 -end - --- This call is not available on all systems, see #677 -if posix.mkdtemp then - ---- Create a temporary directory. --- @param name_pattern string: name pattern to use for avoiding conflicts --- when creating temporary directory. --- @return string or (nil, string): name of temporary directory or (nil, error message) on failure. -function fs_lua.make_temp_dir(name_pattern) - assert(type(name_pattern) == "string") - name_pattern = dir.normalize(name_pattern) - - return posix.mkdtemp(fs.system_temp_dir() .. "/luarocks_" .. name_pattern:gsub("/", "_") .. "-XXXXXX") -end - -end -- if posix.mkdtemp - -end - ---------------------------------------------------------------------- --- Other functions ---------------------------------------------------------------------- - -if lfs_ok and not fs_lua.make_temp_dir then - -function fs_lua.make_temp_dir(name_pattern) - assert(type(name_pattern) == "string") - name_pattern = dir.normalize(name_pattern) - - local pattern = fs.system_temp_dir() .. "/luarocks_" .. name_pattern:gsub("/", "_") .. "-" - - while true do - local name = pattern .. tostring(math.random(10000000)) - if lfs.mkdir(name) then - return name - end - end -end - -end - ---- Apply a patch. --- @param patchname string: The filename of the patch. --- @param patchdata string or nil: The actual patch as a string. --- @param create_delete boolean: Support creating and deleting files in a patch. -function fs_lua.apply_patch(patchname, patchdata, create_delete) - local p, all_ok = patch.read_patch(patchname, patchdata) - if not all_ok then - return nil, "Failed reading patch "..patchname - end - if p then - return patch.apply_patch(p, 1, create_delete) - end -end - ---- Move a file. --- @param src string: Pathname of source --- @param dest string: Pathname of destination --- @param perms string ("read" or "exec") or nil: Permissions for destination --- file or nil to use the source file permissions. --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message. -function fs_lua.move(src, dest, perms) - assert(src and dest) - if fs.exists(dest) and not fs.is_dir(dest) then - return false, "File already exists: "..dest - end - local ok, err = fs.copy(src, dest, perms) - if not ok then - return false, err - end - fs.delete(src) - if fs.exists(src) then - return false, "Failed move: could not delete "..src.." after copy." - end - return true -end - ---- Check if user has write permissions for the command. --- Assumes the configuration variables under cfg have been previously set up. --- @param args table: the args table passed to run() drivers. --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message. -function fs_lua.check_command_permissions(args) - local ok = true - local err = "" - for _, directory in ipairs { cfg.rocks_dir, cfg.deploy_lua_dir, cfg.deploy_bin_dir, cfg.deploy_lua_dir } do - if fs.exists(directory) then - if not fs.is_writable(directory) then - ok = false - err = "Your user does not have write permissions in " .. directory - break - end - else - local root = fs.root_of(directory) - local parent = directory - repeat - parent = dir.dir_name(parent) - if parent == "" then - parent = root - end - until parent == root or fs.exists(parent) - if not fs.is_writable(parent) then - ok = false - err = directory.." does not exist and your user does not have write permissions in " .. parent - break - end - end - end - if ok then - return true - else - if args["local"] or cfg.local_by_default then - err = err .. " \n-- please check your permissions." - else - err = err .. " \n-- you may want to run as a privileged user or use your local tree with --local." - end - return nil, err - end -end - ---- Check whether a file is a Lua script --- When the file can be successfully compiled by the configured --- Lua interpreter, it's considered to be a valid Lua file. --- @param filename filename of file to check --- @return boolean true, if it is a Lua script, false otherwise -function fs_lua.is_lua(filename) - filename = filename:gsub([[%\]],"/") -- normalize on fw slash to prevent escaping issues - local lua = fs.Q(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)) -- get lua interpreter configured - -- execute on configured interpreter, might not be the same as the interpreter LR is run on - local result = fs.execute_string(lua..[[ -e "if loadfile(']]..filename..[[') then os.exit(0) else os.exit(1) end"]]) - return (result == true) -end - ---- Unpack an archive. --- Extract the contents of an archive, detecting its format by --- filename extension. --- @param archive string: Filename of archive. --- @return boolean or (boolean, string): true on success, false and an error message on failure. -function fs_lua.unpack_archive(archive) - assert(type(archive) == "string") - - local ok, err - archive = fs.absolute_name(archive) - if archive:match("%.tar%.gz$") then - local tar_filename = archive:gsub("%.gz$", "") - ok, err = fs.gunzip(archive, tar_filename) - if ok then - ok, err = tar.untar(tar_filename, ".") - end - elseif archive:match("%.tgz$") then - local tar_filename = archive:gsub("%.tgz$", ".tar") - ok, err = fs.gunzip(archive, tar_filename) - if ok then - ok, err = tar.untar(tar_filename, ".") - end - elseif archive:match("%.tar%.bz2$") then - local tar_filename = archive:gsub("%.bz2$", "") - ok, err = fs.bunzip2(archive, tar_filename) - if ok then - ok, err = tar.untar(tar_filename, ".") - end - elseif archive:match("%.zip$") then - ok, err = fs.unzip(archive) - elseif archive:match("%.lua$") or archive:match("%.c$") then - -- Ignore .lua and .c files; they don't need to be extracted. - return true - else - return false, "Couldn't extract archive "..archive..": unrecognized filename extension" - end - if not ok then - return false, "Failed extracting "..archive..": "..err - end - return true -end - -return fs_lua diff --git a/.luarocks/share/lua/5.1/luarocks/fs/macosx.lua b/.luarocks/share/lua/5.1/luarocks/fs/macosx.lua deleted file mode 100644 index b71e7f12b..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs/macosx.lua +++ /dev/null @@ -1,50 +0,0 @@ ---- macOS-specific implementation of filesystem and platform abstractions. -local macosx = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") - -function macosx.is_dir(file) - file = fs.absolute_name(file) - file = dir.normalize(file) .. "/." - local fd, _, code = io.open(file, "r") - if code == 2 then -- "No such file or directory" - return false - end - if code == 20 then -- "Not a directory", regardless of permissions - return false - end - if code == 13 then -- "Permission denied", but is a directory - return true - end - if fd then - local _, _, ecode = fd:read(1) - fd:close() - if ecode == 21 then -- "Is a directory" - return true - end - end - return false -end - -function macosx.is_file(file) - file = fs.absolute_name(file) - if fs.is_dir(file) then - return false - end - file = dir.normalize(file) - local fd, _, code = io.open(file, "r") - if code == 2 then -- "No such file or directory" - return false - end - if code == 13 then -- "Permission denied", but it exists - return true - end - if fd then - fd:close() - return true - end - return false -end - -return macosx diff --git a/.luarocks/share/lua/5.1/luarocks/fs/tools.lua b/.luarocks/share/lua/5.1/luarocks/fs/tools.lua deleted file mode 100644 index 5c317f65a..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs/tools.lua +++ /dev/null @@ -1,214 +0,0 @@ - ---- Common fs operations implemented with third-party tools. -local tools = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local cfg = require("luarocks.core.cfg") - -local vars = setmetatable({}, { __index = function(_,k) return cfg.variables[k] end }) - -local dir_stack = {} - -do - local tool_cache = {} - - local tool_options = { - downloader = { - desc = "downloader", - { var = "WGET", name = "wget" }, - { var = "CURL", name = "curl" }, - }, - md5checker = { - desc = "MD5 checker", - { var = "MD5SUM", name = "md5sum" }, - { var = "OPENSSL", name = "openssl", cmdarg = "md5" }, - { var = "MD5", name = "md5" }, - }, - } - - function tools.which_tool(tooltype) - local tool = tool_cache[tooltype] - local names = {} - if not tool then - for _, opt in ipairs(tool_options[tooltype]) do - table.insert(names, opt.name) - if fs.is_tool_available(vars[opt.var], opt.name) then - tool = opt - tool_cache[tooltype] = opt - break - end - end - end - if not tool then - local tool_names = table.concat(names, ", ", 1, #names - 1) .. " or " .. names[#names] - return nil, "no " .. tool_options[tooltype].desc .. " tool available," .. " please install " .. tool_names .. " in your system" - end - return tool.name, vars[tool.var] .. (tool.cmdarg and " "..tool.cmdarg or "") - end -end - -do - local cache_pwd - --- Obtain current directory. - -- Uses the module's internal directory stack. - -- @return string: the absolute pathname of the current directory. - function tools.current_dir() - local current = cache_pwd - if not current then - local pipe = io.popen(fs.quiet_stderr(vars.PWD)) - current = pipe:read("*a"):gsub("^%s*", ""):gsub("%s*$", "") - pipe:close() - cache_pwd = current - end - for _, directory in ipairs(dir_stack) do - current = fs.absolute_name(directory, current) - end - return current - end -end - ---- Change the current directory. --- Uses the module's internal directory stack. This does not have exact --- semantics of chdir, as it does not handle errors the same way, --- but works well for our purposes for now. --- @param directory string: The directory to switch to. --- @return boolean or (nil, string): true if successful, (nil, error message) if failed. -function tools.change_dir(directory) - assert(type(directory) == "string") - if fs.is_dir(directory) then - table.insert(dir_stack, directory) - return true - end - return nil, "directory not found: "..directory -end - ---- Change directory to root. --- Allows leaving a directory (e.g. for deleting it) in --- a crossplatform way. -function tools.change_dir_to_root() - local curr_dir = fs.current_dir() - if not curr_dir or not fs.is_dir(curr_dir) then - return false - end - table.insert(dir_stack, "/") - return true -end - ---- Change working directory to the previous in the directory stack. -function tools.pop_dir() - local directory = table.remove(dir_stack) - return directory ~= nil -end - ---- Run the given command. --- The command is executed in the current directory in the directory stack. --- @param cmd string: No quoting/escaping is applied to the command. --- @return boolean: true if command succeeds (status code 0), false --- otherwise. -function tools.execute_string(cmd) - local current = fs.current_dir() - if not current then return false end - cmd = fs.command_at(current, cmd) - local code = os.execute(cmd) - if code == 0 or code == true then - return true - else - return false - end -end - ---- Internal implementation function for fs.dir. --- Yields a filename on each iteration. --- @param at string: directory to list --- @return nil -function tools.dir_iterator(at) - local pipe = io.popen(fs.command_at(at, vars.LS, true)) - for file in pipe:lines() do - if file ~= "." and file ~= ".." then - coroutine.yield(file) - end - end - pipe:close() -end - ---- Download a remote file. --- @param url string: URL to be fetched. --- @param filename string or nil: this function attempts to detect the --- resulting local filename of the remote file as the basename of the URL; --- if that is not correct (due to a redirection, for example), the local --- filename can be given explicitly as this second argument. --- @param cache boolean: compare remote timestamps via HTTP HEAD prior to --- re-downloading the file. --- @return (boolean, string): true and the filename on success, --- false and the error message on failure. -function tools.use_downloader(url, filename, cache) - assert(type(url) == "string") - assert(type(filename) == "string" or not filename) - - filename = fs.absolute_name(filename or dir.base_name(url)) - - local downloader, err = fs.which_tool("downloader") - if not downloader then - return nil, err - end - - local ok = false - if downloader == "wget" then - local wget_cmd = 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="..tostring(cfg.connection_timeout).." --tries=1 " - end - if cache then - -- --timestamping is incompatible with --output-document, - -- but that's not a problem for our use cases. - fs.delete(filename .. ".unixtime") - fs.change_dir(dir.dir_name(filename)) - ok = fs.execute_quiet(wget_cmd.." --timestamping ", url) - fs.pop_dir() - elseif filename then - ok = fs.execute_quiet(wget_cmd.." --output-document ", filename, url) - else - ok = fs.execute_quiet(wget_cmd, url) - end - elseif downloader == "curl" then - local curl_cmd = 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 "..tostring(cfg.connection_timeout).." " - end - if cache then - curl_cmd = curl_cmd .. " -R -z \"" .. filename .. "\" " - end - ok = fs.execute_string(fs.quiet_stderr(curl_cmd..fs.Q(url).." --output "..fs.Q(filename))) - end - if ok then - return true, filename - else - os.remove(filename) - return false, "failed downloading " .. url - end -end - ---- Get the MD5 checksum for a file. --- @param file string: The file to be computed. --- @return string: The MD5 checksum or nil + message -function tools.get_md5(file) - local ok, md5checker = fs.which_tool("md5checker") - if not ok then - return false, md5checker - end - - local pipe = io.popen(md5checker.." "..fs.Q(fs.absolute_name(file))) - local computed = pipe:read("*l") - pipe:close() - if computed then - computed = computed:match("("..("%x"):rep(32)..")") - end - if computed then - return computed - else - return nil, "Failed to compute MD5 hash for file "..tostring(fs.absolute_name(file)) - end -end - -return tools diff --git a/.luarocks/share/lua/5.1/luarocks/fs/unix.lua b/.luarocks/share/lua/5.1/luarocks/fs/unix.lua deleted file mode 100644 index 61569e307..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs/unix.lua +++ /dev/null @@ -1,240 +0,0 @@ - ---- Unix implementation of filesystem and platform abstractions. -local unix = {} - -local fs = require("luarocks.fs") - -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.dir") -local path = require("luarocks.path") -local util = require("luarocks.util") - ---- Annotate command string for quiet execution. --- @param cmd string: A command-line string. --- @return string: The command-line, with silencing annotation. -function unix.quiet(cmd) - return cmd.." 1> /dev/null 2> /dev/null" -end - ---- Annotate command string for execution with quiet stderr. --- @param cmd string: A command-line string. --- @return string: The command-line, with stderr silencing annotation. -function unix.quiet_stderr(cmd) - return cmd.." 2> /dev/null" -end - ---- Quote argument for shell processing. --- Adds single quotes and escapes. --- @param arg string: Unquoted argument. --- @return string: Quoted argument. -function unix.Q(arg) - assert(type(arg) == "string") - return "'" .. arg:gsub("'", "'\\''") .. "'" -end - ---- Return an absolute pathname from a potentially relative one. --- @param pathname string: pathname to convert. --- @param relative_to string or nil: path to prepend when making --- pathname absolute, or the current dir in the dir stack if --- not given. --- @return string: The pathname converted to absolute. -function unix.absolute_name(pathname, relative_to) - assert(type(pathname) == "string") - assert(type(relative_to) == "string" or not relative_to) - - local unquoted = pathname:match("^['\"](.*)['\"]$") - if unquoted then - pathname = unquoted - end - - relative_to = (relative_to or fs.current_dir()):gsub("/*$", "") - if pathname:sub(1,1) == "/" then - return pathname - else - return relative_to .. "/" .. pathname - end -end - ---- Return the root directory for the given path. --- In Unix, root is always "/". --- @param pathname string: pathname to use. --- @return string: The root of the given pathname. -function unix.root_of(_) - return "/" -end - ---- Create a wrapper to make a script executable from the command-line. --- @param script string: Pathname of script to be made executable. --- @param target string: wrapper target pathname (without wrapper suffix). --- @param name string: rock name to be used in loader context. --- @param version string: rock version to be used in loader context. --- @return boolean or (nil, string): True if succeeded, or nil and --- an error message. -function unix.wrap_script(script, target, deps_mode, name, version, ...) - assert(type(script) == "string" or not script) - assert(type(target) == "string") - assert(type(deps_mode) == "string") - assert(type(name) == "string" or not name) - assert(type(version) == "string" or not version) - - local wrapper = io.open(target, "w") - if not wrapper then - return nil, "Could not open "..target.." for writing." - end - - local lpath, lcpath = path.package_paths(deps_mode) - - local luainit = { - "package.path="..util.LQ(lpath..";").."..package.path", - "package.cpath="..util.LQ(lcpath..";").."..package.cpath", - } - - local remove_interpreter = false - local base = dir.base_name(target):gsub("%..*$", "") - if base == "luarocks" or base == "luarocks-admin" then - if cfg.is_binary then - remove_interpreter = true - end - luainit = { - "package.path="..util.LQ(package.path), - "package.cpath="..util.LQ(package.cpath), - } - end - - if name and version then - local addctx = "local k,l,_=pcall(require,"..util.LQ("luarocks.loader")..") _=k " .. - "and l.add_context("..util.LQ(name)..","..util.LQ(version)..")" - table.insert(luainit, addctx) - end - - local argv = { - fs.Q(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)), - "-e", - fs.Q(table.concat(luainit, ";")), - script and fs.Q(script) or [[$([ "$*" ] || echo -i)]], - ... - } - if remove_interpreter then - table.remove(argv, 1) - table.remove(argv, 1) - table.remove(argv, 1) - end - - wrapper:write("#!/bin/sh\n\n") - wrapper:write("LUAROCKS_SYSCONFDIR="..fs.Q(cfg.sysconfdir) .. " ") - wrapper:write("exec "..table.concat(argv, " ")..' "$@"\n') - wrapper:close() - - if fs.set_permissions(target, "exec", "all") then - return true - else - return nil, "Could not make "..target.." executable." - end -end - ---- Check if a file (typically inside path.bin_dir) is an actual binary --- or a Lua wrapper. --- @param filename string: the file name with full path. --- @return boolean: returns true if file is an actual binary --- (or if it couldn't check) or false if it is a Lua wrapper. -function unix.is_actual_binary(filename) - if filename:match("%.lua$") then - return false - end - local file = io.open(filename) - if not file then - return true - end - local first = file:read(2) - file:close() - if not first then - util.warning("could not read "..filename) - return true - end - return first ~= "#!" -end - -function unix.copy_binary(filename, dest) - return fs.copy(filename, dest, "exec") -end - ---- Move a file on top of the other. --- The new file ceases to exist under its original name, --- and takes over the name of the old file. --- On Unix this is done through a single rename operation. --- @param old_file The name of the original file, --- which will be the new name of new_file. --- @param new_file The name of the new file, --- which will replace old_file. --- @return boolean or (nil, string): True if succeeded, or nil and --- an error message. -function unix.replace_file(old_file, new_file) - return os.rename(new_file, old_file) -end - -function unix.tmpname() - return os.tmpname() -end - -function unix.export_cmd(var, val) - return ("export %s='%s'"):format(var, val) -end - -local octal_to_rwx = { - ["0"] = "---", - ["1"] = "--x", - ["2"] = "-w-", - ["3"] = "-wx", - ["4"] = "r--", - ["5"] = "r-x", - ["6"] = "rw-", - ["7"] = "rwx", -} -local rwx_to_octal = {} -for octal, rwx in pairs(octal_to_rwx) do - rwx_to_octal[rwx] = octal -end ---- Moderate the given permissions based on the local umask --- @param perms string: permissions to moderate --- @return string: the moderated permissions -function unix._unix_moderate_permissions(perms) - local umask = fs._unix_umask() - - local moderated_perms = "" - for i = 1, 3 do - local p_rwx = octal_to_rwx[perms:sub(i, i)] - local u_rwx = octal_to_rwx[umask:sub(i, i)] - local new_perm = "" - for j = 1, 3 do - local p_val = p_rwx:sub(j, j) - local u_val = u_rwx:sub(j, j) - if p_val == u_val then - new_perm = new_perm .. "-" - else - new_perm = new_perm .. p_val - end - end - moderated_perms = moderated_perms .. rwx_to_octal[new_perm] - end - return moderated_perms -end - -function unix.system_cache_dir() - if fs.is_dir("/var/cache") then - return "/var/cache" - end - return dir.path(fs.system_temp_dir(), "cache") -end - -function unix.search_in_path(program) - for d in (os.getenv("PATH") or ""):gmatch("([^:]+)") do - local fd = io.open(dir.path(d, program), "r") - if fd then - fd:close() - return true, d - end - end - return false -end - -return unix diff --git a/.luarocks/share/lua/5.1/luarocks/fs/unix/tools.lua b/.luarocks/share/lua/5.1/luarocks/fs/unix/tools.lua deleted file mode 100644 index b7fd4de5e..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs/unix/tools.lua +++ /dev/null @@ -1,318 +0,0 @@ - ---- fs operations implemented with third-party tools for Unix platform abstractions. -local tools = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local cfg = require("luarocks.core.cfg") - -local vars = setmetatable({}, { __index = function(_,k) return cfg.variables[k] end }) - ---- Adds prefix to command to make it run from a directory. --- @param directory string: Path to a directory. --- @param cmd string: A command-line string. --- @return string: The command-line with prefix. -function tools.command_at(directory, cmd) - return "cd " .. fs.Q(fs.absolute_name(directory)) .. " && " .. cmd -end - ---- Create a directory if it does not already exist. --- If any of the higher levels in the path name does not exist --- too, they are created as well. --- @param directory string: pathname of directory to create. --- @return boolean: true on success, false on failure. -function tools.make_dir(directory) - assert(directory) - local ok, err = fs.execute(vars.MKDIR.." -p", directory) - if not ok then - err = "failed making directory "..directory - end - return ok, err -end - ---- Remove a directory if it is empty. --- Does not return errors (for example, if directory is not empty or --- if already does not exist) --- @param directory string: pathname of directory to remove. -function tools.remove_dir_if_empty(directory) - assert(directory) - fs.execute_quiet(vars.RMDIR, directory) -end - ---- Remove a directory if it is empty. --- Does not return errors (for example, if directory is not empty or --- if already does not exist) --- @param directory string: pathname of directory to remove. -function tools.remove_dir_tree_if_empty(directory) - assert(directory) - fs.execute_quiet(vars.RMDIR, "-p", directory) -end - ---- Copy a file. --- @param src string: Pathname of source --- @param dest string: Pathname of destination --- @param perm string ("read" or "exec") or nil: Permissions for destination --- file or nil to use the source permissions --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message. -function tools.copy(src, dest, perm) - assert(src and dest) - if fs.execute(vars.CP, src, dest) then - if perm then - if fs.is_dir(dest) then - dest = dir.path(dest, dir.base_name(src)) - end - if fs.set_permissions(dest, perm, "all") then - return true - else - return false, "Failed setting permissions of "..dest - end - end - return true - else - return false, "Failed copying "..src.." to "..dest - end -end - ---- Recursively copy the contents of a directory. --- @param src string: Pathname of source --- @param dest string: Pathname of destination --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message. -function tools.copy_contents(src, dest) - assert(src and dest) - if fs.execute_quiet(vars.CP.." -pPR "..fs.Q(src).."/* "..fs.Q(dest)) then - return true - else - return false, "Failed copying "..src.." to "..dest - end -end ---- Delete a file or a directory and all its contents. --- For safety, this only accepts absolute paths. --- @param arg string: Pathname of source --- @return nil -function tools.delete(arg) - assert(arg) - assert(arg:sub(1,1) == "/") - fs.execute_quiet(vars.RM, "-rf", arg) -end - ---- Recursively scan the contents of a directory. --- @param at string or nil: directory to scan (will be the current --- directory if none is given). --- @return table: an array of strings with the filenames representing --- the contents of a directory. -function tools.find(at) - assert(type(at) == "string" or not at) - if not at then - at = fs.current_dir() - end - if not fs.is_dir(at) then - return {} - end - local result = {} - local pipe = io.popen(fs.command_at(at, fs.quiet_stderr(vars.FIND.." *"))) - for file in pipe:lines() do - table.insert(result, file) - end - pipe:close() - return result -end - ---- Compress files in a .zip archive. --- @param zipfile string: pathname of .zip archive to be created. --- @param ... Filenames to be stored in the archive are given as --- additional arguments. --- @return boolean: true on success, nil and error message on failure. -function tools.zip(zipfile, ...) - local ok, err = fs.is_tool_available(vars.ZIP, "zip") - if not ok then - return nil, err - end - if fs.execute_quiet(vars.ZIP.." -r", zipfile, ...) then - return true - else - return nil, "failed compressing " .. zipfile - end -end - ---- Uncompress files from a .zip archive. --- @param zipfile string: pathname of .zip archive to be extracted. --- @return boolean: true on success, nil and error message on failure. -function tools.unzip(zipfile) - assert(zipfile) - local ok, err = fs.is_tool_available(vars.UNZIP, "unzip") - if not ok then - return nil, err - end - if fs.execute_quiet(vars.UNZIP, zipfile) then - return true - else - return nil, "failed extracting " .. zipfile - end -end - -local function uncompress(default_ext, program, infile, outfile) - assert(type(infile) == "string") - assert(outfile == nil or type(outfile) == "string") - if not outfile then - outfile = infile:gsub("%."..default_ext.."$", "") - end - if fs.execute(fs.Q(program).." -c "..fs.Q(infile).." > "..fs.Q(outfile)) then - return true - else - return nil, "failed extracting " .. infile - end -end - ---- Uncompresses a .gz file. --- @param infile string: pathname of .gz file to be extracted. --- @param outfile string or nil: pathname of output file to be produced. --- If not given, name is derived from input file. --- @return boolean: true on success; nil and error message on failure. -function tools.gunzip(infile, outfile) - return uncompress("gz", "gunzip", infile, outfile) -end - ---- Uncompresses a .bz2 file. --- @param infile string: pathname of .bz2 file to be extracted. --- @param outfile string or nil: pathname of output file to be produced. --- If not given, name is derived from input file. --- @return boolean: true on success; nil and error message on failure. -function tools.bunzip2(infile, outfile) - return uncompress("bz2", "bunzip2", infile, outfile) -end - -do - local function rwx_to_octal(rwx) - return (rwx:match "r" and 4 or 0) - + (rwx:match "w" and 2 or 0) - + (rwx:match "x" and 1 or 0) - end - local umask_cache - function tools._unix_umask() - if umask_cache then - return umask_cache - end - local fd = assert(io.popen("umask -S")) - local umask = assert(fd:read("*a")) - fd:close() - local u, g, o = umask:match("u=([rwx]*),g=([rwx]*),o=([rwx]*)") - if not u then - error("invalid umask result") - end - umask_cache = string.format("%d%d%d", - 7 - rwx_to_octal(u), - 7 - rwx_to_octal(g), - 7 - rwx_to_octal(o)) - return umask_cache - end -end - ---- Set permissions for file or directory --- @param filename string: filename whose permissions are to be modified --- @param mode string ("read" or "exec"): permissions to set --- @param scope string ("user" or "all"): the user(s) to whom the permission applies --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message -function tools.set_permissions(filename, mode, scope) - assert(filename and mode and scope) - - local perms - if mode == "read" and scope == "user" then - perms = fs._unix_moderate_permissions("600") - elseif mode == "exec" and scope == "user" then - perms = fs._unix_moderate_permissions("700") - elseif mode == "read" and scope == "all" then - perms = fs._unix_moderate_permissions("644") - elseif mode == "exec" and scope == "all" then - perms = fs._unix_moderate_permissions("755") - else - return false, "Invalid permission " .. mode .. " for " .. scope - end - return fs.execute(vars.CHMOD, perms, filename) -end - -function tools.browser(url) - return fs.execute(cfg.web_browser, url) -end - --- Set access and modification times for a file. --- @param filename File to set access and modification times for. --- @param time may be a string or number containing the format returned --- by os.time, or a table ready to be processed via os.time; if --- nil, current time is assumed. -function tools.set_time(file, time) - assert(time == nil or type(time) == "table" or type(time) == "number") - file = dir.normalize(file) - local flag = "" - if type(time) == "number" then - time = os.date("*t", time) - end - if type(time) == "table" then - flag = ("-t %04d%02d%02d%02d%02d.%02d"):format(time.year, time.month, time.day, time.hour, time.min, time.sec) - end - return fs.execute(vars.TOUCH .. " " .. flag, file) -end - ---- Create a temporary directory. --- @param name_pattern string: name pattern to use for avoiding conflicts --- when creating temporary directory. --- @return string or (nil, string): name of temporary directory or (nil, error message) on failure. -function tools.make_temp_dir(name_pattern) - assert(type(name_pattern) == "string") - name_pattern = dir.normalize(name_pattern) - - local template = (os.getenv("TMPDIR") or "/tmp") .. "/luarocks_" .. name_pattern:gsub("/", "_") .. "-XXXXXX" - local pipe = io.popen(vars.MKTEMP.." -d "..fs.Q(template)) - local dirname = pipe:read("*l") - pipe:close() - if dirname and dirname:match("^/") then - return dirname - end - return nil, "Failed to create temporary directory "..tostring(dirname) -end - ---- Test is file/directory exists --- @param file string: filename to test --- @return boolean: true if file exists, false otherwise. -function tools.exists(file) - assert(file) - return fs.execute(vars.TEST, "-e", file) -end - ---- Test is pathname is a directory. --- @param file string: pathname to test --- @return boolean: true if it is a directory, false otherwise. -function tools.is_dir(file) - assert(file) - return fs.execute(vars.TEST, "-d", file) -end - ---- Test is pathname is a regular file. --- @param file string: pathname to test --- @return boolean: true if it is a regular file, false otherwise. -function tools.is_file(file) - assert(file) - return fs.execute(vars.TEST, "-f", file) -end - -function tools.current_user() - local user = os.getenv("USER") - if user then - return user - end - local pd = io.popen("whoami", "r") - if not pd then - return "" - end - user = pd:read("*l") - pd:close() - return user -end - -function tools.is_superuser() - return fs.current_user() == "root" -end - -return tools diff --git a/.luarocks/share/lua/5.1/luarocks/fs/win32.lua b/.luarocks/share/lua/5.1/luarocks/fs/win32.lua deleted file mode 100644 index 6c49f4477..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs/win32.lua +++ /dev/null @@ -1,377 +0,0 @@ ---- Windows implementation of filesystem and platform abstractions. --- Download http://unxutils.sourceforge.net/ for Windows GNU utilities --- used by this module. -local win32 = {} - -local fs = require("luarocks.fs") - -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.dir") -local path = require("luarocks.path") -local util = require("luarocks.util") - --- Monkey patch io.popen and os.execute to make sure quoting --- works as expected. --- See http://lua-users.org/lists/lua-l/2013-11/msg00367.html -local _prefix = "type NUL && " -local _popen, _execute = io.popen, os.execute - --- luacheck: push globals io os -io.popen = function(cmd, ...) return _popen(_prefix..cmd, ...) end -os.execute = function(cmd, ...) return _execute(_prefix..cmd, ...) end --- luacheck: pop - ---- Annotate command string for quiet execution. --- @param cmd string: A command-line string. --- @return string: The command-line, with silencing annotation. -function win32.quiet(cmd) - return cmd.." 2> NUL 1> NUL" -end - ---- Annotate command string for execution with quiet stderr. --- @param cmd string: A command-line string. --- @return string: The command-line, with stderr silencing annotation. -function win32.quiet_stderr(cmd) - return cmd.." 2> NUL" -end - --- Split path into drive, root and the rest. --- Example: "c:\\hello\\world" becomes "c:" "\\" "hello\\world" --- if any part is missing from input, it becomes an empty string. -local function split_root(pathname) - local drive = "" - local root = "" - local rest - - local unquoted = pathname:match("^['\"](.*)['\"]$") - if unquoted then - pathname = unquoted - end - - if pathname:match("^.:") then - drive = pathname:sub(1, 2) - pathname = pathname:sub(3) - end - - if pathname:match("^[\\/]") then - root = pathname:sub(1, 1) - rest = pathname:sub(2) - else - rest = pathname - end - - return drive, root, rest -end - ---- Quote argument for shell processing. Fixes paths on Windows. --- Adds double quotes and escapes. --- @param arg string: Unquoted argument. --- @return string: Quoted argument. -function win32.Q(arg) - assert(type(arg) == "string") - -- Use Windows-specific directory separator for paths. - -- Paths should be converted to absolute by now. - local drive, root, rest = split_root(arg) - if root ~= "" then - arg = arg:gsub("/", "\\") - end - if arg == "\\" then - return '\\' -- CHDIR needs special handling for root dir - end - -- URLs and anything else - arg = arg:gsub('\\(\\*)"', '\\%1%1"') - arg = arg:gsub('\\+$', '%0%0') - arg = arg:gsub('"', '\\"') - arg = arg:gsub('(\\*)%%', '%1%1"%%"') - return '"' .. arg .. '"' -end - ---- Quote argument for shell processing in batch files. --- Adds double quotes and escapes. --- @param arg string: Unquoted argument. --- @return string: Quoted argument. -function win32.Qb(arg) - assert(type(arg) == "string") - -- Use Windows-specific directory separator for paths. - -- Paths should be converted to absolute by now. - local drive, root, rest = split_root(arg) - if root ~= "" then - arg = arg:gsub("/", "\\") - end - if arg == "\\" then - return '\\' -- CHDIR needs special handling for root dir - end - -- URLs and anything else - arg = arg:gsub('\\(\\*)"', '\\%1%1"') - arg = arg:gsub('\\+$', '%0%0') - arg = arg:gsub('"', '\\"') - arg = arg:gsub('%%', '%%%%') - return '"' .. arg .. '"' -end - ---- Return an absolute pathname from a potentially relative one. --- @param pathname string: pathname to convert. --- @param relative_to string or nil: path to prepend when making --- pathname absolute, or the current dir in the dir stack if --- not given. --- @return string: The pathname converted to absolute. -function win32.absolute_name(pathname, relative_to) - assert(type(pathname) == "string") - assert(type(relative_to) == "string" or not relative_to) - - relative_to = (relative_to or fs.current_dir()):gsub("[\\/]*$", "") - local drive, root, rest = split_root(pathname) - if root:match("[\\/]$") then - -- It's an absolute path already. Ensure is not quoted. - return drive .. root .. rest - else - -- It's a relative path, join it with base path. - -- This drops drive letter from paths like "C:foo". - return relative_to .. "/" .. rest - end -end - ---- Return the root directory for the given path. --- For example, for "c:\hello", returns "c:\" --- @param pathname string: pathname to use. --- @return string: The root of the given pathname. -function win32.root_of(pathname) - local drive, root, rest = split_root(fs.absolute_name(pathname)) - return drive .. root -end - ---- Create a wrapper to make a script executable from the command-line. --- @param script string: Pathname of script to be made executable. --- @param target string: wrapper target pathname (without wrapper suffix). --- @param name string: rock name to be used in loader context. --- @param version string: rock version to be used in loader context. --- @return boolean or (nil, string): True if succeeded, or nil and --- an error message. -function win32.wrap_script(script, target, deps_mode, name, version, ...) - assert(type(script) == "string" or not script) - assert(type(target) == "string") - assert(type(deps_mode) == "string") - assert(type(name) == "string" or not name) - assert(type(version) == "string" or not version) - - local wrapper = io.open(target, "wb") - if not wrapper then - return nil, "Could not open "..target.." for writing." - end - - local lpath, lcpath = path.package_paths(deps_mode) - - local luainit = { - "package.path="..util.LQ(lpath..";").."..package.path", - "package.cpath="..util.LQ(lcpath..";").."..package.cpath", - } - - local remove_interpreter = false - local base = dir.base_name(target):gsub("%..*$", "") - if base == "luarocks" or base == "luarocks-admin" then - if cfg.is_binary then - remove_interpreter = true - end - luainit = { - "package.path="..util.LQ(package.path), - "package.cpath="..util.LQ(package.cpath), - } - end - - if name and version then - local addctx = "local k,l,_=pcall(require,'luarocks.loader') _=k " .. - "and l.add_context('"..name.."','"..version.."')" - table.insert(luainit, addctx) - end - - local argv = { - fs.Qb(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)), - "-e", - fs.Qb(table.concat(luainit, ";")), - script and fs.Qb(script) or "%I%", - ... - } - if remove_interpreter then - table.remove(argv, 1) - table.remove(argv, 1) - table.remove(argv, 1) - end - - wrapper:write("@echo off\r\n") - wrapper:write("setlocal\r\n") - if not script then - wrapper:write([[IF "%*"=="" (set I=-i) ELSE (set I=)]] .. "\r\n") - end - wrapper:write("set "..fs.Qb("LUAROCKS_SYSCONFDIR="..cfg.sysconfdir) .. "\r\n") - wrapper:write(table.concat(argv, " ") .. " %*\r\n") - wrapper:write("exit /b %ERRORLEVEL%\r\n") - wrapper:close() - return true -end - -function win32.is_actual_binary(name) - name = name:lower() - if name:match("%.bat$") or name:match("%.exe$") then - return true - end - return false -end - -function win32.copy_binary(filename, dest) - local ok, err = fs.copy(filename, dest) - if not ok then - return nil, err - end - local exe_pattern = "%.[Ee][Xx][Ee]$" - local base = dir.base_name(filename) - dest = dir.dir_name(dest) - if base:match(exe_pattern) then - base = base:gsub(exe_pattern, ".lua") - local helpname = dest.."/"..base - local helper = io.open(helpname, "w") - if not helper then - return nil, "Could not open "..helpname.." for writing." - end - helper:write('package.path=\"'..package.path:gsub("\\","\\\\")..';\"..package.path\n') - helper:write('package.cpath=\"'..package.path:gsub("\\","\\\\")..';\"..package.cpath\n') - helper:close() - end - return true -end - ---- Move a file on top of the other. --- The new file ceases to exist under its original name, --- and takes over the name of the old file. --- On Windows this is done by removing the original file and --- renaming the new file to its original name. --- @param old_file The name of the original file, --- which will be the new name of new_file. --- @param new_file The name of the new file, --- which will replace old_file. --- @return boolean or (nil, string): True if succeeded, or nil and --- an error message. -function win32.replace_file(old_file, new_file) - os.remove(old_file) - return os.rename(new_file, old_file) -end - -function win32.is_dir(file) - file = fs.absolute_name(file) - file = dir.normalize(file) - local fd, _, code = io.open(file, "r") - if code == 13 then -- directories return "Permission denied" - fd, _, code = io.open(file .. "\\", "r") - if code == 2 then -- directories return 2, files return 22 - return true - end - end - if fd then - fd:close() - end - return false -end - -function win32.is_file(file) - file = fs.absolute_name(file) - file = dir.normalize(file) - local fd, _, code = io.open(file, "r") - if code == 13 then -- if "Permission denied" - fd, _, code = io.open(file .. "\\", "r") - if code == 2 then -- directories return 2, files return 22 - return false - elseif code == 22 then - return true - end - end - if fd then - fd:close() - return true - end - return false -end - ---- Test is file/dir is writable. --- Warning: testing if a file/dir is writable does not guarantee --- that it will remain writable and therefore it is no replacement --- for checking the result of subsequent operations. --- @param file string: filename to test --- @return boolean: true if file exists, false otherwise. -function win32.is_writable(file) - assert(file) - file = dir.normalize(file) - local result - local tmpname = 'tmpluarockstestwritable.deleteme' - if fs.is_dir(file) then - local file2 = dir.path(file, tmpname) - local fh = io.open(file2, 'wb') - result = fh ~= nil - if fh then fh:close() end - if result then - -- the above test might give a false positive when writing to - -- c:\program files\ because of VirtualStore redirection on Vista and up - -- So check whether it's really there - result = fs.exists(file2) - end - os.remove(file2) - else - local fh = io.open(file, 'r+b') - result = fh ~= nil - if fh then fh:close() end - end - return result -end - ---- Create a temporary directory. --- @param name_pattern string: name pattern to use for avoiding conflicts --- when creating temporary directory. --- @return string or (nil, string): name of temporary directory or (nil, error message) on failure. -function win32.make_temp_dir(name_pattern) - assert(type(name_pattern) == "string") - name_pattern = dir.normalize(name_pattern) - - local temp_dir = os.getenv("TMP") .. "/luarocks_" .. name_pattern:gsub("/", "_") .. "-" .. tostring(math.floor(math.random() * 10000)) - local ok, err = fs.make_dir(temp_dir) - if ok then - return temp_dir - else - return nil, err - end -end - -function win32.tmpname() - local name = os.tmpname() - local tmp = os.getenv("TMP") - if tmp and name:sub(1, #tmp) ~= tmp then - name = (tmp .. "\\" .. name):gsub("\\+", "\\") - end - return name -end - -function win32.current_user() - return os.getenv("USERNAME") -end - -function win32.is_superuser() - return false -end - -function win32.export_cmd(var, val) - return ("SET %s=%s"):format(var, val) -end - -function win32.system_cache_dir() - return dir.path(fs.system_temp_dir(), "cache") -end - -function win32.search_in_path(program) - for d in (os.getenv("PATH") or ""):gmatch("([^;]+)") do - local fd = io.open(dir.path(d, program .. ".exe"), "r") - if fd then - fd:close() - return true, d - end - end - return false -end - -return win32 diff --git a/.luarocks/share/lua/5.1/luarocks/fs/win32/tools.lua b/.luarocks/share/lua/5.1/luarocks/fs/win32/tools.lua deleted file mode 100644 index 9bd050c60..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fs/win32/tools.lua +++ /dev/null @@ -1,319 +0,0 @@ - ---- fs operations implemented with third-party tools for Windows platform abstractions. --- Download http://unxutils.sourceforge.net/ for Windows GNU utilities --- used by this module. -local tools = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local cfg = require("luarocks.core.cfg") - -local vars = setmetatable({}, { __index = function(_,k) return cfg.variables[k] end }) - ---- Adds prefix to command to make it run from a directory. --- @param directory string: Path to a directory. --- @param cmd string: A command-line string. --- @param exit_on_error bool: Exits immediately if entering the directory failed. --- @return string: The command-line with prefix. -function tools.command_at(directory, cmd, exit_on_error) - local drive = directory:match("^([A-Za-z]:)") - local op = " & " - if exit_on_error then - op = " && " - end - local cmd_prefixed = "cd " .. fs.Q(directory) .. op .. cmd - if drive then - cmd_prefixed = drive .. " & " .. cmd_prefixed - end - return cmd_prefixed -end - ---- Create a directory if it does not already exist. --- If any of the higher levels in the path name does not exist --- too, they are created as well. --- @param directory string: pathname of directory to create. --- @return boolean: true on success, false on failure. -function tools.make_dir(directory) - assert(directory) - directory = dir.normalize(directory) - fs.execute_quiet(vars.MKDIR, directory) - if not fs.is_dir(directory) then - return false, "failed making directory "..directory - end - return true -end - ---- Remove a directory if it is empty. --- Does not return errors (for example, if directory is not empty or --- if already does not exist) --- @param directory string: pathname of directory to remove. -function tools.remove_dir_if_empty(directory) - assert(directory) - fs.execute_quiet(vars.RMDIR, directory) -end - ---- Remove a directory if it is empty. --- Does not return errors (for example, if directory is not empty or --- if already does not exist) --- @param directory string: pathname of directory to remove. -function tools.remove_dir_tree_if_empty(directory) - assert(directory) - while true do - fs.execute_quiet(vars.RMDIR, directory) - local parent = dir.dir_name(directory) - if parent ~= directory then - directory = parent - else - break - end - end -end - ---- Copy a file. --- @param src string: Pathname of source --- @param dest string: Pathname of destination --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message. -function tools.copy(src, dest) - assert(src and dest) - if dest:match("[/\\]$") then dest = dest:sub(1, -2) end - local ok = fs.execute(vars.CP, src, dest) - if ok then - return true - else - return false, "Failed copying "..src.." to "..dest - end -end - ---- Recursively copy the contents of a directory. --- @param src string: Pathname of source --- @param dest string: Pathname of destination --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message. -function tools.copy_contents(src, dest) - assert(src and dest) - if not fs.is_dir(src) then - return false, src .. " is not a directory" - end - if fs.make_dir(dest) and fs.execute_quiet(vars.CP, "-dR", src.."\\*.*", dest) then - return true - else - return false, "Failed copying "..src.." to "..dest - end -end - ---- Delete a file or a directory and all its contents. --- For safety, this only accepts absolute paths. --- @param arg string: Pathname of source --- @return nil -function tools.delete(arg) - assert(arg) - assert(arg:match("^[a-zA-Z]?:?[\\/]")) - fs.execute_quiet("if exist "..fs.Q(arg.."\\*").." ( RMDIR /S /Q "..fs.Q(arg).." ) else ( DEL /Q /F "..fs.Q(arg).." )") -end - ---- Recursively scan the contents of a directory. --- @param at string or nil: directory to scan (will be the current --- directory if none is given). --- @return table: an array of strings with the filenames representing --- the contents of a directory. Paths are returned with forward slashes. -function tools.find(at) - assert(type(at) == "string" or not at) - if not at then - at = fs.current_dir() - end - if not fs.is_dir(at) then - return {} - end - local result = {} - local pipe = io.popen(fs.command_at(at, fs.quiet_stderr(vars.FIND), true)) - for file in pipe:lines() do - -- Windows find is a bit different - local first_two = file:sub(1,2) - if first_two == ".\\" or first_two == "./" then file=file:sub(3) end - if file ~= "." then - table.insert(result, (file:gsub("\\", "/"))) - end - end - pipe:close() - return result -end - ---- Compress files in a .zip archive. --- @param zipfile string: pathname of .zip archive to be created. --- @param ... Filenames to be stored in the archive are given as --- additional arguments. --- @return boolean: true on success, nil and error message on failure. -function tools.zip(zipfile, ...) - if fs.execute_quiet(vars.SEVENZ.." -aoa a -tzip", zipfile, ...) then - return true - else - return nil, "failed compressing " .. zipfile - end -end - ---- Uncompress files from a .zip archive. --- @param zipfile string: pathname of .zip archive to be extracted. --- @return boolean: true on success, nil and error message on failure. -function tools.unzip(zipfile) - assert(zipfile) - if fs.execute_quiet(vars.SEVENZ.." -aoa x", zipfile) then - return true - else - return nil, "failed extracting " .. zipfile - end -end - -local function sevenz(default_ext, infile, outfile) - assert(type(infile) == "string") - assert(outfile == nil or type(outfile) == "string") - - local dropext = infile:gsub("%."..default_ext.."$", "") - local outdir = dir.dir_name(dropext) - - infile = fs.absolute_name(infile) - - local cmdline = vars.SEVENZ.." -aoa -t* -o"..fs.Q(outdir).." x "..fs.Q(infile) - local ok, err = fs.execute_quiet(cmdline) - if not ok then - return nil, "failed extracting " .. infile - end - - if outfile then - outfile = fs.absolute_name(outfile) - dropext = fs.absolute_name(dropext) - ok, err = os.rename(dropext, outfile) - if not ok then - return nil, "failed creating new file " .. outfile - end - end - - return true -end - ---- Uncompresses a .gz file. --- @param infile string: pathname of .gz file to be extracted. --- @param outfile string or nil: pathname of output file to be produced. --- If not given, name is derived from input file. --- @return boolean: true on success; nil and error message on failure. -function tools.gunzip(infile, outfile) - return sevenz("gz", infile, outfile) -end - ---- Uncompresses a .bz2 file. --- @param infile string: pathname of .bz2 file to be extracted. --- @param outfile string or nil: pathname of output file to be produced. --- If not given, name is derived from input file. --- @return boolean: true on success; nil and error message on failure. -function tools.bunzip2(infile, outfile) - return sevenz("bz2", infile, outfile) -end - ---- Helper function for fs.set_permissions --- @return table: an array of all system users -local function get_system_users() - local exclude = { - [""] = true, - ["Name"] = true, - ["\128\164\172\168\173\168\225\226\224\160\226\174\224"] = true, -- Administrator in cp866 - ["Administrator"] = true, - } - local result = {} - local fd = assert(io.popen("wmic UserAccount get name")) - for user in fd:lines() do - user = user:gsub("%s+$", "") - if not exclude[user] then - table.insert(result, user) - end - end - return result -end - ---- Set permissions for file or directory --- @param filename string: filename whose permissions are to be modified --- @param mode string ("read" or "exec"): permission to set --- @param scope string ("user" or "all"): the user(s) to whom the permission applies --- @return boolean or (boolean, string): true on success, false on failure, --- plus an error message -function tools.set_permissions(filename, mode, scope) - assert(filename and mode and scope) - - if scope == "user" then - local perms - if mode == "read" then - perms = "(R,W,M)" - elseif mode == "exec" then - perms = "(F)" - end - - local ok - -- Take ownership of the given file - ok = fs.execute_quiet("takeown /f " .. fs.Q(filename)) - if not ok then - return false, "Could not take ownership of the given file" - end - local username = os.getenv('USERNAME') - -- Grant the current user the proper rights - ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /inheritance:d /grant:r " .. fs.Q(username) .. ":" .. perms) - if not ok then - return false, "Failed setting permission " .. mode .. " for " .. scope - end - -- Finally, remove all the other users from the ACL in order to deny them access to the file - for _, user in pairs(get_system_users()) do - if username ~= user then - local ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /remove " .. fs.Q(user)) - if not ok then - return false, "Failed setting permission " .. mode .. " for " .. scope - end - end - end - elseif scope == "all" then - local my_perms, others_perms - if mode == "read" then - my_perms = "(R,W,M)" - others_perms = "(R)" - elseif mode == "exec" then - my_perms = "(F)" - others_perms = "(RX)" - end - - local ok - -- Grant permissions available to all users - ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /inheritance:d /grant:r *S-1-1-0:" .. others_perms) - if not ok then - return false, "Failed setting permission " .. mode .. " for " .. scope - end - - -- Grant permissions available only to the current user - ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /inheritance:d /grant \"%USERNAME%\":" .. my_perms) - - -- This may not be necessary if the above syntax is correct, - -- but I couldn't really test the extra quotes above, so if that - -- fails we try again with the syntax used in previous releases - -- just to be on the safe side - if not ok then - ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /inheritance:d /grant %USERNAME%:" .. my_perms) - end - - if not ok then - return false, "Failed setting permission " .. mode .. " for " .. scope - end - end - - return true -end - -function tools.browser(url) - return fs.execute(cfg.web_browser..' "Starting docs..." '..fs.Q(url)) -end - --- Set access and modification times for a file. --- @param filename File to set access and modification times for. --- @param time may be a string or number containing the format returned --- by os.time, or a table ready to be processed via os.time; if --- nil, current time is assumed. -function tools.set_time(filename, time) - return true -- FIXME -end - -return tools diff --git a/.luarocks/share/lua/5.1/luarocks/fun.lua b/.luarocks/share/lua/5.1/luarocks/fun.lua deleted file mode 100644 index 80bf7c206..000000000 --- a/.luarocks/share/lua/5.1/luarocks/fun.lua +++ /dev/null @@ -1,143 +0,0 @@ - ---- A set of basic functional utilities -local fun = {} - -local unpack = table.unpack or unpack - -function fun.concat(xs, ys) - local rs = {} - local n = #xs - for i = 1, n do - rs[i] = xs[i] - end - for i = 1, #ys do - rs[i + n] = ys[i] - end - return rs -end - -function fun.contains(xs, v) - for _, x in ipairs(xs) do - if v == x then - return true - end - end - return false -end - -function fun.map(xs, f) - local rs = {} - for i = 1, #xs do - rs[i] = f(xs[i]) - end - return rs -end - -function fun.filter(xs, f) - local rs = {} - for i = 1, #xs do - local v = xs[i] - if f(v) then - rs[#rs+1] = v - end - end - return rs -end - -function fun.traverse(t, f) - return fun.map(t, function(x) - return type(x) == "table" and fun.traverse(x, f) or f(x) - end) -end - -function fun.reverse_in(t) - for i = 1, math.floor(#t/2) do - local m, n = i, #t - i + 1 - local a, b = t[m], t[n] - t[m] = b - t[n] = a - end - return t -end - -function fun.sort_in(t, f) - table.sort(t, f) - return t -end - -function fun.flip(f) - return function(a, b) - return f(b, a) - end -end - -function fun.find(xs, f) - if type(xs) == "function" then - for v in xs do - local x = f(v) - if x then - return x - end - end - elseif type(xs) == "table" then - for _, v in ipairs(xs) do - local x = f(v) - if x then - return x - end - end - end -end - -function fun.partial(f, ...) - local n = select("#", ...) - if n == 1 then - local a = ... - return function(...) - return f(a, ...) - end - elseif n == 2 then - local a, b = ... - return function(...) - return f(a, b, ...) - end - else - local pargs = { n = n, ... } - return function(...) - local m = select("#", ...) - local fargs = { ... } - local args = {} - for i = 1, n do - args[i] = pargs[i] - end - for i = 1, m do - args[i+n] = fargs[i] - end - return f(unpack(args, 1, n+m)) - end - end -end - -function fun.memoize(fn) - local memory = setmetatable({}, { __mode = "k" }) - local errors = setmetatable({}, { __mode = "k" }) - local NIL = {} - return function(arg) - if memory[arg] then - if memory[arg] == NIL then - return nil, errors[arg] - end - return memory[arg] - end - local ret1, ret2 = fn(arg) - if ret1 ~= nil then - memory[arg] = ret1 - else - memory[arg] = NIL - errors[arg] = ret2 - end - return ret1, ret2 - end -end - -return fun diff --git a/.luarocks/share/lua/5.1/luarocks/loader.lua b/.luarocks/share/lua/5.1/luarocks/loader.lua deleted file mode 100644 index 772fdfcb4..000000000 --- a/.luarocks/share/lua/5.1/luarocks/loader.lua +++ /dev/null @@ -1,269 +0,0 @@ ---- A module which installs a Lua package loader that is LuaRocks-aware. --- This loader uses dependency information from the LuaRocks tree to load --- correct versions of modules. It does this by constructing a "context" --- table in the environment, which records which versions of packages were --- used to load previous modules, so that the loader chooses versions --- that are declared to be compatible with the ones loaded earlier. - --- luacheck: globals luarocks - -local loaders = package.loaders or package.searchers -local require, ipairs, table, type, next, tostring, error = - require, ipairs, table, type, next, tostring, error -local unpack = unpack or table.unpack - -local loader = {} - -local is_clean = not package.loaded["luarocks.core.cfg"] - --- This loader module depends only on core modules. -local cfg = require("luarocks.core.cfg") -local cfg_ok, err = cfg.init() -if cfg_ok then - cfg.init_package_paths() -end - -local path = require("luarocks.core.path") -local manif = require("luarocks.core.manif") -local vers = require("luarocks.core.vers") -local require = nil -- luacheck: ignore 411 --------------------------------------------------------------------------------- - --- Workaround for wrappers produced by older versions of LuaRocks -local temporary_global = false -local status, luarocks_value = pcall(function() return luarocks end) -if status and luarocks_value then - -- The site_config.lua file generated by old versions uses module(), - -- so it produces a global `luarocks` table. Since we have the table, - -- add the `loader` field to make the old wrappers happy. - luarocks.loader = loader -else - -- When a new version is installed on top of an old version, - -- site_config.lua may be replaced, and then it no longer creates - -- a global. - -- Detect when being called via -lluarocks.loader; this is - -- most likely a wrapper. - local info = debug and debug.getinfo(2, "nS") - if info and info.what == "C" and not info.name then - luarocks = { loader = loader } - temporary_global = true - -- For the other half of this hack, - -- see the next use of `temporary_global` below. - end -end - -loader.context = {} - ---- Process the dependencies of a package to determine its dependency --- chain for loading modules. --- @param name string: The name of an installed rock. --- @param version string: The version of the rock, in string format -function loader.add_context(name, version) - -- assert(type(name) == "string") - -- assert(type(version) == "string") - - if temporary_global then - -- The first thing a wrapper does is to call add_context. - -- From here on, it's safe to clean the global environment. - luarocks = nil - temporary_global = false - end - - local tree_manifests = manif.load_rocks_tree_manifests() - if not tree_manifests then - return nil - end - - return manif.scan_dependencies(name, version, tree_manifests, loader.context) -end - ---- Internal sorting function. --- @param a table: A provider table. --- @param b table: Another provider table. --- @return boolean: True if the version of a is greater than that of b. -local function sort_versions(a,b) - return a.version > b.version -end - ---- Request module to be loaded through other loaders, --- once the proper name of the module has been determined. --- For example, in case the module "socket.core" has been requested --- to the LuaRocks loader and it determined based on context that --- the version 2.0.2 needs to be loaded and it is not the current --- version, the module requested for the other loaders will be --- "socket.core_2_0_2". --- @param module The module name requested by the user, such as "socket.core" --- @param name The rock name, such as "luasocket" --- @param version The rock version, such as "2.0.2-1" --- @param module_name The actual module name, such as "socket.core" or "socket.core_2_0_2". --- @return table or (nil, string): The module table as returned by some other loader, --- or nil followed by an error message if no other loader managed to load the module. -local function call_other_loaders(module, name, version, module_name) - for _, a_loader in ipairs(loaders) do - if a_loader ~= loader.luarocks_loader then - local results = { a_loader(module_name) } - if type(results[1]) == "function" then - return unpack(results) - end - end - end - return "Failed loading module "..module.." in LuaRocks rock "..name.." "..version -end - -local function add_providers(providers, entries, tree, module, filter_file_name) - for i, entry in ipairs(entries) do - local name, version = entry:match("^([^/]*)/(.*)$") - local file_name = tree.manifest.repository[name][version][1].modules[module] - if type(file_name) ~= "string" then - error("Invalid data in manifest file for module "..tostring(module).." (invalid data for "..tostring(name).." "..tostring(version)..")") - end - file_name = filter_file_name(file_name, name, version, tree.tree, i) - if loader.context[name] == version then - return name, version, file_name - end - version = vers.parse_version(version) - table.insert(providers, {name = name, version = version, module_name = file_name, tree = tree}) - end -end - ---- Search for a module in the rocks trees --- @param module string: module name (eg. "socket.core") --- @param filter_file_name function(string, string, string, string, number): --- a function that takes the module file name (eg "socket/core.so"), the rock name --- (eg "luasocket"), the version (eg "2.0.2-1"), the path of the rocks tree --- (eg "/usr/local"), and the numeric index of the matching entry, so the --- filter function can know if the matching module was the first entry or not. --- @return string, string, string, (string or table): --- * name of the rock containing the module (eg. "luasocket") --- * version of the rock (eg. "2.0.2-1") --- * return value of filter_file_name --- * tree of the module (string or table in `tree_manifests` format) -local function select_module(module, filter_file_name) - --assert(type(module) == "string") - --assert(type(filter_module_name) == "function") - - local tree_manifests = manif.load_rocks_tree_manifests() - if not tree_manifests then - return nil - end - - local providers = {} - local initmodule - for _, tree in ipairs(tree_manifests) do - local entries = tree.manifest.modules[module] - if entries then - local n, v, f = add_providers(providers, entries, tree, module, filter_file_name) - if n then - return n, v, f - end - else - initmodule = initmodule or module .. ".init" - entries = tree.manifest.modules[initmodule] - if entries then - local n, v, f = add_providers(providers, entries, tree, initmodule, filter_file_name) - if n then - return n, v, f - end - end - end - end - - if next(providers) then - table.sort(providers, sort_versions) - local first = providers[1] - return first.name, first.version.string, first.module_name, first.tree - end -end - ---- Search for a module --- @param module string: module name (eg. "socket.core") --- @return string, string, string, (string or table): --- * name of the rock containing the module (eg. "luasocket") --- * version of the rock (eg. "2.0.2-1") --- * name of the module (eg. "socket.core", or "socket.core_2_0_2" if file is stored versioned). --- * tree of the module (string or table in `tree_manifests` format) -local function pick_module(module) - return - select_module(module, function(file_name, name, version, tree, i) - if i > 1 then - file_name = path.versioned_name(file_name, "", name, version) - end - return path.path_to_module(file_name) - end) -end - ---- Return the pathname of the file that would be loaded for a module. --- @param module string: module name (eg. "socket.core") --- @param where string: places to look for the module. If `where` contains --- "l", it will search using the LuaRocks loader; if it contains "p", --- it will look in the filesystem using package.path and package.cpath. --- You can use both at the same time. --- @return If successful, it will return four values. --- * If found using the LuaRocks loader, it will return: --- * filename of the module (eg. "/usr/local/lib/lua/5.1/socket/core.so"), --- * rock name --- * rock version --- * "l" to indicate the match comes from the loader. --- * If found scanning package.path and package.cpath, it will return: --- * filename of the module (eg. "/usr/local/lib/lua/5.1/socket/core.so"), --- * "path" or "cpath" --- * nil --- * "p" to indicate the match comes from scanning package.path and cpath. --- If unsuccessful, nothing is returned. -function loader.which(module, where) - where = where or "l" - if where:match("l") then - local rock_name, rock_version, file_name = select_module(module, path.which_i) - if rock_name then - local fd = io.open(file_name) - if fd then - fd:close() - return file_name, rock_name, rock_version, "l" - end - end - end - if where:match("p") then - local modpath = module:gsub("%.", "/") - for _, v in ipairs({"path", "cpath"}) do - for p in package[v]:gmatch("([^;]+)") do - local file_name = p:gsub("%?", modpath) -- luacheck: ignore 421 - local fd = io.open(file_name) - if fd then - fd:close() - return file_name, v, nil, "p" - end - end - end - end -end - ---- Package loader for LuaRocks support. --- A module is searched in installed rocks that match the --- current LuaRocks context. If module is not part of the --- context, or if a context has not yet been set, the module --- in the package with the highest version is used. --- @param module string: The module name, like in plain require(). --- @return table: The module table (typically), like in plain --- require(). See require() --- in the Lua reference manual for details. -function loader.luarocks_loader(module) - local name, version, module_name = pick_module(module) - if not name then - return "No LuaRocks module found for "..module - else - loader.add_context(name, version) - return call_other_loaders(module, name, version, module_name) - end -end - -table.insert(loaders, 1, loader.luarocks_loader) - -if is_clean then - for modname, _ in pairs(package.loaded) do - if modname:match("^luarocks%.") then - package.loaded[modname] = nil - end - end -end - -return loader diff --git a/.luarocks/share/lua/5.1/luarocks/manif.lua b/.luarocks/share/lua/5.1/luarocks/manif.lua deleted file mode 100644 index a4ddda11e..000000000 --- a/.luarocks/share/lua/5.1/luarocks/manif.lua +++ /dev/null @@ -1,225 +0,0 @@ ---- Module for handling manifest files and tables. --- Manifest files describe the contents of a LuaRocks tree or server. --- They are loaded into manifest tables, which are then used for --- performing searches, matching dependencies, etc. -local manif = {} - -local core = require("luarocks.core.manif") -local persist = require("luarocks.persist") -local fetch = require("luarocks.fetch") -local dir = require("luarocks.dir") -local fs = require("luarocks.fs") -local cfg = require("luarocks.core.cfg") -local path = require("luarocks.path") -local util = require("luarocks.util") -local queries = require("luarocks.queries") -local type_manifest = require("luarocks.type.manifest") - -manif.cache_manifest = core.cache_manifest -manif.load_rocks_tree_manifests = core.load_rocks_tree_manifests -manif.scan_dependencies = core.scan_dependencies - -manif.rock_manifest_cache = {} - -local function check_manifest(repo_url, manifest, globals) - local ok, err = type_manifest.check(manifest, globals) - if not ok then - core.cache_manifest(repo_url, cfg.lua_version, nil) - return nil, "Error checking manifest: "..err, "type" - end - return manifest -end - -local postprocess_dependencies -do - local postprocess_check = setmetatable({}, { __mode = "k" }) - postprocess_dependencies = function(manifest) - if postprocess_check[manifest] then - return - end - if manifest.dependencies then - for name, versions in pairs(manifest.dependencies) do - for version, entries in pairs(versions) do - for k, v in pairs(entries) do - entries[k] = queries.from_persisted_table(v) - end - end - end - end - postprocess_check[manifest] = true - end -end - -function manif.load_rock_manifest(name, version, root) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - local name_version = name.."/"..version - if manif.rock_manifest_cache[name_version] then - return manif.rock_manifest_cache[name_version].rock_manifest - end - local pathname = path.rock_manifest_file(name, version, root) - local rock_manifest = persist.load_into_table(pathname) - if not rock_manifest then - return nil, "rock_manifest file not found for "..name.." "..version.." - not a LuaRocks tree?" - end - manif.rock_manifest_cache[name_version] = rock_manifest - return rock_manifest.rock_manifest -end - ---- Load a local or remote manifest describing a repository. --- All functions that use manifest tables assume they were obtained --- through this function. --- @param repo_url string: URL or pathname for the repository. --- @param lua_version string: Lua version in "5.x" format, defaults to installed version. --- @param versioned_only boolean: If true, do not fall back to the main manifest --- if a versioned manifest was not found. --- @return table or (nil, string, [string]): A table representing the manifest, --- or nil followed by an error message and an optional error code. -function manif.load_manifest(repo_url, lua_version, versioned_only) - assert(type(repo_url) == "string") - assert(type(lua_version) == "string" or not lua_version) - lua_version = lua_version or cfg.lua_version - - local cached_manifest = core.get_cached_manifest(repo_url, lua_version) - if cached_manifest then - postprocess_dependencies(cached_manifest) - return cached_manifest - end - - local filenames = { - "manifest-"..lua_version..".zip", - "manifest-"..lua_version, - not versioned_only and "manifest" or nil, - } - - local protocol, repodir = dir.split_url(repo_url) - local pathname, from_cache - if protocol == "file" then - for _, filename in ipairs(filenames) do - pathname = dir.path(repodir, filename) - if fs.exists(pathname) then - break - end - end - else - local err, errcode - for _, filename in ipairs(filenames) do - pathname, err, errcode, from_cache = fetch.fetch_caching(dir.path(repo_url, filename), "no_mirror") - if pathname then - break - end - end - if not pathname then - return nil, err, errcode - end - end - if pathname:match(".*%.zip$") then - pathname = fs.absolute_name(pathname) - local nozip = pathname:match("(.*)%.zip$") - if not from_cache then - local dirname = dir.dir_name(pathname) - fs.change_dir(dirname) - fs.delete(nozip) - local ok, err = fs.unzip(pathname) - fs.pop_dir() - if not ok then - fs.delete(pathname) - fs.delete(pathname..".timestamp") - return nil, "Failed extracting manifest file: " .. err - end - end - pathname = nozip - end - local manifest, err, errcode = core.manifest_loader(pathname, repo_url, lua_version) - if not manifest then - return nil, err, errcode - end - - postprocess_dependencies(manifest) - return check_manifest(repo_url, manifest, err) -end - ---- Get type and name of an item (a module or a command) provided by a file. --- @param deploy_type string: rock manifest subtree the file comes from ("bin", "lua", or "lib"). --- @param file_path string: path to the file relatively to deploy_type subdirectory. --- @return (string, string): item type ("module" or "command") and name. -function manif.get_provided_item(deploy_type, file_path) - assert(type(deploy_type) == "string") - assert(type(file_path) == "string") - local item_type = deploy_type == "bin" and "command" or "module" - local item_name = item_type == "command" and file_path or path.path_to_module(file_path) - return item_type, item_name -end - -local function get_providers(item_type, item_name, repo) - assert(type(item_type) == "string") - assert(type(item_name) == "string") - local rocks_dir = path.rocks_dir(repo or cfg.root_dir) - local manifest = manif.load_manifest(rocks_dir) - return manifest and manifest[item_type .. "s"][item_name] -end - ---- Given a name of a module or a command, figure out which rock name and version --- correspond to it in the rock tree manifest. --- @param item_type string: "module" or "command". --- @param item_name string: module or command name. --- @param root string or nil: A local root dir for a rocks tree. If not given, the default is used. --- @return (string, string) or nil: name and version of the provider rock or nil if there --- is no provider. -function manif.get_current_provider(item_type, item_name, repo) - local providers = get_providers(item_type, item_name, repo) - if providers then - return providers[1]:match("([^/]*)/([^/]*)") - end -end - -function manif.get_next_provider(item_type, item_name, repo) - local providers = get_providers(item_type, item_name, repo) - if providers and providers[2] then - return providers[2]:match("([^/]*)/([^/]*)") - end -end - ---- Get all versions of a package listed in a manifest file. --- @param name string: a package name. --- @param deps_mode string: "one", to use only the currently --- configured tree; "order" to select trees based on order --- (use the current tree and all trees below it on the list) --- or "all", to use all trees. --- @return table: An array of strings listing installed --- versions of a package, and a table indicating where they are found. -function manif.get_versions(dep, deps_mode) - assert(type(dep) == "table") - assert(type(deps_mode) == "string") - - local name = dep.name - local namespace = dep.namespace - - local version_set = {} - path.map_trees(deps_mode, function(tree) - local manifest = manif.load_manifest(path.rocks_dir(tree)) - - if manifest and manifest.repository[name] then - for version in pairs(manifest.repository[name]) do - if dep.namespace then - local ns_file = path.rock_namespace_file(name, version, tree) - local fd = io.open(ns_file, "r") - if fd then - local ns = fd:read("*a") - fd:close() - if ns == namespace then - version_set[version] = tree - end - end - else - version_set[version] = tree - end - end - end - end) - - return util.keys(version_set), version_set -end - -return manif diff --git a/.luarocks/share/lua/5.1/luarocks/manif/writer.lua b/.luarocks/share/lua/5.1/luarocks/manif/writer.lua deleted file mode 100644 index a435d29ed..000000000 --- a/.luarocks/share/lua/5.1/luarocks/manif/writer.lua +++ /dev/null @@ -1,494 +0,0 @@ - -local writer = {} - -local cfg = require("luarocks.core.cfg") -local search = require("luarocks.search") -local repos = require("luarocks.repos") -local deps = require("luarocks.deps") -local vers = require("luarocks.core.vers") -local fs = require("luarocks.fs") -local util = require("luarocks.util") -local dir = require("luarocks.dir") -local fetch = require("luarocks.fetch") -local path = require("luarocks.path") -local persist = require("luarocks.persist") -local manif = require("luarocks.manif") -local queries = require("luarocks.queries") - ---- Update storage table to account for items provided by a package. --- @param storage table: a table storing items in the following format: --- keys are item names and values are arrays of packages providing each item, --- where a package is specified as string `name/version`. --- @param items table: a table mapping item names to paths. --- @param name string: package name. --- @param version string: package version. -local function store_package_items(storage, name, version, items) - assert(type(storage) == "table") - assert(type(items) == "table") - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - local package_identifier = name.."/"..version - - for item_name, path in pairs(items) do -- luacheck: ignore 431 - if not storage[item_name] then - storage[item_name] = {} - end - - table.insert(storage[item_name], package_identifier) - end -end - ---- Update storage table removing items provided by a package. --- @param storage table: a table storing items in the following format: --- keys are item names and values are arrays of packages providing each item, --- where a package is specified as string `name/version`. --- @param items table: a table mapping item names to paths. --- @param name string: package name. --- @param version string: package version. -local function remove_package_items(storage, name, version, items) - assert(type(storage) == "table") - assert(type(items) == "table") - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - local package_identifier = name.."/"..version - - for item_name, path in pairs(items) do -- luacheck: ignore 431 - local key = item_name - local all_identifiers = storage[key] - if not all_identifiers then - key = key .. ".init" - all_identifiers = storage[key] - end - - if all_identifiers then - for i, identifier in ipairs(all_identifiers) do - if identifier == package_identifier then - table.remove(all_identifiers, i) - break - end - end - - if #all_identifiers == 0 then - storage[key] = nil - end - else - util.warning("Cannot find entry for " .. item_name .. " in manifest -- corrupted manifest?") - end - end -end - ---- Process the dependencies of a manifest table to determine its dependency --- chains for loading modules. The manifest dependencies information is filled --- and any dependency inconsistencies or missing dependencies are reported to --- standard error. --- @param manifest table: a manifest table. --- @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. -local function update_dependencies(manifest, deps_mode) - assert(type(manifest) == "table") - assert(type(deps_mode) == "string") - - for pkg, versions in pairs(manifest.repository) do - for version, repositories in pairs(versions) do - for _, repo in ipairs(repositories) do - if repo.arch == "installed" then - repo.dependencies = {} - deps.scan_deps(repo.dependencies, manifest, pkg, version, deps_mode) - repo.dependencies[pkg] = nil - end - end - end - end -end - - - ---- Sort function for ordering rock identifiers in a manifest's --- modules table. Rocks are ordered alphabetically by name, and then --- by version which greater first. --- @param a string: Version to compare. --- @param b string: Version to compare. --- @return boolean: The comparison result, according to the --- rule outlined above. -local function sort_pkgs(a, b) - assert(type(a) == "string") - assert(type(b) == "string") - - local na, va = a:match("(.*)/(.*)$") - local nb, vb = b:match("(.*)/(.*)$") - - return (na == nb) and vers.compare_versions(va, vb) or na < nb -end - ---- Sort items of a package matching table by version number (higher versions first). --- @param tbl table: the package matching table: keys should be strings --- and values arrays of strings with packages names in "name/version" format. -local function sort_package_matching_table(tbl) - assert(type(tbl) == "table") - - if next(tbl) then - for item, pkgs in pairs(tbl) do - if #pkgs > 1 then - table.sort(pkgs, sort_pkgs) - -- Remove duplicates from the sorted array. - local prev = nil - local i = 1 - while pkgs[i] do - local curr = pkgs[i] - if curr == prev then - table.remove(pkgs, i) - else - prev = curr - i = i + 1 - end - end - end - end - end -end - ---- Filter manifest table by Lua version, removing rockspecs whose Lua version --- does not match. --- @param manifest table: a manifest table. --- @param lua_version string or nil: filter by Lua version --- @param repodir string: directory of repository being scanned --- @param cache table: temporary rockspec cache table -local function filter_by_lua_version(manifest, lua_version, repodir, cache) - assert(type(manifest) == "table") - assert(type(repodir) == "string") - assert((not cache) or type(cache) == "table") - - cache = cache or {} - lua_version = vers.parse_version(lua_version) - for pkg, versions in pairs(manifest.repository) do - local to_remove = {} - for version, repositories in pairs(versions) do - for _, repo in ipairs(repositories) do - if repo.arch == "rockspec" then - local pathname = dir.path(repodir, pkg.."-"..version..".rockspec") - local rockspec, err = cache[pathname] - if not rockspec then - rockspec, err = fetch.load_local_rockspec(pathname, true) - end - if rockspec then - cache[pathname] = rockspec - for _, dep in ipairs(rockspec.dependencies) do - if dep.name == "lua" then - if not vers.match_constraints(lua_version, dep.constraints) then - table.insert(to_remove, version) - end - break - end - end - else - util.printerr("Error loading rockspec for "..pkg.." "..version..": "..err) - end - end - end - end - if next(to_remove) then - for _, incompat in ipairs(to_remove) do - versions[incompat] = nil - end - if not next(versions) then - manifest.repository[pkg] = nil - end - end - end -end - ---- Store search results in a manifest table. --- @param results table: The search results as returned by search.disk_search. --- @param manifest table: A manifest table (must contain repository, modules, commands tables). --- It will be altered to include the search results. --- @return boolean or (nil, string): true in case of success, or nil followed by an error message. -local function store_results(results, manifest) - assert(type(results) == "table") - assert(type(manifest) == "table") - - for name, versions in pairs(results) do - local pkgtable = manifest.repository[name] or {} - for version, entries in pairs(versions) do - local versiontable = {} - for _, entry in ipairs(entries) do - local entrytable = {} - entrytable.arch = entry.arch - if entry.arch == "installed" then - local rock_manifest, err = manif.load_rock_manifest(name, version) - if not rock_manifest then return nil, err end - - entrytable.modules = repos.package_modules(name, version) - store_package_items(manifest.modules, name, version, entrytable.modules) - entrytable.commands = repos.package_commands(name, version) - store_package_items(manifest.commands, name, version, entrytable.commands) - end - table.insert(versiontable, entrytable) - end - pkgtable[version] = versiontable - end - manifest.repository[name] = pkgtable - end - sort_package_matching_table(manifest.modules) - sort_package_matching_table(manifest.commands) - return true -end - ---- Commit a table to disk in given local path. --- @param where string: The directory where the table should be saved. --- @param name string: The filename. --- @param tbl table: The table to be saved. --- @return boolean or (nil, string): true if successful, or nil and a --- message in case of errors. -local function save_table(where, name, tbl) - assert(type(where) == "string") - assert(type(name) == "string" and not name:match("/")) - assert(type(tbl) == "table") - - local filename = dir.path(where, name) - local ok, err = persist.save_from_table(filename..".tmp", tbl) - if ok then - ok, err = fs.replace_file(filename, filename..".tmp") - end - return ok, err -end - -function writer.make_rock_manifest(name, version) - local install_dir = path.install_dir(name, version) - local tree = {} - for _, file in ipairs(fs.find(install_dir)) do - local full_path = dir.path(install_dir, file) - local walk = tree - local last - local last_name - for filename in file:gmatch("[^/]+") do - local next = walk[filename] - if not next then - next = {} - walk[filename] = next - end - last = walk - last_name = filename - walk = next - end - if fs.is_file(full_path) then - local sum, err = fs.get_md5(full_path) - if not sum then - return nil, "Failed producing checksum: "..tostring(err) - end - last[last_name] = sum - end - end - local rock_manifest = { rock_manifest=tree } - manif.rock_manifest_cache[name.."/"..version] = rock_manifest - save_table(install_dir, "rock_manifest", rock_manifest ) - return true -end - --- Writes a 'rock_namespace' file in a locally installed rock directory. --- @param name string: the rock name, without a namespace --- @param version string: the rock version --- @param namespace string?: the namespace --- @return true if successful (or unnecessary, if there is no namespace), --- or nil and an error message. -function writer.make_namespace_file(name, version, namespace) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - assert(type(namespace) == "string" or not namespace) - if not namespace then - return true - end - local fd, err = io.open(path.rock_namespace_file(name, version), "w") - if not fd then - return nil, err - end - local ok, err = fd:write(namespace) - if not ok then - return nil, err - end - fd:close() - return true -end - ---- Scan a LuaRocks repository and output a manifest file. --- A file called 'manifest' will be written in the root of the given --- repository directory. --- @param repo A local repository directory. --- @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 the default dependency mode from the configuration. --- @param remote boolean: 'true' if making a manifest for a rocks server. --- @return boolean or (nil, string): True if manifest was generated, --- or nil and an error message. -function writer.make_manifest(repo, deps_mode, remote) - assert(type(repo) == "string") - assert(type(deps_mode) == "string") - - if deps_mode == "none" then deps_mode = cfg.deps_mode end - - if not fs.is_dir(repo) then - return nil, "Cannot access repository at "..repo - end - - local query = queries.all("any") - local results = search.disk_search(repo, query) - local manifest = { repository = {}, modules = {}, commands = {} } - - manif.cache_manifest(repo, nil, manifest) - - local ok, err = store_results(results, manifest) - if not ok then return nil, err end - - if remote then - local cache = {} - for luaver in util.lua_versions() do - local vmanifest = { repository = {}, modules = {}, commands = {} } - local ok, err = store_results(results, vmanifest) - filter_by_lua_version(vmanifest, luaver, repo, cache) - if not cfg.no_manifest then - save_table(repo, "manifest-"..luaver, vmanifest) - end - end - else - update_dependencies(manifest, deps_mode) - end - - if cfg.no_manifest then - -- We want to have cache updated; but exit before save_table is called - return true - end - return save_table(repo, "manifest", manifest) -end - ---- Update manifest file for a local repository --- adding information about a version of a package installed in that repository. --- @param name string: Name of a package from the repository. --- @param version string: Version of a package from the repository. --- @param repo string or nil: Pathname of a local repository. If not given, --- the default local repository is used. --- @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 using the default dependency mode from the configuration. --- @return boolean or (nil, string): True if manifest was updated successfully, --- or nil and an error message. -function writer.add_to_manifest(name, version, repo, deps_mode) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - local rocks_dir = path.rocks_dir(repo or cfg.root_dir) - assert(type(deps_mode) == "string") - - if deps_mode == "none" then deps_mode = cfg.deps_mode end - - local manifest, err = manif.load_manifest(rocks_dir) - if not manifest then - util.printerr("No existing manifest. Attempting to rebuild...") - -- Manifest built by `writer.make_manifest` should already - -- include information about given name and version, - -- no need to update it. - return writer.make_manifest(rocks_dir, deps_mode) - end - - local results = {[name] = {[version] = {{arch = "installed", repo = rocks_dir}}}} - - local ok, err = store_results(results, manifest) - if not ok then return nil, err end - - update_dependencies(manifest, deps_mode) - - if cfg.no_manifest then - return true - end - return save_table(rocks_dir, "manifest", manifest) -end - ---- Update manifest file for a local repository --- removing information about a version of a package. --- @param name string: Name of a package removed from the repository. --- @param version string: Version of a package removed from the repository. --- @param repo string or nil: Pathname of a local repository. If not given, --- the default local repository is used. --- @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 using the default dependency mode from the configuration. --- @return boolean or (nil, string): True if manifest was updated successfully, --- or nil and an error message. -function writer.remove_from_manifest(name, version, repo, deps_mode) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - local rocks_dir = path.rocks_dir(repo or cfg.root_dir) - assert(type(deps_mode) == "string") - - if deps_mode == "none" then deps_mode = cfg.deps_mode end - - local manifest, err = manif.load_manifest(rocks_dir) - if not manifest then - util.printerr("No existing manifest. Attempting to rebuild...") - -- Manifest built by `writer.make_manifest` should already - -- include up-to-date information, no need to update it. - return writer.make_manifest(rocks_dir, deps_mode) - end - - local package_entry = manifest.repository[name] - if package_entry == nil or package_entry[version] == nil then - -- entry is already missing from repository, no need to do anything - return true - end - - local version_entry = package_entry[version][1] - if not version_entry then - -- manifest looks corrupted, rebuild - return writer.make_manifest(rocks_dir, deps_mode) - end - - remove_package_items(manifest.modules, name, version, version_entry.modules) - remove_package_items(manifest.commands, name, version, version_entry.commands) - - package_entry[version] = nil - manifest.dependencies[name][version] = nil - - if not next(package_entry) then - -- No more versions of this package. - manifest.repository[name] = nil - manifest.dependencies[name] = nil - end - - update_dependencies(manifest, deps_mode) - - if cfg.no_manifest then - return true - end - return save_table(rocks_dir, "manifest", manifest) -end - ---- Report missing dependencies for all rocks installed in a repository. --- @param repo string or nil: Pathname of a local repository. If not given, --- the default local repository is used. --- @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 using the default dependency mode from the configuration. -function writer.check_dependencies(repo, deps_mode) - local rocks_dir = path.rocks_dir(repo or cfg.root_dir) - assert(type(deps_mode) == "string") - if deps_mode == "none" then deps_mode = cfg.deps_mode end - - local manifest = manif.load_manifest(rocks_dir) - if not manifest then - return - end - - for name, versions in util.sortedpairs(manifest.repository) do - for version, version_entries in util.sortedpairs(versions, vers.compare_versions) do - for _, entry in ipairs(version_entries) do - if entry.arch == "installed" then - if manifest.dependencies[name] and manifest.dependencies[name][version] then - deps.report_missing_dependencies(name, version, manifest.dependencies[name][version], deps_mode, util.get_rocks_provided()) - end - end - end - end - end -end - -return writer diff --git a/.luarocks/share/lua/5.1/luarocks/pack.lua b/.luarocks/share/lua/5.1/luarocks/pack.lua deleted file mode 100644 index 5d70a854c..000000000 --- a/.luarocks/share/lua/5.1/luarocks/pack.lua +++ /dev/null @@ -1,183 +0,0 @@ - --- Create rock files, packing sources or binaries. -local pack = {} - -local unpack = unpack or table.unpack - -local queries = require("luarocks.queries") -local path = require("luarocks.path") -local repos = require("luarocks.repos") -local fetch = require("luarocks.fetch") -local fs = require("luarocks.fs") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local dir = require("luarocks.dir") -local manif = require("luarocks.manif") -local search = require("luarocks.search") -local signing = require("luarocks.signing") - ---- Create a source rock. --- Packages a rockspec and its required source files in a rock --- file with the .src.rock extension, which can later be built and --- installed with the "build" command. --- @param rockspec_file string: An URL or pathname for a rockspec file. --- @return string or (nil, string): The filename of the resulting --- .src.rock file; or nil and an error message. -function pack.pack_source_rock(rockspec_file) - assert(type(rockspec_file) == "string") - - local rockspec, err = fetch.load_rockspec(rockspec_file) - if err then - return nil, "Error loading rockspec: "..err - end - rockspec_file = rockspec.local_abs_filename - - local name_version = rockspec.name .. "-" .. rockspec.version - local rock_file = fs.absolute_name(name_version .. ".src.rock") - - local temp_dir, err = fs.make_temp_dir("pack-"..name_version) - if not temp_dir then - return nil, "Failed creating temporary directory: "..err - end - util.schedule_function(fs.delete, temp_dir) - - local source_file, source_dir = fetch.fetch_sources(rockspec, true, temp_dir) - if not source_file then - return nil, source_dir - end - local ok, err = fs.change_dir(source_dir) - if not ok then return nil, err end - - fs.delete(rock_file) - fs.copy(rockspec_file, source_dir, "read") - ok, err = fs.zip(rock_file, dir.base_name(rockspec_file), dir.base_name(source_file)) - if not ok then - return nil, "Failed packing "..rock_file.." - "..err - end - fs.pop_dir() - - return rock_file -end - -local function copy_back_files(name, version, file_tree, deploy_dir, pack_dir, perms) - local ok, err = fs.make_dir(pack_dir) - if not ok then return nil, err end - for file, sub in pairs(file_tree) do - local source = dir.path(deploy_dir, file) - local target = dir.path(pack_dir, file) - if type(sub) == "table" then - local ok, err = copy_back_files(name, version, sub, source, target) - if not ok then return nil, err end - else - local versioned = path.versioned_name(source, deploy_dir, name, version) - if fs.exists(versioned) then - fs.copy(versioned, target, perms) - else - fs.copy(source, target, perms) - end - end - end - return true -end - --- @param name string: Name of package to pack. --- @param version string or nil: A version number may also be passed. --- @param tree string or nil: An optional tree to pick the package from. --- @return string or (nil, string): The filename of the resulting --- .src.rock file; or nil and an error message. -function pack.pack_installed_rock(query, tree) - - local name, version, repo, repo_url = search.pick_installed_rock(query, tree) - if not name then - return nil, version - end - - local root = path.root_from_rocks_dir(repo_url) - local prefix = path.install_dir(name, version, root) - if not fs.exists(prefix) then - return nil, "'"..name.." "..version.."' does not seem to be an installed rock." - end - - local rock_manifest, err = manif.load_rock_manifest(name, version, root) - if not rock_manifest then return nil, err end - - local name_version = name .. "-" .. version - local rock_file = fs.absolute_name(name_version .. "."..cfg.arch..".rock") - - local temp_dir = fs.make_temp_dir("pack") - fs.copy_contents(prefix, temp_dir) - - local is_binary = false - if rock_manifest.lib then - local ok, err = copy_back_files(name, version, rock_manifest.lib, path.deploy_lib_dir(repo), dir.path(temp_dir, "lib"), "exec") - if not ok then return nil, "Failed copying back files: " .. err end - is_binary = true - end - if rock_manifest.lua then - local ok, err = copy_back_files(name, version, rock_manifest.lua, path.deploy_lua_dir(repo), dir.path(temp_dir, "lua"), "read") - if not ok then return nil, "Failed copying back files: " .. err end - end - - local ok, err = fs.change_dir(temp_dir) - if not ok then return nil, err end - if not is_binary and not repos.has_binaries(name, version) then - rock_file = rock_file:gsub("%."..cfg.arch:gsub("%-","%%-").."%.", ".all.") - end - fs.delete(rock_file) - if not fs.zip(rock_file, unpack(fs.list_dir())) then - return nil, "Failed packing "..rock_file - end - fs.pop_dir() - fs.delete(temp_dir) - return rock_file -end - -function pack.report_and_sign_local_file(file, err, sign) - if err then - return nil, err - end - local sigfile - if sign then - sigfile, err = signing.sign_file(file) - util.printout() - end - util.printout("Packed: "..file) - if sigfile then - util.printout("Signature stored in: "..sigfile) - end - if err then - return nil, err - end - return true -end - -function pack.pack_binary_rock(name, namespace, version, sign, cmd) - - -- The --pack-binary-rock option for "luarocks build" basically performs - -- "luarocks build" on a temporary tree and then "luarocks pack". The - -- alternative would require refactoring parts of luarocks.build and - -- luarocks.pack, which would save a few file operations: the idea would be - -- to shave off the final deploy steps from the build phase and the initial - -- collect steps from the pack phase. - - local temp_dir, err = fs.make_temp_dir("luarocks-build-pack-"..dir.base_name(name)) - if not temp_dir then - return nil, "Failed creating temporary directory: "..err - end - util.schedule_function(fs.delete, temp_dir) - - path.use_tree(temp_dir) - local ok, err = cmd() - if not ok then - return nil, err - end - local rname, rversion = path.parse_name(name) - if not rname then - rname, rversion = name, version - end - local query = queries.new(rname, namespace, rversion) - local file, err = pack.pack_installed_rock(query, temp_dir) - return pack.report_and_sign_local_file(file, err, sign) -end - -return pack diff --git a/.luarocks/share/lua/5.1/luarocks/path.lua b/.luarocks/share/lua/5.1/luarocks/path.lua deleted file mode 100644 index a9f04ef05..000000000 --- a/.luarocks/share/lua/5.1/luarocks/path.lua +++ /dev/null @@ -1,262 +0,0 @@ - ---- LuaRocks-specific path handling functions. --- All paths are configured in this module, making it a single --- point where the layout of the local installation is defined in LuaRocks. -local path = {} - -local core = require("luarocks.core.path") -local dir = require("luarocks.dir") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") - -path.rocks_dir = core.rocks_dir -path.versioned_name = core.versioned_name -path.path_to_module = core.path_to_module -path.deploy_lua_dir = core.deploy_lua_dir -path.deploy_lib_dir = core.deploy_lib_dir -path.map_trees = core.map_trees -path.rocks_tree_to_string = core.rocks_tree_to_string - ---- Infer rockspec filename from a rock filename. --- @param rock_name string: Pathname of a rock file. --- @return string: Filename of the rockspec, without path. -function path.rockspec_name_from_rock(rock_name) - assert(type(rock_name) == "string") - local base_name = dir.base_name(rock_name) - return base_name:match("(.*)%.[^.]*.rock") .. ".rockspec" -end - -function path.root_from_rocks_dir(rocks_dir) - assert(type(rocks_dir) == "string") - return rocks_dir:match("(.*)" .. util.matchquote(cfg.rocks_subdir) .. ".*$") -end - -function path.root_dir(tree) - if type(tree) == "string" then - return tree - else - assert(type(tree) == "table") - return tree.root - end -end - -function path.deploy_bin_dir(tree) - return dir.path(path.root_dir(tree), "bin") -end - -function path.manifest_file(tree) - return dir.path(path.rocks_dir(tree), "manifest") -end - ---- Get the directory for all versions of a package in a tree. --- @param name string: The package name. --- @return string: The resulting path -- does not guarantee that --- @param tree string or nil: If given, specifies the local tree to use. --- the package (and by extension, the path) exists. -function path.versions_dir(name, tree) - assert(type(name) == "string" and not name:match("/")) - return dir.path(path.rocks_dir(tree), name) -end - ---- Get the local installation directory (prefix) for a package. --- @param name string: The package name. --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the path) exists. -function path.install_dir(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version) -end - ---- Get the local filename of the rockspec of an installed rock. --- @param name string: The package name. --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the file) exists. -function path.rockspec_file(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version, name.."-"..version..".rockspec") -end - ---- Get the local filename of the rock_manifest file of an installed rock. --- @param name string: The package name. --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the file) exists. -function path.rock_manifest_file(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version, "rock_manifest") -end - ---- Get the local filename of the rock_namespace file of an installed rock. --- @param name string: The package name (without a namespace). --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the file) exists. -function path.rock_namespace_file(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version, "rock_namespace") -end - ---- Get the local installation directory for C libraries of a package. --- @param name string: The package name. --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the path) exists. -function path.lib_dir(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version, "lib") -end - ---- Get the local installation directory for Lua modules of a package. --- @param name string: The package name. --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the path) exists. -function path.lua_dir(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version, "lua") -end - ---- Get the local installation directory for documentation of a package. --- @param name string: The package name. --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the path) exists. -function path.doc_dir(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version, "doc") -end - ---- Get the local installation directory for configuration files of a package. --- @param name string: The package name. --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the path) exists. -function path.conf_dir(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version, "conf") -end - ---- Get the local installation directory for command-line scripts --- of a package. --- @param name string: The package name. --- @param version string: The package version. --- @param tree string or nil: If given, specifies the local tree to use. --- @return string: The resulting path -- does not guarantee that --- the package (and by extension, the path) exists. -function path.bin_dir(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - return dir.path(path.rocks_dir(tree), name, version, "bin") -end - ---- Extract name, version and arch of a rock filename, --- or name, version and "rockspec" from a rockspec name. --- @param file_name string: pathname of a rock or rockspec --- @return (string, string, string) or nil: name, version and arch --- or nil if name could not be parsed -function path.parse_name(file_name) - assert(type(file_name) == "string") - if file_name:match("%.rock$") then - return dir.base_name(file_name):match("(.*)-([^-]+-%d+)%.([^.]+)%.rock$") - else - return dir.base_name(file_name):match("(.*)-([^-]+-%d+)%.(rockspec)") - end -end - ---- Make a rockspec or rock URL. --- @param pathname string: Base URL or pathname. --- @param name string: Package name. --- @param version string: Package version. --- @param arch string: Architecture identifier, or "rockspec" or "installed". --- @return string: A URL or pathname following LuaRocks naming conventions. -function path.make_url(pathname, name, version, arch) - assert(type(pathname) == "string") - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - assert(type(arch) == "string") - - local filename = name.."-"..version - if arch == "installed" then - filename = dir.path(name, version, filename..".rockspec") - elseif arch == "rockspec" then - filename = filename..".rockspec" - else - filename = filename.."."..arch..".rock" - end - return dir.path(pathname, filename) -end - ---- Obtain the directory name where a module should be stored. --- For example, on Unix, "foo.bar.baz" will return "foo/bar". --- @param mod string: A module name in Lua dot-separated format. --- @return string: A directory name using the platform's separator. -function path.module_to_path(mod) - assert(type(mod) == "string") - return (mod:gsub("[^.]*$", ""):gsub("%.", "/")) -end - -function path.use_tree(tree) - cfg.root_dir = tree - cfg.rocks_dir = path.rocks_dir(tree) - cfg.deploy_bin_dir = path.deploy_bin_dir(tree) - cfg.deploy_lua_dir = path.deploy_lua_dir(tree) - cfg.deploy_lib_dir = path.deploy_lib_dir(tree) - - -- TODO Do we want LuaRocks itself to use whatever tree is in use? - -- package.path = dir.path(path.deploy_lua_dir(tree), "?.lua") .. ";" - -- .. dir.path(path.deploy_lua_dir(tree), "?/init.lua") .. ";" - -- .. package.path - -- package.cpath = dir.path(path.deploy_lib_dir(tree), "?." .. cfg.lib_extension) .. ";" - -- .. package.cpath -end - ---- Get the namespace of a locally-installed rock, if any. --- @param name string: The rock name, without a namespace. --- @param version string: The rock version. --- @param tree string: The local tree to use. --- @return string?: The namespace if it exists, or nil. -function path.read_namespace(name, version, tree) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - assert(type(tree) == "string") - - local namespace - local fd = io.open(path.rock_namespace_file(name, version, tree), "r") - if fd then - namespace = fd:read("*a") - fd:close() - end - return namespace -end - -function path.package_paths(deps_mode) - local lpaths = {} - local lcpaths = {} - path.map_trees(deps_mode, function(tree) - local root = path.root_dir(tree) - table.insert(lpaths, dir.path(root, cfg.lua_modules_path, "?.lua")) - table.insert(lpaths, dir.path(root, cfg.lua_modules_path, "?/init.lua")) - table.insert(lcpaths, dir.path(root, cfg.lib_modules_path, "?." .. cfg.lib_extension)) - end) - return table.concat(lpaths, ";"), table.concat(lcpaths, ";") -end - -return path diff --git a/.luarocks/share/lua/5.1/luarocks/persist.lua b/.luarocks/share/lua/5.1/luarocks/persist.lua deleted file mode 100644 index 02c5016ca..000000000 --- a/.luarocks/share/lua/5.1/luarocks/persist.lua +++ /dev/null @@ -1,257 +0,0 @@ - ---- Utility module for loading files into tables and --- saving tables into files. -local persist = {} - -local core = require("luarocks.core.persist") -local util = require("luarocks.util") -local dir = require("luarocks.dir") -local fs = require("luarocks.fs") - -persist.run_file = core.run_file -persist.load_into_table = core.load_into_table - -local write_table - ---- 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 --- @see write_table -function persist.write_value(out, v, level, sub_order) - if type(v) == "table" then - level = level or 0 - write_table(out, v, level + 1, sub_order) - elseif type(v) == "string" then - if v:match("[\r\n]") then - local open, close = "[[", "]]" - local equals = 0 - local v_with_bracket = v.."]" - while v_with_bracket: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(("%q"):format(v)) - end - else - out:write(tostring(v)) - end -end - -local is_valid_plain_key -do - local keywords = { - ["and"] = true, - ["break"] = true, - ["do"] = true, - ["else"] = true, - ["elseif"] = true, - ["end"] = true, - ["false"] = true, - ["for"] = true, - ["function"] = true, - ["goto"] = true, - ["if"] = true, - ["in"] = true, - ["local"] = true, - ["nil"] = true, - ["not"] = true, - ["or"] = true, - ["repeat"] = true, - ["return"] = true, - ["then"] = true, - ["true"] = true, - ["until"] = true, - ["while"] = true, - } - function is_valid_plain_key(k) - return type(k) == "string" - and k:match("^[a-zA-Z_][a-zA-Z0-9_]*$") - and not keywords[k] - end -end - -local function write_table_key_assignment(out, k, level) - if is_valid_plain_key(k) then - out:write(k) - else - out:write("[") - persist.write_value(out, k, level) - out:write("]") - end - - out:write(" = ") -end - ---- 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 -write_table = function(out, tbl, level, field_order) - out:write("{") - local sep = "\n" - local indentation = " " - local indent = true - local i = 1 - for k, v, sub_order in util.sortedpairs(tbl, field_order) do - out:write(sep) - if indent then - for _ = 1, level do out:write(indentation) end - end - - if k == i then - i = i + 1 - else - write_table_key_assignment(out, k, level) - end - - persist.write_value(out, v, level, sub_order) - if type(v) == "number" then - sep = ", " - indent = false - else - sep = ",\n" - indent = true - end - end - if sep ~= "\n" then - out:write("\n") - for _ = 1, level - 1 do out:write(indentation) end - end - out:write("}") -end - ---- 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 true if successful; nil and error message if failed. -local function write_table_as_assignments(out, tbl, field_order) - for k, v, sub_order in util.sortedpairs(tbl, field_order) do - if not is_valid_plain_key(k) then - return nil, "cannot store '"..tostring(k).."' as a plain key." - end - out:write(k.." = ") - persist.write_value(out, v, 0, sub_order) - out:write("\n") - end - return true -end - ---- Write a table using Lua table syntax to a writer object. --- @param out table or userdata: a writer object supporting :write() method. --- @param tbl table: the table to be written. -local function write_table_as_table(out, tbl) - out:write("return {\n") - for k, v, sub_order in util.sortedpairs(tbl) do - out:write(" ") - write_table_key_assignment(out, k, 1) - persist.write_value(out, v, 1, sub_order) - out:write(",\n") - end - out:write("}\n") -end - ---- Save the contents of a table to a string. --- Each element of the table is saved as a global assignment. --- Only numbers, strings and tables (containing numbers, strings --- or other recursively processed tables) are supported. --- @param tbl table: the table containing the data to be written --- @param field_order table: an optional array indicating the order of top-level fields. --- @return persisted data as string; or nil and an error message -function persist.save_from_table_to_string(tbl, field_order) - local out = {buffer = {}} - function out:write(data) table.insert(self.buffer, data) end - local ok, err = write_table_as_assignments(out, tbl, field_order) - if not ok then - return nil, err - end - return table.concat(out.buffer) -end - ---- Save the contents of a table in a file. --- Each element of the table is saved as a global assignment. --- Only numbers, strings and tables (containing numbers, strings --- or other recursively processed tables) are supported. --- @param filename string: the output filename --- @param tbl table: the table containing the data to be written --- @param field_order table: an optional array indicating the order of top-level fields. --- @return boolean or (nil, string): true if successful, or nil and a --- message in case of errors. -function persist.save_from_table(filename, tbl, field_order) - local out = io.open(filename, "w") - if not out then - return nil, "Cannot create file at "..filename - end - local ok, err = write_table_as_assignments(out, tbl, field_order) - out:close() - if not ok then - return nil, err - end - return true -end - ---- Save the contents of a table as a module. --- The module contains a 'return' statement that returns the table. --- Only numbers, strings and tables (containing numbers, strings --- or other recursively processed tables) are supported. --- @param filename string: the output filename --- @param tbl table: the table containing the data to be written --- @return boolean or (nil, string): true if successful, or nil and a --- message in case of errors. -function persist.save_as_module(filename, tbl) - local out = io.open(filename, "w") - if not out then - return nil, "Cannot create file at "..filename - end - write_table_as_table(out, tbl) - out:close() - return true -end - -function persist.load_config_file_if_basic(filename, cfg) - local env = { - home = cfg.home - } - local result, err, errcode = persist.load_into_table(filename, env) - if errcode == "load" or errcode == "run" then - -- bad config file or depends on env, so error out - return nil, "Could not read existing config file " .. filename - end - - local tbl - if errcode == "open" then - -- could not open, maybe file does not exist - tbl = {} - else - tbl = result - tbl.home = nil - end - - return tbl -end - -function persist.save_default_lua_version(prefix, lua_version) - local ok, err = fs.make_dir(prefix) - if not ok then - return nil, err - end - local fd, err = io.open(dir.path(prefix, "default-lua-version.lua"), "w") - if not fd then - return nil, err - end - fd:write('return "' .. lua_version .. '"\n') - fd:close() - return true -end - -return persist diff --git a/.luarocks/share/lua/5.1/luarocks/queries.lua b/.luarocks/share/lua/5.1/luarocks/queries.lua deleted file mode 100644 index 6df61296e..000000000 --- a/.luarocks/share/lua/5.1/luarocks/queries.lua +++ /dev/null @@ -1,215 +0,0 @@ - -local queries = {} - -local vers = require("luarocks.core.vers") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") - -local query_mt = {} - -query_mt.__index = query_mt - -function query_mt.type() - return "query" -end - --- Fallback default value for the `arch` field, if not explicitly set. -query_mt.arch = { - src = true, - all = true, - rockspec = true, - installed = true, - -- [cfg.arch] = true, -- this is set later -} - --- Fallback default value for the `substring` field, if not explicitly set. -query_mt.substring = false - ---- Convert the arch field of a query table to table format. --- @param input string, table or nil -local function arch_to_table(input) - if type(input) == "table" then - return input - elseif type(input) == "string" then - local arch = {} - for a in input:gmatch("[%w_-]+") do - arch[a] = true - end - return arch - end -end - ---- Prepare a query in dependency table format. --- @param name string: the package name. --- @param namespace string?: the package namespace. --- @param version string?: the package version. --- @param substring boolean?: match substrings of the name --- (default is false, match full name) --- @param arch string?: a string with pipe-separated accepted arch values --- @param operator string?: operator for version matching (default is "==") --- @return table: A query in table format -function queries.new(name, namespace, version, substring, arch, operator) - assert(type(name) == "string") - assert(type(namespace) == "string" or not namespace) - assert(type(version) == "string" or not version) - assert(type(substring) == "boolean" or not substring) - assert(type(arch) == "string" or not arch) - assert(type(operator) == "string" or not operator) - - operator = operator or "==" - - local self = { - name = name, - namespace = namespace, - constraints = {}, - substring = substring, - arch = arch_to_table(arch), - } - if version then - table.insert(self.constraints, { op = operator, version = vers.parse_version(version)}) - end - - query_mt.arch[cfg.arch] = true - return setmetatable(self, query_mt) -end - --- Query for all packages --- @param arch string (optional) -function queries.all(arch) - assert(type(arch) == "string" or not arch) - - return queries.new("", nil, nil, true, arch) -end - -do - local parse_constraints - do - local parse_constraint - do - local operators = { - ["=="] = "==", - ["~="] = "~=", - [">"] = ">", - ["<"] = "<", - [">="] = ">=", - ["<="] = "<=", - ["~>"] = "~>", - -- plus some convenience translations - [""] = "==", - ["="] = "==", - ["!="] = "~=" - } - - --- Consumes a constraint from a string, converting it to table format. - -- For example, a string ">= 1.0, > 2.0" is converted to a table in the - -- format {op = ">=", version={1,0}} and the rest, "> 2.0", is returned - -- back to the caller. - -- @param input string: A list of constraints in string format. - -- @return (table, string) or nil: A table representing the same - -- constraints and the string with the unused input, or nil if the - -- input string is invalid. - parse_constraint = function(input) - assert(type(input) == "string") - - local no_upgrade, op, version, rest = input:match("^(@?)([<>=~!]*)%s*([%w%.%_%-]+)[%s,]*(.*)") - local _op = operators[op] - version = vers.parse_version(version) - if not _op then - return nil, "Encountered bad constraint operator: '"..tostring(op).."' in '"..input.."'" - end - if not version then - return nil, "Could not parse version from constraint: '"..input.."'" - end - return { op = _op, version = version, no_upgrade = no_upgrade=="@" and true or nil }, rest - end - end - - --- Convert a list of constraints from string to table format. - -- For example, a string ">= 1.0, < 2.0" is converted to a table in the format - -- {{op = ">=", version={1,0}}, {op = "<", version={2,0}}}. - -- Version tables use a metatable allowing later comparison through - -- relational operators. - -- @param input string: A list of constraints in string format. - -- @return table or nil: A table representing the same constraints, - -- or nil if the input string is invalid. - parse_constraints = function(input) - assert(type(input) == "string") - - local constraints, oinput, constraint = {}, input - while #input > 0 do - constraint, input = parse_constraint(input) - if constraint then - table.insert(constraints, constraint) - else - return nil, "Failed to parse constraint '"..tostring(oinput).."' with error: ".. input - end - end - return constraints - end - end - - --- Prepare a query in dependency table format. - -- @param depstr string: A dependency in string format - -- as entered in rockspec files. - -- @return table: A query in table format, or nil and an error message in case of errors. - function queries.from_dep_string(depstr) - assert(type(depstr) == "string") - - local ns_name, rest = depstr:match("^%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)") - if not ns_name then - return nil, "failed to extract dependency name from '"..depstr.."'" - end - - local constraints, err = parse_constraints(rest) - if not constraints then - return nil, err - end - - local name, namespace = util.split_namespace(ns_name) - - local self = { - name = name, - namespace = namespace, - constraints = constraints, - } - - query_mt.arch[cfg.arch] = true - return setmetatable(self, query_mt) - end -end - -function queries.from_persisted_table(tbl) - query_mt.arch[cfg.arch] = true - return setmetatable(tbl, query_mt) -end - ---- Build a string representation of a query package name. --- Includes namespace, name and version, but not arch or constraints. --- @param query table: a query table --- @return string: a result such as `my_user/my_rock 1.0` or `my_rock`. -function query_mt:__tostring() - local out = {} - if self.namespace then - table.insert(out, self.namespace) - table.insert(out, "/") - end - table.insert(out, self.name) - - if #self.constraints > 0 then - local pretty = {} - for _, c in ipairs(self.constraints) do - local v = c.version.string - if c.op == "==" then - table.insert(pretty, v) - else - table.insert(pretty, c.op .. " " .. v) - end - end - table.insert(out, " ") - table.insert(out, table.concat(pretty, ", ")) - end - - return table.concat(out) -end - -return queries diff --git a/.luarocks/share/lua/5.1/luarocks/remove.lua b/.luarocks/share/lua/5.1/luarocks/remove.lua deleted file mode 100644 index a24b54ba8..000000000 --- a/.luarocks/share/lua/5.1/luarocks/remove.lua +++ /dev/null @@ -1,135 +0,0 @@ -local remove = {} - -local search = require("luarocks.search") -local deps = require("luarocks.deps") -local fetch = require("luarocks.fetch") -local repos = require("luarocks.repos") -local path = require("luarocks.path") -local util = require("luarocks.util") -local cfg = require("luarocks.core.cfg") -local manif = require("luarocks.manif") -local queries = require("luarocks.queries") - ---- Obtain a list of packages that depend on the given set of packages --- (where all packages of the set are versions of one program). --- @param name string: the name of a program --- @param versions array of string: the versions to be deleted. --- @return array of string: an empty table if no packages depend on any --- of the given list, or an array of strings in "name/version" format. -local function check_dependents(name, versions, deps_mode) - local dependents = {} - - local skip_set = {} - skip_set[name] = {} - for version, _ in pairs(versions) do - skip_set[name][version] = true - end - - local local_rocks = {} - local query_all = queries.all() - search.local_manifest_search(local_rocks, cfg.rocks_dir, query_all) - local_rocks[name] = nil - for rock_name, rock_versions in pairs(local_rocks) do - for rock_version, _ in pairs(rock_versions) do - local rockspec, err = fetch.load_rockspec(path.rockspec_file(rock_name, rock_version)) - if rockspec then - local _, missing = deps.match_deps(rockspec.dependencies, rockspec.rocks_provided, skip_set, deps_mode) - if missing[name] then - table.insert(dependents, { name = rock_name, version = rock_version }) - end - end - end - end - - return dependents -end - ---- Delete given versions of a program. --- @param name string: the name of a program --- @param versions array of string: the versions to be deleted. --- @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 boolean or (nil, string): true on success or nil and an error message. -local function delete_versions(name, versions, deps_mode) - - for version, _ in pairs(versions) do - util.printout("Removing "..name.." "..version.."...") - local ok, err = repos.delete_version(name, version, deps_mode) - if not ok then return nil, err end - end - - return true -end - -function remove.remove_search_results(results, name, deps_mode, force, fast) - local versions = results[name] - - local version = next(versions) - local second = next(versions, version) - - local dependents = {} - if not fast then - util.printout("Checking stability of dependencies in the absence of") - util.printout(name.." "..table.concat(util.keys(versions), ", ").."...") - util.printout() - dependents = check_dependents(name, versions, deps_mode) - end - - if #dependents > 0 then - if force or fast then - util.printerr("The following packages may be broken by this forced removal:") - for _, dependent in ipairs(dependents) do - util.printerr(dependent.name.." "..dependent.version) - end - util.printerr() - else - if not second then - util.printerr("Will not remove "..name.." "..version..".") - util.printerr("Removing it would break dependencies for: ") - else - util.printerr("Will not remove installed versions of "..name..".") - util.printerr("Removing them would break dependencies for: ") - end - for _, dependent in ipairs(dependents) do - util.printerr(dependent.name.." "..dependent.version) - end - util.printerr() - util.printerr("Use --force to force removal (warning: this may break modules).") - return nil, "Failed removing." - end - end - - local ok, err = delete_versions(name, versions, deps_mode) - if not ok then return nil, err end - - util.printout("Removal successful.") - return true -end - -function remove.remove_other_versions(name, version, force, fast) - local results = {} - local query = queries.new(name, nil, version, false, nil, "~=") - search.local_manifest_search(results, cfg.rocks_dir, query) - local warn - if results[name] then - local ok, err = remove.remove_search_results(results, name, cfg.deps_mode, force, fast) - if not ok then -- downgrade failure to a warning - warn = err - end - end - - if not fast then - -- since we're not using --keep, this means that all files of the rock being installed - -- should be available as non-versioned variants. Double-check that: - local rock_manifest, load_err = manif.load_rock_manifest(name, version) - local ok, err = repos.check_everything_is_installed(name, version, rock_manifest, cfg.root_dir, false) - if not ok then - return nil, err - end - end - - return true, nil, warn -end - -return remove diff --git a/.luarocks/share/lua/5.1/luarocks/repos.lua b/.luarocks/share/lua/5.1/luarocks/repos.lua deleted file mode 100644 index 764fe3ad6..000000000 --- a/.luarocks/share/lua/5.1/luarocks/repos.lua +++ /dev/null @@ -1,697 +0,0 @@ - ---- Functions for managing the repository on disk. -local repos = {} - -local fs = require("luarocks.fs") -local path = require("luarocks.path") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local dir = require("luarocks.dir") -local manif = require("luarocks.manif") -local vers = require("luarocks.core.vers") - -local unpack = unpack or table.unpack -- luacheck: ignore 211 - ---- Get type and name of an item (a module or a command) provided by a file. --- @param deploy_type string: rock manifest subtree the file comes from ("bin", "lua", or "lib"). --- @param file_path string: path to the file relatively to deploy_type subdirectory. --- @return (string, string): item type ("module" or "command") and name. -local function get_provided_item(deploy_type, file_path) - assert(type(deploy_type) == "string") - assert(type(file_path) == "string") - local item_type = deploy_type == "bin" and "command" or "module" - local item_name = item_type == "command" and file_path or path.path_to_module(file_path) - return item_type, item_name -end - --- Tree of files installed by a package are stored --- in its rock manifest. Some of these files have to --- be deployed to locations where Lua can load them as --- modules or where they can be used as commands. --- These files are characterised by pair --- (deploy_type, file_path), where deploy_type is the first --- component of the file path and file_path is the rest of the --- path. Only files with deploy_type in {"lua", "lib", "bin"} --- are deployed somewhere. --- Each deployed file provides an "item". An item is --- characterised by pair (item_type, item_name). --- item_type is "command" for files with deploy_type --- "bin" and "module" for deploy_type in {"lua", "lib"}. --- item_name is same as file_path for commands --- and is produced using path.path_to_module(file_path) --- for modules. - ---- Get all installed versions of a package. --- @param name string: a package name. --- @return table or nil: An array of strings listing installed --- versions of a package, or nil if none is available. -local function get_installed_versions(name) - assert(type(name) == "string" and not name:match("/")) - - local dirs = fs.list_dir(path.versions_dir(name)) - return (dirs and #dirs > 0) and dirs or nil -end - ---- Check if a package exists in a local repository. --- Version numbers are compared as exact string comparison. --- @param name string: name of package --- @param version string: package version in string format --- @return boolean: true if a package is installed, --- false otherwise. -function repos.is_installed(name, version) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - return fs.is_dir(path.install_dir(name, version)) -end - -function repos.recurse_rock_manifest_entry(entry, action) - assert(type(action) == "function") - - if entry == nil then - return true - end - - local function do_recurse_rock_manifest_entry(tree, parent_path) - - for file, sub in pairs(tree) do - local sub_path = (parent_path and (parent_path .. "/") or "") .. file - local ok, err -- luacheck: ignore 231 - - if type(sub) == "table" then - ok, err = do_recurse_rock_manifest_entry(sub, sub_path) - else - ok, err = action(sub_path) - end - - if err then return nil, err end - end - return true - end - return do_recurse_rock_manifest_entry(entry) -end - -local function store_package_data(result, rock_manifest, deploy_type) - if rock_manifest[deploy_type] then - repos.recurse_rock_manifest_entry(rock_manifest[deploy_type], function(file_path) - local _, item_name = get_provided_item(deploy_type, file_path) - result[item_name] = file_path - return true - end) - end -end - ---- Obtain a table of modules within an installed package. --- @param name string: The package name; for example "luasocket" --- @param version string: The exact version number including revision; --- for example "2.0.1-1". --- @return table: A table of modules where keys are module names --- and values are file paths of files providing modules --- relative to "lib" or "lua" rock manifest subtree. --- If no modules are found or if package name or version --- are invalid, an empty table is returned. -function repos.package_modules(name, version) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - local result = {} - local rock_manifest = manif.load_rock_manifest(name, version) - if not rock_manifest then return result end - store_package_data(result, rock_manifest, "lib") - store_package_data(result, rock_manifest, "lua") - return result -end - ---- Obtain a table of command-line scripts within an installed package. --- @param name string: The package name; for example "luasocket" --- @param version string: The exact version number including revision; --- for example "2.0.1-1". --- @return table: A table of commands where keys and values are command names --- as strings - file paths of files providing commands --- relative to "bin" rock manifest subtree. --- If no commands are found or if package name or version --- are invalid, an empty table is returned. -function repos.package_commands(name, version) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - local result = {} - local rock_manifest = manif.load_rock_manifest(name, version) - if not rock_manifest then return result end - store_package_data(result, rock_manifest, "bin") - return result -end - - ---- Check if a rock contains binary executables. --- @param name string: name of an installed rock --- @param version string: version of an installed rock --- @return boolean: returns true if rock contains platform-specific --- binary executables, or false if it is a pure-Lua rock. -function repos.has_binaries(name, version) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - - local rock_manifest = manif.load_rock_manifest(name, version) - if rock_manifest and rock_manifest.bin then - for bin_name, md5 in pairs(rock_manifest.bin) do - -- TODO verify that it is the same file. If it isn't, find the actual command. - if fs.is_actual_binary(dir.path(cfg.deploy_bin_dir, bin_name)) then - return true - end - end - end - return false -end - -function repos.run_hook(rockspec, hook_name) - assert(rockspec:type() == "rockspec") - assert(type(hook_name) == "string") - - local hooks = rockspec.hooks - if not hooks then - return true - end - - if cfg.hooks_enabled == false then - return nil, "This rockspec contains hooks, which are blocked by the 'hooks_enabled' setting in your LuaRocks configuration." - end - - if not hooks.substituted_variables then - util.variable_substitutions(hooks, rockspec.variables) - hooks.substituted_variables = true - end - local hook = hooks[hook_name] - if hook then - util.printout(hook) - if not fs.execute(hook) then - return nil, "Failed running "..hook_name.." hook." - end - end - return true -end - -function repos.should_wrap_bin_scripts(rockspec) - assert(rockspec:type() == "rockspec") - - if cfg.wrap_bin_scripts ~= nil then - return cfg.wrap_bin_scripts - end - if rockspec.deploy and rockspec.deploy.wrap_bin_scripts == false then - return false - end - return true -end - -local function find_suffixed(file, suffix) - local filenames = {file} - if suffix and suffix ~= "" then - table.insert(filenames, 1, file .. suffix) - end - - for _, filename in ipairs(filenames) do - if fs.exists(filename) then - return filename - end - end - - return nil, table.concat(filenames, ", ") .. " not found" -end - -local function check_suffix(filename, suffix) - local suffixed_filename, err = find_suffixed(filename, suffix) - if not suffixed_filename then - return "" - end - return suffixed_filename:sub(#filename + 1) -end - --- Files can be deployed using versioned and non-versioned names. --- Several items with same type and name can exist if they are --- provided by different packages or versions. In any case --- item from the newest version of lexicographically smallest package --- is deployed using non-versioned name and others use versioned names. - -local function get_deploy_paths(name, version, deploy_type, file_path, repo) - assert(type(name) == "string") - assert(type(version) == "string") - assert(type(deploy_type) == "string") - assert(type(file_path) == "string") - - repo = repo or cfg.root_dir - local deploy_dir = path["deploy_" .. deploy_type .. "_dir"](repo) - local non_versioned = dir.path(deploy_dir, file_path) - local versioned = path.versioned_name(non_versioned, deploy_dir, name, version) - return { nv = non_versioned, v = versioned } -end - -local function check_spot_if_available(name, version, deploy_type, file_path) - local item_type, item_name = get_provided_item(deploy_type, file_path) - local cur_name, cur_version = manif.get_current_provider(item_type, item_name) - - -- older versions of LuaRocks (< 3) registered "foo.init" files as "foo" - -- (which caused problems, so that behavior was changed). But look for that - -- in the manifest anyway for backward compatibility. - if not cur_name and deploy_type == "lua" and item_name:match("%.init$") then - cur_name, cur_version = manif.get_current_provider(item_type, (item_name:gsub("%.init$", ""))) - end - - if (not cur_name) - or (name < cur_name) - or (name == cur_name and (version == cur_version - or vers.compare_versions(version, cur_version))) then - return "nv", cur_name, cur_version, item_name - else - -- Existing version has priority, deploy new version using versioned name. - return "v", cur_name, cur_version, item_name - end -end - -local function backup_existing(should_backup, target) - if not should_backup then - fs.delete(target) - return - end - if fs.exists(target) then - local backup = target - repeat - backup = backup.."~" - until not fs.exists(backup) -- Slight race condition here, but shouldn't be a problem. - - util.warning(target.." is not tracked by this installation of LuaRocks. Moving it to "..backup) - local move_ok, move_err = os.rename(target, backup) - if not move_ok then - return nil, move_err - end - return backup - end -end - -local function prepare_op_install() - local mkdirs = {} - local rmdirs = {} - - local function memoize_mkdir(d) - if mkdirs[d] then - return true - end - local ok, err = fs.make_dir(d) - if not ok then - return nil, err - end - mkdirs[d] = true - return true - end - - local function op_install(op) - local ok, err = memoize_mkdir(dir.dir_name(op.dst)) - if not ok then - return nil, err - end - - local backup, err = backup_existing(op.backup, op.dst) - if err then - return nil, err - end - if backup then - op.backup_file = backup - end - - ok, err = op.fn(op.src, op.dst, op.backup) - if not ok then - return nil, err - end - - rmdirs[dir.dir_name(op.src)] = true - return true - end - - local function done_op_install() - for d, _ in pairs(rmdirs) do - fs.remove_dir_tree_if_empty(d) - end - end - - return op_install, done_op_install -end - -local function rollback_install(op) - fs.delete(op.dst) - if op.backup_file then - os.rename(op.backup_file, op.dst) - end - fs.remove_dir_tree_if_empty(dir.dir_name(op.dst)) - return true -end - -local function op_rename(op) - if op.suffix then - local suffix = check_suffix(op.src, op.suffix) - op.src = op.src .. suffix - op.dst = op.dst .. suffix - end - - if fs.exists(op.src) then - fs.make_dir(dir.dir_name(op.dst)) - fs.delete(op.dst) - local ok, err = os.rename(op.src, op.dst) - fs.remove_dir_tree_if_empty(dir.dir_name(op.src)) - return ok, err - else - return true - end -end - -local function rollback_rename(op) - return op_rename({ src = op.dst, dst = op.src }) -end - -local function prepare_op_delete() - local deletes = {} - local rmdirs = {} - - local function done_op_delete() - for _, f in ipairs(deletes) do - os.remove(f) - end - - for d, _ in pairs(rmdirs) do - fs.remove_dir_tree_if_empty(d) - end - end - - local function op_delete(op) - if op.suffix then - local suffix = check_suffix(op.name, op.suffix) - op.name = op.name .. suffix - end - - table.insert(deletes, op.name) - - rmdirs[dir.dir_name(op.name)] = true - end - - return op_delete, done_op_delete -end - -local function rollback_ops(ops, op_fn, n) - for i = 1, n do - op_fn(ops[i]) - end -end - ---- Double check that all files referenced in `rock_manifest` are installed in `repo`. -function repos.check_everything_is_installed(name, version, rock_manifest, repo, accept_versioned) - local missing = {} - local suffix = cfg.wrapper_suffix or "" - for _, category in ipairs({"bin", "lua", "lib"}) do - if rock_manifest[category] then - repos.recurse_rock_manifest_entry(rock_manifest[category], function(file_path) - local paths = get_deploy_paths(name, version, category, file_path, repo) - if category == "bin" then - if (fs.exists(paths.nv) or fs.exists(paths.nv .. suffix)) - or (accept_versioned and (fs.exists(paths.v) or fs.exists(paths.v .. suffix))) then - return - end - else - if fs.exists(paths.nv) or (accept_versioned and fs.exists(paths.v)) then - return - end - end - table.insert(missing, paths.nv) - end) - end - end - if #missing > 0 then - return nil, "failed deploying files. " .. - "The following files were not installed:\n" .. - table.concat(missing, "\n") - end - return true -end - ---- Deploy a package from the rocks subdirectory. --- @param name string: name of package --- @param version string: exact package version in string format --- @param wrap_bin_scripts bool: whether commands written in Lua should be wrapped. --- @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. -function repos.deploy_files(name, version, wrap_bin_scripts, deps_mode) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - assert(type(wrap_bin_scripts) == "boolean") - - local rock_manifest, load_err = manif.load_rock_manifest(name, version) - if not rock_manifest then return nil, load_err end - - local repo = cfg.root_dir - local renames = {} - local installs = {} - - local function install_binary(source, target) - if wrap_bin_scripts and fs.is_lua(source) then - return fs.wrap_script(source, target, deps_mode, name, version) - else - return fs.copy_binary(source, target) - end - end - - local function move_lua(source, target) - return fs.move(source, target, "read") - end - - local function move_lib(source, target) - return fs.move(source, target, "exec") - end - - if rock_manifest.bin then - local source_dir = path.bin_dir(name, version) - repos.recurse_rock_manifest_entry(rock_manifest.bin, function(file_path) - local source = dir.path(source_dir, file_path) - local paths = get_deploy_paths(name, version, "bin", file_path, repo) - local mode, cur_name, cur_version = check_spot_if_available(name, version, "bin", file_path) - - if mode == "nv" and cur_name then - local cur_paths = get_deploy_paths(cur_name, cur_version, "bin", file_path, repo) - table.insert(renames, { src = cur_paths.nv, dst = cur_paths.v, suffix = cfg.wrapper_suffix }) - end - local target = mode == "nv" and paths.nv or paths.v - local backup = name ~= cur_name or version ~= cur_version - if wrap_bin_scripts and fs.is_lua(source) then - target = target .. (cfg.wrapper_suffix or "") - end - table.insert(installs, { fn = install_binary, src = source, dst = target, backup = backup }) - end) - end - - if rock_manifest.lua then - local source_dir = path.lua_dir(name, version) - repos.recurse_rock_manifest_entry(rock_manifest.lua, function(file_path) - local source = dir.path(source_dir, file_path) - local paths = get_deploy_paths(name, version, "lua", file_path, repo) - local mode, cur_name, cur_version = check_spot_if_available(name, version, "lua", file_path) - - if mode == "nv" and cur_name then - local cur_paths = get_deploy_paths(cur_name, cur_version, "lua", file_path, repo) - table.insert(renames, { src = cur_paths.nv, dst = cur_paths.v }) - cur_paths = get_deploy_paths(cur_name, cur_version, "lib", file_path:gsub("%.lua$", "." .. cfg.lib_extension), repo) - table.insert(renames, { src = cur_paths.nv, dst = cur_paths.v }) - end - local target = mode == "nv" and paths.nv or paths.v - local backup = name ~= cur_name or version ~= cur_version - table.insert(installs, { fn = move_lua, src = source, dst = target, backup = backup }) - end) - end - - if rock_manifest.lib then - local source_dir = path.lib_dir(name, version) - repos.recurse_rock_manifest_entry(rock_manifest.lib, function(file_path) - local source = dir.path(source_dir, file_path) - local paths = get_deploy_paths(name, version, "lib", file_path, repo) - local mode, cur_name, cur_version = check_spot_if_available(name, version, "lib", file_path) - - if mode == "nv" and cur_name then - local cur_paths = get_deploy_paths(cur_name, cur_version, "lua", file_path:gsub("%.[^.]+$", ".lua"), repo) - table.insert(renames, { src = cur_paths.nv, dst = cur_paths.v }) - cur_paths = get_deploy_paths(cur_name, cur_version, "lib", file_path, repo) - table.insert(renames, { src = cur_paths.nv, dst = cur_paths.v }) - end - local target = mode == "nv" and paths.nv or paths.v - local backup = name ~= cur_name or version ~= cur_version - table.insert(installs, { fn = move_lib, src = source, dst = target, backup = backup }) - end) - end - - for i, op in ipairs(renames) do - local ok, err = op_rename(op) - if not ok then - rollback_ops(renames, rollback_rename, i - 1) - return nil, err - end - end - local op_install, done_op_install = prepare_op_install() - for i, op in ipairs(installs) do - local ok, err = op_install(op) - if not ok then - rollback_ops(installs, rollback_install, i - 1) - rollback_ops(renames, rollback_rename, #renames) - return nil, err - end - end - done_op_install() - - local ok, err = repos.check_everything_is_installed(name, version, rock_manifest, repo, true) - if not ok then - return nil, err - end - - local writer = require("luarocks.manif.writer") - return writer.add_to_manifest(name, version, nil, deps_mode) -end - -local function add_to_double_checks(double_checks, name, version) - double_checks[name] = double_checks[name] or {} - double_checks[name][version] = true -end - -local function double_check_all(double_checks, repo) - local errs = {} - for next_name, versions in pairs(double_checks) do - for next_version in pairs(versions) do - local rock_manifest, load_err = manif.load_rock_manifest(next_name, next_version) - local ok, err = repos.check_everything_is_installed(next_name, next_version, rock_manifest, repo, true) - if not ok then - table.insert(errs, err) - end - end - end - if next(errs) then - return nil, table.concat(errs, "\n") - end - return true -end - ---- Delete a package from the local repository. --- @param name string: name of package --- @param version string: exact package version in string format --- @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 quick boolean: do not try to fix the versioned name --- of another version that provides the same module that --- was deleted. This is used during 'purge', as every module --- will be eventually deleted. -function repos.delete_version(name, version, deps_mode, quick) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - assert(type(deps_mode) == "string") - - local rock_manifest, load_err = manif.load_rock_manifest(name, version) - if not rock_manifest then - if not quick then - local writer = require("luarocks.manif.writer") - writer.remove_from_manifest(name, version, nil, deps_mode) - return nil, "rock_manifest file not found for "..name.." "..version.." - removed entry from the manifest" - end - return nil, load_err - end - - local repo = cfg.root_dir - local renames = {} - local deletes = {} - - local double_checks = {} - - if rock_manifest.bin then - repos.recurse_rock_manifest_entry(rock_manifest.bin, function(file_path) - local paths = get_deploy_paths(name, version, "bin", file_path, repo) - local mode, cur_name, cur_version, item_name = check_spot_if_available(name, version, "bin", file_path) - if mode == "v" then - table.insert(deletes, { name = paths.v, suffix = cfg.wrapper_suffix }) - else - table.insert(deletes, { name = paths.nv, suffix = cfg.wrapper_suffix }) - - local next_name, next_version = manif.get_next_provider("command", item_name) - if next_name then - add_to_double_checks(double_checks, next_name, next_version) - local next_paths = get_deploy_paths(next_name, next_version, "bin", file_path, repo) - table.insert(renames, { src = next_paths.v, dst = next_paths.nv, suffix = cfg.wrapper_suffix }) - end - end - end) - end - - if rock_manifest.lua then - repos.recurse_rock_manifest_entry(rock_manifest.lua, function(file_path) - local paths = get_deploy_paths(name, version, "lua", file_path, repo) - local mode, cur_name, cur_version, item_name = check_spot_if_available(name, version, "lua", file_path) - if mode == "v" then - table.insert(deletes, { name = paths.v }) - else - table.insert(deletes, { name = paths.nv }) - - local next_name, next_version = manif.get_next_provider("module", item_name) - if next_name then - add_to_double_checks(double_checks, next_name, next_version) - local next_lua_paths = get_deploy_paths(next_name, next_version, "lua", file_path, repo) - table.insert(renames, { src = next_lua_paths.v, dst = next_lua_paths.nv }) - local next_lib_paths = get_deploy_paths(next_name, next_version, "lib", file_path:gsub("%.[^.]+$", ".lua"), repo) - table.insert(renames, { src = next_lib_paths.v, dst = next_lib_paths.nv }) - end - end - end) - end - - if rock_manifest.lib then - repos.recurse_rock_manifest_entry(rock_manifest.lib, function(file_path) - local paths = get_deploy_paths(name, version, "lib", file_path, repo) - local mode, cur_name, cur_version, item_name = check_spot_if_available(name, version, "lib", file_path) - if mode == "v" then - table.insert(deletes, { name = paths.v }) - else - table.insert(deletes, { name = paths.nv }) - - local next_name, next_version = manif.get_next_provider("module", item_name) - if next_name then - add_to_double_checks(double_checks, next_name, next_version) - local next_lua_paths = get_deploy_paths(next_name, next_version, "lua", file_path:gsub("%.[^.]+$", ".lua"), repo) - table.insert(renames, { src = next_lua_paths.v, dst = next_lua_paths.nv }) - local next_lib_paths = get_deploy_paths(next_name, next_version, "lib", file_path, repo) - table.insert(renames, { src = next_lib_paths.v, dst = next_lib_paths.nv }) - end - end - end) - end - - local op_delete, done_op_delete = prepare_op_delete() - for _, op in ipairs(deletes) do - op_delete(op) - end - done_op_delete() - - if not quick then - for _, op in ipairs(renames) do - op_rename(op) - end - - local ok, err = double_check_all(double_checks, repo) - if not ok then - return nil, err - end - end - - fs.delete(path.install_dir(name, version)) - if not get_installed_versions(name) then - fs.delete(dir.path(cfg.rocks_dir, name)) - end - - if quick then - return true - end - - local writer = require("luarocks.manif.writer") - return writer.remove_from_manifest(name, version, nil, deps_mode) -end - -return repos diff --git a/.luarocks/share/lua/5.1/luarocks/require.lua b/.luarocks/share/lua/5.1/luarocks/require.lua deleted file mode 100644 index 902bd1a3c..000000000 --- a/.luarocks/share/lua/5.1/luarocks/require.lua +++ /dev/null @@ -1,2 +0,0 @@ ---- Retained for compatibility reasons only. Use luarocks.loader instead. -return require("luarocks.loader") diff --git a/.luarocks/share/lua/5.1/luarocks/results.lua b/.luarocks/share/lua/5.1/luarocks/results.lua deleted file mode 100644 index c14862de7..000000000 --- a/.luarocks/share/lua/5.1/luarocks/results.lua +++ /dev/null @@ -1,62 +0,0 @@ -local results = {} - -local vers = require("luarocks.core.vers") -local util = require("luarocks.util") - -local result_mt = {} - -result_mt.__index = result_mt - -function result_mt.type() - return "result" -end - -function results.new(name, version, repo, arch, namespace) - assert(type(name) == "string" and not name:match("/")) - assert(type(version) == "string") - assert(type(repo) == "string") - assert(type(arch) == "string" or not arch) - assert(type(namespace) == "string" or not namespace) - - if not namespace then - name, namespace = util.split_namespace(name) - end - - local self = { - name = name, - version = version, - namespace = namespace, - arch = arch, - repo = repo, - } - - return setmetatable(self, result_mt) -end - ---- Test the name field of a query. --- If query has a boolean field substring set to true, --- then substring match is performed; otherwise, exact string --- comparison is done. --- @param query table: A query in dependency table format. --- @param name string: A package name. --- @return boolean: True if names match, false otherwise. -local function match_name(query, name) - if query.substring then - return name:find(query.name, 0, true) and true or false - else - return name == query.name - end -end - ---- Returns true if the result satisfies a given query. --- @param query: a query. --- @return boolean. -function result_mt:satisfies(query) - assert(query:type() == "query") - return match_name(query, self.name) - and (query.arch[self.arch] or query.arch["any"]) - and ((not query.namespace) or (query.namespace == self.namespace)) - and vers.match_constraints(vers.parse_version(self.version), query.constraints) -end - -return results diff --git a/.luarocks/share/lua/5.1/luarocks/rockspecs.lua b/.luarocks/share/lua/5.1/luarocks/rockspecs.lua deleted file mode 100644 index 94462951a..000000000 --- a/.luarocks/share/lua/5.1/luarocks/rockspecs.lua +++ /dev/null @@ -1,161 +0,0 @@ -local rockspecs = {} - -local cfg = require("luarocks.core.cfg") -local dir = require("luarocks.dir") -local path = require("luarocks.path") -local queries = require("luarocks.queries") -local type_rockspec = require("luarocks.type.rockspec") -local util = require("luarocks.util") -local vers = require("luarocks.core.vers") - -local rockspec_mt = {} - -rockspec_mt.__index = rockspec_mt - -function rockspec_mt.type() - return "rockspec" -end - ---- Perform platform-specific overrides on a table. --- Overrides values of table with the contents of the appropriate --- subset of its "platforms" field. The "platforms" field should --- be a table containing subtables keyed with strings representing --- platform names. Names that match the contents of the global --- detected platforms setting are used. For example, if --- platform "unix" is detected, then the fields of --- tbl.platforms.unix will overwrite those of tbl with the same --- names. For table values, the operation is performed recursively --- (tbl.platforms.foo.x.y.z overrides tbl.x.y.z; other contents of --- tbl.x are preserved). --- @param tbl table or nil: Table which may contain a "platforms" field; --- if it doesn't (or if nil is passed), this function does nothing. -local function platform_overrides(tbl) - assert(type(tbl) == "table" or not tbl) - - if not tbl then return end - - if tbl.platforms then - for platform in cfg.each_platform() do - local platform_tbl = tbl.platforms[platform] - if platform_tbl then - util.deep_merge(tbl, platform_tbl) - end - end - end - tbl.platforms = nil -end - -local function convert_dependencies(rockspec, key) - if rockspec[key] then - for i = 1, #rockspec[key] do - local parsed, err = queries.from_dep_string(rockspec[key][i]) - if not parsed then - return nil, "Parse error processing dependency '"..rockspec[key][i].."': "..tostring(err) - end - rockspec[key][i] = parsed - end - else - rockspec[key] = {} - end - return true -end - ---- Set up path-related variables for a given rock. --- Create a "variables" table in the rockspec table, containing --- adjusted variables according to the configuration file. --- @param rockspec table: The rockspec table. -local function configure_paths(rockspec) - local vars = {} - for k,v in pairs(cfg.variables) do - vars[k] = v - end - local name, version = rockspec.name, rockspec.version - vars.PREFIX = path.install_dir(name, version) - vars.LUADIR = path.lua_dir(name, version) - vars.LIBDIR = path.lib_dir(name, version) - vars.CONFDIR = path.conf_dir(name, version) - vars.BINDIR = path.bin_dir(name, version) - vars.DOCDIR = path.doc_dir(name, version) - rockspec.variables = vars -end - -function rockspecs.from_persisted_table(filename, rockspec, globals, quick) - assert(type(rockspec) == "table") - assert(type(globals) == "table" or globals == nil) - assert(type(filename) == "string") - assert(type(quick) == "boolean" or quick == nil) - - if rockspec.rockspec_format then - if vers.compare_versions(rockspec.rockspec_format, type_rockspec.rockspec_format) then - return nil, "Rockspec format "..rockspec.rockspec_format.." is not supported, please upgrade LuaRocks." - end - end - - if not quick then - local ok, err = type_rockspec.check(rockspec, globals or {}) - if not ok then - return nil, err - end - end - - --- Check if rockspec format version satisfies version requirement. - -- @param rockspec table: The rockspec table. - -- @param version string: required version. - -- @return boolean: true if rockspec format matches version or is newer, false otherwise. - do - local parsed_format = vers.parse_version(rockspec.rockspec_format or "1.0") - rockspec.format_is_at_least = function(self, version) - return parsed_format >= vers.parse_version(version) - end - end - - platform_overrides(rockspec.build) - platform_overrides(rockspec.dependencies) - platform_overrides(rockspec.build_dependencies) - platform_overrides(rockspec.test_dependencies) - platform_overrides(rockspec.external_dependencies) - platform_overrides(rockspec.source) - platform_overrides(rockspec.hooks) - platform_overrides(rockspec.test) - - rockspec.name = rockspec.package:lower() - - local protocol, pathname = dir.split_url(rockspec.source.url) - if dir.is_basic_protocol(protocol) then - rockspec.source.file = rockspec.source.file or dir.base_name(rockspec.source.url) - end - rockspec.source.protocol, rockspec.source.pathname = protocol, pathname - - -- Temporary compatibility - if rockspec.source.cvs_module then rockspec.source.module = rockspec.source.cvs_module end - if rockspec.source.cvs_tag then rockspec.source.tag = rockspec.source.cvs_tag end - - rockspec.local_abs_filename = filename - local filebase = rockspec.source.file or rockspec.source.url - local base = dir.deduce_base_dir(filebase) - rockspec.source.dir_set = rockspec.source.dir ~= nil - rockspec.source.dir = rockspec.source.dir - or rockspec.source.module - or ( (filebase:match("%.lua$") or filebase:match("%.c$")) - and (rockspec:format_is_at_least("3.0") - and (dir.is_basic_protocol(protocol) and "." or base) - or ".") ) - or base - - rockspec.rocks_provided = util.get_rocks_provided(rockspec) - - for _, key in ipairs({"dependencies", "build_dependencies", "test_dependencies"}) do - local ok, err = convert_dependencies(rockspec, key) - if not ok then - return nil, err - end - end - - if not quick then - configure_paths(rockspec) - end - - return setmetatable(rockspec, rockspec_mt) -end - -return rockspecs diff --git a/.luarocks/share/lua/5.1/luarocks/search.lua b/.luarocks/share/lua/5.1/luarocks/search.lua deleted file mode 100644 index e76d45912..000000000 --- a/.luarocks/share/lua/5.1/luarocks/search.lua +++ /dev/null @@ -1,390 +0,0 @@ -local search = {} - -local dir = require("luarocks.dir") -local path = require("luarocks.path") -local manif = require("luarocks.manif") -local vers = require("luarocks.core.vers") -local cfg = require("luarocks.core.cfg") -local util = require("luarocks.util") -local queries = require("luarocks.queries") -local results = require("luarocks.results") - ---- Store a search result (a rock or rockspec) in the result tree. --- @param result_tree table: The result tree, where keys are package names and --- values are tables matching version strings to arrays of --- tables with fields "arch" and "repo". --- @param result table: A result. -function search.store_result(result_tree, result) - assert(type(result_tree) == "table") - assert(result:type() == "result") - - local name = result.name - local version = result.version - - if not result_tree[name] then result_tree[name] = {} end - if not result_tree[name][version] then result_tree[name][version] = {} end - table.insert(result_tree[name][version], { - arch = result.arch, - repo = result.repo, - namespace = result.namespace, - }) -end - ---- Store a match in a result tree if version matches query. --- Name, version, arch and repository path are stored in a given --- table, optionally checking if version and arch (if given) match --- a query. --- @param result_tree table: The result tree, where keys are package names and --- values are tables matching version strings to arrays of --- tables with fields "arch" and "repo". --- @param result table: a result object. --- @param query table: a query object. -local function store_if_match(result_tree, result, query) - assert(result:type() == "result") - assert(query:type() == "query") - - if result:satisfies(query) then - search.store_result(result_tree, result) - end -end - ---- Perform search on a local repository. --- @param repo string: The pathname of the local repository. --- @param query table: a query object. --- @param result_tree table or nil: If given, this table will store the --- result tree; if not given, a new table will be created. --- @return table: The result tree, where keys are package names and --- values are tables matching version strings to arrays of --- tables with fields "arch" and "repo". --- If a table was given in the "result_tree" parameter, that is the result value. -function search.disk_search(repo, query, result_tree) - assert(type(repo) == "string") - assert(query:type() == "query") - assert(type(result_tree) == "table" or not result_tree) - - local fs = require("luarocks.fs") - - if not result_tree then - result_tree = {} - end - - for name in fs.dir(repo) do - local pathname = dir.path(repo, name) - local rname, rversion, rarch = path.parse_name(name) - - if rname and (pathname:match(".rockspec$") or pathname:match(".rock$")) then - local result = results.new(rname, rversion, repo, rarch) - store_if_match(result_tree, result, query) - elseif fs.is_dir(pathname) then - for version in fs.dir(pathname) do - if version:match("-%d+$") then - local namespace = path.read_namespace(name, version, repo) - local result = results.new(name, version, repo, "installed", namespace) - store_if_match(result_tree, result, query) - end - end - end - end - return result_tree -end - ---- Perform search on a rocks server or tree. --- @param result_tree table: The result tree, where keys are package names and --- values are tables matching version strings to arrays of --- tables with fields "arch" and "repo". --- @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 query object. --- @param lua_version string: Lua version in "5.x" format, defaults to installed version. --- @param is_local boolean --- @return true or, in case of errors, nil, an error message and an optional error code. -local function manifest_search(result_tree, repo, query, lua_version, is_local) - assert(type(result_tree) == "table") - assert(type(repo) == "string") - assert(query:type() == "query") - - -- FIXME do not add this in local repos - if (not is_local) and query.namespace then - repo = repo .. "/manifests/" .. query.namespace - end - - local manifest, err, errcode = manif.load_manifest(repo, lua_version, not is_local) - if not manifest then - return nil, err, errcode - end - for name, versions in pairs(manifest.repository) do - for version, items in pairs(versions) do - local namespace = is_local and path.read_namespace(name, version, repo) or query.namespace - for _, item in ipairs(items) do - local result = results.new(name, version, repo, item.arch, namespace) - store_if_match(result_tree, result, query) - end - end - end - return true -end - -local function remote_manifest_search(result_tree, repo, query, lua_version) - return manifest_search(result_tree, repo, query, lua_version, false) -end - -function search.local_manifest_search(result_tree, repo, query, lua_version) - return manifest_search(result_tree, repo, query, lua_version, true) -end - ---- Search on all configured rocks servers. --- @param query table: a query object. --- @param lua_version string: Lua version in "5.x" format, defaults to installed version. --- @return table: A table where keys are package names --- and values are tables matching version strings to arrays of --- tables with fields "arch" and "repo". -function search.search_repos(query, lua_version) - assert(query:type() == "query") - - local result_tree = {} - for _, repo in ipairs(cfg.rocks_servers) do - if type(repo) == "string" then - repo = { repo } - end - for _, mirror in ipairs(repo) do - if not cfg.disabled_servers[mirror] then - local protocol, pathname = dir.split_url(mirror) - if protocol == "file" then - mirror = pathname - end - local ok, err, errcode = remote_manifest_search(result_tree, mirror, query, lua_version) - if errcode == "network" then - cfg.disabled_servers[mirror] = true - end - if ok then - break - else - util.warning("Failed searching manifest: "..err) - end - end - end - end - -- search through rocks in rocks_provided - local provided_repo = "provided by VM or rocks_provided" - for name, version in pairs(util.get_rocks_provided()) do - local result = results.new(name, version, provided_repo, "installed") - store_if_match(result_tree, result, query) - end - return result_tree -end - ---- Get the URL for the latest in a set of versions. --- @param name string: The package name to be used in the URL. --- @param versions table: An array of version informations, as stored --- in search result trees. --- @return string or nil: the URL for the latest version if one could --- be picked, or nil. -local function pick_latest_version(name, versions) - assert(type(name) == "string" and not name:match("/")) - assert(type(versions) == "table") - - local vtables = {} - for v, _ in pairs(versions) do - table.insert(vtables, vers.parse_version(v)) - end - table.sort(vtables) - local version = vtables[#vtables].string - local items = versions[version] - if items then - local pick = 1 - for i, item in ipairs(items) do - if (item.arch == 'src' and items[pick].arch == 'rockspec') - or (item.arch ~= 'src' and item.arch ~= 'rockspec') then - pick = i - end - end - return path.make_url(items[pick].repo, name, version, items[pick].arch) - end - return nil -end - --- Find out which other Lua versions provide rock versions matching a query, --- @param query table: a query object. --- @return table: array of Lua versions supported, in "5.x" format. -local function supported_lua_versions(query) - assert(query:type() == "query") - local result_tree = {} - - for lua_version in util.lua_versions() do - if lua_version ~= cfg.lua_version then - util.printout("Checking for Lua " .. lua_version .. "...") - if search.search_repos(query, lua_version)[query.name] then - table.insert(result_tree, lua_version) - end - end - end - - return result_tree -end - ---- Attempt to get a single URL for a given search for a rock. --- @param query table: a query object. --- @return string or (nil, string, string): URL for latest matching version --- of the rock if it was found, or nil followed by an error message --- and an error code. -function search.find_suitable_rock(query) - assert(query:type() == "query") - - local rocks_provided = util.get_rocks_provided() - - if rocks_provided[query.name] ~= nil then - -- Do not install versions listed in rocks_provided. - return nil, "Rock "..query.name.." "..rocks_provided[query.name].. - " is already provided by VM or via 'rocks_provided' in the config file.", "provided" - end - - local result_tree = search.search_repos(query) - local first_rock = next(result_tree) - if not first_rock then - return nil, "No results matching query were found for Lua " .. cfg.lua_version .. ".", "notfound" - elseif next(result_tree, first_rock) then - -- Shouldn't happen as query must match only one package. - return nil, "Several rocks matched query.", "manyfound" - else - return pick_latest_version(query.name, result_tree[first_rock]) - end -end - -function search.find_src_or_rockspec(name, namespace, version, check_lua_versions) - local query = queries.new(name, namespace, version, false, "src|rockspec") - local url, err = search.find_rock_checking_lua_versions(query, check_lua_versions) - if not url then - return nil, "Could not find a result named "..tostring(query)..": "..err - end - return url -end - -function search.find_rock_checking_lua_versions(query, check_lua_versions) - local url, err, errcode = search.find_suitable_rock(query) - if url then - return url - end - - if errcode == "notfound" then - local add - if check_lua_versions then - util.printout(query.name .. " not found for Lua " .. cfg.lua_version .. ".") - util.printout("Checking if available for other Lua versions...") - - -- Check if constraints are satisfiable with other Lua versions. - local lua_versions = supported_lua_versions(query) - - if #lua_versions ~= 0 then - -- Build a nice message in "only Lua 5.x and 5.y but not 5.z." format - for i, lua_version in ipairs(lua_versions) do - lua_versions[i] = "Lua "..lua_version - end - - local versions_message = "only "..table.concat(lua_versions, " and ").. - " but not Lua "..cfg.lua_version.."." - - if #query.constraints == 0 then - add = query.name.." supports "..versions_message - elseif #query.constraints == 1 and query.constraints[1].op == "==" then - add = query.name.." "..query.constraints[1].version.string.." supports "..versions_message - else - add = "Matching "..query.name.." versions support "..versions_message - end - else - add = query.name.." is not available for any Lua versions." - end - else - add = "To check if it is available for other Lua versions, use --check-lua-versions." - end - err = err .. "\n" .. add - end - - return nil, err -end - ---- Print a list of rocks/rockspecs on standard output. --- @param result_tree table: A result tree. --- @param porcelain boolean or nil: A flag to force machine-friendly output. -function search.print_result_tree(result_tree, porcelain) - assert(type(result_tree) == "table") - assert(type(porcelain) == "boolean" or not porcelain) - - if porcelain then - for package, versions in util.sortedpairs(result_tree) do - for version, repos in util.sortedpairs(versions, vers.compare_versions) do - for _, repo in ipairs(repos) do - local nrepo = dir.normalize(repo.repo) - util.printout(package, version, repo.arch, nrepo, repo.namespace) - end - end - end - return - end - - for package, versions in util.sortedpairs(result_tree) do - local namespaces = {} - for version, repos in util.sortedpairs(versions, vers.compare_versions) do - for _, repo in ipairs(repos) do - local key = repo.namespace or "" - local list = namespaces[key] or {} - namespaces[key] = list - - repo.repo = dir.normalize(repo.repo) - table.insert(list, " "..version.." ("..repo.arch..") - "..path.root_dir(repo.repo)) - end - end - for key, list in util.sortedpairs(namespaces) do - util.printout(key == "" and package or key .. "/" .. package) - for _, line in ipairs(list) do - util.printout(line) - end - util.printout() - end - end -end - -function search.pick_installed_rock(query, given_tree) - assert(query:type() == "query") - - local result_tree = {} - local tree_map = {} - local trees = cfg.rocks_trees - if given_tree then - trees = { given_tree } - end - for _, tree in ipairs(trees) do - local rocks_dir = path.rocks_dir(tree) - tree_map[rocks_dir] = tree - search.local_manifest_search(result_tree, rocks_dir, query) - end - if not next(result_tree) then - return nil, "cannot find package "..tostring(query).."\nUse 'list' to find installed rocks." - end - - if not result_tree[query.name] and next(result_tree, next(result_tree)) then - local out = { "multiple installed packages match the name '"..tostring(query).."':\n\n" } - for name, _ in util.sortedpairs(result_tree) do - table.insert(out, " " .. name .. "\n") - end - table.insert(out, "\nPlease specify a single rock.\n") - return nil, table.concat(out) - end - - local repo_url - - local name, versions - if result_tree[query.name] then - name, versions = query.name, result_tree[query.name] - else - name, versions = util.sortedpairs(result_tree)() - end - - local version, repositories = util.sortedpairs(versions, vers.compare_versions)() - for _, rp in ipairs(repositories) do repo_url = rp.repo end - - local repo = tree_map[repo_url] - return name, version, repo, repo_url -end - -return search - diff --git a/.luarocks/share/lua/5.1/luarocks/signing.lua b/.luarocks/share/lua/5.1/luarocks/signing.lua deleted file mode 100644 index cb91643a1..000000000 --- a/.luarocks/share/lua/5.1/luarocks/signing.lua +++ /dev/null @@ -1,48 +0,0 @@ -local signing = {} - -local cfg = require("luarocks.core.cfg") -local fs = require("luarocks.fs") - -local function get_gpg() - local vars = cfg.variables - local gpg = vars.GPG - local gpg_ok, err = fs.is_tool_available(gpg, "gpg") - if not gpg_ok then - return nil, err - end - return gpg -end - -function signing.signature_url(url) - return url .. ".asc" -end - -function signing.sign_file(file) - local gpg, err = get_gpg() - if not gpg then - return nil, err - end - - local sigfile = file .. ".asc" - if fs.execute(gpg, "--armor", "--output", sigfile, "--detach-sign", file) then - return sigfile - else - return nil, "failed running " .. gpg .. " to sign " .. file - end -end - -function signing.verify_signature(file, sigfile) - local gpg, err = get_gpg() - if not gpg then - return nil, err - end - - if fs.execute(gpg, "--verify", sigfile, file) then - return true - else - return nil, "GPG returned a verification error" - end - -end - -return signing diff --git a/.luarocks/share/lua/5.1/luarocks/test.lua b/.luarocks/share/lua/5.1/luarocks/test.lua deleted file mode 100644 index ef801a9dc..000000000 --- a/.luarocks/share/lua/5.1/luarocks/test.lua +++ /dev/null @@ -1,89 +0,0 @@ - -local test = {} - -local fetch = require("luarocks.fetch") -local deps = require("luarocks.deps") -local util = require("luarocks.util") - -local test_types = { - "busted", - "command", -} - -local test_modules = {} - -for _, test_type in ipairs(test_types) do - local mod = require("luarocks.test." .. test_type) - table.insert(test_modules, mod) - test_modules[test_type] = mod - test_modules[mod] = test_type -end - -local function get_test_type(rockspec) - if rockspec.test and rockspec.test.type then - return rockspec.test.type - end - - for _, test_module in ipairs(test_modules) do - if test_module.detect_type() then - return test_modules[test_module] - end - end - - return nil, "could not detect test type -- no test suite for " .. rockspec.package .. "?" -end - --- Run test suite as configured in rockspec in the current directory. -function test.run_test_suite(rockspec_arg, test_type, args, prepare) - local rockspec - if type(rockspec_arg) == "string" then - local err, errcode - rockspec, err, errcode = fetch.load_rockspec(rockspec_arg) - if err then - return nil, err, errcode - end - else - assert(type(rockspec_arg) == "table") - rockspec = rockspec_arg - end - - if not test_type then - local err - test_type, err = get_test_type(rockspec, test_type) - if not test_type then - return nil, err - end - end - assert(test_type) - - if next(rockspec.test_dependencies) then - local ok, err, errcode = deps.fulfill_dependencies(rockspec, "test_dependencies", "all") - if err then - return nil, err, errcode - end - end - - local mod_name = "luarocks.test." .. test_type - local pok, test_mod = pcall(require, mod_name) - if not pok then - return nil, "failed loading test execution module " .. mod_name - end - - if prepare then - return test_mod.run_tests(rockspec_arg, {"--version"}) - else - local flags = rockspec.test and rockspec.test.flags - if type(flags) == "table" then - util.variable_substitutions(flags, rockspec.variables) - - -- insert any flags given in test.flags at the front of args - for i = 1, #flags do - table.insert(args, i, flags[i]) - end - end - - return test_mod.run_tests(rockspec.test, args) - end -end - -return test diff --git a/.luarocks/share/lua/5.1/luarocks/test/busted.lua b/.luarocks/share/lua/5.1/luarocks/test/busted.lua deleted file mode 100644 index c73909cf0..000000000 --- a/.luarocks/share/lua/5.1/luarocks/test/busted.lua +++ /dev/null @@ -1,53 +0,0 @@ - -local busted = {} - -local fs = require("luarocks.fs") -local deps = require("luarocks.deps") -local path = require("luarocks.path") -local dir = require("luarocks.dir") -local queries = require("luarocks.queries") - -local unpack = table.unpack or unpack - -function busted.detect_type() - if fs.exists(".busted") then - return true - end - return false -end - -function busted.run_tests(test, args) - if not test then - test = {} - end - - local ok, bustedver, where = deps.fulfill_dependency(queries.new("busted"), nil, nil, nil, "test_dependencies") - if not ok then - return nil, bustedver - end - - local busted_exe - if test.busted_executable then - busted_exe = test.busted_executable - else - busted_exe = dir.path(path.root_dir(where), "bin", "busted") - - -- Windows fallback - local busted_bat = dir.path(path.root_dir(where), "bin", "busted.bat") - - if not fs.exists(busted_exe) and not fs.exists(busted_bat) then - return nil, "'busted' executable failed to be installed" - end - end - - local err - ok, err = fs.execute(busted_exe, unpack(args)) - if ok then - return true - else - return nil, err or "test suite failed." - end -end - - -return busted diff --git a/.luarocks/share/lua/5.1/luarocks/test/command.lua b/.luarocks/share/lua/5.1/luarocks/test/command.lua deleted file mode 100644 index 58fa22cbd..000000000 --- a/.luarocks/share/lua/5.1/luarocks/test/command.lua +++ /dev/null @@ -1,47 +0,0 @@ - -local command = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local cfg = require("luarocks.core.cfg") - -local unpack = table.unpack or unpack - -function command.detect_type() - if fs.exists("test.lua") then - return true - end - return false -end - -function command.run_tests(test, args) - if not test then - test = { - script = "test.lua" - } - end - - if not test.script and not test.command then - test.script = "test.lua" - end - - local ok - - if test.script then - if not fs.exists(test.script) then - return nil, "Test script " .. test.script .. " does not exist" - end - local lua = fs.Q(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)) -- get lua interpreter configured - ok = fs.execute(lua, test.script, unpack(args)) - elseif test.command then - ok = fs.execute(test.command, unpack(args)) - end - - if ok then - return true - else - return nil, "tests failed with non-zero exit code" - end -end - -return command diff --git a/.luarocks/share/lua/5.1/luarocks/tools/patch.lua b/.luarocks/share/lua/5.1/luarocks/tools/patch.lua deleted file mode 100644 index 6f36d7131..000000000 --- a/.luarocks/share/lua/5.1/luarocks/tools/patch.lua +++ /dev/null @@ -1,716 +0,0 @@ ---- Patch utility to apply unified diffs. --- --- http://lua-users.org/wiki/LuaPatch --- --- (c) 2008 David Manura, Licensed under the same terms as Lua (MIT license). --- Code is heavily based on the Python-based patch.py version 8.06-1 --- Copyright (c) 2008 rainforce.org, MIT License --- Project home: http://code.google.com/p/python-patch/ . --- Version 0.1 - -local patch = {} - -local fs = require("luarocks.fs") -local fun = require("luarocks.fun") - -local io = io -local os = os -local string = string -local table = table -local format = string.format - --- logging -local debugmode = false -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. -local function startswith(s, s2) - return s:sub(1, #s2) == s2 -end - --- Returns boolean whether string s2 ends with string s. -local function endswith(s, s2) - return #s >= #s2 and s:sub(#s-#s2+1) == s2 -end - --- Returns string s after filtering out any new-line characters from end. -local function endlstrip(s) - return s:gsub('[\r\n]+$', '') -end - --- Returns shallow copy of table t. -local function table_copy(t) - local t2 = {} - for k,v in pairs(t) do t2[k] = v end - return t2 -end - -local function exists(filename) - local fh = io.open(filename) - local result = fh ~= nil - if fh then fh:close() end - return result -end -local function isfile() return true end --FIX? - -local function string_as_file(s) - return { - at = 0, - str = s, - len = #s, - eof = false, - read = function(self, n) - if self.eof then return nil end - local chunk = self.str:sub(self.at, self.at + n - 1) - self.at = self.at + n - if self.at > self.len then - self.eof = true - end - return chunk - end, - close = function(self) - self.eof = true - end, - } -end - --- --- file_lines(f) is similar to f:lines() for file f. --- The main difference is that read_lines includes --- new-line character sequences ("\n", "\r\n", "\r"), --- if any, at the end of each line. Embedded "\0" are also handled. --- Caution: The newline behavior can depend on whether f is opened --- in binary or ASCII mode. --- (file_lines - version 20080913) --- -local function file_lines(f) - local CHUNK_SIZE = 1024 - local buffer = "" - local pos_beg = 1 - return function() - local pos, chars - while 1 do - pos, chars = buffer:match('()([\r\n].)', pos_beg) - if pos or not f then - break - elseif f then - local chunk = f:read(CHUNK_SIZE) - if chunk then - buffer = buffer:sub(pos_beg) .. chunk - pos_beg = 1 - else - f = nil - end - end - end - if not pos then - pos = #buffer - elseif chars == '\r\n' then - pos = pos + 1 - end - local line = buffer:sub(pos_beg, pos) - pos_beg = pos + 1 - if #line > 0 then - return line - end - end -end - -local function match_linerange(line) - local m1, m2, m3, m4 = line:match("^@@ %-(%d+),(%d+) %+(%d+),(%d+)") - if not m1 then m1, m3, m4 = line:match("^@@ %-(%d+) %+(%d+),(%d+)") end - if not m1 then m1, m2, m3 = line:match("^@@ %-(%d+),(%d+) %+(%d+)") end - if not m1 then m1, m3 = line:match("^@@ %-(%d+) %+(%d+)") end - return m1, m2, m3, m4 -end - -local function match_epoch(str) - return str:match("[^0-9]1969[^0-9]") or str:match("[^0-9]1970[^0-9]") -end - -function patch.read_patch(filename, data) - -- define possible file regions that will direct the parser flow - local state = 'header' - -- 'header' - comments before the patch body - -- 'filenames' - lines starting with --- and +++ - -- 'hunkhead' - @@ -R +R @@ sequence - -- 'hunkbody' - -- 'hunkskip' - skipping invalid hunk mode - - local all_ok = true - local lineends = {lf=0, crlf=0, cr=0} - local files = {source={}, target={}, epoch={}, hunks={}, fileends={}, hunkends={}} - local nextfileno = 0 - local nexthunkno = 0 --: even if index starts with 0 user messages - -- number hunks from 1 - - -- hunkinfo holds parsed values, hunkactual - calculated - local hunkinfo = { - startsrc=nil, linessrc=nil, starttgt=nil, linestgt=nil, - invalid=false, text={} - } - local hunkactual = {linessrc=nil, linestgt=nil} - - info(format("reading patch %s", filename)) - - local fp - if data then - fp = string_as_file(data) - else - fp = filename == '-' and io.stdin or assert(io.open(filename, "rb")) - end - local lineno = 0 - - for line in file_lines(fp) do - lineno = lineno + 1 - if state == 'header' then - if startswith(line, "--- ") then - state = 'filenames' - end - -- state is 'header' or 'filenames' - end - 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"^[- +\\]" then - -- gather stats about line endings - local he = files.hunkends[nextfileno] - if endswith(line, "\r\n") then - he.crlf = he.crlf + 1 - elseif endswith(line, "\n") then - he.lf = he.lf + 1 - elseif endswith(line, "\r") then - he.cr = he.cr + 1 - end - if startswith(line, "-") then - hunkactual.linessrc = hunkactual.linessrc + 1 - elseif startswith(line, "+") then - hunkactual.linestgt = hunkactual.linestgt + 1 - elseif startswith(line, "\\") then - -- nothing - else - hunkactual.linessrc = hunkactual.linessrc + 1 - hunkactual.linestgt = hunkactual.linestgt + 1 - end - table.insert(hunkinfo.text, line) - -- todo: handle \ No newline cases - else - warning(format("invalid hunk no.%d at %d for target file %s", - nexthunkno, lineno, files.target[nextfileno])) - -- add hunk status node - table.insert(files.hunks[nextfileno], table_copy(hunkinfo)) - files.hunks[nextfileno][nexthunkno].invalid = true - all_ok = false - state = 'hunkskip' - end - - -- check exit conditions - if hunkactual.linessrc > hunkinfo.linessrc or - hunkactual.linestgt > hunkinfo.linestgt - then - warning(format("extra hunk no.%d lines at %d for target %s", - nexthunkno, lineno, files.target[nextfileno])) - -- add hunk status node - table.insert(files.hunks[nextfileno], table_copy(hunkinfo)) - files.hunks[nextfileno][nexthunkno].invalid = true - state = 'hunkskip' - elseif hunkinfo.linessrc == hunkactual.linessrc and - hunkinfo.linestgt == hunkactual.linestgt - then - table.insert(files.hunks[nextfileno], table_copy(hunkinfo)) - state = 'hunkskip' - - -- detect mixed window/unix line ends - local ends = files.hunkends[nextfileno] - if (ends.cr~=0 and 1 or 0) + (ends.crlf~=0 and 1 or 0) + - (ends.lf~=0 and 1 or 0) > 1 - then - warning(format("inconsistent line ends in patch hunks for %s", - files.source[nextfileno])) - end - end - -- state is 'hunkbody' or 'hunkskip' - end - - if state == 'hunkskip' then - if match_linerange(line) then - state = 'hunkhead' - elseif startswith(line, "--- ") then - state = 'filenames' - if debugmode and #files.source > 0 then - debug(format("- %2d hunks for %s", #files.hunks[nextfileno], - files.source[nextfileno])) - end - end - -- state is 'hunkskip', 'hunkhead', or 'filenames' - end - local advance - if state == 'filenames' then - if startswith(line, "--- ") then - if fun.contains(files.source, nextfileno) then - all_ok = false - warning(format("skipping invalid patch for %s", - files.source[nextfileno+1])) - table.remove(files.source, nextfileno+1) - -- double source filename line is encountered - -- attempt to restart from this second line - end - -- Accept a space as a terminator, like GNU patch does. - -- Breaks patches containing filenames with spaces... - -- FIXME Figure out what does GNU patch do in those cases. - local match, rest = line:match("^%-%-%- ([^ \t\r\n]+)(.*)") - if not match then - all_ok = false - warning(format("skipping invalid filename at line %d", lineno+1)) - state = 'header' - else - if match_epoch(rest) then - files.epoch[nextfileno + 1] = true - end - table.insert(files.source, match) - end - elseif not startswith(line, "+++ ") then - if fun.contains(files.source, nextfileno) then - all_ok = false - warning(format("skipping invalid patch with no target for %s", - files.source[nextfileno+1])) - table.remove(files.source, nextfileno+1) - else - -- this should be unreachable - warning("skipping invalid target patch") - end - state = 'header' - else - if fun.contains(files.target, nextfileno) then - all_ok = false - warning(format("skipping invalid patch - double target at line %d", - lineno+1)) - table.remove(files.source, nextfileno+1) - table.remove(files.target, nextfileno+1) - nextfileno = nextfileno - 1 - -- double target filename line is encountered - -- switch back to header state - state = 'header' - else - -- Accept a space as a terminator, like GNU patch does. - -- Breaks patches containing filenames with spaces... - -- FIXME Figure out what does GNU patch do in those cases. - local re_filename = "^%+%+%+ ([^ \t\r\n]+)(.*)$" - local match, rest = line:match(re_filename) - if not match then - all_ok = false - warning(format( - "skipping invalid patch - no target filename at line %d", - lineno+1)) - state = 'header' - else - table.insert(files.target, match) - nextfileno = nextfileno + 1 - if match_epoch(rest) then - files.epoch[nextfileno] = true - end - nexthunkno = 0 - table.insert(files.hunks, {}) - table.insert(files.hunkends, table_copy(lineends)) - table.insert(files.fileends, table_copy(lineends)) - state = 'hunkhead' - advance = true - end - end - end - -- state is 'filenames', 'header', or ('hunkhead' with advance) - end - if not advance and state == 'hunkhead' then - local m1, m2, m3, m4 = match_linerange(line) - if not m1 then - if not fun.contains(files.hunks, nextfileno-1) then - all_ok = false - warning(format("skipping invalid patch with no hunks for file %s", - files.target[nextfileno])) - end - state = 'header' - else - hunkinfo.startsrc = tonumber(m1) - hunkinfo.linessrc = tonumber(m2 or 1) - hunkinfo.starttgt = tonumber(m3) - hunkinfo.linestgt = tonumber(m4 or 1) - hunkinfo.invalid = false - hunkinfo.text = {} - - hunkactual.linessrc = 0 - hunkactual.linestgt = 0 - - state = 'hunkbody' - nexthunkno = nexthunkno + 1 - end - -- state is 'header' or 'hunkbody' - end - end - if state ~= 'hunkskip' then - warning(format("patch file incomplete - %s", filename)) - all_ok = false - -- os.exit(?) - else - -- duplicated message when an eof is reached - if debugmode and #files.source > 0 then - debug(format("- %2d hunks for %s", #files.hunks[nextfileno], - files.source[nextfileno])) - end - end - - local sum = 0; for _,hset in ipairs(files.hunks) do sum = sum + #hset end - info(format("total files: %d total hunks: %d", #files.source, sum)) - fp:close() - return files, all_ok -end - -local function find_hunk(file, h, hno) - for fuzz=0,2 do - local lineno = h.startsrc - for i=0,#file do - local found = true - local location = lineno - for l, hline in ipairs(h.text) do - if l > fuzz then - -- todo: \ No newline at the end of file - if startswith(hline, " ") or startswith(hline, "-") then - local line = file[lineno] - lineno = lineno + 1 - if not line or #line == 0 then - found = false - break - end - if endlstrip(line) ~= endlstrip(hline:sub(2)) then - found = false - break - end - end - end - end - if found then - local offset = location - h.startsrc - fuzz - if offset ~= 0 then - warning(format("Hunk %d found at offset %d%s...", hno, offset, fuzz == 0 and "" or format(" (fuzz %d)", fuzz))) - end - h.startsrc = location - h.starttgt = h.starttgt + offset - for _=1,fuzz do - table.remove(h.text, 1) - table.remove(h.text, #h.text) - end - return true - end - lineno = i - end - end - return false -end - -local function load_file(filename) - local fp = assert(io.open(filename)) - local file = {} - local readline = file_lines(fp) - while true do - local line = readline() - if not line then break end - table.insert(file, line) - end - fp:close() - return file -end - -local function find_hunks(file, hunks) - for hno, h in ipairs(hunks) do - find_hunk(file, h, hno) - end -end - -local function check_patched(file, hunks) - local lineno = 1 - local ok, err = pcall(function() - if #file == 0 then - 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', 0) - end - lineno = h.starttgt - for _, hline in ipairs(h.text) do - -- todo: \ No newline at the end of file - if not startswith(hline, "-") and not startswith(hline, "\\") then - local line = file[lineno] - lineno = lineno + 1 - if #line == 0 then - error('nomatch', 0) - end - if endlstrip(line) ~= endlstrip(hline:sub(2)) then - warning(format("file is not patched - failed hunk: %d", hno)) - error('nomatch', 0) - end - end - end - end - end) - -- todo: display failed hunk, i.e. expected/found - return err ~= 'nomatch' -end - -local function patch_hunks(srcname, tgtname, hunks) - local src = assert(io.open(srcname, "rb")) - local tgt = assert(io.open(tgtname, "wb")) - - local src_readline = file_lines(src) - - -- todo: detect linefeeds early - in apply_files routine - -- to handle cases when patch starts right from the first - -- line and no lines are processed. At the moment substituted - -- lineends may not be the same at the start and at the end - -- of patching. Also issue a warning about mixed lineends - - local srclineno = 1 - local lineends = {['\n']=0, ['\r\n']=0, ['\r']=0} - for hno, h in ipairs(hunks) do - debug(format("processing hunk %d for file %s", hno, tgtname)) - -- skip to line just before hunk starts - while srclineno < h.startsrc do - local line = src_readline() - -- Python 'U' mode works only with text files - if endswith(line, "\r\n") then - lineends["\r\n"] = lineends["\r\n"] + 1 - elseif endswith(line, "\n") then - lineends["\n"] = lineends["\n"] + 1 - elseif endswith(line, "\r") then - lineends["\r"] = lineends["\r"] + 1 - end - tgt:write(line) - srclineno = srclineno + 1 - end - - for _,hline in ipairs(h.text) do - -- todo: check \ No newline at the end of file - if startswith(hline, "-") or startswith(hline, "\\") then - src_readline() - srclineno = srclineno + 1 - else - if not startswith(hline, "+") then - src_readline() - srclineno = srclineno + 1 - end - local line2write = hline:sub(2) - -- detect if line ends are consistent in source file - local sum = 0 - 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 - tgt:write(endlstrip(line2write) .. newline) - else -- newlines are mixed or unknown - tgt:write(line2write) - end - end - end - end - for line in src_readline do - tgt:write(line) - end - tgt:close() - src:close() - return true -end - -local function strip_dirs(filename, strip) - if strip == nil then return filename end - for _=1,strip do - filename=filename:gsub("^[^/]*/", "") - end - return filename -end - -local function write_new_file(filename, hunk) - local fh = io.open(filename, "wb") - if not fh then return false end - for _, hline in ipairs(hunk.text) do - local c = hline:sub(1,1) - if c ~= "+" and c ~= "-" and c ~= " " then - return false, "malformed patch" - end - fh:write(hline:sub(2)) - end - fh:close() - return true -end - -local function patch_file(source, target, epoch, hunks, strip, create_delete) - local create_file = false - if create_delete then - local is_src_epoch = epoch and #hunks == 1 and hunks[1].startsrc == 0 and hunks[1].linessrc == 0 - if is_src_epoch or source == "/dev/null" then - info(format("will create %s", target)) - create_file = true - end - end - if create_file then - return write_new_file(fs.absolute_name(strip_dirs(target, strip)), hunks[1]) - end - source = strip_dirs(source, strip) - local f2patch = source - if not exists(f2patch) then - f2patch = strip_dirs(target, strip) - f2patch = fs.absolute_name(f2patch) - if not exists(f2patch) then --FIX:if f2patch nil - warning(format("source/target file does not exist\n--- %s\n+++ %s", - source, f2patch)) - return false - end - end - if not isfile(f2patch) then - warning(format("not a file - %s", f2patch)) - return false - end - - source = f2patch - - -- validate before patching - local file = load_file(source) - local hunkno = 1 - local hunk = hunks[hunkno] - local hunkfind = {} - local validhunks = 0 - local canpatch = false - local hunklineno - if not file then - return nil, "failed reading file " .. source - end - - if create_delete then - if epoch and #hunks == 1 and hunks[1].starttgt == 0 and hunks[1].linestgt == 0 then - local ok = os.remove(source) - if not ok then - return false - end - info(format("successfully removed %s", source)) - return true - end - end - - find_hunks(file, hunks) - - local function process_line(line, lineno) - if not hunk or lineno < hunk.startsrc then - return false - end - if 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 - hunklineno = 1 - - -- todo \ No newline at end of file - end - -- check hunks in source file - if lineno < hunk.startsrc + #hunkfind - 1 then - if endlstrip(line) == hunkfind[hunklineno] then - hunklineno = hunklineno + 1 - else - debug(format("hunk no.%d doesn't match source file %s", - hunkno, source)) - -- file may be already patched, but check other hunks anyway - hunkno = hunkno + 1 - if hunkno <= #hunks then - hunk = hunks[hunkno] - return false - else - return true - end - end - end - -- check if processed line is the last line - if lineno == hunk.startsrc + #hunkfind - 1 then - debug(format("file %s hunk no.%d -- is ready to be patched", - source, hunkno)) - hunkno = hunkno + 1 - validhunks = validhunks + 1 - if hunkno <= #hunks then - hunk = hunks[hunkno] - else - if validhunks == #hunks then - -- patch file - canpatch = true - return true - end - end - end - return false - end - - local done = false - for lineno, line in ipairs(file) do - done = process_line(line, lineno) - if done then - break - end - end - if not done then - if hunkno <= #hunks and not create_file then - warning(format("premature end of source file %s at hunk %d", - source, hunkno)) - return false - end - end - if validhunks < #hunks then - if check_patched(file, hunks) then - warning(format("already patched %s", source)) - elseif not create_file then - warning(format("source file is different - %s", source)) - return false - end - end - if not canpatch then - return true - end - local backupname = source .. ".orig" - if exists(backupname) then - warning(format("can't backup original file to %s - aborting", - backupname)) - return false - end - local ok = os.rename(source, backupname) - if not ok then - warning(format("failed backing up %s when patching", source)) - return false - end - patch_hunks(backupname, source, hunks) - info(format("successfully patched %s", source)) - os.remove(backupname) - return true -end - -function patch.apply_patch(the_patch, strip, create_delete) - local all_ok = true - local total = #the_patch.source - for fileno, source in ipairs(the_patch.source) do - local target = the_patch.target[fileno] - local hunks = the_patch.hunks[fileno] - local epoch = the_patch.epoch[fileno] - info(format("processing %d/%d:\t %s", fileno, total, source)) - local ok = patch_file(source, target, epoch, hunks, strip, create_delete) - all_ok = all_ok and ok - end - -- todo: check for premature eof - return all_ok -end - -return patch diff --git a/.luarocks/share/lua/5.1/luarocks/tools/tar.lua b/.luarocks/share/lua/5.1/luarocks/tools/tar.lua deleted file mode 100644 index 21d5920b0..000000000 --- a/.luarocks/share/lua/5.1/luarocks/tools/tar.lua +++ /dev/null @@ -1,174 +0,0 @@ - ---- A pure-Lua implementation of untar (unpacking .tar archives) -local tar = {} - -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local fun = require("luarocks.fun") - -local blocksize = 512 - -local function get_typeflag(flag) - if flag == "0" or flag == "\0" then return "file" - elseif flag == "1" then return "link" - elseif flag == "2" then return "symlink" -- "reserved" in POSIX, "symlink" in GNU - elseif flag == "3" then return "character" - elseif flag == "4" then return "block" - elseif flag == "5" then return "directory" - elseif flag == "6" then return "fifo" - elseif flag == "7" then return "contiguous" -- "reserved" in POSIX, "contiguous" in GNU - elseif flag == "x" then return "next file" - elseif flag == "g" then return "global extended header" - elseif flag == "L" then return "long name" - elseif flag == "K" then return "long link name" - end - return "unknown" -end - -local function octal_to_number(octal) - local exp = 0 - local number = 0 - octal = octal:gsub("%s", "") - 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 - end - return number -end - -local function checksum_header(block) - local sum = 256 - for i = 1,148 do - local b = block:byte(i) or 0 - sum = sum + b - end - for i = 157,500 do - local b = block:byte(i) or 0 - sum = sum + b - end - return sum -end - -local function nullterm(s) - return s:match("^[^%z]*") -end - -local function read_header_block(block) - local header = {} - header.name = nullterm(block:sub(1,100)) - header.mode = nullterm(block:sub(101,108)):gsub(" ", "") - header.uid = octal_to_number(nullterm(block:sub(109,116))) - header.gid = octal_to_number(nullterm(block:sub(117,124))) - header.size = octal_to_number(nullterm(block:sub(125,136))) - header.mtime = octal_to_number(nullterm(block:sub(137,148))) - header.chksum = octal_to_number(nullterm(block:sub(149,156))) - header.typeflag = get_typeflag(block:sub(157,157)) - header.linkname = nullterm(block:sub(158,257)) - header.magic = block:sub(258,263) - header.version = block:sub(264,265) - header.uname = nullterm(block:sub(266,297)) - header.gname = nullterm(block:sub(298,329)) - header.devmajor = octal_to_number(nullterm(block:sub(330,337))) - header.devminor = octal_to_number(nullterm(block:sub(338,345))) - header.prefix = block:sub(346,500) - -- if header.magic ~= "ustar " and header.magic ~= "ustar\0" then - -- return false, ("Invalid header magic %6x"):format(bestring_to_number(header.magic)) - -- end - -- if header.version ~= "00" and header.version ~= " \0" then - -- return false, "Unknown version "..header.version - -- end - if checksum_header(block) ~= header.chksum then - return false, "Failed header checksum" - end - return header -end - -function tar.untar(filename, destdir) - assert(type(filename) == "string") - assert(type(destdir) == "string") - - local tar_handle = io.open(filename, "rb") - if not tar_handle then return nil, "Error opening file "..filename end - - local long_name, long_link_name - local ok, err - local make_dir = fun.memoize(fs.make_dir) - while true do - local block - repeat - block = tar_handle:read(blocksize) - until (not block) or checksum_header(block) > 256 - if not block then break end - if #block < blocksize then - ok, err = nil, "Invalid block size -- corrupted file?" - break - end - local header - header, err = read_header_block(block) - if not header then - ok = false - break - end - - local file_data = tar_handle:read(math.ceil(header.size / blocksize) * blocksize):sub(1,header.size) - - if header.typeflag == "long name" then - long_name = nullterm(file_data) - elseif header.typeflag == "long link name" then - long_link_name = nullterm(file_data) - else - if long_name then - header.name = long_name - long_name = nil - end - if long_link_name then - header.name = long_link_name - long_link_name = nil - end - end - local pathname = dir.path(destdir, header.name) - pathname = fs.absolute_name(pathname) - if header.typeflag == "directory" then - ok, err = make_dir(pathname) - if not ok then - break - end - elseif header.typeflag == "file" then - local dirname = dir.dir_name(pathname) - if dirname ~= "" then - ok, err = make_dir(dirname) - if not ok then - break - end - end - local file_handle - file_handle, err = io.open(pathname, "wb") - if not file_handle then - ok = nil - break - end - file_handle:write(file_data) - file_handle:close() - fs.set_time(pathname, header.mtime) - if header.mode:match("[75]") then - fs.set_permissions(pathname, "exec", "all") - else - fs.set_permissions(pathname, "read", "all") - end - end - --[[ - for k,v in pairs(header) do - util.printout("[\""..tostring(k).."\"] = "..(type(v)=="number" and v or "\""..v:gsub("%z", "\\0").."\"")) - end - util.printout() - --]] - end - tar_handle:close() - return ok, err -end - -return tar diff --git a/.luarocks/share/lua/5.1/luarocks/tools/zip.lua b/.luarocks/share/lua/5.1/luarocks/tools/zip.lua deleted file mode 100644 index 82d582fa8..000000000 --- a/.luarocks/share/lua/5.1/luarocks/tools/zip.lua +++ /dev/null @@ -1,531 +0,0 @@ - ---- A Lua implementation of .zip and .gz file compression and decompression, --- using only lzlib or lua-lzib. -local zip = {} - -local zlib = require("zlib") -local fs = require("luarocks.fs") -local fun = require("luarocks.fun") -local dir = require("luarocks.dir") - -local pack = table.pack or function(...) return { n = select("#", ...), ... } end - -local function shr(n, m) - return math.floor(n / 2^m) -end - -local function shl(n, m) - return n * 2^m -end -local function lowbits(n, m) - return n % 2^m -end - -local function mode_to_windowbits(mode) - if mode == "gzip" then - return 31 - elseif mode == "zlib" then - return 0 - elseif mode == "raw" then - return -15 - end -end - --- zlib module can be provided by both lzlib and lua-lzib packages. --- Create a compatibility layer. -local zlib_compress, zlib_uncompress, zlib_crc32 -if zlib._VERSION:match "^lua%-zlib" then - function zlib_compress(data, mode) - return (zlib.deflate(6, mode_to_windowbits(mode))(data, "finish")) - end - - function zlib_uncompress(data, mode) - return (zlib.inflate(mode_to_windowbits(mode))(data)) - end - - function zlib_crc32(data) - return zlib.crc32()(data) - end -elseif zlib._VERSION:match "^lzlib" then - function zlib_compress(data, mode) - return zlib.compress(data, -1, nil, mode_to_windowbits(mode)) - end - - function zlib_uncompress(data, mode) - return zlib.decompress(data, mode_to_windowbits(mode)) - end - - function zlib_crc32(data) - return zlib.crc32(zlib.crc32(), data) - end -else - error("unknown zlib library", 0) -end - -local function number_to_lestring(number, nbytes) - local out = {} - for _ = 1, nbytes do - local byte = number % 256 - table.insert(out, string.char(byte)) - number = (number - byte) / 256 - end - return table.concat(out) -end - -local function lestring_to_number(str) - local n = 0 - local bytes = { string.byte(str, 1, #str) } - for b = 1, #str do - n = n + shl(bytes[b], (b-1)*8) - end - return math.floor(n) -end - -local LOCAL_FILE_HEADER_SIGNATURE = number_to_lestring(0x04034b50, 4) -local DATA_DESCRIPTOR_SIGNATURE = number_to_lestring(0x08074b50, 4) -local CENTRAL_DIRECTORY_SIGNATURE = number_to_lestring(0x02014b50, 4) -local END_OF_CENTRAL_DIR_SIGNATURE = number_to_lestring(0x06054b50, 4) - ---- Begin a new file to be stored inside the zipfile. --- @param self handle of the zipfile being written. --- @param filename filenome of the file to be added to the zipfile. --- @return true if succeeded, nil in case of failure. -local function zipwriter_open_new_file_in_zip(self, filename) - if self.in_open_file then - self:close_file_in_zip() - return nil - end - local lfh = {} - self.local_file_header = lfh - lfh.last_mod_file_time = 0 -- TODO - lfh.last_mod_file_date = 0 -- TODO - lfh.file_name_length = #filename - lfh.extra_field_length = 0 - lfh.file_name = filename:gsub("\\", "/") - lfh.external_attr = shl(493, 16) -- TODO proper permissions - self.in_open_file = true - return true -end - ---- Write data to the file currently being stored in the zipfile. --- @param self handle of the zipfile being written. --- @param data string containing full contents of the file. --- @return true if succeeded, nil in case of failure. -local function zipwriter_write_file_in_zip(self, data) - if not self.in_open_file then - return nil - end - local lfh = self.local_file_header - local compressed = zlib_compress(data, "raw") - lfh.crc32 = zlib_crc32(data) - lfh.compressed_size = #compressed - lfh.uncompressed_size = #data - self.data = compressed - return true -end - ---- Complete the writing of a file stored in the zipfile. --- @param self handle of the zipfile being written. --- @return true if succeeded, nil in case of failure. -local function zipwriter_close_file_in_zip(self) - local zh = self.ziphandle - - if not self.in_open_file then - return nil - end - - -- Local file header - local lfh = self.local_file_header - lfh.offset = zh:seek() - zh:write(LOCAL_FILE_HEADER_SIGNATURE) - zh:write(number_to_lestring(20, 2)) -- version needed to extract: 2.0 - zh:write(number_to_lestring(4, 2)) -- general purpose bit flag - zh:write(number_to_lestring(8, 2)) -- compression method: deflate - zh:write(number_to_lestring(lfh.last_mod_file_time, 2)) - zh:write(number_to_lestring(lfh.last_mod_file_date, 2)) - zh:write(number_to_lestring(lfh.crc32, 4)) - zh:write(number_to_lestring(lfh.compressed_size, 4)) - zh:write(number_to_lestring(lfh.uncompressed_size, 4)) - zh:write(number_to_lestring(lfh.file_name_length, 2)) - zh:write(number_to_lestring(lfh.extra_field_length, 2)) - zh:write(lfh.file_name) - - -- File data - zh:write(self.data) - - -- Data descriptor - zh:write(DATA_DESCRIPTOR_SIGNATURE) - zh:write(number_to_lestring(lfh.crc32, 4)) - zh:write(number_to_lestring(lfh.compressed_size, 4)) - zh:write(number_to_lestring(lfh.uncompressed_size, 4)) - - table.insert(self.files, lfh) - self.in_open_file = false - - return true -end - --- @return boolean or (boolean, string): true on success, --- false and an error message on failure. -local function zipwriter_add(self, file) - local fin - local ok, err = self:open_new_file_in_zip(file) - if not ok then - err = "error in opening "..file.." in zipfile" - else - fin = io.open(fs.absolute_name(file), "rb") - if not fin then - ok = false - err = "error opening "..file.." for reading" - end - end - if ok then - local data = fin:read("*a") - if not data then - err = "error reading "..file - ok = false - else - ok = self:write_file_in_zip(data) - if not ok then - err = "error in writing "..file.." in the zipfile" - end - end - end - if fin then - fin:close() - end - if ok then - ok = self:close_file_in_zip() - if not ok then - err = "error in writing "..file.." in the zipfile" - end - end - return ok == true, err -end - ---- Complete the writing of the zipfile. --- @param self handle of the zipfile being written. --- @return true if succeeded, nil in case of failure. -local function zipwriter_close(self) - local zh = self.ziphandle - - local central_directory_offset = zh:seek() - - local size_of_central_directory = 0 - -- Central directory structure - for _, lfh in ipairs(self.files) do - zh:write(CENTRAL_DIRECTORY_SIGNATURE) -- signature - zh:write(number_to_lestring(3, 2)) -- version made by: UNIX - zh:write(number_to_lestring(20, 2)) -- version needed to extract: 2.0 - zh:write(number_to_lestring(0, 2)) -- general purpose bit flag - zh:write(number_to_lestring(8, 2)) -- compression method: deflate - zh:write(number_to_lestring(lfh.last_mod_file_time, 2)) - zh:write(number_to_lestring(lfh.last_mod_file_date, 2)) - zh:write(number_to_lestring(lfh.crc32, 4)) - zh:write(number_to_lestring(lfh.compressed_size, 4)) - zh:write(number_to_lestring(lfh.uncompressed_size, 4)) - zh:write(number_to_lestring(lfh.file_name_length, 2)) - zh:write(number_to_lestring(lfh.extra_field_length, 2)) - zh:write(number_to_lestring(0, 2)) -- file comment length - zh:write(number_to_lestring(0, 2)) -- disk number start - zh:write(number_to_lestring(0, 2)) -- internal file attributes - zh:write(number_to_lestring(lfh.external_attr, 4)) -- external file attributes - zh:write(number_to_lestring(lfh.offset, 4)) -- relative offset of local header - zh:write(lfh.file_name) - size_of_central_directory = size_of_central_directory + 46 + lfh.file_name_length - end - - -- End of central directory record - zh:write(END_OF_CENTRAL_DIR_SIGNATURE) -- signature - zh:write(number_to_lestring(0, 2)) -- number of this disk - zh:write(number_to_lestring(0, 2)) -- number of disk with start of central directory - zh:write(number_to_lestring(#self.files, 2)) -- total number of entries in the central dir on this disk - zh:write(number_to_lestring(#self.files, 2)) -- total number of entries in the central dir - zh:write(number_to_lestring(size_of_central_directory, 4)) - zh:write(number_to_lestring(central_directory_offset, 4)) - zh:write(number_to_lestring(0, 2)) -- zip file comment length - zh:close() - - return true -end - ---- Return a zip handle open for writing. --- @param name filename of the zipfile to be created. --- @return a zip handle, or nil in case of error. -function zip.new_zipwriter(name) - - local zw = {} - - zw.ziphandle = io.open(fs.absolute_name(name), "wb") - if not zw.ziphandle then - return nil - end - zw.files = {} - zw.in_open_file = false - - zw.add = zipwriter_add - zw.close = zipwriter_close - zw.open_new_file_in_zip = zipwriter_open_new_file_in_zip - zw.write_file_in_zip = zipwriter_write_file_in_zip - zw.close_file_in_zip = zipwriter_close_file_in_zip - - return zw -end - ---- Compress files in a .zip archive. --- @param zipfile string: pathname of .zip archive to be created. --- @param ... Filenames to be stored in the archive are given as --- additional arguments. --- @return boolean or (boolean, string): true on success, --- false and an error message on failure. -function zip.zip(zipfile, ...) - local zw = zip.new_zipwriter(zipfile) - if not zw then - return nil, "error opening "..zipfile - end - - local args = pack(...) - local ok, err - for i=1, args.n do - local file = args[i] - if fs.is_dir(file) then - for _, entry in pairs(fs.find(file)) do - local fullname = dir.path(file, entry) - if fs.is_file(fullname) then - ok, err = zw:add(fullname) - if not ok then break end - end - end - else - ok, err = zw:add(file) - if not ok then break end - end - end - - zw:close() - return ok, err -end - - -local function ziptime_to_luatime(ztime, zdate) - local date = { - year = shr(zdate, 9) + 1980, - month = shr(lowbits(zdate, 9), 5), - day = lowbits(zdate, 5), - hour = shr(ztime, 11), - min = shr(lowbits(ztime, 11), 5), - sec = lowbits(ztime, 5) * 2, - } - - if date.month == 0 then date.month = 1 end - if date.day == 0 then date.day = 1 end - - return date -end - -local function read_file_in_zip(zh, cdr) - local sig = zh:read(4) - if sig ~= LOCAL_FILE_HEADER_SIGNATURE then - return nil, "failed reading Local File Header signature" - end - - -- Skip over the rest of the zip file header. See - -- zipwriter_close_file_in_zip for the format. - zh:seek("cur", 22) - local file_name_length = lestring_to_number(zh:read(2)) - local extra_field_length = lestring_to_number(zh:read(2)) - zh:read(file_name_length) - zh:read(extra_field_length) - - local data = zh:read(cdr.compressed_size) - - local uncompressed - if cdr.compression_method == 8 then - uncompressed = zlib_uncompress(data, "raw") - elseif cdr.compression_method == 0 then - uncompressed = data - else - return nil, "unknown compression method " .. cdr.compression_method - end - - if #uncompressed ~= cdr.uncompressed_size then - return nil, "uncompressed size doesn't match" - end - if cdr.crc32 ~= zlib_crc32(uncompressed) then - return nil, "crc32 failed (expected " .. cdr.crc32 .. ") - data: " .. uncompressed - end - - return uncompressed -end - -local function process_end_of_central_dir(zh) - local at, err = zh:seek("end", -22) - if not at then - return nil, err - end - - while true do - local sig = zh:read(4) - if sig == END_OF_CENTRAL_DIR_SIGNATURE then - break - end - at = at - 1 - local at1, err = zh:seek("set", at) - if at1 ~= at then - return nil, "Could not find End of Central Directory signature" - end - end - - -- number of this disk (2 bytes) - -- number of the disk with the start of the central directory (2 bytes) - -- total number of entries in the central directory on this disk (2 bytes) - -- total number of entries in the central directory (2 bytes) - zh:seek("cur", 6) - - local central_directory_entries = lestring_to_number(zh:read(2)) - - -- central directory size (4 bytes) - zh:seek("cur", 4) - - local central_directory_offset = lestring_to_number(zh:read(4)) - - return central_directory_entries, central_directory_offset -end - -local function process_central_dir(zh, cd_entries) - - local files = {} - - for i = 1, cd_entries do - local sig = zh:read(4) - if sig ~= CENTRAL_DIRECTORY_SIGNATURE then - return nil, "failed reading Central Directory signature" - end - - local cdr = {} - files[i] = cdr - - cdr.version_made_by = lestring_to_number(zh:read(2)) - cdr.version_needed = lestring_to_number(zh:read(2)) - cdr.bitflag = lestring_to_number(zh:read(2)) - cdr.compression_method = lestring_to_number(zh:read(2)) - cdr.last_mod_file_time = lestring_to_number(zh:read(2)) - cdr.last_mod_file_date = lestring_to_number(zh:read(2)) - cdr.last_mod_luatime = ziptime_to_luatime(cdr.last_mod_file_time, cdr.last_mod_file_date) - cdr.crc32 = lestring_to_number(zh:read(4)) - cdr.compressed_size = lestring_to_number(zh:read(4)) - cdr.uncompressed_size = lestring_to_number(zh:read(4)) - cdr.file_name_length = lestring_to_number(zh:read(2)) - cdr.extra_field_length = lestring_to_number(zh:read(2)) - cdr.file_comment_length = lestring_to_number(zh:read(2)) - cdr.disk_number_start = lestring_to_number(zh:read(2)) - cdr.internal_attr = lestring_to_number(zh:read(2)) - cdr.external_attr = lestring_to_number(zh:read(4)) - cdr.offset = lestring_to_number(zh:read(4)) - cdr.file_name = zh:read(cdr.file_name_length) - cdr.extra_field = zh:read(cdr.extra_field_length) - cdr.file_comment = zh:read(cdr.file_comment_length) - end - return files -end - ---- Uncompress files from a .zip archive. --- @param zipfile string: pathname of .zip archive to be created. --- @return boolean or (boolean, string): true on success, --- false and an error message on failure. -function zip.unzip(zipfile) - zipfile = fs.absolute_name(zipfile) - local zh, err = io.open(zipfile, "rb") - if not zh then - return nil, err - end - - local cd_entries, cd_offset = process_end_of_central_dir(zh) - if not cd_entries then - return nil, cd_offset - end - - local ok, err = zh:seek("set", cd_offset) - if not ok then - return nil, err - end - - local files, err = process_central_dir(zh, cd_entries) - if not files then - return nil, err - end - - for _, cdr in ipairs(files) do - local file = cdr.file_name - if file:sub(#file) == "/" then - local ok, err = fs.make_dir(dir.path(fs.current_dir(), file)) - if not ok then - return nil, err - end - else - local base = dir.dir_name(file) - if base ~= "" then - base = dir.path(fs.current_dir(), base) - if not fs.is_dir(base) then - local ok, err = fs.make_dir(base) - if not ok then - return nil, err - end - end - end - - local ok, err = zh:seek("set", cdr.offset) - if not ok then - return nil, err - end - - local contents, err = read_file_in_zip(zh, cdr) - if not contents then - return nil, err - end - local pathname = dir.path(fs.current_dir(), file) - local wf, err = io.open(pathname, "wb") - if not wf then - zh:close() - return nil, err - end - wf:write(contents) - wf:close() - - if cdr.external_attr > 0 then - fs.set_permissions(pathname, "exec", "all") - else - fs.set_permissions(pathname, "read", "all") - end - fs.set_time(pathname, cdr.last_mod_luatime) - end - end - zh:close() - return true -end - -function zip.gzip(input_filename, output_filename) - assert(type(input_filename) == "string") - assert(output_filename == nil or type(output_filename) == "string") - - if not output_filename then - output_filename = input_filename .. ".gz" - end - - local fn = fun.partial(fun.flip(zlib_compress), "gzip") - return fs.filter_file(fn, input_filename, output_filename) -end - -function zip.gunzip(input_filename, output_filename) - assert(type(input_filename) == "string") - assert(output_filename == nil or type(output_filename) == "string") - - if not output_filename then - output_filename = input_filename:gsub("%.gz$", "") - end - - local fn = fun.partial(fun.flip(zlib_uncompress), "gzip") - return fs.filter_file(fn, input_filename, output_filename) -end - -return zip diff --git a/.luarocks/share/lua/5.1/luarocks/type/manifest.lua b/.luarocks/share/lua/5.1/luarocks/type/manifest.lua deleted file mode 100644 index 043366eac..000000000 --- a/.luarocks/share/lua/5.1/luarocks/type/manifest.lua +++ /dev/null @@ -1,80 +0,0 @@ -local type_manifest = {} - -local type_check = require("luarocks.type_check") - -local manifest_formats = type_check.declare_schemas({ - ["3.0"] = { - repository = { - _mandatory = true, - -- packages - _any = { - -- versions - _any = { - -- items - _any = { - arch = { _type = "string", _mandatory = true }, - modules = { _any = { _type = "string" } }, - commands = { _any = { _type = "string" } }, - dependencies = { _any = { _type = "string" } }, - -- TODO: to be extended with more metadata. - } - } - } - }, - modules = { - _mandatory = true, - -- modules - _any = { - -- providers - _any = { _type = "string" } - } - }, - commands = { - _mandatory = true, - -- modules - _any = { - -- commands - _any = { _type = "string" } - } - }, - dependencies = { - -- each module - _any = { - -- each version - _any = { - -- each dependency - _any = { - name = { _type = "string" }, - namespace = { _type = "string" }, - constraints = { - _any = { - no_upgrade = { _type = "boolean" }, - op = { _type = "string" }, - version = { - string = { _type = "string" }, - _any = { _type = "number" }, - } - } - } - } - } - } - } - } -}) - ---- Type check a manifest table. --- Verify the correctness of elements from a --- manifest table, reporting on unknown fields and type --- mismatches. --- @return boolean or (nil, string): true if type checking --- succeeded, or nil and an error message if it failed. -function type_manifest.check(manifest, globals) - assert(type(manifest) == "table") - local format = manifest_formats["3.0"] - local ok, err = type_check.check_undeclared_globals(globals, format) - if not ok then return nil, err end - return type_check.type_check_table("3.0", manifest, format, "") -end - -return type_manifest diff --git a/.luarocks/share/lua/5.1/luarocks/type/rockspec.lua b/.luarocks/share/lua/5.1/luarocks/type/rockspec.lua deleted file mode 100644 index 0b4b5dcfe..000000000 --- a/.luarocks/share/lua/5.1/luarocks/type/rockspec.lua +++ /dev/null @@ -1,199 +0,0 @@ -local type_rockspec = {} - -local type_check = require("luarocks.type_check") - -type_rockspec.rockspec_format = "3.0" - --- 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". --- _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_formats, versions = type_check.declare_schemas({ - ["1.0"] = { - rockspec_format = { _type = "string" }, - package = { _type = "string", _mandatory = true }, - version = { _type = "string", _pattern = "[%w.]+-[%d]+", _mandatory = true }, - description = { - summary = { _type = "string" }, - detailed = { _type = "string" }, - homepage = { _type = "string" }, - license = { _type = "string" }, - maintainer = { _type = "string" }, - }, - dependencies = { - platforms = type_check.MAGIC_PLATFORMS, - _any = { - _type = "string", - _name = "a valid dependency string", - _pattern = "%s*([a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", - }, - }, - supported_platforms = { - _any = { _type = "string" }, - }, - external_dependencies = { - platforms = type_check.MAGIC_PLATFORMS, - _any = { - program = { _type = "string" }, - header = { _type = "string" }, - library = { _type = "string" }, - } - }, - source = { - _mandatory = true, - platforms = type_check.MAGIC_PLATFORMS, - url = { _type = "string", _mandatory = true }, - md5 = { _type = "string" }, - file = { _type = "string" }, - dir = { _type = "string" }, - tag = { _type = "string" }, - branch = { _type = "string" }, - module = { _type = "string" }, - cvs_tag = { _type = "string" }, - cvs_module = { _type = "string" }, - }, - build = { - platforms = type_check.MAGIC_PLATFORMS, - type = { _type = "string" }, - install = { - lua = { - _more = true - }, - lib = { - _more = true - }, - conf = { - _more = true - }, - bin = { - _more = true - } - }, - copy_directories = { - _any = { _type = "string" }, - }, - _more = true, - _mandatory = true - }, - hooks = { - platforms = type_check.MAGIC_PLATFORMS, - post_install = { _type = "string" }, - }, - }, - - ["1.1"] = { - deploy = { - wrap_bin_scripts = { _type = "boolean" }, - } - }, - - ["3.0"] = { - description = { - labels = { - _any = { _type = "string" } - }, - issues_url = { _type = "string" }, - }, - dependencies = { - _any = { - _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", - }, - }, - build_dependencies = { - platforms = type_check.MAGIC_PLATFORMS, - _any = { - _type = "string", - _name = "a valid dependency string", - _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", - }, - }, - test_dependencies = { - platforms = type_check.MAGIC_PLATFORMS, - _any = { - _type = "string", - _name = "a valid dependency string", - _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", - }, - }, - build = { - _mandatory = false, - }, - test = { - platforms = type_check.MAGIC_PLATFORMS, - type = { _type = "string" }, - _more = true, - }, - } -}) - -type_rockspec.order = {"rockspec_format", "package", "version", - { "source", { "url", "tag", "branch", "md5" } }, - { "description", {"summary", "detailed", "homepage", "license" } }, - "supported_platforms", "dependencies", "build_dependencies", "external_dependencies", - { "build", {"type", "modules", "copy_directories", "platforms"} }, - "test_dependencies", { "test", {"type"} }, - "hooks"} - -local function check_rockspec_using_version(rockspec, globals, version) - local schema = rockspec_formats[version] - if not schema then - return nil, "unknown rockspec format " .. version - end - local ok, err = type_check.check_undeclared_globals(globals, schema) - if ok then - ok, err = type_check.type_check_table(version, rockspec, schema, "") - end - if ok then - return true - else - return nil, err - end -end - ---- Type check a rockspec table. --- Verify the correctness of elements from a --- rockspec table, reporting on unknown fields and type --- mismatches. --- @return boolean or (nil, string): true if type checking --- succeeded, or nil and an error message if it failed. -function type_rockspec.check(rockspec, globals) - assert(type(rockspec) == "table") - - local version = rockspec.rockspec_format or "1.0" - local ok, err = check_rockspec_using_version(rockspec, globals, version) - if ok then - return true - end - - -- Rockspec parsing failed. - -- Let's see if it would pass using a later version. - - local found = false - for _, v in ipairs(versions) do - if not found then - if v == version then - found = true - end - else - local v_ok, v_err = check_rockspec_using_version(rockspec, globals, v) - if v_ok then - return nil, err .. " (using rockspec format " .. version .. " -- " .. - [[adding 'rockspec_format = "]] .. v .. [["' to the rockspec ]] .. - [[will fix this)]] - end - end - end - - return nil, err .. " (using rockspec format " .. version .. ")" -end - -return type_rockspec diff --git a/.luarocks/share/lua/5.1/luarocks/type_check.lua b/.luarocks/share/lua/5.1/luarocks/type_check.lua deleted file mode 100644 index 21085ef9a..000000000 --- a/.luarocks/share/lua/5.1/luarocks/type_check.lua +++ /dev/null @@ -1,213 +0,0 @@ - -local type_check = {} - -local cfg = require("luarocks.core.cfg") -local fun = require("luarocks.fun") -local util = require("luarocks.util") -local vers = require("luarocks.core.vers") --------------------------------------------------------------------------------- - --- A magic constant that is not used anywhere in a schema definition --- and retains equality when the table is deep-copied. -type_check.MAGIC_PLATFORMS = 0xEBABEFAC - -do - local function fill_in_version(tbl, version) - for _, v in pairs(tbl) do - if type(v) == "table" then - if v._version == nil then - v._version = version - end - fill_in_version(v) - end - end - end - - local function expand_magic_platforms(tbl) - for k,v in pairs(tbl) do - if v == type_check.MAGIC_PLATFORMS then - tbl[k] = { - _any = util.deep_copy(tbl) - } - tbl[k]._any[k] = nil - elseif type(v) == "table" then - expand_magic_platforms(v) - end - end - end - - -- Build a table of schemas. - -- @param versions a table where each key is a version number as a string, - -- and the value is a schema specification. Schema versions are considered - -- incremental: version "2.0" only needs to specify what's new/changed from - -- version "1.0". - function type_check.declare_schemas(inputs) - local schemas = {} - local parent_version - - local versions = fun.reverse_in(fun.sort_in(util.keys(inputs), vers.compare_versions)) - - for _, version in ipairs(versions) do - local schema = inputs[version] - if parent_version ~= nil then - local copy = util.deep_copy(schemas[parent_version]) - util.deep_merge(copy, schema) - schema = copy - end - fill_in_version(schema, version) - expand_magic_platforms(schema) - parent_version = version - schemas[version] = schema - end - - return schemas, versions - end -end - --------------------------------------------------------------------------------- - -local function check_version(version, typetbl, context) - local typetbl_version = typetbl._version or "1.0" - if vers.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 - ---- 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 version string: The version of the item. --- @param item any: The object being checked. --- @param typetbl any: The type-checking table for the object. --- @param context string: A string indicating the "context" where the --- 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(version, item, typetbl, context) - assert(type(version) == "string") - - if typetbl._version and typetbl._version ~= "1.0" then - local ok, err = check_version(version, typetbl, context) - if not ok then - return nil, err - end - 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..": expected a number" - end - elseif expected_type == "string" then - if item_type ~= "string" then - return nil, "Type mismatch on field "..context..": expected a string, got "..item_type - end - local pattern = typetbl._pattern - if pattern then - if not item:match("^"..pattern.."$") then - local what = typetbl._name or ("'"..pattern.."'") - return nil, "Type mismatch on field "..context..": invalid value '"..item.."' does not match " .. what - end - end - elseif expected_type == "table" then - if item_type ~= expected_type then - return nil, "Type mismatch on field "..context..": expected a table" - else - return type_check.type_check_table(version, item, typetbl, context) - end - elseif item_type ~= expected_type then - return nil, "Type mismatch on field "..context..": expected "..expected_type - end - return true -end - -local function mkfield(context, field) - if context == "" then - return tostring(field) - elseif type(field) == "string" then - return context.."."..field - else - return context.."["..tostring(field).."]" - end -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 --- matching the expected types -- the actual values of items in the --- reference table don't matter, only their types (ie, for field x --- in tbl that is correctly typed, type(tbl.x) == type(types.x)). --- If the reference table contains a field called MORE, then --- unknown fields in the checked table are accepted. --- If it contains a field called ANY, then its type will be --- used to check any unknown fields. If a field is prefixed --- 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 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. -function type_check.type_check_table(version, tbl, typetbl, context) - assert(type(version) == "string") - assert(type(tbl) == "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 = typetbl[k] or typetbl._any - if t then - local ok, err = type_check_item(version, v, t, mkfield(context, k)) - if not ok then return nil, err end - elseif typetbl._more then - -- Accept unknown field - else - if not cfg.accept_unknown_fields then - return nil, "Unknown field "..k - end - end - end - 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 - -function type_check.check_undeclared_globals(globals, typetbl) - local undeclared = {} - for glob, _ in pairs(globals) do - if not (typetbl[glob] or typetbl["MUST_"..glob]) then - table.insert(undeclared, glob) - end - end - if #undeclared == 1 then - return nil, "Unknown variable: "..undeclared[1] - elseif #undeclared > 1 then - return nil, "Unknown variables: "..table.concat(undeclared, ", ") - end - return true -end - -return type_check diff --git a/.luarocks/share/lua/5.1/luarocks/upload/api.lua b/.luarocks/share/lua/5.1/luarocks/upload/api.lua deleted file mode 100644 index df57fc802..000000000 --- a/.luarocks/share/lua/5.1/luarocks/upload/api.lua +++ /dev/null @@ -1,267 +0,0 @@ - -local api = {} - -local cfg = require("luarocks.core.cfg") -local fs = require("luarocks.fs") -local dir = require("luarocks.dir") -local util = require("luarocks.util") -local persist = require("luarocks.persist") -local multipart = require("luarocks.upload.multipart") - -local Api = {} - -local function upload_config_file() - if not cfg.config_files.user.file then - return nil - end - return (cfg.config_files.user.file:gsub("/[^/]+$", "/upload_config.lua")) -end - -function Api:load_config() - local upload_conf = upload_config_file() - if not upload_conf then return nil end - local config, err = persist.load_into_table(upload_conf) - return config -end - -function Api:save_config() - -- Test configuration before saving it. - local res, err = self:raw_method("status") - if not res then - return nil, err - end - if res.errors then - util.printerr("Server says: " .. tostring(res.errors[1])) - return - end - local upload_conf = upload_config_file() - if not upload_conf then return nil end - local ok, err = fs.make_dir(dir.dir_name(upload_conf)) - if not ok then - return nil, err - end - persist.save_from_table(upload_conf, self.config) - fs.set_permissions(upload_conf, "read", "user") -end - -function Api:check_version() - if not self._server_tool_version then - local tool_version = cfg.upload.tool_version - local res, err = self:request(tostring(self.config.server) .. "/api/tool_version", { - current = tool_version - }) - if not res then - return nil, err - end - if not res.version then - return nil, "failed to fetch tool version" - end - self._server_tool_version = res.version - if res.force_update then - return nil, "Your upload client is too out of date to continue, please upgrade LuaRocks." - end - if res.version ~= tool_version then - util.warning("your LuaRocks is out of date, consider upgrading.") - end - end - return true -end - -function Api:method(...) - local res, err = self:raw_method(...) - if not res then - return nil, err - end - if res.errors then - if res.errors[1] == "Invalid key" then - return nil, res.errors[1] .. " (use the --api-key flag to change)" - end - local msg = table.concat(res.errors, ", ") - return nil, "API Failed: " .. msg - end - return res -end - -function Api:raw_method(path, ...) - self:check_version() - local url = tostring(self.config.server) .. "/api/" .. tostring(cfg.upload.api_version) .. "/" .. tostring(self.config.key) .. "/" .. tostring(path) - return self:request(url, ...) -end - -local function encode_query_string(t, sep) - if sep == nil then - sep = "&" - end - local i = 0 - local buf = { } - for k, v in pairs(t) do - if type(k) == "number" and type(v) == "table" then - k, v = v[1], v[2] - end - buf[i + 1] = multipart.url_escape(k) - buf[i + 2] = "=" - buf[i + 3] = multipart.url_escape(v) - buf[i + 4] = sep - i = i + 4 - end - buf[i] = nil - return table.concat(buf) -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... - -function Api:request(url, params, post_params) - local vars = cfg.variables - local json_ok, json = util.require_json() - if not json_ok then return nil, "A JSON library is required for this command. "..json end - - if fs.which_tool("downloader") == "wget" then - local curl_ok, err = fs.is_tool_available(vars.CURL, "curl") - if not curl_ok then - return nil, err - end - end - - if not self.config.key then - return nil, "Must have API key before performing any actions." - end - if params and next(params) then - url = url .. ("?" .. encode_query_string(params)) - end - local method = "GET" - local out - local tmpfile = fs.tmpname() - if post_params then - method = "POST" - local curl_cmd = vars.CURL.." -f -k -L --silent --user-agent \""..cfg.user_agent.." via curl\" " - for k,v in pairs(post_params) do - local var = v - if type(v) == "table" then - var = "@"..v.fname - end - curl_cmd = curl_cmd .. "--form \""..k.."="..var.."\" " - end - if cfg.connection_timeout and cfg.connection_timeout > 0 then - curl_cmd = curl_cmd .. "--connect-timeout "..tonumber(cfg.connection_timeout).." " - end - 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) .. " - " .. 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 - " .. redact_api_url(url) - end - out = tmpfd:read("*a") - tmpfd:close() - os.remove(tmpfile) - - if self.debug then - util.printout("[" .. tostring(method) .. " via curl] " .. redact_api_url(url) .. " ... ") - end - - return json.decode(out) -end - -else -- use LuaSocket and LuaSec - -local warned_luasec = false - -function Api:request(url, params, post_params) - local json_ok, json = util.require_json() - if not json_ok then return nil, "A JSON library is required for this command. "..json end - local server = tostring(self.config.server) - local http_ok, http - local via = "luasocket" - if server:match("^https://") then - http_ok, http = pcall(require, "ssl.https") - if http_ok then - via = "luasec" - else - if not warned_luasec then - util.printerr("LuaSec is not available; using plain HTTP. Install 'luasec' to enable HTTPS.") - warned_luasec = true - end - http_ok, http = pcall(require, "socket.http") - url = url:gsub("^https", "http") - via = "luasocket" - end - else - http_ok, http = pcall(require, "socket.http") - end - if not http_ok then - return nil, "Failed loading socket library!" - end - - if not self.config.key then - return nil, "Must have API key before performing any actions." - end - local body - local headers = {} - if params and next(params) then - url = url .. ("?" .. encode_query_string(params)) - end - if post_params then - local boundary - body, boundary = multipart.encode(post_params) - headers["Content-length"] = #body - headers["Content-type"] = "multipart/form-data; boundary=" .. tostring(boundary) - end - local method = post_params and "POST" or "GET" - if self.debug then - util.printout("[" .. tostring(method) .. " via "..via.."] " .. redact_api_url(url) .. " ... ") - end - local out = {} - local _, status = http.request({ - url = url, - headers = headers, - method = method, - sink = ltn12.sink.table(out), - source = body and ltn12.source.string(body) - }) - if self.debug then - util.printout(tostring(status)) - end - local pok, ret, err = pcall(json.decode, table.concat(out)) - if pok and ret then - return ret - end - return nil, "API returned " .. tostring(status) .. " - " .. redact_api_url(url) -end - -end - -function api.new(args) - local self = {} - setmetatable(self, { __index = Api }) - self.config = self:load_config() or {} - self.config.server = args.server or self.config.server or cfg.upload.server - self.config.version = self.config.version or cfg.upload.version - self.config.key = args.temp_key or args.api_key or self.config.key - self.debug = args.debug - if not self.config.key then - return nil, "You need an API key to upload rocks.\n" .. - "Navigate to "..self.config.server.."/settings to get a key\n" .. - "and then pass it through the --api-key= flag." - end - if args.api_key then - self:save_config() - end - return self -end - -return api diff --git a/.luarocks/share/lua/5.1/luarocks/upload/multipart.lua b/.luarocks/share/lua/5.1/luarocks/upload/multipart.lua deleted file mode 100644 index 56ae873e6..000000000 --- a/.luarocks/share/lua/5.1/luarocks/upload/multipart.lua +++ /dev/null @@ -1,109 +0,0 @@ - -local multipart = {} - -local File = {} - -local unpack = unpack or table.unpack - --- socket.url.escape(s) from LuaSocket 3.0rc1 -function multipart.url_escape(s) - return (string.gsub(s, "([^A-Za-z0-9_])", function(c) - return string.format("%%%02x", string.byte(c)) - end)) -end - -function File:mime() - if not self.mimetype then - local mimetypes_ok, mimetypes = pcall(require, "mimetypes") - if mimetypes_ok then - self.mimetype = mimetypes.guess(self.fname) - end - self.mimetype = self.mimetype or "application/octet-stream" - end - return self.mimetype -end - -function File:content() - local fd = io.open(self.fname, "rb") - if not fd then - return nil, "Failed to open file: "..self.fname - end - local data = fd:read("*a") - fd:close() - return data -end - -local function rand_string(len) - local shuffled = {} - for i = 1, len do - local r = math.random(97, 122) - if math.random() >= 0.5 then - r = r - 32 - end - shuffled[i] = r - end - return string.char(unpack(shuffled)) -end - --- multipart encodes params --- returns encoded string,boundary --- params is an a table of tuple tables: --- params = { --- {key1, value2}, --- {key2, value2}, --- key3: value3 --- } -function multipart.encode(params) - local tuples = { } - for i = 1, #params do - tuples[i] = params[i] - end - for k,v in pairs(params) do - if type(k) == "string" then - table.insert(tuples, {k, v}) - end - end - local chunks = {} - for _, tuple in ipairs(tuples) do - local k,v = unpack(tuple) - k = multipart.url_escape(k) - local buffer = { 'Content-Disposition: form-data; name="' .. k .. '"' } - local content - if type(v) == "table" and v.__class == File then - buffer[1] = buffer[1] .. ('; filename="' .. v.fname:gsub(".*/", "") .. '"') - table.insert(buffer, "Content-type: " .. v:mime()) - content = v:content() - else - content = v - end - table.insert(buffer, "") - table.insert(buffer, content) - table.insert(chunks, table.concat(buffer, "\r\n")) - end - local boundary - while not boundary do - boundary = "Boundary" .. rand_string(16) - for _, chunk in ipairs(chunks) do - if chunk:find(boundary) then - boundary = nil - break - end - end - end - local inner = "\r\n--" .. boundary .. "\r\n" - return table.concat({ "--", boundary, "\r\n", - table.concat(chunks, inner), - "\r\n", "--", boundary, "--", "\r\n" }), boundary -end - -function multipart.new_file(fname, mime) - local self = {} - setmetatable(self, { __index = File }) - self.__class = File - self.fname = fname - self.mimetype = mime - return self -end - -return multipart - diff --git a/.luarocks/share/lua/5.1/luarocks/util.lua b/.luarocks/share/lua/5.1/luarocks/util.lua deleted file mode 100644 index fa3a628ed..000000000 --- a/.luarocks/share/lua/5.1/luarocks/util.lua +++ /dev/null @@ -1,650 +0,0 @@ - ---- Assorted utilities for managing tables, plus a scheduler for rollback functions. --- Does not requires modules directly (only as locals --- inside specific functions) to avoid interdependencies, --- as this is used in the bootstrapping stage of luarocks.core.cfg. - -local util = {} - -local core = require("luarocks.core.util") - -util.cleanup_path = core.cleanup_path -util.split_string = core.split_string -util.sortedpairs = core.sortedpairs -util.deep_merge = core.deep_merge -util.deep_merge_under = core.deep_merge_under -util.popen_read = core.popen_read -util.show_table = core.show_table -util.printerr = core.printerr -util.warning = core.warning -util.keys = core.keys - -local unpack = unpack or table.unpack -local pack = table.pack or function(...) return { n = select("#", ...), ... } end - -local scheduled_functions = {} - ---- Schedule a function to be executed upon program termination. --- This is useful for actions such as deleting temporary directories --- or failure rollbacks. --- @param f function: Function to be executed. --- @param ... arguments to be passed to function. --- @return table: A token representing the scheduled execution, --- which can be used to remove the item later from the list. -function util.schedule_function(f, ...) - assert(type(f) == "function") - - local item = { fn = f, args = pack(...) } - table.insert(scheduled_functions, item) - return item -end - ---- Unschedule a function. --- This is useful for cancelling a rollback of a completed operation. --- @param item table: The token representing the scheduled function that was --- returned from the schedule_function call. -function util.remove_scheduled_function(item) - for k, v in pairs(scheduled_functions) do - if v == item then - table.remove(scheduled_functions, k) - return - end - end -end - ---- Execute scheduled functions. --- Some calls create temporary files and/or directories and register --- corresponding cleanup functions. Calling this function will run --- these function, erasing temporaries. --- Functions are executed in the inverse order they were scheduled. -function util.run_scheduled_functions() - local fs = require("luarocks.fs") - if fs.change_dir_to_root then - fs.change_dir_to_root() - end - for i = #scheduled_functions, 1, -1 do - local item = scheduled_functions[i] - item.fn(unpack(item.args, 1, item.args.n)) - end -end - ---- Produce a Lua pattern that matches precisely the given string --- (this is suitable to be concatenating to other patterns, --- so it does not include beginning- and end-of-string markers (^$) --- @param s string: The input string --- @return string: The equivalent pattern -function util.matchquote(s) - return (s:gsub("[?%-+*%[%].%%()$^]","%%%1")) -end - -local var_format_pattern = "%$%((%a[%a%d_]+)%)" - --- Check if a set of needed variables are referenced --- somewhere in a list of definitions, warning the user --- about any unused ones. Each key in needed_set should --- appear as a $(XYZ) variable at least once as a --- substring of some value of var_defs. --- @param var_defs: a table with string keys and string --- values, containing variable definitions. --- @param needed_set: a set where keys are the names of --- needed variables. --- @param msg string: the warning message to display. -function util.warn_if_not_used(var_defs, needed_set, msg) - local seen = {} - for _, val in pairs(var_defs) do - for used in val:gmatch(var_format_pattern) do - seen[used] = true - end - end - for var, _ in pairs(needed_set) do - if not seen[var] then - util.warning(msg:format(var)) - end - end -end - --- Output any entries that might remain in $(XYZ) format, --- warning the user that substitutions have failed. --- @param line string: the input string -local function warn_failed_matches(line) - local any_failed = false - if line:match(var_format_pattern) then - for unmatched in line:gmatch(var_format_pattern) do - util.warning("unmatched variable " .. unmatched) - any_failed = true - end - end - return any_failed -end - ---- Perform make-style variable substitutions on string values of a table. --- For every string value tbl.x which contains a substring of the format --- "$(XYZ)" will have this substring replaced by vars["XYZ"], if that field --- exists in vars. Only string values are processed; this function --- does not scan subtables recursively. --- @param tbl table: Table to have its string values modified. --- @param vars table: Table containing string-string key-value pairs --- representing variables to replace in the strings values of tbl. -function util.variable_substitutions(tbl, vars) - assert(type(tbl) == "table") - assert(type(vars) == "table") - - local updated = {} - for k, v in pairs(tbl) do - if type(v) == "string" then - updated[k] = v:gsub(var_format_pattern, vars) - if warn_failed_matches(updated[k]) then - updated[k] = updated[k]:gsub(var_format_pattern, "") - end - end - end - for k, v in pairs(updated) do - tbl[k] = v - end -end - -function util.lua_versions(sort) - local versions = { "5.1", "5.2", "5.3", "5.4" } - local i = 0 - if sort == "descending" then - i = #versions + 1 - return function() - i = i - 1 - return versions[i] - end - else - return function() - i = i + 1 - return versions[i] - end - end -end - -function util.lua_path_variables() - local cfg = require("luarocks.core.cfg") - local lpath_var = "LUA_PATH" - local lcpath_var = "LUA_CPATH" - - local lv = cfg.lua_version:gsub("%.", "_") - if lv ~= "5_1" then - if os.getenv("LUA_PATH_" .. lv) then - lpath_var = "LUA_PATH_" .. lv - end - if os.getenv("LUA_CPATH_" .. lv) then - lcpath_var = "LUA_CPATH_" .. lv - end - end - return lpath_var, lcpath_var -end - -function util.starts_with(s, prefix) - return s:sub(1,#prefix) == prefix -end - ---- Print a line to standard output -function util.printout(...) - io.stdout:write(table.concat({...},"\t")) - io.stdout:write("\n") -end - -function util.title(msg, porcelain, underline) - if porcelain then return end - util.printout() - util.printout(msg) - util.printout((underline or "-"):rep(#msg)) - util.printout() -end - -function util.this_program(default) - local i = 1 - local last, cur = default, default - while i do - local dbg = debug and debug.getinfo(i,"S") - if not dbg then break end - last = cur - cur = dbg.source - i=i+1 - end - local prog = last:sub(1,1) == "@" and last:sub(2) or last - - -- Check if we found the true path of a script that has a wrapper - local lrdir, binpath = prog:match("^(.*)/lib/luarocks/rocks%-[0-9.]*/[^/]+/[^/]+(/bin/[^/]+)$") - if lrdir then - -- Return the wrapper instead - return lrdir .. binpath - end - - return prog -end - -function util.format_rock_name(name, namespace, version) - return (namespace and namespace.."/" or "")..name..(version and " "..version or "") -end - -function util.deps_mode_option(parser, program) - local cfg = require("luarocks.core.cfg") - - parser:option("--deps-mode", "How to handle dependencies. Four modes are supported:\n".. - "* all - use all trees from the rocks_trees list for finding dependencies\n".. - "* one - use only the current tree (possibly set with --tree)\n".. - "* order - use trees based on order (use the current tree and all ".. - "trees below it on the rocks_trees list)\n".. - "* none - ignore dependencies altogether.\n".. - "The default mode may be set with the deps_mode entry in the configuration file.\n".. - 'The current default is "'..cfg.deps_mode..'".\n'.. - "Type '"..util.this_program(program or "luarocks").."' with no ".. - "arguments to see your list of rocks trees.") - :argname("") - :choices({"all", "one", "order", "none"}) - parser:flag("--nodeps"):hidden(true) -end - -function util.see_help(command, program) - return "See '"..util.this_program(program or "luarocks")..' help'..(command and " "..command or "").."'." -end - -function util.see_also(text) - local see_also = "See also:\n" - if text then - see_also = see_also..text.."\n" - end - return see_also.." '"..util.this_program("luarocks").." help' for general options and configuration." -end - -function util.announce_install(rockspec) - local cfg = require("luarocks.core.cfg") - local path = require("luarocks.path") - - local suffix = "" - if rockspec.description and rockspec.description.license then - suffix = " (license: "..rockspec.description.license..")" - end - - util.printout(rockspec.name.." "..rockspec.version.." is now installed in "..path.root_dir(cfg.root_dir)..suffix) - util.printout() -end - ---- Collect rockspecs located in a subdirectory. --- @param versions table: A table mapping rock names to newest rockspec versions. --- @param paths table: A table mapping rock names to newest rockspec paths. --- @param unnamed_paths table: An array of rockspec paths that don't contain rock --- name and version in regular format. --- @param subdir string: path to subdirectory. -local function collect_rockspecs(versions, paths, unnamed_paths, subdir) - local fs = require("luarocks.fs") - local dir = require("luarocks.dir") - local path = require("luarocks.path") - local vers = require("luarocks.core.vers") - - if fs.is_dir(subdir) then - for file in fs.dir(subdir) do - file = dir.path(subdir, file) - - if file:match("rockspec$") and fs.is_file(file) then - local rock, version = path.parse_name(file) - - if rock then - if not versions[rock] or vers.compare_versions(version, versions[rock]) then - versions[rock] = version - paths[rock] = file - end - else - table.insert(unnamed_paths, file) - end - end - end - end -end - ---- Get default rockspec name for commands that take optional rockspec name. --- @return string or (nil, string): path to the rockspec or nil and error message. -function util.get_default_rockspec() - local versions, paths, unnamed_paths = {}, {}, {} - -- Look for rockspecs in some common locations. - collect_rockspecs(versions, paths, unnamed_paths, ".") - collect_rockspecs(versions, paths, unnamed_paths, "rockspec") - collect_rockspecs(versions, paths, unnamed_paths, "rockspecs") - - if #unnamed_paths > 0 then - -- There are rockspecs not following "name-version.rockspec" format. - -- More than one are ambiguous. - if #unnamed_paths > 1 then - return nil, "Please specify which rockspec file to use." - else - return unnamed_paths[1] - end - else - local fs = require("luarocks.fs") - local dir = require("luarocks.dir") - local basename = dir.base_name(fs.current_dir()) - - if paths[basename] then - return paths[basename] - end - - local rock = next(versions) - - if rock then - -- If there are rockspecs for multiple rocks it's ambiguous. - if next(versions, rock) then - return nil, "Please specify which rockspec file to use." - else - return paths[rock] - end - else - return nil, "Argument missing: please specify a rockspec to use on current directory." - end - end -end - --- Quote Lua string, analogous to fs.Q. --- @param s A string, such as "hello" --- @return string: A quoted string, such as '"hello"' -function util.LQ(s) - return ("%q"):format(s) -end - --- Split name and namespace of a package name. --- @param ns_name a name that may be in "namespace/name" format --- @return string, string? - name and optionally a namespace -function util.split_namespace(ns_name) - local p1, p2 = ns_name:match("^([^/]+)/([^/]+)$") - if p1 then - return p2, p1 - end - return ns_name -end - ---- Argparse action callback for namespaced rock arguments. -function util.namespaced_name_action(args, target, ns_name) - assert(type(args) == "table") - assert(type(target) == "string") - assert(type(ns_name) == "string" or not ns_name) - - if not ns_name then - return - end - - if ns_name:match("%.rockspec$") or ns_name:match("%.rock$") then - args[target] = ns_name - else - local name, namespace = util.split_namespace(ns_name) - args[target] = name:lower() - if namespace then - args.namespace = namespace:lower() - end - end -end - -function util.deep_copy(tbl) - local copy = {} - for k, v in pairs(tbl) do - if type(v) == "table" then - copy[k] = util.deep_copy(v) - else - copy[k] = v - end - end - return copy -end - --- An ode to the multitude of JSON libraries out there... -function util.require_json() - local list = { "cjson", "dkjson", "json" } - for _, lib in ipairs(list) do - local json_ok, json = pcall(require, lib) - if json_ok then - pcall(json.use_lpeg) -- optional feature in dkjson - return json_ok, json - end - end - local errmsg = "Failed loading " - for i, name in ipairs(list) do - if i == #list then - errmsg = errmsg .."and '"..name.."'. Use 'luarocks search ' to search for a library and 'luarocks install ' to install one." - else - errmsg = errmsg .."'"..name.."', " - end - end - return nil, errmsg -end - --- A portable version of fs.exists that can be used at early startup, --- before the platform has been determined and luarocks.fs has been --- initialized. -function util.exists(file) - local fd, _, code = io.open(file, "r") - if code == 13 then - -- code 13 means "Permission denied" on both Unix and Windows - -- io.open on folders always fails with code 13 on Windows - return true - end - if fd then - fd:close() - return true - end - return false -end - -do - local function Q(pathname) - if pathname:match("^.:") then - return pathname:sub(1, 2) .. '"' .. pathname:sub(3) .. '"' - end - return '"' .. pathname .. '"' - end - - function util.check_lua_version(lua_exe, luaver) - if not util.exists(lua_exe) then - return nil - end - local lv, err = util.popen_read(Q(lua_exe) .. ' -e "io.write(_VERSION:sub(5))"') - if lv == "" then - return nil - end - if luaver and luaver ~= lv then - return nil - end - return lv - end - - function util.get_luajit_version() - local cfg = require("luarocks.core.cfg") - if cfg.cache.luajit_version_checked then - return cfg.cache.luajit_version - end - cfg.cache.luajit_version_checked = true - - local ljv - if cfg.lua_version == "5.1" then - ljv = util.popen_read(Q(cfg.variables["LUA_BINDIR"] .. "/" .. cfg.lua_interpreter) .. ' -e "io.write(tostring(jit and jit.version:gsub([[^%S+ ]], [[]])))"') - if ljv == "nil" then - ljv = nil - end - end - cfg.cache.luajit_version = ljv - return ljv - end - - local find_lua_bindir - do - local exe_suffix = (package.config:sub(1, 1) == "\\" and ".exe" or "") - - local function insert_lua_variants(names, luaver) - local variants = { - "lua" .. luaver .. exe_suffix, - "lua" .. luaver:gsub("%.", "") .. exe_suffix, - "lua-" .. luaver .. exe_suffix, - "lua-" .. luaver:gsub("%.", "") .. exe_suffix, - } - for _, name in ipairs(variants) do - names[name] = luaver - table.insert(names, name) - end - end - - find_lua_bindir = function(prefix, luaver, verbose) - local names = {} - if luaver then - insert_lua_variants(names, luaver) - else - for v in util.lua_versions("descending") do - insert_lua_variants(names, v) - end - end - if luaver == "5.1" or not luaver then - table.insert(names, "luajit" .. exe_suffix) - end - table.insert(names, "lua" .. exe_suffix) - - local tried = {} - local dir_sep = package.config:sub(1, 1) - for _, d in ipairs({ prefix .. dir_sep .. "bin", prefix }) do - for _, name in ipairs(names) do - local lua_exe = d .. dir_sep .. name - local is_wrapper, err = util.lua_is_wrapper(lua_exe) - if is_wrapper == false then - local lv = util.check_lua_version(lua_exe, luaver) - if lv then - return name, d, lv - end - elseif is_wrapper == true or err == nil then - table.insert(tried, lua_exe) - else - table.insert(tried, string.format("%-13s (%s)", lua_exe, err)) - end - end - end - local interp = luaver - and ("Lua " .. luaver .. " interpreter") - or "Lua interpreter" - return nil, interp .. " not found at " .. prefix .. "\n" .. - (verbose and "Tried:\t" .. table.concat(tried, "\n\t") or "") - end - end - - function util.find_lua(prefix, luaver, verbose) - local lua_interpreter, bindir - lua_interpreter, bindir, luaver = find_lua_bindir(prefix, luaver, verbose) - if not lua_interpreter then - return nil, bindir - end - - return { - lua_version = luaver, - lua_interpreter = lua_interpreter, - lua_dir = prefix, - lua_bindir = bindir, - } - end -end - -function util.lua_is_wrapper(interp) - local fd, err = io.open(interp, "r") - if not fd then - return nil, err - end - local data, err = fd:read(1000) - fd:close() - if not data then - return nil, err - end - return not not data:match("LUAROCKS_SYSCONFDIR") -end - -function util.opts_table(type_name, valid_opts) - local opts_mt = {} - - opts_mt.__index = opts_mt - - function opts_mt.type() - return type_name - end - - return function(opts) - for k, v in pairs(opts) do - local tv = type(v) - if not valid_opts[k] then - error("invalid option: "..k) - end - local vo, optional = valid_opts[k]:match("^(.-)(%??)$") - if not (tv == vo or (optional == "?" and tv == nil)) then - error("invalid type option: "..k.." - got "..tv..", expected "..vo) - end - end - for k, v in pairs(valid_opts) do - if (not v:find("?", 1, true)) and opts[k] == nil then - error("missing option: "..k) - end - end - return setmetatable(opts, opts_mt) - end -end - ---- Return a table of modules that are already provided by the VM, which --- can be specified as dependencies without having to install an actual rock. --- @param rockspec (optional) a rockspec table, so that rockspec format --- version compatibility can be checked. If not given, maximum compatibility --- is assumed. --- @return a table with rock names as keys and versions and values, --- specifying modules that are already provided by the VM (including --- "lua" for the Lua version and, for format 3.0+, "luajit" if detected). -function util.get_rocks_provided(rockspec) - local cfg = require("luarocks.core.cfg") - - if not rockspec and cfg.cache.rocks_provided then - return cfg.cache.rocks_provided - end - - local rocks_provided = {} - - local lv = cfg.lua_version - - rocks_provided["lua"] = lv.."-1" - - if lv == "5.2" then - rocks_provided["bit32"] = lv.."-1" - end - - if lv == "5.3" or lv == "5.4" then - rocks_provided["utf8"] = lv.."-1" - end - - if lv == "5.1" then - local ljv = util.get_luajit_version() - if ljv then - rocks_provided["luabitop"] = ljv.."-1" - if (not rockspec) or rockspec:format_is_at_least("3.0") then - rocks_provided["luajit"] = ljv.."-1" - end - end - end - - if cfg.rocks_provided then - util.deep_merge_under(rocks_provided, cfg.rocks_provided) - end - - if not rockspec then - cfg.cache.rocks_provided = rocks_provided - end - - return rocks_provided -end - -function util.remove_doc_dir(name, version) - local path = require("luarocks.path") - local fs = require("luarocks.fs") - local dir = require("luarocks.dir") - - local install_dir = path.install_dir(name, version) - for _, f in ipairs(fs.list_dir(install_dir)) do - local doc_dirs = { "doc", "docs" } - for _, d in ipairs(doc_dirs) do - if f == d then - fs.delete(dir.path(install_dir, f)) - end - end - end -end - -return util