diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/Cargo.lock | 1 | ||||
| -rw-r--r-- | server/Cargo.toml | 25 | ||||
| -rw-r--r-- | server/README | 10 | ||||
| -rw-r--r-- | server/Rocket.toml | 5 | ||||
| -rw-r--r-- | server/src/git.rs | 34 | ||||
| -rw-r--r-- | server/src/git_root.rs | 3 | ||||
| -rw-r--r-- | server/src/githook.rs | 8 | ||||
| -rw-r--r-- | server/src/tests.rs | 9 |
8 files changed, 67 insertions, 28 deletions
diff --git a/server/Cargo.lock b/server/Cargo.lock index 09ff182..8fd8e92 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -2725,6 +2725,7 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", diff --git a/server/Cargo.toml b/server/Cargo.toml index 5b337e0..64d6796 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -5,24 +5,35 @@ edition = "2021" default-run = "eyeballs" [dependencies] +# Used by all binaries, either because its needed or because the library is small enough I don't care anyhow = "1.0" futures = "0.3.31" -ldap3 = { version = "0.11.5", default-features = false, features = [ "native-tls", "tls", "tls-native", "tokio-native-tls" ] } pathdiff = "0.2.3" rmp-serde = "1.3" -rocket = { version = "0.5.1", features = ["json", "secrets"] } -rocket_db_pools = { version = "0.2.0", features = ["sqlx_mysql"] } serde = { version = "1.0", features = ["derive"] } -sqlx = { version = "0.7.0", default-features = false, features = ["macros", "migrate"] } time = "0.3.34" -tokio = { version = "1", features = ["process"] } -utoipa = { version = "5", features = ["rocket_extras"] } -utoipa-swagger-ui = { version = "9", features = ["rocket", "vendored"], default-features = false } +tokio = { version = "1", features = ["full"] } + +# Optional dependencies, listed in features +ldap3 = { version = "0.11.5", default-features = false, features = [ "native-tls", "tls", "tls-native", "tokio-native-tls" ], optional = true } +rocket = { version = "0.5.1", features = ["json", "secrets"], optional = true } +rocket_db_pools = { version = "0.2.0", features = ["sqlx_mysql"], optional = true } +sqlx = { version = "0.7.0", default-features = false, features = ["macros", "migrate"], optional = true } +utoipa = { version = "5", features = ["rocket_extras"], optional = true } +utoipa-swagger-ui = { version = "9", features = ["rocket", "vendored"], default-features = false, optional = true } [dev-dependencies] stdext = "0.3.3" testdir = "0.9.3" +[features] +build-server = ["ldap3", "rocket", "rocket_db_pools", "sqlx", "utoipa", "utoipa-swagger-ui"] + +[[bin]] +name = "eyeballs" +path = "src/main.rs" +required-features = ["build-server"] + [[bin]] name = "eyeballs-githook" path = "src/githook.rs" diff --git a/server/README b/server/README new file mode 100644 index 0000000..e0ecaf9 --- /dev/null +++ b/server/README @@ -0,0 +1,10 @@ +Development setup +================= + +Start git, ldap and mariadb in docker/dev using docker compose up or simular. +You might have to create docker/git/authorized_keys to be able to mount it. + +Then compile, and because rust hasn't figured out how to do dependencies per +artifact, you have to do this: +cargo build --target=x86_64-unknown-linux-musl --bin eyeballs-githook && cargo build --features="build-server" && cargo run --features="build-server" + diff --git a/server/Rocket.toml b/server/Rocket.toml index 0abe363..8e23b28 100644 --- a/server/Rocket.toml +++ b/server/Rocket.toml @@ -4,8 +4,9 @@ session_max_age_days = 7 ldap_url = "ldap://localhost:1389" ldap_users = "ou=users,dc=example,dc=org" ldap_filter = "(objectClass=posixAccount)" -git_server_root = "git_server" -authorized_keys = "authorized_keys" +git_server_root = "../docker/dev/git/repos" +authorized_keys = "../docker/dev/git/authorized_keys" +git_hook = "target/x86_64-unknown-linux-musl/debug/eyeballs-githook" [default.databases.eyeballs] # root is needed for tests diff --git a/server/src/git.rs b/server/src/git.rs index 58d2fda..a05c670 100644 --- a/server/src/git.rs +++ b/server/src/git.rs @@ -46,6 +46,7 @@ pub struct Repository { remote: Option<String>, project_id: Option<String>, socket: Option<PathBuf>, + githook: Option<PathBuf>, // Lock for any repo task, 90% of all tasks are readers but there are some writers // where nothing else may be done. @@ -147,7 +148,14 @@ impl RepoData { } async fn sync_hooks(&mut self, repo: &Repository) -> Result<(), Error> { - let hook = get_githook_bin()?; + let hook = match repo.githook() { + Some(path) => PathBuf::from(path), + None => { + let server_exe = + std::env::current_exe().map_err(|e| io_err("unable to get current exe", e))?; + server_exe.parent().unwrap().join("eyeballs-githook") + } + }; let hooks = if repo.is_bare() { repo.path().join("hooks") @@ -409,9 +417,11 @@ impl Repository { bare: bool, remote: Option<impl Into<String>>, project_id: Option<impl Into<String>>, + githook: Option<impl Into<PathBuf>>, ) -> Self { let path = path.into(); let project_id = project_id.map(|x| x.into()); + let githook = githook.map(|x| x.into()); let socket: Option<PathBuf>; if let Some(project_id) = &project_id { socket = Some( @@ -428,6 +438,7 @@ impl Repository { project_id, path, socket, + githook, bare, lock: RwLock::new(RepoData::new()), } @@ -449,6 +460,10 @@ impl Repository { self.socket.as_deref() } + fn githook(&self) -> Option<&Path> { + self.githook.as_deref() + } + pub fn is_bare(&self) -> bool { self.bare } @@ -520,20 +535,3 @@ impl Repository { data.get_commiter(self, commit.as_str()).await } } - -#[cfg(not(test))] -fn get_githook_bin() -> Result<PathBuf, Error> { - let server_exe = std::env::current_exe().map_err(|e| io_err("unable to get current exe", e))?; - Ok(server_exe.parent().unwrap().join("eyeballs-githook")) -} - -#[cfg(test)] -fn get_githook_bin() -> Result<PathBuf, Error> { - let test_exe = std::env::current_exe().map_err(|e| io_err("unable to get current exe", e))?; - Ok(test_exe - .parent() - .unwrap() - .parent() - .unwrap() - .join("eyeballs-githook")) -} diff --git a/server/src/git_root.rs b/server/src/git_root.rs index 4da8f43..31e4d45 100644 --- a/server/src/git_root.rs +++ b/server/src/git_root.rs @@ -25,6 +25,7 @@ type DbConnection = <DbPool as Pool>::Connection; #[derive(Debug, Deserialize)] pub struct Config<'a> { git_server_root: Cow<'a, str>, + git_hook: Cow<'a, str>, } struct RootsData { @@ -396,11 +397,13 @@ async fn setup_project_root( ) -> Result<Arc<git::Repository>, git::Error> { let mut path = PathBuf::from(config.git_server_root.to_string()); path.push(project_id); + let githook = PathBuf::from(config.git_hook.to_string()); let repo = Arc::new(git::Repository::new( path, true, Some(remote), Some(project_id), + Some(githook), )); repo.setup().await?; diff --git a/server/src/githook.rs b/server/src/githook.rs index 24b4359..2e1de13 100644 --- a/server/src/githook.rs +++ b/server/src/githook.rs @@ -52,7 +52,13 @@ async fn main() -> Result<(), Box<dyn Error>> { receive: Vec::new(), }; - let repo = git::Repository::new(PathBuf::from("."), true, None::<String>, None::<String>); + let repo = git::Repository::new( + PathBuf::from("."), + true, + None::<String>, + None::<String>, + None::<PathBuf>, + ); while let Some(line) = lines.next_line().await? { let data: Vec<&str> = line.split(' ').collect(); diff --git a/server/src/tests.rs b/server/src/tests.rs index d59dcbe..1b42485 100644 --- a/server/src/tests.rs +++ b/server/src/tests.rs @@ -116,11 +116,20 @@ async fn async_client_with_private_database(test_name: String) -> Client { }; let git_root = testdir!(); + let git_hook = std::env::current_exe() + .unwrap() + .parent() + .unwrap() + .parent() + .unwrap() + .join("eyeballs-githook"); + let authorized_keys = git_root.join("authorized_keys"); let figment = base_figment .merge(("databases", map!["eyeballs" => db_config])) .merge(("git_server_root", git_root)) + .merge(("git_hook", git_hook)) .merge(("authorized_keys", authorized_keys)); Client::tracked(crate::rocket_from_config(figment)) |
