bindler 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +60 -0
- data/LICENSE.txt +22 -0
- data/README.md +92 -0
- data/Rakefile +3 -0
- data/bindler.gemspec +23 -0
- data/development/Vagrantfile +59 -0
- data/lib/bindler.rb +6 -0
- data/lib/vundler/bend_vagrant.rb +120 -0
- data/lib/vundler/local_plugins_manifest_ext.rb +23 -0
- data/lib/vundler/logging.rb +9 -0
- data/lib/vundler/plugin.rb +20 -0
- data/lib/vundler/plugin_command/bundle.rb +94 -0
- data/lib/vundler/plugin_command/list.rb +43 -0
- data/lib/vundler/plugin_command/root.rb +25 -0
- data/lib/vundler/plugin_not_found_error.rb +7 -0
- data/lib/vundler/version.rb +3 -0
- data/lib/vundler/vundler_command/root.rb +60 -0
- data/lib/vundler/vundler_command/setup.rb +56 -0
- data/locales/en.yml +7 -0
- data/tasks/deploy.rake +12 -0
- metadata +94 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 4f92540bd8759863dabbcf7d51983981fc7dd7cc
|
|
4
|
+
data.tar.gz: ceaa5ec8e18626c1dd746f5124419aa0d0232144
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 2a775e0d0a5b2bd3b9af01c8b763a0fac0fffe2292b6987f6ee66a7485c064617f9009a20ebe72c6b7e68427d812078c79b2fe6f8be0e062433cb11da790abae
|
|
7
|
+
data.tar.gz: 974660a1913c32b5c1c851d101063f71f589db78162d38e4ac9746678642cfdd4559c405b28ec2be6acac317080fb33f65a495cb2ff48dafa6386b98a99f422f
|
data/.gitignore
ADDED
data/Gemfile
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
# Specify your gem's dependencies in bindler.gemspec
|
|
4
|
+
gemspec
|
|
5
|
+
|
|
6
|
+
group :development, :test do
|
|
7
|
+
gem 'vagrant', github: 'mitchellh/vagrant'
|
|
8
|
+
gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc'
|
|
9
|
+
gem 'vagrant-cachier', github: 'fgrehm/vagrant-cachier'
|
|
10
|
+
gem 'vagrant-pristine', github: 'fgrehm/vagrant-pristine'
|
|
11
|
+
end
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
GIT
|
|
2
|
+
remote: git://github.com/fgrehm/vagrant-cachier.git
|
|
3
|
+
revision: f5d9ce507239535326a0a0395c890cc7a27d73f1
|
|
4
|
+
specs:
|
|
5
|
+
vagrant-cachier (0.3.0.dev)
|
|
6
|
+
|
|
7
|
+
GIT
|
|
8
|
+
remote: git://github.com/fgrehm/vagrant-lxc.git
|
|
9
|
+
revision: d2e354839f404ef426bdee38e50c9b3256e1e3c2
|
|
10
|
+
specs:
|
|
11
|
+
vagrant-lxc (0.4.1.dev)
|
|
12
|
+
|
|
13
|
+
GIT
|
|
14
|
+
remote: git://github.com/fgrehm/vagrant-pristine.git
|
|
15
|
+
revision: 5c400d7850fc5f98d9601b59f4c3bd74818650de
|
|
16
|
+
specs:
|
|
17
|
+
vagrant-pristine (0.2.0)
|
|
18
|
+
|
|
19
|
+
GIT
|
|
20
|
+
remote: git://github.com/mitchellh/vagrant.git
|
|
21
|
+
revision: 4b299c9fc22dfdb192993d4874670370b8e90122
|
|
22
|
+
specs:
|
|
23
|
+
vagrant (1.2.5.dev)
|
|
24
|
+
childprocess (~> 0.3.7)
|
|
25
|
+
erubis (~> 2.7.0)
|
|
26
|
+
i18n (~> 0.6.0)
|
|
27
|
+
log4r (~> 1.1.9)
|
|
28
|
+
net-scp (~> 1.1.0)
|
|
29
|
+
net-ssh (~> 2.6.6)
|
|
30
|
+
|
|
31
|
+
PATH
|
|
32
|
+
remote: .
|
|
33
|
+
specs:
|
|
34
|
+
bindler (0.1.0)
|
|
35
|
+
|
|
36
|
+
GEM
|
|
37
|
+
remote: https://rubygems.org/
|
|
38
|
+
specs:
|
|
39
|
+
childprocess (0.3.9)
|
|
40
|
+
ffi (~> 1.0, >= 1.0.11)
|
|
41
|
+
erubis (2.7.0)
|
|
42
|
+
ffi (1.9.0)
|
|
43
|
+
i18n (0.6.4)
|
|
44
|
+
log4r (1.1.10)
|
|
45
|
+
net-scp (1.1.2)
|
|
46
|
+
net-ssh (>= 2.6.5)
|
|
47
|
+
net-ssh (2.6.8)
|
|
48
|
+
rake (10.1.0)
|
|
49
|
+
|
|
50
|
+
PLATFORMS
|
|
51
|
+
ruby
|
|
52
|
+
|
|
53
|
+
DEPENDENCIES
|
|
54
|
+
bindler!
|
|
55
|
+
bundler (~> 1.3)
|
|
56
|
+
rake
|
|
57
|
+
vagrant!
|
|
58
|
+
vagrant-cachier!
|
|
59
|
+
vagrant-lxc!
|
|
60
|
+
vagrant-pristine!
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2013 Fabio Rehm
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# NOTICE
|
|
2
|
+
**This plugin was initially released as Vundler and was just renamed to
|
|
3
|
+
Bindler to avoid confusion with [Vim's Vundle](https://github.com/gmarik/vundle),
|
|
4
|
+
please follow the steps to [revert its installation](https://github.com/fgrehm/bindler/blob/b12a69e599fc56e7b05108df52a466d022ef592c/README.md#help-things-are-falling-apart)
|
|
5
|
+
before upgrading to Bindler**
|
|
6
|
+
|
|
7
|
+
# Bindler
|
|
8
|
+
Dead easy Vagrant plugins management, think of it as soon-to-be "[Bundler](http://bundler.io/)
|
|
9
|
+
for Vagrant".
|
|
10
|
+
|
|
11
|
+
## WARNING
|
|
12
|
+
This is highly experimental and things might go wrong. It basically does some
|
|
13
|
+
[heavy monkey patching](lib/vundler/bend_vagrant.rb) on Vagrant's core and should
|
|
14
|
+
not be considered "production-ready". Please keep that in mind and be ready to
|
|
15
|
+
[revert Bindler's installation](#help-things-are-falling-apart) in case things
|
|
16
|
+
go crazy.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
Make sure you have Vagrant 1.2+ and run:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
vagrant plugin install bindler
|
|
24
|
+
vagrant bindler setup
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
Add one of `plugins.json`, `.vagrant_plugins`, or `vagrant/plugins.json`
|
|
29
|
+
to your project root. The first matching file will be used as your
|
|
30
|
+
project's plugins.json file.
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
[
|
|
34
|
+
"vagrant-lxc",
|
|
35
|
+
{"vagrant-cachier": "0.2.0"}
|
|
36
|
+
]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
And run `vagrant plugin bundle` to install missing dependencies:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
$ vagrant plugin bundle
|
|
43
|
+
|
|
44
|
+
Installing plugins...
|
|
45
|
+
-> vagrant-lxc already installed
|
|
46
|
+
-> vagrant-cachier (0.2.0)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
List installed plugins with `vagrant plugin list`:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
$ vagrant plugin list
|
|
53
|
+
|
|
54
|
+
vagrant-lxc (0.4.0)
|
|
55
|
+
bindler (0.1.0)
|
|
56
|
+
|
|
57
|
+
Project dependencies:
|
|
58
|
+
-> vagrant-lxc
|
|
59
|
+
-> vagrant-cachier 0.2.0
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
## Help! Things are falling apart!
|
|
64
|
+
First bring back Vagrant's default `plugins.json` file:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
mv $HOME/.vagrant.d/{global-,}plugins.json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
And then remove the `require 'bindler'` from your `$HOME/.vagrant.d/Vagrantfile`.
|
|
71
|
+
|
|
72
|
+
## How does it work?
|
|
73
|
+
Have a look at [this blog post](http://fabiorehm.com/blog/2013/07/15/vundler-dead-easy-plugin-management-for-vagrant/).
|
|
74
|
+
|
|
75
|
+
# Development
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
git clone bindler
|
|
79
|
+
cd bindler
|
|
80
|
+
bundle install
|
|
81
|
+
|
|
82
|
+
# Add some changes...
|
|
83
|
+
bundle exec rake build
|
|
84
|
+
vagrant plugin install pkg/bindler-VERSION.gem
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Contributing
|
|
88
|
+
1. Fork it
|
|
89
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
90
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
91
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
92
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/bindler.gemspec
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'vundler/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "bindler"
|
|
8
|
+
spec.version = Bindler::VERSION
|
|
9
|
+
spec.authors = ["Fabio Rehm"]
|
|
10
|
+
spec.email = ["fgrehm@gmail.com"]
|
|
11
|
+
spec.description = %q{Dead easy Vagrant plugins management}
|
|
12
|
+
spec.summary = spec.description
|
|
13
|
+
spec.homepage = "https://github.com/fgrehm/vundler"
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files`.split($/)
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ["lib"]
|
|
20
|
+
|
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
|
22
|
+
spec.add_development_dependency "rake"
|
|
23
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# -*- mode: ruby -*-
|
|
2
|
+
# vi: set ft=ruby :
|
|
3
|
+
|
|
4
|
+
Vagrant.require_plugin 'vagrant-cachier'
|
|
5
|
+
Vagrant.require_plugin 'vagrant-pristine'
|
|
6
|
+
Vagrant.require_plugin 'vagrant-lxc'
|
|
7
|
+
|
|
8
|
+
Vagrant.configure("2") do |config|
|
|
9
|
+
config.vm.box = "quantal64"
|
|
10
|
+
config.vm.synced_folder "../", "/vagrant", id: 'vagrant-root', nfs: true
|
|
11
|
+
|
|
12
|
+
config.cache.auto_detect = true
|
|
13
|
+
config.cache.enable_nfs = true
|
|
14
|
+
|
|
15
|
+
config.vm.provider :lxc do |lxc|
|
|
16
|
+
# Required to boot nested containers
|
|
17
|
+
lxc.customize 'aa_profile', 'unconfined'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
config.vm.provision :shell, inline: %[
|
|
21
|
+
if ! $(which lxc-create > /dev/null); then
|
|
22
|
+
cat <<STR > /etc/default/lxc
|
|
23
|
+
LXC_AUTO="true"
|
|
24
|
+
USE_LXC_BRIDGE="true"
|
|
25
|
+
LXC_BRIDGE="lxcbr0"
|
|
26
|
+
LXC_ADDR="10.0.253.1"
|
|
27
|
+
LXC_NETMASK="255.255.255.0"
|
|
28
|
+
LXC_NETWORK="10.0.253.0/24"
|
|
29
|
+
LXC_DHCP_RANGE="10.0.253.2,10.0.253.254"
|
|
30
|
+
LXC_DHCP_MAX="253"
|
|
31
|
+
LXC_SHUTDOWN_TIMEOUT=120
|
|
32
|
+
STR
|
|
33
|
+
|
|
34
|
+
apt-get update &&
|
|
35
|
+
apt-get upgrade -y &&
|
|
36
|
+
apt-get install -y -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' \
|
|
37
|
+
lxc redir htop vim
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
if ! $(which vagrant > /dev/null); then
|
|
41
|
+
# Pick your Vagrant version:
|
|
42
|
+
# 1.2.3 -> http://files.vagrantup.com/packages/95d308caaecd139b8f62e41e7add0ec3f8ae3bd1/vagrant_1.2.3_x86_64.deb
|
|
43
|
+
# 1.2.2 -> http://files.vagrantup.com/packages/7e400d00a3c5a0fdf2809c8b5001a035415a607b/vagrant_1.2.2_x86_64.deb
|
|
44
|
+
# 1.2.1 -> http://files.vagrantup.com/packages/a7853fe7b7f08dbedbc934eb9230d33be6bf746f/vagrant_1.2.1_x86_64.deb
|
|
45
|
+
# 1.2.0 -> http://files.vagrantup.com/packages/f5ece47c510e5a632adb69701b78cb6dcbe03713/vagrant_1.2.0_x86_64.deb
|
|
46
|
+
|
|
47
|
+
wget http://files.vagrantup.com/packages/95d308caaecd139b8f62e41e7add0ec3f8ae3bd1/vagrant_1.2.3_x86_64.deb -O /tmp/vagrant.deb -q
|
|
48
|
+
dpkg -i /tmp/vagrant.deb
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
if ! $(grep -q 'VAGRANT_DEFAULT_PROVIDER=lxc' /home/vagrant/.bashrc); then
|
|
52
|
+
echo 'export VAGRANT_DEFAULT_PROVIDER=lxc' >> /home/vagrant/.bashrc
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
if [ `uname -r` = 3.5.0-17-generic ]; then
|
|
56
|
+
echo "Please restart the machine with 'vagrant reload'"
|
|
57
|
+
fi
|
|
58
|
+
]
|
|
59
|
+
end
|
data/lib/bindler.rb
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# WARNING: Monkey patches ahead
|
|
2
|
+
|
|
3
|
+
Vagrant::Environment.class_eval do
|
|
4
|
+
include VagrantPlugins::Bindler::Logging
|
|
5
|
+
include VagrantPlugins::Bindler::LocalPluginsManifestExt
|
|
6
|
+
|
|
7
|
+
# UGLY HACK: This is required because we need to load project specific plugins
|
|
8
|
+
# before the `:environment_load` hook from Vagrant::Environment on [1]. In order
|
|
9
|
+
# to run the hook, Vagrantfile configs have to be parsed [2] to build a
|
|
10
|
+
# Vagrant::Action::Runner [3].
|
|
11
|
+
#
|
|
12
|
+
# [1] - https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/environment.rb#L135
|
|
13
|
+
# [2] - https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/environment.rb#L239
|
|
14
|
+
# [3] - https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/environment.rb#L498-L510
|
|
15
|
+
#
|
|
16
|
+
# DISCUSS: What if Vagrant had another hook that was called before `:environment_load`?
|
|
17
|
+
alias old_hook hook
|
|
18
|
+
def hook(name)
|
|
19
|
+
unless @__custom_plugins_loaded
|
|
20
|
+
bindler_debug 'Loading local plugins...'
|
|
21
|
+
__load_local_plugins
|
|
22
|
+
|
|
23
|
+
@__custom_plugins_loaded = true
|
|
24
|
+
end
|
|
25
|
+
old_hook name
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# This method loads plugins from a project specific `plugins.json` file
|
|
29
|
+
def __load_local_plugins
|
|
30
|
+
unless bindler_plugins_file
|
|
31
|
+
lookup_paths = VagrantPlugins::Bindler::LocalPluginsManifestExt::PLUGINS_JSON_LOOKUP
|
|
32
|
+
bindler_debug "Local plugins manifest file not found, looked into #{lookup_paths.inspect}"
|
|
33
|
+
return
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
ARGV.each do |arg|
|
|
37
|
+
if !arg.start_with?("-") && arg == 'bindler'
|
|
38
|
+
bindler_debug 'bindler command detected, setting VAGRANT_NO_PLUGINS to 1'
|
|
39
|
+
ENV["VAGRANT_NO_PLUGINS"] = "1"
|
|
40
|
+
break
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
if ENV['VAGRANT_NO_PLUGINS']
|
|
45
|
+
bindler_debug 'VAGRANT_NO_PLUGINS is set to true, skipping local plugins manifest parsing'
|
|
46
|
+
return
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Prepend our local gem path and reset the paths that Rubygems knows about.
|
|
50
|
+
ENV["GEM_PATH"] = "#{local_data_path.join('gems')}#{::File::PATH_SEPARATOR}#{ENV["GEM_PATH"]}"
|
|
51
|
+
::Gem.clear_paths
|
|
52
|
+
|
|
53
|
+
bindler_debug "#{bindler_plugins_file} data: #{bindler_plugins.inspect}"
|
|
54
|
+
bindler_plugins.each do |plugin|
|
|
55
|
+
if plugin.is_a?(String)
|
|
56
|
+
__load_plugin plugin
|
|
57
|
+
else
|
|
58
|
+
__load_plugin *plugin.first
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
if @__failed_to_load
|
|
63
|
+
plugins = @__failed_to_load.map do |plugin, version|
|
|
64
|
+
" -> #{plugin} (#{version || ">= 0"})"
|
|
65
|
+
end
|
|
66
|
+
raise VagrantPlugins::Bindler::PluginNotFoundError, plugins: plugins.join("\n")
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def __load_plugin(plugin, version = nil)
|
|
71
|
+
bindler_debug "Loading #{plugin} (#{version.inspect})"
|
|
72
|
+
gem plugin, version
|
|
73
|
+
Vagrant.require_plugin plugin
|
|
74
|
+
rescue Gem::LoadError
|
|
75
|
+
(@__failed_to_load ||= []) << [plugin, version]
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
require Vagrant.source_root.join('plugins/commands/plugin/state_file').to_s
|
|
80
|
+
# Vagrant plugin commands manipulate a StateFile object that keeps track of system
|
|
81
|
+
# wide installed plugins. Since bindler is kept separately on `~/.vagrant.d/plugins`,
|
|
82
|
+
# we hard code a reference to it over here.
|
|
83
|
+
# If we don't do this, Bindler will be uninstalled after a system wide plugin install.
|
|
84
|
+
class BindlerStateFile < VagrantPlugins::CommandPlugin::StateFile
|
|
85
|
+
def installed_plugins
|
|
86
|
+
['bindler'] + @data['installed']
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
require Vagrant.source_root.join('plugins/commands/plugin/command/base').to_s
|
|
91
|
+
# The patch makes sure Vagrant's system wide plugin commands manipulates the custom
|
|
92
|
+
# configuration file.
|
|
93
|
+
VagrantPlugins::CommandPlugin::Command::Base.class_eval do
|
|
94
|
+
alias old_action action
|
|
95
|
+
def action(callable, env=nil)
|
|
96
|
+
env = {
|
|
97
|
+
plugin_state_file: BindlerStateFile.new(@env.home_path.join("global-plugins.json")),
|
|
98
|
+
}.merge(env || {})
|
|
99
|
+
|
|
100
|
+
old_action(callable, env)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
require Vagrant.source_root.join('plugins/commands/plugin/action/install_gem').to_s
|
|
105
|
+
# This patch ensures Bindler does not get a reference on `~/.vagrant.d/global-plugins.json`
|
|
106
|
+
VagrantPlugins::CommandPlugin::Action::InstallGem.class_eval do
|
|
107
|
+
include VagrantPlugins::Bindler::Logging
|
|
108
|
+
|
|
109
|
+
alias old_call call
|
|
110
|
+
def call(env)
|
|
111
|
+
if env[:plugin_name] == 'bindler'
|
|
112
|
+
bindler_debug 'Installing bindler to global plugins file'
|
|
113
|
+
# bindler is the only plugin that should be installed on the global state file
|
|
114
|
+
env[:plugin_state_file] = CommandPlugin::StateFile.new(env[:home_path].join("plugins.json"))
|
|
115
|
+
else
|
|
116
|
+
bindler_debug "Installing #{env[:plugin_name]} to $HOME/.vagrant.d"
|
|
117
|
+
end
|
|
118
|
+
old_call(env)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module VagrantPlugins
|
|
2
|
+
module Bindler
|
|
3
|
+
module LocalPluginsManifestExt
|
|
4
|
+
PLUGINS_JSON_LOOKUP = [
|
|
5
|
+
ENV['VAGRANT_PLUGINS_FILENAME'],
|
|
6
|
+
'vagrant/plugins.json',
|
|
7
|
+
'.vagrant_plugins.json',
|
|
8
|
+
'plugins.json'
|
|
9
|
+
].compact
|
|
10
|
+
|
|
11
|
+
def bindler_plugins_file
|
|
12
|
+
@bindler_plugins_file ||= PLUGINS_JSON_LOOKUP.map do |path|
|
|
13
|
+
plugins = cwd.join(path)
|
|
14
|
+
plugins if plugins.file?
|
|
15
|
+
end.compact.first
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def bindler_plugins
|
|
19
|
+
@bindler_plugins ||= bindler_plugins_file ? JSON.parse(bindler_plugins_file.read) : {}
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
I18n.load_path << File.expand_path(File.dirname(__FILE__) + '/../../locales/en.yml')
|
|
2
|
+
I18n.reload!
|
|
3
|
+
|
|
4
|
+
module VagrantPlugins
|
|
5
|
+
module Bindler
|
|
6
|
+
class Plugin < Vagrant.plugin('2')
|
|
7
|
+
name 'Bindler'
|
|
8
|
+
|
|
9
|
+
command("plugin") do
|
|
10
|
+
require_relative 'plugin_command/root'
|
|
11
|
+
PluginCommand::Root
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
command("bindler") do
|
|
15
|
+
require_relative 'bindler_command/root'
|
|
16
|
+
BindlerCommand::Root
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require_relative '../logging'
|
|
2
|
+
|
|
3
|
+
require Vagrant.source_root.join('plugins/commands/plugin/command/base').to_s
|
|
4
|
+
require "rubygems/dependency_installer"
|
|
5
|
+
|
|
6
|
+
module VagrantPlugins
|
|
7
|
+
module Bindler
|
|
8
|
+
module PluginCommand
|
|
9
|
+
# Based on https://github.com/mitchellh/vagrant/blob/master/plugins/commands/plugin/action/install_gem.rb
|
|
10
|
+
class Bundle < CommandPlugin::Command::Base
|
|
11
|
+
include VagrantPlugins::Bindler::Logging
|
|
12
|
+
|
|
13
|
+
def initialize(*)
|
|
14
|
+
super
|
|
15
|
+
|
|
16
|
+
if @env.local_data_path
|
|
17
|
+
@local_gems_path = @env.local_data_path.join('gems')
|
|
18
|
+
else
|
|
19
|
+
bindler_debug 'Local data path is not set'
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def execute
|
|
24
|
+
if @env.bindler_plugins_file
|
|
25
|
+
bindler_debug "#{@env.bindler_plugins_file} data: #{@env.bindler_plugins.inspect}"
|
|
26
|
+
|
|
27
|
+
if @env.bindler_plugins.any?
|
|
28
|
+
# REFACTOR: Use I18n
|
|
29
|
+
@env.ui.info('Installing plugins...')
|
|
30
|
+
|
|
31
|
+
@env.bindler_plugins.each do |plugin|
|
|
32
|
+
if plugin.is_a?(String)
|
|
33
|
+
install plugin
|
|
34
|
+
else
|
|
35
|
+
install *plugin.first
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
exit_code = 0
|
|
39
|
+
else
|
|
40
|
+
# REFACTOR: Use I18n
|
|
41
|
+
@env.ui.info("No plugins specified on #{@env.bindler_plugins_file}")
|
|
42
|
+
end
|
|
43
|
+
else
|
|
44
|
+
# REFACTOR: Use I18n
|
|
45
|
+
@env.ui.error "No plugins manifest file found, looked up on #{Vagrant::Environment::PLUGINS_JSON_LOOKUP}"
|
|
46
|
+
exit_code = 1
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
exit_code
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def gem_helper(path)
|
|
53
|
+
CommandPlugin::GemHelper.new(path)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def installed_gems
|
|
57
|
+
@installed ||= {}.tap do |installed|
|
|
58
|
+
# Combine project specific gems and global plugins
|
|
59
|
+
gem_helper("#{@local_gems_path}#{::File::PATH_SEPARATOR}#{@env.gems_path}").with_environment do
|
|
60
|
+
Gem::Specification.find_all.each do |spec|
|
|
61
|
+
(installed[spec.name] ||= {})[spec.version.to_s] = spec
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def install(plugin_name, version = nil)
|
|
68
|
+
plugin_name_label = plugin_name
|
|
69
|
+
plugin_name_label += " (#{version})" if version
|
|
70
|
+
|
|
71
|
+
versions = installed_gems.fetch(plugin_name, {}).keys
|
|
72
|
+
bindler_debug "Installed versions for #{plugin_name}: #{versions}"
|
|
73
|
+
|
|
74
|
+
if (versions.include? version) || (version.nil? && versions.any?)
|
|
75
|
+
@env.ui.info(" -> #{plugin_name_label} already installed")
|
|
76
|
+
return
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
gem_helper(@local_gems_path).with_environment do
|
|
80
|
+
installer = Gem::DependencyInstaller.new(:document => [])
|
|
81
|
+
|
|
82
|
+
begin
|
|
83
|
+
@env.ui.info(" -> #{plugin_name_label} ")
|
|
84
|
+
installer.install(plugin_name, version)
|
|
85
|
+
rescue Gem::GemNotFoundException
|
|
86
|
+
raise Vagrant::Errors::PluginInstallNotFound,
|
|
87
|
+
:name => plugin_name
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require Vagrant.source_root.join('plugins/commands/plugin/command/list').to_s
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module Bindler
|
|
5
|
+
module PluginCommand
|
|
6
|
+
# Override the built in `plugin list` command to output project specific
|
|
7
|
+
# plugins information
|
|
8
|
+
class List < CommandPlugin::Command::List
|
|
9
|
+
include VagrantPlugins::Bindler::Logging
|
|
10
|
+
|
|
11
|
+
def execute
|
|
12
|
+
return unless super == 0
|
|
13
|
+
|
|
14
|
+
if @env.bindler_plugins_file
|
|
15
|
+
bindler_debug "#{@env.bindler_plugins_file} data: #{@env.bindler_plugins.inspect}"
|
|
16
|
+
|
|
17
|
+
if @env.bindler_plugins.any?
|
|
18
|
+
@env.ui.info "\nProject dependencies:"
|
|
19
|
+
@env.bindler_plugins.each do |plugin|
|
|
20
|
+
if plugin.is_a?(String)
|
|
21
|
+
display plugin
|
|
22
|
+
else
|
|
23
|
+
display *plugin.first
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
else
|
|
28
|
+
@env.ui.info "\nNo project specific plugins manifest file found!"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Success, exit status 0
|
|
32
|
+
0
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def display(plugin, version = nil)
|
|
36
|
+
label = " -> #{plugin}"
|
|
37
|
+
label << " #{version}" if version
|
|
38
|
+
@env.ui.info label
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require Vagrant.source_root.join('plugins/commands/plugin/command/root').to_s
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module Bindler
|
|
5
|
+
module PluginCommand
|
|
6
|
+
class Root < CommandPlugin::Command::Root
|
|
7
|
+
def initialize(argv, env)
|
|
8
|
+
super
|
|
9
|
+
|
|
10
|
+
# Override the built in `plugin list` command to output project specific
|
|
11
|
+
# plugins information
|
|
12
|
+
@subcommands.register(:list) do
|
|
13
|
+
require_relative "list"
|
|
14
|
+
Bindler::PluginCommand::List
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
@subcommands.register(:bundle) do
|
|
18
|
+
require_relative "bundle"
|
|
19
|
+
Bindler::PluginCommand::Bundle
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require Vagrant.source_root.join('plugins/commands/plugin/command/root').to_s
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module Bindler
|
|
5
|
+
module BindlerCommand
|
|
6
|
+
class Root < Vagrant.plugin(2, :command)
|
|
7
|
+
def initialize(argv, env)
|
|
8
|
+
super
|
|
9
|
+
|
|
10
|
+
@main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
|
|
11
|
+
@subcommands = Vagrant::Registry.new
|
|
12
|
+
|
|
13
|
+
@subcommands.register(:setup) do
|
|
14
|
+
require_relative "setup"
|
|
15
|
+
Bindler::BindlerCommand::Setup
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def execute
|
|
20
|
+
if @main_args.include?("-h") || @main_args.include?("--help")
|
|
21
|
+
# Print the help for all the sub-commands.
|
|
22
|
+
return help
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# If we reached this far then we must have a subcommand. If not,
|
|
26
|
+
# then we also just print the help and exit.
|
|
27
|
+
command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
|
|
28
|
+
return help if !command_class || !@sub_command
|
|
29
|
+
@logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")
|
|
30
|
+
|
|
31
|
+
# Initialize and execute the command class
|
|
32
|
+
command_class.new(@sub_args, @env).execute
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Prints the help out for this command
|
|
36
|
+
def help
|
|
37
|
+
opts = OptionParser.new do |o|
|
|
38
|
+
o.banner = "Usage: vagrant bindler <command> [<args>]"
|
|
39
|
+
o.separator ""
|
|
40
|
+
o.separator "Available subcommands:"
|
|
41
|
+
|
|
42
|
+
# Add the available subcommands as separators in order to print them
|
|
43
|
+
# out as well.
|
|
44
|
+
keys = []
|
|
45
|
+
@subcommands.each { |key, value| keys << key.to_s }
|
|
46
|
+
|
|
47
|
+
keys.sort.each do |key|
|
|
48
|
+
o.separator " #{key}"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
o.separator ""
|
|
52
|
+
o.separator "For help on any individual command run `vagrant bundler COMMAND -h`"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
@env.ui.info(opts.help, :prefix => false)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require_relative '../logging'
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module Bindler
|
|
5
|
+
module BindlerCommand
|
|
6
|
+
class Setup < Vagrant.plugin(2, :command)
|
|
7
|
+
def execute
|
|
8
|
+
if @env.home_path.join('global-plugins.json').file?
|
|
9
|
+
@env.ui.info "Bindler has already been set up!"
|
|
10
|
+
return 0
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Load current plugins.json file
|
|
14
|
+
plugins_json = @env.home_path.join('plugins.json')
|
|
15
|
+
plugins_json_data = JSON.parse(plugins_json.read)
|
|
16
|
+
@logger.debug "Current #{plugins_json} data: #{plugins_json_data.inspect}"
|
|
17
|
+
|
|
18
|
+
# Gets a list of other plugins that are installed
|
|
19
|
+
@logger.debug "Getting list of installed plugins"
|
|
20
|
+
other_plugins = plugins_json_data['installed'].dup
|
|
21
|
+
other_plugins.delete('bindler')
|
|
22
|
+
|
|
23
|
+
# Save other plugins to a separate file
|
|
24
|
+
@logger.debug "Writing #{other_plugins.inspect} to #{@env.home_path.join('global-plugins.json')}"
|
|
25
|
+
@env.home_path.join('global-plugins.json').open("w+") do |f|
|
|
26
|
+
f.write(JSON.dump({'installed' => other_plugins}))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Leave only bindler on the global plugins file
|
|
30
|
+
plugins_json_data['installed'] = ['bindler']
|
|
31
|
+
@logger.debug "Writing #{plugins_json_data.inspect} to #{plugins_json}"
|
|
32
|
+
plugins_json.open('w+') do |f|
|
|
33
|
+
f.write(JSON.dump plugins_json_data)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Add require to ~/.vagrant.d/Vagrantfile
|
|
37
|
+
vagrantfile = @env.home_path.join('Vagrantfile')
|
|
38
|
+
vagrantfile_contents = vagrantfile.file? ? vagrantfile.read : ''
|
|
39
|
+
# FIXME: We need to handle emacs / vim file types comments
|
|
40
|
+
vagrantfile_contents = <<-STR
|
|
41
|
+
begin
|
|
42
|
+
require 'bindler'
|
|
43
|
+
rescue LoadError; end
|
|
44
|
+
#{vagrantfile_contents}
|
|
45
|
+
STR
|
|
46
|
+
@logger.debug "Writing to system wide Vagrantfile:\n#{vagrantfile_contents}"
|
|
47
|
+
@env.home_path.join('Vagrantfile').open("w+") do |f|
|
|
48
|
+
f.write vagrantfile_contents
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
0
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
data/locales/en.yml
ADDED
data/tasks/deploy.rake
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
task :clean do
|
|
2
|
+
sh 'rm -f pkg/*.gem'
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
task :install_vm do
|
|
6
|
+
Bundler.with_clean_env do
|
|
7
|
+
sh "cd development && vagrant ssh -c 'vagrant plugin uninstall bindler && vagrant plugin install /vagrant/pkg/bindler-*.gem'"
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
desc 'Rebuild plugin and install on Vagrant dev VM'
|
|
12
|
+
task :deploy => [:clean, :build, :install_vm]
|
metadata
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: bindler
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Fabio Rehm
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2013-07-24 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ~>
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.3'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ~>
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.3'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - '>='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - '>='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
description: Dead easy Vagrant plugins management
|
|
42
|
+
email:
|
|
43
|
+
- fgrehm@gmail.com
|
|
44
|
+
executables: []
|
|
45
|
+
extensions: []
|
|
46
|
+
extra_rdoc_files: []
|
|
47
|
+
files:
|
|
48
|
+
- .gitignore
|
|
49
|
+
- Gemfile
|
|
50
|
+
- Gemfile.lock
|
|
51
|
+
- LICENSE.txt
|
|
52
|
+
- README.md
|
|
53
|
+
- Rakefile
|
|
54
|
+
- bindler.gemspec
|
|
55
|
+
- development/Vagrantfile
|
|
56
|
+
- lib/bindler.rb
|
|
57
|
+
- lib/vundler/bend_vagrant.rb
|
|
58
|
+
- lib/vundler/local_plugins_manifest_ext.rb
|
|
59
|
+
- lib/vundler/logging.rb
|
|
60
|
+
- lib/vundler/plugin.rb
|
|
61
|
+
- lib/vundler/plugin_command/bundle.rb
|
|
62
|
+
- lib/vundler/plugin_command/list.rb
|
|
63
|
+
- lib/vundler/plugin_command/root.rb
|
|
64
|
+
- lib/vundler/plugin_not_found_error.rb
|
|
65
|
+
- lib/vundler/version.rb
|
|
66
|
+
- lib/vundler/vundler_command/root.rb
|
|
67
|
+
- lib/vundler/vundler_command/setup.rb
|
|
68
|
+
- locales/en.yml
|
|
69
|
+
- tasks/deploy.rake
|
|
70
|
+
homepage: https://github.com/fgrehm/vundler
|
|
71
|
+
licenses:
|
|
72
|
+
- MIT
|
|
73
|
+
metadata: {}
|
|
74
|
+
post_install_message:
|
|
75
|
+
rdoc_options: []
|
|
76
|
+
require_paths:
|
|
77
|
+
- lib
|
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - '>='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
|
+
requirements:
|
|
85
|
+
- - '>='
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: '0'
|
|
88
|
+
requirements: []
|
|
89
|
+
rubyforge_project:
|
|
90
|
+
rubygems_version: 2.0.0
|
|
91
|
+
signing_key:
|
|
92
|
+
specification_version: 4
|
|
93
|
+
summary: Dead easy Vagrant plugins management
|
|
94
|
+
test_files: []
|