Mercurial > xbps-search-tv
view main.cpp @ 3:ae3a6d7bcca6 default tip
cache the package list for better performance
| author | Yasuri <yasuri@charliesmp.net> |
|---|---|
| date | Sun, 13 Sep 2026 19:48:34 +0000 |
| parents | 00b62a080354 |
| children |
line wrap: on
line source
#include <iostream> #include <sstream> #include "process.h" #include <filesystem> #include <fstream> #include <chrono> #include <cstdlib> namespace fs = std::filesystem; std::string get_package_list() { const char* home = std::getenv("HOME"); fs::path cache_dir = fs::path(home) / ".cache" / "xt"; fs::path cache_file = cache_dir / "packages.txt"; const auto max_age = std::chrono::minutes(30); if (fs::exists(cache_file)) { auto last_write = fs::last_write_time(cache_file); auto now = decltype(last_write)::clock::now(); auto age = now - last_write; if (age < max_age) { std::ifstream in(cache_file); std::string contents((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>()); return contents; } } // cache missing or stale, re-query char* const query_argv[] = { const_cast<char*>("xbps-query"), const_cast<char*>("-Rs"), const_cast<char*>(""), nullptr }; std::string package_list = run_piped(query_argv, ""); fs::create_directories(cache_dir); std::ofstream out(cache_file); out << package_list; return package_list; } std::string extract_pkgname(const std::string& fzf_line) { std::istringstream iss(fzf_line); std::string marker, pkgver; iss >> marker >> pkgver; return pkgver; } int main() { std::string package_list = get_package_list(); char* const fzf_argv[] = { const_cast<char*>("fzf"), nullptr }; std::string result = run_piped(fzf_argv, package_list); // strip trailing newline fzf adds if (!result.empty() && result.back() == '\n') { result.pop_back(); } std::string pkgname = extract_pkgname(result); char* const install_argv[] = { const_cast<char*>("doas"), const_cast<char*>("xbps-install"), const_cast<char*>("-Sy"), pkgname.data(), nullptr }; std::string status = spawn(install_argv); if (status == "error") { std::cerr << "failed to launch doas/xbps-install\n"; return 1; } if (status.rfind("sig:", 0) == 0) { std::cerr << "xbps-install was killed by signal " << status.substr(4) << "\n"; return 1; } if (status != "0") { std::cerr << "xbps-install exited with code " << status << "\n"; return 1; } return 0; }
