Example #1
0
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);
}
Example #2
0
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;
}