diff --git a/Cargo.lock b/Cargo.lock index 35e48ed200..6f3f8fed45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -841,6 +841,7 @@ dependencies = [ "async-tungstenite", "axum", "base64 0.13.0", + "clap 3.1.12", "client", "collections", "ctor", @@ -859,6 +860,7 @@ dependencies = [ "parking_lot", "project", "rand 0.8.3", + "reqwest", "rpc", "scrypt", "serde", @@ -2140,6 +2142,19 @@ dependencies = [ "tokio-io-timeout", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "idna" version = "0.2.3" @@ -2244,6 +2259,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + [[package]] name = "isahc" version = "1.7.0" @@ -2727,6 +2748,24 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +[[package]] +name = "native-tls" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nb-connect" version = "1.0.3" @@ -2910,6 +2949,32 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "openssl-probe" version = "0.1.4" @@ -2918,9 +2983,9 @@ checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.65" +version = "0.9.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" +checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" dependencies = [ "autocfg 1.0.1", "cc", @@ -3684,6 +3749,42 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "reqwest" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f242f1488a539a79bac6dbe7c8609ae43b7914b7736210f239a37cccb32525" +dependencies = [ + "base64 0.13.0", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite 0.2.9", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "resvg" version = "0.14.0" @@ -4964,6 +5065,16 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.22.0" @@ -5638,6 +5749,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.74" @@ -5783,6 +5906,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "wio" version = "0.2.2" diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index feeed1ba6c..a5541990d3 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -22,6 +22,7 @@ async-trait = "0.1.50" async-tungstenite = "0.16" axum = { version = "0.5", features = ["json", "headers", "ws"] } base64 = "0.13" +clap = { version = "3.1", features = ["derive"], optional = true } envy = "0.4.2" env_logger = "0.8" futures = "0.3" @@ -32,6 +33,7 @@ opentelemetry = { version = "0.17", features = ["rt-tokio"] } opentelemetry-otlp = { version = "0.10", features = ["tls-roots"] } parking_lot = "0.11.1" rand = "0.8" +reqwest = { version = "0.11", features = ["json"], optional = true } scrypt = "0.7" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -69,4 +71,4 @@ lazy_static = "1.4" serde_json = { version = "1.0.64", features = ["preserve_order"] } [features] -seed-support = ["lipsum"] +seed-support = ["clap", "lipsum", "reqwest"] diff --git a/crates/collab/src/bin/seed.rs b/crates/collab/src/bin/seed.rs index 7201fd5113..ee202ee4a8 100644 --- a/crates/collab/src/bin/seed.rs +++ b/crates/collab/src/bin/seed.rs @@ -1,31 +1,87 @@ +use clap::Parser; use db::{Db, PostgresDb, UserId}; use rand::prelude::*; +use serde::Deserialize; +use std::fmt::Write; use time::{Duration, OffsetDateTime}; #[allow(unused)] #[path = "../db.rs"] mod db; +#[derive(Parser)] +struct Args { + /// Seed users from GitHub. + #[clap(short, long)] + github_users: bool, +} + +#[derive(Debug, Deserialize)] +struct GitHubUser { + id: usize, + login: String, +} + #[tokio::main] async fn main() { + let args = Args::parse(); let mut rng = StdRng::from_entropy(); let database_url = std::env::var("DATABASE_URL").expect("missing DATABASE_URL env var"); let db = PostgresDb::new(&database_url, 5) .await .expect("failed to connect to postgres database"); - let zed_users = ["nathansobo", "maxbrunsfeld", "as-cii", "iamnbutler"]; + let mut zed_users = vec![ + "nathansobo".to_string(), + "maxbrunsfeld".to_string(), + "as-cii".to_string(), + "iamnbutler".to_string(), + "gibusu".to_string(), + "Kethku".to_string(), + ]; + + if args.github_users { + let github_token = std::env::var("GITHUB_TOKEN").expect("missing GITHUB_TOKEN env var"); + let client = reqwest::Client::new(); + let mut last_user_id = None; + for page in 0..20 { + println!("Downloading users from GitHub, page {}", page); + let mut uri = "https://api.github.com/users?per_page=100".to_string(); + if let Some(last_user_id) = last_user_id { + write!(&mut uri, "&since={}", last_user_id).unwrap(); + } + let response = client + .get(uri) + .bearer_auth(&github_token) + .header("user-agent", "zed") + .send() + .await + .expect("failed to fetch github users"); + let users = response + .json::>() + .await + .expect("failed to deserialize github user"); + zed_users.extend(users.iter().map(|user| user.login.clone())); + + if let Some(last_user) = users.last() { + last_user_id = Some(last_user.id); + } else { + break; + } + } + } + let mut zed_user_ids = Vec::::new(); for zed_user in zed_users { if let Some(user) = db - .get_user_by_github_login(zed_user) + .get_user_by_github_login(&zed_user) .await .expect("failed to fetch user") { zed_user_ids.push(user.id); } else { zed_user_ids.push( - db.create_user(zed_user, true) + db.create_user(&zed_user, true) .await .expect("failed to insert user"), ); diff --git a/script/seed-db b/script/seed-db index c69af799dd..2b12e0f480 100755 --- a/script/seed-db +++ b/script/seed-db @@ -6,4 +6,4 @@ cd crates/collab # Export contents of .env.toml eval "$(cargo run --bin dotenv)" -cargo run --package=collab --features seed-support --bin seed +cargo run --package=collab --features seed-support --bin seed -- $@