From 776b94e6bc8df84bddbf738620964fa5b1606fc4 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Mon, 12 Aug 2013 14:46:54 +0200 Subject: [PATCH] Remove PackagesOnHold from xbps.conf; use xbps-pkgdb -m hold|unhold instead. To put a package on hold mode: $ xbps-pkgdb -m hold foo To unhold the package: $ xbps-pkgdb -m unhold foo To list packages on hold mode: $ xbps-query -H This also close #12 from github. --- NEWS | 9 ++++++++ bin/xbps-pkgdb/main.c | 41 +++++++++++++++++++------------------ bin/xbps-pkgdb/xbps-pkgdb.8 | 15 +++++++++++--- bin/xbps-query/defs.h | 1 + bin/xbps-query/list.c | 18 ++++++++++++++++ bin/xbps-query/main.c | 15 +++++++++++--- bin/xbps-query/xbps-query.8 | 4 +++- etc/xbps.conf | 9 -------- lib/initend.c | 1 - lib/repo_pkgdeps.c | 14 +++++++++---- lib/transaction_ops.c | 29 +++++++++----------------- 11 files changed, 96 insertions(+), 60 deletions(-) diff --git a/NEWS b/NEWS index d8af6a54..01d5e9f7 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,14 @@ xbps-0.26 (???): + * Removed "PackagesOnHold" from xbps.conf. This has been replaced by a new mode + in xbps-pkgdb(8): + + $ xbps-pkgdb -m + + To list packages that are currently on hold mode use xbps-query(8): + + $ xbps-query -H + * On terminals with 0 columns, assume 80. Xen's PV guest running Linux and its hvc console does report 0 columns/rows. diff --git a/bin/xbps-pkgdb/main.c b/bin/xbps-pkgdb/main.c index 158b3ab9..b7e410c0 100644 --- a/bin/xbps-pkgdb/main.c +++ b/bin/xbps-pkgdb/main.c @@ -40,34 +40,38 @@ usage(bool fail) fprintf(stdout, "Usage: xbps-pkgdb [OPTIONS] [PKGNAME...]\n\n" "OPTIONS\n" - " -a --all Process all packages\n" - " -C --config Full path to configuration file\n" - " -d --debug Debug mode shown to stderr\n" - " -h --help Print usage help\n" - " -m --mode Change PKGNAME to automatic or manual mode\n" - " -r --rootdir Full path to rootdir\n" - " -u --update Update pkgdb to the latest format\n" - " -v --verbose Verbose messages\n" - " -V --version Show XBPS version\n"); + " -a --all Process all packages\n" + " -C --config Full path to configuration file\n" + " -d --debug Debug mode shown to stderr\n" + " -h --help Print usage help\n" + " -m --mode Change PKGNAME to this mode\n" + " -r --rootdir Full path to rootdir\n" + " -u --update Update pkgdb to the latest format\n" + " -v --verbose Verbose messages\n" + " -V --version Show XBPS version\n"); exit(fail ? EXIT_FAILURE : EXIT_SUCCESS); } static int -change_pkg_instmode(struct xbps_handle *xhp, - const char *pkgname, - const char *modestr) +change_pkg_mode(struct xbps_handle *xhp, const char *pkgname, const char *mode) { xbps_dictionary_t pkgd; - bool mode = false; pkgd = xbps_pkgdb_get_pkg(xhp, pkgname); if (pkgd == NULL) return errno; - if (strcmp(modestr, "auto") == 0) - mode = true; + if (strcmp(mode, "auto") == 0) + xbps_dictionary_set_bool(pkgd, "automatic-install", true); + else if (strcmp(mode, "manual") == 0) + xbps_dictionary_set_bool(pkgd, "automatic-install", false); + else if (strcmp(mode, "hold") == 0) + xbps_dictionary_set_bool(pkgd, "hold", true); + else if (strcmp(mode, "unhold") == 0) + xbps_dictionary_remove(pkgd, "hold"); + else + usage(true); - xbps_dictionary_set_bool(pkgd, "automatic-install", mode); return xbps_pkgdb_update(xhp, true); } @@ -144,16 +148,13 @@ main(int argc, char **argv) if (update_format) convert_pkgdb_format(&xh); else if (instmode) { - if ((strcmp(instmode, "auto")) && (strcmp(instmode, "manual"))) - usage(true); - if (argc == optind) { fprintf(stderr, "xbps-pkgdb: missing PKGNAME argument\n"); exit(EXIT_FAILURE); } for (i = optind; i < argc; i++) { - rv = change_pkg_instmode(&xh, argv[i], instmode); + rv = change_pkg_mode(&xh, argv[i], instmode); if (rv != 0) { fprintf(stderr, "xbps-pkgdb: failed to " "change to %s mode to %s: %s\n", diff --git a/bin/xbps-pkgdb/xbps-pkgdb.8 b/bin/xbps-pkgdb/xbps-pkgdb.8 index 23dcc938..b2dc113c 100644 --- a/bin/xbps-pkgdb/xbps-pkgdb.8 +++ b/bin/xbps-pkgdb/xbps-pkgdb.8 @@ -1,4 +1,4 @@ -.Dd March 4, 2013 +.Dd August 12, 2013 .Os Void Linux .Dt xbps-pkgdb 8 .Sh NAME @@ -42,10 +42,19 @@ Specifies a full path to the XBPS configuration file. Enables extra debugging shown to stderr. .It Fl h, Fl -help Show the help usage. -.It Fl m, Fl -mode Ar auto|manual +.It Fl m, Fl -mode Ar auto|manual|hold|unhold Switches .Ar PKGNAME -to the specified installation mode: automatic or manual mode. +to the specified mode: automatic or manual installation mode, or to (un)set it on hold mode. +A package that was installed as dependency will be in +.Sy automatic +mode, otherwise will be set to +.Sy manual . +A package in +.Sy hold +mode won't be updated in full system upgrades. The list of packages in this mode can be +seen with +.Xr xbps-query 8 . .It Fl r, Fl -rootdir Ar dir Specifies a full path for the target root directory. .It Fl u, Fl -update diff --git a/bin/xbps-query/defs.h b/bin/xbps-query/defs.h index d59edaa9..a357d295 100644 --- a/bin/xbps-query/defs.h +++ b/bin/xbps-query/defs.h @@ -61,6 +61,7 @@ unsigned int find_longest_pkgver(struct xbps_handle *, xbps_object_t); int list_pkgs_in_dict(struct xbps_handle *, xbps_object_t, const char *, void *, bool *); int list_manual_pkgs(struct xbps_handle *, xbps_object_t, const char *, void *, bool *); +int list_hold_pkgs(struct xbps_handle *, xbps_object_t, const char *, void *, bool *); int list_orphans(struct xbps_handle *); int list_pkgs_pkgdb(struct xbps_handle *); diff --git a/bin/xbps-query/list.c b/bin/xbps-query/list.c index f692a48d..62356075 100644 --- a/bin/xbps-query/list.c +++ b/bin/xbps-query/list.c @@ -116,6 +116,24 @@ list_manual_pkgs(struct xbps_handle *xhp, return 0; } +int +list_hold_pkgs(struct xbps_handle *xhp, xbps_object_t obj, + const char *key, void *arg, bool *loop_done) +{ + const char *pkgver; + + (void)xhp; + (void)key; + (void)arg; + (void)loop_done; + + if (xbps_dictionary_get(obj, "hold")) { + xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); + printf("%s\n", pkgver); + } + + return 0; +} int list_orphans(struct xbps_handle *xhp) { diff --git a/bin/xbps-query/main.c b/bin/xbps-query/main.c index b3b4f2b2..3b832dc2 100644 --- a/bin/xbps-query/main.c +++ b/bin/xbps-query/main.c @@ -50,6 +50,7 @@ usage(bool fail) "\nMODE [only one mode may be specified]\n" " -l --list-pkgs List available packages\n" " -L --list-repos List working repositories\n" + " -H --list-hold-pkgs List packages on hold state\n" " -m --list-manual-pkgs List packages installed explicitly\n" " -O --list-orphans List package orphans\n" " -o --ownedby PATTERN(s) Search for packages owning PATTERN(s)\n" @@ -65,7 +66,7 @@ usage(bool fail) int main(int argc, char **argv) { - const char *shortopts = "C:c:D:dfhLlmOop:Rr:sVvXx"; + const char *shortopts = "C:c:D:dfhHLlmOop:Rr:sVvXx"; const struct option longopts[] = { { "config", required_argument, NULL, 'C' }, { "cachedir", required_argument, NULL, 'c' }, @@ -74,6 +75,7 @@ main(int argc, char **argv) { "help", no_argument, NULL, 'h' }, { "list-repos", no_argument, NULL, 'L' }, { "list-pkgs", no_argument, NULL, 'l' }, + { "list-hold-pkgs", no_argument, NULL, 'H' }, { "list-manual-pkgs", no_argument, NULL, 'm' }, { "list-orphans", no_argument, NULL, 'O' }, { "ownedby", no_argument, NULL, 'o' }, @@ -92,12 +94,12 @@ main(int argc, char **argv) const char *rootdir, *cachedir, *conffile, *props, *defrepo; int c, flags, rv, show_deps = 0; bool list_pkgs, list_repos, orphans, own; - bool list_manual, show_prop, show_files, show_rdeps; + bool list_manual, list_hold, show_prop, show_files, show_rdeps; bool show, search, repo_mode, opmode, fulldeptree; rootdir = cachedir = conffile = defrepo = props = NULL; flags = rv = c = 0; - list_pkgs = list_repos = orphans = search = own = false; + list_pkgs = list_repos = list_hold = orphans = search = own = false; list_manual = show_prop = show_files = false; show = show_rdeps = fulldeptree = false; repo_mode = opmode = false; @@ -119,6 +121,9 @@ main(int argc, char **argv) case 'f': show_files = opmode = true; break; + case 'H': + list_hold = true; + break; case 'h': usage(false); /* NOTREACHED */ @@ -195,6 +200,10 @@ main(int argc, char **argv) /* list repositories */ rv = repo_list(&xh); + } else if (list_hold) { + /* list on hold pkgs */ + rv = xbps_pkgdb_foreach_cb(&xh, list_hold_pkgs, NULL); + } else if (list_manual) { /* list manual pkgs */ rv = xbps_pkgdb_foreach_cb(&xh, list_manual_pkgs, NULL); diff --git a/bin/xbps-query/xbps-query.8 b/bin/xbps-query/xbps-query.8 index b4e0363e..933eccc8 100644 --- a/bin/xbps-query/xbps-query.8 +++ b/bin/xbps-query/xbps-query.8 @@ -1,4 +1,4 @@ -.Dd July 26, 2013 +.Dd August 12, 2013 .Os Void Linux .Dt xbps-query 8 .Sh NAME @@ -78,6 +78,8 @@ option is specified, the target will be queried in the root directory, otherwise it will be queried in registered repositories. .Bl -tag -width -x +.If Fl H, Fl -list-hold-pkgs +List packages that are put on hold, and won't be updated in full system upgrades. .It Fl l, Fl -list-pkgs Lists registered packages in the package database (pkgdb). A package can be in any of the following states: diff --git a/etc/xbps.conf b/etc/xbps.conf index 656a2ad0..3f556c57 100644 --- a/etc/xbps.conf +++ b/etc/xbps.conf @@ -41,15 +41,6 @@ repositories = { #http://xbps.nopcode.org/repos/current/nonfree } -# Packages on hold. -# -# Packages that are put on hold won't be updated when running a full -# system upgrade, these packages must be updated manually. -# -# Package names and shell wildcards can be specified. -# -#PackagesOnHold = { "glibc-*" } - # Virtual packages. # # The following syntax is used: diff --git a/lib/initend.c b/lib/initend.c index 7212fd5e..3d22faa2 100644 --- a/lib/initend.c +++ b/lib/initend.c @@ -127,7 +127,6 @@ xbps_init(struct xbps_handle *xhp) XBPS_FETCH_TIMEOUT, CFGF_NONE), CFG_BOOL(__UNCONST("syslog"), true, CFGF_NONE), CFG_STR_LIST(__UNCONST("repositories"), NULL, CFGF_MULTI), - CFG_STR_LIST(__UNCONST("PackagesOnHold"), NULL, CFGF_MULTI), CFG_SEC(__UNCONST("virtual-package"), vpkg_opts, CFGF_MULTI|CFGF_TITLE), CFG_FUNC(__UNCONST("include"), &cfg_include), diff --git a/lib/repo_pkgdeps.c b/lib/repo_pkgdeps.c index 33dbd069..d3a8a472 100644 --- a/lib/repo_pkgdeps.c +++ b/lib/repo_pkgdeps.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2008-2012 Juan Romero Pardines. + * Copyright (c) 2008-2013 Juan Romero Pardines. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -237,12 +237,18 @@ find_repo_deps(struct xbps_handle *xhp, if (rv == 0) { /* * Package is installed but does not match - * the dependency pattern, update pkg. + * the dependency pattern, update pkg if it's not + * on hold state. */ xbps_dbg_printf_append(xhp, "installed `%s', " - "must be updated.\n", pkgver_q); - reason = "update"; + "must be updated.", pkgver_q); + if (xbps_dictionary_get(tmpd, "hold")) + xbps_dbg_printf_append(xhp, " on hold state! ignoring update.\n"); + else { + xbps_dbg_printf_append(xhp, "\n"); + reason = "update"; + } } else if (rv == 1) { rv = 0; if (state == XBPS_PKG_STATE_UNPACKED) { diff --git a/lib/transaction_ops.c b/lib/transaction_ops.c index d96d2df3..36aa045d 100644 --- a/lib/transaction_ops.c +++ b/lib/transaction_ops.c @@ -189,11 +189,10 @@ xbps_transaction_update_packages(struct xbps_handle *xhp) xbps_dictionary_t pkgd; xbps_object_t obj; xbps_object_iterator_t iter; - const char *pkgver, *holdpkg; - char *pkgname; - bool foundhold = false, newpkg_found = false; + const char *pkgver; + char *pkgname = NULL; + bool hold, newpkg_found = false; int rv = 0; - unsigned int x; if ((rv = xbps_pkgdb_init(xhp)) != 0) return rv; @@ -204,23 +203,15 @@ xbps_transaction_update_packages(struct xbps_handle *xhp) while ((obj = xbps_object_iterator_next(iter))) { pkgd = xbps_dictionary_get_keysym(xhp->pkgdb, obj); xbps_dictionary_get_cstring_nocopy(pkgd, "pkgver", &pkgver); - pkgname = xbps_pkg_name(pkgver); - assert(pkgname); - - for (x = 0; x < cfg_size(xhp->cfg, "PackagesOnHold"); x++) { - holdpkg = cfg_getnstr(xhp->cfg, "PackagesOnHold", x); - if ((strcmp(holdpkg, pkgname) == 0) || - (fnmatch(holdpkg, pkgname, FNM_PERIOD) == 0)) { - xbps_dbg_printf(xhp, "[rpool] package `%s' " - "on hold, ignoring updates.\n", pkgname); - foundhold = true; - break; - } - } - if (foundhold) { - foundhold = false; + hold = false; + xbps_dictionary_get_bool(pkgd, "hold", &hold); + if (hold) { + xbps_dbg_printf(xhp, "[rpool] package `%s' " + "on hold, ignoring updates.\n", pkgver); continue; } + pkgname = xbps_pkg_name(pkgver); + assert(pkgname); rv = trans_find_pkg(xhp, pkgname, TRANS_UPDATE); if (rv == 0) newpkg_found = true;