evm 0.0.1 → 0.0.2
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/bin/emacs +10 -0
- data/bin/evm +7 -0
- data/lib/evm/builder.rb +83 -0
- data/lib/evm/cli.rb +26 -0
- data/lib/evm/command/bin.rb +19 -0
- data/lib/evm/command/install.rb +25 -0
- data/lib/evm/command/list.rb +22 -0
- data/lib/evm/command/uninstall.rb +21 -0
- data/lib/evm/command/use.rb +19 -0
- data/lib/evm/command.rb +10 -0
- data/lib/evm/exception.rb +4 -0
- data/lib/evm/os.rb +19 -0
- data/lib/evm/package.rb +83 -0
- data/lib/evm/recipe.rb +40 -0
- data/lib/evm/system.rb +20 -0
- data/lib/evm/tar_file.rb +51 -0
- data/lib/evm.rb +49 -0
- metadata +48 -26
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
data.tar.gz: 8fb0ab152c90381b5c75dc3e838ba90c8921cfe1
|
4
|
+
metadata.gz: cac1bab75598acb21fabc23f70efa34126e21b1d
|
5
|
+
SHA512:
|
6
|
+
data.tar.gz: e2a1929f41aeb72569cb4030ab32beebc9b332ca402a881f9a5bf556c66f17e343d2875dfb83b2af2a49da0c7c146ff3a6126dc9ecab6085a8044c10c81558f7
|
7
|
+
metadata.gz: 202ac5cde3e3e33fee21999a2ffb9951ab4535c2d708e77b9eae43c4b1ef9d744e6729ee33f644950d66deff8bb00ae28184ce3957bcd4d0a81fab5d54229941
|
data/bin/emacs
ADDED
data/bin/evm
ADDED
data/lib/evm/builder.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'open3'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Evm
|
5
|
+
class Builder
|
6
|
+
class Dsl
|
7
|
+
def initialize
|
8
|
+
@options = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def recipe(name, &block)
|
12
|
+
@name = name
|
13
|
+
|
14
|
+
yield
|
15
|
+
end
|
16
|
+
|
17
|
+
def tar_gz(name)
|
18
|
+
tar_file = Evm::TarFile.new(name)
|
19
|
+
tar_file.download!
|
20
|
+
tar_file.extract!
|
21
|
+
end
|
22
|
+
|
23
|
+
def osx(&block)
|
24
|
+
yield if Evm::Os.osx?
|
25
|
+
end
|
26
|
+
|
27
|
+
def linux(&block)
|
28
|
+
yield if Evm::Os.linux?
|
29
|
+
end
|
30
|
+
|
31
|
+
def option(name, value = nil)
|
32
|
+
@options << name
|
33
|
+
@options << value if value
|
34
|
+
end
|
35
|
+
|
36
|
+
def install(&block)
|
37
|
+
yield
|
38
|
+
end
|
39
|
+
|
40
|
+
def configure
|
41
|
+
run_command './configure', *@options
|
42
|
+
end
|
43
|
+
|
44
|
+
def make(target)
|
45
|
+
run_command 'make', target
|
46
|
+
end
|
47
|
+
|
48
|
+
def build_path
|
49
|
+
Evm.local.join('tmp', @name)
|
50
|
+
end
|
51
|
+
|
52
|
+
def installation_path
|
53
|
+
Evm.local.join(@name)
|
54
|
+
end
|
55
|
+
|
56
|
+
def platform_name
|
57
|
+
Evm::Os.platform_name
|
58
|
+
end
|
59
|
+
|
60
|
+
def copy(from, to)
|
61
|
+
FileUtils.cp_r(from, to)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def run_command(command, *args)
|
67
|
+
Dir.chdir(build_path) do
|
68
|
+
system = Evm::System.new(command)
|
69
|
+
system.run(args)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def initialize(recipe)
|
75
|
+
@recipe = recipe
|
76
|
+
end
|
77
|
+
|
78
|
+
def build!
|
79
|
+
dsl = Dsl.new
|
80
|
+
dsl.instance_eval(@recipe.read)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/evm/cli.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Evm
|
2
|
+
module Cli
|
3
|
+
def self.parse(argv)
|
4
|
+
options = {}
|
5
|
+
|
6
|
+
if argv.include?('--force')
|
7
|
+
options[:force] = !!argv.delete('--force')
|
8
|
+
end
|
9
|
+
|
10
|
+
if argv.include?('--help') || argv.include?('-h')
|
11
|
+
Evm.print_usage_and_die
|
12
|
+
end
|
13
|
+
|
14
|
+
command, argument = argv
|
15
|
+
|
16
|
+
begin
|
17
|
+
const = Evm::Command.const_get(command.capitalize)
|
18
|
+
const.new(argument, options)
|
19
|
+
rescue NameError
|
20
|
+
Evm.die "No such command: #{command}"
|
21
|
+
rescue Evm::Exception => exception
|
22
|
+
Evm.die exception.message
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Evm
|
2
|
+
module Command
|
3
|
+
class Bin
|
4
|
+
def initialize(package_name = nil, options = {})
|
5
|
+
if package_name
|
6
|
+
package = Evm::Package.find(package_name)
|
7
|
+
else
|
8
|
+
package = Evm::Package.current
|
9
|
+
end
|
10
|
+
|
11
|
+
if package
|
12
|
+
STDOUT.puts package.bin
|
13
|
+
else
|
14
|
+
raise Evm::Exception.new('No current selected')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Evm
|
2
|
+
module Command
|
3
|
+
class Install
|
4
|
+
def initialize(package_name, options = {})
|
5
|
+
unless package_name
|
6
|
+
raise Evm::Exception.new('The install command requires an argument')
|
7
|
+
end
|
8
|
+
|
9
|
+
package = Evm::Package.find(package_name)
|
10
|
+
|
11
|
+
if options[:force]
|
12
|
+
package.uninstall!
|
13
|
+
end
|
14
|
+
|
15
|
+
if package.installed?
|
16
|
+
raise Evm::Exception.new("Already installed #{package_name}")
|
17
|
+
else
|
18
|
+
package.install!
|
19
|
+
|
20
|
+
STDOUT.puts "Successfully installed #{package_name}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Evm
|
2
|
+
module Command
|
3
|
+
class List
|
4
|
+
def initialize(*args)
|
5
|
+
packages = Evm::Package.all
|
6
|
+
packages.each do |package|
|
7
|
+
if package.current?
|
8
|
+
STDOUT.print '* '
|
9
|
+
end
|
10
|
+
|
11
|
+
STDOUT.print package
|
12
|
+
|
13
|
+
if package.installed?
|
14
|
+
STDOUT.print ' [I]'
|
15
|
+
end
|
16
|
+
|
17
|
+
STDOUT.puts
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Evm
|
2
|
+
module Command
|
3
|
+
class Uninstall
|
4
|
+
def initialize(package_name, options = {})
|
5
|
+
unless package_name
|
6
|
+
raise Evm::Exception.new('The uninstall command requires an argument')
|
7
|
+
end
|
8
|
+
|
9
|
+
package = Evm::Package.find(package_name)
|
10
|
+
|
11
|
+
if package.installed?
|
12
|
+
package.uninstall!
|
13
|
+
|
14
|
+
STDOUT.puts "Successfully uninstalled #{package_name}"
|
15
|
+
else
|
16
|
+
raise Evm::Exception.new("Not installed #{package_name}")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Evm
|
2
|
+
module Command
|
3
|
+
class Use
|
4
|
+
def initialize(package_name, options = {})
|
5
|
+
unless package_name
|
6
|
+
raise Evm::Exception.new('The use command requires an argument')
|
7
|
+
end
|
8
|
+
|
9
|
+
package = Evm::Package.find(package_name)
|
10
|
+
|
11
|
+
if package.installed?
|
12
|
+
package.use!
|
13
|
+
else
|
14
|
+
raise Evm::Exception.new("Package not installed: #{package_name}")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/evm/command.rb
ADDED
data/lib/evm/os.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Evm
|
2
|
+
module Os
|
3
|
+
def self.osx?
|
4
|
+
RUBY_PLATFORM.downcase.include?('darwin')
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.linux?
|
8
|
+
RUBY_PLATFORM.downcase.include?('linux')
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.platform_name
|
12
|
+
if osx?
|
13
|
+
:osx
|
14
|
+
elsif linux?
|
15
|
+
:linux
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/evm/package.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
module Evm
|
2
|
+
class Package
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name)
|
6
|
+
@name = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def current?
|
10
|
+
Package.current && Package.current.name == @name
|
11
|
+
end
|
12
|
+
|
13
|
+
def installed?
|
14
|
+
path.exist?
|
15
|
+
end
|
16
|
+
|
17
|
+
def path
|
18
|
+
Evm.local.join(@name)
|
19
|
+
end
|
20
|
+
|
21
|
+
def bin
|
22
|
+
if Evm::Os.osx? && path.join('Emacs.app').exist?
|
23
|
+
path.join('Emacs.app', 'Contents', 'MacOS', 'Emacs')
|
24
|
+
else
|
25
|
+
path.join('bin', 'emacs')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def use!
|
30
|
+
File.open(Package.current_file, 'w') do |file|
|
31
|
+
file.write(@name)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def install!
|
36
|
+
Evm::Builder.new(recipe).build!
|
37
|
+
end
|
38
|
+
|
39
|
+
def uninstall!
|
40
|
+
path.rmtree
|
41
|
+
|
42
|
+
if current?
|
43
|
+
Package.current_file.delete
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_s
|
48
|
+
@name
|
49
|
+
end
|
50
|
+
|
51
|
+
def recipe
|
52
|
+
Evm::Recipe.find(@name)
|
53
|
+
end
|
54
|
+
|
55
|
+
class << self
|
56
|
+
def current_file
|
57
|
+
Evm.local.join('current')
|
58
|
+
end
|
59
|
+
|
60
|
+
def current
|
61
|
+
if current_file.exist?
|
62
|
+
find(current_file.read)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def find(package_name)
|
67
|
+
recipe = Evm::Recipe.find(package_name)
|
68
|
+
if recipe
|
69
|
+
Package.new(package_name)
|
70
|
+
else
|
71
|
+
raise Evm::Exception.new("No such package: #{package_name}")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def all
|
76
|
+
recipes = Evm::Recipe.all
|
77
|
+
recipes.map do |recipe|
|
78
|
+
Package.new(recipe.name)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/evm/recipe.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module Evm
|
2
|
+
class Recipe
|
3
|
+
RECIPE_PATH = Evm.root.join('recipes')
|
4
|
+
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
class Dsl
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
def recipe(name, &block)
|
11
|
+
@name = name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(recipe_file)
|
16
|
+
@recipe_file = recipe_file
|
17
|
+
|
18
|
+
dsl = Dsl.new
|
19
|
+
dsl.instance_eval(read)
|
20
|
+
|
21
|
+
@name = dsl.name
|
22
|
+
end
|
23
|
+
|
24
|
+
def read
|
25
|
+
File.read(@recipe_file)
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
def find(name)
|
30
|
+
all.find { |recipe| recipe.name == name }
|
31
|
+
end
|
32
|
+
|
33
|
+
def all
|
34
|
+
Dir.glob(RECIPE_PATH.join('*.rb')).map do |recipe_file|
|
35
|
+
Recipe.new(recipe_file)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/evm/system.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Evm
|
2
|
+
class System
|
3
|
+
def initialize(executable)
|
4
|
+
@executable = executable
|
5
|
+
end
|
6
|
+
|
7
|
+
def run(*args)
|
8
|
+
command = build_command(args)
|
9
|
+
unless Kernel.system(command)
|
10
|
+
raise Evm::Exception.new("An error occurred running command: #{command}")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def build_command(args)
|
17
|
+
([@executable] + args).join(' ')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/evm/tar_file.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module Evm
|
4
|
+
class TarFile
|
5
|
+
def initialize(name)
|
6
|
+
@name = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def download!
|
10
|
+
unless tars_path.exist?
|
11
|
+
tars_path.mkdir
|
12
|
+
end
|
13
|
+
|
14
|
+
unless tar_path.exist?
|
15
|
+
File.open(tar_path, 'wb') do |write_file|
|
16
|
+
open(url, 'rb') do |read_file|
|
17
|
+
write_file.write(read_file.read)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def extract!
|
24
|
+
unless builds_path.exist?
|
25
|
+
builds_path.mkdir
|
26
|
+
end
|
27
|
+
|
28
|
+
system = Evm::System.new('tar')
|
29
|
+
system.run('-xzf', tar_path.to_s, '-C', builds_path.to_s)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def url
|
36
|
+
"https://s3.amazonaws.com/emacs-evm/#{@name}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def tars_path
|
40
|
+
Evm.local.join('tars')
|
41
|
+
end
|
42
|
+
|
43
|
+
def tar_path
|
44
|
+
tars_path.join(@name)
|
45
|
+
end
|
46
|
+
|
47
|
+
def builds_path
|
48
|
+
Evm.local.join('tmp')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/evm.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module Evm
|
4
|
+
def self.root
|
5
|
+
Pathname.new(__FILE__).parent.parent.expand_path
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.local
|
9
|
+
Pathname.new('/').join('usr', 'local', 'evm')
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.die(*args)
|
13
|
+
args.each do |arg|
|
14
|
+
STDERR.print(arg)
|
15
|
+
STDERR.puts
|
16
|
+
end
|
17
|
+
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.print_usage_and_die
|
22
|
+
die <<-EOS
|
23
|
+
USAGE: evm COMMAND [OPTIONS]
|
24
|
+
|
25
|
+
Emacs Version Manager
|
26
|
+
|
27
|
+
COMMANDS:
|
28
|
+
install <name> Install package name
|
29
|
+
uninstall <name> Uninstall package name
|
30
|
+
bin [name] Show path to Emacs binary for package name
|
31
|
+
list List all available packages
|
32
|
+
use <name> Select name as current package
|
33
|
+
|
34
|
+
OPTIONS:
|
35
|
+
--force Force install even when already installed
|
36
|
+
--help, -h Display this help message
|
37
|
+
EOS
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
require 'evm/os'
|
42
|
+
require 'evm/cli'
|
43
|
+
require 'evm/recipe'
|
44
|
+
require 'evm/package'
|
45
|
+
require 'evm/command'
|
46
|
+
require 'evm/exception'
|
47
|
+
require 'evm/builder'
|
48
|
+
require 'evm/tar_file'
|
49
|
+
require 'evm/system'
|
metadata
CHANGED
@@ -1,47 +1,69 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: evm
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
6
|
+
authors:
|
8
7
|
- Johan Andersson
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
11
|
+
|
12
|
+
date: 2013-12-01 00:00:00 Z
|
13
13
|
dependencies: []
|
14
|
-
|
15
|
-
|
14
|
+
|
15
|
+
description: EVM is a command-line tool that allows you to install multiple Emacs versions.
|
16
16
|
email: johan.rejeep@gmail.com
|
17
|
-
executables:
|
17
|
+
executables:
|
18
|
+
- evm
|
19
|
+
- emacs
|
18
20
|
extensions: []
|
21
|
+
|
19
22
|
extra_rdoc_files: []
|
20
|
-
|
23
|
+
|
24
|
+
files:
|
25
|
+
- lib/evm/builder.rb
|
26
|
+
- lib/evm/cli.rb
|
27
|
+
- lib/evm/command/bin.rb
|
28
|
+
- lib/evm/command/install.rb
|
29
|
+
- lib/evm/command/list.rb
|
30
|
+
- lib/evm/command/uninstall.rb
|
31
|
+
- lib/evm/command/use.rb
|
32
|
+
- lib/evm/command.rb
|
33
|
+
- lib/evm/exception.rb
|
34
|
+
- lib/evm/os.rb
|
35
|
+
- lib/evm/package.rb
|
36
|
+
- lib/evm/recipe.rb
|
37
|
+
- lib/evm/system.rb
|
38
|
+
- lib/evm/tar_file.rb
|
21
39
|
- lib/evm.rb
|
40
|
+
- bin/evm
|
41
|
+
- bin/emacs
|
22
42
|
homepage: http://github.com/rejeep/evm
|
23
|
-
licenses:
|
43
|
+
licenses:
|
24
44
|
- MIT
|
45
|
+
metadata: {}
|
46
|
+
|
25
47
|
post_install_message:
|
26
48
|
rdoc_options: []
|
27
|
-
|
49
|
+
|
50
|
+
require_paths:
|
28
51
|
- lib
|
29
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version:
|
35
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
-
|
37
|
-
|
38
|
-
- - ! '>='
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- &id001
|
55
|
+
- ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- *id001
|
41
61
|
requirements: []
|
62
|
+
|
42
63
|
rubyforge_project:
|
43
|
-
rubygems_version:
|
64
|
+
rubygems_version: 2.0.14
|
44
65
|
signing_key:
|
45
|
-
specification_version:
|
66
|
+
specification_version: 4
|
46
67
|
summary: Emacs Version Manager
|
47
68
|
test_files: []
|
69
|
+
|