Created
September 27, 2016 23:19
-
-
Save eruffaldi/d883b88bb4cb0988fbe0ad8f683ddc7a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# | |
# Catking Subfolders creator => FOCUS | |
# Emanuele Ruffaldi @ SSSA 2016 | |
import argparse | |
import xml.etree.ElementTree as ET | |
import os,sys | |
known = "catkin,roscpp,cmake_modules,geometry_msgs,tf,message_generation,urdf,xacro,message_runtime,std_msgs,std_srvs" | |
def commonpath(path1,path2): | |
p1 = path1.split(os.sep) | |
p2 = path2.split(os.sep) | |
same = True | |
for i in range(0,min(len(p1),len(p2))): | |
if p1[i] != p2[i]: | |
same = False | |
break | |
if same: | |
# different length | |
if len(p1) == len(p2): | |
return common,".","." | |
elif len(p1) > len(p2): | |
i+=1 | |
common = os.sep.join(p2) | |
a2b = os.sep.join([".." for j in range(0,len(p1)-i)]) | |
b2a = os.sep.join([".." for j in range(0,len(p2)-i)]+p1[i:]) | |
else: | |
i+=1 | |
common = os.sep.join(p1) | |
a2b = os.sep.join([".." for j in range(0,len(p1)-i)]+p2[i:]) | |
b2a = os.sep.join([".." for j in range(0,len(p2)-i)]) | |
else: | |
common = os.sep.join(p1[0:i]) | |
a2b = os.sep.join([".." for j in range(0,len(p1)-i)]+p2[i:]) | |
b2a = os.sep.join([".." for j in range(0,len(p2)-i)]+p1[i:]) | |
return common,a2b,b2a | |
def getpackdeps(path): | |
# look into package.xml | |
# buildtool_depend | |
# build_depend | |
# run_depend | |
tree = ET.parse(path) | |
root = tree.getroot() | |
r = set() | |
for x in root.iter('buildtool_depend'): | |
r.add(x.text) | |
for x in root.iter('build_depend'): | |
r.add(x.text) | |
for x in root.iter('run_depend'): | |
r.add(x.text) | |
return r | |
def getpacks(root): | |
# direct if contains package.xml | |
z ={} | |
pf = os.path.join(root,"package.xml") | |
if os.path.isfile(pf): | |
z[os.path.split(root)[1]]= getpackdeps(pf) | |
else: | |
z | |
for l in os.listdir(root): | |
fp = os.path.join(root,l) | |
if os.path.isdir(fp): | |
z.update(getpacks(fp)) # ignore conflicts | |
return z | |
#if __name__ == '__main__': | |
# import sys | |
# print commonpath(os.path.abspath(sys.argv[1]),os.path.abspath(sys.argv[2])) | |
if __name__ == '__main__': | |
#TODO: support multiple full paths | |
parser = argparse.ArgumentParser(description='Process some integers.') | |
parser.add_argument('package',nargs='+',help='needed packages') | |
parser.add_argument('--full',help='full source base with all packages') | |
parser.add_argument('--dest',default="src",help='destination path') | |
parser.add_argument('--simulate',action="store_true") | |
parser.add_argument('--abs',action="store_true",help="abs paths") | |
args = parser.parse_args() | |
args.full = os.path.abspath(args.full) | |
args.dest = os.path.abspath(args.dest) | |
common,a2b,b2a = commonpath(args.full,args.dest) | |
deps = getpacks(args.full) | |
if not os.path.isdir(args.full): | |
os.mkdir(args.full) | |
done = set() | |
ds = set() | |
todo = set(args.package) | |
while len(todo) > 0: | |
p = todo.pop() | |
done.add(p) | |
if os.path.isdir(os.path.join(args.full,p)): | |
if not args.abs: | |
sp = os.path.join(b2a,p) | |
else: | |
sp = os.path.join(args.full,p) | |
dp = os.path.join(args.dest,p) | |
if args.simulate: | |
print "symlink",sp,dp | |
else: | |
os.symlink(sp,dp) | |
todo = todo | (deps.get(p,ds)-done) | |
for p in done: | |
needed = deps.get(p,ds)-done | |
if len(needed) > 0: | |
print p,"externals: ",",".join(list(needed)) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment