Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Make 'pkg update' able to update from remote repos
Marin Atanasov Nikolov committed 14 years ago
commit 964d9358e5289c25d0850caa09623953506a15c0
parent 1c44942
4 files changed +53 -19
modified libpkg/pkg.h
@@ -3,6 +3,7 @@

#include <stdarg.h>
#include <sys/types.h>
+
#include <sys/queue.h>
#include <openssl/pem.h>

struct pkg;
@@ -702,6 +703,12 @@ struct pkg_event {
	};
};

+
struct pkg_remote_repo {
+
	char *name;
+
	char *url;
+
	STAILQ_ENTRY(pkg_remote_repo) entries;
+
};
+

/**
 * Event callback mechanism.  Events will be reported using this callback,
 * providing an event identifier and up to two event-specific pointers.
modified libpkg/pkg_private.h
@@ -92,12 +92,6 @@ struct pkg_jobs_node {
	LIST_ENTRY(pkg_jobs_node) entries;
};

-
struct pkg_remote_repo {
-
	char *name;
-
	char *url;
-
	STAILQ_ENTRY(pkg_remote_repo) entries;
-
};
-

int pkg_open2(struct pkg **p, struct archive **a, struct archive_entry **ae, const char *path);
void pkg_freedeps(struct pkg *pkg);
void pkg_freerdeps(struct pkg *pkg);
modified pkg/event.c
@@ -20,7 +20,7 @@ event_callback(void *data __unused, struct pkg_event *ev)
		break;
	case PKG_EVENT_FETCHING:
		percent = ((float)ev->e_fetching.done / (float)ev->e_fetching.total) * 100;
-
		printf("\rFetching %s... %d%%", ev->e_fetching.url, percent);
+
		printf("\rFetching from %s... %d%%", ev->e_fetching.url, percent);
		if (ev->e_fetching.done == ev->e_fetching.total)
			printf("\n");
		fflush(stdout);
modified pkg/update.c
@@ -21,6 +21,8 @@
		ARCHIVE_EXTRACT_TIME  |ARCHIVE_EXTRACT_ACL | \
		ARCHIVE_EXTRACT_FFLAGS|ARCHIVE_EXTRACT_XATTR)

+
static int update_from_remote_repo(const char *name, const char *url);
+

void
usage_update(void)
{
@@ -31,12 +33,10 @@ usage_update(void)
int
exec_update(int argc, char **argv)
{
+
	struct pkg_remote_repo *repo;
	char url[MAXPATHLEN];
	const char *packagesite = NULL;
-
	char *tmp = NULL;
	int retcode = EPKG_OK;
-
	struct archive *a;
-
	struct archive_entry *ae;

	(void)argv;
	if (argc != 1) {
@@ -49,15 +49,46 @@ exec_update(int argc, char **argv)
		return (EX_NOPERM);
	}

-
	if ((packagesite = pkg_config("PACKAGESITE")) == NULL) {
-
		warnx("unable to determine PACKAGESITE");
-
		return (EPKG_FATAL);
+
	/* 
+
	 * If PACKAGESITE is defined fetch only the remote
+
	 * database to which PACKAGESITE refers, otherwise
+
	 * fetch all remote databases found in the configuration 
+
	 * file.
+
	 */
+
	if ((packagesite = pkg_config("PACKAGESITE")) != NULL) {
+
		if (packagesite[strlen(packagesite) - 1] == '/')
+
			snprintf(url, MAXPATHLEN, "%srepo.txz", packagesite);
+
		else
+
			snprintf(url, MAXPATHLEN, "%s/repo.txz", packagesite);
+

+
		retcode = update_from_remote_repo("repo", url);
+
	} else {
+
		pkg_remote_repo_init();
+
		pkg_remote_repo_load();
+

+
		while ((repo = pkg_remote_repo_next()) != NULL) {
+
			if (repo->url[strlen(repo->url) - 1] == '/')
+
				snprintf(url, MAXPATHLEN, "%srepo.txz", repo->url);
+
			else
+
				snprintf(url, MAXPATHLEN, "%s/repo.txz", repo->url);
+

+
			retcode = update_from_remote_repo(repo->name, url);
+
		}
+

+
		pkg_remote_repo_free();
	}

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

+
int
+
update_from_remote_repo(const char *name, const char *url)
+
{
+
	struct archive *a;
+
	struct archive_entry *ae;
+
	char repofile[MAXPATHLEN];
+
	char *tmp = NULL;
+
	int retcode = EPKG_OK;

	tmp = mktemp(strdup("/tmp/repo.txz.XXXXXX"));

@@ -74,7 +105,9 @@ exec_update(int argc, char **argv)

	while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
		if (strcmp(archive_entry_pathname(ae), "repo.sqlite") == 0) {
-
			archive_entry_set_pathname(ae, "/var/db/pkg/repo.sqlite");
+
			snprintf(repofile, MAXPATHLEN, "%s/%s.sqlite",
+
				       pkg_config("PKG_DBDIR"), name);
+
			archive_entry_set_pathname(ae, repofile);
			archive_read_extract(a, ae, EXTRACT_ARCHIVE_FLAGS);
			break;
		}
@@ -85,5 +118,5 @@ exec_update(int argc, char **argv)
	unlink(tmp);
	free(tmp);

-
	return (retcode);
+
	return(retcode);
}