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
endAnd then in the plugin class: def git(*args)
backend.execute(:git, *args)
endWithout 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.currentmethod that I originally introduced in a monkey patch in this Capistrano PR: capistrano/capistrano#1561