From 457943f83e21bde7e6858884d25bc89934344a52 Mon Sep 17 00:00:00 2001 From: Timo Teras Date: Wed, 4 Mar 2009 08:27:06 +0200 Subject: apk: --clean-protected option So you will not get .apk-new files of the new configuration files. --- src/apk.c | 21 +++++++++++---------- src/apk_defines.h | 1 + src/database.c | 22 ++++++++++------------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/apk.c b/src/apk.c index b4b9e9b..79a873a 100644 --- a/src/apk.c +++ b/src/apk.c @@ -24,6 +24,7 @@ const char *apk_root; struct apk_repository_url apk_repository_list; int apk_verbosity = 1, apk_progress = 0, apk_upgrade = 0; +int apk_clean = 0; int apk_cwd_fd; void apk_log(const char *prefix, const char *format, ...) @@ -110,14 +111,15 @@ static struct apk_repository_url *apk_repository_new(const char *url) return r; } -#define NUM_GENERIC_OPTS 6 +#define NUM_GENERIC_OPTS 7 static struct option generic_options[32] = { - { "root", required_argument, NULL, 'p' }, - { "repository", required_argument, NULL, 'X' }, - { "quiet", no_argument, NULL, 'q' }, - { "verbose", no_argument, NULL, 'v' }, - { "version", no_argument, NULL, 'V' }, - { "progress", no_argument, NULL, 0x100 }, + { "root", required_argument, NULL, 'p' }, + { "repository", required_argument, NULL, 'X' }, + { "quiet", no_argument, NULL, 'q' }, + { "verbose", no_argument, NULL, 'v' }, + { "version", no_argument, NULL, 'V' }, + { "progress", no_argument, &apk_progress, 1 }, + { "clean-protected", no_argument, &apk_clean, 1 }, }; int main(int argc, char **argv) @@ -160,6 +162,8 @@ int main(int argc, char **argv) while ((r = getopt_long(argc, argv, short_options, generic_options, &optindex)) != -1) { switch (r) { + case 0: + break; case 'p': apk_root = optarg; break; @@ -177,9 +181,6 @@ int main(int argc, char **argv) case 'V': return version(); break; - case 0x100: - apk_progress = 1; - break; default: if (applet == NULL || applet->parse == NULL) return usage(); diff --git a/src/apk_defines.h b/src/apk_defines.h index efae83f..c27d863 100644 --- a/src/apk_defines.h +++ b/src/apk_defines.h @@ -51,6 +51,7 @@ extern csum_t bad_checksum; #endif extern int apk_cwd_fd, apk_verbosity, apk_progress, apk_upgrade; +extern int apk_clean; #define apk_error(args...) apk_log("ERROR: ", args); #define apk_warning(args...) if (apk_verbosity > 0) { apk_log("WARNING: ", args); } diff --git a/src/database.c b/src/database.c index f6b66c4..108c3ab 100644 --- a/src/database.c +++ b/src/database.c @@ -1066,19 +1066,17 @@ static int apk_db_install_archive_entry(void *_ctx, printf("%s\n", ae->name); if ((diri->dir->flags & APK_DBDIRF_PROTECTED) && - apk_file_get_info(ae->name, &fi) == 0) { + apk_file_get_info(ae->name, &fi) == 0 && + (memcmp(file->csum, fi.csum, sizeof(csum_t)) == 0 || + !csum_valid(file->csum))) { /* Protected file. Extract to separate place */ - snprintf(alt_name, sizeof(alt_name), - "%s/%s.apk-new", - diri->dir->dirname, file->filename); - r = apk_archive_entry_extract(ae, is, alt_name, - extract_cb, ctx); - if (memcmp(ae->csum, fi.csum, sizeof(csum_t)) == 0) { - /* not modified locally. rename to original */ - if (rename(alt_name, ae->name) < 0) - apk_warning("%s: %s", ae->name, - strerror(errno)); - } + if (!apk_clean) { + snprintf(alt_name, sizeof(alt_name), + "%s/%s.apk-new", + diri->dir->dirname, file->filename); + r = apk_archive_entry_extract(ae, is, alt_name, + extract_cb, ctx); + } } else { r = apk_archive_entry_extract(ae, is, NULL, extract_cb, ctx); -- cgit v1.2.3-70-g09d2