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);
}
|