Module | Capistrano::Configuration::Execution |
In: |
lib/capistrano/configuration/execution.rb
lib/capistrano/configuration/execution.rb |
TaskCallFrame | = | Struct.new(:task, :rollback) | A struct for representing a single instance of an invoked task. | |
TaskCallFrame | = | Struct.new(:task, :rollback) | A struct for representing a single instance of an invoked task. |
rollback_requests | [R] | The stack of tasks that have registered rollback handlers within the current transaction. If this is nil, then there is no transaction that is currently active. |
rollback_requests | [R] | The stack of tasks that have registered rollback handlers within the current transaction. If this is nil, then there is no transaction that is currently active. |
task_call_frames | [R] | The call stack of the tasks. The currently executing task may inspect this to see who its caller was. The current task is always the last element of this stack. |
task_call_frames | [R] | The call stack of the tasks. The currently executing task may inspect this to see who its caller was. The current task is always the last element of this stack. |
Returns the TaskDefinition object for the currently executing task. It returns nil if there is no task being executed.
# File lib/capistrano/configuration/execution.rb, line 71 71: def current_task 72: return nil if task_call_frames.empty? 73: task_call_frames.last.task 74: end
Returns the TaskDefinition object for the currently executing task. It returns nil if there is no task being executed.
# File lib/capistrano/configuration/execution.rb, line 71 71: def current_task 72: return nil if task_call_frames.empty? 73: task_call_frames.last.task 74: end
Executes the task with the given name, without invoking any associated callbacks.
# File lib/capistrano/configuration/execution.rb, line 78 78: def execute_task(task) 79: logger.debug "executing `#{task.fully_qualified_name}'" 80: push_task_call_frame(task) 81: invoke_task_directly(task) 82: ensure 83: pop_task_call_frame 84: end
Executes the task with the given name, without invoking any associated callbacks.
# File lib/capistrano/configuration/execution.rb, line 78 78: def execute_task(task) 79: logger.debug "executing `#{task.fully_qualified_name}'" 80: push_task_call_frame(task) 81: invoke_task_directly(task) 82: ensure 83: pop_task_call_frame 84: end
Attempts to locate the task at the given fully-qualified path, and execute it. If no such task exists, a Capistrano::NoSuchTaskError will be raised.
# File lib/capistrano/configuration/execution.rb, line 89 89: def find_and_execute_task(path, hooks={}) 90: task = find_task(path) or raise NoSuchTaskError, "the task `#{path}' does not exist" 91: 92: trigger(hooks[:before], task) if hooks[:before] 93: result = execute_task(task) 94: trigger(hooks[:after], task) if hooks[:after] 95: 96: result 97: end
Attempts to locate the task at the given fully-qualified path, and execute it. If no such task exists, a Capistrano::NoSuchTaskError will be raised.
# File lib/capistrano/configuration/execution.rb, line 89 89: def find_and_execute_task(path, hooks={}) 90: task = find_task(path) or raise NoSuchTaskError, "the task `#{path}' does not exist" 91: 92: trigger(hooks[:before], task) if hooks[:before] 93: result = execute_task(task) 94: trigger(hooks[:after], task) if hooks[:after] 95: 96: result 97: end
Specifies an on_rollback hook for the currently executing task. If this or any subsequent task then fails, and a transaction is active, this hook will be executed.
# File lib/capistrano/configuration/execution.rb, line 61 61: def on_rollback(&block) 62: if transaction? 63: # don't note a new rollback request if one has already been set 64: rollback_requests << task_call_frames.last unless task_call_frames.last.rollback 65: task_call_frames.last.rollback = block 66: end 67: end
Specifies an on_rollback hook for the currently executing task. If this or any subsequent task then fails, and a transaction is active, this hook will be executed.
# File lib/capistrano/configuration/execution.rb, line 61 61: def on_rollback(&block) 62: if transaction? 63: # don't note a new rollback request if one has already been set 64: rollback_requests << task_call_frames.last unless task_call_frames.last.rollback 65: task_call_frames.last.rollback = block 66: end 67: end
Invoke a set of tasks in a transaction. If any task fails (raises an exception), all tasks executed within the transaction are inspected to see if they have an associated on_rollback hook, and if so, that hook is called.
# File lib/capistrano/configuration/execution.rb, line 39 39: def transaction 40: raise ArgumentError, "expected a block" unless block_given? 41: raise ScriptError, "transaction must be called from within a task" if task_call_frames.empty? 42: 43: return yield if transaction? 44: 45: logger.info "transaction: start" 46: begin 47: @rollback_requests = [] 48: yield 49: logger.info "transaction: commit" 50: rescue Object => e 51: rollback! 52: raise 53: ensure 54: @rollback_requests = nil 55: end 56: end
Invoke a set of tasks in a transaction. If any task fails (raises an exception), all tasks executed within the transaction are inspected to see if they have an associated on_rollback hook, and if so, that hook is called.
# File lib/capistrano/configuration/execution.rb, line 39 39: def transaction 40: raise ArgumentError, "expected a block" unless block_given? 41: raise ScriptError, "transaction must be called from within a task" if task_call_frames.empty? 42: 43: return yield if transaction? 44: 45: logger.info "transaction: start" 46: begin 47: @rollback_requests = [] 48: yield 49: logger.info "transaction: commit" 50: rescue Object => e 51: rollback! 52: raise 53: ensure 54: @rollback_requests = nil 55: end 56: end
Returns true if there is a transaction currently active.
# File lib/capistrano/configuration/execution.rb, line 31 31: def transaction? 32: !rollback_requests.nil? 33: end
Returns true if there is a transaction currently active.
# File lib/capistrano/configuration/execution.rb, line 31 31: def transaction? 32: !rollback_requests.nil? 33: end
Invokes the task‘s body directly, without setting up the call frame.
# File lib/capistrano/configuration/execution.rb, line 127 127: def invoke_task_directly(task) 128: task.namespace.instance_eval(&task.body) 129: end
Invokes the task‘s body directly, without setting up the call frame.
# File lib/capistrano/configuration/execution.rb, line 127 127: def invoke_task_directly(task) 128: task.namespace.instance_eval(&task.body) 129: end
# File lib/capistrano/configuration/execution.rb, line 122 122: def pop_task_call_frame 123: task_call_frames.pop 124: end
# File lib/capistrano/configuration/execution.rb, line 122 122: def pop_task_call_frame 123: task_call_frames.pop 124: end
# File lib/capistrano/configuration/execution.rb, line 117 117: def push_task_call_frame(task) 118: frame = TaskCallFrame.new(task) 119: task_call_frames.push frame 120: end
# File lib/capistrano/configuration/execution.rb, line 117 117: def push_task_call_frame(task) 118: frame = TaskCallFrame.new(task) 119: task_call_frames.push frame 120: end
# File lib/capistrano/configuration/execution.rb, line 101 101: def rollback! 102: # throw the task back on the stack so that roles are properly 103: # interpreted in the scope of the task in question. 104: rollback_requests.reverse.each do |frame| 105: begin 106: push_task_call_frame(frame.task) 107: logger.important "rolling back", frame.task.fully_qualified_name 108: frame.rollback.call 109: rescue Object => e 110: logger.info "exception while rolling back: #{e.class}, #{e.message}", frame.task.fully_qualified_name 111: ensure 112: pop_task_call_frame 113: end 114: end 115: end
# File lib/capistrano/configuration/execution.rb, line 101 101: def rollback! 102: # throw the task back on the stack so that roles are properly 103: # interpreted in the scope of the task in question. 104: rollback_requests.reverse.each do |frame| 105: begin 106: push_task_call_frame(frame.task) 107: logger.important "rolling back", frame.task.fully_qualified_name 108: frame.rollback.call 109: rescue Object => e 110: logger.info "exception while rolling back: #{e.class}, #{e.message}", frame.task.fully_qualified_name 111: ensure 112: pop_task_call_frame 113: end 114: end 115: end