[pacman-dev] [patch] Fix -Qii support and output, some refactoring
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. -Dan --- 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); }
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@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); }
Aaron, just wanted to make sure this patch didn't get lost. It fixes up a few bugs and hacks. <http://www.archlinux.org/pipermail/pacman-dev/2007-January/000938.html> -Dan On 1/7/07, Dan McGee <dpmcgee@gmail.com> wrote:
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@gmail.com>
On 1/15/07, Dan McGee <dpmcgee@gmail.com> wrote:
Aaron, just wanted to make sure this patch didn't get lost. It fixes up a few bugs and hacks.
<http://www.archlinux.org/pipermail/pacman-dev/2007-January/000938.html>
-Dan
Comitted. Thanks again. I also moved the split_pkgname function as your TODO suggested.
participants (2)
-
Aaron Griffin
-
Dan McGee