// Back - An extremely simple git issue tracking system. Inspired by tvix's // panettone // // Copyright (C) 2024 Benedikt Peetz // SPDX-License-Identifier: AGPL-3.0-or-later // // This file is part of Back. // // You should have received a copy of the License along with this program. // If not, see . use std::{env::args, path::PathBuf, process, sync::OnceLock}; use gix::ThreadSafeRepository; use rocket::{launch, routes}; use url::Url; use crate::issues::{closed, open, show_issue, styles}; mod issues; static REPOSITORY: OnceLock = OnceLock::new(); static SOURCE_CODE_REPOSITORY: OnceLock = OnceLock::new(); #[launch] fn rocket() -> _ { let repository_path = { let maybe_path = args().skip(1).rev().last(); if let Some(path) = maybe_path { PathBuf::from(path) } else { eprintln!("Usage: back "); process::exit(1); } }; let source_code_url = { match std::env::var("BACK_SOURCE_CODE_REPOSITORY_URL") { Ok(value) => match Url::parse(&value) { Ok(url) => url, Err(err) => { eprintln!("Can't parse `BACK_SOURCE_CODE_REPOSITORY_URL` value as url: {err}"); process::exit(1); } }, Err(err) => { eprintln!("back needs you to specify a source code repositiory as `BACK_SOURCE_CODE_REPOSITORY_URL`: {err}"); process::exit(1); } } }; SOURCE_CODE_REPOSITORY .set(source_code_url) .expect("This should be unset by this stage"); REPOSITORY .set( ThreadSafeRepository::open(&repository_path).unwrap_or_else(|err| { eprintln!( "Error while opening repository ('{}'): {} ", repository_path.display(), err ); process::exit(1); }), ) .expect("There should be only one thread accessing this right now"); rocket::build().mount("/", routes![open, closed, show_issue, styles]) }