removing roscreate-stack
This commit is contained in:
parent
5e46e3800e
commit
e1b702bc14
|
@ -1,35 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# Software License Agreement (BSD License)
|
||||
#
|
||||
# Copyright (c) 2008, Willow Garage, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of Willow Garage, Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import roscreate
|
||||
roscreate.roscreatestack.roscreatestack_main()
|
|
@ -35,4 +35,3 @@
|
|||
|
||||
import roscreate.core
|
||||
import roscreate.roscreatepkg
|
||||
import roscreate.roscreatestack
|
||||
|
|
|
@ -1,218 +0,0 @@
|
|||
# Software License Agreement (BSD License)
|
||||
#
|
||||
# Copyright (c) 2009, Willow Garage, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of Willow Garage, Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Revision $Id$
|
||||
|
||||
"""
|
||||
Implements the roscreate-stack tool.
|
||||
|
||||
The focus of this module is on supporting the command-line tool. The
|
||||
code API of this module is *not* stable.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
NAME='roscreate-stack'
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
import rospkg
|
||||
|
||||
from roscreate.core import read_template, author_name, print_warning
|
||||
from rospkg import on_ros_path
|
||||
|
||||
def get_templates():
|
||||
"""
|
||||
:returns: mapping of file names to templates to instantiate, ``{str: str}``
|
||||
"""
|
||||
templates = {}
|
||||
templates['stack.xml'] = read_template('stack.tmpl')
|
||||
templates['CMakeLists.txt'] = read_template('CMakeLists.stack.tmpl')
|
||||
templates['Makefile'] = read_template('Makefile.stack.tmpl')
|
||||
return templates
|
||||
|
||||
def instantiate_template(template, stack, brief, description, author, depends, licenses, review):
|
||||
"""
|
||||
:returns: template instantiated with properties, ``str``
|
||||
"""
|
||||
return template%locals()
|
||||
|
||||
def _update_depends(depends):
|
||||
# TODO: this logic is rather pointless now that it no longer leverages .toxml(). Needs to be rewritten
|
||||
print("UPDATE DEPENDS", depends)
|
||||
new_depends = []
|
||||
for name, pkgs in depends.iteritems():
|
||||
annotation = ', '.join(set(pkgs))
|
||||
new_depends.append((name, annotation))
|
||||
new_depends.sort(lambda x, y: -1 if x[0] < y[0] else 1)
|
||||
return ''.join([' <depend stack="%s" /> <!-- %s -->\n'%(name, annotation) for name, annotation in new_depends])
|
||||
|
||||
def create_stack(stack, stack_dir, stack_manifest, author, depends, licenses, show_deps):
|
||||
"""
|
||||
:param stack: name of stack, ``str``
|
||||
:param stack_dir: path to stack, ``str``
|
||||
:param stack_manifest: existing stack manifest or ``None``, ``StackManifest``
|
||||
:param author: name of stack maintainer. Overrides stack_manifest, ``str``
|
||||
:param depends: map of stack name to packages that use that stack. Overrides stack_manifest, ``{str: [str]}``
|
||||
:param licenses: list of licenses present in stack, ``set(str)``
|
||||
"""
|
||||
|
||||
if show_deps:
|
||||
print(''.join([' <depend stack="%s"/> <!-- %s --> \n'%(s, ', '.join(set(pkgs))) for s, pkgs in depends.iteritems()]))
|
||||
return
|
||||
|
||||
# load existing properties
|
||||
if stack_manifest is not None:
|
||||
try:
|
||||
licenses.update([l.strip() for l in stack_manifest.license.split(',')])
|
||||
except: pass
|
||||
brief = stack_manifest.brief or stack
|
||||
description = stack_manifest.description
|
||||
review = ' <review status="%s" notes="%s"/>'%(stack_manifest.status, stack_manifest.notes)
|
||||
else:
|
||||
stack_manifest = rospkg.manifest.Manifest(type_='stack')
|
||||
brief = description = stack
|
||||
review = ' <review status="unreviewed" notes=""/>'
|
||||
|
||||
licenses = ','.join(licenses)
|
||||
depends = _update_depends(depends)
|
||||
|
||||
p = os.path.abspath(stack_dir)
|
||||
if not os.path.exists(p):
|
||||
print("Creating stack directory", p)
|
||||
os.makedirs(p)
|
||||
|
||||
templates = get_templates()
|
||||
for filename, template in templates.iteritems():
|
||||
contents = instantiate_template(template, stack, brief, description, author, depends, licenses, review)
|
||||
p = os.path.abspath(os.path.join(stack_dir, filename))
|
||||
if not os.path.exists(filename) or filename == 'stack.xml':
|
||||
print("Creating stack file", p)
|
||||
with open(p, 'w') as f:
|
||||
f.write(contents.encode('utf-8'))
|
||||
print("\nPlease edit %s/stack.xml to finish creating your stack"%stack)
|
||||
|
||||
def compute_stack_depends_and_licenses(stack_dir):
|
||||
"""
|
||||
:returns: depends, licenses, ``{str: [str]}, [str]``
|
||||
:raises: :exc:`rospkg.ResourceNotFound`
|
||||
"""
|
||||
stack = os.path.basename(os.path.abspath(stack_dir))
|
||||
if os.path.exists(stack_dir):
|
||||
# create scoped rospack in the directory just to list packages that are there
|
||||
rospack = rospkg.RosPack(ros_paths=[os.path.abspath(stack_dir)])
|
||||
packages = rospack.list()
|
||||
depends, licenses = _compute_stack_depends_and_licenses(stack, packages)
|
||||
else:
|
||||
depends = dict()
|
||||
licenses = ['BSD']
|
||||
# add in bare ros dependency into any stack as an implicit depend
|
||||
# TODO: hopefully remove during Fuerte dev cycle if we can make
|
||||
# ROS build system a sysdep
|
||||
if not 'ros' in depends and stack != 'ros':
|
||||
depends['ros'] = []
|
||||
return depends, licenses
|
||||
|
||||
def _compute_stack_depends_and_licenses(stack, packages):
|
||||
pkg_depends = []
|
||||
licenses = []
|
||||
stack_depends = {}
|
||||
rospack = rospkg.RosPack()
|
||||
for pkg in packages:
|
||||
m = rospack.get_manifest(pkg)
|
||||
pkg_depends.extend(rospack.get_depends(pkg, implicit=False))
|
||||
licenses.extend([l.strip() for l in m.license.split(',')])
|
||||
|
||||
for pkg in pkg_depends:
|
||||
if pkg in packages:
|
||||
continue
|
||||
try:
|
||||
st = rospack.stack_of(pkg)
|
||||
except rospkg.ResourceNotFound:
|
||||
print_warning("WARNING: cannot locate package [%s], which is a dependency in the [%s] stack"%(pkg, stack))
|
||||
continue
|
||||
if not st:
|
||||
print_warning("WARNING: stack depends on [%s], which is not in a stack"%pkg)
|
||||
continue
|
||||
if st == stack:
|
||||
continue
|
||||
if not st in stack_depends:
|
||||
stack_depends[st] = []
|
||||
stack_depends[st].append(pkg)
|
||||
|
||||
return stack_depends, set(licenses)
|
||||
|
||||
def roscreatestack_main():
|
||||
from optparse import OptionParser
|
||||
parser = OptionParser(usage="usage: %prog <path-to-stack>", prog=NAME)
|
||||
parser.add_option("--show-deps",
|
||||
dest="show_deps", default=False,
|
||||
action="store_true",
|
||||
help="show stack dependencies, instead of generating stack.xml")
|
||||
options, args = parser.parse_args()
|
||||
if not args:
|
||||
parser.error("you must specify the path to a stack")
|
||||
stack_dir = args[0]
|
||||
stack = os.path.basename(os.path.abspath(stack_dir))
|
||||
|
||||
if not on_ros_path(stack_dir):
|
||||
print("ERROR: roscreate-stack only work in directories on your ROS_PACKAGE_PATH\nPlease update your ROS_PACKAGE_PATH environment variable.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
depends, licenses = compute_stack_depends_and_licenses(stack_dir)
|
||||
except rospkg.ResourceNotFound as e:
|
||||
print("Cannot find resource: %s"%str(e), file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# defaults
|
||||
stack_manifest = None
|
||||
author = "Maintained by %s"%author_name()
|
||||
|
||||
if not options.show_deps:
|
||||
# Check for existing stack.xml
|
||||
stack_xml_path = os.path.join(stack_dir, 'stack.xml')
|
||||
if os.path.exists(stack_xml_path):
|
||||
import shutil
|
||||
stack_xml_path_bak = os.path.join(stack_dir, 'stack.xml.bak')
|
||||
print('Backing up existing stack.xml to %s'%(stack_xml_path_bak))
|
||||
shutil.copyfile(stack_xml_path, stack_xml_path_bak)
|
||||
|
||||
try:
|
||||
# load existing stack.xml properties (soft fail if there are issues with existing file)
|
||||
stack_manifest = rospkg.manifest.parse_manifest_file(stack_dir, rospkg.STACK_FILE)
|
||||
author = stack_manifest.author
|
||||
except:
|
||||
pass
|
||||
|
||||
create_stack(stack, stack_dir, stack_manifest, author, depends, licenses, options.show_deps)
|
|
@ -1,98 +0,0 @@
|
|||
# Software License Agreement (BSD License)
|
||||
#
|
||||
# Copyright (c) 2009, Willow Garage, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of Willow Garage, Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
import rospkg
|
||||
|
||||
def get_test_path():
|
||||
return os.path.abspath(os.path.join(os.path.dirname(__file__), 'fake-pkg'))
|
||||
|
||||
class RoscreateStackTest(unittest.TestCase):
|
||||
|
||||
def test_command_line(self):
|
||||
from subprocess import Popen, PIPE
|
||||
from rospkg import get_ros_root
|
||||
# ros has no deps. this test is also a tripwire for crasher bug
|
||||
output = Popen(['roscreate-stack', get_ros_root(), '--show-deps'], stdout=PIPE, stderr=PIPE).communicate()
|
||||
self.assertEquals('', output[0].strip())
|
||||
self.assertEquals('', output[1].strip())
|
||||
|
||||
# go into fake environment
|
||||
d = get_test_path()
|
||||
# manipulate our environment as roscreate-stack is dependent on this
|
||||
os.environ['ROS_PACKAGE_PATH'] = d
|
||||
stack1 = os.path.join(d, 'stack1')
|
||||
stack2 = os.path.join(d, 'stack2')
|
||||
|
||||
output = Popen(['roscreate-stack', stack1, '--show-deps'], stdout=PIPE, stderr=PIPE).communicate()
|
||||
self.assertEquals('<depend stack="ros"/> <!-- roslib -->', output[0].strip())
|
||||
self.assertEquals('', output[1].strip())
|
||||
|
||||
output = Popen(['roscreate-stack', stack2, '--show-deps'], stdout=PIPE, stderr=PIPE).communicate()
|
||||
self.assert_('<depend stack="ros"/>' in output[0], output[0])
|
||||
self.assert_('<depend stack="stack1"/>' in output[0], output[0])
|
||||
self.assertEquals(2, len(output[0].strip().split('\n')))
|
||||
self.assertEquals('', output[1].strip())
|
||||
|
||||
def test_compute_stack_depends_and_licenses(self):
|
||||
# this will catch only the most basic of bugs. the issue here is
|
||||
# that the test can't assume the existence of other stacks, so we
|
||||
# need to create an artificial tree
|
||||
|
||||
from roscreate.roscreatestack import compute_stack_depends_and_licenses
|
||||
|
||||
d = get_test_path()
|
||||
print "TEST PATH", d
|
||||
# manipulate our environment as roscreate-stack is dependent on this
|
||||
os.environ['ROS_PACKAGE_PATH'] = d
|
||||
stack1 = os.path.join(d, 'stack1')
|
||||
stack2 = os.path.join(d, 'stack2')
|
||||
|
||||
# test on stack1
|
||||
depends, licenses = compute_stack_depends_and_licenses(stack1)
|
||||
self.assertEquals(['ros'], depends.keys())
|
||||
self.assertEquals(['roslib'], depends['ros'])
|
||||
self.assertEquals(set(['BSD']), licenses)
|
||||
|
||||
d2, licenses = compute_stack_depends_and_licenses(stack2)
|
||||
self.assertEquals(set(['ros', 'stack1']), set(d2.keys()))
|
||||
self.assertEquals(['depends_roslib'], d2['stack1'])
|
||||
self.assertEquals(set(['BSD']), licenses)
|
||||
|
||||
|
||||
# test on ros_root
|
||||
depends, licenses = compute_stack_depends_and_licenses(os.environ['ROS_ROOT'])
|
||||
self.assertEquals({}, depends)
|
||||
self.assert_('BSD' in licenses)
|
Loading…
Reference in New Issue