static int install_local_packages() { if (-1 == fs_exists("./package.json")) { logger_error("error", "Missing package.json"); return 1; } char *json = fs_read("./package.json"); if (NULL == json) return 1; clib_package_t *pkg = clib_package_new(json, opts.verbose); if (NULL == pkg) goto e1; int rc = clib_package_install_dependencies(pkg, opts.dir, opts.verbose); if (-1 == rc) goto e2; if (opts.dev) { rc = clib_package_install_development(pkg, opts.dir, opts.verbose); if (-1 == rc) goto e2; } free(json); clib_package_free(pkg); return 0; e2: clib_package_free(pkg); e1: free(json); return 1; }
clib_package_t * clib_package_new_from_slug(const char *_slug, int verbose) { if (!_slug) return NULL; // sanitize `_slug` char *author = clib_package_parse_author(_slug); if (!author) return NULL; char *name = clib_package_parse_name(_slug); if (!name) return NULL; char *version = clib_package_parse_version(_slug); if (!version) return NULL; char *url = clib_package_url(author, name, version); if (!url) return NULL; char *json_url = clib_package_file_url(url, "package.json"); if (!json_url) { free(url); return NULL; } if (verbose) clib_package_log("fetch", json_url); http_get_response_t *res = http_get(json_url); if (!res || !res->ok) { clib_package_error("error", "unable to fetch %s", json_url); free(url); return NULL; } clib_package_t *pkg = clib_package_new(res->data, verbose); if (pkg) { // force version if (NULL == pkg->version || 0 != strcmp(version, pkg->version)) pkg->version = version; // force author if (NULL == pkg->author || 0 == strcmp(author, pkg->author)) pkg->author = author; // force repo char *repo = clib_package_repo(author, name); if (NULL == pkg->repo || 0 != strcmp(repo, pkg->repo)) { pkg->repo = repo; } else { free(repo); } pkg->url = url; } http_get_free(res); return pkg; }
" \"repo\": \"foobar/foo\"," " \"license\": \"mit\"," " \"description\": \"lots of foo\"," " \"src\": [" " \"foo.h\"," " \"foo.c\"" " ]," " \"dependencies\": {" " \"blah/blah\": \"1.2.3\"," " \"bar\": \"*\"," " \"abc/def\": \"master\"" " }" "}"; it("should return NULL when given broken json") { assert(NULL == clib_package_new("{", 0)); } it("should return NULL when given a bad string") { assert(NULL == clib_package_new(NULL, 0)); } it("should return a clib_package when given valid json") { clib_package_t *pkg = clib_package_new(json, 0); assert(pkg); assert_str_equal(json, pkg->json); assert_str_equal("foo", pkg->name); assert_str_equal("foobar", pkg->author); assert_str_equal("1.0.0", pkg->version);
clib_package_t * clib_package_new_from_slug(const char *slug, int verbose) { char *author = NULL; char *name = NULL; char *version = NULL; char *url = NULL; char *json_url = NULL; char *repo = NULL; http_get_response_t *res = NULL; clib_package_t *pkg = NULL; // parse chunks if (!slug) goto error; if (!(author = parse_repo_owner(slug, DEFAULT_REPO_OWNER))) goto error; if (!(name = parse_repo_name(slug))) goto error; if (!(version = parse_repo_version(slug, DEFAULT_REPO_VERSION))) goto error; if (!(url = clib_package_url(author, name, version))) goto error; if (!(json_url = clib_package_file_url(url, "package.json"))) goto error; if (!(repo = clib_package_repo(author, name))) goto error; // fetch json if (verbose) logger_info("fetch", json_url); res = http_get(json_url); if (!res || !res->ok) { logger_error("error", "unable to fetch %s", json_url); goto error; } free(json_url); json_url = NULL; free(name); name = NULL; // build package pkg = clib_package_new(res->data, verbose); http_get_free(res); res = NULL; if (!pkg) goto error; // force version number if (pkg->version) { if (0 != strcmp(version, pkg->version)) { free(pkg->version); pkg->version = version; } else { free(version); } } else { pkg->version = version; } // force package author (don't know how this could fail) if (pkg->author) { if (0 != strcmp(author, pkg->author)) { free(pkg->author); pkg->author = author; } else { free(author); } } else { pkg->author = author; } // force package repo if (pkg->repo) { if (0 != strcmp(repo, pkg->repo)) { free(pkg->repo); pkg->repo = repo; } else { free(repo); } } else { pkg->repo = repo; } pkg->url = url; return pkg; error: if (author) free(author); if (name) free(name); if (version) free(version); if (url) free(url); if (json_url) free(json_url); if (repo) free(repo); if (res) http_get_free(res); if (pkg) clib_package_free(pkg); return NULL; }