Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
clean fix -a and not args with no repositories
Baptiste Daroussin committed 15 days ago
commit 802c30abb81068b3c519f954cd609178d9952287
parent c4e27b6
2 files changed +73 -27
modified src/clean.c
@@ -309,35 +309,41 @@ exec_clean(int argc, char **argv)
		return (errno == ENOENT ? EXIT_SUCCESS : EXIT_FAILURE);
	}

-
	retcode = pkgdb_access(PKGDB_MODE_READ, PKGDB_DB_REPO);
-

-
	if (retcode == EPKG_ENOACCESS) {
-
		warnx("Insufficient privileges to clean old packages");
-
		close(cachefd);
-
		return (EXIT_FAILURE);
-
	} else if (retcode == EPKG_ENODB) {
-
		warnx("No package database installed.  Nothing to do!");
-
		close(cachefd);
-
		return (EXIT_SUCCESS);
-
	} else if (retcode != EPKG_OK) {
-
		warnx("Error accessing the package database");
-
		close(cachefd);
-
		return (EXIT_FAILURE);
+
	/*
+
	 * When no repo catalogue exists, every cached file is obsolete.
+
	 * When cleaning all (-a), the repo catalogue is not needed at all.
+
	 */
+
	if (!all) {
+
		retcode = pkgdb_access(PKGDB_MODE_READ, PKGDB_DB_REPO);
+

+
		if (retcode == EPKG_ENOACCESS) {
+
			warnx("Insufficient privileges to clean old packages");
+
			close(cachefd);
+
			return (EXIT_FAILURE);
+
		} else if (retcode == EPKG_ENODB) {
+
			all = true;
+
		} else if (retcode != EPKG_OK) {
+
			warnx("Error accessing the package database");
+
			close(cachefd);
+
			return (EXIT_FAILURE);
+
		}
	}

	retcode = EXIT_FAILURE;

-
	if (pkgdb_open(&db, PKGDB_REMOTE) != EPKG_OK) {
-
		close(cachefd);
-
		return (EXIT_FAILURE);
-
	}
+
	if (!all) {
+
		if (pkgdb_open(&db, PKGDB_REMOTE) != EPKG_OK) {
+
			close(cachefd);
+
			return (EXIT_FAILURE);
+
		}

-
	if (pkgdb_obtain_lock(db, PKGDB_LOCK_READONLY) != EPKG_OK) {
-
		pkgdb_close(db);
-
		close(cachefd);
-
		warnx("Cannot get a read lock on a database, it is locked by "
-
		    "another process");
-
		return (EXIT_FAILURE);
+
		if (pkgdb_obtain_lock(db, PKGDB_LOCK_READONLY) != EPKG_OK) {
+
			pkgdb_close(db);
+
			close(cachefd);
+
			warnx("Cannot get a read lock on a database, "
+
			    "it is locked by another process");
+
			return (EXIT_FAILURE);
+
		}
	}

#ifdef HAVE_CAPSICUM
@@ -386,8 +392,10 @@ exec_clean(int argc, char **argv)
	}

cleanup:
-
	pkgdb_release_lock(db, PKGDB_LOCK_READONLY);
-
	pkgdb_close(db);
+
	if (db != NULL) {
+
		pkgdb_release_lock(db, PKGDB_LOCK_READONLY);
+
		pkgdb_close(db);
+
	}
	vec_free_and_free(&dl, free);

	if (cachefd != -1)
modified tests/frontend/clean.sh
@@ -3,7 +3,9 @@
. $(atf_get_srcdir)/test_environment.sh

tests_init \
-
	basic
+
	basic \
+
	clean_all_no_repo_db \
+
	clean_no_repo_db

basic_body() {
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1"
@@ -54,3 +56,39 @@ EOF
		pkg -C /dev/null -o PKG_CACHEDIR=${TMPDIR}/cache -o REPOS_DIR="${TMPDIR}/reposconf" clean -n
}

+
clean_all_no_repo_db_body() {
+
	# pkg clean -a should work even without any repo database
+
	mkdir -p reposconf cache
+
	cat > reposconf/repo.conf << EOF
+
testrepo: {
+
    url: "file:///nonexistent",
+
    enabled: true
+
}
+
EOF
+
	echo "fake" > cache/test-1~abc123.pkg
+

+
	atf_check \
+
		-o match:"test-1" \
+
		-e empty \
+
		-s exit:0 \
+
		pkg -o REPOS_DIR="${TMPDIR}/reposconf" -o PKG_CACHEDIR=${TMPDIR}/cache clean -an
+
}
+

+
clean_no_repo_db_body() {
+
	# pkg clean (without -a) should treat all cached files as obsolete
+
	# when no repo database exists, instead of erroring out
+
	mkdir -p reposconf cache
+
	cat > reposconf/repo.conf << EOF
+
testrepo: {
+
    url: "file:///nonexistent",
+
    enabled: true
+
}
+
EOF
+
	echo "fake" > cache/test-1~abc123.pkg
+

+
	atf_check \
+
		-o match:"test-1" \
+
		-e empty \
+
		-s exit:0 \
+
		pkg -o REPOS_DIR="${TMPDIR}/reposconf" -o PKG_CACHEDIR=${TMPDIR}/cache clean -n
+
}