aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/install/dependency.zig22
-rw-r--r--src/install/npm.zig29
-rw-r--r--src/install/repository.zig28
3 files changed, 63 insertions, 16 deletions
diff --git a/src/install/dependency.zig b/src/install/dependency.zig
index 01c1ecd86..cb73c04e1 100644
--- a/src/install/dependency.zig
+++ b/src/install/dependency.zig
@@ -513,15 +513,37 @@ pub const Version = struct {
},
else => {},
}
+
if (strings.hasPrefixComptime(url, "github.com/")) {
const path = url["github.com/".len..];
if (isGitHubTarballPath(path)) return .tarball;
if (isGitHubRepoPath(path)) return .github;
}
+
+ if (strings.indexOfChar(url, '.')) |dot| {
+ if (Repository.Hosts.has(url[0..dot])) return .git;
+ }
+
return .tarball;
}
}
},
+ 's' => {
+ if (strings.hasPrefixComptime(dependency, "ssh")) {
+ var url = dependency["ssh".len..];
+ if (url.len > 2) {
+ if (url[0] == ':') {
+ if (strings.hasPrefixComptime(url, "://")) {
+ url = url["://".len..];
+ }
+ }
+
+ if (strings.indexOfChar(url, '.')) |dot| {
+ if (Repository.Hosts.has(url[0..dot])) return .git;
+ }
+ }
+ }
+ },
// lisp.tgz
// lisp/repo
// link:path/to/foo
diff --git a/src/install/npm.zig b/src/install/npm.zig
index 57fcf72b9..78d0f6061 100644
--- a/src/install/npm.zig
+++ b/src/install/npm.zig
@@ -798,29 +798,32 @@ pub const PackageManifest = struct {
return this.findByVersion(left.version);
}
- const releases = this.pkg.releases.keys.get(this.versions);
+ if (this.findByDistTag("latest")) |result| {
+ if (group.satisfies(result.version)) {
+ return result;
+ }
+ }
- if (group.flags.isSet(Semver.Query.Group.Flags.pre)) {
- const prereleases = this.pkg.prereleases.keys.get(this.versions);
- var i = prereleases.len;
+ {
+ const releases = this.pkg.releases.keys.get(this.versions);
+ var i = releases.len;
+ // For now, this is the dumb way
while (i > 0) : (i -= 1) {
- const version = prereleases[i - 1];
- const packages = this.pkg.prereleases.values.get(this.package_versions);
+ const version = releases[i - 1];
+ const packages = this.pkg.releases.values.get(this.package_versions);
if (group.satisfies(version)) {
return .{ .version = version, .package = &packages[i - 1] };
}
}
- } else if (this.findByDistTag("latest")) |result| {
- if (group.satisfies(result.version)) return result;
}
- {
- var i = releases.len;
- // // For now, this is the dumb way
+ if (group.flags.isSet(Semver.Query.Group.Flags.pre)) {
+ const prereleases = this.pkg.prereleases.keys.get(this.versions);
+ var i = prereleases.len;
while (i > 0) : (i -= 1) {
- const version = releases[i - 1];
- const packages = this.pkg.releases.values.get(this.package_versions);
+ const version = prereleases[i - 1];
+ const packages = this.pkg.prereleases.values.get(this.package_versions);
if (group.satisfies(version)) {
return .{ .version = version, .package = &packages[i - 1] };
diff --git a/src/install/repository.zig b/src/install/repository.zig
index 564306733..17afec079 100644
--- a/src/install/repository.zig
+++ b/src/install/repository.zig
@@ -27,6 +27,12 @@ pub const Repository = extern struct {
resolved: GitSHA = .{},
package_name: String = .{},
+ pub const Hosts = bun.ComptimeStringMap(string, .{
+ .{ "bitbucket", ".org" },
+ .{ "github", ".com" },
+ .{ "gitlab", ".com" },
+ });
+
pub fn verify(this: *const Repository) void {
this.owner.assertDefined();
this.repo.assertDefined();
@@ -125,15 +131,31 @@ pub const Repository = extern struct {
if (strings.hasPrefixComptime(url, "ssh://")) {
final_path_buf[0.."https".len].* = "https".*;
bun.copy(u8, final_path_buf["https".len..], url["ssh".len..]);
- return final_path_buf[0..(url.len - "ssh".len + "https".len)];
+ return final_path_buf[0 .. url.len - "ssh".len + "https".len];
}
+
if (Dependency.isSCPLikePath(url)) {
final_path_buf[0.."https://".len].* = "https://".*;
var rest = final_path_buf["https://".len..];
+
+ const colon_index = strings.indexOfChar(url, ':');
+
+ if (colon_index) |colon| {
+ // make sure known hosts have `.com` or `.org`
+ if (Hosts.get(url[0..colon])) |tld| {
+ bun.copy(u8, rest, url[0..colon]);
+ bun.copy(u8, rest[colon..], tld);
+ rest[colon + tld.len] = '/';
+ bun.copy(u8, rest[colon + tld.len + 1 ..], url[colon + 1 ..]);
+ return final_path_buf[0 .. url.len + "https://".len + tld.len];
+ }
+ }
+
bun.copy(u8, rest, url);
- if (strings.indexOfChar(rest, ':')) |colon| rest[colon] = '/';
- return final_path_buf[0..(url.len + "https://".len)];
+ if (colon_index) |colon| rest[colon] = '/';
+ return final_path_buf[0 .. url.len + "https://".len];
}
+
return null;
}