mirror of
https://github.com/davidallendj/gdpm.git
synced 2025-12-20 03:27:02 -07:00
Install and Remove Patch
Fixed issue where packages would not install or remove correctly.
This commit is contained in:
parent
2b250d9a2d
commit
2fd55de71e
6 changed files with 64 additions and 38 deletions
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <rapidjson/rapidjson.h>
|
||||
#include <string>
|
||||
|
||||
namespace gdpm::constants{
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ namespace gdpm::http{
|
|||
std::unordered_map<std::string, std::string> headers{};
|
||||
};
|
||||
|
||||
response request_get(const std::string& url, size_t timeout = GDPM_CONFIG_TIMEOUT_MS);
|
||||
response request_post(const std::string& url, const char *post_fields="", size_t timeout = GDPM_CONFIG_TIMEOUT_MS);
|
||||
response download_file(const std::string& url, const std::string& storage_path, size_t timeout = GDPM_CONFIG_TIMEOUT_MS);
|
||||
response request_get(const std::string& url, size_t timeout = GDPM_CONFIG_TIMEOUT_MS, int verbose = 0);
|
||||
response request_post(const std::string& url, const char *post_fields="", size_t timeout = GDPM_CONFIG_TIMEOUT_MS, int verbose = 0);
|
||||
response download_file(const std::string& url, const std::string& storage_path, size_t timeout = GDPM_CONFIG_TIMEOUT_MS, int verbose = 0);
|
||||
|
||||
}
|
||||
|
|
@ -60,6 +60,7 @@ namespace gdpm::utils{
|
|||
return fwrite(ptr, size, nmemb, (FILE*)userdata);
|
||||
}
|
||||
|
||||
/* Use ISO 8601 for default timestamp format. */
|
||||
static inline auto timestamp(const std::string& format = GDPM_TIMESTAMP_FORMAT){
|
||||
time_t t = std::time(nullptr);
|
||||
#if GDPM_ENABLE_TIMESTAMPS == 1
|
||||
|
|
@ -101,4 +102,5 @@ namespace gdpm::utils{
|
|||
std::string prompt_user(const char *message);
|
||||
bool prompt_user_yn(const char *message);
|
||||
void delay(std::chrono::milliseconds milliseconds = GDPM_REQUEST_DELAY);
|
||||
// TODO: Add function to get size of decompressed zip
|
||||
}
|
||||
|
|
@ -44,7 +44,8 @@ cpp_args = [
|
|||
'-DGDPM_REQUEST_DELAY=200ms',
|
||||
'-DGDPM_ENABLE_COLORS=1',
|
||||
'-DGDPM_ENABLE_TIMESTAMPS=1',
|
||||
'-DGDPM_TIMESTAMP_FORMAT=":%I:%M:%S %p; %Y-%m-%d"'
|
||||
'-DGDPM_TIMESTAMP_FORMAT=":%I:%M:%S %p; %Y-%m-%d"',
|
||||
'-DRAPIDJSON_HAS_STDSTRING=1'
|
||||
]
|
||||
lib = shared_library(
|
||||
meson.project_name(),
|
||||
|
|
|
|||
13
src/http.cpp
13
src/http.cpp
|
|
@ -2,14 +2,13 @@
|
|||
#include "http.hpp"
|
||||
#include "utils.hpp"
|
||||
#include "log.hpp"
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <stdio.h>
|
||||
#include <chrono>
|
||||
|
||||
|
||||
namespace gdpm::http{
|
||||
response request_get(const std::string& url, size_t timeout){
|
||||
response request_get(const std::string& url, size_t timeout, int verbose){
|
||||
CURL *curl = nullptr;
|
||||
CURLcode res;
|
||||
utils::memory_buffer buf = utils::make_buffer();
|
||||
|
|
@ -32,7 +31,7 @@ namespace gdpm::http{
|
|||
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, timeout);
|
||||
res = curl_easy_perform(curl);
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &r.code);
|
||||
if(res != CURLE_OK)
|
||||
if(res != CURLE_OK && verbose > 0)
|
||||
log::error("_make_request.curl_easy_perform(): {}", curl_easy_strerror(res));
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
|
@ -43,7 +42,7 @@ namespace gdpm::http{
|
|||
return r;
|
||||
}
|
||||
|
||||
response request_post(const std::string& url, const char *post_fields, size_t timeout){
|
||||
response request_post(const std::string& url, const char *post_fields, size_t timeout, int verbose){
|
||||
CURL *curl = nullptr;
|
||||
CURLcode res;
|
||||
utils::memory_buffer buf = utils::make_buffer();
|
||||
|
|
@ -66,7 +65,7 @@ namespace gdpm::http{
|
|||
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, timeout);
|
||||
res = curl_easy_perform(curl);
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &r.code);
|
||||
if(res != CURLE_OK)
|
||||
if(res != CURLE_OK && verbose > 0)
|
||||
log::error("_make_request.curl_easy_perform(): {}", curl_easy_strerror(res));
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
|
@ -77,7 +76,7 @@ namespace gdpm::http{
|
|||
return r;
|
||||
}
|
||||
|
||||
response download_file(const std::string& url, const std::string& storage_path, size_t timeout){
|
||||
response download_file(const std::string& url, const std::string& storage_path, size_t timeout, int verbose){
|
||||
CURL *curl = nullptr;
|
||||
CURLcode res;
|
||||
response r;
|
||||
|
|
@ -114,7 +113,7 @@ namespace gdpm::http{
|
|||
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, timeout);
|
||||
res = curl_easy_perform(curl);
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &r.code);
|
||||
if(res != CURLE_OK){
|
||||
if(res != CURLE_OK && verbose > 0){
|
||||
log::error("download_file.curl_easy_perform() failed: {}", curl_easy_strerror(res));
|
||||
}
|
||||
fclose(fp);
|
||||
|
|
|
|||
|
|
@ -134,7 +134,9 @@ namespace gdpm::package_manager{
|
|||
|
||||
/* Retrieve necessary asset data if it was found already in cache */
|
||||
Document doc;
|
||||
// log::debug("download_url: {}\ncategory: {}\ndescription: {}\nsupport_level: {}", p.download_url, p.category, p.description, p.support_level);
|
||||
if(p.download_url.empty() || p.category.empty() || p.description.empty() || p.support_level.empty()){
|
||||
params.verbose = config.verbose;
|
||||
doc = rest_api::get_asset(url, p.asset_id, params);
|
||||
if(doc.HasParseError() || doc.IsNull()){
|
||||
log::println("");
|
||||
|
|
@ -148,6 +150,22 @@ namespace gdpm::package_manager{
|
|||
p.download_hash = doc["download_hash"].GetString();
|
||||
}
|
||||
else{
|
||||
/* Package for in cache so no remote request. Still need to populate RapidJson::Document to write to package.json.
|
||||
NOTE: This may not be necessary at all!
|
||||
*/
|
||||
// doc["asset_id"].SetUint64(p.asset_id
|
||||
// doc["type"].SetString(p.type, doc.GetAllocator());
|
||||
// doc["title"].SetString(p.title, doc.GetAllocator());
|
||||
// doc["author"].SetString(p.author, doc.GetAllocator());
|
||||
// doc["author_id"].SetUint64(p.author_id);
|
||||
// doc["version"].SetString(p.version, doc.GetAllocator());
|
||||
// doc["category"].SetString(p.category, doc.GetAllocator());
|
||||
// doc["godot_version"].SetString(p.godot_version, doc.GetAllocator());
|
||||
// doc["cost"].SetString(p.cost, doc.GetAllocator());
|
||||
// doc["description"].SetString(p.description, doc.GetAllocator());
|
||||
// doc["support_level"].SetString(p.support_level, doc.GetAllocator());
|
||||
// doc["download_url"].SetString(p.download_url, doc.GetAllocator());
|
||||
// doc["download_hash"].SetString(p.download_hash, doc.GetAllocator;
|
||||
}
|
||||
|
||||
/* Set directory and temp paths for storage */
|
||||
|
|
@ -164,6 +182,7 @@ namespace gdpm::package_manager{
|
|||
/* Dump asset information for lookup into JSON in package directory */
|
||||
if(!std::filesystem::exists(package_dir))
|
||||
std::filesystem::create_directory(package_dir);
|
||||
|
||||
std::ofstream ofs(package_dir + "/package.json");
|
||||
OStreamWrapper osw(ofs);
|
||||
PrettyWriter<OStreamWrapper> writer(osw);
|
||||
|
|
@ -176,8 +195,8 @@ namespace gdpm::package_manager{
|
|||
else{
|
||||
/* Download all the package files and place them in tmp directory. */
|
||||
log::print("Downloading \"{}\"...", p.title);
|
||||
std::string download_url = doc["download_url"].GetString();
|
||||
std::string title = doc["title"].GetString();
|
||||
std::string download_url = p.download_url;// doc["download_url"].GetString();
|
||||
std::string title = p.title;// doc["title"].GetString();
|
||||
http::response response = http::download_file(download_url, tmp_zip);
|
||||
if(response.code == 200){
|
||||
log::println("Done.");
|
||||
|
|
@ -209,6 +228,7 @@ namespace gdpm::package_manager{
|
|||
using namespace std::filesystem;
|
||||
|
||||
if(package_titles.empty()){
|
||||
log::println("");
|
||||
log::error("No packages to remove.");
|
||||
return;
|
||||
}
|
||||
|
|
@ -216,6 +236,7 @@ namespace gdpm::package_manager{
|
|||
/* Find the packages to remove if they're is_installed and show them to the user */
|
||||
std::vector<package_info> p_cache = cache::get_package_info_by_title(package_titles);
|
||||
if(p_cache.empty()){
|
||||
log::println("");
|
||||
log::error("Could not find any packages to remove.");
|
||||
return;
|
||||
}
|
||||
|
|
@ -227,6 +248,7 @@ namespace gdpm::package_manager{
|
|||
});
|
||||
|
||||
if(p_count == 0){
|
||||
log::println("");
|
||||
log::error("No packages to remove.");
|
||||
return;
|
||||
}
|
||||
|
|
@ -251,29 +273,30 @@ namespace gdpm::package_manager{
|
|||
}
|
||||
|
||||
/* Traverse the package directory */
|
||||
for(const auto& entry : recursive_directory_iterator(path)){
|
||||
if(entry.is_directory()){
|
||||
}
|
||||
else if(entry.is_regular_file()){
|
||||
std::string filename = entry.path().filename().string();
|
||||
std::string pkg_path = entry.path().lexically_normal().string();
|
||||
// for(const auto& entry : recursive_directory_iterator(path)){
|
||||
// if(entry.is_directory()){
|
||||
// }
|
||||
// else if(entry.is_regular_file()){
|
||||
// std::string filename = entry.path().filename().string();
|
||||
// std::string pkg_path = entry.path().lexically_normal().string();
|
||||
|
||||
// pkg_path = utils::replace_all(pkg_path, " ", "\\ ");
|
||||
if(filename == "package.json"){
|
||||
std::string contents = utils::readfile(pkg_path);
|
||||
Document doc;
|
||||
if(config.verbose > 0){
|
||||
log::debug("package path: {}", pkg_path);
|
||||
log::debug("contents: \n{}", contents);
|
||||
}
|
||||
doc.Parse(contents.c_str());
|
||||
if(doc.IsNull()){
|
||||
log::error("Could not remove packages. Parsing 'package.json' returned NULL.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// // pkg_path = utils::replace_all(pkg_path, " ", "\\ ");
|
||||
// if(filename == "package.json"){
|
||||
// std::string contents = utils::readfile(pkg_path);
|
||||
// Document doc;
|
||||
// if(config.verbose > 0){
|
||||
// log::debug("package path: {}", pkg_path);
|
||||
// log::debug("contents: \n{}", contents);
|
||||
// }
|
||||
// doc.Parse(contents.c_str());
|
||||
// if(doc.IsNull()){
|
||||
// log::println("");
|
||||
// log::error("Could not remove packages. Parsing 'package.json' returned NULL.");
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
p.is_installed = false;
|
||||
}
|
||||
log::println("Done.");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue