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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1 #include <iostream>
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2 #include <sstream>
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
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
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
39 std::string extract_pkgname(const std::string& fzf_line) {
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
40 std::istringstream iss(fzf_line);
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
41 std::string marker, pkgver;
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
42 iss >> marker >> pkgver;
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
43 return pkgver;
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
44 }
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
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
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
47 char* const fzf_argv[] = { const_cast<char*>("fzf"), nullptr };
2
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
48 std::string result = run_piped(fzf_argv, package_list);
0
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
49
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
50 // strip trailing newline fzf adds
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
51 if (!result.empty() && result.back() == '\n') {
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
52 result.pop_back();
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
53 }
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
54 std::string pkgname = extract_pkgname(result);
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
55 char* const install_argv[] = {
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
56 const_cast<char*>("doas"),
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
57 const_cast<char*>("xbps-install"),
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
58 const_cast<char*>("-Sy"),
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
59 pkgname.data(),
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
60 nullptr
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
61 };
2
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
62 std::string status = spawn(install_argv);
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
63 if (status == "error") {
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
64 std::cerr << "failed to launch doas/xbps-install\n";
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
65 return 1;
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
66 }
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
67 if (status.rfind("sig:", 0) == 0) {
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
68 std::cerr << "xbps-install was killed by signal " << status.substr(4) << "\n";
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
69 return 1;
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
70 }
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
71 if (status != "0") {
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
72 std::cerr << "xbps-install exited with code " << status << "\n";
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
73 return 1;
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
74 }
0
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
75 return 0;
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
76 }