123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- /*
- * dselect - Debian package maintenance user interface
- * pkgdisplay.cc - package list display
- *
- * Copyright © 1994,1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
- * Copyright © 2006, 2008-2015 Guillem Jover <guillem@debian.org>
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
- #include <config.h>
- #include <compat.h>
- #include <string.h>
- #include <stdio.h>
- #include <dpkg/i18n.h>
- #include <dpkg/dpkg.h>
- #include <dpkg/dpkg-db.h>
- #include "dselect.h"
- #include "pkglist.h"
- /* These MUST be in the same order as the corresponding enums in dpkg-db.h */
- const char
- *const wantstrings[]= { N_("new package"),
- N_("install"),
- N_("hold"),
- N_("remove"),
- N_("purge"),
- nullptr },
- /* TRANSLATORS: The space is a trick to work around gettext which uses
- * the empty string to store information about the translation. DO NOT
- * CHANGE THAT IN A TRANSLATION! The code really relies on that being
- * a single space. */
- *const eflagstrings[]= { N_(" "),
- N_("REINSTALL"),
- nullptr },
- *const statusstrings[]= { N_("not installed"),
- N_("removed (configs remain)"),
- N_("half installed"),
- N_("unpacked (not set up)"),
- N_("half configured (config failed)"),
- N_("awaiting trigger processing"),
- N_("triggered"),
- N_("installed"),
- nullptr },
- *const prioritystrings[]= { N_("Required"),
- N_("Important"),
- N_("Standard"),
- N_("Optional"),
- N_("Extra"),
- N_("Unclassified"),
- nullptr },
- *const relatestrings[]= { N_("suggests"),
- N_("recommends"),
- N_("depends on"),
- N_("pre-depends on"),
- N_("breaks"),
- N_("conflicts with"),
- N_("provides"),
- N_("replaces"),
- N_("enhances"),
- nullptr },
- *const priorityabbrevs[]= { N_("Req"),
- N_("Imp"),
- N_("Std"),
- N_("Opt"),
- N_("Xtr"),
- N_("bUG"),
- N_("?") };
- const char statuschars[] = " -IUCWt*";
- const char eflagchars[] = " R";
- const char wantchars[]= "n*=-_";
- /* These MUST be in the same order as the corresponding enums in pkglist.h */
- const char
- *const ssaabbrevs[]= { N_("Broken"),
- N_("New"),
- N_("Upgradable"),
- N_("Obsolete/local"),
- N_("Installed"),
- N_("Available"),
- N_("Removed") },
- *const ssastrings[]= { N_("Brokenly installed packages"),
- N_("Newly available packages"),
- N_("Upgradable packages"),
- N_("Obsolete and locally created packages"),
- N_("Installed packages"),
- N_("Available not installed packages"),
- N_("Removed and no longer available packages") };
- const char
- *const sssstrings[]= { N_("Brokenly installed packages"),
- N_("Installed packages"),
- N_("Removed packages (configuration still present)"),
- N_("Purged packages and those never installed") },
- *const sssabbrevs[]= { N_("Broken"),
- N_("Installed"),
- N_("Removed"),
- N_("Purged") };
- static int maximumstring(const char *const *array) {
- int maxlen= 0;
- while (*array) {
- int l= strlen(gettext(*array));
- const char *p= strchr(*array, '(');
- if (p && p > *array && *--p == ' ') l= p - *array;
- if (l > maxlen) maxlen= l;
- array++;
- }
- return maxlen;
- }
- void packagelist::setwidths() {
- debug(dbg_general, "packagelist[%p]::setwidths()", this);
- col_cur_x = 0;
- if (verbose) {
- add_column(col_status_hold, _("Error"), 9);
- add_column(col_status_status, _("Installed?"), maximumstring(statusstrings));
- add_column(col_status_old_want, _("Old mark"), maximumstring(wantstrings));
- add_column(col_status_new_want, _("Marked for"), maximumstring(wantstrings));
- } else {
- add_column(col_status, _("EIOM"), 4);
- }
- if (sortorder == so_section)
- add_column(col_section, _("Section"), 8);
- add_column(col_priority, _("Priority"), verbose ? 8 : 3);
- if (sortorder != so_section)
- add_column(col_section, _("Section"), 8);
- add_column(col_package, _("Package"), verbose ? 16 : 12);
- switch (archdisplayopt) {
- case ado_none:
- col_archinstalled.blank();
- col_archavailable.blank();
- break;
- case ado_available:
- col_archinstalled.blank();
- add_column(col_archavailable, _("Avail.arch"), verbose ? 14 : 10);
- break;
- case ado_both:
- add_column(col_archinstalled, _("Inst.arch"), verbose ? 14 : 10);
- add_column(col_archavailable, _("Avail.arch"), verbose ? 14 : 10);
- break;
- default:
- internerr("unknown archdisplayopt %d", archdisplayopt);
- }
- switch (versiondisplayopt) {
- case vdo_none:
- col_versioninstalled.blank();
- col_versionavailable.blank();
- break;
- case vdo_available:
- col_versioninstalled.blank();
- add_column(col_versionavailable, _("Avail.ver"), 11);
- break;
- case vdo_both:
- add_column(col_versioninstalled, _("Inst.ver"), 11);
- add_column(col_versionavailable, _("Avail.ver"), 11);
- break;
- default:
- internerr("unknown versiondisplayopt %d", versiondisplayopt);
- }
- end_column(col_description, _("Description"));
- }
- void packagelist::redrawtitle() {
- int x, y DPKG_ATTR_UNUSED;
- if (title_height) {
- mywerase(titlewin);
- mvwaddnstr(titlewin,0,0,
- recursive ? _("dselect - recursive package listing") :
- modstatdb_get_status() == msdbrw_readonly ?
- _("dselect - inspection of package states") :
- _("dselect - main package listing"),
- xmax);
- getyx(titlewin,y,x);
- if (x < xmax) {
- switch (sortorder) {
- case so_section:
- switch (statsortorder) {
- case sso_unsorted:
- waddnstr(titlewin, _(" (by section)"), xmax-x);
- break;
- case sso_avail:
- waddnstr(titlewin, _(" (avail., section)"), xmax-x);
- break;
- case sso_state:
- waddnstr(titlewin, _(" (status, section)"), xmax-x);
- break;
- default:
- internerr("bad statsort %d on so_section", statsortorder);
- }
- break;
- case so_priority:
- switch (statsortorder) {
- case sso_unsorted:
- waddnstr(titlewin, _(" (by priority)"), xmax-x);
- break;
- case sso_avail:
- waddnstr(titlewin, _(" (avail., priority)"), xmax-x);
- break;
- case sso_state:
- waddnstr(titlewin, _(" (status, priority)"), xmax-x);
- break;
- default:
- internerr("bad statsort %d on so_priority", statsortorder);
- }
- break;
- case so_alpha:
- switch (statsortorder) {
- case sso_unsorted:
- waddnstr(titlewin, _(" (alphabetically)"), xmax-x);
- break;
- case sso_avail:
- waddnstr(titlewin, _(" (by availability)"), xmax-x);
- break;
- case sso_state:
- waddnstr(titlewin, _(" (by status)"), xmax-x);
- break;
- default:
- internerr("bad statsort %d on so_priority", statsortorder);
- }
- break;
- case so_unsorted:
- break;
- default:
- internerr("bad sort %d", sortorder);
- }
- }
- const char *helpstring;
- if (modstatdb_get_status() == msdbrw_write)
- helpstring = (verbose ? _(" mark:+/=/- terse:v help:?")
- : _(" mark:+/=/- verbose:v help:?"));
- else
- helpstring = (verbose ? _(" terse:v help:?")
- : _(" verbose:v help:?"));
- int l= strlen(helpstring);
- getyx(titlewin,y,x);
- if (xmax-l > 0) {
- mvwaddstr(titlewin,0,xmax-l, helpstring);
- }
- wnoutrefresh(titlewin);
- }
- }
|