From d068d80ab930b8357f09a3f57cdf014563f4a8d5 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Fri, 31 Dec 2021 17:52:38 -0800 Subject: [PATCH] Attempt to fix watcher issue with repl.it --- packages/bun-error/bun.lockb | Bin 11916 -> 11916 bytes src/css_scanner.zig | 6 +++--- src/http.zig | 11 +++++++++-- src/javascript/jsc/javascript.zig | 3 ++- src/node-fallbacks/bun.lockb | Bin 42591 -> 42591 bytes src/watcher.zig | 21 +++++++++++++++------ 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/bun-error/bun.lockb b/packages/bun-error/bun.lockb index d46f3f2aa06b5bd23f7dc13d2b4cdc40a02f19f5..6d7eec6761b62689dd9adc44b9f2a9569306a577 100755 GIT binary patch delta 1083 zcmZvaTSyd99LCR#xoWnyYAU8Ed9T%JW?bD(UC{`1=|YM4rfF$lrI~I-Xs!k+q}bAk z5`jTcXo0TogFP5T^$>+tmRp&KWKbCrUCf7w`p(%|m&}0!XXf|)uitc*c9uFu5-SII zju28;UsZ9~N{Hp@;&Z#BV2}c>s=r@tr*!6%Opc2+;evcEMe{e0bsrikffhoKmMFbR*(>6_ z1FHCA|Amb%m!^*A^6^E7@TpqbSS-#4yz#G2w)E!9dRkbJXkR`QhbyM!EE_I(YH)%e z^{*@0++`UZQl;rou^lvmM}RxdwmuNwzdQq;E|}C2z%Hr$pwcro+85ET#!G~_cQ^pP z9`R{|=d@e0@5fS}A!G`29sqruI9nk&KF?nnAF;|1i0Bmw0!*^+|0d|T9EmMhk&>eQ z40NceTBSH8ch~fqrs=qCtd6Il8N5-`bbaTQ$E}lEHV`}|gqo_jQgUqb%-v5AQb&p< zW!N?S=rV+|Ak%v8LTfHrq>Utl@QZRM%AqQ+w0dHFK?3oPKYfoJ*O zVs`sBg?V`>+iV%Q4*bULgw~=4^P-2_M4|&Cgl3_F$Wxl@nye^T*Uvfs-;v;XWOcqn*7b#igX5Awpxo0wJCz{9}{ChFUQzT2BsZo`V)E4%{%oxu4v zE6jh!6yi-l+aqLLEwE6|o#s0xDp&J4aN1zkllHyF-nqfm{3|%!V7%E97nqyb@8(L7 jKEVgsl?=T(fz=^K-rb0HsUdM+@QJJcCUW-ZfAW6;h$ic^ delta 1162 zcmaKrTSyd97{|}dwwq~dtEQsHig#meoLyIUTirkUW+ zjwj4n#$9QX(~0Nf>zN48gKnB{;dstO2=axn#H{TQ629CZ7b-aC8`K}z;SZsiGjc{k z)`%Nf!LgaUVD3h3_o1O8a8#j%bdgO{YN0nVv#M6jK=toRnYEPfmn+TppWoo~X`C#R zjff7lYmi^K5RIqxcw%22bN6PO476o*!XqqpB3P4bF6u59S%Nxs`WnqVX6r{jk8koQmKnFKPdE!kM)JO%lR-ZtpWV_BY(@_X>CmAy=cnQ zxeU(aB9d1x1e+l^JjY(17;Q8`z)MpTr$YWdJ{^-~q(%s#UhDR*>eWoW{(qK&GdWg; zD#FX;IQ=yK&^w^(J0m=5eXbQ<;))LWG`Sp-~v|y?uBILKA0Fc3ZU@ zp7LA`J-J`_gd#sj^QL8FZF30Az$|VFFY{oCg1{ShZOShb0=z4Hd0cT2Y=pp^((}`v zI`CsffWmZHz=OftN>gq|jqBelTx!4pP8)cd{YAf1eKJ(xlED&i9r*QI@vQ|7_QhrH zl4efGQCSdiTysrhi^6#=JIE0owt!Oys=N8s`88Gh6fSLW0Xzh}p*pFs;~ROQaLK?` z@G$Va$@;dyubvi}yD%c@^52GlI`F=;h5AifgOvi(`#d3Uuu#gJU^^x&6h1A!T(jV` z!LG;cyDh!5g9=X-Uyje 0) watch_item.fd else null); css.source = &source; try css.scan(log, allocator, &did_warn_tailwind); } @@ -1230,7 +1230,7 @@ pub fn NewBundler( const item = this.bundle_queue.items[@intCast(usize, i)]; const watcher_id = this.watcher.indexOf(item) orelse unreachable; const watch_item = this.watcher.watchlist.get(watcher_id); - const source = try this.getSource(watch_item.file_path, watch_item.fd); + const source = try this.getSource(watch_item.file_path, if (watch_item.fd > 0) watch_item.fd else null); css.source = &source; const file_path = fs.relativeTo(watch_item.file_path); if (hot_module_reloading and FeatureFlags.css_supports_fence) { @@ -1255,7 +1255,7 @@ pub fn NewBundler( }; } - pub fn getSource(this: *CSSBundler, url: string, input_fd: StoredFileDescriptorType) !logger.Source { + pub fn getSource(this: *CSSBundler, url: string, input_fd: ?StoredFileDescriptorType) !logger.Source { const entry = try this.fs_reader.readFile(this.fs, url, 0, true, input_fd); const file = Fs.File{ .path = Fs.Path.init(url), .contents = entry.contents }; return logger.Source.initFile(file, this.allocator); diff --git a/src/http.zig b/src/http.zig index a2870a3455..c624c9bd6a 100644 --- a/src/http.zig +++ b/src/http.zig @@ -1813,8 +1813,10 @@ pub const RequestContext = struct { }; const hash = Watcher.getHash(result.file.input.text); - var watcher_index = ctx.watcher.indexOf(hash); - var input_fd = if (watcher_index) |ind| ctx.watcher.watchlist.items(.fd)[ind] else null; + const input_fd = if (ctx.watcher.indexOf(hash)) |ind| + if (ind > 0) ctx.watcher.watchlist.items(.fd)[ind] else null + else + null; if (resolve_result.is_external) { try ctx.sendBadRequest(); @@ -2560,6 +2562,11 @@ pub const Server = struct { Output.prettyErrorln("File changed: {s}", .{ctx.bundler.fs.relativeTo(file_path)}); } } else { + if (event.op.move) { + var fds = ctx.watcher.watchlist.items(.fd); + fds[event.index] = 0; + } + const change_message = Api.WebsocketMessageFileChangeNotification{ .id = id, .loader = (ctx.bundler.options.loaders.get(path.ext) orelse .file).toAPI(), diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig index 520ac2d7a1..844ffea924 100644 --- a/src/javascript/jsc/javascript.zig +++ b/src/javascript/jsc/javascript.zig @@ -1138,7 +1138,8 @@ pub const VirtualMachine = struct { if (vm.watcher) |watcher| { if (watcher.indexOf(hash)) |index| { - fd = watcher.watchlist.items(.fd)[index]; + const _fd = watcher.watchlist.items(.fd)[index]; + fd = if (_fd > 0) _fd else null; package_json = watcher.watchlist.items(.package_json)[index]; } } diff --git a/src/node-fallbacks/bun.lockb b/src/node-fallbacks/bun.lockb index b81a09479f38b356beebe5c829eafaf171569b78..ee520ebd7afbfd536fa6aa9ac709a86fd774bb04 100755 GIT binary patch delta 3344 zcmZ`*4OE-u6@DQBN`V$C1;WZ{;7sSy@Gn$8)q;JKG|5UAA_otEE;?C$wj%ovs_&tvaU1-S_7Mx0#&tk&x%U z_ul8;``#zh=lrM7`M>7hus*uRj}Q`!&r(7f#+ydG-(7#|Q-8nGbjc{C<)^mY~P*^CKOr4(7P=M3!V+ zaA}h*JF1?vlJF#R{;r^#Z?cFPSyG0GY1?V5-7XU{9W++H9Ln`rm2`l1lkpkZuv6t$)ZVSmmwJm;c?a?9));aPt*0on(=GGkBN|9 zvGWfhjxBFkSNi47x%|OVf#Z4FW~sUuaaswt_nDB(f0+6=_kXu!ata3(bq-ruxt*jr ziavg$`6PYgs3J5YQt7UP1>ZKuZ+V-*GN! z?Ng5knK0x@fQ050Bu!sc@*NIarR`^L7QEQ+U2VEw)C`B`JJ!@0bVHjSv(MXe zviRjc3pevOVGeOxvdBqK{>kC9Hw2C~zr@a~{0Ui%_=nM5(z1q%nfdchah1Z*fHrNz z&+~eJ{mzCko&fe$;Bko4k|af*92mTO;jbKDxQYhEDbF>V>Q_mFf0q!)`%b5pU)4;+ zV-VkV@6)f0J9CzZ1hVc{3?4v(STu++e404b-kYQtD7X!ATJ_n`=xY0WbDQCV{b@K% zcmrK#d?)a+YpaIGdKFE>(Ny)wuGUXF<8LXhprKjoXM(F9tzRaLyYzvq^eXVSWJ6B+g8%El>yC%ht~i+9Uk;W*1K3+jlKG(fm}7Le zsD&=pRy}xK(V%swz~Q|b70w>m+-7wY-7mxL-25$UT0cNGbgzU(eO)r^xw>0nL&UWE zj)J!VQaoBX-Mj*}dTg970k5YXEbanmc{Y|W_Tgu9^DHb@0*(>wa^jUcOIMaAqEtL% z`o2^IW2GYz53FjM{CXfb4s*fXNw5A1H6$N!s#xj=wy4k@1hk!SPBFK`c#JmWrB{;o z6v<|sPF$oy4v-xg6Znc9fiDJT#~BxJ-q16M)0LXB{M$5x)&_xoYK4 z-2WgK=kWlbUYw^;r!90EEN33H+y-TGnwlv5szs6(k!sB>zEL>^lc2b?!QKina@ixpKQ ztfM54OW5zxlr|?eptU9E-H=1fl-^MBx`a5r!l~bqrwW_KHY0B0&8bvF({st1ZI&mj z6*#=+W1ZHeJFiTM?xE0gNjoSc?VuuQ|341skwxT^<{M{{28yJeQZm1oZjF~Olr3b= zB`p&BM7L8<F>AFKZ2kHyE8EsmwI>wsCEXniwCHxwc8w3+vSMf&!S_dCo2UTB*XCV7g9mkT1#^e_URDr^R>_1F$^@<6U~(H7Gh=W>(Ba z-PuBP9>pVchTA?mmh<5^w=4RELer^*QysTM>Y?ahylU))n$w*P`d*!Z{oC%Fun?Xj zeY*7R7=a4GzryrKm)|=y%c{a|BUd9!Eh`Gq+&KB(>jmc@fo@0xJs9A6PYGTil*oeK zrwjPNS{!wbvRW&-ZqGWN9XvpPIpfb}x=W}u5n?Zs?bO>upLN%_rPgqUvkSozCa|b4 z7u5YiwE7g$>Qh9^2O;Fo=eZ2I+=g7v_dH>?x6ZkQf9wzwt$r=6hdB6Ye>oe|nf_8m qyb1?OaAI{ZF`!dZ&4T8xTz@J)&kON+UWm`&3I8ee>!%0%0{;UOrZErz delta 3609 zcmai03s6&68a^aE#Gs%>qv2r!N>gdC2?VM@6hR|ewH>-{8EYANBqp|k=KAQc+8~dD zkfLxz8X=-vWhr%PJ1W)I0)4E_RvlNQ?RH$n&RTTavZZC$c3E5ZKaWdhXM1<=3?!59 z{Ll0K|91y3Dh4kq-cXb;LG%fQ|KSLg_f>WI?%&yRTM>|N5RwD~Ld!}604v;Pvss-8 z{eJlpx4!JXy@00*1|bg>5WedHwJUBsmQ15#|_1UEx|6(5I3n`okwo<3HpvaEqI&;5# zdhe}GfJ27>Ms?I4`)akWaBxBz)%8hU*ZKN4UgT*&x-5uX8WP(c2YX;-`J(*qw~uAF zALnU887zo=k~YE}7n09XN6A$L0SMinESmgjVp~2TA0f>+-JQG(A#IHp<12@L>rY@F zwUtGcDR?0Oy>V^(P-}QSvL8FdAXu`3` z0e5y!$Aw{z1CiPO=>dC!ANEX4opsjzEytnZ441vI5I!j|3282;l2j;97c0$Go{r4k z4NgdhTRk6Zwro11qPf5dL#Tn);^Fu=C(K78Pp=`1i_kd{MfElu2Cvis6x-h|jxITieS69RN!{2|x6{I|O{OTAAv%QUBWNJmML8dur>}Od zeu^gzK2=>kIfw4y3H2EPY8+G@k8@ti#P(`6?yZlHWnKRh7?XuKY5I?AN8C4e@q|pc zyj_p&do-{=)p)6US8(KtOQsbn>~og|H@tc7`bV?D+1kLL!+#FI9WP~M%{5n<9LgBz z4_RuuYxD9S%-4asy^zAxt?-Is|E2a&a2E-9u%l|=M{j5pM1!?X)&XqS*$pnNtkB?h z8Dfu8!kDTy^(Js=H58U40;P*>Is|)uSyp zUmrK&s=EO2so*l+ygW{|FtyWnC7AG(-Or+LBY%O{P3W zx&zWAT-&0J-CX!=u?-fB`OJah@a@-b@QVUYQKz;hF04&voK+d41LsUX|C<2d97Y89 zdGt63Yf_nf_CgMXCz`8<;%M3ibOMVWDrTX zFdUS(IH5NcERqFyAw`Hq{Kb~gZc`c`7*|V~$P#a4DmUQFW<8$Jti_#PO)z`4!ulpH zp764EzKjiYi|tLBZW!?T=D0xmb};14z;Vr5CTJ~^pgqOOxA*#)^v~}-B*`RjpKYU+ zfD`h5ppFdNH7o1_^n{22^n{JJ3=PKdhdBeMb#MIck9lwV-!KB{E5@8=Ggq_15_+2` zcDSeiq~-D&2xMY`n3~C5Cqhik3Lp?!YnMIGn(cLC>@}Ju%G7Kt;AHpzb5h*tX_<#d zC>_WYN^15C3Gh|H)a*M>=z+tFzFPdny>-+9<)fr#9!bp(N@`Zb;|NMKSY;}6)!qz-qsMB~|qTrfZgcN|(r RKZDxeRh&?q{II<>_}@?LtK9$q diff --git a/src/watcher.zig b/src/watcher.zig index fc8ae53083..7aa5c2ccf5 100644 --- a/src/watcher.zig +++ b/src/watcher.zig @@ -75,8 +75,8 @@ pub const INotify = struct { var watch_count: std.atomic.Atomic(u32) = std.atomic.Atomic(u32).init(0); - const watch_file_mask = IN_EXCL_UNLINK | IN_MOVE_SELF | IN_DELETE_SELF | IN_CLOSE_WRITE; - const watch_dir_mask = IN_EXCL_UNLINK | IN_DELETE | IN_DELETE_SELF | IN_CREATE | IN_MOVE_SELF | IN_ONLYDIR; + const watch_file_mask = IN_EXCL_UNLINK | IN_MOVE_SELF | IN_DELETE_SELF | IN_CLOSE_WRITE | IN_MOVED_TO; + const watch_dir_mask = IN_EXCL_UNLINK | IN_DELETE | IN_DELETE_SELF | IN_CREATE | IN_MOVE_SELF | IN_ONLYDIR | IN_MOVED_TO; pub fn watchPath(pathname: [:0]const u8) !EventListIndex { std.debug.assert(loaded_inotify); @@ -222,6 +222,7 @@ pub const WatchEvent = struct { .delete = this.op.delete or other.op.delete, .metadata = this.op.metadata or other.op.metadata, .rename = this.op.rename or other.op.rename, + .move = this.op.move or other.op.move, .write = this.op.write or other.op.write, }; } @@ -233,6 +234,7 @@ pub const WatchEvent = struct { .delete = (kevent.fflags & std.c.NOTE_DELETE) > 0, .metadata = (kevent.fflags & std.c.NOTE_ATTRIB) > 0, .rename = (kevent.fflags & std.c.NOTE_RENAME) > 0, + .move = false, // unhandled .write = (kevent.fflags & std.c.NOTE_WRITE) > 0, }, .index = @truncate(WatchItemIndex, kevent.udata), @@ -245,7 +247,8 @@ pub const WatchEvent = struct { .delete = (event.mask & INotify.IN_DELETE_SELF) > 0 or (event.mask & INotify.IN_DELETE) > 0, .metadata = false, .rename = (event.mask & INotify.IN_MOVE_SELF) > 0, - .write = (event.mask & INotify.IN_MODIFY) > 0 or (event.mask & INotify.IN_MOVE) > 0, + .move = (event.mask & INotify.IN_MOVED_TO) > 0, + .write = (event.mask & INotify.IN_MODIFY) > 0, }, .index = index, }; @@ -256,6 +259,7 @@ pub const WatchEvent = struct { metadata: bool = false, rename: bool = false, write: bool = false, + move: bool = false, }; }; @@ -472,10 +476,10 @@ pub fn NewWatcher(comptime ContextType: type) type { } } - pub fn indexOf(this: *Watcher, hash: HashType) ?usize { + pub fn indexOf(this: *Watcher, hash: HashType) ?u32 { for (this.watchlist.items(.hash)) |other, i| { if (hash == other) { - return i; + return @truncate(u32, i); } } return null; @@ -491,7 +495,12 @@ pub fn NewWatcher(comptime ContextType: type) type { package_json: ?*PackageJSON, comptime copy_file_path: bool, ) !void { - if (this.indexOf(hash) != null) { + if (this.indexOf(hash)) |index| { + // On Linux, the file descriptor might be out of date. + if (fd > 0) { + var fds = this.watchlist.items(.fd); + fds[index] = fd; + } return; }