summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docker/dev/docker-compose.yaml15
-rw-r--r--docker/dev/git/.gitignore1
-rw-r--r--docker/dev/git/repos/.gitignore2
-rw-r--r--server/Cargo.lock1
-rw-r--r--server/Cargo.toml25
-rw-r--r--server/README10
-rw-r--r--server/Rocket.toml5
-rw-r--r--server/src/git.rs34
-rw-r--r--server/src/git_root.rs3
-rw-r--r--server/src/githook.rs8
-rw-r--r--server/src/tests.rs9
11 files changed, 85 insertions, 28 deletions
diff --git a/docker/dev/docker-compose.yaml b/docker/dev/docker-compose.yaml
index dc8cf74..c020a97 100644
--- a/docker/dev/docker-compose.yaml
+++ b/docker/dev/docker-compose.yaml
@@ -22,9 +22,24 @@ services:
- MARIADB_ROOT_PASSWORD=verysecret
volumes:
- 'mariadb_data:/var/lib/mysql'
+ git:
+ image: rockstorm/git-server:latest
+ environment:
+ - SSH_AUTH_METHODS=publickey
+ ports:
+ - '2222:22'
+ volumes:
+ - '${PWD}/git/authorized_keys:/home/git/.ssh/authorized_keys'
+ - 'git_repos:/srv/git'
volumes:
openldap_data:
driver: local
mariadb_data:
driver: local
+ git_repos:
+ driver: local
+ driver_opts:
+ o: bind
+ type: none
+ device: git/repos
diff --git a/docker/dev/git/.gitignore b/docker/dev/git/.gitignore
new file mode 100644
index 0000000..4f49613
--- /dev/null
+++ b/docker/dev/git/.gitignore
@@ -0,0 +1 @@
+/authorized_keys \ No newline at end of file
diff --git a/docker/dev/git/repos/.gitignore b/docker/dev/git/repos/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/docker/dev/git/repos/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
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))