Return error for env vars instead of panic
[sockgit.git] / src / main.rs
CommitLineData
d7c48e38 1use git2;
3263e546 2use std::env;
3263e546 3use std::error;
d7c48e38
JC
4use std::io;
5use std::path;
3263e546 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
41621f47
JC
36 let public_user = env::var("USER")?;
37 let public_name = env::var("PUBLIC")?;
38 let public_path = env::var("PATH")?;
3263e546 39 repo.remote(
d7c48e38 40 &public_name,
3263e546 41 &format!(
d7c48e38
JC
42 "{user}@{public}:{path}/{repo}.git",
43 user = public_user,
44 public = public_name,
45 path = public_path,
3263e546 46 repo = repo_name
d7c48e38
JC
47 ),
48 )?;
3263e546 49 Ok(())
5f1c95cc
JC
50 }
51 Err(e) => Err(e),
3263e546
JC
52 }
53}