static void test_find(void) { struct filter_desc_list_t list; struct filter_desc_t desc; const struct filter_desc_t const * desc_new; CU_ASSERT_EQUAL(filterlist_init(&list), 0); CU_ASSERT_EQUAL(filterlist_find(NULL, NULL), NULL); CU_ASSERT_EQUAL(filterlist_find(&list, NULL), NULL); CU_ASSERT_EQUAL(filterlist_find(NULL, ""), NULL); CU_ASSERT_EQUAL(filterlist_find(&list, ""), NULL); memset(&desc, 0, sizeof(desc)); desc.name = "name"; CU_ASSERT_EQUAL(filterlist_init(&list), 0); CU_ASSERT_EQUAL(list.num, 0); CU_ASSERT_EQUAL(filterlist_append(&list, &desc), 0); CU_ASSERT_EQUAL(list.num, 1); CU_ASSERT_EQUAL(filterlist_find(&list, "test"), NULL); desc_new = filterlist_find(&list, "name"); CU_ASSERT_NOT_EQUAL(desc_new, NULL); CU_ASSERT_STRING_EQUAL(desc_new->name, "name"); CU_ASSERT_EQUAL(filterlist_free(&list), 0); CU_ASSERT_EQUAL(list.num, 0); CU_ASSERT_EQUAL(list.data, NULL); }
static upgrade_decision ud_decide_by_rule(void *privdata, const struct target *target, const char *package, const char *sourcename, /*@null@*/const char *old_version, const char *new_version, const char *sourceversion, const char *newcontrolchunk) { struct pull_rule *rule = privdata; upgrade_decision decision = UD_UPGRADE; retvalue r; struct filterlist *fl; const char *n, *v; bool cmdline_still_undecided; if (target->packagetype == pt_dsc) { assert (strcmp(package, sourcename) == 0); assert (strcmp(new_version, sourceversion) == 0); if (rule->filtersrclist.set) fl = &rule->filtersrclist; else fl = &rule->filterlist; n = package; v = new_version; } else { if (rule->filterlist.set) { fl = &rule->filterlist; n = package; v = new_version; } else { fl = &rule->filtersrclist; n = sourcename; v = sourceversion; } } switch (filterlist_find(n, v, fl)) { case flt_deinstall: case flt_purge: return UD_NO; case flt_warning: return UD_LOUDNO; case flt_supersede: decision = UD_SUPERSEDE; break; case flt_hold: decision = UD_HOLD; break; case flt_error: /* cannot yet be handled! */ fprintf(stderr, "Package name marked to be unexpected('error'): '%s'!\n", package); return UD_ERROR; case flt_upgradeonly: if (old_version == NULL) return UD_NO; break; case flt_install: break; case flt_unchanged: case flt_auto_hold: assert (false); break; } cmdline_still_undecided = false; switch (filterlist_find(sourcename, sourceversion, &cmdline_src_filter)) { case flt_deinstall: case flt_purge: return UD_NO; case flt_warning: return UD_LOUDNO; case flt_auto_hold: cmdline_still_undecided = true; decision = UD_HOLD; break; case flt_hold: decision = UD_HOLD; break; case flt_supersede: decision = UD_SUPERSEDE; break; case flt_error: /* cannot yet be handled! */ fprintf(stderr, "Package name marked to be unexpected('error'): '%s'!\n", package); return UD_ERROR; case flt_upgradeonly: if (old_version == NULL) return UD_NO; break; case flt_install: decision = UD_UPGRADE; break; case flt_unchanged: cmdline_still_undecided = true; break; } if (target->packagetype != pt_dsc) { switch (filterlist_find(package, new_version, &cmdline_bin_filter)) { case flt_deinstall: case flt_purge: return UD_NO; case flt_warning: return UD_LOUDNO; case flt_hold: decision = UD_HOLD; break; case flt_supersede: decision = UD_SUPERSEDE; break; case flt_error: /* cannot yet be handled! */ fprintf(stderr, "Package name marked to be unexpected('error'): '%s'!\n", package); return UD_ERROR; case flt_upgradeonly: if (old_version == NULL) return UD_NO; break; case flt_install: decision = UD_UPGRADE; break; case flt_unchanged: break; case flt_auto_hold: /* hold only if it was not in the src-filter */ if (cmdline_still_undecided) decision = UD_HOLD; break; } } else if (cmdline_bin_filter.defaulttype == flt_auto_hold) { if (cmdline_still_undecided) decision = UD_HOLD; } /* formula tested last as it is the most expensive */ if (rule->includecondition != NULL) { r = term_decidechunktarget(rule->includecondition, newcontrolchunk, target); if (RET_WAS_ERROR(r)) return UD_ERROR; if (r == RET_NOTHING) { return UD_NO; } } return decision; }