jruby-launcher 1.0.15-java → 1.0.16-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Makefile CHANGED
@@ -27,10 +27,10 @@ jruby.res: resources/jruby.rc
27
27
  windres $^ -O coff -o $@
28
28
 
29
29
  jruby.exe: jrubyexe.cpp nbexecloader.h utilsfuncs.cpp utilsfuncswin.cpp jruby.res
30
- g++ $(CXXFLAGS) $^ -s -o $@ $(LDLIBSOPTIONS)
30
+ g++ $(CXXFLAGS) $^ -s -o $@ $(LDLIBSOPTIONS) -static
31
31
 
32
32
  jrubyw.exe: jrubyexe.cpp nbexecloader.h utilsfuncs.cpp utilsfuncswin.cpp jruby.res
33
- g++ $(CXXFLAGS) -DJRUBYW -mwindows $^ -s -o $@ $(LDLIBSOPTIONS)
33
+ g++ $(CXXFLAGS) -DJRUBYW -mwindows $^ -s -o $@ $(LDLIBSOPTIONS) -static
34
34
 
35
35
  install:
36
36
  @if [ ! -f ./jruby ]; then echo "Please run 'make' first."; exit 1; fi
@@ -391,12 +391,14 @@ void ArgParser::prepareOptions() {
391
391
 
392
392
  option = OPT_JFFI_PATH;
393
393
  #ifdef WIN32
394
- option += (platformDir + "\\lib\\native\\i386-Windows;"
394
+ option += (platformDir + "\\lib\\native;"
395
+ + platformDir + "\\lib\\native\\i386-Windows;"
395
396
  + platformDir + "\\lib\\native\\x86_64-Windows");
396
397
  #else
397
398
  struct utsname name;
398
399
  if (uname(&name) == 0) {
399
- string ffiPath, ffiBase(platformDir + "/lib/native");
400
+ string ffiBase(platformDir + "/lib/native");
401
+ string ffiPath = ffiBase;
400
402
  DIR* dir = opendir(ffiBase.c_str());
401
403
  struct dirent* ent;
402
404
  if (dir != NULL) {
@@ -476,8 +478,6 @@ void ArgParser::setupMaxHeapAndStack(list<string> userOptions) {
476
478
  if (!maxStack) {
477
479
  javaOptions.push_back("-Xss" + stackSize);
478
480
  }
479
- javaOptions.push_back("-Djruby.memory.max=" + heapSize);
480
- javaOptions.push_back("-Djruby.stack.max=" + stackSize);
481
481
  }
482
482
 
483
483
  void ArgParser::constructBootClassPath() {
@@ -498,6 +498,14 @@ void ArgParser::constructBootClassPath() {
498
498
  addToBootClassPath(jruby_complete_jar.c_str());
499
499
  }
500
500
 
501
+ #ifdef DISTRO_BOOT_CLASS_PATH
502
+ // hack converting macro to string
503
+ #define STR_HACK2(x) #x
504
+ #define STR_HACK(x) STR_HACK2(x)
505
+ addToBootClassPath(STR_HACK(DISTRO_BOOT_CLASS_PATH));
506
+ #endif
507
+
508
+
501
509
  logMsg("BootclassPath: %s", bootClassPath.c_str());
502
510
  }
503
511
 
@@ -64,7 +64,7 @@ WINDRES = windres
64
64
  LDLIBSOPTIONS = -lstdc++
65
65
 
66
66
  ifdef MINGW
67
- LDLIBSOPTIONS += -lws2_32 -static-libgcc -Wl,--enable-auto-import -Wl,-Bstatic -Wl,-Bdynamic
67
+ LDLIBSOPTIONS += -lws2_32 -static-libgcc -Wl,--enable-auto-import -Wl,-Bstatic -Wl,-Bdynamic -static
68
68
  PROGRAM = jruby.dll
69
69
  else
70
70
  PROGRAM = jruby
@@ -78,34 +78,33 @@ void JvmLauncher::setJavaCmd(const string cmdPath) {
78
78
  javaServerDllPath = javaPath;
79
79
  }
80
80
 
81
- bool JvmLauncher::checkJava(const char *path, const char *prefix) {
82
- assert(path);
81
+ bool JvmLauncher::checkJava(std::string &path, const char *prefix) {
83
82
  assert(prefix);
84
- logMsg("checkJava(%s)", path);
85
- javaPath = path;
86
- if (*javaPath.rbegin() == '\\') {
87
- javaPath.erase(javaPath.length() - 1, 1);
83
+ logMsg("checkJava('%s', '%s')", path.c_str(), prefix);
84
+
85
+ if (*path.rbegin() == '\\') {
86
+ path.erase(path.length() - 1, 1);
88
87
  }
89
- javaExePath = javaPath + prefix + JAVA_EXE_FILE;
90
- javawExePath = javaPath + prefix + JAVAW_EXE_FILE;
91
- javaClientDllPath = javaPath + prefix + JAVA_CLIENT_DLL_FILE;
92
- javaServerDllPath = javaPath + prefix + JAVA_SERVER_DLL_FILE;
88
+ javaExePath = path + prefix + JAVA_EXE_FILE;
89
+ javawExePath = path + prefix + JAVAW_EXE_FILE;
90
+ javaClientDllPath = path + prefix + JAVA_CLIENT_DLL_FILE;
91
+ javaServerDllPath = path + prefix + JAVA_SERVER_DLL_FILE;
93
92
  if (!fileExists(javaClientDllPath.c_str())) {
94
93
  javaClientDllPath = "";
95
94
  }
96
95
  if (!fileExists(javaServerDllPath.c_str())) {
97
96
  javaServerDllPath = "";
98
97
  }
99
- javaBinPath = javaPath + prefix + JAVA_BIN_DIR;
98
+ javaBinPath = path + prefix + JAVA_BIN_DIR;
100
99
  if (fileExists(javaExePath.c_str()) || !javaClientDllPath.empty() || !javaServerDllPath.empty()) {
101
100
  if (!fileExists(javawExePath.c_str())) {
102
101
  logMsg("javaw.exe not exists, forcing java.exe");
103
102
  javawExePath = javaExePath;
104
103
  }
104
+ javaPath = path;
105
105
  return true;
106
106
  }
107
107
 
108
- javaPath.clear();
109
108
  javaBinPath.clear();
110
109
  javaExePath.clear();
111
110
  javawExePath.clear();
@@ -117,10 +116,13 @@ bool JvmLauncher::checkJava(const char *path, const char *prefix) {
117
116
  bool JvmLauncher::initialize(const char *javaPathOrMinVersion) {
118
117
  logMsg("JvmLauncher::initialize()\n\tjavaPathOrMinVersion: %s", javaPathOrMinVersion);
119
118
  assert(javaPathOrMinVersion);
119
+
120
+ std::string pathOrVersion(javaPathOrMinVersion);
121
+
120
122
  if (isVersionString(javaPathOrMinVersion)) {
121
123
  return findJava(javaPathOrMinVersion);
122
124
  } else {
123
- return (checkJava(javaPathOrMinVersion, JAVA_JRE_PREFIX) || checkJava(javaPathOrMinVersion, ""));
125
+ return (checkJava(pathOrVersion, JAVA_JRE_PREFIX) || checkJava(pathOrVersion, ""));
124
126
  }
125
127
  }
126
128
 
@@ -444,7 +446,7 @@ bool JvmLauncher::findJava(const char *javaKey, const char *prefix, const char *
444
446
  if (*path.rbegin() == '\\') {
445
447
  path.erase(path.length() - 1, 1);
446
448
  }
447
- return checkJava(path.c_str(), prefix);
449
+ return checkJava(path, prefix);
448
450
  }
449
451
  }
450
452
  }
@@ -82,7 +82,7 @@ public:
82
82
  private:
83
83
  JvmLauncher(const JvmLauncher& orig);
84
84
 
85
- bool checkJava(const char *javaPath, const char *prefix);
85
+ bool checkJava(std::string &javaPath, const char *version);
86
86
  bool findJava(const char *minJavaVersion);
87
87
  bool findJava(const char *javaKey, const char *prefix, const char *minJavaVersion);
88
88
  bool startOutProcJvm(const char *mainClassName, std::list<std::string> args, std::list<std::string> options, DWORD *retCode);
@@ -1,3 +1,3 @@
1
1
  module JRubyLauncher
2
- VERSION = "1.0.15"
2
+ VERSION = "1.0.16"
3
3
  end
data/ng.c CHANGED
@@ -1,6 +1,6 @@
1
1
  /*
2
2
 
3
- Copyright 2004, 2010, Martian Software, Inc.
3
+ Copyright 2004-2012, Martian Software, Inc.
4
4
 
5
5
  Licensed under the Apache License, Version 2.0 (the "License");
6
6
  you may not use this file except in compliance with the License.
@@ -36,8 +36,9 @@
36
36
  #include <stdlib.h>
37
37
  #include <string.h>
38
38
  #include <unistd.h>
39
+ #include <fcntl.h>
39
40
 
40
- #define NAILGUN_VERSION "0.7.1"
41
+ #define NAILGUN_VERSION "0.9.0"
41
42
 
42
43
  #define BUFSIZE (2048)
43
44
 
@@ -62,10 +63,6 @@
62
63
  #define MIN(a,b) ((a<b)?(a):(b))
63
64
  #endif
64
65
 
65
- #ifndef MSG_WAITALL
66
- #define MSG_WAITALL 0x40 /* wait for full request or error */
67
- #endif
68
-
69
66
  #ifdef WIN32
70
67
  #define NAILGUN_FILESEPARATOR "NAILGUN_FILESEPARATOR=\\"
71
68
  #define NAILGUN_PATHSEPARATOR "NAILGUN_PATHSEPARATOR=;"
@@ -80,27 +77,45 @@
80
77
  #define NAILGUN_CLIENT_NAME "ng"
81
78
  #define CHUNK_HEADER_LEN (5)
82
79
 
83
- #define NAILGUN_SOCKET_FAILED (999)
84
- #define NAILGUN_CONNECT_FAILED (998)
85
- #define NAILGUN_UNEXPECTED_CHUNKTYPE (997)
86
- #define NAILGUN_EXCEPTION_ON_SERVER (996)
87
- #define NAILGUN_CONNECTION_BROKEN (995)
88
- #define NAILGUN_BAD_ARGUMENTS (994)
80
+ #define NAILGUN_SOCKET_FAILED (231)
81
+ #define NAILGUN_CONNECT_FAILED (230)
82
+ #define NAILGUN_UNEXPECTED_CHUNKTYPE (229)
83
+ #define NAILGUN_EXCEPTION_ON_SERVER (228)
84
+ #define NAILGUN_CONNECTION_BROKEN (227)
85
+ #define NAILGUN_BAD_ARGUMENTS (226)
89
86
 
90
87
  #define CHUNKTYPE_STDIN '0'
91
88
  #define CHUNKTYPE_STDOUT '1'
92
89
  #define CHUNKTYPE_STDERR '2'
93
90
  #define CHUNKTYPE_STDIN_EOF '.'
94
91
  #define CHUNKTYPE_ARG 'A'
92
+ #define CHUNKTYPE_LONGARG 'L'
95
93
  #define CHUNKTYPE_ENV 'E'
96
94
  #define CHUNKTYPE_DIR 'D'
97
95
  #define CHUNKTYPE_CMD 'C'
98
96
  #define CHUNKTYPE_EXIT 'X'
97
+ #define CHUNKTYPE_STARTINPUT 'S'
99
98
 
99
+ // jruby-launcher specific constant
100
+ #define JRUBY_EXIT_EXCEPTION (1)
101
+
102
+ /*
103
+ the following is required to compile for hp-ux
104
+ originally posted at http://jira.codehaus.org/browse/JRUBY-2346
105
+ */
106
+ #ifndef MSG_WAITALL
107
+ #define MSG_WAITALL 0x40 /* wait for full request or error */
108
+ #endif
100
109
 
101
110
  /* the socket connected to the nailgun server */
102
111
  int nailgunsocket = 0;
103
112
 
113
+ /* buffer used for receiving and writing nail output chunks */
114
+ char buf[BUFSIZE];
115
+
116
+ /* track whether or not we've been told to send stdin to server */
117
+ int startedInput = 0;
118
+
104
119
  /**
105
120
  * Clean up the application.
106
121
  */
@@ -198,6 +213,38 @@ void sendHeader(unsigned int size, char chunkType) {
198
213
  sendAll(nailgunsocket, header, CHUNK_HEADER_LEN);
199
214
  }
200
215
 
216
+ /**
217
+ * Sends the contents of the specified file as a long argument (--nailgun-filearg)
218
+ * This is sent as one or more chunks of type CHUNK_LONGARG. The end of the argument
219
+ * is indicated by an empty chunk.
220
+ *
221
+ * @param filename the name of the file to send.
222
+ * @return nonzero on failure
223
+ */
224
+ int sendFileArg(char *filename) {
225
+ int i, f;
226
+
227
+ if ((f = open(filename, O_RDONLY)) < 0) {
228
+ perror("--nailgun-filearg");
229
+ return 1;
230
+ }
231
+
232
+ i = read(f, buf, BUFSIZE);
233
+ while (i > 0) {
234
+ sendHeader(i, CHUNKTYPE_LONGARG);
235
+ sendAll(nailgunsocket, buf, i);
236
+ i = read(f, buf, BUFSIZE);
237
+ }
238
+ if (i < 0) {
239
+ perror("--nailgun-filearg");
240
+ return 1;
241
+ }
242
+ sendHeader(0, CHUNKTYPE_LONGARG);
243
+
244
+ close(f);
245
+ return 0;
246
+ }
247
+
201
248
  /**
202
249
  * Sends a null-terminated string with the specified chunk type.
203
250
  *
@@ -205,7 +252,7 @@ void sendHeader(unsigned int size, char chunkType) {
205
252
  * @param text the null-terminated string to send
206
253
  */
207
254
  void sendText(char chunkType, char *text) {
208
- int len = strlen(text);
255
+ int len = text ? strlen(text) : 0;
209
256
  sendHeader(len, chunkType);
210
257
  sendAll(nailgunsocket, text, len);
211
258
  }
@@ -234,6 +281,8 @@ void recvToFD(HANDLE destFD, char *buf, unsigned long len) {
234
281
  int thisPass = 0;
235
282
 
236
283
  thisPass = recv(nailgunsocket, buf, bytesToRead, MSG_WAITALL);
284
+ if (thisPass < bytesToRead) handleSocketClose();
285
+
237
286
 
238
287
  bytesRead += thisPass;
239
288
 
@@ -278,47 +327,13 @@ void processExit(char *buf, unsigned long len) {
278
327
  buf[bytesRead] = 0;
279
328
 
280
329
  exitcode = atoi(buf);
330
+ if (exitcode != 0) {
331
+ exitcode = JRUBY_EXIT_EXCEPTION;
332
+ }
281
333
 
282
334
  cleanUpAndExit(exitcode);
283
335
  }
284
336
 
285
- /**
286
- * Processes data from the nailgun server.
287
- */
288
- void processnailgunstream() {
289
- /* buffer used for receiving and writing nail output chunks */
290
- char buf[BUFSIZE];
291
-
292
- /*for (;;) {*/
293
- int bytesRead = 0;
294
- unsigned long len;
295
- char chunkType;
296
-
297
- bytesRead = recv(nailgunsocket, buf, CHUNK_HEADER_LEN, 0);
298
-
299
- if (bytesRead < CHUNK_HEADER_LEN) {
300
- handleSocketClose();
301
- }
302
-
303
- len = ((buf[0] << 24) & 0xff000000)
304
- | ((buf[1] << 16) & 0x00ff0000)
305
- | ((buf[2] << 8) & 0x0000ff00)
306
- | ((buf[3]) & 0x000000ff);
307
-
308
- chunkType = buf[4];
309
-
310
- switch(chunkType) {
311
- case CHUNKTYPE_STDOUT: recvToFD(NG_STDOUT_FILENO, buf, len);
312
- break;
313
- case CHUNKTYPE_STDERR: recvToFD(NG_STDERR_FILENO, buf, len);
314
- break;
315
- case CHUNKTYPE_EXIT: processExit(buf, len);
316
- break;
317
- default: fprintf(stdout, "Unexpected chunk type %d ('%c')\n", chunkType, chunkType);
318
- cleanUpAndExit(NAILGUN_UNEXPECTED_CHUNKTYPE);
319
- }
320
- /*}*/
321
- }
322
337
 
323
338
  /**
324
339
  * Sends len bytes from buf to the nailgun server in a stdin chunk.
@@ -345,19 +360,19 @@ void processEof() {
345
360
  */
346
361
  DWORD WINAPI processStdin (LPVOID lpParameter) {
347
362
  /* buffer used for reading and sending stdin chunks */
348
- char buf[BUFSIZE];
363
+ char wbuf[BUFSIZE];
349
364
 
350
365
  for (;;) {
351
366
  DWORD numberOfBytes = 0;
352
367
 
353
- if (!ReadFile(NG_STDIN_FILENO, buf, BUFSIZE, &numberOfBytes, NULL)) {
368
+ if (!ReadFile(NG_STDIN_FILENO, wbuf, BUFSIZE, &numberOfBytes, NULL)) {
354
369
  if (numberOfBytes != 0) {
355
370
  handleError();
356
371
  }
357
372
  }
358
373
 
359
374
  if (numberOfBytes > 0) {
360
- sendStdin(buf, numberOfBytes);
375
+ sendStdin(wbuf, numberOfBytes);
361
376
  } else {
362
377
  processEof();
363
378
  break;
@@ -400,26 +415,77 @@ void initSockets () {
400
415
  * Initialise the asynchronous io.
401
416
  */
402
417
  void initIo () {
403
- SECURITY_ATTRIBUTES securityAttributes;
404
- DWORD threadId = 0;
405
-
406
418
  /* create non-blocking console io */
407
419
  AllocConsole();
420
+
421
+ NG_STDIN_FILENO = GetStdHandle(STD_INPUT_HANDLE);
422
+ NG_STDOUT_FILENO = GetStdHandle(STD_OUTPUT_HANDLE);
423
+ NG_STDERR_FILENO = GetStdHandle(STD_ERROR_HANDLE);
424
+ }
425
+ #endif
426
+
427
+ #ifdef WIN32
428
+ /**
429
+ * Initialise the asynchronous io.
430
+ */
431
+ void winStartInput () {
432
+ SECURITY_ATTRIBUTES securityAttributes;
433
+ DWORD threadId = 0;
408
434
 
409
435
  securityAttributes.bInheritHandle = TRUE;
410
436
  securityAttributes.lpSecurityDescriptor = NULL;
411
437
  securityAttributes.nLength = 0;
412
438
 
413
- NG_STDIN_FILENO = GetStdHandle(STD_INPUT_HANDLE);
414
- NG_STDOUT_FILENO = GetStdHandle(STD_OUTPUT_HANDLE);
415
- NG_STDERR_FILENO = GetStdHandle(STD_ERROR_HANDLE);
416
-
417
439
  if (!CreateThread(&securityAttributes, 0, &processStdin, NULL, 0, &threadId)) {
418
440
  handleError();
419
441
  }
420
442
  }
421
443
  #endif
422
444
 
445
+ /**
446
+ * Processes data from the nailgun server.
447
+ */
448
+ void processnailgunstream() {
449
+
450
+ /*for (;;) {*/
451
+ int bytesRead = 0;
452
+ unsigned long len;
453
+ char chunkType;
454
+
455
+ bytesRead = recv(nailgunsocket, buf, CHUNK_HEADER_LEN, MSG_WAITALL);
456
+
457
+ if (bytesRead < CHUNK_HEADER_LEN) {
458
+ handleSocketClose();
459
+ }
460
+
461
+ len = ((buf[0] << 24) & 0xff000000)
462
+ | ((buf[1] << 16) & 0x00ff0000)
463
+ | ((buf[2] << 8) & 0x0000ff00)
464
+ | ((buf[3]) & 0x000000ff);
465
+
466
+ chunkType = buf[4];
467
+
468
+ switch(chunkType) {
469
+ case CHUNKTYPE_STDOUT: recvToFD(NG_STDOUT_FILENO, buf, len);
470
+ break;
471
+ case CHUNKTYPE_STDERR: recvToFD(NG_STDERR_FILENO, buf, len);
472
+ break;
473
+ case CHUNKTYPE_EXIT: processExit(buf, len);
474
+ break;
475
+ case CHUNKTYPE_STARTINPUT:
476
+ if (!startedInput) {
477
+ #ifdef WIN32
478
+ winStartInput();
479
+ #endif
480
+ startedInput = 1;
481
+ }
482
+ break;
483
+ default: fprintf(stderr, "Unexpected chunk type %d ('%c')\n", chunkType, chunkType);
484
+ cleanUpAndExit(NAILGUN_UNEXPECTED_CHUNKTYPE);
485
+ }
486
+ /*}*/
487
+ }
488
+
423
489
  /**
424
490
  * Trims any path info from the beginning of argv[0] to determine
425
491
  * the name used to launch the client.
@@ -450,25 +516,31 @@ int isNailgunClientName(char *s) {
450
516
  * Displays usage info and bails
451
517
  */
452
518
  void usage(int exitcode) {
453
-
454
- fprintf(stdout, "Usage: ng class [--nailgun-options] [args]\n");
455
- fprintf(stdout, " (to execute a class)\n");
456
- fprintf(stdout, " or: ng alias [--nailgun-options] [args]\n");
457
- fprintf(stdout, " (to execute an aliased class)\n");
458
- fprintf(stdout, " or: alias [--nailgun-options] [args]\n");
459
- fprintf(stdout, " (to execute an aliased class, where \"alias\"\n");
460
- fprintf(stdout, " is both the alias for the class and a symbolic\n");
461
- fprintf(stdout, " link to the ng client)\n\n");
462
-
463
- fprintf(stdout, "where options include:\n");
464
- fprintf(stdout, " --nailgun-D<name>=<value> set/override a client environment variable\n");
465
- fprintf(stdout, " --nailgun-version print product version and exit\n");
466
- fprintf(stdout, " --nailgun-showversion print product version and continue\n");
467
- fprintf(stdout, " --nailgun-server to specify the address of the nailgun server\n");
468
- fprintf(stdout, " (default is localhost)\n");
469
- fprintf(stdout, " --nailgun-port to specify the port of the nailgun server\n");
470
- fprintf(stdout, " (default is 2113)\n");
471
- fprintf(stdout, " --nailgun-help print this message and exit\n");
519
+ fprintf(stderr, "NailGun v%s\n\n", NAILGUN_VERSION);
520
+ fprintf(stderr, "Usage: ng class [--nailgun-options] [args]\n");
521
+ fprintf(stderr, " (to execute a class)\n");
522
+ fprintf(stderr, " or: ng alias [--nailgun-options] [args]\n");
523
+ fprintf(stderr, " (to execute an aliased class)\n");
524
+ fprintf(stderr, " or: alias [--nailgun-options] [args]\n");
525
+ fprintf(stderr, " (to execute an aliased class, where \"alias\"\n");
526
+ fprintf(stderr, " is both the alias for the class and a symbolic\n");
527
+ fprintf(stderr, " link to the ng client)\n\n");
528
+
529
+ fprintf(stderr, "where options include:\n");
530
+ fprintf(stderr, " --nailgun-D<name>=<value> set/override a client environment variable\n");
531
+ fprintf(stderr, " --nailgun-version print product version and exit\n");
532
+ fprintf(stderr, " --nailgun-showversion print product version and continue\n");
533
+ fprintf(stderr, " --nailgun-server to specify the address of the nailgun server\n");
534
+ fprintf(stderr, " (default is NAILGUN_SERVER environment variable\n");
535
+ fprintf(stderr, " if set, otherwise localhost)\n");
536
+ fprintf(stderr, " --nailgun-port to specify the port of the nailgun server\n");
537
+ fprintf(stderr, " (default is NAILGUN_PORT environment variable\n");
538
+ fprintf(stderr, " if set, otherwise 2113)\n");
539
+ fprintf(stderr, " --nailgun-filearg FILE places the entire contents of FILE into the\n");
540
+ fprintf(stderr, " next argument, which is interpreted as a string\n");
541
+ fprintf(stderr, " using the server's default character set. May be\n");
542
+ fprintf(stderr, " specified more than once.\n");
543
+ fprintf(stderr, " --nailgun-help print this message and exit\n");
472
544
 
473
545
  cleanUpAndExit(exitcode);
474
546
  }
@@ -515,6 +587,15 @@ int nailgunClientMain(int argc, char *argv[], char *env[]) {
515
587
  cmd = NULL;
516
588
  }
517
589
 
590
+ /* if executing just the ng client with no arguments or -h|--help, then
591
+ display usage and exit. Don't handle -h|--help if a command other than
592
+ ng or ng.exe was used, since the appropriate nail should then handle
593
+ --help. */
594
+ if (cmd == NULL &&
595
+ (argc == 1 ||
596
+ (argc == 2 && strcmp("--help", argv[1]) == 0) ||
597
+ (argc == 2 && strcmp("-h", argv[1]) == 0))) usage(0);
598
+
518
599
  firstArgIndex = 1;
519
600
 
520
601
  /* quite possibly the lamest commandline parsing ever.
@@ -533,6 +614,9 @@ int nailgunClientMain(int argc, char *argv[], char *env[]) {
533
614
  nailgun_port = argv[i + 1];
534
615
  argv[i] = argv[i + 1]= NULL;
535
616
  ++i;
617
+ } else if (!strcmp("--nailgun-filearg", argv[i])) {
618
+ /* just verify usage here. do the rest when sending args. */
619
+ if (i == argc - 1) usage (NAILGUN_BAD_ARGUMENTS);
536
620
  } else if (!strcmp("--nailgun-version", argv[i])) {
537
621
  printf("NailGun client version %s\n", NAILGUN_VERSION);
538
622
  cleanUpAndExit(0);
@@ -557,7 +641,7 @@ int nailgunClientMain(int argc, char *argv[], char *env[]) {
557
641
  hostinfo = gethostbyname(nailgun_server);
558
642
 
559
643
  if (hostinfo == NULL) {
560
- fprintf(stdout, "Unknown host: %s\n", nailgun_server);
644
+ fprintf(stderr, "Unknown host: %s\n", nailgun_server);
561
645
  cleanUpAndExit(NAILGUN_CONNECT_FAILED);
562
646
  }
563
647
 
@@ -576,7 +660,7 @@ int nailgunClientMain(int argc, char *argv[], char *env[]) {
576
660
 
577
661
  if (connect(nailgunsocket, (struct sockaddr *)&server_addr,
578
662
  sizeof(struct sockaddr)) == -1) {
579
- perror("connect to Nailgun server");
663
+ perror("connect");
580
664
  cleanUpAndExit(NAILGUN_CONNECT_FAILED);
581
665
  }
582
666
 
@@ -585,7 +669,11 @@ int nailgunClientMain(int argc, char *argv[], char *env[]) {
585
669
  marked some arguments NULL if we read them to specify the
586
670
  nailgun server and/or port */
587
671
  for(i = firstArgIndex; i < argc; ++i) {
588
- if (argv[i] != NULL) sendText(CHUNKTYPE_ARG, argv[i]);
672
+ if (argv[i] != NULL) {
673
+ if (!strcmp("--nailgun-filearg", argv[i])) {
674
+ sendFileArg(argv[++i]);
675
+ } else sendText(CHUNKTYPE_ARG, argv[i]);
676
+ }
589
677
  }
590
678
 
591
679
  /* now send environment */
@@ -596,7 +684,7 @@ int nailgunClientMain(int argc, char *argv[], char *env[]) {
596
684
  }
597
685
 
598
686
  /* now send the working directory */
599
- cwd = getcwd(NULL, BUFSIZE);
687
+ cwd = getcwd(NULL, 0);
600
688
  sendText(CHUNKTYPE_DIR, cwd);
601
689
  free(cwd);
602
690
 
@@ -616,7 +704,7 @@ int nailgunClientMain(int argc, char *argv[], char *env[]) {
616
704
  FD_ZERO(&readfds);
617
705
 
618
706
  /* don't select on stdin if we've already reached its end */
619
- if (!eof) {
707
+ if (startedInput && !eof) {
620
708
  FD_SET(NG_STDIN_FILENO, &readfds);
621
709
  }
622
710
 
@@ -220,10 +220,10 @@ bool PlatformLauncher::checkJDKHome() {
220
220
  logMsg("-Xjdkhome is not set, checking for %%JAVA_HOME%%...");
221
221
  char *origJavaHome = getenv("JAVA_HOME");
222
222
  if (origJavaHome) {
223
- const char *javaHome = trimTrailingBackslashes(origJavaHome).c_str();
224
- logMsg("%%JAVA_HOME%% is set: %s", javaHome);
225
- if (!jvmLauncher.initialize(javaHome)) {
226
- logMsg("ERROR: Cannot locate java installation, specified by JAVA_HOME: %s", javaHome);
223
+ string javaHome = trimTrailingBackslashes(origJavaHome);
224
+ logMsg("%%JAVA_HOME%% is set: %s", javaHome.c_str());
225
+ if (!jvmLauncher.initialize(javaHome.c_str())) {
226
+ logMsg("ERROR: Cannot locate java installation, specified by JAVA_HOME: %s", javaHome.c_str());
227
227
  string errMsg = "Cannot locate Java installation, specified by JAVA_HOME:\n";
228
228
  errMsg += javaHome;
229
229
  string errMsgFull = errMsg + "\nDo you want to try to use default version?";
Binary file
@@ -95,19 +95,19 @@ describe "JRuby native launcher" do
95
95
  end
96
96
 
97
97
  it "should default to 500m max heap" do
98
- jruby_launcher_args("").should include("-Xmx500m", "-Djruby.memory.max=500m")
98
+ jruby_launcher_args("").should include("-Xmx500m")
99
99
  end
100
100
 
101
101
  it "should allow max heap to be overridden" do
102
- jruby_launcher_args("-J-Xmx256m").should include("-Xmx256m", "-Djruby.memory.max=256m")
102
+ jruby_launcher_args("-J-Xmx256m").should include("-Xmx256m")
103
103
  end
104
104
 
105
105
  it "should default to 2048k max stack" do
106
- jruby_launcher_args("").should include("-Xss2048k", "-Djruby.stack.max=2048k")
106
+ jruby_launcher_args("").should include("-Xss2048k")
107
107
  end
108
108
 
109
109
  it "should allow max stack to be overridden" do
110
- jruby_launcher_args("-J-Xss512k").should include("-Xss512k", "-Djruby.stack.max=512k")
110
+ jruby_launcher_args("-J-Xss512k").should include("-Xss512k")
111
111
  end
112
112
 
113
113
  it "should add the contents of the CLASSPATH environment variable" do
@@ -209,13 +209,13 @@ describe "JRuby native launcher" do
209
209
  # JRUBY-6016
210
210
  it "should honor JAVA_MEM" do
211
211
  with_environment "JAVA_MEM" => "-Xmx768m" do
212
- jruby_launcher_args("").should include("-Xmx768m", "-Djruby.memory.max=768m")
212
+ jruby_launcher_args("").should include("-Xmx768m")
213
213
  end
214
214
  end
215
215
 
216
216
  it "should honor JAVA_STACK" do
217
217
  with_environment "JAVA_STACK" => "-Xss3072k" do
218
- jruby_launcher_args("").should include("-Xss3072k", "-Djruby.stack.max=3072k")
218
+ jruby_launcher_args("").should include("-Xss3072k")
219
219
  end
220
220
  end
221
221
 
data/version.h CHANGED
@@ -6,6 +6,6 @@
6
6
  #ifndef _VERSION_H_
7
7
  #define _VERSION_H_
8
8
 
9
- #define JRUBY_LAUNCHER_VERSION "1.0.15"
9
+ #define JRUBY_LAUNCHER_VERSION "1.0.16"
10
10
 
11
11
  #endif // ! _VERSION_H_
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jruby-launcher
3
3
  version: !ruby/object:Gem::Version
4
+ version: 1.0.16
4
5
  prerelease:
5
- version: 1.0.15
6
6
  platform: java
7
7
  authors:
8
8
  - Nick Sieger
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-08-04 00:00:00.000000000 Z
13
+ date: 2013-05-21 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Builds and installs a native launcher for JRuby on your system
16
16
  email:
@@ -25,78 +25,35 @@ files:
25
25
  - README.txt
26
26
  - Makefile
27
27
  - Rakefile
28
- - !binary |-
29
- bmcuYw==
30
- - !binary |-
31
- c3RybGNweS5j
32
- - !binary |-
33
- YXJncGFyc2VyLmNwcA==
34
- - !binary |-
35
- anJ1YnkuY3Bw
36
- - !binary |-
37
- anJ1YnlleGUuY3Bw
38
- - !binary |-
39
- anZtbGF1bmNoZXIuY3Bw
40
- - !binary |-
41
- cGxhdGZvcm1sYXVuY2hlci5jcHA=
42
- - !binary |-
43
- dW5peGxhdW5jaGVyLmNwcA==
44
- - !binary |-
45
- dXRpbHNmdW5jcy5jcHA=
46
- - !binary |-
47
- dXRpbHNmdW5jc3dpbi5jcHA=
48
- - !binary |-
49
- YXJnbmFtZXMuaA==
50
- - !binary |-
51
- YXJncGFyc2VyLmg=
52
- - !binary |-
53
- anZtbGF1bmNoZXIuaA==
54
- - !binary |-
55
- bmJleGVjbG9hZGVyLmg=
56
- - !binary |-
57
- cGxhdGZvcm1sYXVuY2hlci5o
58
- - !binary |-
59
- cmJfdzMyX2NtZHZlY3Rvci5o
60
- - !binary |-
61
- dW5peGxhdW5jaGVyLmg=
62
- - !binary |-
63
- dXRpbHNmdW5jcy5o
64
- - !binary |-
65
- dmVyc2lvbi5o
66
- - !binary |-
67
- aW5jL01ha2VmaWxlLWNvbmYubWs=
68
- - !binary |-
69
- aW5jL01ha2VmaWxlLWltcGwubWs=
70
- - !binary |-
71
- aW5jL01ha2VmaWxlLXJ1bGVzLm1r
72
- - !binary |-
73
- ZXh0Y29uZi5yYg==
74
- - !binary |-
75
- bGliL2pydWJ5LWxhdW5jaGVyLnJi
76
- - !binary |-
77
- bGliL3J1YnlnZW1zL2RlZmF1bHRzL2pydWJ5X25hdGl2ZS5yYg==
78
- - !binary |-
79
- cGtnL2pydWJ5LWxhdW5jaGVyLTEuMC4xNS1qYXZhL2V4dGNvbmYucmI=
80
- - !binary |-
81
- cGtnL2pydWJ5LWxhdW5jaGVyLTEuMC4xNS1qYXZhL2xpYi9qcnVieS1sYXVu
82
- Y2hlci5yYg==
83
- - !binary |-
84
- cGtnL2pydWJ5LWxhdW5jaGVyLTEuMC4xNS1qYXZhL2xpYi9ydWJ5Z2Vtcy9k
85
- ZWZhdWx0cy9qcnVieV9uYXRpdmUucmI=
86
- - !binary |-
87
- cGtnL2pydWJ5LWxhdW5jaGVyLTEuMC4xNS1qYXZhL3NwZWMvbGF1bmNoZXJf
88
- c3BlYy5yYg==
89
- - !binary |-
90
- cGtnL2pydWJ5LWxhdW5jaGVyLTEuMC4xNS1qYXZhL3NwZWMvc3BlY19oZWxw
91
- ZXIucmI=
92
- - !binary |-
93
- c3BlYy9sYXVuY2hlcl9zcGVjLnJi
94
- - !binary |-
95
- c3BlYy9zcGVjX2hlbHBlci5yYg==
96
- - !binary |-
97
- cmVzb3VyY2VzL2pydWJ5Lmljbw==
98
- - !binary |-
99
- cmVzb3VyY2VzL2pydWJ5LnJj
28
+ - ng.c
29
+ - strlcpy.c
30
+ - argparser.cpp
31
+ - jruby.cpp
32
+ - jrubyexe.cpp
33
+ - jvmlauncher.cpp
34
+ - platformlauncher.cpp
35
+ - unixlauncher.cpp
36
+ - utilsfuncs.cpp
37
+ - utilsfuncswin.cpp
38
+ - argnames.h
39
+ - argparser.h
40
+ - jvmlauncher.h
41
+ - nbexecloader.h
42
+ - platformlauncher.h
43
+ - rb_w32_cmdvector.h
44
+ - unixlauncher.h
45
+ - utilsfuncs.h
46
+ - version.h
47
+ - inc/Makefile-conf.mk
48
+ - inc/Makefile-impl.mk
49
+ - inc/Makefile-rules.mk
50
+ - extconf.rb
51
+ - lib/jruby-launcher.rb
52
+ - lib/rubygems/defaults/jruby_native.rb
53
+ - spec/launcher_spec.rb
54
+ - spec/spec_helper.rb
55
+ - resources/jruby.ico
56
+ - resources/jruby.rc
100
57
  homepage: http://jruby.org
101
58
  licenses: []
102
59
  post_install_message:
@@ -105,17 +62,15 @@ require_paths:
105
62
  - lib
106
63
  required_ruby_version: !ruby/object:Gem::Requirement
107
64
  requirements:
108
- - - ! '>='
65
+ - - '>='
109
66
  - !ruby/object:Gem::Version
110
- version: !binary |-
111
- MA==
67
+ version: '0'
112
68
  none: false
113
69
  required_rubygems_version: !ruby/object:Gem::Requirement
114
70
  requirements:
115
- - - ! '>='
71
+ - - '>='
116
72
  - !ruby/object:Gem::Version
117
- version: !binary |-
118
- MA==
73
+ version: '0'
119
74
  none: false
120
75
  requirements: []
121
76
  rubyforge_project: jruby-extras
@@ -1,7 +0,0 @@
1
- require 'rbconfig'
2
-
3
- mf = File.read('Makefile')
4
- mf = mf.gsub(/^BINDIR\s*=.*$/, "BINDIR = #{Config::CONFIG['bindir']}")
5
- mf = mf.gsub(/^PREFIX\s*=.*$/, "PREFIX = #{File.dirname(Config::CONFIG['libdir'])}")
6
- puts mf
7
- File.open('Makefile', 'wb') {|f| f << mf}
@@ -1,3 +0,0 @@
1
- module JRubyLauncher
2
- VERSION = "1.0.15"
3
- end
@@ -1,4 +0,0 @@
1
- class Gem::ConfigFile
2
- PLATFORM_DEFAULTS['install'] = '--no-rdoc --no-ri'
3
- PLATFORM_DEFAULTS['update'] = '--no-rdoc --no-ri'
4
- end
@@ -1,258 +0,0 @@
1
- require File.expand_path('../spec_helper.rb', __FILE__)
2
- load File.expand_path('../../lib/jruby-launcher.rb', __FILE__)
3
-
4
- describe "JRuby native launcher" do
5
- it "should run org.jruby.Main" do
6
- jruby_launcher_args("").last.should == "org/jruby/Main"
7
- end
8
-
9
- it "should pass unrecognized arguments to JRuby" do
10
- jruby_launcher_args("-J-Dsome.option -v --help")[-3..-1].should == ["org/jruby/Main", "-v", "--help"]
11
- end
12
-
13
- it "should print help message" do
14
- args = jruby_launcher_args("-Xhelp 2>&1")
15
- args.detect{|l| l =~ /JRuby Launcher usage/}.should be_true
16
- args.should include("-X")
17
- args = jruby_launcher_args("-X 2>&1")
18
- args.detect{|l| l =~ /JRuby Launcher usage/}.should be_true
19
- args.should include("-X")
20
- end
21
-
22
- it "should use $JAVACMD when JAVACMD is specified" do
23
- with_environment "JAVACMD" => File.join("jato") do
24
- if windows?
25
- jruby_launcher_args("-v 2>&1").join.should =~ %r{jato}
26
- else
27
- jruby_launcher_args("-v").first.should == File.join("jato")
28
- end
29
- end
30
- end
31
-
32
- it "should use $JAVA_HOME/bin/java when JAVA_HOME is specified" do
33
- with_environment "JAVA_HOME" => File.join("some", "java", "home") do
34
- if windows?
35
- jruby_launcher_args("-v 2>&1").join.should =~ %r{some/java/home}
36
- else
37
- jruby_launcher_args("-v").first.should == File.join("some", "java", "home", "bin", "java")
38
- end
39
- end
40
- end
41
-
42
- it "should use -Xjdkhome argument above JAVA_HOME" do
43
- with_environment "JAVA_HOME" => File.join("env", "java", "home") do
44
- if windows?
45
- jruby_launcher_args("-Xjdkhome some/java/home 2>&1").join.should =~ %r{some/java/home}
46
- else
47
- jruby_launcher_args("-Xjdkhome some/java/home").first.should == File.join("some", "java", "home", "bin", "java")
48
- end
49
- end
50
- end
51
-
52
- it "should drop the backslashes at the end of JAVA_HOME" do
53
- with_environment "JAVA_HOME" => File.join("some", "java", "home\\\\") do
54
- if windows?
55
- jruby_launcher_args("").join.should =~ %r{some/java/home}
56
- else
57
- jruby_launcher_args("").first.should == File.join("some", "java", "home", "bin", "java")
58
- end
59
- end
60
- end
61
-
62
- it "should complain about a missing log argument" do
63
- jruby_launcher("-Xtrace 2>&1").should =~ /Argument is missing for "-Xtrace"/
64
- jruby_launcher("-Xtrace -- 2>&1").should =~ /Argument is missing for "-Xtrace"/
65
- end
66
-
67
- it "should complain about a missing jdkhome argument" do
68
- jruby_launcher("-Xjdkhome 2>&1").should =~ /Argument is missing/
69
- jruby_launcher("-Xjdkhome -- 2>&1").should =~ /Argument is missing/
70
- end
71
-
72
- it "should complain about a missing classpath append argument" do
73
- jruby_launcher("-Xcp:a 2>&1").should =~ /Argument is missing/
74
- jruby_launcher("-Xcp:a -- 2>&1").should =~ /Argument is missing/
75
- end
76
-
77
- it "should run nailgun server with --ng-server option" do
78
- jruby_launcher_args("--ng-server").last.should == "com/martiansoftware/nailgun/NGServer"
79
- end
80
-
81
- it "should run nailgun client with --ng option" do
82
- jruby_launcher_args('--ng -e "puts 1"').should == ["org.jruby.util.NailMain", "-e", "puts 1"]
83
- end
84
-
85
- it "should handle -J JVM options" do
86
- jruby_launcher_args("-J-Darg1=value1 -J-Darg2=value2").should include("-Darg1=value1", "-Darg2=value2")
87
- end
88
-
89
- it "should pass -Xprop.erty=value as -J-Djruby.prop.erty=value" do
90
- jruby_launcher_args("-Xprop.erty=value").should include("-Djruby.prop.erty=value")
91
- end
92
-
93
- it "should pass -Xproperties as --properties" do
94
- jruby_launcher_args("-Xproperties").should include("--properties")
95
- end
96
-
97
- it "should default to 500m max heap" do
98
- jruby_launcher_args("").should include("-Xmx500m", "-Djruby.memory.max=500m")
99
- end
100
-
101
- it "should allow max heap to be overridden" do
102
- jruby_launcher_args("-J-Xmx256m").should include("-Xmx256m", "-Djruby.memory.max=256m")
103
- end
104
-
105
- it "should default to 2048k max stack" do
106
- jruby_launcher_args("").should include("-Xss2048k", "-Djruby.stack.max=2048k")
107
- end
108
-
109
- it "should allow max stack to be overridden" do
110
- jruby_launcher_args("-J-Xss512k").should include("-Xss512k", "-Djruby.stack.max=512k")
111
- end
112
-
113
- it "should add the contents of the CLASSPATH environment variable" do
114
- with_environment "CLASSPATH" => "some.jar" do
115
- classpath_arg(jruby_launcher_args("")).should =~ /some.jar/
116
- end
117
- end
118
-
119
- it "should add the classpath elements in proper order" do
120
- s = File::PATH_SEPARATOR
121
- with_environment "CLASSPATH" => "some-env.jar" do
122
- args = jruby_launcher_args("-Xcp:a some-other.jar -Xcp:p some.jar")
123
- classpath_arg(args).should =~ /some.jar.*#{s}some-env.jar#{s}some-other.jar/
124
- end
125
- end
126
-
127
- it "should use the --server compiler" do
128
- jruby_launcher_args("--server").should include("-server")
129
- end
130
-
131
- it "should use the --client compiler" do
132
- jruby_launcher_args("--client").should include("-client")
133
- end
134
-
135
- it "should set the JMX settings when --manage is present" do
136
- jruby_launcher_args("--manage").should include("-Dcom.sun.management.jmxremote", "-Djruby.management.enabled=true")
137
- end
138
-
139
- it "should set the headless flag when --headless is present" do
140
- jruby_launcher_args("--headless").should include("-Djava.awt.headless=true")
141
- end
142
-
143
- it "should pass -Xprof when --sample is present" do
144
- jruby_launcher_args("--sample").should include("-Xprof")
145
- end
146
-
147
- it "should stop argument processing when a -- is seen" do
148
- jruby_launcher_args("-- -Xhelp -Xtrace --headless").should include("-Xhelp", "-Xtrace", "--headless")
149
- end
150
-
151
- # JRUBY-4151
152
- it "should properly handle single quotes" do
153
- jruby_launcher_args("-e 'ABC DEF'").should include("ABC DEF")
154
- end
155
-
156
- # JRUBY-4581
157
- it "should prepend JRUBY_OPTS to the start of the argument list to process" do
158
- with_environment "JRUBY_OPTS" => "--server -J-Dsome.key=val -rubygems" do
159
- jruby_launcher_args("-e 'ABC DEF'").should include("-server", "-Dsome.key=val", "-rubygems", "-e", "ABC DEF")
160
- end
161
- end
162
-
163
- # JRUBY-4611
164
- it "stops argument processing on first non-option argument" do
165
- jruby_launcher_args("foo.rb --sample")[-2..-1].should == ["foo.rb", "--sample"]
166
- end
167
-
168
- # JRUBY-4608
169
- if RbConfig::CONFIG['target_os'] =~ /darwin/i
170
- it "includes file.encoding=UTF-8 on Mac if JAVA_ENCODING is not set" do
171
- jruby_launcher_args("-e true").should include("-Dfile.encoding=UTF-8")
172
- with_environment "JAVA_ENCODING" => "MacRoman" do
173
- jruby_launcher_args("-e true").should_not include("-Dfile.encoding=UTF-8")
174
- end
175
- end
176
- end
177
-
178
- it "does not crash on empty args" do
179
- jruby_launcher_args("-e ''").should include("-e")
180
- jruby_launcher("-Xtrace '' 2>&1").should =~ /-Xtrace/
181
- jruby_launcher("-Xjdkhome '' 2>&1").should =~ /-Xjdkhome/
182
- end
183
-
184
- # JRUBY-4706
185
- it "should put JRuby on regular classpath when -Xnobootclasspath is used" do
186
- args = jruby_launcher_args("-e true")
187
- args.grep(/Xbootclasspath/).should_not be_empty
188
- args = jruby_launcher_args("-Xnobootclasspath -e true")
189
- args.grep(/Xbootclasspath/).should be_empty
190
- end
191
-
192
- it "should put JRuby on regular classpath when VERIFY_JRUBY is set" do
193
- with_environment "VERIFY_JRUBY" => "true" do
194
- args = jruby_launcher_args("-e true")
195
- args.grep(/Xbootclasspath/).should be_empty
196
- end
197
- end
198
-
199
- # JRUBY-4709
200
- it "should include a bare : or ; at the end of the classpath, to include PWD in the path" do
201
- classpath_arg(jruby_launcher_args("-Xnobootclasspath -e true")).should =~
202
- if windows?
203
- /;$/
204
- else
205
- /:$/
206
- end
207
- end
208
-
209
- # JRUBY-6016
210
- it "should honor JAVA_MEM" do
211
- with_environment "JAVA_MEM" => "-Xmx768m" do
212
- jruby_launcher_args("").should include("-Xmx768m", "-Djruby.memory.max=768m")
213
- end
214
- end
215
-
216
- it "should honor JAVA_STACK" do
217
- with_environment "JAVA_STACK" => "-Xss3072k" do
218
- jruby_launcher_args("").should include("-Xss3072k", "-Djruby.stack.max=3072k")
219
- end
220
- end
221
-
222
- it "should honor JRUBY_HOME" do
223
- with_environment "JRUBY_HOME" => "/tmp" do
224
- jruby_launcher_args("").should include("-Djruby.home=/tmp")
225
- end
226
- end
227
-
228
- context "JRUBY_HOME set and JRUBY_HOME/lib/jruby.jar exists" do
229
- let(:jruby_home) do
230
- require 'tempfile'
231
- t = Tempfile.new("jruby_home")
232
- t.path.tap { t.close! }
233
- end
234
-
235
- before do
236
- FileUtils.mkdir_p(File.join(jruby_home, "lib"))
237
- FileUtils.touch(File.join(jruby_home, "lib", "jruby.jar"))
238
- end
239
- after { FileUtils.rm_rf jruby_home }
240
-
241
- it "should add jruby.jar to the bootclasspath" do
242
- with_environment "JRUBY_HOME" => jruby_home do
243
- jruby_launcher_args("").should include("-Xbootclasspath/a:#{jruby_home}/lib/jruby.jar")
244
- end
245
- end
246
- end
247
-
248
- it "should place user-supplied options after default options" do
249
- args = jruby_launcher_args("-J-Djruby.home=/tmp")
250
- home_args = args.select {|x| x =~ /^-Djruby\.home/ }
251
- home_args.length.should == 2
252
- home_args.last.should == "-Djruby.home=/tmp"
253
- end
254
-
255
- it "should print the version" do
256
- jruby_launcher("-Xversion 2>&1").should =~ /Launcher Version #{JRubyLauncher::VERSION}/
257
- end
258
- end
@@ -1,81 +0,0 @@
1
- require 'rspec'
2
- require 'rbconfig'
3
- require 'fileutils'
4
-
5
- if defined?(JRUBY_VERSION)
6
- require 'jruby'
7
- JRuby.runtime.instance_config.run_ruby_in_process = false
8
- end
9
-
10
- module JRubyLauncherHelper
11
- JRUBY_EXE = ''
12
- WINDOWS = RbConfig::CONFIG['target_os'] =~ /mswin/
13
-
14
- def self.check_executable_built
15
- exe = File.expand_path("../../jruby", __FILE__) + RbConfig::CONFIG['EXEEXT']
16
- unless File.executable?(exe)
17
- raise "Error: launcher executable not built; type `make' before continuing."
18
- end
19
- top = File.dirname(exe)
20
- name = File.basename(exe)
21
- home = File.join(top, "build/home")
22
- FileUtils.mkdir_p(File.join(home, "bin"))
23
- FileUtils.cp(exe, File.join(home, "bin"))
24
- if JRubyLauncherHelper::WINDOWS
25
- FileUtils.cp(exe.sub(/exe/, 'dll'), File.join(home, "bin"))
26
- end
27
- FileUtils.mkdir_p(File.join(home, "lib"))
28
- FileUtils.touch(File.join(home, "lib/jruby.jar"))
29
- JRUBY_EXE.concat File.join(home, "bin", name)
30
- end
31
-
32
- def jruby_launcher(args)
33
- `#{JRUBY_EXE} #{args}`
34
- end
35
-
36
- def jruby_launcher_args(args)
37
- jruby_launcher("-Xcommand #{args}").split("\n")
38
- end
39
-
40
- def last_exit_code
41
- $?.exitstatus
42
- end
43
-
44
- def windows?
45
- WINDOWS
46
- end
47
-
48
- def classpath_arg(args)
49
- index = args.index("-cp")
50
- index.should > 0
51
- args[index + 1]
52
- end
53
-
54
- def with_environment(pairs = {})
55
- prev_env = {}
56
- pairs.each_pair do |k,v|
57
- prev_env[k] = ENV[k] if ENV.has_key?(k)
58
- ENV[k] = v
59
- end
60
- begin
61
- yield
62
- ensure
63
- pairs.keys.each {|k| ENV.delete(k)}
64
- ENV.update(prev_env)
65
- end
66
- end
67
- end
68
-
69
- RSpec.configure do |config|
70
- config.before(:all) do
71
- JRubyLauncherHelper.check_executable_built
72
- # clear environment for better control
73
- ENV.delete("JAVA_HOME")
74
- ENV.delete("JRUBY_HOME")
75
- ENV.delete("JAVA_OPTS")
76
- ENV.delete("JRUBY_OPTS")
77
- ENV.delete("CLASSPATH")
78
- ENV.delete("JAVA_ENCODING")
79
- end
80
- config.include(JRubyLauncherHelper)
81
- end