-
Notifications
You must be signed in to change notification settings - Fork 253
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add SSHKit::Backend.current #319
Add SSHKit::Backend.current #319
Conversation
The point of SSHKit::Backend.current is to give code access to the current Backend without having to pass around a reference to it. For example, consider a `git` helper that executes a git command: def git(*args) SSHKit::Backend.current.execute(:git, *args) end Thanks to `current`, we can use this git method wherever we are in an `on` block, without having to pass a reference to `self`: on release_roles(:all) do git "status" end Without the thread local, the same task would be much more awkward due to the necessary passing of `self`: def git(backend, *args) backend.execute(:git, *args) end on release_roles(:all) do git self, "status" end To someone not intimately familiar with SSHKit, what `self` in this context is confusing and not obvious at all. It is because SSHKit uses `instance_exec` within the `on` block that `self` magically transforms. Better to avoid using `self` altogether and prefer the thread local.
fc9ef17
to
8032db6
Compare
Add SSHKit::Backend.current
Small PRs are lovely <3 |
I'm very late to the party, so I realise that this is needed for stuff that is already merged in Capistrano, but I just wanted to understand a bit more about this. I read up about this here, and I think it's a good idea to stop monkey patching My limited experience with thread locals is that they can be hard to reason about / test because they rely on things being set up at the right time. Were you thinking of the public API for this to be |
Yes, in fact |
OK yeah I see - thanks for that link. I see now in that same class, that normally plugin access through to SSHKit is provided via the
One thing I don't understand is if a plugin hasn't called the |
It's in the case where the So your task :check do
on release_roles(:all) do
plugin.git "status"
end
end And then in the plugin class: def git(*args)
backend.execute(:git, *args)
end Without the See also my commit message here: mattbrictson@8032db6 |
Ah sorry - I somehow managed to miss that commit message which has all the info I needed - I understand now. Thanks for explaining it all again here. |
## [1.11.3][] (2016-09-16) * Fix known_hosts caching to match on the entire hostlist [PR #364](capistrano/sshkit#364) @byroot ## [1.11.2][] (2016-07-29) ### Bug fixes * Fixed a crash occurring when `Host@keys` was set to a non-Enumerable. @xavierholt [PR #360](capistrano/sshkit#360) ## [1.11.1][] (2016-06-17) ### Bug fixes * Fixed a regression in 1.11.0 that would cause `ArgumentError: invalid option(s): known_hosts` in some older versions of net-ssh. @byroot [#357](capistrano/sshkit#357) ## [1.11.0][] (2016-06-14) ### Bug fixes * Fixed colorized output alignment in Logger::Pretty. @xavierholt [PR #349](capistrano/sshkit#349) * Fixed a bug that prevented nested `with` calls [#43](capistrano/sshkit#43) ### Other changes * Known hosts lookup optimization is now enabled by default. @byroot ## 1.10.0 (2016-04-22) * You can now opt-in to caching of SSH's known_hosts file for a speed boost when deploying to a large fleet of servers. Refer to the [README](https://github.com/capistrano/sshkit/tree/v1.10.0#known-hosts-caching) for details. We plan to turn this on by default in a future version of SSHKit. [PR #330](capistrano/sshkit#330) @byroot * SSHKit now explicitly closes its pooled SSH connections when Ruby exits; this fixes `zlib(finalizer): the stream was freed prematurely` warnings [PR #343](capistrano/sshkit#343) @mattbrictson * Allow command map entries (`SSHKit::CommandMap#[]`) to be Procs [PR #310](capistrano/sshkit#310) @mikz ## 1.9.0 **Refer to the 1.9.0.rc1 release notes for a full list of new features, fixes, and potentially breaking changes since SSHKit 1.8.1.** There are no changes since 1.9.0.rc1. ## 1.9.0.rc1 ### Potentially breaking changes * The SSHKit DSL is no longer automatically included when you `require` it. **This means you must now explicitly `include SSHKit::DSL`.** See [PR #219](capistrano/sshkit#219) for details. @beatrichartz * `SSHKit::Backend::Printer#test` now always returns true [PR #312](capistrano/sshkit#312) @mikz ### New features * `SSHKit::Formatter::Abstract` now accepts an optional Hash of options [PR #308](capistrano/sshkit#308) @mattbrictson * Add `SSHKit::Backend.current` so that Capistrano plugin authors can refactor helper methods and still have easy access to the currently-executing Backend without having to use global variables. * Add `SSHKit.config.default_runner` options that allows to override default command runner. This option also accepts a name of the custom runner class. * The ConnectionPool has been rewritten in this release to be more efficient and have a cleaner internal API. You can still completely disable the pool by setting `SSHKit::Backend::Netssh.pool.idle_timeout = 0`. @mattbrictson @byroot [PR #328](capistrano/sshkit#328) ### Bug fixes * make sure working directory for commands is properly cleared after `within` blocks [PR #307](capistrano/sshkit#307) @steved * display more accurate string for commands with spaces being output in `Formatter::Pretty` [PR #304](capistrano/sshkit#304) @steved [PR #319](capistrano/sshkit#319) @mattbrictson * Fix a race condition experienced in JRuby that could cause multi-server deploys to fail. [PR #322](capistrano/sshkit#322) @mattbrictson
This PR adds the
SSHKit::Backend.current
method that I originally introduced in a monkey patch in this Capistrano PR: capistrano/capistrano#1561