diff options
Diffstat (limited to 'src/wheel.c')
-rw-r--r-- | src/wheel.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/wheel.c b/src/wheel.c new file mode 100644 index 0000000..a4ddbff --- /dev/null +++ b/src/wheel.c @@ -0,0 +1,74 @@ +#include "wheel.h" + +struct Wheel *get_wheel_file(const char *basepath, const char *name, char *to_match[]) { + DIR *dp; + struct dirent *rec; + struct Wheel *result = NULL; + char package_path[PATH_MAX]; + char package_name[NAME_MAX]; + + strcpy(package_name, name); + tolower_s(package_name); + sprintf(package_path, "%s/%s", basepath, package_name); + + dp = opendir(package_path); + if (!dp) { + return NULL; + } + + while ((rec = readdir(dp)) != NULL) { + if (!strcmp(rec->d_name, ".") || !strcmp(rec->d_name, "..")) { + continue; + } + char filename[NAME_MAX]; + strcpy(filename, rec->d_name); + char *ext = strstr(filename, ".whl"); + if (ext) { + *ext = '\0'; + } else { + // not a wheel file. nothing to do + continue; + } + + size_t match = 0; + size_t pattern_count = 0; + for (; to_match[pattern_count] != NULL; pattern_count++) { + if (strstr(filename, to_match[pattern_count])) { + match++; + } + } + + if (!startswith(rec->d_name, name) || match != pattern_count) { + continue; + } + + result = calloc(1, sizeof(*result)); + result->path_name = realpath(package_path, NULL); + result->file_name = strdup(rec->d_name); + + size_t parts_total; + char **parts = split(filename, "-", 0); + for (parts_total = 0; parts[parts_total] != NULL; parts_total++); + if (parts_total < 6) { + // no build tag + result->distribution = strdup(parts[0]); + result->version = strdup(parts[1]); + result->build_tag = NULL; + result->python_tag = strdup(parts[2]); + result->abi_tag = strdup(parts[3]); + result->platform_tag = strdup(parts[4]); + } else { + // has build tag + result->distribution = strdup(parts[0]); + result->version = strdup(parts[1]); + result->build_tag = strdup(parts[2]); + result->python_tag = strdup(parts[3]); + result->abi_tag = strdup(parts[4]); + result->platform_tag = strdup(parts[5]); + } + split_free(parts); + break; + } + closedir(dp); + return result; +} |