aboutsummaryrefslogtreecommitdiff
path: root/src/manifest.c
blob: 5193c3da027883f6e5c3e08f17a1fc628c52eb24 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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);
}