Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
pkg install and pkg upgrade do update the remote repositories automatically if needed
Baptiste Daroussin committed 13 years ago
commit 4554d5d6cabe5d44bbe1a14d43f77f442bb9a3c2
parent 496324a
2 files changed +94 -0
modified pkg/install.c
@@ -27,6 +27,7 @@
 */

#include <sys/types.h>
+
#include <sys/param.h>

#include <err.h>
#include <libgen.h>
@@ -51,14 +52,19 @@ usage_install(void)
int
exec_install(int argc, char **argv)
{
+
	char url[MAXPATHLEN];
	struct pkg *pkg = NULL;
	struct pkgdb_it *it = NULL;
	struct pkgdb *db = NULL;
	struct pkg_jobs *jobs = NULL;
	const char *reponame = NULL;
+
	const char *repo_name = NULL;
+
	const char *packagesite = NULL;
+
	struct pkg_config_kv *repokv = NULL;
	int retcode = 1;
	int ch;
	bool yes = false;
+
	bool multi_repos = false;

	match_t match = MATCH_EXACT;
	bool force = false;
@@ -104,6 +110,46 @@ exec_install(int argc, char **argv)
		return (EX_NOPERM);
	}

+
	/* first update the remote repositories if needed */
+
	pkg_config_bool(PKG_CONFIG_MULTIREPOS, &multi_repos);
+
	if (!multi_repos) {
+
		/*
+
		 * Single remote database
+
		 */
+
		pkg_config_string(PKG_CONFIG_REPO, &packagesite);
+
		if (packagesite == NULL) {
+
			warnx("PACKAGESITE is not defined.");
+
			return (1);
+
		}
+

+
		if (packagesite[strlen(packagesite) - 1] == '/')
+
			snprintf(url, MAXPATHLEN, "%srepo.txz", packagesite);
+
		else
+
			snprintf(url, MAXPATHLEN, "%s/repo.txz", packagesite);
+

+
		retcode = pkg_update("repo", url);
+
		if (retcode == EPKG_UPTODATE)
+
			retcode = EPKG_OK;
+
	} else {
+
		/* multiple repositories */
+
		while (pkg_config_list(PKG_CONFIG_REPOS, &repokv) == EPKG_OK) {
+
			repo_name = pkg_config_kv_get(repokv, PKG_CONFIG_KV_KEY);
+
			packagesite = pkg_config_kv_get(repokv, PKG_CONFIG_KV_VALUE);
+

+
			if (packagesite[strlen(packagesite) - 1] == '/')
+
				snprintf(url, MAXPATHLEN, "%srepo.txz", packagesite);
+
			else
+
				snprintf(url, MAXPATHLEN, "%s/repo.txz", packagesite);
+

+
			retcode = pkg_update(repo_name, url);
+
			if (retcode == EPKG_UPTODATE) {
+
				retcode = EPKG_OK;
+
			}
+
		}
+
	}
+
	if (retcode != EPKG_OK)
+
		return (retcode);
+

	if (pkgdb_open(&db, PKGDB_REMOTE) != EPKG_OK) {
		return (EX_IOERR);
	}
modified pkg/upgrade.c
@@ -24,8 +24,11 @@
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

+
#include <sys/param.h>
+

#include <err.h>
#include <stdio.h>
+
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
#include <libutil.h>
@@ -44,15 +47,20 @@ usage_upgrade(void)
int
exec_upgrade(int argc, char **argv)
{
+
	char url[MAXPATHLEN];
	struct pkgdb *db = NULL;
	struct pkgdb_it *it = NULL;
	struct pkg *pkg = NULL;
	struct pkg_jobs *jobs = NULL;
	const char *reponame = NULL;
+
	const char *repo_name = NULL;
+
	const char *packagesite = NULL;
+
	struct pkg_config_kv *repokv = NULL;
	int retcode = 1;
	int ch;
	bool yes = false;
	bool all = false;
+
	bool multi_repos = false;

	if (geteuid() != 0) {
		warnx("upgrading can only be done as root");
@@ -87,6 +95,46 @@ exec_upgrade(int argc, char **argv)
		return (EX_USAGE);
	}

+
	/* first update the remote repositories if needed */
+
	pkg_config_bool(PKG_CONFIG_MULTIREPOS, &multi_repos);
+
	if (!multi_repos) {
+
		/*
+
		 * Single remote database
+
		 */
+
		pkg_config_string(PKG_CONFIG_REPO, &packagesite);
+
		if (packagesite == NULL) {
+
			warnx("PACKAGESITE is not defined.");
+
			return (1);
+
		}
+

+
		if (packagesite[strlen(packagesite) - 1] == '/')
+
			snprintf(url, MAXPATHLEN, "%srepo.txz", packagesite);
+
		else
+
			snprintf(url, MAXPATHLEN, "%s/repo.txz", packagesite);
+

+
		retcode = pkg_update("repo", url);
+
		if (retcode == EPKG_UPTODATE)
+
			retcode = EPKG_OK;
+
	} else {
+
		/* multiple repositories */
+
		while (pkg_config_list(PKG_CONFIG_REPOS, &repokv) == EPKG_OK) {
+
			repo_name = pkg_config_kv_get(repokv, PKG_CONFIG_KV_KEY);
+
			packagesite = pkg_config_kv_get(repokv, PKG_CONFIG_KV_VALUE);
+

+
			if (packagesite[strlen(packagesite) - 1] == '/')
+
				snprintf(url, MAXPATHLEN, "%srepo.txz", packagesite);
+
			else
+
				snprintf(url, MAXPATHLEN, "%s/repo.txz", packagesite);
+

+
			retcode = pkg_update(repo_name, url);
+
			if (retcode == EPKG_UPTODATE) {
+
				retcode = EPKG_OK;
+
			}
+
		}
+
	}
+
	if (retcode != EPKG_OK)
+
		return (retcode);
+

	if (pkgdb_open(&db, PKGDB_REMOTE) != EPKG_OK) {
		return (EX_IOERR);
	}