summaryrefslogtreecommitdiff
path: root/simplejenkinsapi
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2012-09-22 01:27:34 +0100
committerLars Wirzenius <liw@liw.fi>2012-09-22 01:27:34 +0100
commite47633bdc9d4ce23085a7be244736e4de7e7481e (patch)
treeae3089cf4e3f2f768394afed5bef4ced46370414 /simplejenkinsapi
parent9d59fc1b04a8e7983a40321dfc56721fb49640d5 (diff)
downloadjenkinstool-e47633bdc9d4ce23085a7be244736e4de7e7481e.tar.gz
Fix build ordering
Diffstat (limited to 'simplejenkinsapi')
-rw-r--r--simplejenkinsapi/order.py30
1 files changed, 24 insertions, 6 deletions
diff --git a/simplejenkinsapi/order.py b/simplejenkinsapi/order.py
index 9973977..02fdf14 100644
--- a/simplejenkinsapi/order.py
+++ b/simplejenkinsapi/order.py
@@ -16,25 +16,43 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+def _traverse(project, result):
+ for dep in project['_']:
+ _traverse(dep, result)
+ if project not in result:
+ result.append(project)
+ return result
+
+
+def _roots(projects):
+ '''Return list of projects that are not build dependencies of anyone.'''
+
+ roots = projects[:]
+ for project in projects:
+ roots = [r for r in roots if r not in project['_']]
+ return roots
+
+
def order(projects):
by_name = {}
for project in projects:
by_name[project['name']] = project
for project in projects:
- project['_'] = [by_name[dep['name']]
- for dep in project.get('build-depends, [])]
+ project['_'] = [by_name[dep]
+ for dep in project.get('build-depends', [])]
+
+ roots = _roots(projects)
linear = []
- for project in projects:
- linear.extend(project['_'])
- linear.append(project)
+ for project in roots:
+ _traverse(project, linear)
result = []
while linear:
project = linear.pop(0)
if project not in linear:
result.append(project)
-
+
return result