SUITE: luarocks install

===============================================================================
TEST: fails with no flags or arguments
RUN: luarocks install
EXIT: 1



===============================================================================
TEST: fails with an unknown rock
RUN: luarocks install aoeuaoeuaoeiaoeuaoeua
EXIT: 1



===============================================================================
TEST: fails with an invalid .rock argument
RUN: luarocks install "invalid.rock"
EXIT: 1



===============================================================================
TEST: fails with incompatible architecture
RUN: luarocks install foo-1.0-1.impossible-x86.rock
EXIT: 1
STDERR:
--------------------------------------------------------------------------------
Incompatible architecture
--------------------------------------------------------------------------------



===============================================================================
TEST: fails if not a zip file

FILE: not_a_zipfile-1.0-1.src.rock
--------------------------------------------------------------------------------
I am not a zip file!
--------------------------------------------------------------------------------
RUN: luarocks install not_a_zipfile-1.0-1.src.rock
EXIT: 1



===============================================================================
TEST: fails with an invalid patch

FILE: invalid_patch-0.1-1.rockspec
--------------------------------------------------------------------------------
package = "invalid_patch"
version = "0.1-1"
source = {
   -- any valid URL
   url = "https://raw.github.com/keplerproject/luarocks/master/src/luarocks/build.lua"
}
description = {
   summary = "A rockspec with an invalid patch",
}
dependencies = {
   "lua >= 5.1"
}
build = {
   type = "builtin",
   modules = {
      build = "build.lua"
   },
   patches = {
      ["I_am_an_invalid_patch.patch"] =
[[
diff -Naur luadoc-3.0.1/src/luadoc/doclet/html.lua luadoc-3.0.1-new/src/luadoc/doclet/html.lua
--- luadoc-3.0.1/src/luadoc/doclet/html.lua2007-12-21 15:50:48.000000000 -0200
+++ luadoc-3.0.1-new/src/luadoc/doclet/html.lua2008-02-28 01:59:53.000000000 -0300
@@ -18,6 +18,7 @@
- gabba gabba gabba
+ gobo gobo gobo
]]
   }
}
--------------------------------------------------------------------------------
RUN: luarocks invalid_patch-0.1-1.rockspec
EXIT: 1



================================================================================
TEST: handle versioned modules when installing another version with --keep #268

FILE: myrock-1.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "1.0-1"
source = {
   url = "file://%{url(tmpdir)}/rock.lua"
}
build = {
   modules = { rock = "rock.lua" }
}
--------------------------------------------------------------------------------

FILE: myrock-2.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "2.0-1"
source = {
   url = "file://%{url(tmpdir)}/rock.lua"
}
build = {
   modules = { rock = "rock.lua" }
}
--------------------------------------------------------------------------------

FILE: rock.lua
--------------------------------------------------------------------------------
return "hello"
--------------------------------------------------------------------------------

RUN: luarocks build myrock-1.0-1.rockspec
RUN: luarocks pack myrock
RUN: luarocks remove myrock

RUN: luarocks build myrock-2.0-1.rockspec
RUN: luarocks pack myrock
RUN: luarocks remove myrock

RUN: luarocks install ./myrock-2.0-1.all.rock

EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/rock.lua

RUN: luarocks install ./myrock-1.0-1.all.rock --keep

EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/rock.lua
EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/myrock_1_0_1-rock.lua

RUN: luarocks install ./myrock-2.0-1.all.rock

EXISTS:     %{testing_sys_tree}/share/lua/%{LUA_VERSION}/rock.lua
NOT_EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/myrock_1_0_1-rock.lua



================================================================================
TEST: handle versioned libraries when installing another version with --keep #268

FILE: myrock-1.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "1.0-1"
source = {
   url = "file://%{url(tmpdir)}/c_module.c"
}
build = {
   modules = {
      c_module = { "c_module.c" }
   }
}
--------------------------------------------------------------------------------

FILE: myrock-2.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "2.0-1"
source = {
   url = "file://%{url(tmpdir)}/c_module.c"
}
build = {
   modules = {
      c_module = { "c_module.c" }
   }
}
--------------------------------------------------------------------------------
FILE: c_module.c
--------------------------------------------------------------------------------
#include <lua.h>
#include <lauxlib.h>

int luaopen_c_module(lua_State* L) {
  lua_newtable(L);
  lua_pushinteger(L, 1);
  lua_setfield(L, -2, "c_module");
  return 1;
}
--------------------------------------------------------------------------------

RUN: luarocks build myrock-1.0-1.rockspec
RUN: luarocks pack myrock
RUN: luarocks remove myrock

RUN: luarocks build myrock-2.0-1.rockspec
RUN: luarocks pack myrock
RUN: luarocks remove myrock

RUN: luarocks install ./myrock-2.0-1.%{platform}.rock

EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/c_module.%{lib_extension}

RUN: luarocks install ./myrock-1.0-1.%{platform}.rock --keep

EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/c_module.%{lib_extension}
EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/myrock_1_0_1-c_module.%{lib_extension}

RUN: luarocks install ./myrock-2.0-1.%{platform}.rock

EXISTS:     %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/c_module.%{lib_extension}
NOT_EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/myrock_1_0_1-c_module.%{lib_extension}



================================================================================
TEST: installs a package with a bin entry

FILE: myrock-1.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "1.0-1"
source = {
   url = "file://%{url(tmpdir)}/rock.lua"
}
build = {
   modules = { rock = "rock.lua" },
   install = {
      bin = {
         ["scripty"] = "rock.lua",
      }
   }
}
--------------------------------------------------------------------------------

FILE: rock.lua
--------------------------------------------------------------------------------
return "hello"
--------------------------------------------------------------------------------

RUN: luarocks build myrock-1.0-1.rockspec
EXISTS: %{testing_sys_tree}/bin/scripty%{wrapper_extension}
RUN: luarocks pack myrock
RUN: luarocks remove myrock
NOT_EXISTS: %{testing_sys_tree}/bin/scripty%{wrapper_extension}

RUN: luarocks install myrock-1.0-1.all.rock
EXISTS: %{testing_sys_tree}/bin/scripty%{wrapper_extension}



================================================================================
TEST: installs a package without its documentation using --no-doc

FILE: myrock-1.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "1.0-1"
source = {
   url = "."
}
build = {
   modules = { rock = "rock.lua" },
   install = {
      bin = {
         ["scripty"] = "rock.lua",
      }
   }
}
--------------------------------------------------------------------------------

FILE: rock.lua
--------------------------------------------------------------------------------
return "hello"
--------------------------------------------------------------------------------

FILE: doc/something
--------------------------------------------------------------------------------
a doc
--------------------------------------------------------------------------------

RUN: luarocks make
EXISTS: %{testing_sys_rocks}/myrock/1.0-1/doc/something
RUN: luarocks pack myrock
RUN: luarocks remove myrock
NOT_EXISTS: %{testing_sys_rocks}/myrock/1.0-1/doc/something

RUN: luarocks install myrock-1.0-1.all.rock
EXISTS: %{testing_sys_rocks}/myrock/1.0-1/doc/something
RUN: luarocks remove myrock
NOT_EXISTS: %{testing_sys_rocks}/myrock/1.0-1/doc/something

RUN: luarocks install myrock-1.0-1.all.rock --no-doc
NOT_EXISTS: %{testing_sys_rocks}/myrock/1.0-1/doc/something



================================================================================
TEST: handle non-Lua files in build.install.lua when upgrading sailorproject/sailor#138

FILE: myrock-1.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "1.0-1"
source = {
   url = "."
}
build = {
   modules = {
      rock = "rock.lua",
   },
   install = {
      lua = {
         ["sailor.blank-app.htaccess"] = "src/sailor/blank-app/.htaccess",
      }
   }
}
--------------------------------------------------------------------------------

FILE: myrock-1.0-2.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "1.0-2"
source = {
   url = "."
}
build = {
   modules = {
      rock = "rock.lua",
   },
   install = {
      lua = {
         ["sailor.blank-app.htaccess"] = "src/sailor/blank-app/.htaccess",
      }
   }
}
--------------------------------------------------------------------------------

FILE: rock.lua
--------------------------------------------------------------------------------
return "hello"
--------------------------------------------------------------------------------

FILE: src/sailor/blank-app/.htaccess
--------------------------------------------------------------------------------
# I am just a file
--------------------------------------------------------------------------------

Prepare two versions as .rock packages with the same non-Lua asset:

RUN: luarocks make ./myrock-1.0-1.rockspec
RUN: luarocks pack myrock
RUN: luarocks remove myrock

RUN: luarocks make ./myrock-1.0-2.rockspec
RUN: luarocks pack myrock
RUN: luarocks remove myrock

Now install the first one, and check that the asset was installed, with no "~"
backup leftover:

RUN: luarocks install myrock-1.0-1.all.rock --no-doc

EXISTS:     %{testing_sys_tree}/share/lua/%{LUA_VERSION}/sailor/blank-app/.htaccess
NOT_EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/sailor/blank-app/.htaccess~

Then install the second one, and the asset should be replaced, again with no
"~" backup leftover:

RUN: luarocks install myrock-1.0-2.all.rock --no-doc

EXISTS:     %{testing_sys_tree}/share/lua/%{LUA_VERSION}/sailor/blank-app/.htaccess
NOT_EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/sailor/blank-app/.htaccess~



================================================================================
TEST: do not reinstall when already installed

FILE: myrock-1.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "1.0-1"
source = {
   url = "file://%{url(tmpdir)}/rock.lua"
}
build = {
   modules = { rock = "rock.lua" }
}
--------------------------------------------------------------------------------

FILE: rock.lua
--------------------------------------------------------------------------------
return "hello"
--------------------------------------------------------------------------------

RUN: luarocks build myrock-1.0-1.rockspec
RUN: luarocks pack myrock
RUN: luarocks remove myrock

RUN: luarocks install ./myrock-1.0-1.all.rock

RUN: luarocks show myrock
STDOUT:
--------------------------------------------------------------------------------
myrock 1.0
--------------------------------------------------------------------------------

RUN: luarocks install ./myrock-1.0-1.all.rock
STDOUT:
--------------------------------------------------------------------------------
myrock 1.0-1 is already installed
Use --force to reinstall
--------------------------------------------------------------------------------



================================================================================
TEST: installation rolls back on failure

FILE: myrock-1.0-1.rockspec
--------------------------------------------------------------------------------
rockspec_format = "3.0"
package = "myrock"
version = "1.0-1"
source = {
   url = "file://%{url(tmpdir)}/rock.lua"
}
build = {
   modules = {
      ["folder.rock"] = "rock.lua",
      ["xyz"] = "xyz.lua",
   },
}
--------------------------------------------------------------------------------

FILE: rock.lua
--------------------------------------------------------------------------------
return {}
--------------------------------------------------------------------------------

FILE: xyz.lua
--------------------------------------------------------------------------------
return {}
--------------------------------------------------------------------------------

RUN: luarocks make --pack-binary-rock ./myrock-1.0-1.rockspec

FILE: %{testing_sys_tree}/share/lua/%{lua_version}/folder
--------------------------------------------------------------------------------
a file where a folder should be
--------------------------------------------------------------------------------

Try to install and fail because the file is in the folder's spot:

RUN: luarocks install ./myrock-1.0-1.all.rock
EXIT: 1

EXISTS: %{testing_sys_tree}/share/lua/%{lua_version}/folder

No leftovers from the failed installation:

NOT_EXISTS: %{testing_sys_tree}/share/lua/%{lua_version}/xyz.lua

Now we remove the file...

RM: %{testing_sys_tree}/share/lua/%{lua_version}/folder

Try again and succeed:

RUN: luarocks install ./myrock-1.0-1.all.rock

EXISTS: %{testing_sys_tree}/share/lua/%{lua_version}/folder/rock.lua
EXISTS: %{testing_sys_tree}/share/lua/%{lua_version}/xyz.lua