summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-02-13 18:38:33 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-02-16 13:16:46 -0500
commit6ecb6cec66739d733e95302031998f517261380c (patch)
tree3ea4c1e6008dc76e714913d1c9cee11de83d2176
parentee5de57b9d474161df259e7faa958fa9d7bbd736 (diff)
analyze: change behaviour of combined --to/from--pattern
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.
-rw-r--r--man/systemd-analyze.xml23
-rw-r--r--src/analyze/analyze.c20
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);