aboutsummaryrefslogtreecommitdiff
path: root/src/resolve.c
blob: 0bb207e07f3fb6183e19a4e649597446ea27683c (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
/**
 * Dependency resolution functions
 * @file resolve.c
 */
#include "spm.h"

static ManifestPackage *requirements[SPM_REQUIREMENT_MAX] = {0, };

/**
 * Scan global `requirements` array for `archive`
 * @param archive
 * @return 0 = not found, 1 = found
 */
int resolve_has_dependency(const char *archive) {
    for (size_t i = 0; requirements[i] != NULL && i < SPM_REQUIREMENT_MAX; i++) {
        if (strcmp(requirements[i]->archive, archive) == 0) {
            return 1;
        }
    }
    return 0;
}

/**
 * Recursively scan a package for its dependencies
 * @param manifests `ManifestList` struct
 * @param spec Package name (accepts version specifiers)
 * @return success = array of `ManifestPackage`, not found = NULL
 */
ManifestPackage **resolve_dependencies(ManifestList *manifests, const char *spec) {
    ManifestPackage *package = manifestlist_search(manifests, spec);
    if (package == NULL) {
        return NULL;
    }

    for (size_t i = 0; i < package->requirements_records && i < SPM_REQUIREMENT_MAX; i++) {
        ManifestPackage *requirement = manifestlist_search(manifests, package->requirements[i]);
        if (requirement == NULL) {
            break;
        }
        if (resolve_has_dependency(requirement->archive)) {
            continue;
        }
        resolve_dependencies(manifests, requirement->archive);
        requirements[i] = requirement;
    }
    return requirements;
}