bootsnap 1.1.6.beta → 1.1.6.beta2
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.
- checksums.yaml +4 -4
- data/dev.yml +1 -0
- data/ext/bootsnap/bootsnap.c +58 -20
- data/lib/bootsnap/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 269514b76977fe302e8e8bed9059ead9a2c9cf28
|
4
|
+
data.tar.gz: a66fd4b75f0b4fb211b998ded43f87aa31edc8b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3651625736c73f66e3380c5ca1514769707d5d605541a6f636c9fbb563cc2b3199bfc5baa26130106a158f02f66485bdd606f7db5ee47914e451a7ff4337f0d
|
7
|
+
data.tar.gz: e0ba55c3d695a8d91b4ba2aa0ca120ba530c7a665e66a882b8f1e966e846639399e5ea49cecc08aec7ba36b1329b08c84140e20f3aa34efa2902e4b35ebc0681
|
data/dev.yml
CHANGED
data/ext/bootsnap/bootsnap.c
CHANGED
@@ -92,8 +92,8 @@ static void bs_cache_path(const char * cachedir, const char * path, char ** cach
|
|
92
92
|
static int bs_read_key(int fd, struct bs_cache_key * key);
|
93
93
|
static int cache_key_equal(struct bs_cache_key * k1, struct bs_cache_key * k2);
|
94
94
|
static VALUE bs_fetch(char * path, VALUE path_v, char * cache_path, VALUE handler);
|
95
|
-
static int open_current_file(char * path, struct bs_cache_key * key);
|
96
|
-
static int fetch_cached_data(int fd, ssize_t data_size, VALUE handler, VALUE * output_data, int * exception_tag);
|
95
|
+
static int open_current_file(char * path, struct bs_cache_key * key, char ** errno_provenance);
|
96
|
+
static int fetch_cached_data(int fd, ssize_t data_size, VALUE handler, VALUE * output_data, int * exception_tag, char ** errno_provenance);
|
97
97
|
static VALUE prot_exception_for_errno(VALUE err);
|
98
98
|
static uint32_t get_os_version(void);
|
99
99
|
|
@@ -279,18 +279,22 @@ bs_rb_fetch(VALUE self, VALUE cachedir_v, VALUE path_v, VALUE handler)
|
|
279
279
|
* was loaded.
|
280
280
|
*/
|
281
281
|
static int
|
282
|
-
open_current_file(char * path, struct bs_cache_key * key)
|
282
|
+
open_current_file(char * path, struct bs_cache_key * key, char ** errno_provenance)
|
283
283
|
{
|
284
284
|
struct stat statbuf;
|
285
285
|
int fd;
|
286
286
|
|
287
287
|
fd = open(path, O_RDONLY);
|
288
|
-
if (fd < 0)
|
288
|
+
if (fd < 0) {
|
289
|
+
*errno_provenance = (char *)"bs_fetch:open_current_file:open";
|
290
|
+
return fd;
|
291
|
+
}
|
289
292
|
#ifdef _WIN32
|
290
293
|
setmode(fd, O_BINARY);
|
291
294
|
#endif
|
292
295
|
|
293
296
|
if (fstat(fd, &statbuf) < 0) {
|
297
|
+
*errno_provenance = (char *)"bs_fetch:open_current_file:fstat";
|
294
298
|
close(fd);
|
295
299
|
return -1;
|
296
300
|
}
|
@@ -336,12 +340,13 @@ bs_read_key(int fd, struct bs_cache_key * key)
|
|
336
340
|
* - ERROR_WITH_ERRNO (-1, errno is set)
|
337
341
|
*/
|
338
342
|
static int
|
339
|
-
open_cache_file(const char * path, struct bs_cache_key * key)
|
343
|
+
open_cache_file(const char * path, struct bs_cache_key * key, char ** errno_provenance)
|
340
344
|
{
|
341
345
|
int fd, res;
|
342
346
|
|
343
347
|
fd = open(path, O_RDONLY);
|
344
348
|
if (fd < 0) {
|
349
|
+
*errno_provenance = (char *)"bs_fetch:open_cache_file:open";
|
345
350
|
if (errno == ENOENT) return CACHE_MISSING_OR_INVALID;
|
346
351
|
return ERROR_WITH_ERRNO;
|
347
352
|
}
|
@@ -351,6 +356,7 @@ open_cache_file(const char * path, struct bs_cache_key * key)
|
|
351
356
|
|
352
357
|
res = bs_read_key(fd, key);
|
353
358
|
if (res < 0) {
|
359
|
+
*errno_provenance = (char *)"bs_fetch:open_cache_file:read";
|
354
360
|
close(fd);
|
355
361
|
return res;
|
356
362
|
}
|
@@ -374,7 +380,7 @@ open_cache_file(const char * path, struct bs_cache_key * key)
|
|
374
380
|
* or exception, will be the final data returnable to the user.
|
375
381
|
*/
|
376
382
|
static int
|
377
|
-
fetch_cached_data(int fd, ssize_t data_size, VALUE handler, VALUE * output_data, int * exception_tag)
|
383
|
+
fetch_cached_data(int fd, ssize_t data_size, VALUE handler, VALUE * output_data, int * exception_tag, char ** errno_provenance)
|
378
384
|
{
|
379
385
|
char * data = NULL;
|
380
386
|
ssize_t nread;
|
@@ -383,6 +389,7 @@ fetch_cached_data(int fd, ssize_t data_size, VALUE handler, VALUE * output_data,
|
|
383
389
|
VALUE storage_data;
|
384
390
|
|
385
391
|
if (data_size > 100000000000) {
|
392
|
+
*errno_provenance = (char *)"bs_fetch:fetch_cached_data:datasize";
|
386
393
|
errno = EINVAL; /* because wtf? */
|
387
394
|
ret = -1;
|
388
395
|
goto done;
|
@@ -390,6 +397,7 @@ fetch_cached_data(int fd, ssize_t data_size, VALUE handler, VALUE * output_data,
|
|
390
397
|
data = ALLOC_N(char, data_size);
|
391
398
|
nread = read(fd, data, data_size);
|
392
399
|
if (nread < 0) {
|
400
|
+
*errno_provenance = (char *)"bs_fetch:fetch_cached_data:read";
|
393
401
|
ret = -1;
|
394
402
|
goto done;
|
395
403
|
}
|
@@ -441,12 +449,12 @@ mkpath(char * file_path, mode_t mode)
|
|
441
449
|
* path.
|
442
450
|
*/
|
443
451
|
static int
|
444
|
-
atomic_write_cache_file(char * path, struct bs_cache_key * key, VALUE data)
|
452
|
+
atomic_write_cache_file(char * path, struct bs_cache_key * key, VALUE data, char ** errno_provenance)
|
445
453
|
{
|
446
454
|
char template[MAX_CACHEPATH_SIZE + 20];
|
447
455
|
char * dest;
|
448
456
|
char * tmp_path;
|
449
|
-
int fd;
|
457
|
+
int fd, ret;
|
450
458
|
ssize_t nwrite;
|
451
459
|
|
452
460
|
dest = strncpy(template, path, MAX_CACHEPATH_SIZE);
|
@@ -455,9 +463,15 @@ atomic_write_cache_file(char * path, struct bs_cache_key * key, VALUE data)
|
|
455
463
|
tmp_path = mktemp(template);
|
456
464
|
fd = open(tmp_path, O_WRONLY | O_CREAT, 0644);
|
457
465
|
if (fd < 0) {
|
458
|
-
if (mkpath(path, 0755) < 0)
|
466
|
+
if (mkpath(path, 0755) < 0) {
|
467
|
+
*errno_provenance = (char *)"bs_fetch:atomic_write_cache_file:mkpath";
|
468
|
+
return -1;
|
469
|
+
}
|
459
470
|
fd = open(tmp_path, O_WRONLY | O_CREAT, 0644);
|
460
|
-
if (fd < 0)
|
471
|
+
if (fd < 0) {
|
472
|
+
*errno_provenance = (char *)"bs_fetch:atomic_write_cache_file:open";
|
473
|
+
return -1;
|
474
|
+
}
|
461
475
|
}
|
462
476
|
#ifdef _WIN32
|
463
477
|
setmode(fd, O_BINARY);
|
@@ -465,8 +479,12 @@ atomic_write_cache_file(char * path, struct bs_cache_key * key, VALUE data)
|
|
465
479
|
|
466
480
|
key->data_size = RSTRING_LEN(data);
|
467
481
|
nwrite = write(fd, key, KEY_SIZE);
|
468
|
-
if (nwrite < 0)
|
482
|
+
if (nwrite < 0) {
|
483
|
+
*errno_provenance = (char *)"bs_fetch:atomic_write_cache_file:write";
|
484
|
+
return -1;
|
485
|
+
}
|
469
486
|
if (nwrite != KEY_SIZE) {
|
487
|
+
*errno_provenance = (char *)"bs_fetch:atomic_write_cache_file:keysize";
|
470
488
|
errno = EIO; /* Lies but whatever */
|
471
489
|
return -1;
|
472
490
|
}
|
@@ -474,12 +492,17 @@ atomic_write_cache_file(char * path, struct bs_cache_key * key, VALUE data)
|
|
474
492
|
nwrite = write(fd, RSTRING_PTR(data), RSTRING_LEN(data));
|
475
493
|
if (nwrite < 0) return -1;
|
476
494
|
if (nwrite != RSTRING_LEN(data)) {
|
495
|
+
*errno_provenance = (char *)"bs_fetch:atomic_write_cache_file:writelength";
|
477
496
|
errno = EIO; /* Lies but whatever */
|
478
497
|
return -1;
|
479
498
|
}
|
480
499
|
|
481
500
|
close(fd);
|
482
|
-
|
501
|
+
ret = rename(tmp_path, path);
|
502
|
+
if (ret < 0) {
|
503
|
+
*errno_provenance = (char *)"bs_fetch:atomic_write_cache_file:rename";
|
504
|
+
}
|
505
|
+
return ret;
|
483
506
|
}
|
484
507
|
|
485
508
|
/*
|
@@ -502,10 +525,15 @@ prot_exception_for_errno(VALUE err)
|
|
502
525
|
/* Read contents from an fd, whose contents are asserted to be +size+ bytes
|
503
526
|
* long, into a buffer */
|
504
527
|
static ssize_t
|
505
|
-
bs_read_contents(int fd, size_t size, char ** contents)
|
528
|
+
bs_read_contents(int fd, size_t size, char ** contents, char ** errno_provenance)
|
506
529
|
{
|
530
|
+
ssize_t nread;
|
507
531
|
*contents = ALLOC_N(char, size);
|
508
|
-
|
532
|
+
nread = read(fd, *contents, size);
|
533
|
+
if (nread < 0) {
|
534
|
+
*errno_provenance = (char *)"bs_fetch:bs_read_contents:read";
|
535
|
+
}
|
536
|
+
return nread;
|
509
537
|
}
|
510
538
|
|
511
539
|
/*
|
@@ -559,6 +587,7 @@ bs_fetch(char * path, VALUE path_v, char * cache_path, VALUE handler)
|
|
559
587
|
char * contents = NULL;
|
560
588
|
int cache_fd = -1, current_fd = -1;
|
561
589
|
int res, valid_cache, exception_tag = 0;
|
590
|
+
char * errno_provenance = NULL;
|
562
591
|
|
563
592
|
VALUE input_data; /* data read from source file, e.g. YAML or ruby source */
|
564
593
|
VALUE storage_data; /* compiled data, e.g. msgpack / binary iseq */
|
@@ -567,11 +596,11 @@ bs_fetch(char * path, VALUE path_v, char * cache_path, VALUE handler)
|
|
567
596
|
VALUE exception; /* ruby exception object to raise instead of returning */
|
568
597
|
|
569
598
|
/* Open the source file and generate a cache key for it */
|
570
|
-
current_fd = open_current_file(path, ¤t_key);
|
599
|
+
current_fd = open_current_file(path, ¤t_key, &errno_provenance);
|
571
600
|
if (current_fd < 0) goto fail_errno;
|
572
601
|
|
573
602
|
/* Open the cache key if it exists, and read its cache key in */
|
574
|
-
cache_fd = open_cache_file(cache_path, &cached_key);
|
603
|
+
cache_fd = open_cache_file(cache_path, &cached_key, &errno_provenance);
|
575
604
|
if (cache_fd < 0 && cache_fd != CACHE_MISSING_OR_INVALID) goto fail_errno;
|
576
605
|
|
577
606
|
/* True if the cache existed and no invalidating changes have occurred since
|
@@ -580,7 +609,10 @@ bs_fetch(char * path, VALUE path_v, char * cache_path, VALUE handler)
|
|
580
609
|
|
581
610
|
if (valid_cache) {
|
582
611
|
/* Fetch the cache data and return it if we're able to load it successfully */
|
583
|
-
res = fetch_cached_data(
|
612
|
+
res = fetch_cached_data(
|
613
|
+
cache_fd, (ssize_t)cached_key.data_size, handler,
|
614
|
+
&output_data, &exception_tag, &errno_provenance
|
615
|
+
);
|
584
616
|
if (exception_tag != 0) goto raise;
|
585
617
|
else if (res == CACHE_MISSING_OR_INVALID) valid_cache = 0;
|
586
618
|
else if (res == ERROR_WITH_ERRNO) goto fail_errno;
|
@@ -591,7 +623,7 @@ bs_fetch(char * path, VALUE path_v, char * cache_path, VALUE handler)
|
|
591
623
|
/* Cache is stale, invalid, or missing. Regenerate and write it out. */
|
592
624
|
|
593
625
|
/* Read the contents of the source file into a buffer */
|
594
|
-
if (bs_read_contents(current_fd, current_key.size, &contents) < 0) goto fail_errno;
|
626
|
+
if (bs_read_contents(current_fd, current_key.size, &contents, &errno_provenance) < 0) goto fail_errno;
|
595
627
|
input_data = rb_str_new_static(contents, current_key.size);
|
596
628
|
|
597
629
|
/* Try to compile the input_data using input_to_storage(input_data) */
|
@@ -608,7 +640,7 @@ bs_fetch(char * path, VALUE path_v, char * cache_path, VALUE handler)
|
|
608
640
|
if (!RB_TYPE_P(storage_data, T_STRING)) goto invalid_type_storage_data;
|
609
641
|
|
610
642
|
/* Write the cache key and storage_data to the cache directory */
|
611
|
-
res = atomic_write_cache_file(cache_path, ¤t_key, storage_data);
|
643
|
+
res = atomic_write_cache_file(cache_path, ¤t_key, storage_data, &errno_provenance);
|
612
644
|
if (res < 0) goto fail_errno;
|
613
645
|
|
614
646
|
/* Having written the cache, now convert storage_data to output_data */
|
@@ -618,7 +650,10 @@ bs_fetch(char * path, VALUE path_v, char * cache_path, VALUE handler)
|
|
618
650
|
/* If output_data is nil, delete the cache entry and generate the output
|
619
651
|
* using input_to_output */
|
620
652
|
if (NIL_P(output_data)) {
|
621
|
-
if (unlink(cache_path) < 0)
|
653
|
+
if (unlink(cache_path) < 0) {
|
654
|
+
errno_provenance = (char *)"bs_fetch:unlink";
|
655
|
+
goto fail_errno;
|
656
|
+
}
|
622
657
|
bs_input_to_output(handler, input_data, &output_data, &exception_tag);
|
623
658
|
if (exception_tag != 0) goto raise;
|
624
659
|
}
|
@@ -637,6 +672,9 @@ fail_errno:
|
|
637
672
|
CLEANUP;
|
638
673
|
exception = rb_protect(prot_exception_for_errno, INT2FIX(errno), &res);
|
639
674
|
if (res) exception = rb_eStandardError;
|
675
|
+
if (errno_provenance != NULL) {
|
676
|
+
exception = rb_exc_new_str(exception, rb_str_new2(errno_provenance));
|
677
|
+
}
|
640
678
|
rb_exc_raise(exception);
|
641
679
|
__builtin_unreachable();
|
642
680
|
raise:
|
data/lib/bootsnap/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootsnap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.6.
|
4
|
+
version: 1.1.6.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Burke Libbey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|