Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add function to ensure that a package is loaded.
Vsevolod Stakhov committed 11 years ago
commit a9e540c6dbad3d0ec1b96b0af06871427555ba94
parent 1047134
3 files changed +54 -4
modified libpkg/pkgdb_iterator.c
@@ -1010,3 +1010,45 @@ pkgdb_it_repo_attach(struct pkgdb_it *it, struct pkg_repo_it *rit)
		LL_PREPEND(it->un.remote, item);
	}
}
+

+
int
+
pkgdb_ensure_loaded_sqlite(sqlite3 *sqlite, struct pkg *pkg, unsigned flags)
+
{
+
	int i, ret;
+

+
	for (i = 0; load_on_flag[i].load != NULL; i++) {
+
		if (~pkg->flags & flags & load_on_flag[i].flag) {
+
			ret = load_on_flag[i].load(sqlite, pkg);
+
			if (ret != EPKG_OK)
+
				return (ret);
+
		}
+
	}
+

+
	return (EPKG_OK);
+
}
+

+
int
+
pkgdb_ensure_loaded(struct pkgdb *db, struct pkg *pkg, unsigned flags)
+
{
+
	int i, ret;
+
	struct _pkg_repo_list_item *cur;
+

+
	if (pkg->type == PKG_INSTALLED) {
+
		return (pkgdb_ensure_loaded_sqlite(db->sqlite, pkg, flags));
+
	}
+
	else {
+
		/* Call repo functions */
+
		LL_FOREACH(db->repos, cur) {
+
			if (cur->repo == pkg->repo) {
+
				if (cur->repo->ops->ensure_loaded) {
+
					ret = cur->repo->ops->ensure_loaded(cur->repo, pkg, flags);
+
					if (ret != EPKG_OK)
+
						return (EPKG_FATAL);
+
				}
+
			}
+
		}
+
	}
+

+
	/* Not reached */
+
	return (EPKG_FATAL);
+
}
modified libpkg/private/pkg.h
@@ -126,6 +126,9 @@

extern int eventpipe;

+
struct pkg_repo_it;
+
struct pkg_repo;
+

struct pkg {
	ucl_object_t	*fields;
	bool		 direct;
@@ -141,8 +144,9 @@ struct pkg {
	struct pkg_shlib	*shlibs_provided;
	struct pkg_conflict *conflicts;
	struct pkg_provide	*provides;
-
	unsigned       	 flags;
+
	unsigned			flags;
	pkg_t		 type;
+
	struct pkg_repo		*repo;
	UT_hash_handle	 hh;
	struct pkg	*next;
};
@@ -320,9 +324,6 @@ struct pkg_repo_meta {
	time_t eol;
};

-
struct pkg_repo_it;
-
struct pkg_repo;
-

struct pkg_repo_it_ops {
	int (*next)(struct pkg_repo_it *it, struct pkg **pkg_p, unsigned flags);
	void (*free)(struct pkg_repo_it *it);
@@ -358,6 +359,8 @@ struct pkg_repo_ops {
	struct pkg_repo_it * (*search)(struct pkg_repo *, const char *, match_t,
					pkgdb_field field, pkgdb_field sort);

+
	int (*ensure_loaded)(struct pkg_repo *repo, struct pkg *pkg, unsigned flags);
+

	/* Fetch package from repo */
	int (*fetch_pkg)(struct pkg_repo *, struct pkg *);
};
modified libpkg/private/pkgdb.h
@@ -89,6 +89,11 @@ struct pkgdb_it *pkgdb_it_new_sqlite(struct pkgdb *db, sqlite3_stmt *s,
struct pkgdb_it *pkgdb_it_new_repo(struct pkgdb *db);
void pkgdb_it_repo_attach(struct pkgdb_it *it, struct pkg_repo_it *rit);

+
/**
+
 * Load missing flags for a specific package from pkgdb
+
 */
+
int pkgdb_ensure_loaded(struct pkgdb *db, struct pkg *pkg, unsigned flags);
+

void pkgshell_open(const char **r);

/**