aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock264
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs19
-rw-r--r--crates/ra_vfs/Cargo.toml2
-rw-r--r--crates/ra_vfs/src/lib.rs59
-rw-r--r--crates/ra_vfs/src/watcher.rs96
5 files changed, 413 insertions, 27 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 3b8df0c8a..fccf8a65e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -87,6 +87,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
87 87
88[[package]] 88[[package]]
89name = "bitflags" 89name = "bitflags"
90version = "0.7.0"
91source = "registry+https://github.com/rust-lang/crates.io-index"
92
93[[package]]
94name = "bitflags"
90version = "1.0.4" 95version = "1.0.4"
91source = "registry+https://github.com/rust-lang/crates.io-index" 96source = "registry+https://github.com/rust-lang/crates.io-index"
92 97
@@ -110,6 +115,15 @@ version = "1.3.1"
110source = "registry+https://github.com/rust-lang/crates.io-index" 115source = "registry+https://github.com/rust-lang/crates.io-index"
111 116
112[[package]] 117[[package]]
118name = "bytes"
119version = "0.4.11"
120source = "registry+https://github.com/rust-lang/crates.io-index"
121dependencies = [
122 "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
123 "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
124]
125
126[[package]]
113name = "cargo_metadata" 127name = "cargo_metadata"
114version = "0.7.1" 128version = "0.7.1"
115source = "registry+https://github.com/rust-lang/crates.io-index" 129source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -336,6 +350,16 @@ version = "0.1.2"
336source = "registry+https://github.com/rust-lang/crates.io-index" 350source = "registry+https://github.com/rust-lang/crates.io-index"
337 351
338[[package]] 352[[package]]
353name = "filetime"
354version = "0.2.4"
355source = "registry+https://github.com/rust-lang/crates.io-index"
356dependencies = [
357 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
358 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
359 "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)",
360]
361
362[[package]]
339name = "flexi_logger" 363name = "flexi_logger"
340version = "0.10.5" 364version = "0.10.5"
341source = "registry+https://github.com/rust-lang/crates.io-index" 365source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -352,6 +376,24 @@ version = "1.0.6"
352source = "registry+https://github.com/rust-lang/crates.io-index" 376source = "registry+https://github.com/rust-lang/crates.io-index"
353 377
354[[package]] 378[[package]]
379name = "fsevent"
380version = "0.2.17"
381source = "registry+https://github.com/rust-lang/crates.io-index"
382dependencies = [
383 "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
384 "fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
385 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
386]
387
388[[package]]
389name = "fsevent-sys"
390version = "0.1.6"
391source = "registry+https://github.com/rust-lang/crates.io-index"
392dependencies = [
393 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
394]
395
396[[package]]
355name = "fst" 397name = "fst"
356version = "0.3.3" 398version = "0.3.3"
357source = "registry+https://github.com/rust-lang/crates.io-index" 399source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -375,6 +417,11 @@ version = "0.3.3"
375source = "registry+https://github.com/rust-lang/crates.io-index" 417source = "registry+https://github.com/rust-lang/crates.io-index"
376 418
377[[package]] 419[[package]]
420name = "futures"
421version = "0.1.25"
422source = "registry+https://github.com/rust-lang/crates.io-index"
423
424[[package]]
378name = "gen_lsp_server" 425name = "gen_lsp_server"
379version = "0.1.0" 426version = "0.1.0"
380dependencies = [ 427dependencies = [
@@ -437,6 +484,28 @@ version = "1.0.2"
437source = "registry+https://github.com/rust-lang/crates.io-index" 484source = "registry+https://github.com/rust-lang/crates.io-index"
438 485
439[[package]] 486[[package]]
487name = "inotify"
488version = "0.6.1"
489source = "registry+https://github.com/rust-lang/crates.io-index"
490dependencies = [
491 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
492 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
493 "inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
494 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
495 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
496 "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
497 "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
498]
499
500[[package]]
501name = "inotify-sys"
502version = "0.1.3"
503source = "registry+https://github.com/rust-lang/crates.io-index"
504dependencies = [
505 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
506]
507
508[[package]]
440name = "insta" 509name = "insta"
441version = "0.5.2" 510version = "0.5.2"
442source = "registry+https://github.com/rust-lang/crates.io-index" 511source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -456,6 +525,15 @@ dependencies = [
456] 525]
457 526
458[[package]] 527[[package]]
528name = "iovec"
529version = "0.1.2"
530source = "registry+https://github.com/rust-lang/crates.io-index"
531dependencies = [
532 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
533 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
534]
535
536[[package]]
459name = "itertools" 537name = "itertools"
460version = "0.8.0" 538version = "0.8.0"
461source = "registry+https://github.com/rust-lang/crates.io-index" 539source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -474,11 +552,25 @@ version = "0.1.3"
474source = "registry+https://github.com/rust-lang/crates.io-index" 552source = "registry+https://github.com/rust-lang/crates.io-index"
475 553
476[[package]] 554[[package]]
555name = "kernel32-sys"
556version = "0.2.2"
557source = "registry+https://github.com/rust-lang/crates.io-index"
558dependencies = [
559 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
560 "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
561]
562
563[[package]]
477name = "lazy_static" 564name = "lazy_static"
478version = "1.2.0" 565version = "1.2.0"
479source = "registry+https://github.com/rust-lang/crates.io-index" 566source = "registry+https://github.com/rust-lang/crates.io-index"
480 567
481[[package]] 568[[package]]
569name = "lazycell"
570version = "1.2.1"
571source = "registry+https://github.com/rust-lang/crates.io-index"
572
573[[package]]
482name = "libc" 574name = "libc"
483version = "0.2.48" 575version = "0.2.48"
484source = "registry+https://github.com/rust-lang/crates.io-index" 576source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -511,7 +603,7 @@ version = "0.55.1"
511source = "registry+https://github.com/rust-lang/crates.io-index" 603source = "registry+https://github.com/rust-lang/crates.io-index"
512dependencies = [ 604dependencies = [
513 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 605 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
514 "num-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 606 "num-derive 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
515 "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 607 "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
516 "serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", 608 "serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
517 "serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", 609 "serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -554,16 +646,83 @@ version = "0.2.1"
554source = "registry+https://github.com/rust-lang/crates.io-index" 646source = "registry+https://github.com/rust-lang/crates.io-index"
555 647
556[[package]] 648[[package]]
649name = "mio"
650version = "0.6.16"
651source = "registry+https://github.com/rust-lang/crates.io-index"
652dependencies = [
653 "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
654 "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
655 "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
656 "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
657 "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
658 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
659 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
660 "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
661 "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
662 "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
663 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
664]
665
666[[package]]
667name = "mio-extras"
668version = "2.0.5"
669source = "registry+https://github.com/rust-lang/crates.io-index"
670dependencies = [
671 "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
672 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
673 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
674 "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
675]
676
677[[package]]
678name = "miow"
679version = "0.2.1"
680source = "registry+https://github.com/rust-lang/crates.io-index"
681dependencies = [
682 "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
683 "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
684 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
685 "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
686]
687
688[[package]]
689name = "net2"
690version = "0.2.33"
691source = "registry+https://github.com/rust-lang/crates.io-index"
692dependencies = [
693 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
694 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
695 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
696]
697
698[[package]]
557name = "nodrop" 699name = "nodrop"
558version = "0.1.13" 700version = "0.1.13"
559source = "registry+https://github.com/rust-lang/crates.io-index" 701source = "registry+https://github.com/rust-lang/crates.io-index"
560 702
561[[package]] 703[[package]]
704name = "notify"
705version = "4.0.7"
706source = "registry+https://github.com/rust-lang/crates.io-index"
707dependencies = [
708 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
709 "filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
710 "fsevent 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
711 "fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
712 "inotify 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
713 "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
714 "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
715 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
716 "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
717 "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
718 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
719]
720
721[[package]]
562name = "num-derive" 722name = "num-derive"
563version = "0.2.3" 723version = "0.2.4"
564source = "registry+https://github.com/rust-lang/crates.io-index" 724source = "registry+https://github.com/rust-lang/crates.io-index"
565dependencies = [ 725dependencies = [
566 "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
567 "proc-macro2 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)", 726 "proc-macro2 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)",
568 "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 727 "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
569 "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", 728 "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -726,7 +885,7 @@ dependencies = [
726 "ra_syntax 0.1.0", 885 "ra_syntax 0.1.0",
727 "relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 886 "relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
728 "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 887 "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
729 "salsa 0.10.0-alpha4 (registry+https://github.com/rust-lang/crates.io-index)", 888 "salsa 0.10.0-alpha5 (registry+https://github.com/rust-lang/crates.io-index)",
730 "test_utils 0.1.0", 889 "test_utils 0.1.0",
731] 890]
732 891
@@ -849,7 +1008,9 @@ name = "ra_vfs"
849version = "0.1.0" 1008version = "0.1.0"
850dependencies = [ 1009dependencies = [
851 "crossbeam-channel 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1010 "crossbeam-channel 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
1011 "drop_bomb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
852 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1012 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
1013 "notify 4.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
853 "ra_arena 0.1.0", 1014 "ra_arena 0.1.0",
854 "relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1015 "relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
855 "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1016 "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1097,7 +1258,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1097 1258
1098[[package]] 1259[[package]]
1099name = "salsa" 1260name = "salsa"
1100version = "0.10.0-alpha4" 1261version = "0.10.0-alpha5"
1101source = "registry+https://github.com/rust-lang/crates.io-index" 1262source = "registry+https://github.com/rust-lang/crates.io-index"
1102dependencies = [ 1263dependencies = [
1103 "derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", 1264 "derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1106,13 +1267,13 @@ dependencies = [
1106 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1267 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
1107 "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1268 "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
1108 "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1269 "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
1109 "salsa-macros 0.10.0-alpha4 (registry+https://github.com/rust-lang/crates.io-index)", 1270 "salsa-macros 0.10.0-alpha5 (registry+https://github.com/rust-lang/crates.io-index)",
1110 "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", 1271 "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
1111] 1272]
1112 1273
1113[[package]] 1274[[package]]
1114name = "salsa-macros" 1275name = "salsa-macros"
1115version = "0.10.0-alpha4" 1276version = "0.10.0-alpha5"
1116source = "registry+https://github.com/rust-lang/crates.io-index" 1277source = "registry+https://github.com/rust-lang/crates.io-index"
1117dependencies = [ 1278dependencies = [
1118 "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1279 "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1199,6 +1360,11 @@ dependencies = [
1199] 1360]
1200 1361
1201[[package]] 1362[[package]]
1363name = "slab"
1364version = "0.4.2"
1365source = "registry+https://github.com/rust-lang/crates.io-index"
1366
1367[[package]]
1202name = "slug" 1368name = "slug"
1203version = "0.1.4" 1369version = "0.1.4"
1204source = "registry+https://github.com/rust-lang/crates.io-index" 1370source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1382,6 +1548,42 @@ dependencies = [
1382] 1548]
1383 1549
1384[[package]] 1550[[package]]
1551name = "tokio-executor"
1552version = "0.1.6"
1553source = "registry+https://github.com/rust-lang/crates.io-index"
1554dependencies = [
1555 "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
1556 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
1557]
1558
1559[[package]]
1560name = "tokio-io"
1561version = "0.1.11"
1562source = "registry+https://github.com/rust-lang/crates.io-index"
1563dependencies = [
1564 "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
1565 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
1566 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
1567]
1568
1569[[package]]
1570name = "tokio-reactor"
1571version = "0.1.8"
1572source = "registry+https://github.com/rust-lang/crates.io-index"
1573dependencies = [
1574 "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
1575 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
1576 "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
1577 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
1578 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
1579 "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
1580 "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
1581 "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
1582 "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
1583 "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
1584]
1585
1586[[package]]
1385name = "tools" 1587name = "tools"
1386version = "0.1.0" 1588version = "0.1.0"
1387dependencies = [ 1589dependencies = [
@@ -1557,6 +1759,11 @@ dependencies = [
1557 1759
1558[[package]] 1760[[package]]
1559name = "winapi" 1761name = "winapi"
1762version = "0.2.8"
1763source = "registry+https://github.com/rust-lang/crates.io-index"
1764
1765[[package]]
1766name = "winapi"
1560version = "0.3.6" 1767version = "0.3.6"
1561source = "registry+https://github.com/rust-lang/crates.io-index" 1768source = "registry+https://github.com/rust-lang/crates.io-index"
1562dependencies = [ 1769dependencies = [
@@ -1565,6 +1772,11 @@ dependencies = [
1565] 1772]
1566 1773
1567[[package]] 1774[[package]]
1775name = "winapi-build"
1776version = "0.1.1"
1777source = "registry+https://github.com/rust-lang/crates.io-index"
1778
1779[[package]]
1568name = "winapi-i686-pc-windows-gnu" 1780name = "winapi-i686-pc-windows-gnu"
1569version = "0.4.0" 1781version = "0.4.0"
1570source = "registry+https://github.com/rust-lang/crates.io-index" 1782source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1583,6 +1795,15 @@ version = "0.4.0"
1583source = "registry+https://github.com/rust-lang/crates.io-index" 1795source = "registry+https://github.com/rust-lang/crates.io-index"
1584 1796
1585[[package]] 1797[[package]]
1798name = "ws2_32-sys"
1799version = "0.2.1"
1800source = "registry+https://github.com/rust-lang/crates.io-index"
1801dependencies = [
1802 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
1803 "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
1804]
1805
1806[[package]]
1586name = "yaml-rust" 1807name = "yaml-rust"
1587version = "0.4.2" 1808version = "0.4.2"
1588source = "registry+https://github.com/rust-lang/crates.io-index" 1809source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1602,10 +1823,12 @@ dependencies = [
1602"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 1823"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
1603"checksum bit-set 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f1efcc46c18245a69c38fcc5cc650f16d3a59d034f3106e9ed63748f695730a" 1824"checksum bit-set 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f1efcc46c18245a69c38fcc5cc650f16d3a59d034f3106e9ed63748f695730a"
1604"checksum bit-vec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440d5cb623bb7390ae27fec0bb6c61111969860f8e3ae198bfa0663645e67cf" 1825"checksum bit-vec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440d5cb623bb7390ae27fec0bb6c61111969860f8e3ae198bfa0663645e67cf"
1826"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
1605"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" 1827"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
1606"checksum block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab" 1828"checksum block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab"
1607"checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" 1829"checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40"
1608"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" 1830"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"
1831"checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa"
1609"checksum cargo_metadata 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "585784cac9b05c93a53b17a0b24a5cdd1dfdda5256f030e089b549d2390cc720" 1832"checksum cargo_metadata 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "585784cac9b05c93a53b17a0b24a5cdd1dfdda5256f030e089b549d2390cc720"
1610"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749" 1833"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749"
1611"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" 1834"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
@@ -1633,11 +1856,15 @@ dependencies = [
1633"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" 1856"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
1634"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" 1857"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
1635"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 1858"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
1859"checksum filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a2df5c1a8c4be27e7707789dc42ae65976e60b394afd293d1419ab915833e646"
1636"checksum flexi_logger 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bbd731387787f54fa333fa426e173fe42ea3d1123636b2b27ad802025fc5d182" 1860"checksum flexi_logger 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bbd731387787f54fa333fa426e173fe42ea3d1123636b2b27ad802025fc5d182"
1637"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1861"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
1862"checksum fsevent 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c4bbbf71584aeed076100b5665ac14e3d85eeb31fdbb45fbd41ef9a682b5ec05"
1863"checksum fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a772d36c338d07a032d5375a36f15f9a7043bf0cb8ce7cee658e037c6032874"
1638"checksum fst 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "db72126ca7dff566cdbbdd54af44668c544897d9d3862b198141f176f1238bdf" 1864"checksum fst 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "db72126ca7dff566cdbbdd54af44668c544897d9d3862b198141f176f1238bdf"
1639"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 1865"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
1640"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 1866"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
1867"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b"
1641"checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" 1868"checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d"
1642"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" 1869"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
1643"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" 1870"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
@@ -1645,11 +1872,16 @@ dependencies = [
1645"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 1872"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
1646"checksum im 12.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0627d417829c1d763d602687634869f254fc79f7e22dea6c824dab993db857e4" 1873"checksum im 12.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0627d417829c1d763d602687634869f254fc79f7e22dea6c824dab993db857e4"
1647"checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" 1874"checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d"
1875"checksum inotify 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40b54539f3910d6f84fbf9a643efd6e3aa6e4f001426c0329576128255994718"
1876"checksum inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0"
1648"checksum insta 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff57d9cbc4664b54a972c321155c7703794bc0f5c9944f29c36f40d10d626f3" 1877"checksum insta 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff57d9cbc4664b54a972c321155c7703794bc0f5c9944f29c36f40d10d626f3"
1878"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
1649"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" 1879"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
1650"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" 1880"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
1651"checksum join_to_string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc7a5290e8c2606ce2be49f456d50f69173cb96d1541e4f66e34ac8b331a98f" 1881"checksum join_to_string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc7a5290e8c2606ce2be49f456d50f69173cb96d1541e4f66e34ac8b331a98f"
1882"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
1652"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" 1883"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1"
1884"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f"
1653"checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047" 1885"checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047"
1654"checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" 1886"checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e"
1655"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" 1887"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c"
@@ -1660,8 +1892,13 @@ dependencies = [
1660"checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8" 1892"checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8"
1661"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff" 1893"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
1662"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" 1894"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
1895"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432"
1896"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40"
1897"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
1898"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
1663"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" 1899"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
1664"checksum num-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8af1847c907c2f04d7bfd572fb25bbb4385c637fe5be163cf2f8c5d778fe1e7d" 1900"checksum notify 4.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c968cf37cf949114b00d51b0b23536d1c3a4a3963767cf4c969c65a6af78dc7d"
1901"checksum num-derive 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d9fe8fcafd1b86a37ce8a1cfa15ae504817e0c8c2e7ad42767371461ac1d316d"
1665"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" 1902"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
1666"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" 1903"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
1667"checksum num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a69d464bdc213aaaff628444e99578ede64e9c854025aa43b9796530afa9238" 1904"checksum num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a69d464bdc213aaaff628444e99578ede64e9c854025aa43b9796530afa9238"
@@ -1704,8 +1941,8 @@ dependencies = [
1704"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1941"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
1705"checksum rusty-fork 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9591f190d2852720b679c21f66ad929f9f1d7bb09d1193c26167586029d8489c" 1942"checksum rusty-fork 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9591f190d2852720b679c21f66ad929f9f1d7bb09d1193c26167586029d8489c"
1706"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" 1943"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7"
1707"checksum salsa 0.10.0-alpha4 (registry+https://github.com/rust-lang/crates.io-index)" = "3f442595eae948da8fbb2aa1e13940d9d2d70031753a27a5d1434f91b706ff12" 1944"checksum salsa 0.10.0-alpha5 (registry+https://github.com/rust-lang/crates.io-index)" = "8b5e2535d707dc5ced81106d3b71d806cfeef8a6e8a567472fde7ffd56b770dd"
1708"checksum salsa-macros 0.10.0-alpha4 (registry+https://github.com/rust-lang/crates.io-index)" = "2e6c1a1bee4eb44881438e80c1a26db1c3b957b6cc51765615d429019babdec2" 1945"checksum salsa-macros 0.10.0-alpha5 (registry+https://github.com/rust-lang/crates.io-index)" = "e7c5da4c649f6d4fc1864fcd9a379b1f7c6d570b278559c84a6e15981c949cc6"
1709"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" 1946"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267"
1710"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" 1947"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27"
1711"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1948"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
@@ -1715,6 +1952,7 @@ dependencies = [
1715"checksum serde_json 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "4b90a9fbe1211e57d3e1c15670f1cb00802988fb23a1a4aad7a2b63544f1920e" 1952"checksum serde_json 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "4b90a9fbe1211e57d3e1c15670f1cb00802988fb23a1a4aad7a2b63544f1920e"
1716"checksum serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0887a8e097a69559b56aa2526bf7aff7c3048cf627dff781f0b56a6001534593" 1953"checksum serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0887a8e097a69559b56aa2526bf7aff7c3048cf627dff781f0b56a6001534593"
1717"checksum sha-1 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9d1f3b5de8a167ab06834a7c883bd197f2191e1dda1a22d9ccfeedbf9aded" 1954"checksum sha-1 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9d1f3b5de8a167ab06834a7c883bd197f2191e1dda1a22d9ccfeedbf9aded"
1955"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
1718"checksum slug 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" 1956"checksum slug 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373"
1719"checksum smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "88aea073965ab29f6edb5493faf96ad662fb18aa9eeb186a3b7057951605ed15" 1957"checksum smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "88aea073965ab29f6edb5493faf96ad662fb18aa9eeb186a3b7057951605ed15"
1720"checksum smol_str 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9af1035bc5d742ab6b7ab16713e41cc2ffe78cb474f6f43cd696b2d16052007e" 1958"checksum smol_str 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9af1035bc5d742ab6b7ab16713e41cc2ffe78cb474f6f43cd696b2d16052007e"
@@ -1733,6 +1971,9 @@ dependencies = [
1733"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" 1971"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
1734"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" 1972"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865"
1735"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 1973"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
1974"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0"
1975"checksum tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b53aeb9d3f5ccf2ebb29e19788f96987fa1355f8fe45ea193928eaaaf3ae820f"
1976"checksum tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afbcdb0f0d2a1e4c440af82d7bbf0bf91a8a8c0575bcd20c05d15be7e9d3a02f"
1736"checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" 1977"checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169"
1737"checksum ucd-trie 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "71a9c5b1fe77426cf144cc30e49e955270f5086e31a6441dfa8b32efc09b9d77" 1978"checksum ucd-trie 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "71a9c5b1fe77426cf144cc30e49e955270f5086e31a6441dfa8b32efc09b9d77"
1738"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" 1979"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86"
@@ -1757,8 +1998,11 @@ dependencies = [
1757"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 1998"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
1758"checksum wait-timeout 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b9f3bf741a801531993db6478b95682117471f76916f5e690dd8d45395b09349" 1999"checksum wait-timeout 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b9f3bf741a801531993db6478b95682117471f76916f5e690dd8d45395b09349"
1759"checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" 2000"checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1"
2001"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
1760"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" 2002"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
2003"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
1761"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2004"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1762"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" 2005"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab"
1763"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2006"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2007"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
1764"checksum yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "95acf0db5515d07da9965ec0e0ba6cc2d825e2caeb7303b66ca441729801254e" 2008"checksum yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "95acf0db5515d07da9965ec0e0ba6cc2d825e2caeb7303b66ca441729801254e"
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs
index ddd20a41f..e5a0603d1 100644
--- a/crates/ra_lsp_server/src/main_loop.rs
+++ b/crates/ra_lsp_server/src/main_loop.rs
@@ -11,7 +11,7 @@ use gen_lsp_server::{
11}; 11};
12use lsp_types::NumberOrString; 12use lsp_types::NumberOrString;
13use ra_ide_api::{Canceled, FileId, LibraryData}; 13use ra_ide_api::{Canceled, FileId, LibraryData};
14use ra_vfs::VfsTask; 14use ra_vfs::{VfsTask, WatcherChange};
15use rustc_hash::FxHashSet; 15use rustc_hash::FxHashSet;
16use serde::{de::DeserializeOwned, Serialize}; 16use serde::{de::DeserializeOwned, Serialize};
17use threadpool::ThreadPool; 17use threadpool::ThreadPool;
@@ -113,6 +113,7 @@ enum Event {
113 Msg(RawMessage), 113 Msg(RawMessage),
114 Task(Task), 114 Task(Task),
115 Vfs(VfsTask), 115 Vfs(VfsTask),
116 Watcher(WatcherChange),
116 Lib(LibraryData), 117 Lib(LibraryData),
117} 118}
118 119
@@ -149,6 +150,7 @@ impl fmt::Debug for Event {
149 Event::Task(it) => fmt::Debug::fmt(it, f), 150 Event::Task(it) => fmt::Debug::fmt(it, f),
150 Event::Vfs(it) => fmt::Debug::fmt(it, f), 151 Event::Vfs(it) => fmt::Debug::fmt(it, f),
151 Event::Lib(it) => fmt::Debug::fmt(it, f), 152 Event::Lib(it) => fmt::Debug::fmt(it, f),
153 Event::Watcher(it) => fmt::Debug::fmt(it, f),
152 } 154 }
153 } 155 }
154} 156}
@@ -183,6 +185,10 @@ fn main_loop_inner(
183 Ok(task) => Event::Vfs(task), 185 Ok(task) => Event::Vfs(task),
184 Err(RecvError) => bail!("vfs died"), 186 Err(RecvError) => bail!("vfs died"),
185 }, 187 },
188 recv(state.vfs.read().change_receiver()) -> change => match change {
189 Ok(change) => Event::Watcher(change),
190 Err(RecvError) => bail!("vfs watcher died"),
191 },
186 recv(libdata_receiver) -> data => Event::Lib(data.unwrap()) 192 recv(libdata_receiver) -> data => Event::Lib(data.unwrap())
187 }; 193 };
188 log::info!("loop_turn = {:?}", event); 194 log::info!("loop_turn = {:?}", event);
@@ -194,6 +200,10 @@ fn main_loop_inner(
194 state.vfs.write().handle_task(task); 200 state.vfs.write().handle_task(task);
195 state_changed = true; 201 state_changed = true;
196 } 202 }
203 Event::Watcher(change) => {
204 state.vfs.write().handle_change(change);
205 state_changed = true;
206 }
197 Event::Lib(lib) => { 207 Event::Lib(lib) => {
198 feedback(internal_mode, "library loaded", msg_sender); 208 feedback(internal_mode, "library loaded", msg_sender);
199 state.add_lib(lib); 209 state.add_lib(lib);
@@ -365,7 +375,7 @@ fn on_notification(
365 if let Some(file_id) = state 375 if let Some(file_id) = state
366 .vfs 376 .vfs
367 .write() 377 .write()
368 .add_file_overlay(&path, params.text_document.text) 378 .add_file_overlay(&path, Some(params.text_document.text))
369 { 379 {
370 subs.add_sub(FileId(file_id.0.into())); 380 subs.add_sub(FileId(file_id.0.into()));
371 } 381 }
@@ -384,7 +394,10 @@ fn on_notification(
384 .pop() 394 .pop()
385 .ok_or_else(|| format_err!("empty changes"))? 395 .ok_or_else(|| format_err!("empty changes"))?
386 .text; 396 .text;
387 state.vfs.write().change_file_overlay(path.as_path(), text); 397 state
398 .vfs
399 .write()
400 .change_file_overlay(path.as_path(), Some(text));
388 return Ok(()); 401 return Ok(());
389 } 402 }
390 Err(not) => not, 403 Err(not) => not,
diff --git a/crates/ra_vfs/Cargo.toml b/crates/ra_vfs/Cargo.toml
index e637063c9..f7a972e91 100644
--- a/crates/ra_vfs/Cargo.toml
+++ b/crates/ra_vfs/Cargo.toml
@@ -10,6 +10,8 @@ relative-path = "0.4.0"
10rustc-hash = "1.0" 10rustc-hash = "1.0"
11crossbeam-channel = "0.3.5" 11crossbeam-channel = "0.3.5"
12log = "0.4.6" 12log = "0.4.6"
13notify = "4"
14drop_bomb = "0.1.0"
13 15
14thread_worker = { path = "../thread_worker" } 16thread_worker = { path = "../thread_worker" }
15ra_arena = { path = "../ra_arena" } 17ra_arena = { path = "../ra_arena" }
diff --git a/crates/ra_vfs/src/lib.rs b/crates/ra_vfs/src/lib.rs
index cdea18d73..5336822b3 100644
--- a/crates/ra_vfs/src/lib.rs
+++ b/crates/ra_vfs/src/lib.rs
@@ -14,26 +14,26 @@
14//! which are watched for changes. Typically, there will be a root for each 14//! which are watched for changes. Typically, there will be a root for each
15//! Cargo package. 15//! Cargo package.
16mod io; 16mod io;
17mod watcher;
17 18
18use std::{ 19use std::{
19 fmt,
20 mem,
21 thread,
22 cmp::Reverse, 20 cmp::Reverse,
23 path::{Path, PathBuf},
24 ffi::OsStr, 21 ffi::OsStr,
22 fmt, fs, mem,
23 path::{Path, PathBuf},
25 sync::Arc, 24 sync::Arc,
26 fs, 25 thread,
27}; 26};
28 27
29use rustc_hash::{FxHashMap, FxHashSet};
30use relative_path::RelativePathBuf;
31use crossbeam_channel::Receiver; 28use crossbeam_channel::Receiver;
32use walkdir::DirEntry; 29use ra_arena::{impl_arena_id, Arena, RawId};
30use relative_path::RelativePathBuf;
31use rustc_hash::{FxHashMap, FxHashSet};
33use thread_worker::WorkerHandle; 32use thread_worker::WorkerHandle;
34use ra_arena::{Arena, RawId, impl_arena_id}; 33use walkdir::DirEntry;
35 34
36pub use crate::io::TaskResult as VfsTask; 35pub use crate::io::TaskResult as VfsTask;
36pub use crate::watcher::{Watcher, WatcherChange};
37 37
38/// `RootFilter` is a predicate that checks if a file can belong to a root. If 38/// `RootFilter` is a predicate that checks if a file can belong to a root. If
39/// several filters match a file (nested dirs), the most nested one wins. 39/// several filters match a file (nested dirs), the most nested one wins.
@@ -85,6 +85,7 @@ pub struct Vfs {
85 pending_changes: Vec<VfsChange>, 85 pending_changes: Vec<VfsChange>,
86 worker: io::Worker, 86 worker: io::Worker,
87 worker_handle: WorkerHandle, 87 worker_handle: WorkerHandle,
88 watcher: Watcher,
88} 89}
89 90
90impl fmt::Debug for Vfs { 91impl fmt::Debug for Vfs {
@@ -97,12 +98,15 @@ impl Vfs {
97 pub fn new(mut roots: Vec<PathBuf>) -> (Vfs, Vec<VfsRoot>) { 98 pub fn new(mut roots: Vec<PathBuf>) -> (Vfs, Vec<VfsRoot>) {
98 let (worker, worker_handle) = io::start(); 99 let (worker, worker_handle) = io::start();
99 100
101 let watcher = Watcher::new().unwrap(); // TODO return Result?
102
100 let mut res = Vfs { 103 let mut res = Vfs {
101 roots: Arena::default(), 104 roots: Arena::default(),
102 files: Arena::default(), 105 files: Arena::default(),
103 root2files: FxHashMap::default(), 106 root2files: FxHashMap::default(),
104 worker, 107 worker,
105 worker_handle, 108 worker_handle,
109 watcher,
106 pending_changes: Vec::new(), 110 pending_changes: Vec::new(),
107 }; 111 };
108 112
@@ -129,6 +133,7 @@ impl Vfs {
129 filter: Box::new(filter), 133 filter: Box::new(filter),
130 }; 134 };
131 res.worker.inp.send(task).unwrap(); 135 res.worker.inp.send(task).unwrap();
136 res.watcher.watch(path).unwrap();
132 } 137 }
133 let roots = res.roots.iter().map(|(id, _)| id).collect(); 138 let roots = res.roots.iter().map(|(id, _)| id).collect();
134 (res, roots) 139 (res, roots)
@@ -183,6 +188,10 @@ impl Vfs {
183 &self.worker.out 188 &self.worker.out
184 } 189 }
185 190
191 pub fn change_receiver(&self) -> &Receiver<WatcherChange> {
192 &self.watcher.change_receiver()
193 }
194
186 pub fn handle_task(&mut self, task: io::TaskResult) { 195 pub fn handle_task(&mut self, task: io::TaskResult) {
187 let mut files = Vec::new(); 196 let mut files = Vec::new();
188 // While we were scanning the root in the backgound, a file might have 197 // While we were scanning the root in the backgound, a file might have
@@ -209,22 +218,41 @@ impl Vfs {
209 self.pending_changes.push(change); 218 self.pending_changes.push(change);
210 } 219 }
211 220
212 pub fn add_file_overlay(&mut self, path: &Path, text: String) -> Option<VfsFile> { 221 pub fn handle_change(&mut self, change: WatcherChange) {
222 match change {
223 WatcherChange::Create(path) => {
224 self.add_file_overlay(&path, None);
225 }
226 WatcherChange::Remove(path) => {
227 self.remove_file_overlay(&path);
228 }
229 WatcherChange::Rename(src, dst) => {
230 self.remove_file_overlay(&src);
231 self.add_file_overlay(&dst, None);
232 }
233 WatcherChange::Write(path) => {
234 self.change_file_overlay(&path, None);
235 }
236 }
237 }
238
239 pub fn add_file_overlay(&mut self, path: &Path, text: Option<String>) -> Option<VfsFile> {
213 let mut res = None; 240 let mut res = None;
214 if let Some((root, path, file)) = self.find_root(path) { 241 if let Some((root, rel_path, file)) = self.find_root(path) {
242 let text = text.unwrap_or_else(|| fs::read_to_string(&path).unwrap_or_default());
215 let text = Arc::new(text); 243 let text = Arc::new(text);
216 let change = if let Some(file) = file { 244 let change = if let Some(file) = file {
217 res = Some(file); 245 res = Some(file);
218 self.change_file(file, Arc::clone(&text)); 246 self.change_file(file, Arc::clone(&text));
219 VfsChange::ChangeFile { file, text } 247 VfsChange::ChangeFile { file, text }
220 } else { 248 } else {
221 let file = self.add_file(root, path.clone(), Arc::clone(&text)); 249 let file = self.add_file(root, rel_path.clone(), Arc::clone(&text));
222 res = Some(file); 250 res = Some(file);
223 VfsChange::AddFile { 251 VfsChange::AddFile {
224 file, 252 file,
225 text, 253 text,
226 root, 254 root,
227 path, 255 path: rel_path,
228 } 256 }
229 }; 257 };
230 self.pending_changes.push(change); 258 self.pending_changes.push(change);
@@ -232,8 +260,10 @@ impl Vfs {
232 res 260 res
233 } 261 }
234 262
235 pub fn change_file_overlay(&mut self, path: &Path, new_text: String) { 263 pub fn change_file_overlay(&mut self, path: &Path, new_text: Option<String>) {
236 if let Some((_root, _path, file)) = self.find_root(path) { 264 if let Some((_root, _path, file)) = self.find_root(path) {
265 let new_text =
266 new_text.unwrap_or_else(|| fs::read_to_string(&path).unwrap_or_default());
237 let file = file.expect("can't change a file which wasn't added"); 267 let file = file.expect("can't change a file which wasn't added");
238 let text = Arc::new(new_text); 268 let text = Arc::new(new_text);
239 self.change_file(file, Arc::clone(&text)); 269 self.change_file(file, Arc::clone(&text));
@@ -267,6 +297,7 @@ impl Vfs {
267 297
268 /// Sutdown the VFS and terminate the background watching thread. 298 /// Sutdown the VFS and terminate the background watching thread.
269 pub fn shutdown(self) -> thread::Result<()> { 299 pub fn shutdown(self) -> thread::Result<()> {
300 let _ = self.watcher.shutdown();
270 let _ = self.worker.shutdown(); 301 let _ = self.worker.shutdown();
271 self.worker_handle.shutdown() 302 self.worker_handle.shutdown()
272 } 303 }
diff --git a/crates/ra_vfs/src/watcher.rs b/crates/ra_vfs/src/watcher.rs
new file mode 100644
index 000000000..cc05f949e
--- /dev/null
+++ b/crates/ra_vfs/src/watcher.rs
@@ -0,0 +1,96 @@
1use std::{
2 path::{Path, PathBuf},
3 sync::mpsc,
4 thread,
5 time::Duration,
6};
7
8use crossbeam_channel::Receiver;
9use drop_bomb::DropBomb;
10use notify::{DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher as NotifyWatcher};
11
12pub struct Watcher {
13 receiver: Receiver<WatcherChange>,
14 watcher: RecommendedWatcher,
15 thread: thread::JoinHandle<()>,
16 bomb: DropBomb,
17}
18
19#[derive(Debug)]
20pub enum WatcherChange {
21 Create(PathBuf),
22 Write(PathBuf),
23 Remove(PathBuf),
24 Rename(PathBuf, PathBuf),
25}
26
27impl WatcherChange {
28 fn from_debounced_event(ev: DebouncedEvent) -> Option<WatcherChange> {
29 match ev {
30 DebouncedEvent::NoticeWrite(_)
31 | DebouncedEvent::NoticeRemove(_)
32 | DebouncedEvent::Chmod(_)
33 | DebouncedEvent::Rescan => {
34 // ignore
35 None
36 }
37 DebouncedEvent::Create(path) => Some(WatcherChange::Create(path)),
38 DebouncedEvent::Write(path) => Some(WatcherChange::Write(path)),
39 DebouncedEvent::Remove(path) => Some(WatcherChange::Remove(path)),
40 DebouncedEvent::Rename(src, dst) => Some(WatcherChange::Rename(src, dst)),
41 DebouncedEvent::Error(err, path) => {
42 // TODO
43 log::warn!("watch error {}, {:?}", err, path);
44 None
45 }
46 }
47 }
48}
49
50impl Watcher {
51 pub fn new() -> Result<Watcher, Box<std::error::Error>> {
52 let (input_sender, input_receiver) = mpsc::channel();
53 let watcher = notify::watcher(input_sender, Duration::from_millis(250))?;
54 let (output_sender, output_receiver) = crossbeam_channel::unbounded();
55 let thread = thread::spawn(move || loop {
56 match input_receiver.recv() {
57 Ok(ev) => {
58 // forward relevant events only
59 if let Some(change) = WatcherChange::from_debounced_event(ev) {
60 output_sender.send(change).unwrap();
61 }
62 }
63 Err(err) => {
64 log::debug!("Watcher stopped ({})", err);
65 break;
66 }
67 }
68 });
69 Ok(Watcher {
70 receiver: output_receiver,
71 watcher,
72 thread,
73 bomb: DropBomb::new(format!("Watcher was not shutdown")),
74 })
75 }
76
77 pub fn watch(&mut self, root: impl AsRef<Path>) -> Result<(), Box<std::error::Error>> {
78 self.watcher.watch(root, RecursiveMode::Recursive)?;
79 Ok(())
80 }
81
82 pub fn change_receiver(&self) -> &Receiver<WatcherChange> {
83 &self.receiver
84 }
85
86 pub fn shutdown(mut self) -> thread::Result<()> {
87 self.bomb.defuse();
88 drop(self.watcher);
89 let res = self.thread.join();
90 match &res {
91 Ok(()) => log::info!("... Watcher terminated with ok"),
92 Err(_) => log::error!("... Watcher terminated with err"),
93 }
94 res
95 }
96}