aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2020-02-13 21:15:54 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2020-02-13 21:15:54 -0500
commitb5dc6f2c428b4555d3e56e628605f54e4a63b16e (patch)
tree0c6c1a41292c9ee088065c57bd12939d24195e1c /src
parentf0ba44942b27c3ac4bc48bff3f8d2fea9d8757fa (diff)
downloadspmc-b5dc6f2c428b4555d3e56e628605f54e4a63b16e.tar.gz
Implement ManifestList:
* Initial support for multiple manifests at once
Diffstat (limited to 'src')
-rw-r--r--src/manifest.c96
-rw-r--r--src/spm.c49
2 files changed, 119 insertions, 26 deletions
diff --git a/src/manifest.c b/src/manifest.c
index 4f3fa8c..30e5856 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -310,6 +310,7 @@ int manifest_validate(void) {
}
return problems;
}
+
/**
* Read the package manifest stored in the configuration directory
* @return `Manifest` structure
@@ -496,6 +497,97 @@ ManifestPackage *manifest_package_copy(ManifestPackage *manifest) {
return result;
}
-int manifest_merge(Manifest *a, Manifest *b) {
+/**
+ *
+ * @param ManifestList `pManifestList`
+ */
+void manifestlist_free(ManifestList *pManifestList) {
+ for (size_t i = 0; i < pManifestList->num_inuse; i++) {
+ manifest_free(pManifestList->data[i]);
+ }
+ free(pManifestList->data);
+ free(pManifestList);
+}
+
+/**
+ * Append a value to the list
+ * @param ManifestList `pManifestList`
+ * @param str
+ */
+void manifestlist_append(ManifestList *pManifestList, char *path) {
+ Manifest **tmp = realloc(pManifestList->data, (pManifestList->num_alloc + 1) * sizeof(Manifest *));
+ if (tmp == NULL) {
+ manifestlist_free(pManifestList);
+ perror("failed to append to array");
+ exit(1);
+ }
+ pManifestList->data = tmp;
+ pManifestList->data[pManifestList->num_inuse] = manifest_read(path);
+ pManifestList->num_inuse++;
+ pManifestList->num_alloc++;
+}
+
+ManifestPackage *manifestlist_search(ManifestList *pManifestList, const char *_package) {
+ ManifestPackage *result = NULL;
+ for (size_t i = 0; i < manifestlist_count(pManifestList); i++) {
+ result = manifest_search(manifestlist_item(pManifestList, i), _package);
+ }
+ return result;
+}
+
+/**
+ * Get the count of values stored in a `pManifestList`
+ * @param ManifestList
+ * @return
+ */
+size_t manifestlist_count(ManifestList *pManifestList) {
+ return pManifestList->num_inuse;
+}
+
+/**
+ * Set value at index
+ * @param ManifestList
+ * @param value string
+ * @return
+ */
+void manifestlist_set(ManifestList *pManifestList, size_t index, Manifest *value) {
+ Manifest *item = NULL;
+ if (index > manifestlist_count(pManifestList)) {
+ return;
+ }
+ if ((item = manifestlist_item(pManifestList, index)) == NULL) {
+ return;
+ }
+ memcpy(pManifestList->data[index], value, sizeof(Manifest));
+}
+
+/**
+ * Retrieve data from a `pManifestList`
+ * @param ManifestList
+ * @param index
+ * @return string
+ */
+Manifest *manifestlist_item(ManifestList *pManifestList, size_t index) {
+ if (index > manifestlist_count(pManifestList)) {
+ return NULL;
+ }
+ return pManifestList->data[index];
+}
+
+/**
+ * Initialize an empty `pManifestList`
+ * @return `pManifestList`
+ */
+ManifestList *manifestlist_init() {
+ ManifestList *pManifestList = calloc(1, sizeof(ManifestList));
+ if (pManifestList == NULL) {
+ perror("failed to allocate array");
+ exit(errno);
+ }
+ pManifestList->num_inuse = 0;
+ pManifestList->num_alloc = 1;
+ pManifestList->data = calloc(pManifestList->num_alloc, sizeof(char *));
+ return pManifestList;
+}
+
-} \ No newline at end of file
diff --git a/src/spm.c b/src/spm.c
index b2ffb8f..ff6b415 100644
--- a/src/spm.c
+++ b/src/spm.c
@@ -57,7 +57,8 @@ int main(int argc, char *argv[], char *arge[]) {
}
// Populate at least one manifest record
- manifests[manifests_count] = manifest_read(SPM_GLOBAL.package_dir);
+ //manifests[manifests_count] = manifest_read(SPM_GLOBAL.package_dir);
+ ManifestList *mf = manifestlist_init();
for (int i = 1; i < argc; i++) {
char *arg = argv[i];
@@ -82,11 +83,8 @@ int main(int argc, char *argv[], char *arge[]) {
usage(program_name);
exit(1);
}
- char *repo = join((char *[]) {arg_next, SPM_GLOBAL.repo_target, NULL}, DIRSEPS);
- manifests[manifests_count] = manifest_from(repo);
- manifests_count++;
+ manifestlist_append(mf, arg_next);
i++;
- free(repo);
}
else if (strcmp(arg, "--reindex") == 0) {
Manifest *info = manifest_from(SPM_GLOBAL.package_dir);
@@ -215,7 +213,7 @@ int main(int argc, char *argv[], char *arge[]) {
printf("Resolving package requirements...\n");
for (size_t i = 0; i < strlist_count(packages); i++) {
ManifestPackage *package = NULL;
- if ((package = manifest_search(manifest, strlist_item(packages, i))) == NULL) {
+ if ((package = manifestlist_search(mf, strlist_item(packages, i))) == NULL) {
fprintf(stderr, "Package not found: %s\n", strlist_item(packages, i));
continue;
}
@@ -245,7 +243,7 @@ int main(int argc, char *argv[], char *arge[]) {
printf("Installing package requirements:\n");
for (size_t i = 0; i < deps->records; i++) {
printf(" -> %s\n", deps->list[i]);
- ManifestPackage *package = manifest_search(manifest, deps->list[i]);
+ ManifestPackage *package = manifestlist_search(mf, deps->list[i]);
char *package_path = join((char *[]) {SPM_GLOBAL.package_dir, package->archive, NULL}, DIRSEPS);
if (install(root, package_path) < 0) {
@@ -264,11 +262,12 @@ int main(int argc, char *argv[], char *arge[]) {
ManifestPackage *match = NULL;
char *package = NULL;
- if ((match = manifest_search(manifest, strlist_item(packages, i))) == NULL) {
+ if ((match = manifestlist_search(mf, strlist_item(packages, i))) == NULL) {
fprintf(SYSERROR);
runtime_free(rt);
exit(1);
}
+
package = join((char *[]) {SPM_GLOBAL.package_dir, match->archive, NULL}, DIRSEPS);
// If the package was installed as a requirement of another dependency, skip it
@@ -289,7 +288,6 @@ int main(int argc, char *argv[], char *arge[]) {
}
if (RUNTIME_SEARCH || RUNTIME_LIST) {
- Manifest *info = manifest_read(NULL);
char name[255];
char op[25];
char ver[255];
@@ -337,27 +335,30 @@ int main(int argc, char *argv[], char *arge[]) {
putchar('#');
print_banner("-", banner_size);
- if (RUNTIME_SEARCH) {
- ManifestPackage **package = find_by_spec(info, name, op, ver);
- for (int p = 0; package[p] != NULL; p++) {
- char *package_hsize = human_readable_size(package[p]->size);
- printf(" %-20s %-20s %-20s %-20s\n", package[p]->name, package[p]->version, package[p]->revision, package_hsize);
- free(package_hsize);
- }
- }
- else if(RUNTIME_LIST) {
- for (size_t p = 0; p < info->records; p++) {
- char *package_hsize = human_readable_size(info->packages[p]->size);
- printf(" %-20s %-20s %-20s %-20s\n", info->packages[p]->name, info->packages[p]->version, info->packages[p]->revision, package_hsize);
- free(package_hsize);
+ for (size_t m = 0; m < manifestlist_count(mf); m++) {
+ Manifest *info = manifestlist_item(mf, m);
+ if (RUNTIME_SEARCH) {
+ ManifestPackage **package = find_by_spec(info, name, op, ver);
+ for (int p = 0; package[p] != NULL; p++) {
+ char *package_hsize = human_readable_size(package[p]->size);
+ printf(" %-20s %-20s %-20s %-20s\n", package[p]->name, package[p]->version, package[p]->revision,
+ package_hsize);
+ free(package_hsize);
+ }
+ } else if (RUNTIME_LIST) {
+ for (size_t p = 0; p < info->records; p++) {
+ char *package_hsize = human_readable_size(info->packages[p]->size);
+ printf(" %-20s %-20s %-20s %-20s\n", info->packages[p]->name, info->packages[p]->version,
+ info->packages[p]->revision, package_hsize);
+ free(package_hsize);
+ }
}
}
-
- manifest_free(info);
}
runtime_free(rt);
free_global_config();
strlist_free(packages);
+ manifestlist_free(mf);
return 0;
}