diff options
author | Lars Wirzenius <liw@liw.fi> | 2012-09-22 01:27:34 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2012-09-22 01:27:34 +0100 |
commit | e47633bdc9d4ce23085a7be244736e4de7e7481e (patch) | |
tree | ae3089cf4e3f2f768394afed5bef4ced46370414 /simplejenkinsapi | |
parent | 9d59fc1b04a8e7983a40321dfc56721fb49640d5 (diff) | |
download | jenkinstool-e47633bdc9d4ce23085a7be244736e4de7e7481e.tar.gz |
Fix build ordering
Diffstat (limited to 'simplejenkinsapi')
-rw-r--r-- | simplejenkinsapi/order.py | 30 |
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 |