Mercurial > xbps-search-tv
annotate 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 |
| rev | line source |
|---|---|
| 0 | 1 #include <iostream> |
| 2 #include <sstream> | |
| 3 #include "process.h" | |
|
3
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
4 #include <filesystem> |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
5 #include <fstream> |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
6 #include <chrono> |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
7 #include <cstdlib> |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
8 |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
9 namespace fs = std::filesystem; |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
10 |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
11 std::string get_package_list() { |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
12 const char* home = std::getenv("HOME"); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
13 fs::path cache_dir = fs::path(home) / ".cache" / "xt"; |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
14 fs::path cache_file = cache_dir / "packages.txt"; |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
15 |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
16 const auto max_age = std::chrono::minutes(30); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
17 |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
18 if (fs::exists(cache_file)) { |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
19 auto last_write = fs::last_write_time(cache_file); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
20 auto now = decltype(last_write)::clock::now(); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
21 auto age = now - last_write; |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
22 if (age < max_age) { |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
23 std::ifstream in(cache_file); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
24 std::string contents((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>()); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
25 return contents; |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
26 } |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
27 } |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
28 |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
29 // cache missing or stale, re-query |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
30 char* const query_argv[] = { const_cast<char*>("xbps-query"), const_cast<char*>("-Rs"), const_cast<char*>(""), nullptr }; |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
31 std::string package_list = run_piped(query_argv, ""); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
32 |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
33 fs::create_directories(cache_dir); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
34 std::ofstream out(cache_file); |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
35 out << package_list; |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
36 |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
37 return package_list; |
|
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
38 } |
| 0 | 39 std::string extract_pkgname(const std::string& fzf_line) { |
| 40 std::istringstream iss(fzf_line); | |
| 41 std::string marker, pkgver; | |
| 42 iss >> marker >> pkgver; | |
| 43 return pkgver; | |
| 44 } | |
| 45 int main() { | |
|
3
ae3a6d7bcca6
cache the package list for better performance
Yasuri <yasuri@charliesmp.net>
parents:
2
diff
changeset
|
46 std::string package_list = get_package_list(); |
| 0 | 47 char* const fzf_argv[] = { const_cast<char*>("fzf"), nullptr }; |
| 2 | 48 std::string result = run_piped(fzf_argv, package_list); |
| 0 | 49 |
| 50 // strip trailing newline fzf adds | |
| 51 if (!result.empty() && result.back() == '\n') { | |
| 52 result.pop_back(); | |
| 53 } | |
| 54 std::string pkgname = extract_pkgname(result); | |
| 55 char* const install_argv[] = { | |
| 56 const_cast<char*>("doas"), | |
| 57 const_cast<char*>("xbps-install"), | |
| 58 const_cast<char*>("-Sy"), | |
| 59 pkgname.data(), | |
| 60 nullptr | |
| 61 }; | |
| 2 | 62 std::string status = spawn(install_argv); |
| 63 if (status == "error") { | |
| 64 std::cerr << "failed to launch doas/xbps-install\n"; | |
| 65 return 1; | |
| 66 } | |
| 67 if (status.rfind("sig:", 0) == 0) { | |
| 68 std::cerr << "xbps-install was killed by signal " << status.substr(4) << "\n"; | |
| 69 return 1; | |
| 70 } | |
| 71 if (status != "0") { | |
| 72 std::cerr << "xbps-install exited with code " << status << "\n"; | |
| 73 return 1; | |
| 74 } | |
| 0 | 75 return 0; |
| 76 } |
