@@ -17,27 +17,39 @@ def __init__(self, program):
17
17
self .program = program
18
18
19
19
def _generate_level (self , levels ):
20
- if len (levels ) == 0 : return []
21
20
level = levels [0 ]
22
- tasks = generate_tasks ('level_' + str (level ), self .program .get_tasks (level ))
21
+ names = set ()
22
+ print ("GENERATE {0}" .format (level ))
23
+
24
+ def flatten (task ):
25
+ if isinstance (task , dict ):
26
+ yield task
27
+ else :
28
+ for t in task :
29
+ for ft in flatten (t ):
30
+ yield ft
31
+
32
+ for task in self .program .get_tasks (level ):
33
+ for t in flatten (task ):
34
+ names .add (t ['basename' ])
35
+ yield t
36
+ mid_name = 'level_' + str (level ) + '_wait'
37
+ done_name = 'level_' + str (level ) + '_done'
38
+ yield { 'basename' : mid_name , 'doc' : None , 'task_dep' : list (names ), 'actions' : ['echo' ] }
39
+ done_deps = [mid_name ]
23
40
if len (levels ) > 1 :
24
- eol_name = 'level_' + str (level ) + '_wait'
25
- tasks .extend (generate_tasks (eol_name , { 'basename' : eol_name , 'task_dep' : [ t .name for t in tasks ], 'actions' : [ ] }))
26
- next_level = levels [1 ]
27
- tasks .append (Task ('level_' + str (next_level ) + '_generate' , None , loader = DelayedLoader (lambda : self ._generate_more (levels [1 :]), executed = 'level_' + str (level ) + '_wait' )))
28
- return tasks
29
-
30
- def _generate_more (self , levels ):
31
- tasks = self ._generate_level (levels )
32
- for t in tasks :
33
- yield t
41
+ gen_name = 'level_' + str (levels [1 ]) + '_done'
42
+ done_deps .append (gen_name )
43
+ yield Task (gen_name , None , loader = DelayedLoader (lambda : self ._generate_level (levels [1 :]), executed = mid_name ))
44
+ yield { 'basename' : done_name , 'doc' : None , 'task_dep' : done_deps , 'actions' : ['echo' ] }
34
45
35
46
def load_tasks (self , cmd , opt_values , pos_args ):
36
47
DOIT_CONFIG = {
37
48
'reporter' : ExecutedOnlyReporter ,
38
49
'outfile' : sys .stderr ,
39
50
}
40
- tasks = self ._generate_level (self .program .get_task_levels ())
51
+ levels = self .program .get_task_levels ()
52
+ tasks = generate_tasks ('level_' + str (levels [0 ]) + '_generate' , self ._generate_level (levels ))
41
53
return tasks , DOIT_CONFIG
42
54
43
55
@@ -67,33 +79,37 @@ def _do_copy(self, source, destination):
67
79
write_content (destination , content )
68
80
69
81
def get_task_levels (self ):
70
- return [1 , 2 , 3 ]
82
+ return [1 , 2 , 3 , 4 ]
71
83
72
- def _create_tasks (self , * files ):
84
+ def _create_tasks (self , basename , * files ):
73
85
for src_file , dst_file in files :
74
86
yield {
75
- 'basename' : 'copy' ,
87
+ 'basename' : basename ,
76
88
'name' : dst_file ,
77
89
'file_dep' : [src_file ],
78
90
'targets' : [dst_file ],
79
91
'actions' : [(self ._do_copy , (src_file , dst_file ))],
92
+ 'clean' : True ,
80
93
}
81
94
82
- def _get_tasks_impl (self , level ):
95
+ def _get_tasks_impl (self , suffix , level ):
83
96
if level == 1 :
84
- yield self ._create_tasks (('1' , 'dest/1.a' ), ('2' , 'dest/2.a' ), ('dest/2.a' , 'dest/2.b' ))
97
+ yield self ._create_tasks ('copy' + suffix , ('1' , 'dest/1.a' ), ('2' , 'dest/2.a' ), ('dest/2.a' , 'dest/2.b' ))
85
98
elif level == 2 :
86
- yield self ._create_tasks (('dest/1.a' , 'dest/1.b' ))
99
+ yield self ._create_tasks ('copy' + suffix , ('dest/1.a' , 'dest/1.b' ), ( '2' , 'dest/2.e ' ))
87
100
elif level == 3 :
88
- yield self ._create_tasks (('1' , 'dest/1.c' ), ('dest/2.b' , 'dest/2.c' ))
101
+ yield self ._create_tasks ('copy' + suffix , ('1' , 'dest/1.c' ), ('dest/2.b' , 'dest/2.c' ))
102
+ elif level == 4 :
103
+ yield self ._create_tasks ('copy' + suffix , ('dest/1.c' , 'dest/1.d' ), ('dest/2.d' , 'dest/2.f' ), ('dest/2.c' , 'dest/2.d' ))
89
104
90
105
def get_tasks (self , level ):
106
+ suffix = '_' + str (level )
91
107
yield {
92
- 'basename' : 'copy' ,
108
+ 'basename' : 'copy' + suffix ,
93
109
'name' : None ,
94
110
'doc' : 'Copies modified or non-existing files over' ,
95
111
}
96
- yield self ._get_tasks_impl (level )
112
+ yield self ._get_tasks_impl (suffix , level )
97
113
98
114
def get_all_tasks (self ):
99
115
yield {
@@ -102,7 +118,7 @@ def get_all_tasks(self):
102
118
'doc' : 'Copies modified or non-existing files over' ,
103
119
}
104
120
for level in self .get_task_levels ():
105
- yield self ._get_tasks_impl (level )
121
+ yield self ._get_tasks_impl ('' , level )
106
122
107
123
108
124
def main (args = None ):
@@ -111,11 +127,15 @@ def main(args=None):
111
127
112
128
113
129
if __name__ == "__main__" :
130
+ #sys.exit(main(['clean']))
114
131
try :
132
+ pass
115
133
shutil .rmtree ('dest' , True )
116
134
except :
117
135
pass
118
136
os .mkdir ('dest' )
119
137
write_content ('1' , 'bla' )
120
138
write_content ('2' , 'bla' )
121
- sys .exit (main (['run' , '-n' , '4' , '-P' , 'thread' ]))
139
+ #sys.exit(main(['list']))
140
+ sys .exit (main (['run' , '-v' , '2' ]))
141
+ #sys.exit(main(['run', '-n', '4', '-v', '2', '-P', 'thread']))
0 commit comments