diff options
| author | allusive-dev <[email protected]> | 2023-11-17 12:26:02 +1100 |
|---|---|---|
| committer | allusive-dev <[email protected]> | 2023-11-17 12:26:02 +1100 |
| commit | 0ba9b466644b6bd601a8163eaf9526a9bada97fc (patch) | |
| tree | f10696cd925928bd20e55b14afc369fcda4f9f77 /src | |
| parent | Update README.md (diff) | |
| download | compfy-0ba9b466644b6bd601a8163eaf9526a9bada97fc.tar.xz compfy-0ba9b466644b6bd601a8163eaf9526a9bada97fc.zip | |
Added version checker. See README
Diffstat (limited to 'src')
| -rw-r--r-- | src/compfy.modulemap | 6 | ||||
| -rw-r--r-- | src/meson.build | 7 | ||||
| -rw-r--r-- | src/options.c | 18 | ||||
| -rw-r--r-- | src/update.c | 89 |
4 files changed, 117 insertions, 3 deletions
diff --git a/src/compfy.modulemap b/src/compfy.modulemap index 621ad81..78d7d94 100644 --- a/src/compfy.modulemap +++ b/src/compfy.modulemap @@ -23,6 +23,12 @@ module region { module compfy { header "compfy.h" } +module curl { + header "curl.h" +} +module json-c { + header "json.h" +} module types { header "types.h" } diff --git a/src/meson.build b/src/meson.build index 48b212f..60d1893 100644 --- a/src/meson.build +++ b/src/meson.build @@ -9,7 +9,7 @@ base_deps = [ srcs = [ files('compfy.c', 'win.c', 'c2.c', 'x.c', 'config.c', 'vsync.c', 'utils.c', 'diagnostic.c', 'string_utils.c', 'render.c', 'kernel.c', 'log.c', - 'options.c', 'event.c', 'cache.c', 'atom.c', 'file_watch.c') ] + 'options.c', 'event.c', 'cache.c', 'atom.c', 'file_watch.c', 'update.c') ] compfy_inc = include_directories('.') cflags = [] @@ -37,6 +37,11 @@ endif deps = [] +if get_option('update_checks') + cflags += ['-DCONFIG_UPDATES'] + deps += [dependency('json-c', required: true), dependency('libcurl', required: true)] +endif + if get_option('config_file') deps += [dependency('libconfig', version: '>=1.4', required: true)] diff --git a/src/options.c b/src/options.c index 098e25f..d270ee9 100644 --- a/src/options.c +++ b/src/options.c @@ -191,6 +191,9 @@ static const struct compfy_option compfy_options[] = { {"active-opacity-exclude", required_argument, 817, NULL, "Exclude windows from being affected by active opacity"}, {"inactive-exclude", required_argument, 818, NULL, "Exclude windows from being affected by inactive opacity"}, {"blur-whitelist", no_argument, 819, NULL, "Toggles Blur Whitelisting"}, +#ifdef CONFIG_UPDATES + {"check-for-updates", no_argument,'cfu', NULL, "Check for updates"}, +#endif }; // clang-format on @@ -336,8 +339,14 @@ bool get_early_config(int argc, char *const *argv, char **config_file, bool *all } else if (o == 'h') { usage(argv[0], 0); return true; - - } else if (o == 'b') { + } +#ifdef CONFIG_UPDATES + else if (o == 'cfu') { + check_for_updates(); + return true; + } +#endif + else if (o == 'b') { *fork = true; } else if (o == 314) { *all_xerrors = true; @@ -412,6 +421,11 @@ bool get_cfg(options_t *opt, int argc, char *const *argv, bool shadow_enable, // so assert(false) here assert(false); break; +#ifdef CONFIG_UPDATES + case 'cfu': + assert(false); + break; +#endif case 'b': case 314: case 320: diff --git a/src/update.c b/src/update.c new file mode 100644 index 0000000..e05f465 --- /dev/null +++ b/src/update.c @@ -0,0 +1,89 @@ +#ifdef CONFIG_UPDATES +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <curl/curl.h> +#include <json-c/json.h> + +// Callback function to handle the response data +size_t write_callback_updater(void* contents, size_t size, size_t nmemb, void* user_data) { + size_t real_size = size * nmemb; + ((char*)user_data)[real_size] = '\0'; // Null-terminate the string + strcat(user_data, (const char*)contents); + return real_size; +} + +// Function to fetch the latest release tag from a GitHub repository +char* get_latest_release_tag(const char* owner, const char* repo) { + CURL* curl; + CURLcode res; + + // Initialize libcurl + curl_global_init(CURL_GLOBAL_DEFAULT); + curl = curl_easy_init(); + + if (curl) { + // Set the GitHub API URL with a User-Agent header + char url[100]; + snprintf(url, sizeof(url), "https://api.github.com/repos/%s/%s/releases/latest", owner, repo); + curl_easy_setopt(curl, CURLOPT_URL, url); + + // Add a User-Agent header to the request + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Compfy_Fetch_Version"); + + // Set up a buffer to store the response data + char response_buffer[4096] = {0}; + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback_updater); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_buffer); + + // Perform the HTTP request + res = curl_easy_perform(curl); + + // Check for errors + if (res != CURLE_OK) { + fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); + } else { + // Print the response for debugging + // printf("Response: %s\n", response_buffer); + + // Parse the JSON response + struct json_object* json = json_tokener_parse(response_buffer); + if (json == NULL) { + fprintf(stderr, "Error parsing JSON response\n"); + } else { + struct json_object* tag_name; + json_object_object_get_ex(json, "tag_name", &tag_name); + + // Clean up libcurl + curl_easy_cleanup(curl); + + // Return the latest release tag + char* tag = strdup(json_object_get_string(tag_name)); + // printf("Tag: %s\n", tag); + return tag; + } + } + } + + // Clean up libcurl in case of failure + curl_easy_cleanup(curl); + return NULL; +} + +int check_for_updates() { + const char* owner = "allusive-dev"; + const char* repo = "compfy"; + + char* latest_tag = get_latest_release_tag(owner, repo); + + if (latest_tag) { + printf("Your current version is: %s\n", COMPFY_VERSION); + printf("The latest version is: %s\n", latest_tag); + free(latest_tag); + } else { + printf("Unable to fetch latest release.\n"); + } + + return 0; +} +#endif
\ No newline at end of file |