Commit 457943f8 authored by Timo Teräs's avatar Timo Teräs

apk: --clean-protected option

So you will not get .apk-new files of the new configuration files.
parent b75ae58b
......@@ -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();
......
......@@ -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); }
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment