@@ -34,8 +34,6 @@ const HeaderBuilder = @import("bun").HTTP.HeaderBuilder;
3434const Fs = @import ("../fs.zig" );
3535const FileSystem = Fs .FileSystem ;
3636const Lock = @import ("../lock.zig" ).Lock ;
37- var path_buf : [bun .MAX_PATH_BYTES ]u8 = undefined ;
38- var path_buf2 : [bun .MAX_PATH_BYTES ]u8 = undefined ;
3937const URL = @import ("../url.zig" ).URL ;
4038const AsyncHTTP = @import ("bun" ).HTTP .AsyncHTTP ;
4139const HTTPChannel = @import ("bun" ).HTTP .HTTPChannel ;
@@ -600,14 +598,27 @@ const Task = struct {
600598 },
601599 .git_clone = > {
602600 const manager = this .package_manager ;
603- const dir = Repository .download (
601+ const name = this .request .git_clone .name .slice ();
602+ const url = this .request .git_clone .url .slice ();
603+ const dir = brk : {
604+ if (Repository .tryHTTPS (url )) | https | break :brk Repository .download (
605+ manager .allocator ,
606+ manager .env ,
607+ manager .log ,
608+ manager .getCacheDirectory ().dir ,
609+ this .id ,
610+ name ,
611+ https ,
612+ ) catch null ;
613+ break :brk null ;
614+ } orelse Repository .download (
604615 manager .allocator ,
605616 manager .env ,
606617 manager .log ,
607618 manager .getCacheDirectory ().dir ,
608619 this .id ,
609- this . request . git_clone . name . slice () ,
610- this . request . git_clone . url . slice () ,
620+ name ,
621+ url ,
611622 ) catch | err | {
612623 this .err = err ;
613624 this .status = Status .fail ;
@@ -1907,7 +1918,8 @@ pub const PackageManager = struct {
19071918 if (this .options .log_level != .silent ) {
19081919 const elapsed = timer .read ();
19091920 if (elapsed > std .time .ns_per_ms * 100 ) {
1910- var cache_dir_path = bun .getFdPath (cache_directory .dir .fd , & path_buf ) catch "it's" ;
1921+ var path_buf : [bun .MAX_PATH_BYTES ]u8 = undefined ;
1922+ const cache_dir_path = bun .getFdPath (cache_directory .dir .fd , & path_buf ) catch "it" ;
19111923 Output .prettyErrorln (
19121924 "<r><yellow>warn<r>: Slow filesystem detected. If {s} is a network drive, consider setting $BUN_INSTALL_CACHE_DIR to a local folder." ,
19131925 .{cache_dir_path },
@@ -2379,21 +2391,33 @@ pub const PackageManager = struct {
23792391 const SuccessFn = * const fn (* PackageManager , DependencyID , PackageID ) void ;
23802392 const FailFn = * const fn (* PackageManager , * const Dependency , PackageID , anyerror ) void ;
23812393 fn assignResolution (this : * PackageManager , dependency_id : DependencyID , package_id : PackageID ) void {
2394+ const buffers = & this .lockfile .buffers ;
23822395 if (comptime Environment .allow_assert ) {
2383- std .debug .assert (dependency_id < this . lockfile . buffers .resolutions .items .len );
2396+ std .debug .assert (dependency_id < buffers .resolutions .items .len );
23842397 std .debug .assert (package_id < this .lockfile .packages .len );
2385- std .debug .assert (this .lockfile .buffers .resolutions .items [dependency_id ] == invalid_package_id );
2398+ std .debug .assert (buffers .resolutions .items [dependency_id ] == invalid_package_id );
2399+ }
2400+ buffers .resolutions .items [dependency_id ] = package_id ;
2401+ var dep = & buffers .dependencies .items [dependency_id ];
2402+ if (dep .name .isEmpty ()) {
2403+ dep .name = this .lockfile .packages .items (.name )[package_id ];
2404+ dep .name_hash = this .lockfile .packages .items (.name_hash )[package_id ];
23862405 }
2387- this .lockfile .buffers .resolutions .items [dependency_id ] = package_id ;
23882406 }
23892407
23902408 fn assignRootResolution (this : * PackageManager , dependency_id : DependencyID , package_id : PackageID ) void {
2409+ const buffers = & this .lockfile .buffers ;
23912410 if (comptime Environment .allow_assert ) {
2392- std .debug .assert (dependency_id < this . lockfile . buffers .resolutions .items .len );
2411+ std .debug .assert (dependency_id < buffers .resolutions .items .len );
23932412 std .debug .assert (package_id < this .lockfile .packages .len );
2394- std .debug .assert (this .lockfile .buffers .resolutions .items [dependency_id ] == invalid_package_id );
2413+ std .debug .assert (buffers .resolutions .items [dependency_id ] == invalid_package_id );
2414+ }
2415+ buffers .resolutions .items [dependency_id ] = package_id ;
2416+ var dep = & buffers .dependencies .items [dependency_id ];
2417+ if (dep .name .isEmpty ()) {
2418+ dep .name = this .lockfile .packages .items (.name )[package_id ];
2419+ dep .name_hash = this .lockfile .packages .items (.name_hash )[package_id ];
23952420 }
2396- this .lockfile .buffers .resolutions .items [dependency_id ] = package_id ;
23972421 }
23982422
23992423 fn getOrPutResolvedPackage (
@@ -5478,6 +5502,13 @@ pub const PackageManager = struct {
54785502
54795503 pub const Array = std .BoundedArray (UpdateRequest , 64 );
54805504
5505+ pub inline fn matches (this : PackageManager.UpdateRequest , dependency : Dependency , string_buf : []const u8 ) bool {
5506+ return this .name_hash == if (this .name .len == 0 )
5507+ String .Builder .stringHash (dependency .version .literal .slice (string_buf ))
5508+ else
5509+ dependency .name_hash ;
5510+ }
5511+
54815512 pub fn parse (
54825513 allocator : std.mem.Allocator ,
54835514 log : * logger.Log ,
@@ -5492,7 +5523,7 @@ pub const PackageManager = struct {
54925523 var input = std .mem .trim (u8 , positional , " \n \r \t " );
54935524 switch (op ) {
54945525 .link , .unlink = > if (! strings .hasPrefixComptime (input , "link:" )) {
5495- input = std .fmt .allocPrint (allocator , "link:{s }" , .{input }) catch unreachable ;
5526+ input = std .fmt .allocPrint (allocator , "{0s}@ link:{0s }" , .{input }) catch unreachable ;
54965527 },
54975528 else = > {},
54985529 }
@@ -5526,6 +5557,19 @@ pub const PackageManager = struct {
55265557 });
55275558 Global .crash ();
55285559 };
5560+ if (alias != null and version .tag == .git ) {
5561+ if (Dependency .parseWithOptionalTag (
5562+ allocator ,
5563+ placeholder ,
5564+ input ,
5565+ null ,
5566+ & SlicedString .init (input , input ),
5567+ log ,
5568+ )) | ver | {
5569+ alias = null ;
5570+ version = ver ;
5571+ }
5572+ }
55295573 if (switch (version .tag ) {
55305574 .dist_tag = > version .value .dist_tag .name .eql (placeholder , input , input ),
55315575 .npm = > version .value .npm .name .eql (placeholder , input , input ),
@@ -5538,18 +5582,16 @@ pub const PackageManager = struct {
55385582 }
55395583
55405584 var request = UpdateRequest {
5541- .name = allocator .dupe (u8 , alias orelse switch (version .tag ) {
5542- .dist_tag = > version .value .dist_tag .name ,
5543- .github = > version .value .github .repo ,
5544- .npm = > version .value .npm .name ,
5545- .symlink = > version .value .symlink ,
5546- else = > version .literal ,
5547- }.slice (input )) catch unreachable ,
5548- .is_aliased = alias != null ,
55495585 .version = version ,
55505586 .version_buf = input ,
55515587 };
5552- request .name_hash = String .Builder .stringHash (request .name );
5588+ if (alias ) | name | {
5589+ request .is_aliased = true ;
5590+ request .name = allocator .dupe (u8 , name ) catch unreachable ;
5591+ request .name_hash = String .Builder .stringHash (name );
5592+ } else {
5593+ request .name_hash = String .Builder .stringHash (version .literal .slice (input ));
5594+ }
55535595
55545596 for (update_requests .constSlice ()) | * prev | {
55555597 if (prev .name_hash == request .name_hash and request .name .len == prev .name .len ) continue :outer ;
@@ -6924,11 +6966,11 @@ pub const PackageManager = struct {
69246966 _ = manager .getTemporaryDirectory ();
69256967 }
69266968 manager .enqueueDependencyList (root .dependencies , true );
6969+ } else {
6970+ // Anything that needs to be downloaded from an update needs to be scheduled here
6971+ manager .drainDependencyList ();
69276972 }
69286973
6929- // Anything that needs to be downloaded from an update needs to be scheduled here
6930- manager .drainDependencyList ();
6931-
69326974 if (manager .pending_tasks > 0 ) {
69336975 if (root .dependencies .len > 0 ) {
69346976 _ = manager .getCacheDirectory ();
0 commit comments