/* Returns a list of outdated AUR packages among targets or all AUR packages. * The list and the packages are to be freed by the caller. * * @param curl curl easy handle * @param targets list of strings (package names) that are _definitely_ AUR packages */ static alpm_list_t *get_outdated_pkgs(CURL *curl, struct pw_hashdb *hashdb, alpm_list_t *targets) { alpm_list_t *i; alpm_list_t *outdated_pkgs = NULL; alpm_list_t *pkglist, *targs; struct pkgpair pkgpair; struct pkgpair *pkgpair_ptr; struct aurpkg_t *aurpkg; const char *pkgname, *pkgver; if (targets) { targs = targets; } else { targs = NULL; alpm_list_t *tmp_targs = hash_to_list(hashdb->aur); for (i = tmp_targs; i; i = i->next) { pkgpair_ptr = i->data; targs = alpm_list_add(targs, (void *) pkgpair_ptr->pkgname); } alpm_list_free(tmp_targs); } for (i = targs; i; i = i->next) { pkglist = query_aur(curl, i->data, AUR_QUERY_INFO); if (!pkglist) { continue; } pkgpair.pkgname = i->data; pkgpair_ptr = hash_search(hashdb->aur, &pkgpair); if (!pkgpair_ptr) { /* Shouldn't happen */ pw_fprintf(PW_LOG_ERROR, stderr, "Unable to find AUR package \"%s\"" "in hashdb!\n", i->data); } aurpkg = pkglist->data; pkgver = alpm_pkg_get_version(pkgpair_ptr->pkg); pkgname = i->data; if (alpm_pkg_vercmp(aurpkg->version, pkgver) > 0) { /* Just show outdated package for now */ pw_printf(PW_LOG_INFO, "%s %s is outdated, %s%s%s%s is available\n", pkgname, pkgver, color.bred, aurpkg->version, color.nocolor, color.bold); /* Add to upgrade list */ outdated_pkgs = alpm_list_add(outdated_pkgs, aurpkg); pkglist->data = NULL; } else if (config->verbose) { pw_printf(PW_LOG_INFO, "%s %s is up to date.\n", pkgname, pkgver); } alpm_list_free_inner(pkglist, (alpm_list_fn_free) aurpkg_free); alpm_list_free(pkglist); } if (!targets) { alpm_list_free(targs); } return outdated_pkgs; }
void log_ref_display(struct vty *vty, uint32_t code, bool json) { struct log_ref *ref; struct json_object *top = NULL, *obj = NULL; struct list *errlist; struct listnode *ln; if (json) top = json_object_new_object(); pthread_mutex_lock(&refs_mtx); { errlist = code ? list_new() : hash_to_list(refs); } pthread_mutex_unlock(&refs_mtx); if (code) { ref = log_ref_get(code); if (!ref) { vty_out(vty, "Code %"PRIu32" - Unknown\n", code); return; } listnode_add(errlist, ref); } for (ALL_LIST_ELEMENTS_RO(errlist, ln, ref)) { if (json) { char key[11]; snprintf(key, sizeof(key), "%"PRIu32, ref->code); obj = json_object_new_object(); json_object_string_add(obj, "title", ref->title); json_object_string_add(obj, "description", ref->description); json_object_string_add(obj, "suggestion", ref->suggestion); json_object_object_add(top, key, obj); } else { char pbuf[256]; char ubuf[256]; snprintf(pbuf, sizeof(pbuf), "\nError %"PRIu32" - %s", ref->code, ref->title); memset(ubuf, '=', strlen(pbuf)); ubuf[strlen(pbuf)] = '\0'; vty_out(vty, "%s\n%s\n", pbuf, ubuf); vty_out(vty, "Description:\n%s\n\n", ref->description); vty_out(vty, "Recommendation:\n%s\n", ref->suggestion); } } if (json) { const char *str = json_object_to_json_string_ext( top, JSON_C_TO_STRING_PRETTY); vty_out(vty, "%s\n", str); json_object_free(top); } list_delete(&errlist); }