[systemd-devel] [PATCH 3/3] analyze: change behaviour of combined --to/from--pattern

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Fri Feb 13 15:53:26 PST 2015


We would require a match against all three: patterns specified
with --to, with --from, and as positional arguments to show an
edge. This does not seem useful. Let instead the positional args
behave like they were specified in both --to and --from, which is
fairly intuitive and should be more useful.
---
 man/systemd-analyze.xml | 23 ++++++++++++++++-------
 src/analyze/analyze.c   | 20 +++++++++++++++-----
 2 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/man/systemd-analyze.xml b/man/systemd-analyze.xml
index 61315a0d89..1ff81d3d5a 100644
--- a/man/systemd-analyze.xml
+++ b/man/systemd-analyze.xml
@@ -227,13 +227,22 @@
 
         <listitem><para>When used in conjunction with the
         <command>dot</command> command (see above), this selects which
-        relationships are shown in the dependency graph. They both
-        require
+        relationships are shown in the dependency graph. Both options
+        require a
         <citerefentry><refentrytitle>glob</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-        patterns as arguments, which are matched against left-hand and
-        right-hand, respectively, nodes of a relationship. Each of
-        these can be used more than once, which means a unit name must
-        match one of the given values.</para></listitem>
+        pattern as an argument, which will be matched against the
+        left-hand and the right-hand, respectively, nodes of a
+        relationship.</para>
+
+        <para>Each of these can be used more than once, in which case
+        the unit name must match one of the values. When tests for
+        both sides of the relation are present, a relation must pass
+        both tests to be shown. When patterns are also specified as
+        positional arguments, they must match at least one side of the
+        relation. In other words, patterns specified with those two
+        options will trim the list of edges matched by the positional
+        arguments, if any are given, and fully determine the list of
+        edges shown otherwise.</para></listitem>
       </varlistentry>
 
       <varlistentry>
@@ -252,7 +261,7 @@
         <term><option>--no-man</option></term>
 
         <listitem><para>Do not invoke man to verify the existence of
-        man pages listen in <varname>Documentation=</varname>.
+        man pages listed in <varname>Documentation=</varname>.
         </para></listitem>
       </varlistentry>
 
diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c
index 672a0d7976..1e2a6bbf25 100644
--- a/src/analyze/analyze.c
+++ b/src/analyze/analyze.c
@@ -974,24 +974,34 @@ static int graph_one_property(sd_bus *bus, const UnitInfo *u, const char* prop,
         _cleanup_strv_free_ char **units = NULL;
         char **unit;
         int r;
+        bool match_patterns;
 
         assert(u);
         assert(prop);
         assert(color);
 
+        match_patterns = strv_fnmatch(u->id, patterns, 0);
+
+        if (!strv_isempty(arg_dot_from_patterns) &&
+            !match_patterns &&
+            !strv_fnmatch(u->id, arg_dot_from_patterns, 0))
+                        return 0;
+
         r = bus_get_unit_property_strv(bus, u->unit_path, prop, &units);
         if (r < 0)
                 return r;
 
         STRV_FOREACH(unit, units) {
-                if (!strv_fnmatch_or_empty(u->id, arg_dot_from_patterns, 0))
-                        continue;
+                bool match_patterns2;
+
+                match_patterns2 = strv_fnmatch(*unit, patterns, 0);
 
-                if (!strv_fnmatch_or_empty(*unit, arg_dot_to_patterns, 0))
+                if (!strv_isempty(arg_dot_to_patterns) &&
+                    !match_patterns2 &&
+                    !strv_fnmatch(*unit, arg_dot_to_patterns, 0))
                         continue;
 
-                if (!strv_fnmatch_or_empty(u->id, patterns, 0) &&
-                    !strv_fnmatch_or_empty(*unit, patterns, 0))
+                if (!strv_isempty(patterns) && !match_patterns && !match_patterns2)
                         continue;
 
                 printf("\t\"%s\"->\"%s\" [color=\"%s\"];\n", u->id, *unit, color);
-- 
2.1.0



More information about the systemd-devel mailing list