diff --git a/NEWS b/NEWS index ad32afeb..85e6b2e6 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,16 @@ xbps-0.12.0 (???): + * xbps-bin: new dry-run mode (-n) to show the actions that would + be executed in a transaction. This mode takes effect in the + autoremove, autoupdate, install, remove and update targets. Example: + + $ xbps-bin -n install kernel-snapshot + kernel-snapshot install 3.3.0rc2 /mnt/xbps_builder/host/binpkgs/x86_64 + $ + + The format is "%s %s %s[ %s]\n" for `pkgname', `action', `version' + and `repository' (optional). + * xbps-bin: the install target will now install the best package version available in repository pool if just package name has been specified, otherwise the first repository matching the diff --git a/bin/xbps-bin/defs.h b/bin/xbps-bin/defs.h index e22b6310..ec25792f 100644 --- a/bin/xbps-bin/defs.h +++ b/bin/xbps-bin/defs.h @@ -48,9 +48,9 @@ struct list_pkgver_cb { int install_new_pkg(const char *, bool); int update_pkg(const char *); int remove_pkg(const char *, bool); -int autoupdate_pkgs(bool, bool); -int autoremove_pkgs(bool); -int exec_transaction(bool, bool); +int autoupdate_pkgs(bool, bool, bool); +int autoremove_pkgs(bool, bool); +int exec_transaction(bool, bool, bool); /* from remove.c */ int remove_installed_pkgs(int, char **, bool, bool, bool, bool); diff --git a/bin/xbps-bin/main.c b/bin/xbps-bin/main.c index 9045f0c5..3c553c3f 100644 --- a/bin/xbps-bin/main.c +++ b/bin/xbps-bin/main.c @@ -65,14 +65,14 @@ main(int argc, char **argv) const char *rootdir, *cachedir, *conffile, *option; int i, c, flags, rv; bool yes, reqby_force, force_rm_with_deps, recursive_rm; - bool reinstall, show_download_pkglist_url; + bool reinstall, show_download_pkglist_url, dry_run; rootdir = cachedir = conffile = option = NULL; flags = rv = 0; - reqby_force = yes = force_rm_with_deps = false; + reqby_force = yes = dry_run = force_rm_with_deps = false; recursive_rm = reinstall = show_download_pkglist_url = false; - while ((c = getopt(argc, argv, "AC:c:dDFfMo:Rr:Vvy")) != -1) { + while ((c = getopt(argc, argv, "AC:c:dDFfMno:Rr:Vvy")) != -1) { switch (c) { case 'A': flags |= XBPS_FLAG_INSTALL_AUTO; @@ -100,6 +100,9 @@ main(int argc, char **argv) case 'M': flags |= XBPS_FLAG_INSTALL_MANUAL; break; + case 'n': + dry_run = true; + break; case 'o': option = optarg; break; @@ -214,7 +217,7 @@ main(int argc, char **argv) if ((rv = install_new_pkg(argv[i], reinstall)) != 0) goto out; - rv = exec_transaction(yes, show_download_pkglist_url); + rv = exec_transaction(yes, dry_run, show_download_pkglist_url); } else if (strcasecmp(argv[0], "update") == 0) { /* Update an installed package. */ @@ -225,7 +228,7 @@ main(int argc, char **argv) if ((rv = update_pkg(argv[i])) != 0) goto out; - rv = exec_transaction(yes, show_download_pkglist_url); + rv = exec_transaction(yes, dry_run, show_download_pkglist_url); } else if (strcasecmp(argv[0], "remove") == 0) { /* Removes a package. */ @@ -245,7 +248,7 @@ main(int argc, char **argv) rv = EINVAL; goto out; } - rv = exec_transaction(yes, false); + rv = exec_transaction(yes, dry_run, false); } else if (strcasecmp(argv[0], "show") == 0) { /* Shows info about an installed binary package. */ @@ -286,7 +289,7 @@ main(int argc, char **argv) if (argc != 1) usage(); - rv = autoupdate_pkgs(yes, show_download_pkglist_url); + rv = autoupdate_pkgs(yes, dry_run, show_download_pkglist_url); } else if (strcasecmp(argv[0], "show-orphans") == 0) { /* @@ -307,7 +310,7 @@ main(int argc, char **argv) if (argc != 1) usage(); - rv = autoremove_pkgs(yes); + rv = autoremove_pkgs(yes, dry_run); } else if (strcasecmp(argv[0], "reconfigure") == 0) { /* diff --git a/bin/xbps-bin/transaction.c b/bin/xbps-bin/transaction.c index 9b0826b7..26cdadc7 100644 --- a/bin/xbps-bin/transaction.c +++ b/bin/xbps-bin/transaction.c @@ -63,6 +63,24 @@ show_missing_deps(prop_array_t a) } } +static void +show_actions(prop_object_iterator_t iter) +{ + prop_object_t obj; + const char *repoloc, *trans, *pkgname, *version; + + while ((obj = prop_object_iterator_next(iter)) != NULL) { + prop_dictionary_get_cstring_nocopy(obj, "transaction", &trans); + prop_dictionary_get_cstring_nocopy(obj, "pkgname", &pkgname); + prop_dictionary_get_cstring_nocopy(obj, "version", &version); + printf("%s %s %s", pkgname, trans, version); + if (prop_dictionary_get_cstring_nocopy(obj, + "repository", &repoloc)) + printf(" %s", repoloc); + printf("\n"); + } +} + static int show_binpkgs_url(prop_object_iterator_t iter) { @@ -193,7 +211,7 @@ show_transaction_sizes(struct transaction *trans) } int -autoupdate_pkgs(bool yes, bool show_download_pkglist_url) +autoupdate_pkgs(bool yes, bool dry_run, bool show_download_pkglist_url) { int rv = 0; @@ -218,11 +236,11 @@ autoupdate_pkgs(bool yes, bool show_download_pkglist_url) return -1; } } - return exec_transaction(yes, show_download_pkglist_url); + return exec_transaction(yes, dry_run, show_download_pkglist_url); } int -autoremove_pkgs(bool yes) +autoremove_pkgs(bool yes, bool dry_run) { int rv; @@ -236,7 +254,7 @@ autoremove_pkgs(bool yes) return rv; } } - return exec_transaction(yes, false); + return exec_transaction(yes, dry_run, false); } int @@ -325,7 +343,7 @@ remove_pkg(const char *pkgname, bool recursive) } int -exec_transaction(bool yes, bool show_download_urls) +exec_transaction(bool yes, bool dry_run, bool show_download_urls) { prop_array_t mdeps; struct transaction *trans; @@ -359,6 +377,13 @@ exec_transaction(bool yes, bool show_download_urls) strerror(errno)); goto out; } + /* + * dry-run mode, show what would be done but don't run anything. + */ + if (dry_run) { + show_actions(trans->iter); + goto out; + } /* * Only show URLs to download binary packages. */ diff --git a/bin/xbps-bin/xbps-bin.8 b/bin/xbps-bin/xbps-bin.8 index 218592f5..237067bd 100644 --- a/bin/xbps-bin/xbps-bin.8 +++ b/bin/xbps-bin/xbps-bin.8 @@ -1,4 +1,4 @@ -.Dd January 19, 2012 +.Dd February 3, 2012 .Os Void GNU/Linux .Dt xbps-bin 8 .Sh NAME @@ -86,6 +86,17 @@ and .Em update targets and target packages and its required dependencies will be matched. +.It Fl n +Enables dry-run mode. +To show the actions that would be executed in a transaction. +This mode takes effect in the +.Em autoremove , +.Em autoupdate , +.Em install , +.Rm remove +and +.Em update +targets. .It Fl o Ar key Op key2,... Used currently in the .Em show