From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id B43433858422; Wed, 8 Feb 2023 20:06:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B43433858422 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1675886783; bh=NgkTSZ1oR19vzWJ3ceP22zvnGaQJdVuMjEE27vMavdc=; h=From:To:Subject:Date:From; b=JNSul/MxQqcZvwEJNmfazZSvmwfetpPgstsDwvaFkHLl37MKWXIR2lcXd9bmxca3Z MqSOE16ARt1WfC1gIXszGSXqg+09A+W/yqQTESFCYCWCHyudc9v5xj5efIiFHzafZ8 hodtrFCvIGgZHogc6I0t5jzIse1rRAz+vM9Bnaok= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin/main] Cygwin: cygcheck: add dependency output X-Act-Checkin: newlib-cygwin X-Git-Author: Corinna Vinschen X-Git-Refname: refs/heads/main X-Git-Oldrev: a022a8efd73011cc6047f06de12a3e83f29c799b X-Git-Newrev: 2a683f84a1da3d7b35fe595c64dc81e88100a511 Message-Id: <20230208200623.B43433858422@sourceware.org> Date: Wed, 8 Feb 2023 20:06:23 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3D2a683f84a1d= a3d7b35fe595c64dc81e88100a511 commit 2a683f84a1da3d7b35fe595c64dc81e88100a511 Author: Corinna Vinschen AuthorDate: Wed Feb 8 21:05:18 2023 +0100 Commit: Corinna Vinschen CommitDate: Wed Feb 8 21:05:18 2023 +0100 Cygwin: cygcheck: add dependency output =20 -e --requires search packages depending on packages given as PATTERN -e --build-reqs search packages with build dependency matching PATTERN =20 -i --depends print dependencies -i --build-deps print build dependencies (if available) =20 Signed-off-by: Corinna Vinschen Diff: --- winsup/doc/utils.xml | 34 ++++++-- winsup/utils/mingw/cygcheck.cc | 171 ++++++++++++++++++++++++++++++-------= ---- 2 files changed, 153 insertions(+), 52 deletions(-) diff --git a/winsup/doc/utils.xml b/winsup/doc/utils.xml index 8e698ac4c1fa..1e15a4d56895 100644 --- a/winsup/doc/utils.xml +++ b/winsup/doc/utils.xml @@ -134,6 +134,8 @@ cygcheck -e + --requires + --build-reqs PATTERN= @@ -143,6 +145,8 @@ --curr --prev --test + --deps + --build-deps PATTERN= @@ -187,14 +191,22 @@ At least one command option or a PROGRAM is required,= as shown above. plain console only, not from a pty/rxvt/xterm) -e, --search-package list all available packages matching PATTERN PATTERN is a glob pattern with * and ? as wildcard = chars + search selection specifiers (multiple allowed):\n\ + --requires list packages depending on packages matching PATTERN + --build-reqs list packages depending on packages matching PATTERN + when building these packages + only the most recent available releases are checked + to collect requirements info -i, --info-package print full info on packages matching PATTERN, insta= lled - and available packages + and available releases PATTERN is a glob pattern with * and ? as wildcard = chars info selection specifiers (multiple allowed): - --inst only print info on installed package - --curr only print info on most recent available package - --prev only print info on older, but still available pack= ages - --test only print info on test packages + --inst only print info on installed package release + --curr only print info on most recent available release + --prev only print info on older, still available releases + --test only print info on test releases + --deps additionally print package dependencies + --build-deps additionally print package build dependencies -f, --find-package find the package to which FILE belongs -l, --list-package list contents of PACKAGE (or all packages if none g= iven) -p, --package-query search for REGEXP in the entire cygwin.com package @@ -248,7 +260,10 @@ Notes: packages in the Cygwin distribution. PATTERN is a glob pattern, using * and ? as wildcard characters, just as in filename patterns. PATTERN is searched for in - the package name and the summary of a package. + the package name and the summary of a package. + The --requires and --build-reqs + options allow to search for packages which have a certain dependency, + either at runtime or at build time. The -i option prints a lot of information available for installed packages, as well as for available packages in the Cygwin distribution. PATTERN is a glob @@ -259,7 +274,9 @@ Notes: --curr, --prev, and --test, allow to specify that only information in terms of installed, current latest available, older available, - as well as test packages respectively, is requested. + as well as test packages respectively, is requested. + The --deps and --build-deps + options allow to print additional dependency information. =20 Example <command>cygcheck</command= > -e/-i @@ -273,7 +290,7 @@ pdfgrep : Command-line utility for searching text in PD= Fs pdfgrep-debuginfo : Debug info for pdfgrep sgrep : Search indexed text regions like SGML,XML and HTML files =20 -$ cygcheck -i --curr grep +$ cygcheck -i --curr --deps grep Latest available package: ------------------------- =20 @@ -283,6 +300,7 @@ Release : 2 Architecture: x86_64 Size : 401340 (392 K) Source : grep-3.8-2-src.tar.xz +Dependencies: bash, cygwin, libintl8, libpcre2_8_0 Summary : search for regular expression matches in text files Description : GNU grep searches one or more input files for lines containing a diff --git a/winsup/utils/mingw/cygcheck.cc b/winsup/utils/mingw/cygcheck.cc index e5d0d6aec5e6..bdab6e2718ed 100644 --- a/winsup/utils/mingw/cygcheck.cc +++ b/winsup/utils/mingw/cygcheck.cc @@ -57,12 +57,19 @@ int grep_packages =3D 0; int info_packages =3D 0; int info_selector =3D 0; int search_packages =3D 0; +int search_selector =3D 0; int del_orphaned_reg =3D 0; =20 #define INFO_INST 0x01 #define INFO_CURR 0x02 #define INFO_PREV 0x04 #define INFO_TEST 0x08 +#define INFO_ALL 0x0f +#define INFO_DEPS 0x10 +#define INFO_BLDDEPS 0x20 + +#define SRCH_REQS 0x40 +#define SRCH_BLDREQS 0x80 =20 static char emptystr[] =3D ""; =20 @@ -2335,7 +2342,7 @@ collect_quoted_string (char *&tgt, FILE *fp, char *bu= f, size_t size, size_t offs } =20 static ini_package_info * -collect_pkg_info (FILE *fp, ini_package_info *pi) +collect_pkg_info (FILE *fp, ini_package_info *pi, bool search) { vers_info *vinfo =3D &pi->curr; char buf[4096]; @@ -2413,9 +2420,40 @@ collect_pkg_info (FILE *fp, ini_package_info *pi) else if (!strncmp (buf, "source: ", strlen ("source: "))) vinfo->source =3D strdup (buf + strlen ("source: ")); else if (!strncmp (buf, "depends2: ", strlen ("depends2: "))) - vinfo->depends2 =3D strdup (buf + strlen ("depends2: ")); - else if (!strncmp (buf, "build-depends: ", strlen ("build-depends: "))) - vinfo->build_depends =3D strdup (buf + strlen ("build-depends: ")); + { + if (!search) + vinfo->depends2 =3D strdup (buf + strlen ("depends2: ")); + else + { + /* For pattern matching we need a standarized format. + Make sure all deps are prepended by a space and all deps + are trailed by a comma. Note the missing space, that's + deliberate to keep it in the stored string. */ + char *start =3D buf + strlen ("depends2:"); + size_t len =3D strlen (start); + + vinfo->depends2 =3D (char *) calloc (len + 2, 1); + if (vinfo->depends2) + *stpcpy (vinfo->depends2, start) =3D ','; + } + } + else if (!strncmp (buf, "build-depends: ", + strlen ("build-depends: "))) + { + if (!search) + vinfo->build_depends =3D strdup (buf + + strlen ("build-depends: ")); + else + { + /* Ditto */ + char *start =3D buf + strlen ("build-depends:"); + size_t len =3D strlen (start); + + vinfo->build_depends =3D (char *) calloc (len + 2, 1); + if (vinfo->build_depends) + *stpcpy (vinfo->build_depends, start) =3D ','; + } + } } } return pi; @@ -2446,7 +2484,7 @@ human_readable (char *buf, size_t bytes) } =20 static void -package_info_print (ini_package_info *pi, vers_info *vers) +package_info_print (ini_package_info *pi, vers_info *vers, int selector) { char buf[4096]; =20 @@ -2511,12 +2549,10 @@ package_info_print (ini_package_info *pi, vers_info= *vers) printf ("Source : %s\n", cp + 1); } } -#if 0 /* FIXME: needs CLI options */ - if (vers->depends2) + if ((selector & INFO_DEPS) && vers->depends2) printf ("Dependencies: %s\n", vers->depends2); - if (vers->build_depends) + if ((selector & INFO_BLDDEPS) && vers->build_depends) printf ("Build Deps : %s\n", vers->build_depends); -#endif if (pi->sdesc) printf ("Summary : %s\n", pi->sdesc); if (pi->url) @@ -2592,15 +2628,15 @@ package_info (char **search, int selector) if (!fp) return 1; =20 - if (selector =3D=3D 0) - selector =3D INFO_CURR | INFO_PREV | INFO_TEST | INFO_INST; + if ((selector & INFO_ALL) =3D=3D 0) + selector =3D INFO_ALL; =20 inst_pkgs =3D get_installed_packages (NULL, &inst_pkg_count); =20 while (search && *search) { rewind (fp); - while ((pi =3D collect_pkg_info (fp, &pi_buf))) + while ((pi =3D collect_pkg_info (fp, &pi_buf, false))) { pkgver pv =3D { pi->name, NULL }, *inst_pkg =3D NULL; bool avail_installed =3D false; @@ -2680,26 +2716,26 @@ package_info (char **search, int selector) inst_pi.license =3D pi->license; inst_pi.curr.version =3D inst_pkg->ver; inst_pi.curr.install_date =3D install_ts; - package_info_print (&inst_pi, &pi->curr); + package_info_print (&inst_pi, &pi->curr, selector); } else { if (pi->curr.installed) { pi->curr.install_date =3D install_ts; - package_info_print (pi, &pi->curr); + package_info_print (pi, &pi->curr, selector); } for (size_t i =3D 0; i < pi->prev_count; ++i) if (pi->prev[i].installed) { pi->prev[i].install_date =3D install_ts; - package_info_print (pi, pi->prev + i); + package_info_print (pi, pi->prev + i, selector); } for (size_t i =3D 0; i < pi->test_count; ++i) if (pi->test[i].installed) { pi->test[i].install_date =3D install_ts; - package_info_print (pi, pi->test + i); + package_info_print (pi, pi->test + i, selector); } } } @@ -2711,7 +2747,7 @@ package_info (char **search, int selector) { puts ("Latest available package:\n" "-------------------------\n"); - package_info_print (pi, &pi->curr); + package_info_print (pi, &pi->curr, selector); } if (selector & INFO_PREV) { @@ -2724,7 +2760,7 @@ package_info (char **search, int selector) ? "" : "Older available packages:\n" "-------------------------\n\n"); - package_info_print (pi, pi->prev + i); + package_info_print (pi, pi->prev + i, selector); } } if (selector & INFO_TEST) @@ -2738,7 +2774,7 @@ package_info (char **search, int selector) ? "" : "Available test packages:\n" "------------------------\n\n"); - package_info_print (pi, pi->test + i); + package_info_print (pi, pi->test + i, selector); } } } @@ -2750,9 +2786,10 @@ package_info (char **search, int selector) return 0; } =20 -/* Search for the search string in name and sdesc of available packages. */ +/* Search for the search string in name and sdesc of available packages. + The selector is used to search for dependencies. */ static int -package_search (char **search) +package_search (char **search, int selector) { FILE *fp =3D maybe_download_setup_ini (); ini_package_info pi_buf, *pi; @@ -2763,18 +2800,40 @@ package_search (char **search) =20 while (search && *search) { - ext_search =3D (char *) malloc (strlen (*search) + 3); + rewind (fp); + + ext_search =3D (char *) malloc (strlen (*search) + 5); ep =3D ext_search; - if (*(search)[0] !=3D '*') - *ep++ =3D '*'; - ep =3D stpcpy (ep, *search); - if (ep[-1] !=3D '*') - stpcpy (ep, "*"); + if (selector) + { + ep =3D stpcpy (ep, "* "); + ep =3D stpcpy (ep, *search); + ep =3D stpcpy (ep, ",*"); + } + else + { + if (*(search)[0] !=3D '*') + *ep++ =3D '*'; + ep =3D stpcpy (ep, *search); + if (ep[-1] !=3D '*') + stpcpy (ep, "*"); + } =20 - rewind (fp); - while ((pi =3D collect_pkg_info (fp, &pi_buf))) + while ((pi =3D collect_pkg_info (fp, &pi_buf, true))) { - if (PathMatchSpecA (pi->name, ext_search) + /* Skip debuginfo packages */ + if (PathMatchSpecA (pi->name, "*-debuginfo")) + continue; + if (selector) + { + /* search only curr version info for the dependency */ + if (((selector & SRCH_REQS) && pi->curr.depends2 + && PathMatchSpecA (pi->curr.depends2, ext_search)) + || ((selector & SRCH_BLDREQS) && pi->curr.build_depends + && PathMatchSpecA (pi->curr.build_depends, ext_search))) + printf ("%s : %s\n", pi->name, pi->sdesc); + } + else if (PathMatchSpecA (pi->name, ext_search) || (pi->sdesc && PathMatchSpecA (pi->sdesc, ext_search))) printf ("%s : %s\n", pi->name, pi->sdesc); free_pkg_info (&pi_buf); @@ -2837,34 +2896,42 @@ At least one command option or a PROGRAM is require= d, as shown above.\n\ \n\ PROGRAM list library (DLL) dependencies of PROGRAM\n\ -c, --check-setup show installed version of PACKAGE and verify integr= ity\n\ - (or for all installed packages if none specified)\n\ + (or for all installed packages if none specified)\n\ -d, --dump-only just list packages, do not verify (with -c)\n\ -s, --sysinfo produce diagnostic system information (implies -c)\= n\ -r, --registry also scan registry for Cygwin settings (with -s)\n\ -k, --keycheck perform a keyboard check session (must be run from = a\n\ - plain console only, not from a pty/rxvt/xterm)\n\ + plain console only, not from a pty/rxvt/xterm)\n\ -e, --search-package list all available packages matching PATTERN\n\ PATTERN is a glob pattern with * and ? as wildcard = chars\n\ + search selection specifiers (multiple allowed):\n\ + --requires list packages depending on packages matching PATTER= N\n\ + --build-reqs list packages depending on packages matching PATTER= N\n\ + when building these packages\n\ + only the most recent available releases are checked= \n\ + to collect requirements info\n\ -i, --info-package print full info on packages matching PATTERN, insta= lled\n\ - and available packages\n\ + and available releases\n\ PATTERN is a glob pattern with * and ? as wildcard = chars\n\ info selection specifiers (multiple allowed):\n\ - --inst only print info on installed package\n\ - --curr only print info on most recent available package\n\ - --prev only print info on older, but still available pack= ages\n\ - --test only print info on test packages\n\ + --inst only print info on installed package release\n\ + --curr only print info on most recent available release\n\ + --prev only print info on older, still available releases\= n\ + --test only print info on test releases\n\ + --deps additionally print package dependencies\n\ + --build-deps additionally print package build dependencies\n\ -f, --find-package find the installed package to which FILE belongs\n\ -l, --list-package list contents of the installed PACKAGE (or all\n\ installed packages if none given)\n\ -p, --package-query search for REGEXP in the entire cygwin.com package\= n\ - repository (requires internet connectivity)\n\ + repository (requires internet connectivity)\n\ --delete-orphaned-installation-keys\n\ - Delete installation keys of old, now unused\n\ - installations from the registry. Requires the right\n\ - to change the registry.\n\ + Delete installation keys of old, now unused\n\ + installations from the registry. Requires the righ= t\n\ + to change the registry.\n\ -v, --verbose produce more verbose output\n\ -h, --help annotate output with explanatory comments when give= n\n\ - with another command, otherwise print this help\n\ + with another command, otherwise print this help\n\ -V, --version print the version of cygcheck and exit\n\ \n\ Notes:\n\ @@ -2890,6 +2957,10 @@ struct option longopts[] =3D { {"curr", no_argument, NULL, 0x1002}, {"prev", no_argument, NULL, 0x1004}, {"test", no_argument, NULL, 0x1008}, + {"deps", no_argument, NULL, 0x1010}, + {"build-deps", no_argument, NULL, 0x1020}, + {"requires", no_argument, NULL, 0x1040}, + {"build-reqs", no_argument, NULL, 0x1080}, {"search-packages", no_argument, NULL, 'e'}, {"package-query", no_argument, NULL, 'p'}, {"delete-orphaned-installation-keys", no_argument, NULL, CO_DELETE_KEYS}, @@ -3028,11 +3099,17 @@ main (int argc, char **argv) case 0x1002: case 0x1004: case 0x1008: - info_selector |=3D (i & 0xf); + case 0x1010: + case 0x1020: + info_selector |=3D (i & 0x3f); break; case 'e': search_packages =3D 1; break; + case 0x1040: + case 0x1080: + search_selector |=3D (i & 0xc0); + break; case 'p': grep_packages =3D 1; break; @@ -3081,6 +3158,12 @@ main (int argc, char **argv) + info_packages + search_packages > 1) usage (stderr, 1); =20 + if (!info_packages && info_selector) + usage (stderr, 1); + + if (!search_packages && search_selector) + usage (stderr, 1); + if (keycheck) return check_keys (); if (del_orphaned_reg) @@ -3090,7 +3173,7 @@ main (int argc, char **argv) if (info_packages) return package_info (argv, info_selector); if (search_packages) - return package_search (argv); + return package_search (argv, search_selector); =20 init_paths ();