#include "versiond/versiond.hpp" #include #include #include namespace fs = std::filesystem; namespace versiond { static std::string trim(std::string s) { auto a = s.find_first_not_of(" \t\r\n"); if (a == std::string::npos) return ""; auto b = s.find_last_not_of(" \t\r\n"); return s.substr(a, b - a + 1); } static std::string unq(std::string s) { s = trim(s); if (s.size() >= 2 && s.front() == '"' && s.back() == '"') return s.substr(1, s.size() - 2); return s; } Config default_config() { return Config{}; } Config load_config(const std::string& home) { Config c; const char* e = std::getenv("VERSIOND_HOME"); c.home = home.empty() ? (e ? e : std::string("/tmp/versiond")) : home; c.config_dir = c.home + "/config"; c.data_dir = c.home + "/data"; c.spool_dir = c.data_dir + "/spool"; c.index_file = c.data_dir + "/index.sqlite"; c.config_file = c.config_dir + "/config.toml"; fs::create_directories(c.spool_dir); fs::create_directories(c.config_dir); std::ifstream f(c.config_file); if (!f) { std::ofstream o(c.config_file); o << "[server]\nhost = \"" << c.host << "\"\nport = " << c.port << "\n"; o << "\n[retention]\nkeep_days = " << c.keep_days << "\n"; o << "\n[remote]\nurl = \"\"\nusername = \"\"\nbase_path = \"" << c.remote_base << "\"\n"; o << "\n[limits]\nmax_file_bytes = " << c.max_file_bytes << "\n"; } else { std::string line, section; while (std::getline(f, line)) { line = trim(line); if (line.empty() || line[0] == '#') continue; if (line.front() == '[' && line.back() == ']') { section = line.substr(1, line.size() - 2); continue; } auto eq = line.find('='); if (eq == std::string::npos) continue; std::string k = trim(line.substr(0, eq)), v = trim(line.substr(eq + 1)); if (section == "server" && k == "host") c.host = unq(v); else if (section == "server" && k == "port") c.port = std::stoi(v); else if (section == "retention" && k == "keep_days") c.keep_days = std::stoi(v); else if (section == "remote" && k == "url") c.remote_url = unq(v); else if (section == "remote" && k == "username") c.remote_user = unq(v); else if (section == "remote" && k == "base_path") c.remote_base = unq(v); else if (section == "limits" && k == "max_file_bytes") c.max_file_bytes = std::stoull(v); else if (section == "server" && k == "verify_tls") c.verify_tls = (v == "true"); } } return c; } }