Simplifying the toposort method used for sorting dependencies. The new version imposes an arbitrary sort order for circular dependencies (instead of bombing out). The merge script now uses this new toposort. Tools only commit.
git-svn-id: http://svn.openlayers.org/trunk/openlayers@11006 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -44,6 +44,10 @@ import sys
|
||||
SUFFIX_JAVASCRIPT = ".js"
|
||||
|
||||
RE_REQUIRE = "@requires:? (.*)\n" # TODO: Ensure in comment?
|
||||
|
||||
class MissingImport(Exception):
|
||||
"""Exception raised when a listed import is not found in the lib."""
|
||||
|
||||
class SourceFile:
|
||||
"""
|
||||
Represents a Javascript source code file.
|
||||
@@ -161,8 +165,6 @@ def run (sourceDirectory, outputFilename = None, configFile = None):
|
||||
|
||||
files = {}
|
||||
|
||||
order = [] # List of filepaths to output, in a dependency satisfying order
|
||||
|
||||
## Import file source code
|
||||
## TODO: Do import when we walk the directories above?
|
||||
for filepath in allFiles:
|
||||
@@ -179,41 +181,31 @@ def run (sourceDirectory, outputFilename = None, configFile = None):
|
||||
resolution_pass = 1
|
||||
|
||||
while not complete:
|
||||
order = [] # List of filepaths to output, in a dependency satisfying order
|
||||
nodes = []
|
||||
routes = []
|
||||
complete = True
|
||||
|
||||
## Resolve the dependencies
|
||||
print "Resolution pass %s... " % resolution_pass
|
||||
resolution_pass += 1
|
||||
|
||||
for filepath, info in files.items():
|
||||
nodes.append(filepath)
|
||||
for neededFilePath in info.requires:
|
||||
routes.append((neededFilePath, filepath))
|
||||
|
||||
for dependencyLevel in toposort(nodes, routes):
|
||||
for filepath in dependencyLevel:
|
||||
order.append(filepath)
|
||||
if not files.has_key(filepath):
|
||||
print "Importing: %s" % filepath
|
||||
fullpath = os.path.join(sourceDirectory, filepath).strip()
|
||||
content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
|
||||
files[filepath] = SourceFile(filepath, content) # TODO: Chop path?
|
||||
|
||||
|
||||
|
||||
# Double check all dependencies have been met
|
||||
complete = True
|
||||
try:
|
||||
for fp in order:
|
||||
if max([order.index(rfp) for rfp in files[fp].requires] +
|
||||
[order.index(fp)]) != order.index(fp):
|
||||
for path in info.requires:
|
||||
if not files.has_key(path):
|
||||
complete = False
|
||||
except:
|
||||
complete = False
|
||||
fullpath = os.path.join(sourceDirectory, path).strip()
|
||||
if os.path.exists(fullpath):
|
||||
print "Importing: %s" % path
|
||||
content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
|
||||
files[path] = SourceFile(path, content) # TODO: Chop path?
|
||||
else:
|
||||
raise MissingImport("File '%s' not found (required by '%s')." % (path, filepath))
|
||||
|
||||
print
|
||||
# create dictionary of dependencies
|
||||
dependencies = {}
|
||||
for filepath, info in files.items():
|
||||
dependencies[filepath] = info.requires
|
||||
|
||||
print "Sorting..."
|
||||
order = toposort(dependencies) #[x for x in toposort(dependencies)]
|
||||
|
||||
## Move forced first and last files to the required position
|
||||
if cfg:
|
||||
|
||||
Reference in New Issue
Block a user