Reduce error handling boilerplate
[sockgit.git] / src / main.rs
CommitLineData
3263e546
JC
1use std::io;
2use std::env;
3use std::path;
4use std::error;
5use git2;
6
5f1c95cc
JC
7fn check_ip() -> Result<(), Box<dyn error::Error>> {
8 let remote_ip = env::var("REMOTE_ADDR")?;
9 let whitelist_ip = env::var("WHITELIST_IP")?;
10 if remote_ip == whitelist_ip {
11 Ok(())
12 } else {
13 Err(Box::new(io::Error::new(
14 io::ErrorKind::ConnectionRefused,
15 format!("Blocked connection from {}", remote_ip),
16 )))
3263e546
JC
17 }
18}
19
20fn main() -> Result<(), Box<dyn error::Error>> {
21 match check_ip() {
22 Ok(()) => {
23 let mut repo_name = String::new();
24 io::stdin().read_line(&mut repo_name)?;
25 // remove trailing newline
26 repo_name.pop();
27
28 let mut opts = git2::RepositoryInitOptions::new();
29 git2::RepositoryInitOptions::bare(&mut opts, true)
30 .mode(git2::RepositoryInitMode::SHARED_GROUP)
31 .no_reinit(true)
32 .template_path(path::Path::new("./templates"));
33
34 let repo = git2::Repository::init_opts(format!("{}.git", repo_name), &opts)?;
35
36 let public_user = env::var("USER").unwrap();
37 let public_name = env::var("PUBLIC").unwrap();
38 let public_path = env::var("PATH").unwrap();
39 repo.remote(
40 &public_name,
41 &format!(
42 "{user}@{public}:{path}/{repo}.git",
43 user = public_user,
44 public = public_name,
45 path = public_path,
46 repo = repo_name
47 )
48 )?;
49 Ok(())
5f1c95cc
JC
50 }
51 Err(e) => Err(e),
3263e546
JC
52 }
53}