summaryrefslogtreecommitdiff
path: root/ruby-runner.c
diff options
context:
space:
mode:
Diffstat (limited to 'ruby-runner.c')
-rw-r--r--ruby-runner.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/ruby-runner.c b/ruby-runner.c
index bbc2b78fa0..295ef47cc3 100644
--- a/ruby-runner.c
+++ b/ruby-runner.c
@@ -7,6 +7,10 @@
#include <sys/types.h>
#include <sys/stat.h>
+#ifdef _WIN32
+# error This feature is unnecessary on Windows in favor of SxS.
+#endif
+
#include "ruby-runner.h"
static void
@@ -25,12 +29,24 @@ insert_env_path(const char *envname, const char *paths, size_t size, int prepend
char *e = malloc(size+n+1);
size_t pos = 0;
if (prepend) {
+ if (size == n || (size < n && env[size] == PATH_SEP)) {
+ if (strncmp(paths, env, size) == 0) {
+ free(e);
+ return;
+ }
+ }
memcpy(e, paths, pos = size-1);
e[pos++] = PATH_SEP;
}
memcpy(e+pos, env, n);
pos += n;
if (!prepend) {
+ if (size == n || (size < n && env[n-size-1] == PATH_SEP)) {
+ if (strncmp(paths, &env[n-size], size) == 0) {
+ free(e);
+ return;
+ }
+ }
e[pos++] = PATH_SEP;
memcpy(e+pos, paths, size-1);
pos += size-1;
@@ -44,6 +60,9 @@ insert_env_path(const char *envname, const char *paths, size_t size, int prepend
setenv(envname, env, 1);
}
+#define insert_env_path_lit(env, path, prep) \
+ insert_env_path(env, path, sizeof(path), prep)
+
#define EXTOUT_DIR BUILDDIR"/"EXTOUT
int
main(int argc, char **argv)
@@ -65,6 +84,12 @@ main(int argc, char **argv)
insert_env_path(LIBPATHENV, builddir, dirsize, 1);
insert_env_path("RUBYLIB", rubylib, sizeof(rubylib), 0);
+ if (!getenv("GEM_PATH")) {
+ insert_env_path_lit("GEM_PATH", ABS_SRCDIR"/.bundle", 1);
+ insert_env_path_lit("GEM_PATH", BUILDDIR"/.bundle", 1);
+ setenv("GEM_HOME", BUILDDIR"/.bundle", 0);
+ }
+
if (!(p = strrchr(arg0, '/'))) p = arg0; else p++;
if (strlen(p) < namesize - 1) {
argv[0] = malloc(p - arg0 + namesize);