110 lines
2.3 KiB
Python
110 lines
2.3 KiB
Python
#!/usr/bin/python
|
|
import os
|
|
|
|
created_files = dict()
|
|
node_names = dict()
|
|
|
|
class DesignFile:
|
|
def read_files(self, file):
|
|
lastkey = ""
|
|
for line in file:
|
|
if line == "\n":
|
|
return
|
|
if line[0] == " " and line[1] == " ":
|
|
created_files[lastkey] += [line.strip()]
|
|
created_files[lastkey].sort()
|
|
else:
|
|
lastkey = line.strip()
|
|
created_files.setdefault(lastkey, [])
|
|
|
|
def read_depends(self, file):
|
|
for line in file:
|
|
if line == "\n":
|
|
return;
|
|
else:
|
|
self.depends += line.strip().split()
|
|
|
|
def __init__(self, file):
|
|
self.name = ""
|
|
self.lines = []
|
|
self.depends = []
|
|
self.depend_nodes = set()
|
|
|
|
if file == None:
|
|
return
|
|
self.name = file.rsplit(".", 1)[0]
|
|
f = open("design/%s" % file)
|
|
for line in f:
|
|
if line == "== Files ==\n":
|
|
self.read_files(f)
|
|
elif line == "== Depends ==\n":
|
|
self.read_depends(f)
|
|
else:
|
|
self.lines += [line]
|
|
node_names[self.name] = self
|
|
|
|
|
|
def pump_depends(nodes):
|
|
options = []
|
|
res = None
|
|
for n in nodes:
|
|
if len(n.depend_nodes) == 0:
|
|
options += [ n.name ]
|
|
options.sort()
|
|
res = node_names[ options[0] ]
|
|
nodes.remove(res)
|
|
for n in nodes:
|
|
if res in n.depend_nodes:
|
|
n.depend_nodes.remove(res)
|
|
return res
|
|
|
|
|
|
def resolve_dependencies():
|
|
tmp = set()
|
|
res = []
|
|
|
|
for key, node in node_names.items():
|
|
tmp.add(node)
|
|
for depend in node.depends:
|
|
if depend == "*":
|
|
node.depend_nodes = set(node_names.values())
|
|
else:
|
|
node.depend_nodes.add(node_names[depend])
|
|
node.depend_nodes.discard(node_names[node.name])
|
|
|
|
while len(tmp) > 0:
|
|
res += [ pump_depends(tmp) ]
|
|
return res
|
|
|
|
|
|
def gen_files_list(parsed):
|
|
design = DesignFile(None)
|
|
design.lines += [ "Files:\n"]
|
|
keys = created_files.keys()
|
|
keys.sort()
|
|
for key in keys:
|
|
design.lines += [ " %s\n" % key ]
|
|
for val in created_files[key]:
|
|
design.lines += [ " %s\n" % val ]
|
|
parsed.insert(1, design)
|
|
|
|
|
|
def merge_design(target, source, env):
|
|
files = os.listdir("design/")
|
|
files.sort()
|
|
for file in files:
|
|
if file.endswith(".txt"):
|
|
DesignFile(file)
|
|
node_list = resolve_dependencies()
|
|
gen_files_list(node_list)
|
|
|
|
f = open("design.txt", 'w')
|
|
for index, design in enumerate(node_list):
|
|
if index != 0:
|
|
f.write("\n\n\n")
|
|
for line in design.lines:
|
|
f.write(line)
|
|
|
|
design = Command("design.txt", None, merge_design)
|
|
Alias("design", design)
|