aboutsummaryrefslogtreecommitdiff
path: root/src/manifest.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/manifest.c')
-rw-r--r--src/manifest.c157
1 files changed, 119 insertions, 38 deletions
diff --git a/src/manifest.c b/src/manifest.c
index 5193c3d..e60599d 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -2,20 +2,16 @@
// Created by jhunk on 12/20/19.
//
#include "spm.h"
+#include <fnmatch.h>
-int manifest_create(const char *package_dir) {
- const char *filename = "manifest.dat";
- char path[PATH_MAX];
- int total_records = 0;
+Manifest *manifest_from(const char *package_dir) {
FSTree *fsdata = NULL;
fsdata = fstree(package_dir);
- ManifestPackage **info = (ManifestPackage **)calloc(fsdata->files_length + 1, sizeof(ManifestPackage *));
-
- memset(path, '\0', sizeof(path));
- memset(info, '\0', sizeof(ManifestPackage *));
- sprintf(path, "%s%c%s", SPM_GLOBAL.user_config_basedir, DIRSEP, filename);
+ Manifest *info = (Manifest *)calloc(1, sizeof(Manifest));
+ info->records = fsdata->files_length;
+ info->packages = (ManifestPackage **) calloc(info->records + 1, sizeof(ManifestPackage *));
- printf("Gathering package data:\n");
+ printf("Initializing package manifest:\n");
for (int i = 0; i < fsdata->files_length && i < 0xffff; i++) {
float percent = (((float)i + 1) / fsdata->files_length) * 100;
printf("[%3.0f%%] %s\n", percent, basename(fsdata->files[i]));
@@ -26,71 +22,156 @@ int manifest_create(const char *package_dir) {
}
// Initialize package record
- info[i] = (ManifestPackage *)calloc(1, sizeof(ManifestPackage));
+ info->packages[i] = (ManifestPackage *) calloc(1, sizeof(ManifestPackage));
// Copy dependencies
if (deps->records) {
- info[i]->requirements = (char **) calloc(deps->__size, sizeof(char *));
+ info->packages[i]->requirements = (char **) calloc(deps->__size, sizeof(char *));
for (int j = 0; j < deps->records; j++) {
- info[i]->requirements[j] = (char *) calloc(strlen(deps->list[j]) + 1, sizeof(char));
- strncpy(info[i]->requirements[j], deps->list[j], strlen(deps->list[j]));
+ info->packages[i]->requirements[j] = (char *) calloc(strlen(deps->list[j]) + 1, sizeof(char));
+ strncpy(info->packages[i]->requirements[j], deps->list[j], strlen(deps->list[j]));
}
}
dep_free(&deps);
char **parts = split(fsdata->files[i], "-");
- info[i]->size = get_file_size(fsdata->files[i]);
- strncpy(info[i]->archive, basename(fsdata->files[i]), PACKAGE_MEMBER_SIZE);
- strncpy(info[i]->name, basename(parts[0]), PACKAGE_MEMBER_SIZE);
- strncpy(info[i]->version, parts[1], PACKAGE_MEMBER_SIZE);
- strncpy(info[i]->revision, parts[2], PACKAGE_MEMBER_SIZE);
- strdelsuffix(info[i]->revision, SPM_PACKAGE_EXTENSION);
+ info->packages[i]->size = get_file_size(fsdata->files[i]);
+ strncpy(info->packages[i]->archive, basename(fsdata->files[i]), PACKAGE_MEMBER_SIZE);
+ strncpy(info->packages[i]->name, basename(parts[0]), PACKAGE_MEMBER_SIZE);
+ strncpy(info->packages[i]->version, parts[1], PACKAGE_MEMBER_SIZE);
+ strncpy(info->packages[i]->revision, parts[2], PACKAGE_MEMBER_SIZE);
+ strdelsuffix(info->packages[i]->revision, SPM_PACKAGE_EXTENSION);
split_free(parts);
- total_records++;
}
- printf("\n");
+ //printf("\n");
+ return info;
+}
+
+void manifest_free(Manifest *info) {
+ for (int i = 0; i < info->records; i++) {
+ if (info->packages[i]->requirements) {
+ for (int j = 0; info->packages[i]->requirements[j] != NULL; j++) {
+ free(info->packages[i]->requirements[j]);
+ }
+ free(info->packages[i]->requirements);
+ }
+ free(info->packages[i]);
+ }
+ free(info->packages);
+ free(info);
+}
+int manifest_write(Manifest *info) {
+ const char *filename = "manifest.dat";
+ char path[PATH_MAX];
+ memset(path, '\0', sizeof(path));
+ sprintf(path, "%s%c%s", SPM_GLOBAL.user_config_basedir, DIRSEP, filename);
FILE *fp = fopen(path, "w+");
- char *reqs;
- for (int i = 0; i < total_records; i++) {
- if (SPM_GLOBAL.verbose) {
+ char *reqs = NULL;
+
+ if (SPM_GLOBAL.verbose) {
+ for (int i = 0; i < info->records; i++) {
printf("%-20s: %s\n"
"%-20s: %lu\n"
"%-20s: %s\n"
"%-20s: %s\n"
"%-20s: %s\n",
- "archive", info[i]->archive,
- "size", info[i]->size,
- "name", info[i]->name,
- "version", info[i]->version,
- "revision", info[i]->revision
+ "archive", info->packages[i]->archive,
+ "size", info->packages[i]->size,
+ "name", info->packages[i]->name,
+ "version", info->packages[i]->version,
+ "revision", info->packages[i]->revision
);
- reqs = join(info[i]->requirements, ", ");
+ reqs = join(info->packages[i]->requirements, ", ");
printf("%-20s: %s\n", "requirements", reqs ? reqs : "NONE");
free(reqs);
printf("\n");
}
-
}
- printf("Generating manifest: %s\n", path);
- for (int i = 0; i < total_records; i++) {
+ printf("Generating manifest file: %s\n", path);
+ for (int i = 0; i < info->records; i++) {
// write CSV-like manifest
char data[BUFSIZ];
memset(data, '\0', BUFSIZ);
char *dptr = data;
- float percent = (((float)i + 1) / total_records) * 100;
- printf("[%3.0f%%] %s\n", percent, info[i]->archive);
- reqs = join(info[i]->requirements, ",");
+ float percent = (((float)i + 1) / info->records) * 100;
+ printf("[%3.0f%%] %s\n", percent, info->packages[i]->archive);
+ reqs = join(info->packages[i]->requirements, ",");
sprintf(dptr, "%s|" // archive
"%lu|" // size
"%s|" // name
"%s|" // version
"%s|" // revision
"%s" // requirements
- , info[i]->archive, info[i]->size, info[i]->name, info[i]->version, info[i]->revision, reqs ? reqs : "*");
+ , info->packages[i]->archive, info->packages[i]->size, info->packages[i]->name, info->packages[i]->version, info->packages[i]->revision, reqs ? reqs : "*");
fprintf(fp, "%s\n", dptr);
free(reqs);
}
fclose(fp);
+ return 0;
+}
+
+Manifest *manifest_read(void) {
+ const char *filename = "manifest.dat";
+ char path[PATH_MAX];
+ memset(path, '\0', sizeof(path));
+ sprintf(path, "%s%c%s", SPM_GLOBAL.user_config_basedir, DIRSEP, filename);
+ FILE *fp = fopen(path, "r+");
+ if (!fp) {
+ perror(filename);
+ return NULL;
+ }
+ int total_records = 0;
+ char data[BUFSIZ];
+ char *dptr = data;
+ memset(dptr, '\0', BUFSIZ);
+
+ while (fgets(dptr, BUFSIZ, fp) != NULL) {
+ total_records++;
+ }
+ rewind(fp);
+
+ Manifest *info = (Manifest *)calloc(1, sizeof(Manifest));
+ info->packages = (ManifestPackage **)calloc(total_records + 1, sizeof(ManifestPackage *));
+
+ int i = 0;
+ while (fgets(dptr, BUFSIZ, fp) != NULL) {
+ dptr = strip(dptr);
+ char *garbage;
+ char **parts = split(dptr, "|");
+
+ info->packages[i] = (ManifestPackage *)calloc(1, sizeof(ManifestPackage));
+ strncpy(info->packages[i]->archive, parts[0], strlen(parts[0]));
+ info->packages[i]->size = strtoul(parts[1], &garbage, 10);
+ strncpy(info->packages[i]->name, parts[2], strlen(parts[2]));
+ strncpy(info->packages[i]->version, parts[3], strlen(parts[3]));
+ strncpy(info->packages[i]->revision, parts[4], strlen(parts[4]));
+
+ info->packages[i]->requirements = NULL;
+ if (strncmp(parts[5], "*", 2) != 0) {
+ info->packages[i]->requirements = split(parts[5], ",");
+ }
+ split_free(parts);
+ info->records = i;
+ i++;
+ }
+
+ fclose(fp);
+ return info;
}
+
+ManifestPackage *manifest_search(Manifest *info, const char *_package) {
+ char package[PATH_MAX];
+
+ memset(package, '\0', PATH_MAX);
+ strncpy(package, _package, PATH_MAX);
+ strcat(package, "*");
+
+ for (int i = 0; i < info->records; i++) {
+ if (fnmatch(package, info->packages[i]->archive, FNM_PATHNAME) == 0) {
+ return info->packages[i];
+ }
+ }
+ return NULL;
+} \ No newline at end of file