diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/manifest.c | 92 |
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); +} |