add roscd, rosls support (#210)
* Add roscd, rosls support (#16) * refactor findpath.py, remove error msg from ros_location_find * rename findpath.py to rosfindpath.py
This commit is contained in:
parent
28b5778712
commit
496184db95
|
@ -8,6 +8,9 @@ install(FILES rosbash rosfish rostcsh roszsh
|
|||
if (WIN32)
|
||||
install(PROGRAMS scripts/rosrun.bat
|
||||
DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION})
|
||||
|
||||
install(PROGRAMS scripts/rosfindpath.py scripts/roscd.bat scripts/rosls.bat
|
||||
DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION})
|
||||
else()
|
||||
install(PROGRAMS scripts/rosrun
|
||||
DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION})
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
@echo off
|
||||
|
||||
if "%1" equ "--help" goto :usage
|
||||
if not "%2" equ "" goto :usage
|
||||
|
||||
if "%1" equ "" (
|
||||
if not "%ROS_WORKSPACE%" equ "" (
|
||||
cd /d %ROS_WORKSPACE%
|
||||
exit /b 0
|
||||
)
|
||||
|
||||
if not "%CMAKE_PREFIX_PATH%" equ "" (
|
||||
for %%a in ("%CMAKE_PREFIX_PATH:;=";"%") do (
|
||||
if exist %%a\.catkin (
|
||||
cd /d %%a
|
||||
exit /b 0
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
echo Neither ROS_WORKSPACE is set nor a catkin workspace is listed in CMAKE_PREFIX_PATH. Please set ROS_WORKSPACE or source a catkin workspace to use roscd with no arguments.
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
for /f "tokens=*" %%g in ('call python %~dp0\findpath.py %1 forceeval') do (
|
||||
set target_path=%%~g
|
||||
)
|
||||
|
||||
if /i "%target_path:~0,7%"=="Error: " (
|
||||
echo roscd: %target_path:~7%
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
if "%target_path%" equ "" (
|
||||
if not "%ROS_WORKSPACE%" equ "" (
|
||||
cd /d %ROS_WORKSPACE%
|
||||
exit /b 0
|
||||
)
|
||||
|
||||
echo No ROS_WORKSPACE set. Please set ROS_WORKSPACE to use roscd with no arguments.
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
cd /d "%target_path%"
|
||||
exit /b 0
|
||||
|
||||
:usage
|
||||
echo usage: roscd package
|
||||
echo.
|
||||
echo.
|
||||
echo Jump to target package.
|
||||
exit /b 0
|
|
@ -0,0 +1,79 @@
|
|||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
ROS_CACHE_TIMEOUT_ENV_NAME = 'ROS_CACHE_TIMEOUT'
|
||||
ROS_LOCATIONS_ENV_NAME = 'ROS_LOCATIONS'
|
||||
ROS_LOCATION_SEP = ';'
|
||||
ERROR_PREFIX = 'Error: '
|
||||
|
||||
def ros_location_find(package_name):
|
||||
# process ROS_LOCATION and return if found
|
||||
ros_location = os.environ.get(ROS_LOCATIONS_ENV_NAME)
|
||||
if ros_location is not None:
|
||||
locations = ros_location.split(ROS_LOCATION_SEP)
|
||||
for loc in locations:
|
||||
index = loc.find('=')
|
||||
if index != -1:
|
||||
if package_name == loc[:index]:
|
||||
return 0, loc[index + 1:]
|
||||
|
||||
if package_name == 'log':
|
||||
p = subprocess.Popen('roslaunch-logs', stdout=subprocess.PIPE)
|
||||
result_location = p.communicate()[0].strip()
|
||||
result_code = p.returncode
|
||||
return result_code, result_location if result_code == 0 else ''
|
||||
|
||||
if package_name == 'test_results':
|
||||
p = subprocess.Popen('rosrun.bat rosunit test_results_dir.py', stdout=subprocess.PIPE)
|
||||
result_location = p.communicate()[0].strip()
|
||||
result_code = p.returncode
|
||||
return result_code, result_location if result_code == 0 else ''
|
||||
|
||||
# process package_name and return
|
||||
env = os.environ
|
||||
env[ROS_CACHE_TIMEOUT_ENV_NAME] = '-1.0'
|
||||
p = subprocess.Popen(['rospack', 'find', package_name], stdout=subprocess.PIPE)
|
||||
result_location = p.communicate()[0].strip()
|
||||
result_code = p.returncode
|
||||
if result_code == 0:
|
||||
return result_code, result_location
|
||||
|
||||
p = subprocess.Popen(['rosstack', 'find', package_name], stdout=subprocess.PIPE)
|
||||
result_location = p.communicate()[0].strip()
|
||||
result_code = p.returncode
|
||||
if result_code == 0:
|
||||
return result_code, result_location
|
||||
|
||||
# package <package_name> not found
|
||||
return result_code, ''
|
||||
|
||||
# takes as argument either just a package-path or just a pkgname
|
||||
# returns 0 for no argument or if package (+ path) exist, 1 else
|
||||
# on success with arguments print result_path or Error: error message
|
||||
def findpathmain(argv):
|
||||
reldir = ''
|
||||
parameters = os.path.normpath(argv[0]).split(os.path.sep)
|
||||
package_name = parameters[0]
|
||||
if len(parameters) > 1:
|
||||
reldir = os.path.sep.join(parameters[1:])
|
||||
else:
|
||||
if len(argv) < 2 or argv[1] != 'forceeval':
|
||||
print(ERROR_PREFIX + '[' + package_name + '] is not a valid argument!', file=sys.stderr)
|
||||
return 1
|
||||
|
||||
error_code, package_dir = ros_location_find(package_name)
|
||||
if error_code != 0:
|
||||
print(ERROR_PREFIX + '[' + package_name + '] not found!', file=sys.stderr)
|
||||
return error_code
|
||||
else:
|
||||
rosdir = os.path.normpath(os.path.sep.join([package_dir, reldir]))
|
||||
print(rosdir)
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 2:
|
||||
sys.exit(1)
|
||||
sys.exit(findpathmain(sys.argv[1:]))
|
|
@ -0,0 +1,21 @@
|
|||
@echo off
|
||||
|
||||
if "%1" equ "--help" goto :usage
|
||||
for /f "tokens=*" %%g in ('call python %~dp0\findpath.py %1 forceeval') do (
|
||||
set target_path=%%~g
|
||||
)
|
||||
|
||||
if /i "%target_path:~0,7%"=="Error: " (
|
||||
echo rosls: %target_path:~7%
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
dir "%target_path%"
|
||||
exit /b 0
|
||||
|
||||
:usage
|
||||
echo usage: rosls [package]
|
||||
echo.
|
||||
echo.
|
||||
echo Lists contents of a package directory.
|
||||
exit /b 0
|
Loading…
Reference in New Issue