diff --git a/NEWS b/NEWS
index 4fce77ca..8836be57 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,8 @@
xbps-0.4 (2010-02-01):
+
+ * xbps-bin(8): enable -f option for the 'purge' and 'remove' targets.
+ If set, files will be removed even if its hash doesn't match for the
+ 'remove' target, and configuration files for the 'purge' target.
* xbps-uhelper: the 'fetch' target now accepts an arbitrary number of
arguments, and sets default libfetch cache connection limits.
diff --git a/bin/xbps-bin/main.c b/bin/xbps-bin/main.c
index b810718e..e9ea75b0 100644
--- a/bin/xbps-bin/main.c
+++ b/bin/xbps-bin/main.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2008-2009 Juan Romero Pardines.
+ * Copyright (c) 2008-2010 Juan Romero Pardines.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -61,8 +61,8 @@ usage(void)
" -V\t\tPrints the xbps release version\n"
" Options used by the install/(auto)remove/update targets:\n"
" -y\t\tAssume \"yes\" for all questions.\n"
- " Options used by the reconfigure target:\n"
- " -f\t\tForce reconfiguration.\n"
+ " Options used by the purge/reconfigure/remove targets:\n"
+ " -f\t\tForce reconfiguration or removal of files.\n"
"\n");
exit(EXIT_FAILURE);
}
diff --git a/bin/xbps-bin/xbps-bin.8.txt b/bin/xbps-bin/xbps-bin.8.txt
index 39cee98e..4ab2b239 100644
--- a/bin/xbps-bin/xbps-bin.8.txt
+++ b/bin/xbps-bin/xbps-bin.8.txt
@@ -31,8 +31,10 @@ OPTIONS
it will become '/blah/cachedir'.
*-f*::
- Used currently in the 'reconfigure' target. If set, package(s) will
- be reconfigured regardless of its state.
+ Used currently in the 'purge', 'reconfigure' and 'remove' targets.
+ If set, package(s) will be reconfigured regardless of its state if working
+ with the 'reconfigure target, or to force removal of package files
+ even if its hash doesn't match in the 'purge' and 'remove' targets.
*-r* 'rootdir'::
Sets the 'root' directory. By default the root directory is
@@ -96,7 +98,8 @@ Please note that all targets are *case insensitive*.
metadata directory ( /var/db/xbps/metadata/'pkgname' ) and will
remove configuration (if they were not modified by the user) and
metadata files. The package will be fully removed from the system once
- it has been *purged*.
+ it has been *purged*. If *-f* option is used, configuration files
+ that have been modified *WILL BE REMOVED, BEWARE WITH THIS!*.
*reconfigure 'pkgname' | 'all'*::
Reconfigure an *unpacked* package. Packages in this state are not
@@ -113,7 +116,8 @@ Please note that all targets are *case insensitive*.
database. Configuration files, its metadata directory/files and
its information in the package database are preserved. To fully remove
a package in *config-files* state, it must be *purged* with the
- *purge* command.
+ *purge* command. If *-f* option is used, package files will be removed
+ even if its SHA256 hash doesn't match.
*show 'pkgname'*::
Shows information for installed package 'pkgname'. This will print
diff --git a/lib/remove.c b/lib/remove.c
index 815d3552..2c2a31cb 100644
--- a/lib/remove.c
+++ b/lib/remove.c
@@ -42,7 +42,8 @@
* -# Its pre-remove target specified in the REMOVE script
* will be executed.
* -# Its files, dirs and links will be removed. Modified files (not
- * matching its sha256 hash) will always be preserved.
+ * matching its sha256 hash) are preserved, unless XBPS_FLAG_FORCE
+ * is set via xbps_set_flags().
* -# Its post-remove target specified in the REMOVE script
* will be executed.
* -# Its requiredby objects will be removed from the installed packages
@@ -123,13 +124,24 @@ xbps_remove_pkg_files(prop_dictionary_t dict, const char *key)
rv = 0;
continue;
} else if (rv == ERANGE) {
- if (flags & XBPS_FLAG_VERBOSE)
- fprintf(stderr,
- "WARNING: '%s' SHA256 mismatch, "
- "preserving...\n", file);
rv = 0;
- free(path);
- continue;
+ if (flags & XBPS_FLAG_VERBOSE) {
+ if (flags & XBPS_FLAG_FORCE) {
+ fprintf(stderr,
+ "WARNING: '%s' SHA256 "
+ "mismatch, forcing "
+ "removal...\n", file);
+ } else {
+ fprintf(stderr,
+ "WARNING: '%s' SHA256 "
+ "mismatch, preserving...\n",
+ file);
+ }
+ }
+ if ((flags & XBPS_FLAG_FORCE) == 0) {
+ free(path);
+ continue;
+ }
} else if (rv != 0 && rv != ERANGE) {
free(path);
break;