|
0
|
1 #include <iostream> |
|
|
2 #include <sstream> |
|
|
3 #include "process.h" |
|
|
4 std::string extract_pkgname(const std::string& fzf_line) { |
|
|
5 std::istringstream iss(fzf_line); |
|
|
6 std::string marker, pkgver; |
|
|
7 iss >> marker >> pkgver; |
|
|
8 return pkgver; |
|
|
9 } |
|
|
10 int main() { |
|
|
11 char* const query_argv[] = { const_cast<char*>("xbps-query"), const_cast<char*>("-Rs"), const_cast<char*>(""), nullptr }; |
|
2
|
12 std::string package_list = run_piped(query_argv, ""); |
|
0
|
13 char* const fzf_argv[] = { const_cast<char*>("fzf"), nullptr }; |
|
2
|
14 std::string result = run_piped(fzf_argv, package_list); |
|
0
|
15 |
|
|
16 // strip trailing newline fzf adds |
|
|
17 if (!result.empty() && result.back() == '\n') { |
|
|
18 result.pop_back(); |
|
|
19 } |
|
|
20 std::string pkgname = extract_pkgname(result); |
|
|
21 char* const install_argv[] = { |
|
|
22 const_cast<char*>("doas"), |
|
|
23 const_cast<char*>("xbps-install"), |
|
|
24 const_cast<char*>("-Sy"), |
|
|
25 pkgname.data(), |
|
|
26 nullptr |
|
|
27 }; |
|
2
|
28 std::string status = spawn(install_argv); |
|
|
29 if (status == "error") { |
|
|
30 std::cerr << "failed to launch doas/xbps-install\n"; |
|
|
31 return 1; |
|
|
32 } |
|
|
33 if (status.rfind("sig:", 0) == 0) { |
|
|
34 std::cerr << "xbps-install was killed by signal " << status.substr(4) << "\n"; |
|
|
35 return 1; |
|
|
36 } |
|
|
37 if (status != "0") { |
|
|
38 std::cerr << "xbps-install exited with code " << status << "\n"; |
|
|
39 return 1; |
|
|
40 } |
|
0
|
41 return 0; |
|
|
42 } |