Compare commits
1 commit
master
...
morganamil
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a61c500557 |
6 changed files with 76 additions and 6 deletions
|
@ -364,6 +364,9 @@ Query Options (apply to '-Q')[[QO]]
|
||||||
replacements are not checked here. This option works best if the sync
|
replacements are not checked here. This option works best if the sync
|
||||||
database is refreshed using '-Sy'.
|
database is refreshed using '-Sy'.
|
||||||
|
|
||||||
|
*-w, \--backup*::
|
||||||
|
List all modified backup files owened by a given package. Multiple packages can
|
||||||
|
be specified on the command line. Pass twice to print all backup files.
|
||||||
|
|
||||||
Remove Options (apply to '-R')[[RO]]
|
Remove Options (apply to '-R')[[RO]]
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
|
|
@ -83,6 +83,7 @@ typedef struct __config_t {
|
||||||
unsigned short op_q_upgrade;
|
unsigned short op_q_upgrade;
|
||||||
unsigned short op_q_check;
|
unsigned short op_q_check;
|
||||||
unsigned short op_q_locality;
|
unsigned short op_q_locality;
|
||||||
|
unsigned short op_q_backup;
|
||||||
|
|
||||||
unsigned short op_s_clean;
|
unsigned short op_s_clean;
|
||||||
unsigned short op_s_downloadonly;
|
unsigned short op_s_downloadonly;
|
||||||
|
@ -180,6 +181,7 @@ enum {
|
||||||
OP_DBPATH,
|
OP_DBPATH,
|
||||||
OP_CASCADE,
|
OP_CASCADE,
|
||||||
OP_CHANGELOG,
|
OP_CHANGELOG,
|
||||||
|
OP_BACKUP,
|
||||||
OP_CLEAN,
|
OP_CLEAN,
|
||||||
OP_NODEPS,
|
OP_NODEPS,
|
||||||
OP_DEPS,
|
OP_DEPS,
|
||||||
|
|
|
@ -348,7 +348,7 @@ void dump_pkg_full(alpm_pkg_t *pkg, int extra)
|
||||||
|
|
||||||
/* Print additional package info if info flag passed more than once */
|
/* Print additional package info if info flag passed more than once */
|
||||||
if(from == ALPM_PKG_FROM_LOCALDB && extra) {
|
if(from == ALPM_PKG_FROM_LOCALDB && extra) {
|
||||||
dump_pkg_backups(pkg);
|
dump_backup_status(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* final newline to separate packages */
|
/* final newline to separate packages */
|
||||||
|
@ -359,6 +359,34 @@ void dump_pkg_full(alpm_pkg_t *pkg, int extra)
|
||||||
alpm_list_free(validation);
|
alpm_list_free(validation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_backup_file_changed(const char *root,
|
||||||
|
const alpm_backup_t *backup)
|
||||||
|
{
|
||||||
|
char path[PATH_MAX];
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
snprintf(path, PATH_MAX, "%s%s", root, backup->name);
|
||||||
|
|
||||||
|
/* if we find the file, calculate checksums, otherwise it is missing */
|
||||||
|
if(access(path, R_OK) == 0) {
|
||||||
|
char *md5sum = alpm_compute_md5sum(path);
|
||||||
|
|
||||||
|
if(md5sum == NULL) {
|
||||||
|
pm_printf(ALPM_LOG_ERROR,
|
||||||
|
_("could not calculate checksums for %s\n"), path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if checksums don't match, file has been modified */
|
||||||
|
ret = strcmp(md5sum, backup->hash) != 0;
|
||||||
|
free(md5sum);
|
||||||
|
} else if(errno != ENOENT) {
|
||||||
|
pm_printf(ALPM_LOG_ERROR,
|
||||||
|
_("could not read %s: %s\n"), path, strerror(errno));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static const char *get_backup_file_status(const char *root,
|
static const char *get_backup_file_status(const char *root,
|
||||||
const alpm_backup_t *backup)
|
const alpm_backup_t *backup)
|
||||||
{
|
{
|
||||||
|
@ -401,7 +429,7 @@ static const char *get_backup_file_status(const char *root,
|
||||||
|
|
||||||
/* Display list of backup files and their modification states
|
/* Display list of backup files and their modification states
|
||||||
*/
|
*/
|
||||||
void dump_pkg_backups(alpm_pkg_t *pkg)
|
void dump_backup_status(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
alpm_list_t *i;
|
alpm_list_t *i;
|
||||||
const char *root = alpm_option_get_root(config->handle);
|
const char *root = alpm_option_get_root(config->handle);
|
||||||
|
@ -450,6 +478,32 @@ void dump_pkg_files(alpm_pkg_t *pkg, int quiet)
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dump_pkg_backups(alpm_pkg_t *pkg, int quiet, int all)
|
||||||
|
{
|
||||||
|
const char *pkgname, *root;
|
||||||
|
alpm_list_t *backups;
|
||||||
|
alpm_list_t *i;
|
||||||
|
|
||||||
|
pkgname = alpm_pkg_get_name(pkg);
|
||||||
|
backups = alpm_pkg_get_backup(pkg);
|
||||||
|
root = alpm_option_get_root(config->handle);
|
||||||
|
|
||||||
|
for(i = backups; i; i = i->next) {
|
||||||
|
alpm_backup_t *backup = i->data;
|
||||||
|
|
||||||
|
if(!all && backup->hash && !get_backup_file_changed(root, backup)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!quiet) {
|
||||||
|
printf("%s%s%s ", config->colstr.title, pkgname, config->colstr.nocolor);
|
||||||
|
}
|
||||||
|
printf("%s%s\n", root, backup->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
/* Display the changelog of a package
|
/* Display the changelog of a package
|
||||||
*/
|
*/
|
||||||
void dump_pkg_changelog(alpm_pkg_t *pkg)
|
void dump_pkg_changelog(alpm_pkg_t *pkg)
|
||||||
|
|
|
@ -24,7 +24,8 @@
|
||||||
|
|
||||||
void dump_pkg_full(alpm_pkg_t *pkg, int extra);
|
void dump_pkg_full(alpm_pkg_t *pkg, int extra);
|
||||||
|
|
||||||
void dump_pkg_backups(alpm_pkg_t *pkg);
|
void dump_backup_status(alpm_pkg_t *pkg);
|
||||||
|
void dump_pkg_backups(alpm_pkg_t *pkg, int quiet, int all);
|
||||||
void dump_pkg_files(alpm_pkg_t *pkg, int quiet);
|
void dump_pkg_files(alpm_pkg_t *pkg, int quiet);
|
||||||
void dump_pkg_changelog(alpm_pkg_t *pkg);
|
void dump_pkg_changelog(alpm_pkg_t *pkg);
|
||||||
|
|
||||||
|
|
|
@ -150,6 +150,7 @@ static void usage(int op, const char * const myname)
|
||||||
addlist(_(" -t, --unrequired list packages not (optionally) required by any\n"
|
addlist(_(" -t, --unrequired list packages not (optionally) required by any\n"
|
||||||
" package (-tt to ignore optdepends) [filter]\n"));
|
" package (-tt to ignore optdepends) [filter]\n"));
|
||||||
addlist(_(" -u, --upgrades list outdated packages [filter]\n"));
|
addlist(_(" -u, --upgrades list outdated packages [filter]\n"));
|
||||||
|
addlist(_(" -w, --backup list modified backup files of a package (-xx for all backup files)\n"));
|
||||||
} else if(op == PM_OP_SYNC) {
|
} else if(op == PM_OP_SYNC) {
|
||||||
printf("%s: %s {-S --sync} [%s] [%s]\n", str_usg, myname, str_opt, str_pkg);
|
printf("%s: %s {-S --sync} [%s] [%s]\n", str_usg, myname, str_opt, str_pkg);
|
||||||
printf("%s:\n", str_opt);
|
printf("%s:\n", str_opt);
|
||||||
|
@ -516,6 +517,10 @@ static int parsearg_query(int opt)
|
||||||
case 'c':
|
case 'c':
|
||||||
config->op_q_changelog = 1;
|
config->op_q_changelog = 1;
|
||||||
break;
|
break;
|
||||||
|
case OP_BACKUP:
|
||||||
|
case 'w':
|
||||||
|
(config->op_q_backup)++;
|
||||||
|
break;
|
||||||
case OP_DEPS:
|
case OP_DEPS:
|
||||||
case 'd':
|
case 'd':
|
||||||
config->op_q_deps = 1;
|
config->op_q_deps = 1;
|
||||||
|
@ -583,6 +588,7 @@ static void checkargs_query_display_opts(const char *opname) {
|
||||||
invalid_opt(config->op_q_check, opname, "--check");
|
invalid_opt(config->op_q_check, opname, "--check");
|
||||||
invalid_opt(config->op_q_info, opname, "--info");
|
invalid_opt(config->op_q_info, opname, "--info");
|
||||||
invalid_opt(config->op_q_list, opname, "--list");
|
invalid_opt(config->op_q_list, opname, "--list");
|
||||||
|
invalid_opt(config->op_q_backup, opname, "--backup");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void checkargs_query_filter_opts(const char *opname) {
|
static void checkargs_query_filter_opts(const char *opname) {
|
||||||
|
@ -896,6 +902,7 @@ static int parseargs(int argc, char *argv[])
|
||||||
{"dbpath", required_argument, 0, OP_DBPATH},
|
{"dbpath", required_argument, 0, OP_DBPATH},
|
||||||
{"cascade", no_argument, 0, OP_CASCADE},
|
{"cascade", no_argument, 0, OP_CASCADE},
|
||||||
{"changelog", no_argument, 0, OP_CHANGELOG},
|
{"changelog", no_argument, 0, OP_CHANGELOG},
|
||||||
|
{"backup", no_argument, 0, OP_BACKUP},
|
||||||
{"clean", no_argument, 0, OP_CLEAN},
|
{"clean", no_argument, 0, OP_CLEAN},
|
||||||
{"nodeps", no_argument, 0, OP_NODEPS},
|
{"nodeps", no_argument, 0, OP_NODEPS},
|
||||||
{"deps", no_argument, 0, OP_DEPS},
|
{"deps", no_argument, 0, OP_DEPS},
|
||||||
|
|
|
@ -315,6 +315,9 @@ static int display(alpm_pkg_t *pkg)
|
||||||
if(config->op_q_list) {
|
if(config->op_q_list) {
|
||||||
dump_pkg_files(pkg, config->quiet);
|
dump_pkg_files(pkg, config->quiet);
|
||||||
}
|
}
|
||||||
|
if(config->op_q_backup) {
|
||||||
|
dump_pkg_backups(pkg, config->quiet, config->op_q_backup != 1);
|
||||||
|
}
|
||||||
if(config->op_q_changelog) {
|
if(config->op_q_changelog) {
|
||||||
dump_pkg_changelog(pkg);
|
dump_pkg_changelog(pkg);
|
||||||
}
|
}
|
||||||
|
@ -325,8 +328,8 @@ static int display(alpm_pkg_t *pkg)
|
||||||
ret = check_pkg_full(pkg);
|
ret = check_pkg_full(pkg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!config->op_q_info && !config->op_q_list
|
if(!config->op_q_info && !config->op_q_list && !config->op_q_changelog
|
||||||
&& !config->op_q_changelog && !config->op_q_check) {
|
&& !config->op_q_check && !config->op_q_backup) {
|
||||||
if(!config->quiet) {
|
if(!config->quiet) {
|
||||||
const colstr_t *colstr = &config->colstr;
|
const colstr_t *colstr = &config->colstr;
|
||||||
printf("%s%s %s%s%s", colstr->title, alpm_pkg_get_name(pkg),
|
printf("%s%s %s%s%s", colstr->title, alpm_pkg_get_name(pkg),
|
||||||
|
@ -431,7 +434,7 @@ int pacman_query(alpm_list_t *targets)
|
||||||
db_local = alpm_get_localdb(config->handle);
|
db_local = alpm_get_localdb(config->handle);
|
||||||
|
|
||||||
/* operations on all packages in the local DB
|
/* operations on all packages in the local DB
|
||||||
* valid: no-op (plain -Q), list, info, check
|
* valid: no-op (plain -Q), list, info, check, backup
|
||||||
* invalid: isfile, owns */
|
* invalid: isfile, owns */
|
||||||
if(targets == NULL) {
|
if(targets == NULL) {
|
||||||
if(config->op_q_isfile || config->op_q_owns) {
|
if(config->op_q_isfile || config->op_q_owns) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue