Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
pkg_adddir now avoid checking for duplicates except from ports (like pkg_addfiles)
Baptiste Daroussin committed 13 years ago
commit d48583041fabdc70598a3522efcf9a0eaa680b98
parent 6e75fe2
5 files changed +20 -16
modified libpkg/pkg.c
@@ -689,23 +689,25 @@ pkg_addcategory(struct pkg *pkg, const char *name)
}

int
-
pkg_adddir(struct pkg *pkg, const char *path, bool try)
+
pkg_adddir(struct pkg *pkg, const char *path, bool try, bool check_duplicates)
{
-
	return(pkg_adddir_attr(pkg, path, NULL, NULL, 0, try));
+
	return(pkg_adddir_attr(pkg, path, NULL, NULL, 0, try, check_duplicates));
}

int
-
pkg_adddir_attr(struct pkg *pkg, const char *path, const char *uname, const char *gname, mode_t perm, bool try)
+
pkg_adddir_attr(struct pkg *pkg, const char *path, const char *uname, const char *gname, mode_t perm, bool try, bool check_duplicates)
{
	struct pkg_dir *d = NULL;

	assert(pkg != NULL);
	assert(path != NULL && path[0] != '\0');

-
	while (pkg_dirs(pkg, &d) == EPKG_OK) {
-
		if (strcmp(path, pkg_dir_path(d)) == 0) {
-
			pkg_emit_error("duplicate directory listing: %s, ignoring", path);
-
			return (EPKG_OK);
+
	if (check_duplicates) {
+
		while (pkg_dirs(pkg, &d) == EPKG_OK) {
+
			if (strcmp(path, pkg_dir_path(d)) == 0) {
+
				pkg_emit_error("duplicate directory listing: %s, ignoring", path);
+
				return (EPKG_OK);
+
			}
		}
	}

modified libpkg/pkg.h
@@ -527,7 +527,8 @@ int pkg_addfile_attr(struct pkg *pkg, const char *path, const char *sha256,
 * Add a path
 * @return An error code.
 */
-
int pkg_adddir(struct pkg *pkg, const char *path, bool try);
+
int pkg_adddir(struct pkg *pkg, const char *path, bool try,
+
		    bool check_duplicates);

/**
 * Allocate a new struct pkg_file and add it to the files of pkg;
@@ -538,7 +539,8 @@ int pkg_adddir(struct pkg *pkg, const char *path, bool try);
 * @return An error code.
 */
int pkg_adddir_attr(struct pkg *pkg, const char *path, const char *uname,
-
		    const char *gname, mode_t perm, bool try);
+
		    const char *gname, mode_t perm, bool try,
+
		    bool check_duplicates);

/**
 * Add a category
modified libpkg/pkg_manifest.c
@@ -276,7 +276,7 @@ parse_sequence(struct pkg * pkg, yaml_node_t *node, yaml_document_t *doc,
			break;
		case PKG_DIRS:
			if (is_valid_yaml_scalar(val))
-
				pkg_adddir(pkg, val->data.scalar.value, 1);
+
				pkg_adddir(pkg, val->data.scalar.value, 1, false);
			else if (val->type == YAML_MAPPING_NODE)
				parse_mapping(pkg, val, doc, attr);
			else
@@ -375,9 +375,9 @@ parse_mapping(struct pkg *pkg, yaml_node_t *item, yaml_document_t *doc, int attr
			if (is_valid_yaml_scalar(val)) {
				urldecode(key->data.scalar.value, &tmp);
				if (val->data.scalar.value[0] == 'y')
-
					pkg_adddir(pkg, sbuf_get(tmp), 1);
+
					pkg_adddir(pkg, sbuf_get(tmp), 1, false);
				else
-
					pkg_adddir(pkg, sbuf_get(tmp), 0);
+
					pkg_adddir(pkg, sbuf_get(tmp), 0, false);
			} else if (val->type == YAML_MAPPING_NODE) {
				pkg_set_dirs_from_node(pkg, val, doc,
				    key->data.scalar.value);
@@ -486,7 +486,7 @@ pkg_set_files_from_node(struct pkg *pkg, yaml_node_t *item,

	if (key != NULL)
		pkg_addfile_attr(pkg, key->data.scalar.value, sum, uname, gname,
-
		    perm, true);
+
		    perm, false);

	return (EPKG_OK);
}
@@ -550,7 +550,7 @@ pkg_set_dirs_from_node(struct pkg *pkg, yaml_node_t *item, yaml_document_t *doc,
		++pair;
	}

-
	pkg_adddir_attr(pkg, dirname, uname, gname, perm, try);
+
	pkg_adddir_attr(pkg, dirname, uname, gname, perm, try, false);

	return (EPKG_OK);
}
modified libpkg/pkg_ports.c
@@ -161,7 +161,7 @@ meta_dirrm(struct plist *p, char *line, bool try)

	if (lstat(testpath, &st) == 0)
		return (pkg_adddir_attr(p->pkg, path, p->uname, p->gname,
-
		    p->perm, try));
+
		    p->perm, try, true));

	pkg_emit_errno("lstat", path);
	if (p->stage != NULL)
modified libpkg/pkgdb.c
@@ -1300,7 +1300,7 @@ pkgdb_load_dirs(struct pkgdb *db, struct pkg *pkg)

	while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) {
		pkg_adddir(pkg, sqlite3_column_text(stmt, 0),
-
		    sqlite3_column_int(stmt, 1));
+
		    sqlite3_column_int(stmt, 1), false);
	}

	sqlite3_finalize(stmt);