Mercurial > bitten > bitten-test
annotate bitten/queue.py @ 893:ed77e3e1c43f
BuildConfig may be `None` when checking to see if build should be deleted. Fix + test, closes #666.
author | osimons |
---|---|
date | Tue, 08 Mar 2011 03:19:17 +0000 |
parents | dfbf2f857a50 |
children | 0cf576cea845 |
rev | line source |
---|---|
379 | 1 # -*- coding: utf-8 -*- |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
2 # |
832 | 3 # Copyright (C) 2007-2010 Edgewall Software |
408
933105ab516b
Update file headers and other stuff pointing to the old home.
cmlenz
parents:
400
diff
changeset
|
4 # Copyright (C) 2005-2007 Christopher Lenz <cmlenz@gmx.de> |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
5 # All rights reserved. |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
6 # |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
7 # This software is licensed as described in the file COPYING, which |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
8 # you should have received as part of this distribution. The terms |
408
933105ab516b
Update file headers and other stuff pointing to the old home.
cmlenz
parents:
400
diff
changeset
|
9 # are also available at http://bitten.edgewall.org/wiki/License. |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
10 |
313 | 11 """Implements the scheduling of builds for a project. |
12 | |
13 This module provides the functionality for scheduling builds for a specific | |
14 Trac environment. It is used by both the build master and the web interface to | |
15 get the list of required builds (revisions not built yet). | |
16 | |
411
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
17 Furthermore, the `BuildQueue` class is used by the build master to determine |
313 | 18 the next pending build, and to match build slaves against configured target |
19 platforms. | |
20 """ | |
21 | |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
22 from itertools import ifilter |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
23 import re |
419
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
24 import time |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
25 |
585
87de4513bfdd
0.6dev: Cleaning remaining 'frontend' datetime code - at least down to all code that interface with the various `model` classes that still only works with timestamps for input and output. See #85.
osimons
parents:
581
diff
changeset
|
26 from trac.util.datefmt import to_timestamp |
762
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
27 from trac.util import pretty_timedelta, format_datetime |
745
91aabd647610
Delete attachments when builds are cancelled/invalidated.
wbell
parents:
650
diff
changeset
|
28 from trac.attachment import Attachment |
91aabd647610
Delete attachments when builds are cancelled/invalidated.
wbell
parents:
650
diff
changeset
|
29 |
585
87de4513bfdd
0.6dev: Cleaning remaining 'frontend' datetime code - at least down to all code that interface with the various `model` classes that still only works with timestamps for input and output. See #85.
osimons
parents:
581
diff
changeset
|
30 |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
31 from bitten.model import BuildConfig, TargetPlatform, Build, BuildStep |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
32 |
411
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
33 __docformat__ = 'restructuredtext en' |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
34 |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
35 |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
253
diff
changeset
|
36 def collect_changes(repos, config, db=None): |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
37 """Collect all changes for a build configuration that either have already |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
38 been built, or still need to be built. |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
39 |
411
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
40 This function is a generator that yields ``(platform, rev, build)`` tuples, |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
41 where ``platform`` is a `TargetPlatform` object, ``rev`` is the identifier |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
42 of the changeset, and ``build`` is a `Build` object or `None`. |
313 | 43 |
411
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
44 :param repos: the version control repository |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
45 :param config: the build configuration |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
46 :param db: a database connection (optional) |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
47 """ |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
48 env = config.env |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
253
diff
changeset
|
49 if not db: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
253
diff
changeset
|
50 db = env.get_db_cnx() |
395
37e30696c0a8
Don't raise an exception when the repository node associated with a build config has been since removed.
cmlenz
parents:
392
diff
changeset
|
51 try: |
883
dfbf2f857a50
Fixed handling of active configurations that points to deleted branches.
osimons
parents:
832
diff
changeset
|
52 node = repos.get_node(config.path, config.max_rev) |
581
2cc06425117a
0.6dev: Handle any error accessing a repository node. Closes #416.
osimons
parents:
513
diff
changeset
|
53 except Exception, e: |
2cc06425117a
0.6dev: Handle any error accessing a repository node. Closes #416.
osimons
parents:
513
diff
changeset
|
54 env.log.warn('Error accessing path %r for configuration %r', |
2cc06425117a
0.6dev: Handle any error accessing a repository node. Closes #416.
osimons
parents:
513
diff
changeset
|
55 config.path, config.name, exc_info=True) |
395
37e30696c0a8
Don't raise an exception when the repository node associated with a build config has been since removed.
cmlenz
parents:
392
diff
changeset
|
56 return |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
57 |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
58 for path, rev, chg in node.get_history(): |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
59 |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
60 # Don't follow moves/copies |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
61 if path != repos.normalize_path(config.path): |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
62 break |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
63 |
231
4a9cf87d443f
Allow the build queue for a configuration to be limited to a range between `min_rev` and `max_rev`.
cmlenz
parents:
228
diff
changeset
|
64 # Stay within the limits of the build config |
4a9cf87d443f
Allow the build queue for a configuration to be limited to a range between `min_rev` and `max_rev`.
cmlenz
parents:
228
diff
changeset
|
65 if config.min_rev and repos.rev_older_than(rev, config.min_rev): |
4a9cf87d443f
Allow the build queue for a configuration to be limited to a range between `min_rev` and `max_rev`.
cmlenz
parents:
228
diff
changeset
|
66 break |
4a9cf87d443f
Allow the build queue for a configuration to be limited to a range between `min_rev` and `max_rev`.
cmlenz
parents:
228
diff
changeset
|
67 if config.max_rev and repos.rev_older_than(config.max_rev, rev): |
4a9cf87d443f
Allow the build queue for a configuration to be limited to a range between `min_rev` and `max_rev`.
cmlenz
parents:
228
diff
changeset
|
68 continue |
4a9cf87d443f
Allow the build queue for a configuration to be limited to a range between `min_rev` and `max_rev`.
cmlenz
parents:
228
diff
changeset
|
69 |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
70 # Make sure the repository directory isn't empty at this |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
71 # revision |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
72 old_node = repos.get_node(path, rev) |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
73 is_empty = True |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
74 for entry in old_node.get_entries(): |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
75 is_empty = False |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
76 break |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
77 if is_empty: |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
78 continue |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
79 |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
80 # For every target platform, check whether there's a build |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
81 # of this revision |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
253
diff
changeset
|
82 for platform in TargetPlatform.select(env, config.name, db=db): |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
253
diff
changeset
|
83 builds = list(Build.select(env, config.name, rev, platform.id, |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
253
diff
changeset
|
84 db=db)) |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
85 if builds: |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
86 build = builds[0] |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
87 else: |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
88 build = None |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
89 |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
90 yield platform, rev, build |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
91 |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
92 |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
93 class BuildQueue(object): |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
94 """Enapsulates the build queue of an environment. |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
95 |
392 | 96 A build queue manages the the registration of build slaves and detection of |
97 repository revisions that need to be built. | |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
98 """ |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
99 |
468
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
100 def __init__(self, env, build_all=False, stabilize_wait=0, timeout=0): |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
101 """Create the build queue. |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
102 |
411
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
103 :param env: the Trac environment |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
104 :param build_all: whether older revisions should be built |
468
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
105 :param stabilize_wait: The time in seconds to wait before considering |
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
106 the repository stable to create a build in the queue. |
419
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
107 :param timeout: the time in seconds after which an in-progress build |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
108 should be considered orphaned, and reset to pending |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
109 state |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
110 """ |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
111 self.env = env |
392 | 112 self.log = env.log |
348 | 113 self.build_all = build_all |
468
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
114 self.stabilize_wait = stabilize_wait |
419
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
115 self.timeout = timeout |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
116 |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
117 # Build scheduling |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
118 |
392 | 119 def get_build_for_slave(self, name, properties): |
120 """Check whether one of the pending builds can be built by the build | |
121 slave. | |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
122 |
411
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
123 :param name: the name of the slave |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
124 :type name: `basestring` |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
125 :param properties: the slave configuration |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
126 :type properties: `dict` |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
127 :return: the allocated build, or `None` if no build was found |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
128 :rtype: `Build` |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
129 """ |
606
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
130 self.log.debug('Checking for pending builds...') |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
131 |
392 | 132 db = self.env.get_db_cnx() |
348 | 133 repos = self.env.get_repository() |
804
4c73a3cea9f5
Basic Trac 0.12 support, supporting just a `(default)` repository - essentially Trac 0.11 behaviour. Thanks to those that have contributed to #480 to get this working and tested.
osimons
parents:
762
diff
changeset
|
134 assert repos, 'No "(default)" Repository: Add a repository or alias ' \ |
4c73a3cea9f5
Basic Trac 0.12 support, supporting just a `(default)` repository - essentially Trac 0.11 behaviour. Thanks to those that have contributed to #480 to get this working and tested.
osimons
parents:
762
diff
changeset
|
135 'named "(default)" to Trac.' |
372
67372eba421c
Change building order; rather than just build in reverse revision order (which tends to get stuck if you have a bunch of revisions on a single branch), build the newest revision on each branch before you go backwards and fill in the previous revisions.
wbell
parents:
363
diff
changeset
|
136 |
392 | 137 self.reset_orphaned_builds() |
372
67372eba421c
Change building order; rather than just build in reverse revision order (which tends to get stuck if you have a bunch of revisions on a single branch), build the newest revision on each branch before you go backwards and fill in the previous revisions.
wbell
parents:
363
diff
changeset
|
138 |
392 | 139 # Iterate through pending builds by descending revision timestamp, to |
140 # avoid the first configuration/platform getting all the builds | |
141 platforms = [p.id for p in self.match_slave(name, properties)] | |
142 builds_to_delete = [] | |
639
5e78705333c3
0.6dev: Fixing a possible situation of two slaves claiming the same build. Closes #95.
osimons
parents:
606
diff
changeset
|
143 build_found = False |
392 | 144 for build in Build.select(self.env, status=Build.PENDING, db=db): |
377 | 145 if self.should_delete_build(build, repos): |
447 | 146 self.log.info('Scheduling build %d for deletion', build.id) |
446 | 147 builds_to_delete.append(build) |
392 | 148 elif build.platform in platforms: |
639
5e78705333c3
0.6dev: Fixing a possible situation of two slaves claiming the same build. Closes #95.
osimons
parents:
606
diff
changeset
|
149 build_found = True |
392 | 150 break |
639
5e78705333c3
0.6dev: Fixing a possible situation of two slaves claiming the same build. Closes #95.
osimons
parents:
606
diff
changeset
|
151 if not build_found: |
392 | 152 self.log.debug('No pending builds.') |
448 | 153 build = None |
372
67372eba421c
Change building order; rather than just build in reverse revision order (which tends to get stuck if you have a bunch of revisions on a single branch), build the newest revision on each branch before you go backwards and fill in the previous revisions.
wbell
parents:
363
diff
changeset
|
154 |
392 | 155 # delete any obsolete builds |
448 | 156 for build_to_delete in builds_to_delete: |
157 build_to_delete.delete(db=db) | |
372
67372eba421c
Change building order; rather than just build in reverse revision order (which tends to get stuck if you have a bunch of revisions on a single branch), build the newest revision on each branch before you go backwards and fill in the previous revisions.
wbell
parents:
363
diff
changeset
|
158 |
392 | 159 if build: |
160 build.slave = name | |
161 build.slave_info.update(properties) | |
162 build.status = Build.IN_PROGRESS | |
163 build.update(db=db) | |
164 | |
165 if build or builds_to_delete: | |
166 db.commit() | |
167 | |
168 return build | |
169 | |
170 def match_slave(self, name, properties): | |
171 """Match a build slave against available target platforms. | |
172 | |
411
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
173 :param name: the name of the slave |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
174 :type name: `basestring` |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
175 :param properties: the slave configuration |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
176 :type properties: `dict` |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
177 :return: the list of platforms the slave matched |
392 | 178 """ |
179 platforms = [] | |
180 | |
181 for config in BuildConfig.select(self.env): | |
182 for platform in TargetPlatform.select(self.env, config=config.name): | |
183 match = True | |
184 for propname, pattern in ifilter(None, platform.rules): | |
185 try: | |
186 propvalue = properties.get(propname) | |
187 if not propvalue or not re.match(pattern, propvalue): | |
188 match = False | |
189 break | |
190 except re.error: | |
191 self.log.error('Invalid platform matching pattern "%s"', | |
192 pattern, exc_info=True) | |
193 match = False | |
194 break | |
195 if match: | |
443
1c922d944bd2
Minor improvement to logging in the build master when matching slaves against target platforms.
cmlenz
parents:
437
diff
changeset
|
196 self.log.debug('Slave %r matched target platform %r of ' |
392 | 197 'build configuration %r', name, |
198 platform.name, config.name) | |
199 platforms.append(platform) | |
200 | |
443
1c922d944bd2
Minor improvement to logging in the build master when matching slaves against target platforms.
cmlenz
parents:
437
diff
changeset
|
201 if not platforms: |
444
22d6a7da8777
Another minor improvement to logging in the build master.
cmlenz
parents:
443
diff
changeset
|
202 self.log.warning('Slave %r matched none of the target platforms', |
22d6a7da8777
Another minor improvement to logging in the build master.
cmlenz
parents:
443
diff
changeset
|
203 name) |
443
1c922d944bd2
Minor improvement to logging in the build master when matching slaves against target platforms.
cmlenz
parents:
437
diff
changeset
|
204 |
392 | 205 return platforms |
372
67372eba421c
Change building order; rather than just build in reverse revision order (which tends to get stuck if you have a bunch of revisions on a single branch), build the newest revision on each branch before you go backwards and fill in the previous revisions.
wbell
parents:
363
diff
changeset
|
206 |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
207 def populate(self): |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
208 """Add a build for the next change on each build configuration to the |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
209 queue. |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
210 |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
211 The next change is the latest repository check-in for which there isn't |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
212 a corresponding build on each target platform. Repeatedly calling this |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
213 method will eventually result in the entire change history of the build |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
214 configuration being in the build queue. |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
215 """ |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
216 repos = self.env.get_repository() |
804
4c73a3cea9f5
Basic Trac 0.12 support, supporting just a `(default)` repository - essentially Trac 0.11 behaviour. Thanks to those that have contributed to #480 to get this working and tested.
osimons
parents:
762
diff
changeset
|
217 assert repos, 'No "(default)" Repository: Add a repository or alias ' \ |
4c73a3cea9f5
Basic Trac 0.12 support, supporting just a `(default)` repository - essentially Trac 0.11 behaviour. Thanks to those that have contributed to #480 to get this working and tested.
osimons
parents:
762
diff
changeset
|
218 'named "(default)" to Trac.' |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
219 |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
220 db = self.env.get_db_cnx() |
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
221 builds = [] |
392 | 222 |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
223 for config in BuildConfig.select(self.env, db=db): |
450
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
224 platforms = [] |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
225 for platform, rev, build in collect_changes(repos, config, db): |
450
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
226 |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
227 if not self.build_all and platform.id in platforms: |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
228 # We've seen this platform already, so these are older |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
229 # builds that should only be built if built_all=True |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
230 self.log.debug('Ignoring older revisions for configuration ' |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
231 '%r on %r', config.name, platform.name) |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
232 break |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
233 |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
234 platforms.append(platform.id) |
9d0651c819a8
Proper fix for #165, [493] was broken. This time with added tests.
cmlenz
parents:
448
diff
changeset
|
235 |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
236 if build is None: |
392 | 237 self.log.info('Enqueuing build of configuration "%s" at ' |
238 'revision [%s] on %s', config.name, rev, | |
239 platform.name) | |
437
6d5ac24061dc
Fix build queue population compatiblity with Trac 0.11, where revision timestamps are `datetime` objects.
cmlenz
parents:
419
diff
changeset
|
240 |
585
87de4513bfdd
0.6dev: Cleaning remaining 'frontend' datetime code - at least down to all code that interface with the various `model` classes that still only works with timestamps for input and output. See #85.
osimons
parents:
581
diff
changeset
|
241 rev_time = to_timestamp(repos.get_changeset(rev).date) |
468
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
242 age = int(time.time()) - rev_time |
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
243 if self.stabilize_wait and age < self.stabilize_wait: |
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
244 self.log.info('Delaying build of revision %s until %s ' |
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
245 'seconds pass. Current age is: %s ' |
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
246 'seconds' % (rev, self.stabilize_wait, |
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
247 age)) |
44c2b4ac6157
Add stabilization time parameter to build master. Closes #189. Many thanks to Allen Bierbaum for the patch.
cmlenz
parents:
450
diff
changeset
|
248 continue |
437
6d5ac24061dc
Fix build queue population compatiblity with Trac 0.11, where revision timestamps are `datetime` objects.
cmlenz
parents:
419
diff
changeset
|
249 |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
250 build = Build(self.env, config=config.name, |
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
251 platform=platform.id, rev=str(rev), |
437
6d5ac24061dc
Fix build queue population compatiblity with Trac 0.11, where revision timestamps are `datetime` objects.
cmlenz
parents:
419
diff
changeset
|
252 rev_time=rev_time) |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
253 builds.append(build) |
392 | 254 |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
352
diff
changeset
|
255 for build in builds: |
650
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
256 try: |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
257 build.insert(db=db) |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
258 db.commit() |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
259 except Exception, e: |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
260 # really only want to catch IntegrityErrors raised when |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
261 # a second slave attempts to add builds with the same |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
262 # (config, platform, rev) as an existing build. |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
263 self.log.info('Failed to insert build of configuration "%s" ' |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
264 'at revision [%s] on platform [%s]: %s', |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
265 build.config, build.rev, build.platform, e) |
b1a50f2d92eb
0.6dev: Database upgrade to ensure no duplicate builds are created due to thread race condition when populating builds. Threaded test included.
osimons
parents:
643
diff
changeset
|
266 db.rollback() |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
267 |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
268 def reset_orphaned_builds(self): |
419
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
269 """Reset all in-progress builds to ``PENDING`` state if they've been |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
270 running so long that the configured timeout has been reached. |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
271 |
419
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
272 This is used to cleanup after slaves that have unexpectedly cancelled |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
273 a build without notifying the master, or are for some other reason not |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
274 reporting back status updates. |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
227
diff
changeset
|
275 """ |
419
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
276 if not self.timeout: |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
277 # If no timeout is set, none of the in-progress builds can be |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
278 # considered orphaned |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
279 return |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
280 |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
281 db = self.env.get_db_cnx() |
419
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
282 now = int(time.time()) |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
283 for build in Build.select(self.env, status=Build.IN_PROGRESS, db=db): |
762
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
284 if now - build.last_activity < self.timeout: |
419
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
285 # This build has not reached the timeout yet, assume it's still |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
286 # being executed |
b72802dc0632
Fix resetting of builds when multiple slaves are building simultaneously, and implement the `slave_timeout` trac.ini option.
cmlenz
parents:
411
diff
changeset
|
287 continue |
762
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
288 |
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
289 self.log.info('Orphaning build %d. Last activity was %s (%s)' % \ |
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
290 (build.id, format_datetime(build.last_activity), |
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
291 pretty_timedelta(build.last_activity))) |
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
292 |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
293 build.status = Build.PENDING |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
294 build.slave = None |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
295 build.slave_info = {} |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
296 build.started = 0 |
762
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
297 build.stopped = 0 |
5f0cfee44540
Add new last_activity field to build. I considered reusing stopped, but this seemed cleaner and more obvious, which seems like the right way to go.
wbell
parents:
745
diff
changeset
|
298 build.last_activity = 0 |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
299 for step in list(BuildStep.select(self.env, build=build.id, db=db)): |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
300 step.delete(db=db) |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
301 build.update(db=db) |
745
91aabd647610
Delete attachments when builds are cancelled/invalidated.
wbell
parents:
650
diff
changeset
|
302 |
91aabd647610
Delete attachments when builds are cancelled/invalidated.
wbell
parents:
650
diff
changeset
|
303 Attachment.delete_all(self.env, 'build', build.resource.id, db) |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
304 db.commit() |
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
305 |
392 | 306 def should_delete_build(self, build, repos): |
606
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
307 config = BuildConfig.fetch(self.env, build.config) |
893
ed77e3e1c43f
BuildConfig may be `None` when checking to see if build should be deleted. Fix + test, closes #666.
osimons
parents:
883
diff
changeset
|
308 config_name = config and config.name \ |
ed77e3e1c43f
BuildConfig may be `None` when checking to see if build should be deleted. Fix + test, closes #666.
osimons
parents:
883
diff
changeset
|
309 or 'unknown config "%s"' % build.config |
606
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
310 |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
311 platform = TargetPlatform.fetch(self.env, build.platform) |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
312 # Platform may or may not exist anymore - get safe name for logging |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
313 platform_name = platform and platform.name \ |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
314 or 'unknown platform "%s"' % build.platform |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
315 |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
316 # Drop build if platform no longer exists |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
317 if not platform: |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
318 self.log.info('Dropping build of configuration "%s" at ' |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
319 'revision [%s] on %s because the platform no longer ' |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
320 'exists', config.name, build.rev, platform_name) |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
321 return True |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
322 |
392 | 323 # Ignore pending builds for deactived build configs |
893
ed77e3e1c43f
BuildConfig may be `None` when checking to see if build should be deleted. Fix + test, closes #666.
osimons
parents:
883
diff
changeset
|
324 if not (config and config.active): |
606
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
325 self.log.info('Dropping build of configuration "%s" at ' |
513
90ec4de2df6b
Check whether fetching `TargetPlatform` succeeds and adjust log appropriately. Fixes #310
dfraser
parents:
468
diff
changeset
|
326 'revision [%s] on %s because the configuration is ' |
893
ed77e3e1c43f
BuildConfig may be `None` when checking to see if build should be deleted. Fix + test, closes #666.
osimons
parents:
883
diff
changeset
|
327 'deactivated', config_name, build.rev, platform_name) |
392 | 328 return True |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
329 |
392 | 330 # Stay within the revision limits of the build config |
331 if (config.min_rev and repos.rev_older_than(build.rev, | |
332 config.min_rev)) \ | |
333 or (config.max_rev and repos.rev_older_than(config.max_rev, | |
334 build.rev)): | |
606
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
335 self.log.info('Dropping build of configuration "%s" at revision [%s] on ' |
392 | 336 '"%s" because it is outside of the revision range of the ' |
606
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
337 'configuration', config.name, build.rev, platform_name) |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
338 return True |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
339 |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
340 # If not 'build_all', drop if a more recent revision is available |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
341 if not self.build_all and \ |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
342 len(list(Build.select(self.env, config=build.config, |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
343 min_rev_time=build.rev_time, platform=build.platform))) > 1: |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
344 self.log.info('Dropping build of configuration "%s" at revision [%s] ' |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
345 'on "%s" because a more recent build exists', |
07ac9218f649
0.6dev: Fixing numerous problems related to `BuildQueue.should_delete_build()`:
osimons
parents:
585
diff
changeset
|
346 config.name, build.rev, platform_name) |
392 | 347 return True |
227
014bc6c29dff
* Factor build queue logic into a class separate from the build master.
cmlenz
parents:
diff
changeset
|
348 |
253 | 349 return False |