diff --git a/runbot/controllers/frontend.py b/runbot/controllers/frontend.py index d7c57838..43c8fce0 100644 --- a/runbot/controllers/frontend.py +++ b/runbot/controllers/frontend.py @@ -136,10 +136,13 @@ class Runbot(Controller): build._ask_kill() return werkzeug.utils.redirect('/runbot/repo/%s' % build.repo_id.id + ('?search=%s' % search if search else '')) - @route(['/runbot/build//force'], type='http', auth="public", methods=['POST'], csrf=False) - def build_force(self, build_id, search=None, **post): + @route([ + '/runbot/build//force', + '/runbot/build//force/', + ], type='http', auth="public", methods=['POST'], csrf=False) + def build_force(self, build_id, exact=0, search=None, **post): build = request.env['runbot.build'].sudo().browse(build_id) - build._force() + build._force(exact=bool(exact)) return werkzeug.utils.redirect('/runbot/repo/%s' % build.repo_id.id + ('?search=%s' % search if search else '')) @route(['/runbot/build/'], type='http', auth="public", website=True) diff --git a/runbot/models/build.py b/runbot/models/build.py index 3f3bf4cc..1208ea8c 100644 --- a/runbot/models/build.py +++ b/runbot/models/build.py @@ -367,7 +367,7 @@ class runbot_build(models.Model): params['dep'][result[0]] = result[1] return params - def _force(self, message=None): + def _force(self, message=None, exact=False): """Force a rebuild and return a recordset of forced builds""" forced_builds = self.env['runbot.build'] for build in self: @@ -382,10 +382,11 @@ class runbot_build(models.Model): build.write({'local_state': 'pending', 'sequence': sequence, 'local_result': ''}) # or duplicate it elif build.local_state in ['running', 'done', 'duplicate', 'deathrow']: - new_build = build.with_context(force_rebuild=True).create({ + values = { 'sequence': sequence, 'branch_id': build.branch_id.id, 'name': build.name, + 'date': build.date, 'author': build.author, 'author_email': build.author_email, 'committer': build.committer, @@ -393,10 +394,24 @@ class runbot_build(models.Model): 'subject': build.subject, 'modules': build.modules, 'build_type': 'rebuild', - # 'config_id': build.config_id.id, - # we use the branch config for now since we are recomputing dependencies, - # we may introduce an 'exact rebuild' later - }) + } + if exact: + values.update({ + 'config_id': build.config_id.id, + 'extra_params': build.extra_params, + 'dependency_ids': build.dependency_ids, + 'server_match': build.server_match, + 'orphan_result': build.orphan_result, + }) + #if replace: ? + if build.parent_id: + values.update({ + 'parent_id': build.parent_id.id, # attach it to parent + 'hidden': build.hidden, + }) + build.orphan_result = True # set result of build as orphan + + new_build = build.with_context(force_rebuild=True).create(values) build = new_build else: rebuild = False diff --git a/runbot/static/src/js/runbot.js b/runbot/static/src/js/runbot.js index 18c2db2b..afa30eaf 100644 --- a/runbot/static/src/js/runbot.js +++ b/runbot/static/src/js/runbot.js @@ -4,7 +4,17 @@ $(function() { $('a.runbot-rebuild').click(function() { var $f = $('
'), - url = _.str.sprintf('/runbot/build/%s/force', $(this).data('runbot-build')) + window.location.search; + url = _.str.sprintf('/runbot/build/%s/force', $(this).data('runbot-build')) + window.location.search; + $f.attr('action', url); + $f.appendTo($('body')); + $f.submit(); + return false; + }); + }); + $(function() { + $('a.runbot-rebuild-exact').click(function() { + var $f = $(''), + url = _.str.sprintf('/runbot/build/%s/force/1', $(this).data('runbot-build')) + window.location.search; $f.attr('action', url); $f.appendTo($('body')); $f.submit(); diff --git a/runbot/templates/build.xml b/runbot/templates/build.xml index 344ef07d..e6df0f86 100644 --- a/runbot/templates/build.xml +++ b/runbot/templates/build.xml @@ -67,7 +67,14 @@
  • Connect
  • - Rebuild + + Default Rebuild + + + Exact Rebuild +
  • Kill