wayver's git archive


a simple self-hosted git server
git clone https://git.wayver.dev/bile

src/config.rs@main

raw
Date Commit Message Author Files + -
2026-02-19 17:51 large refactoring wayverd 53 2153 1683
...

1use std::path::PathBuf;
2
3use clap::Parser as _;
4use figment::{
5    Figment,
6    providers::{Env, Format, Serialized, Toml},
7};
8
9#[derive(Debug, Clone, clap::Parser, serde::Serialize, serde::Deserialize)]
10#[command(version, about)]
11pub struct Config {
12    /// The port the server will listen on
13    #[arg(short, long, default_value_t = default_port())]
14    pub port: u16,
15
16    /// Directory to find git repos
17    #[arg(short = 'r', long, default_value = default_repo_directory().into_os_string())]
18    pub project_root: PathBuf,
19
20    /// The text shown in a browsers title bar
21    #[arg(short, long, default_value_t = default_site_name())]
22    pub site_name: String,
23
24    /// File to check for in the .git directory to decide wether to publicly show a repo
25    #[arg(short, long, default_value_t = default_export_ok())]
26    pub export_ok: String,
27
28    /// Base URL to clone repositories from (without trailing slash)
29    #[arg(short, long, default_value_t = String::new())]
30    pub clone_base: String,
31
32    /// Number of commits to be shown when paginating the log
33    #[arg(short, long, default_value_t = default_log_per_page())]
34    pub log_per_page: usize,
35}
36
37impl Config {
38    pub fn load() -> crate::error::Result<Self> {
39        let config: Self = Figment::new()
40            .merge(Serialized::defaults(Self::parse()))
41            .merge(Toml::file("bile.toml"))
42            .merge(Env::prefixed("BILE_"))
43            .extract()?;
44
45        Ok(config)
46    }
47
48    pub fn finalize(self) -> crate::error::Result<Self> {
49        Ok(Self {
50            port: self.port,
51            project_root: self.project_root.canonicalize()?,
52            site_name: self.site_name,
53            export_ok: self.export_ok,
54            clone_base: self.clone_base,
55            log_per_page: self.log_per_page,
56        })
57    }
58}
59
60impl Default for Config {
61    fn default() -> Self {
62        Self {
63            port: default_port(),
64            project_root: default_repo_directory(),
65            site_name: default_site_name(),
66            export_ok: default_export_ok(),
67            clone_base: String::new(),
68            log_per_page: default_log_per_page(),
69        }
70    }
71}
72
73const fn default_port() -> u16 {
74    80
75}
76
77fn default_repo_directory() -> PathBuf {
78    PathBuf::from("./repos")
79}
80
81fn default_site_name() -> String {
82    "bile".to_string()
83}
84
85fn default_export_ok() -> String {
86    "git-daemon-export-ok".to_string()
87}
88
89const fn default_log_per_page() -> usize {
90    100
91}
92