aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/manifest.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/manifest.c b/src/manifest.c
index b41e9f7..5193c3d 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -1,4 +1,96 @@
//
// Created by jhunk on 12/20/19.
//
+#include "spm.h"
+int manifest_create(const char *package_dir) {
+ const char *filename = "manifest.dat";
+ char path[PATH_MAX];
+ int total_records = 0;
+ 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);
+
+ printf("Gathering package data:\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]));
+ Dependencies *deps = NULL;
+ dep_init(&deps);
+ if (dep_all(&deps, basename(fsdata->files[i])) < 0) {
+ dep_free(&deps);
+ }
+
+ // Initialize package record
+ info[i] = (ManifestPackage *)calloc(1, sizeof(ManifestPackage));
+
+ // Copy dependencies
+ if (deps->records) {
+ info[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]));
+ }
+ }
+ 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);
+ split_free(parts);
+ total_records++;
+ }
+ printf("\n");
+
+ FILE *fp = fopen(path, "w+");
+ char *reqs;
+ for (int i = 0; i < total_records; i++) {
+ if (SPM_GLOBAL.verbose) {
+ 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
+ );
+ reqs = join(info[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++) {
+ // 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, ",");
+ 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 : "*");
+ fprintf(fp, "%s\n", dptr);
+ free(reqs);
+ }
+ fclose(fp);
+}