diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2020-02-13 21:15:54 -0500 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2020-02-13 21:15:54 -0500 |
commit | b5dc6f2c428b4555d3e56e628605f54e4a63b16e (patch) | |
tree | 0c6c1a41292c9ee088065c57bd12939d24195e1c /src | |
parent | f0ba44942b27c3ac4bc48bff3f8d2fea9d8757fa (diff) | |
download | spmc-b5dc6f2c428b4555d3e56e628605f54e4a63b16e.tar.gz |
Implement ManifestList:
* Initial support for multiple manifests at once
Diffstat (limited to 'src')
-rw-r--r-- | src/manifest.c | 96 | ||||
-rw-r--r-- | src/spm.c | 49 |
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 @@ -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; } |