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; }
static int executable(clib_package_t *pkg) { int rc; char *url = NULL; char *file = NULL; char *tarball = NULL; char *command = NULL; char *dir = NULL; char *deps = NULL; char *tmp = NULL; tmp = gettempdir(); if (NULL == tmp) { logger_error("error", "gettempdir() out of memory"); return -1; } E_FORMAT(&url , "https://github.com/%s/%s/archive/%s.tar.gz" , pkg->author , pkg->name , pkg->version); E_FORMAT(&file, "%s-%s.tar.gz", pkg->name, pkg->version); E_FORMAT(&tarball, "%s/%s", tmp, file); rc = http_get_file(url, tarball); E_FORMAT(&command, "cd %s && tar -xf %s", tmp, file); // cheap untar rc = system(command); if (0 != rc) goto cleanup; E_FORMAT(&dir, "%s/%s-%s", tmp, pkg->name, pkg->version); if (pkg->dependencies) { E_FORMAT(&deps, "%s/deps", dir); rc = clib_package_install_dependencies(pkg, deps, opts.verbose); if (-1 == rc) goto cleanup; } free(command); command = NULL; E_FORMAT(&command, "cd %s && %s", dir, pkg->install); rc = system(command); cleanup: free(tmp); free(dir); free(command); free(tarball); free(file); free(url); return rc; }
int clib_package_install(clib_package_t *pkg, const char *dir, int verbose) { if (!pkg || !dir) return -1; char *pkg_dir = path_join(dir, pkg->name); if (NULL == pkg_dir) { return -1; } if (-1 == mkdirp(pkg_dir, 0777)) { free(pkg_dir); return -1; } if (NULL == pkg->url) { pkg->url = clib_package_url(pkg->author, pkg->repo_name, pkg->version); } if (NULL == pkg->url) { free(pkg_dir); return -1; } if (NULL != pkg->src) { // write package.json char *package_json = path_join(pkg_dir, "package.json"); if (NULL == package_json) { free(pkg_dir); return -1; } fs_write(package_json, pkg->json); free(package_json); // write each source list_node_t *node; list_iterator_t *it = list_iterator_new(pkg->src, LIST_HEAD); while ((node = list_iterator_next(it))) { char *filename = node->val; // download source file char *file_url = clib_package_file_url(pkg->url, filename); char *file_path = path_join(pkg_dir, basename(filename)); if (NULL == file_url || NULL == file_path) { if (file_url) free(file_url); free(pkg_dir); return -1; } if (verbose) { clib_package_log("fetch", file_url); clib_package_log("save", file_path); } int rc = http_get_file(file_url, file_path); free(file_url); free(file_path); if (-1 == rc) { if (verbose) clib_package_error("error", "unable to fetch %s", file_url); free(pkg_dir); return -1; } } list_iterator_destroy(it); } return clib_package_install_dependencies(pkg, dir, verbose); }
int clib_package_install(clib_package_t *pkg, const char *dir, int verbose) { char *pkg_dir = NULL; char *package_json = NULL; list_iterator_t *iterator = NULL; int rc = -1; if (!pkg || !dir) goto cleanup; if (!(pkg_dir = path_join(dir, pkg->name))) goto cleanup; // create directory for pkg if (-1 == mkdirp(pkg_dir, 0777)) goto cleanup; if (NULL == pkg->url) { pkg->url = clib_package_url(pkg->author , pkg->repo_name , pkg->version); if (NULL == pkg->url) goto cleanup; } // if no sources are listed, just install if (NULL == pkg->src) goto install; // write package.json if (!(package_json = path_join(pkg_dir, "package.json"))) goto cleanup; if (-1 == fs_write(package_json, pkg->json)) { logger_error("error", "Failed to write %s", package_json); goto cleanup; } iterator = list_iterator_new(pkg->src, LIST_HEAD); list_node_t *source; while ((source = list_iterator_next(iterator))) { char *filename = NULL; char *file_url = NULL; char *file_path = NULL; int error = 0; filename = source->val; // get file URL to fetch if (!(file_url = clib_package_file_url(pkg->url, filename))) { error = 1; goto loop_cleanup; } // get file path to save if (!(file_path = path_join(pkg_dir, basename(filename)))) { error = 1; goto loop_cleanup; } // TODO the whole URL is overkill and floods my terminal if (verbose) logger_info("fetch", file_url); // fetch source file and save to disk if (-1 == http_get_file(file_url, file_path)) { logger_error("error", "unable to fetch %s", file_url); error = 1; goto loop_cleanup; } if (verbose) logger_info("save", file_path); loop_cleanup: if (file_url) free(file_url); if (file_path) free(file_path); if (error) { list_iterator_destroy(iterator); rc = -1; goto cleanup; } } install: rc = clib_package_install_dependencies(pkg, dir, verbose); cleanup: if (pkg_dir) free(pkg_dir); if (package_json) free(package_json); if (iterator) list_iterator_destroy(iterator); return rc; }