On Sat, 12 Dec 2009, Dimitrios Apostolou wrote:
P.S. Is there some option --pretend I might have missed? What I need is to get exactly the same actions of "pacman -S blah" or "pacman -Su" until the Y/N prompt, as non-root user.

Regarding this issue, it's the first I tried to fix since I didn't want to run my random changes as root. Fortunately I accidentaly found about -p option (--print-uris) which does exactly what I need, so I quickly hacked a -P (--pretend) version for sync operations, which runs as user and only outputs package list and sizes.

I /think/ that this functionality is required by packagekit, so that it can automatically notify the user when updates become available. I remember on fedora something similar is "yum check-update".

Ofcourse it would be much nicer if it worked for all operations, not only sync. For example in a recursive remove it could notify the user of all packages that would be removed, the size to be freed etc without needing root or locking the db. But I'll skip that part, since my focus is elsewhere.


What do you think?
Dimitris
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index c97e5d7..26a4e37 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -60,6 +60,7 @@ typedef struct __config_t {
        unsigned short op_s_search;
        unsigned short op_s_upgrade;
        unsigned short op_s_printuris;
+       unsigned short op_s_pretend;
 
        unsigned short group;
        pmtransflag_t flags;
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index ff6ef5c..02c93d0 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -130,6 +130,7 @@ static void usage(int op, const char * const myname)
                        printf(_("  -i, --info           view package 
information\n"));
                        printf(_("  -l, --list <repo>    view a list of 
packages in a repo\n"));
                        printf(_("  -p, --print-uris     print out URIs for 
given packages and their dependencies\n"));
+                       printf(_("  -P, --pretend        just print what it 
/would/ do\n"));
                        printf(_("  -s, --search <regex> search remote 
repositories for matching strings\n"));
                        printf(_("  -u, --sysupgrade     upgrade installed 
packages (-uu allows downgrade)\n"));
                        printf(_("  -w, --downloadonly   download packages but 
do not install/upgrade anything\n"));
@@ -370,6 +371,7 @@ static int parseargs(int argc, char *argv[])
                {"owns",       no_argument,       0, 'o'},
                {"file",       no_argument,       0, 'p'},
                {"print-uris", no_argument,       0, 'p'},
+               {"pretend",    no_argument,       0, 'P'},
                {"quiet",      no_argument,       0, 'q'},
                {"root",       required_argument, 0, 'r'},
                {"recursive",  no_argument,       0, 's'},
@@ -398,7 +400,7 @@ static int parseargs(int argc, char *argv[])
                {0, 0, 0, 0}
        };
 
-       while((opt = getopt_long(argc, argv, "RUQSTr:b:vkhscVfmnoldepqituwygz", 
opts, &option_index))) {
+       while((opt = getopt_long(argc, argv, 
"RUQSTr:b:vkhscVfmnoldepPqituwygz", opts, &option_index))) {
                alpm_list_t *list = NULL, *item = NULL; /* lists for splitting 
strings */
 
                if(opt < 0) {
@@ -512,6 +514,10 @@ static int parseargs(int argc, char *argv[])
                                config->flags |= PM_TRANS_FLAG_NOCONFLICTS;
                                config->flags |= PM_TRANS_FLAG_NOLOCK;
                                break;
+                       case 'P':
+                               config->op_s_pretend = 1;
+                               config->flags |= PM_TRANS_FLAG_NOCONFLICTS;
+                               config->flags |= PM_TRANS_FLAG_NOLOCK;
                        case 'q':
                                config->quiet = 1;
                                break;
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index a2ef616..d32d30d 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -690,6 +690,9 @@ static int sync_trans(alpm_list_t *targets)
 
        display_targets(alpm_trans_get_remove(), 0);
        display_targets(alpm_trans_get_add(), 1);
+       if(config->op_s_pretend) {
+               goto cleanup;
+       }
        printf("\n");
 
        int confirm;
@@ -757,8 +760,8 @@ int pacman_sync(alpm_list_t *targets)
 {
        alpm_list_t *sync_dbs = NULL;
 
-       /* Display only errors with -Sp and -Sw operations */
-       if((config->flags & PM_TRANS_FLAG_DOWNLOADONLY) || 
config->op_s_printuris) {
+       /* Display only errors with -SP, -Sp and -Sw operations */
+       if((config->flags & PM_TRANS_FLAG_DOWNLOADONLY) || 
config->op_s_printuris || config->op_s_pretend) {
                config->logmask &= ~PM_LOG_WARNING;
        }
 
@@ -831,7 +834,7 @@ int pacman_sync(alpm_list_t *targets)
        }
 
        alpm_list_t *targs = alpm_list_strdup(targets);
-       if(!(config->flags & PM_TRANS_FLAG_DOWNLOADONLY) && 
!config->op_s_printuris) {
+       if(!(config->flags & PM_TRANS_FLAG_DOWNLOADONLY) && 
!config->op_s_printuris && !config->op_s_pretend) {
                /* check for newer versions of packages to be upgraded first */
                alpm_list_t *packages = syncfirst();
                if(packages) {
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 115b367..1bd8be9 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -75,7 +75,8 @@ int needs_root(void)
        if(config->op == PM_OP_UPGRADE || config->op == PM_OP_REMOVE || /* -U, 
-R */
           (config->op == PM_OP_SYNC && (config->op_s_clean || 
config->op_s_sync || /* -Sc, -Sy */
              (!config->group && !config->op_s_info && !config->op_q_list /* 
all other -S combinations, where */
-               && !config->op_s_search && !config->op_s_printuris)))) {  /* 
-g, -i, -l, -s, -p is not set */
+               && !config->op_s_search && !config->op_s_printuris
+               && !config->op_s_pretend)))) {                            /* 
-g, -i, -l, -s, -p, -P is not set */
                return(1);
        } else {
                return(0);


Reply via email to