'Generic Commit'
This commit is contained in:
parent
0b7fdd3e1a
commit
7cf3d879d1
@ -66,6 +66,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
@ -324,38 +325,128 @@ int publish_tool(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int update_tool(int argc, char* argv[]) {
|
int update_tool(int argc, char* argv[]) {
|
||||||
std::cout << "Updating getpkg itself..." << std::endl;
|
|
||||||
|
|
||||||
// First try to update getpkg itself
|
|
||||||
char* fakeArgv[] = {argv[0], (char*)"install", (char*)"getpkg"};
|
|
||||||
int result = install_tool(3, fakeArgv);
|
|
||||||
if (result != 0) {
|
|
||||||
std::cerr << "Warning: Failed to update getpkg (may not be published)" << std::endl;
|
|
||||||
// Continue with updating other tools instead of failing
|
|
||||||
}
|
|
||||||
|
|
||||||
// Then update all installed tools
|
|
||||||
std::string home = get_home();
|
std::string home = get_home();
|
||||||
std::filesystem::path configDir = std::filesystem::path(home) / ".config/getpkg";
|
std::filesystem::path configDir = std::filesystem::path(home) / ".config/getpkg";
|
||||||
std::cout << "Updating all installed tools..." << std::endl;
|
|
||||||
|
|
||||||
bool anyUpdates = false;
|
// Collect all installed tools
|
||||||
|
std::vector<std::tuple<std::string, std::string, std::string>> updateResults; // name, status, version
|
||||||
|
|
||||||
|
// Capture stdout to process install_tool output
|
||||||
|
auto processToolUpdate = [&](const std::string& toolName) -> std::tuple<std::string, std::string> {
|
||||||
|
// Redirect stdout and stderr to capture output
|
||||||
|
std::stringstream buffer;
|
||||||
|
std::stringstream errBuffer;
|
||||||
|
std::streambuf* oldOut = std::cout.rdbuf(buffer.rdbuf());
|
||||||
|
std::streambuf* oldErr = std::cerr.rdbuf(errBuffer.rdbuf());
|
||||||
|
|
||||||
|
char* toolArgv[] = {argv[0], (char*)"install", (char*)toolName.c_str()};
|
||||||
|
int result = install_tool(3, toolArgv);
|
||||||
|
|
||||||
|
// Restore stdout and stderr
|
||||||
|
std::cout.rdbuf(oldOut);
|
||||||
|
std::cerr.rdbuf(oldErr);
|
||||||
|
|
||||||
|
std::string output = buffer.str();
|
||||||
|
std::string status = "Failed";
|
||||||
|
std::string version = "-";
|
||||||
|
|
||||||
|
if (result == 0) {
|
||||||
|
if (output.find("is already up to date") != std::string::npos) {
|
||||||
|
status = "Up to date";
|
||||||
|
} else if (output.find("Installed " + toolName + " successfully") != std::string::npos) {
|
||||||
|
// Check if it was an update or fresh install
|
||||||
|
if (output.find("Updating " + toolName) != std::string::npos) {
|
||||||
|
status = "Updated";
|
||||||
|
} else {
|
||||||
|
status = "Installed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to get version from config
|
||||||
|
std::filesystem::path toolInfoPath = configDir / (toolName + ".json");
|
||||||
|
if (std::filesystem::exists(toolInfoPath)) {
|
||||||
|
std::ifstream tfile(toolInfoPath);
|
||||||
|
json toolInfo;
|
||||||
|
tfile >> toolInfo;
|
||||||
|
version = toolInfo.value("version", "-");
|
||||||
|
if (!version.empty() && version.back() == '\n') version.pop_back();
|
||||||
|
// If version is empty, try to show something useful
|
||||||
|
if (version.empty() || version == "-") {
|
||||||
|
version = "installed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::make_tuple(status, version);
|
||||||
|
};
|
||||||
|
|
||||||
|
// First update getpkg itself
|
||||||
|
auto [getpkgStatus, getpkgVersion] = processToolUpdate("getpkg");
|
||||||
|
updateResults.push_back(std::make_tuple("getpkg", getpkgStatus, getpkgVersion));
|
||||||
|
|
||||||
|
// Then update all other installed tools
|
||||||
if (std::filesystem::exists(configDir)) {
|
if (std::filesystem::exists(configDir)) {
|
||||||
for (const auto& entry : std::filesystem::directory_iterator(configDir)) {
|
for (const auto& entry : std::filesystem::directory_iterator(configDir)) {
|
||||||
if (entry.path().extension() == ".json") {
|
if (entry.path().extension() == ".json") {
|
||||||
std::string tname = entry.path().stem();
|
std::string tname = entry.path().stem();
|
||||||
if (tname != "getpkg") { // Skip getpkg since we already tried it
|
if (tname != "getpkg") { // Skip getpkg since we already did it
|
||||||
std::cout << "Checking " << tname << "..." << std::endl;
|
auto [status, version] = processToolUpdate(tname);
|
||||||
char* toolArgv[] = {argv[0], (char*)"install", (char*)tname.c_str()};
|
updateResults.push_back(std::make_tuple(tname, status, version));
|
||||||
if (install_tool(3, toolArgv) == 0) {
|
|
||||||
anyUpdates = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Update complete." << std::endl;
|
// Display results in a table
|
||||||
|
std::cout << std::endl;
|
||||||
|
std::cout << "+" << std::string(25, '-') << "+" << std::string(15, '-') << "+" << std::string(20, '-') << "+" << std::endl;
|
||||||
|
std::cout << "|" << std::setw(25) << std::left << " Tool"
|
||||||
|
<< "|" << std::setw(15) << std::left << " Status"
|
||||||
|
<< "|" << std::setw(20) << std::left << " Version"
|
||||||
|
<< "|" << std::endl;
|
||||||
|
std::cout << "+" << std::string(25, '-') << "+" << std::string(15, '-') << "+" << std::string(20, '-') << "+" << std::endl;
|
||||||
|
|
||||||
|
int updatedCount = 0;
|
||||||
|
int upToDateCount = 0;
|
||||||
|
int failedCount = 0;
|
||||||
|
|
||||||
|
for (const auto& [name, status, version] : updateResults) {
|
||||||
|
std::string displayStatus = status;
|
||||||
|
if (status == "Updated") {
|
||||||
|
displayStatus = "✓ " + status;
|
||||||
|
updatedCount++;
|
||||||
|
} else if (status == "Up to date") {
|
||||||
|
displayStatus = "• " + status;
|
||||||
|
upToDateCount++;
|
||||||
|
} else {
|
||||||
|
displayStatus = "✗ " + status;
|
||||||
|
failedCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "|" << std::setw(25) << std::left << (" " + name)
|
||||||
|
<< "|" << std::setw(15) << std::left << (" " + displayStatus)
|
||||||
|
<< "|" << std::setw(20) << std::left << (" " + version)
|
||||||
|
<< "|" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "+" << std::string(25, '-') << "+" << std::string(15, '-') << "+" << std::string(20, '-') << "+" << std::endl;
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
// Summary
|
||||||
|
std::cout << "Update Summary: ";
|
||||||
|
if (updatedCount > 0) {
|
||||||
|
std::cout << updatedCount << " updated";
|
||||||
|
}
|
||||||
|
if (upToDateCount > 0) {
|
||||||
|
if (updatedCount > 0) std::cout << ", ";
|
||||||
|
std::cout << upToDateCount << " already up to date";
|
||||||
|
}
|
||||||
|
if (failedCount > 0) {
|
||||||
|
if (updatedCount > 0 || upToDateCount > 0) std::cout << ", ";
|
||||||
|
std::cout << failedCount << " failed";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user