Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Be able to fetch all packages from a repo using 'pkg fetch -a'
Marin Atanasov Nikolov committed 14 years ago
commit 4e26e3be6ada9104989208f522776563bc8355dc
parent 44bcaf2
2 files changed +32 -17
modified libpkg/pkgdb.c
@@ -2988,7 +2988,7 @@ pkgdb_query_fetch(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, cons
	const char main_sql[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, "
			"flatsize, pkgsize, cksum, repopath) "
			"SELECT id, origin, name, version, flatsize, pkgsize, "
-
			"cksum, path FROM '%s'.packages WHERE ";
+
			"cksum, path FROM '%s'.packages ";

	const char deps_sql[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, "
				"flatsize, pkgsize, cksum, repopath) "
@@ -3049,26 +3049,37 @@ pkgdb_query_fetch(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, cons

	create_temporary_pkgjobs(db->sqlite);

-
	sbuf_printf(sql, how, "name");
-
	sbuf_cat(sql, " OR ");
-
	sbuf_printf(sql, how, "origin");
-
	sbuf_cat(sql, " OR ");
-
	sbuf_printf(sql, how, "name || \"-\" || version");
-
	sbuf_finish(sql);
-

-
	for (i = 0; i < nbpkgs; i++) {
+
	if (how != NULL) {
+
		sbuf_cat(sql, " WHERE ");
+
		sbuf_printf(sql, how, "name");
+
		sbuf_cat(sql, " OR ");
+
		sbuf_printf(sql, how, "origin");
+
		sbuf_cat(sql, " OR ");
+
		sbuf_printf(sql, how, "name || \"-\" || version");
+
		sbuf_finish(sql);
+
		
+
		for (i = 0; i < nbpkgs; i++) {
+
			if (sqlite3_prepare_v2(db->sqlite, sbuf_get(sql), -1, &stmt, NULL) != SQLITE_OK) {
+
				ERROR_SQLITE(db->sqlite);
+
				return (NULL);
+
			}
+
			sqlite3_bind_text(stmt, 1, pkgs[i], -1, SQLITE_STATIC);
+
			while (sqlite3_step(stmt) != SQLITE_DONE);
+
			
+
			/* report if package was not found in the database */
+
			if (sqlite3_changes(db->sqlite) == 0)
+
				pkg_emit_error("Package '%s' was not found in the repositories", pkgs[i]);
+
		}
+
	} else {
+
		sbuf_finish(sql);
		if (sqlite3_prepare_v2(db->sqlite, sbuf_get(sql), -1, &stmt, NULL) != SQLITE_OK) {
			ERROR_SQLITE(db->sqlite);
			return (NULL);
		}
		sqlite3_bind_text(stmt, 1, pkgs[i], -1, SQLITE_STATIC);
		while (sqlite3_step(stmt) != SQLITE_DONE);
-

-
		/* report if package was not found in the database */
-
		if (sqlite3_changes(db->sqlite) == 0)
-
			pkg_emit_error("Package '%s' was not found in the repositories", pkgs[i]);
	}
-

+
	
	sqlite3_finalize(stmt);
	sbuf_clear(sql);

modified pkg/fetch.c
@@ -42,7 +42,7 @@
void
usage_fetch(void)
{
-
	fprintf(stderr, "usage: pkg fetch [-r reponame] [-yqgxX] <pkg-name> <...>\n\n");
+
	fprintf(stderr, "usage: pkg fetch [-r reponame] [-yqgxXa] <pkg-name> <...>\n\n");
	fprintf(stderr, "For more information see 'pkg help fetch'.\n");
}

@@ -59,11 +59,14 @@ exec_fetch(int argc, char **argv)
	bool yes = false;
	match_t match = MATCH_EXACT;

-
	while ((ch = getopt(argc, argv, "ygxXr:q")) != -1) {
+
	while ((ch = getopt(argc, argv, "ygxXr:qa")) != -1) {
		switch (ch) {
		case 'y':
			yes = true;
			break;
+
		case 'a':
+
			match = MATCH_ALL;
+
			break;
		case 'g':
			match = MATCH_GLOB;
			break;
@@ -87,11 +90,12 @@ exec_fetch(int argc, char **argv)
	argc -= optind;
	argv += optind;
	
-
	if (argc < 1) {
+
	if (argc < 1 && match != MATCH_ALL) {
		usage_fetch();
		return (EX_USAGE);
	}

+
	/* TODO: Allow the user to specify an output directory via -o outdir */
	if (geteuid() != 0) {
		warnx("fetching packages can only be done as root");
		return (EX_NOPERM);