jruby-launcher 1.0.15-java → 1.0.16-java

Sign up to get free protection for your applications and to get access to all the features.
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