diff --git a/tools/roslaunch/resources/example.launch b/tools/roslaunch/resources/example.launch index 6b07bc5eff..0c389bf0ca 100644 --- a/tools/roslaunch/resources/example.launch +++ b/tools/roslaunch/resources/example.launch @@ -59,4 +59,15 @@ + + + + + + + + + + + diff --git a/tools/roslaunch/src/roslaunch/depends.py b/tools/roslaunch/src/roslaunch/depends.py index 2cb8a75af2..967bdaac74 100644 --- a/tools/roslaunch/src/roslaunch/depends.py +++ b/tools/roslaunch/src/roslaunch/depends.py @@ -45,6 +45,7 @@ import rospkg +from .loader import convert_value from .substitution_args import resolve_args NAME="roslaunch-deps" @@ -94,20 +95,16 @@ def _get_arg_value(tag, context): else: raise RoslaunchDepsException("No value for arg [%s]"%(name)) -def _parse_arg(tag, context): - name = tag.attributes['name'].value +def _check_ifunless(tag, context): if tag.attributes.has_key('if'): val = resolve_args(tag.attributes['if'].value, context) - if val == '1' or val == 'true': - return (name, _get_arg_value(tag, context)) - elif tag.attributes.has_key('unless'): + if not convert_value(val, 'bool'): + return False + if tag.attributes.has_key('unless'): val = resolve_args(tag.attributes['unless'].value, context) - if val == '0' or val == 'false': - return (name, _get_arg_value(tag, context)) - else: - return (name, _get_arg_value(tag, context)) - # nothing to return (no value, or conditional wasn't satisfied) - return None + if convert_value(val, 'bool'): + return False + return True def _parse_subcontext(tags, context): subcontext = {'arg': {}} @@ -116,12 +113,8 @@ def _parse_subcontext(tags, context): return subcontext for tag in [t for t in tags if t.nodeType == DomNode.ELEMENT_NODE]: - if tag.tagName == 'arg': - # None is returned for args with if/unless that evaluate to false - ret = _parse_arg(tag, context) - if ret is not None: - (name, val) = ret - subcontext['arg'][name] = val + if tag.tagName == 'arg' and _check_ifunless(tag, context): + subcontext['arg'][tag.attributes['name'].value] = _get_arg_value(tag, context) return subcontext def _parse_launch(tags, launch_file, file_deps, verbose, context): @@ -130,6 +123,8 @@ def _parse_launch(tags, launch_file, file_deps, verbose, context): # process group, include, node, and test tags from launch file for tag in [t for t in tags if t.nodeType == DomNode.ELEMENT_NODE]: + if not _check_ifunless(tag, context): + continue if tag.tagName == 'group': @@ -137,11 +132,17 @@ def _parse_launch(tags, launch_file, file_deps, verbose, context): _parse_launch(tag.childNodes, launch_file, file_deps, verbose, context) elif tag.tagName == 'arg': - v = _parse_arg(tag, context) - if v: - (name, val) = v - context['arg'][name] = val + context['arg'][tag.attributes['name'].value] = _get_arg_value(tag, context) + elif tag.tagName == 'include': + if tag.attributes.has_key('if'): + val = resolve_args(tag.attributes['if'].value, context) + if not convert_value(val, 'bool'): + continue + elif tag.attributes.has_key('unless'): + val = resolve_args(tag.attributes['unless'].value, context) + if convert_value(val, 'bool'): + continue try: sub_launch_file = resolve_args(tag.attributes['file'].value, context) except KeyError as e: @@ -165,7 +166,7 @@ def _parse_launch(tags, launch_file, file_deps, verbose, context): if sub_launch_file not in file_deps[launch_file].includes: file_deps[launch_file].includes.append(sub_launch_file) - if launch_file_pkg != sub_pkg: + if launch_file_pkg != sub_pkg: file_deps[launch_file].pkgs.append(sub_pkg) # recurse