Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Make 'pkg update' able to update from remote repos
Marin Atanasov Nikolov committed 14 years ago
commit 964d9358e5289c25d0850caa09623953506a15c0
parent 1c4494284da6ca9827a70ec3ce69e00e54c80e17
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);
}