import os
[docs]class PackageMap(object):
def __init__(self):
self.map = {}
[docs] def addPackageDir(self, path):
packageName = os.path.basename(path)
if packageName:
self.addPackage(packageName, path)
[docs] def addPackage(self, packageName, path):
if packageName in self.map:
print 'warning, skipping package path:', path
print 'existing package path:', packageName, self.map[packageName]
return
self.map[packageName] = path
[docs] def printPackageMap(self):
for package, path in self.map.iteritems():
print package, path
[docs] def getPath(self, packageName):
return self.map.get(packageName)
[docs] def populateFromSearchPaths(self, paths):
if isinstance(paths, str):
paths = [paths]
packagePaths = []
for path in paths:
for root, dirnames, filenames in os.walk(path):
if os.path.isfile(os.path.join(root, 'package.xml')) or os.path.isfile(os.path.join(root, 'manifest.xml')):
packagePaths.append(root)
for path in packagePaths:
self.addPackageDir(path)
[docs] def populateFromEnvironment(self, environmentVariables):
searchPaths = []
for varName in environmentVariables:
searchPaths.extend(os.environ.get(varName, '').split(':'))
self.populateFromSearchPaths(searchPaths)
@staticmethod
[docs] def isPackageUrl(filename):
return filename.lower().startswith('package://')
[docs] def resolveFilename(self, filename):
if not self.isPackageUrl(filename):
return None
relPath = filename[10:]
try:
idx = relPath.index('/')
packageName = relPath[:idx]
relPath = relPath[idx+1:]
except:
print 'failed to parse package filename:', filename
return None
packagePath = self.getPath(packageName)
if not packagePath:
print 'failed to resolve filename, unknown package:', filename
return None
return os.path.join(packagePath, relPath)
[docs]def test():
m = PackageMap()
assert m.getPath('bar') is None
m.addPackageDir('/home/user/bar')
assert m.getPath('bar') == '/home/user/bar'
path = '/tmp/package_test/foo'
packageFile = os.path.join(path, 'package.xml')
if not os.path.isfile(packageFile):
if not os.path.isdir(path):
os.makedirs(path)
open(packageFile, 'w').close()
os.environ['TEST_PACKAGE'] = '/tmp/package_test'
m.populateFromEnvironment(['TEST_PACKAGE'])
assert m.getPath('foo') == '/tmp/package_test/foo'
assert m.resolveFilename('package://foo/bar.obj') == '/tmp/package_test/foo/bar.obj'
m.printPackageMap()
if __name__ == '__main__':
test()