[pacman-dev] [patch] Fix -Qii support and output, some refactoring

Dan McGee dpmcgee at gmail.com
Sun Jan 7 21:40:40 EST 2007


oops, forgot the signed-off-by line :)

Libification added a regression on multiple 'i' support for a query;
this option allows additional information to be printed about the
backup files. While fixing, noticed the previous hack-up with SHA1
addition didn't work as expected because it had probably never been
tested, so also refactored this whole section into a new function and
fixed existing problems. Finally, a few formatting changes in pacman.c
for clarity.

Signed-off-by: Dan McGee <dpmcgee at gmail.com>

---

diff -upr pacman-lib.orig/src/pacman/package.c pacman-lib/src/pacman/package.c
--- pacman-lib.orig/src/pacman/package.c        2006-11-22
04:03:42.000000000 -0500
+++ pacman-lib/src/pacman/package.c     2007-01-07 20:51:18.000000000 -0500
@@ -37,92 +37,61 @@
  */
 void dump_pkg_full(pmpkg_t *pkg, int level)
 {
-       const char *date, *type;
+       const char *bdate, *type, *idate, *reason;

        if(pkg == NULL) {
                return;
        }

-       printf(_("Name           : %s\n"), (char *)alpm_pkg_get_name(pkg));
-       printf(_("Version        : %s\n"), (char *)alpm_pkg_get_version(pkg));
-
-       pmlist_display(_("Groups         :"), alpm_pkg_get_groups(pkg));
-
-       printf(_("Packager       : %s\n"), (char *)alpm_pkg_get_packager(pkg));
-       printf("URL            : %s\n", (char *)alpm_pkg_get_url(pkg));
-       pmlist_display(_("License        :"), alpm_pkg_get_licenses(pkg));
-       printf(_("Architecture   : %s\n"), (char *)alpm_pkg_get_arch(pkg));
-       printf(_("Size           : %ld\n"), (long int)alpm_pkg_get_size(pkg));
-
-       date = alpm_pkg_get_builddate(pkg);
-       printf(_("Build Date     : %s %s\n"), date, strlen(date) ? "UTC" : "");
+       /* set variables here, do all output below */
+       bdate = alpm_pkg_get_builddate(pkg);
        type = alpm_pkg_get_buildtype(pkg);
-       printf(_("Build Type     : %s\n"), strlen(type) ? type : _("Unknown"));
-       date = alpm_pkg_get_installdate(pkg);
-       printf(_("Install Date   : %s %s\n"), date, strlen(date) ? "UTC" : "");
+       idate = alpm_pkg_get_installdate(pkg);

-       printf(_("Install Script : %s\n"), alpm_pkg_has_scriptlet(pkg) ?
_("Yes") : _("No"));
-
-       printf(_("Reason         : "));
        switch((long)alpm_pkg_get_reason(pkg)) {
                case PM_PKG_REASON_EXPLICIT:
-                       printf(_("Explicitly installed\n"));
+                       reason = "Explicitly installed";
                        break;
                case PM_PKG_REASON_DEPEND:
-                       printf(_("Installed as a dependency for
another package\n"));
+                       reason = "Installed as a dependency for
another package";
                        break;
                default:
-                       printf(_("Unknown\n"));
+                       reason = "Unknown";
                        break;
        }

+       /* actual output */
+       printf(_("Name           : %s\n"), (char *)alpm_pkg_get_name(pkg));
+       printf(_("Version        : %s\n"), (char *)alpm_pkg_get_version(pkg));
+       pmlist_display(_("Groups         :"), alpm_pkg_get_groups(pkg));
+       printf(_("Packager       : %s\n"), (char *)alpm_pkg_get_packager(pkg));
+       printf(_("URL            : %s\n"), (char *)alpm_pkg_get_url(pkg));
+       pmlist_display(_("License        :"), alpm_pkg_get_licenses(pkg));
+       printf(_("Architecture   : %s\n"), (char *)alpm_pkg_get_arch(pkg));
+       printf(_("Installed Size : %ld\n"), (long int)alpm_pkg_get_size(pkg));
+       printf(_("Build Date     : %s %s\n"), bdate, strlen(bdate) ?
"UTC" : "");
+       printf(_("Build Type     : %s\n"), strlen(type) ? type : _("Unknown"));
+       /* TODO only applicable if querying installed package, not a file */
+       printf(_("Install Date   : %s %s\n"), idate, strlen(idate) ?
"UTC" : "");
+       printf(_("Install Script : %s\n"), alpm_pkg_has_scriptlet(pkg) ?
_("Yes") : _("No"));
+       printf(_("Reason         : %s\n"), reason);
        pmlist_display(_("Provides       :"), alpm_pkg_get_provides(pkg));
        pmlist_display(_("Depends On     :"), alpm_pkg_get_depends(pkg));
        pmlist_display(_("Removes        :"), alpm_pkg_get_removes(pkg));
+       /* TODO only applicable if querying installed package, not a file */
        pmlist_display(_("Required By    :"), alpm_pkg_get_requiredby(pkg));
        pmlist_display(_("Conflicts With :"), alpm_pkg_get_conflicts(pkg));
-
+
        printf(_("Description    : "));
        indentprint(alpm_pkg_get_desc(pkg), 17);
        printf("\n");

+       /* Print additional package info if info flag passed more than once */
+       /* TODO only applicable if querying installed package, not a file */
        if(level > 1) {
-               pmlist_t *i;
-               const char *root = alpm_option_get_root();
-               fprintf(stdout, "\n");
-               for(i = alpm_list_first(alpm_pkg_get_backup(pkg)); i; i =
alpm_list_next(i)) {
-                       struct stat buf;
-                       char path[PATH_MAX];
-                       char *str = strdup(alpm_list_getdata(i));
-                       char *ptr = index(str, '\t');
-                       if(ptr == NULL) {
-                               FREE(str);
-                               continue;
-                       }
-                       *ptr = '\0';
-                       ptr++;
-                       snprintf(path, PATH_MAX-1, "%s%s", root, str);
-                       if(!stat(path, &buf)) {
-                               char *md5sum = alpm_get_md5sum(path);
-                               char *sha1sum = alpm_get_sha1sum(path);
-                               if(md5sum == NULL && sha1sum == NULL) {
-                                       ERR(NL, _("error calculating
md5sum or sha1sum for %s\n"), path);
-                                       FREE(str);
-                                       continue;
-                               }
-                               if (!sha1sum)
-                                   printf(_("%sMODIFIED\t%s\n"),
strcmp(md5sum, ptr) ? "" :
_("NOT "), path);
-                               if (!md5sum)
-                                   printf(_("%sMODIFIED\t%s\n"),
strcmp(sha1sum, ptr) ? "" :
_("NOT "), path);
-                               FREE(md5sum);
-                               FREE(sha1sum);
-                       } else {
-                               printf(_("MISSING\t\t%s\n"), path);
-                       }
-                       FREE(str);
-               }
+               /* call new backup function */
+               dump_pkg_backups(pkg);
        }
-
        printf("\n");
 }

@@ -130,38 +99,93 @@ void dump_pkg_full(pmpkg_t *pkg, int lev
  */
 void dump_pkg_sync(pmpkg_t *pkg, char *treename)
 {
-       char *sum;
+       char *md5sum, *sha1sum;
        if(pkg == NULL) {
                return;
        }

-       printf(_("Repository        : %s\n"), treename);
-       printf(_("Name              : %s\n"), (char *)alpm_pkg_get_name(pkg));
-       printf(_("Version           : %s\n"), (char
*)alpm_pkg_get_version(pkg));
-
-       pmlist_display(_("Groups            :"), alpm_pkg_get_groups(pkg));
-       pmlist_display(_("Provides          :"), alpm_pkg_get_provides(pkg));
-       pmlist_display(_("Depends On        :"), alpm_pkg_get_depends(pkg));
-       pmlist_display(_("Removes           :"), alpm_pkg_get_removes(pkg));
-       pmlist_display(_("Conflicts With    :"), alpm_pkg_get_conflicts(pkg));
-       pmlist_display(_("Replaces          :"), alpm_pkg_get_replaces(pkg));
-
-       printf(_("Size (compressed) : %ld\n"), (long)alpm_pkg_get_size(pkg));
-       printf(_("Size (installed)  : %ld\n"), (long)alpm_pkg_get_isize(pkg));
-       printf(_("Description       : "));
-       indentprint(alpm_pkg_get_desc(pkg), 20);
-
-       sum = (char *)alpm_pkg_get_md5sum(pkg);
-       if (sum != NULL && sum[0] != '\0') {
-               printf(_("\nMD5 Sum           : %s"), sum);
-       }
-       sum = (char *)alpm_pkg_get_sha1sum(pkg);
-       if (sum != NULL && sum[0] != '\0') {
-               printf(_("\nSHA1 Sum          : %s"), sum);
+       md5sum = (char *)alpm_pkg_get_md5sum(pkg);
+       sha1sum = (char *)alpm_pkg_get_sha1sum(pkg);
+
+       printf(_("Repository     : %s\n"), treename);
+       printf(_("Name           : %s\n"), (char *)alpm_pkg_get_name(pkg));
+       printf(_("Version        : %s\n"), (char *)alpm_pkg_get_version(pkg));
+       pmlist_display(_("Groups         :"), alpm_pkg_get_groups(pkg));
+       pmlist_display(_("Provides       :"), alpm_pkg_get_provides(pkg));
+       pmlist_display(_("Depends On     :"), alpm_pkg_get_depends(pkg));
+       pmlist_display(_("Removes        :"), alpm_pkg_get_removes(pkg));
+       pmlist_display(_("Conflicts With :"), alpm_pkg_get_conflicts(pkg));
+       pmlist_display(_("Replaces       :"), alpm_pkg_get_replaces(pkg));
+       printf(_("Download Size  : %ld\n"), (long)alpm_pkg_get_size(pkg));
+       printf(_("Installed Size : %ld\n"), (long)alpm_pkg_get_isize(pkg));
+
+       printf(_("Description    : "));
+       indentprint(alpm_pkg_get_desc(pkg), 17);
+       printf("\n");
+
+       if (md5sum != NULL && md5sum[0] != '\0') {
+               printf(_("MD5 Sum        : %s"), md5sum);
+       }
+       if (sha1sum != NULL && sha1sum[0] != '\0') {
+               printf(_("SHA1 Sum       : %s"), sha1sum);
        }
        printf("\n");
 }

+/* Display list of backup files and their modification states
+ */
+void dump_pkg_backups(pmpkg_t *pkg)
+{
+       pmlist_t *i;
+       const char *root = alpm_option_get_root();
+       printf("\nBackup Files :\n");
+       for(i = alpm_list_first(alpm_pkg_get_backup(pkg)); i; i =
alpm_list_next(i)) {
+               struct stat buf;
+               char path[PATH_MAX];
+               char *str = strdup(alpm_list_getdata(i));
+               char *ptr = index(str, '\t');
+               if(ptr == NULL) {
+                       FREE(str);
+                       continue;
+               }
+               *ptr = '\0';
+               ptr++;
+               snprintf(path, PATH_MAX-1, "%s%s", root, str);
+               /* if we find the file, calculate checksums, otherwise
it is missing */
+               if(!stat(path, &buf)) {
+                       char *sum;
+                       char *md5sum = alpm_get_md5sum(path);
+                       char *sha1sum = alpm_get_sha1sum(path);
+
+                       if(md5sum == NULL || sha1sum == NULL) {
+                               ERR(NL, _("error calculating checksums
for %s\n"), path);
+                               FREE(str);
+                               continue;
+                       }
+                       /* TODO Is this a good way to check type of
backup stored?
+                        * We aren't storing it anywhere in the database. */
+                       if (strlen(ptr) == 32) {
+                               sum = md5sum;
+                       } else { /*if (strlen(ptr) == 40) */
+                               sum = sha1sum;
+                       }
+                       /* if checksums don't match, file has been modified */
+                       if (strcmp(sum, ptr)) {
+                               printf(_("MODIFIED\t%s\n"), path);
+                       } else {
+                               printf(_("Not Modified\t%s\n"), path);
+                       }
+                       FREE(md5sum);
+                       FREE(sha1sum);
+               } else {
+                       printf(_("MISSING\t\t%s\n"), path);
+               }
+               FREE(str);
+       }
+}
+
+/* List all files contained in a package
+ */
 void dump_pkg_files(pmpkg_t *pkg)
 {
        const char *pkgname;
@@ -202,6 +226,10 @@ void dump_pkg_changelog(char *clfile, co
        }
 }

+/* splits package name into its respective parts
+ */
+/* TODO this is only used in sync.c by sync_cleancache, should it be a static
+ * function in there instead of global here? */
 int split_pkgname(char *target, char *name, char *version)
 {
        char tmp[512];
diff -upr pacman-lib.orig/src/pacman/package.h pacman-lib/src/pacman/package.h
--- pacman-lib.orig/src/pacman/package.h        2006-11-20
04:10:25.000000000 -0500
+++ pacman-lib/src/pacman/package.h     2007-01-07 17:26:34.000000000 -0500
@@ -24,6 +24,7 @@
 void dump_pkg_full(pmpkg_t *pkg, int level);
 void dump_pkg_sync(pmpkg_t *pkg, char *treename);

+void dump_pkg_backups(pmpkg_t *pkg);
 void dump_pkg_files(pmpkg_t *pkg);
 void dump_pkg_changelog(char *clfile, const char *pkgname);

diff -upr pacman-lib.orig/src/pacman/pacman.c pacman-lib/src/pacman/pacman.c
--- pacman-lib.orig/src/pacman/pacman.c 2006-12-14 00:23:08.000000000 -0500
+++ pacman-lib/src/pacman/pacman.c      2007-01-07 17:43:23.000000000 -0500
@@ -296,7 +296,7 @@ static int parseargs(int argc, char *arg
                                #else
                                config->configfile = strndup(optarg, PATH_MAX);
                                #endif
-                       break;
+                               break;
                        case 1002: config->op_s_ignore =
list_add(config->op_s_ignore,
strdup(optarg)); break;
                        case 1003: config->debug = atoi(optarg); break;
                        case 1004: config->noprogressbar = 1; break;
@@ -307,11 +307,11 @@ static int parseargs(int argc, char *arg
                                config->op = (config->op != PM_OP_MAIN
? 0 : PM_OP_DEPTEST);
                                config->op_d_resolve = 1;
                                config->flags |= PM_TRANS_FLAG_ALLDEPS;
-                       break;
+                               break;
                        case 'F':
                                config->op = (config->op != PM_OP_MAIN
? 0 : PM_OP_UPGRADE);
                                config->flags |= PM_TRANS_FLAG_FRESHEN;
-                       break;
+                               break;
                        case 'Q': config->op = (config->op !=
PM_OP_MAIN ? 0 : PM_OP_QUERY); break;
                        case 'R': config->op = (config->op !=
PM_OP_MAIN ? 0 : PM_OP_REMOVE); break;
                        case 'S': config->op = (config->op !=
PM_OP_MAIN ? 0 : PM_OP_SYNC); break;
@@ -321,7 +321,7 @@ static int parseargs(int argc, char *arg
                        case 'Y':
                                config->op = (config->op != PM_OP_MAIN
? 0 : PM_OP_DEPTEST);
                                config->op_d_vertest = 1;
-                       break;
+                               break;
                        case 'b':
                          if(stat(optarg, &st) == -1 || !S_ISDIR(st.st_mode)) {
                                        pm_fprintf(stderr, NL,
_("error: '%s' is not a valid db path\n"), optarg);
@@ -329,21 +329,21 @@ static int parseargs(int argc, char *arg
                                }
                                alpm_option_set_dbpath(optarg);
                                config->dbpath = alpm_option_get_dbpath(optarg);
-                       break;
+                               break;
                        case 'c':
-                               config->op_s_clean++;
+                               (config->op_s_clean)++;
                                config->flags |= PM_TRANS_FLAG_CASCADE;
                                config->op_q_changelog = 1;
-                       break;
+                               break;
                        case 'd': config->flags |= PM_TRANS_FLAG_NODEPS; break;
-                       case 'e': config->op_q_orphans = 1; config->flags |=
PM_TRANS_FLAG_DEPENDSONLY; break;
+                       case 'e':
+                               config->op_q_orphans = 1;
+                               config->flags |= PM_TRANS_FLAG_DEPENDSONLY;
+                               break;
                        case 'f': config->flags |= PM_TRANS_FLAG_FORCE; break;
-                       case 'g': config->group++; break;
+                       case 'g': (config->group)++; break;
                        case 'h': config->help = 1; break;
-                       case 'i':
-                               config->op_q_info++;
-                               config->op_s_info++;
-                       break;
+                       case 'i': (config->op_q_info)++;
(config->op_s_info)++; break;
                        case 'k': config->flags |= PM_TRANS_FLAG_DBONLY; break;
                        case 'l': config->op_q_list = 1; break;
                        case 'm': config->op_q_foreign = 1; break;
@@ -352,7 +352,7 @@ static int parseargs(int argc, char *arg
                        case 'p':
                                config->op_q_isfile = 1;
                                config->flags |= PM_TRANS_FLAG_PRINTURIS;
-                       break;
+                               break;
                        case 'r':
                          printf("setting root path=%s\n", optarg);
                                if(realpath(optarg, root) == NULL) {
@@ -360,20 +360,20 @@ static int parseargs(int argc, char *arg
                                        return(1);
                                }
                                config->root = strdup(root);
-                       break;
+                               break;
                        case 's':
                                config->op_s_search = 1;
                                config->op_q_search = 1;
                                config->flags |= PM_TRANS_FLAG_RECURSE;
-                       break;
+                               break;
                        case 'u': config->op_s_upgrade = 1; break;
-                       case 'v': config->verbose++; break;
+                       case 'v': (config->verbose)++; break;
                        case 'w':
                                config->op_s_downloadonly = 1;
                                config->flags |= PM_TRANS_FLAG_DOWNLOADONLY;
                                config->flags |= PM_TRANS_FLAG_NOCONFLICTS;
-                       break;
-                       case 'y': config->op_s_sync++; break;
+                               break;
+                       case 'y': (config->op_s_sync)++; break;
                        case '?': return(1);
                        default: return(1);
                }




More information about the pacman-dev mailing list