public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin/main] Cygwin: cygcheck: add dependency output
@ 2023-02-08 20:06 Corinna Vinschen
  0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2023-02-08 20:06 UTC (permalink / raw)
  To: cygwin-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=2a683f84a1da3d7b35fe595c64dc81e88100a511

commit 2a683f84a1da3d7b35fe595c64dc81e88100a511
Author:     Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Wed Feb 8 21:05:18 2023 +0100
Commit:     Corinna Vinschen <corinna@vinschen.de>
CommitDate: Wed Feb 8 21:05:18 2023 +0100

    Cygwin: cygcheck: add dependency output
    
    -e --requires   search packages depending on packages given as PATTERN
    -e --build-reqs search packages with build dependency matching PATTERN
    
    -i --depends    print dependencies
    -i --build-deps print build dependencies (if available)
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

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 @@
 	<cmdsynopsis>
 	  <command>cygcheck</command>
 	  <arg choice="plain">-e</arg>
+	  <arg>--requires</arg>
+	  <arg>--build-reqs</arg>
 	  <arg choice="plain" rep="repeat"><replaceable>PATTERN</replaceable></arg>
 	</cmdsynopsis>
 	<cmdsynopsis>
@@ -143,6 +145,8 @@
 	  <arg>--curr</arg>
 	  <arg>--prev</arg>
 	  <arg>--test</arg>
+	  <arg>--deps</arg>
+	  <arg>--build-deps</arg>
 	  <arg choice="plain" rep="repeat"><replaceable>PATTERN</replaceable></arg>
 	</cmdsynopsis>
 	<cmdsynopsis>
@@ -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, installed
-                       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 packages
-      --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 given)
   -p, --package-query  search for REGEXP in the entire cygwin.com package
@@ -248,7 +260,10 @@ Notes:
       packages in the Cygwin distribution.  <literal>PATTERN</literal> is
       a glob pattern, using * and ? as wildcard characters, just as in
       filename patterns.  <literal>PATTERN</literal> is searched for in
-      the package name and the summary of a package.</para>
+      the package name and the summary of a package.
+      The <literal>--requires</literal> and <literal>--build-reqs</literal>
+      options allow to search for packages which have a certain dependency,
+      either at runtime or at build time.</para>
     <para> The <literal>-i</literal> option prints a lot of information
       available for installed packages, as well as for available packages
       in the Cygwin distribution.  <literal>PATTERN</literal> is a glob
@@ -259,7 +274,9 @@ Notes:
       <literal>--curr</literal>, <literal>--prev</literal>, and
       <literal>--test</literal>, allow to specify that only information
       in terms of installed, current latest available, older available,
-      as well as test packages respectively, is requested.</para>
+      as well as test packages respectively, is requested.
+      The <literal>--deps</literal> and <literal>--build-deps</literal>
+      options allow to print additional dependency information.</para>
 
     <example
       id="utils-cygcheck-eiex"><title>Example <command>cygcheck</command> -e/-i
@@ -273,7 +290,7 @@ pdfgrep : Command-line utility for searching text in PDFs
 pdfgrep-debuginfo : Debug info for pdfgrep
 sgrep : Search indexed text regions like SGML,XML and HTML files
 
-$ cygcheck -i --curr grep
+$ cygcheck -i --curr --deps grep
 Latest available package:
 -------------------------
 
@@ -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 = 0;
 int info_packages = 0;
 int info_selector = 0;
 int search_packages = 0;
+int search_selector = 0;
 int del_orphaned_reg = 0;
 
 #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
 
 static char emptystr[] = "";
 
@@ -2335,7 +2342,7 @@ collect_quoted_string (char *&tgt, FILE *fp, char *buf, size_t size, size_t offs
 }
 
 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 = &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 = strdup (buf + strlen ("source: "));
 	  else if (!strncmp (buf, "depends2: ", strlen ("depends2: ")))
-	    vinfo->depends2 = strdup (buf + strlen ("depends2: "));
-	  else if (!strncmp (buf, "build-depends: ", strlen ("build-depends: ")))
-	    vinfo->build_depends = strdup (buf + strlen ("build-depends: "));
+	    {
+	      if (!search)
+		vinfo->depends2 = 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 = buf + strlen ("depends2:");
+		  size_t len = strlen (start);
+
+		  vinfo->depends2 = (char *) calloc (len + 2, 1);
+		  if (vinfo->depends2)
+		    *stpcpy (vinfo->depends2, start) = ',';
+		}
+	    }
+	  else if (!strncmp (buf, "build-depends: ",
+			     strlen ("build-depends: ")))
+	    {
+	      if (!search)
+		vinfo->build_depends = strdup (buf
+					       + strlen ("build-depends: "));
+	      else
+		{
+		  /* Ditto */
+		  char *start = buf + strlen ("build-depends:");
+		  size_t len = strlen (start);
+
+		  vinfo->build_depends = (char *) calloc (len + 2, 1);
+		  if (vinfo->build_depends)
+		    *stpcpy (vinfo->build_depends, start) = ',';
+		}
+	    }
 	}
     }
   return pi;
@@ -2446,7 +2484,7 @@ human_readable (char *buf, size_t bytes)
 }
 
 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];
 
@@ -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;
 
-  if (selector == 0)
-    selector = INFO_CURR | INFO_PREV | INFO_TEST | INFO_INST;
+  if ((selector & INFO_ALL) == 0)
+    selector = INFO_ALL;
 
   inst_pkgs = get_installed_packages (NULL, &inst_pkg_count);
 
   while (search && *search)
     {
       rewind (fp);
-      while ((pi = collect_pkg_info (fp, &pi_buf)))
+      while ((pi = collect_pkg_info (fp, &pi_buf, false)))
 	{
 	  pkgver pv = { pi->name, NULL }, *inst_pkg = NULL;
 	  bool avail_installed = false;
@@ -2680,26 +2716,26 @@ package_info (char **search, int selector)
 		  inst_pi.license = pi->license;
 		  inst_pi.curr.version = inst_pkg->ver;
 		  inst_pi.curr.install_date = 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 = install_ts;
-		      package_info_print (pi, &pi->curr);
+		      package_info_print (pi, &pi->curr, selector);
 		    }
 		  for (size_t i = 0; i < pi->prev_count; ++i)
 		    if (pi->prev[i].installed)
 		      {
 			pi->prev[i].install_date = install_ts;
-			package_info_print (pi, pi->prev + i);
+			package_info_print (pi, pi->prev + i, selector);
 		      }
 		  for (size_t i = 0; i < pi->test_count; ++i)
 		    if (pi->test[i].installed)
 		      {
 			pi->test[i].install_date = 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;
 }
 
-/* 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 = maybe_download_setup_ini ();
   ini_package_info pi_buf, *pi;
@@ -2763,18 +2800,40 @@ package_search (char **search)
 
   while (search && *search)
     {
-      ext_search = (char *) malloc (strlen (*search) + 3);
+      rewind (fp);
+
+      ext_search = (char *) malloc (strlen (*search) + 5);
       ep = ext_search;
-      if (*(search)[0] != '*')
-	*ep++ = '*';
-      ep = stpcpy (ep, *search);
-      if (ep[-1] != '*')
-	stpcpy (ep, "*");
+      if (selector)
+	{
+	  ep = stpcpy (ep, "* ");
+	  ep = stpcpy (ep, *search);
+	  ep = stpcpy (ep, ",*");
+	}
+      else
+	{
+	  if (*(search)[0] != '*')
+	    *ep++ = '*';
+	  ep = stpcpy (ep, *search);
+	  if (ep[-1] != '*')
+	    stpcpy (ep, "*");
+	}
 
-      rewind (fp);
-      while ((pi = collect_pkg_info (fp, &pi_buf)))
+      while ((pi = 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 required, as shown above.\n\
 \n\
   PROGRAM              list library (DLL) dependencies of PROGRAM\n\
   -c, --check-setup    show installed version of PACKAGE and verify integrity\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 PATTERN\n\
+      --build-reqs     list packages depending on packages matching PATTERN\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, installed\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 packages\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 right\n\
+                       to change the registry.\n\
   -v, --verbose        produce more verbose output\n\
   -h, --help           annotate output with explanatory comments when given\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[] = {
   {"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 |= (i & 0xf);
+      case 0x1010:
+      case 0x1020:
+	info_selector |= (i & 0x3f);
 	break;
       case 'e':
 	search_packages = 1;
 	break;
+      case 0x1040:
+      case 0x1080:
+	search_selector |= (i & 0xc0);
+	break;
       case 'p':
 	grep_packages = 1;
 	break;
@@ -3081,6 +3158,12 @@ main (int argc, char **argv)
       + info_packages + search_packages > 1)
     usage (stderr, 1);
 
+  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);
 
   init_paths ();

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-08 20:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-08 20:06 [newlib-cygwin/main] Cygwin: cygcheck: add dependency output Corinna Vinschen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).