Skip to content

Instantly share code, notes, and snippets.

@eruffaldi
Created September 27, 2016 23:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eruffaldi/d883b88bb4cb0988fbe0ad8f683ddc7a to your computer and use it in GitHub Desktop.
Save eruffaldi/d883b88bb4cb0988fbe0ad8f683ddc7a to your computer and use it in GitHub Desktop.
#!/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