gitenv 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +4 -0
- data/VERSION +1 -1
- data/bin/gitenv +1 -3
- data/gitenv.gemspec +15 -2
- data/lib/gitenv/actions.rb +28 -0
- data/lib/gitenv/all_files.rb +10 -0
- data/lib/gitenv/config.rb +53 -0
- data/lib/gitenv/context.rb +46 -0
- data/lib/gitenv/controller.rb +46 -0
- data/lib/gitenv/copy.rb +13 -0
- data/lib/gitenv/dot_files.rb +10 -0
- data/lib/gitenv/enumerator.rb +20 -0
- data/lib/gitenv/symlink.rb +62 -0
- data/lib/gitenv.rb +4 -168
- data/lib/program.rb +23 -0
- metadata +28 -2
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
commander (4.1.2)
|
5
|
+
highline (~> 1.6.11)
|
4
6
|
diff-lcs (1.1.3)
|
5
7
|
gem-release (0.4.1)
|
6
8
|
gemcutter (0.7.1)
|
7
9
|
git (1.2.5)
|
10
|
+
highline (1.6.15)
|
8
11
|
jeweler (1.8.4)
|
9
12
|
bundler (~> 1.0)
|
10
13
|
git (>= 1.2.5)
|
@@ -36,6 +39,7 @@ PLATFORMS
|
|
36
39
|
|
37
40
|
DEPENDENCIES
|
38
41
|
bundler
|
42
|
+
commander (~> 4.1.2)
|
39
43
|
gem-release
|
40
44
|
gemcutter
|
41
45
|
jeweler
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/bin/gitenv
CHANGED
data/gitenv.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "gitenv"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["AlphaHydrae"]
|
12
|
-
s.date = "2012-09-
|
12
|
+
s.date = "2012-09-23"
|
13
13
|
s.description = "Creates symlinks to configuration files in a git repository."
|
14
14
|
s.email = "hydrae.alpha@gmail.com"
|
15
15
|
s.executables = ["gitenv"]
|
@@ -31,6 +31,16 @@ Gem::Specification.new do |s|
|
|
31
31
|
"bin/gitenv",
|
32
32
|
"gitenv.gemspec",
|
33
33
|
"lib/gitenv.rb",
|
34
|
+
"lib/gitenv/actions.rb",
|
35
|
+
"lib/gitenv/all_files.rb",
|
36
|
+
"lib/gitenv/config.rb",
|
37
|
+
"lib/gitenv/context.rb",
|
38
|
+
"lib/gitenv/controller.rb",
|
39
|
+
"lib/gitenv/copy.rb",
|
40
|
+
"lib/gitenv/dot_files.rb",
|
41
|
+
"lib/gitenv/enumerator.rb",
|
42
|
+
"lib/gitenv/symlink.rb",
|
43
|
+
"lib/program.rb",
|
34
44
|
"spec/helper.rb",
|
35
45
|
"spec/version_spec.rb"
|
36
46
|
]
|
@@ -45,6 +55,7 @@ Gem::Specification.new do |s|
|
|
45
55
|
|
46
56
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
57
|
s.add_runtime_dependency(%q<paint>, ["~> 0.8.5"])
|
58
|
+
s.add_runtime_dependency(%q<commander>, ["~> 4.1.2"])
|
48
59
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
49
60
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
50
61
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
@@ -55,6 +66,7 @@ Gem::Specification.new do |s|
|
|
55
66
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
56
67
|
else
|
57
68
|
s.add_dependency(%q<paint>, ["~> 0.8.5"])
|
69
|
+
s.add_dependency(%q<commander>, ["~> 4.1.2"])
|
58
70
|
s.add_dependency(%q<bundler>, [">= 0"])
|
59
71
|
s.add_dependency(%q<rake>, [">= 0"])
|
60
72
|
s.add_dependency(%q<rspec>, [">= 0"])
|
@@ -66,6 +78,7 @@ Gem::Specification.new do |s|
|
|
66
78
|
end
|
67
79
|
else
|
68
80
|
s.add_dependency(%q<paint>, ["~> 0.8.5"])
|
81
|
+
s.add_dependency(%q<commander>, ["~> 4.1.2"])
|
69
82
|
s.add_dependency(%q<bundler>, [">= 0"])
|
70
83
|
s.add_dependency(%q<rake>, [">= 0"])
|
71
84
|
s.add_dependency(%q<rspec>, [">= 0"])
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
module Gitenv
|
3
|
+
|
4
|
+
class Actions
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@actions = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def each &block
|
11
|
+
@actions.each &block
|
12
|
+
end
|
13
|
+
|
14
|
+
def from path
|
15
|
+
@actions.each{ |a| a.from path }
|
16
|
+
@actions
|
17
|
+
end
|
18
|
+
|
19
|
+
def to path
|
20
|
+
@actions.each{ |a| a.to path }
|
21
|
+
@actions
|
22
|
+
end
|
23
|
+
|
24
|
+
def << action
|
25
|
+
@actions << action
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
module Gitenv
|
3
|
+
|
4
|
+
class Config
|
5
|
+
include Context
|
6
|
+
|
7
|
+
attr_reader :actions
|
8
|
+
attr_reader :repository
|
9
|
+
attr_reader :home
|
10
|
+
|
11
|
+
def initialize home
|
12
|
+
@home = home
|
13
|
+
@actions = Actions.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def repo path
|
17
|
+
@repository = File.expand_path path
|
18
|
+
end
|
19
|
+
|
20
|
+
def symlink file
|
21
|
+
|
22
|
+
scope = self
|
23
|
+
current_actions = Actions.new
|
24
|
+
enumerator(file).each do |f|
|
25
|
+
current_actions << Symlink.new(scope, f).tap do |action|
|
26
|
+
@actions << action
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
current_actions
|
31
|
+
end
|
32
|
+
|
33
|
+
def all_files
|
34
|
+
:all_files
|
35
|
+
end
|
36
|
+
|
37
|
+
def dot_files
|
38
|
+
:dot_files
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def enumerator file
|
44
|
+
if file == :all_files
|
45
|
+
AllFiles.new File.join(*[@repository, from_path].compact)
|
46
|
+
elsif file == :dot_files
|
47
|
+
DotFiles.new File.join(*[@repository, from_path].compact)
|
48
|
+
else
|
49
|
+
[ file ]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
module Gitenv
|
3
|
+
|
4
|
+
module Context
|
5
|
+
|
6
|
+
def from path, &block
|
7
|
+
(@from_path ||= []) << path
|
8
|
+
if block
|
9
|
+
instance_eval &block
|
10
|
+
@from_path.pop
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def from_path
|
15
|
+
@from_path ? File.join(*@from_path) : nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def from_paths
|
19
|
+
@from_path || []
|
20
|
+
end
|
21
|
+
|
22
|
+
def from_paths= paths
|
23
|
+
@from_path = paths
|
24
|
+
end
|
25
|
+
|
26
|
+
def to path, &block
|
27
|
+
(@to_path ||= []) << path
|
28
|
+
if block
|
29
|
+
instance_eval &block
|
30
|
+
@to_path.pop
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_path
|
35
|
+
@to_path ? File.join(*@to_path) : nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_paths
|
39
|
+
@to_path || []
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_paths= paths
|
43
|
+
@to_path = paths
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
module Gitenv
|
3
|
+
|
4
|
+
class Controller
|
5
|
+
|
6
|
+
def initialize action, options
|
7
|
+
|
8
|
+
@action = action
|
9
|
+
@options = options
|
10
|
+
|
11
|
+
@home = File.expand_path '~'
|
12
|
+
@config = Config.new @home
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
load_config_file!
|
17
|
+
@config.actions.each &:build!
|
18
|
+
@config.actions.each &:update! if @action == :update
|
19
|
+
@config.actions.each{ |a| puts a }
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def load_config_file!
|
25
|
+
|
26
|
+
config_file = @options.config ? File.expand_path(@options.config) : File.join(@home, '.gitenv.rb')
|
27
|
+
if !File.exists?(config_file) and @options.config
|
28
|
+
abort "No such configuration file #{config_file}"
|
29
|
+
elsif !File.exists?(config_file)
|
30
|
+
abort "You must create a configuration file #{config_file} or load another one with the --config option"
|
31
|
+
elsif !File.file?(config_file)
|
32
|
+
abort "Configuration file #{config_file} is not a file"
|
33
|
+
elsif !File.readable?(config_file)
|
34
|
+
abort "Configuration file #{config_file} is not readable"
|
35
|
+
end
|
36
|
+
|
37
|
+
contents = File.open(config_file, 'r').read
|
38
|
+
@config.instance_eval contents, config_file
|
39
|
+
end
|
40
|
+
|
41
|
+
def abort msg, code = 1
|
42
|
+
warn ms
|
43
|
+
exit code
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/gitenv/copy.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Gitenv
|
4
|
+
|
5
|
+
class Symlink
|
6
|
+
include Context
|
7
|
+
|
8
|
+
def initialize config, file
|
9
|
+
@config, @file = config, file
|
10
|
+
self.from_paths = config.from_paths.dup
|
11
|
+
self.to_paths = config.to_paths.dup
|
12
|
+
end
|
13
|
+
|
14
|
+
def build!
|
15
|
+
@color, @mark, @message = if File.symlink? link
|
16
|
+
@current_target = File.expand_path File.readlink(link)
|
17
|
+
if @current_target == target
|
18
|
+
[ :green, "✓", "ok" ]
|
19
|
+
else
|
20
|
+
[ :yellow, "✗", "currently points to #{@current_target}" ]
|
21
|
+
end
|
22
|
+
elsif File.file? link
|
23
|
+
[ :red, "✗", "is a file" ]
|
24
|
+
elsif File.directory? link
|
25
|
+
[ :red, "✗", "is a directory" ]
|
26
|
+
elsif File.exists? link
|
27
|
+
[ :red, "✗", "exists but is not a symlink" ]
|
28
|
+
else
|
29
|
+
[ :blue, "✓", "is not set up" ]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def update!
|
34
|
+
if !File.exists? link
|
35
|
+
File.symlink target, link
|
36
|
+
@color, @mark, @message = :green, "✓", "ok"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
%/ #{status_mark} #{Paint[link, :cyan]} -> #{target} #{status_message}/
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def status_mark
|
47
|
+
Paint["#{@mark}", @color]
|
48
|
+
end
|
49
|
+
|
50
|
+
def status_message
|
51
|
+
Paint["#{@message}", @color]
|
52
|
+
end
|
53
|
+
|
54
|
+
def link
|
55
|
+
File.join(*[ @config.home, to_path, @file].compact)
|
56
|
+
end
|
57
|
+
|
58
|
+
def target
|
59
|
+
File.join(*[ @config.repository, from_path, @file ].compact)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/gitenv.rb
CHANGED
@@ -2,173 +2,9 @@
|
|
2
2
|
require 'paint'
|
3
3
|
|
4
4
|
module Gitenv
|
5
|
-
VERSION = '0.0.
|
6
|
-
|
7
|
-
class Runner
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@home = File.expand_path '~'
|
11
|
-
@config_file = File.join @home, '.gitenv.rb'
|
12
|
-
end
|
13
|
-
|
14
|
-
def run
|
15
|
-
|
16
|
-
@dsl = DSL.new
|
17
|
-
@dsl.instance_eval File.open(@config_file, 'r').read, @config_file
|
18
|
-
|
19
|
-
action = ARGV.shift || 'info'
|
20
|
-
|
21
|
-
puts
|
22
|
-
puts "gitenv v#{VERSION}"
|
23
|
-
puts "configuration #{@config_file}"
|
24
|
-
puts
|
25
|
-
case action
|
26
|
-
when 'info'
|
27
|
-
puts Paint["Listing current state", :bright, :bold]
|
28
|
-
when 'update'
|
29
|
-
puts Paint["Creating missing links", :blue, :bold]
|
30
|
-
end
|
31
|
-
|
32
|
-
@dsl.symlinks.each do |link|
|
33
|
-
|
34
|
-
link_file_path = File.join @home, link[:file]
|
35
|
-
real_file = link[:source] || link[:file]
|
36
|
-
real_file_path = File.join File.expand_path(@dsl.repository), real_file
|
37
|
-
|
38
|
-
msg = %/#{Paint[link_file_path, :cyan]} -> #{real_file_path}/
|
39
|
-
data = analyze link_file_path, real_file_path
|
40
|
-
|
41
|
-
case action
|
42
|
-
when 'info'
|
43
|
-
puts %/#{info_mark data}#{msg} #{info_msg data}/
|
44
|
-
when 'update'
|
45
|
-
unless File.exists? link_file_path
|
46
|
-
File.symlink real_file_path, link_file_path
|
47
|
-
end
|
48
|
-
puts %/#{update_mark data}#{msg} #{update_msg data}/
|
49
|
-
else
|
50
|
-
raise "No such action #{action}"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
puts
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def update_mark data
|
60
|
-
case data[:status]
|
61
|
-
when :setup
|
62
|
-
Paint[" ✓ ", :green]
|
63
|
-
when :wrong_link
|
64
|
-
Paint[" ✗ ", :yellow]
|
65
|
-
when :not_link
|
66
|
-
Paint[" ✗ ", :yellow]
|
67
|
-
when :void
|
68
|
-
Paint[" ✓ ", :green]
|
69
|
-
else
|
70
|
-
Paint[" ? ", :red]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def update_msg data
|
75
|
-
case data[:status]
|
76
|
-
when :setup
|
77
|
-
Paint["already here", :green]
|
78
|
-
when :wrong_link
|
79
|
-
Paint["skipped (points to #{data[:target]})", :yellow]
|
80
|
-
when :not_link
|
81
|
-
Paint["skipped (not a symlink)", :yellow]
|
82
|
-
when :void
|
83
|
-
Paint["set up", :green]
|
84
|
-
else
|
85
|
-
Paint["unknown", :red]
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def info_msg data
|
90
|
-
case data[:status]
|
91
|
-
when :setup
|
92
|
-
Paint["already here", :green]
|
93
|
-
when :wrong_link
|
94
|
-
Paint["points to #{data[:target]}", :yellow]
|
95
|
-
when :not_link
|
96
|
-
Paint["is not a symlink", :red]
|
97
|
-
when :void
|
98
|
-
Paint["is not yet set up", :blue]
|
99
|
-
else
|
100
|
-
Paint["unknown", :red]
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def info_mark data
|
105
|
-
case data[:status]
|
106
|
-
when :setup
|
107
|
-
Paint[" ✓ ", :green]
|
108
|
-
when :wrong_link
|
109
|
-
Paint[" ✗ ", :red]
|
110
|
-
when :not_link
|
111
|
-
Paint[" ✗ ", :red]
|
112
|
-
when :void
|
113
|
-
Paint[" ✓ ", :green]
|
114
|
-
else
|
115
|
-
Paint[" ? ", :red]
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def analyze link_file_path, real_file_path
|
120
|
-
if File.symlink? link_file_path
|
121
|
-
current_real_file_path = File.expand_path(File.readlink(link_file_path))
|
122
|
-
if current_real_file_path == real_file_path
|
123
|
-
{ :status => :setup }
|
124
|
-
else
|
125
|
-
{ :status => :wrong_link, :target => current_real_file_path }
|
126
|
-
end
|
127
|
-
elsif File.exists? link_file_path
|
128
|
-
{ :status => :not_link }
|
129
|
-
else
|
130
|
-
{ :status => :void }
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
class DSL
|
136
|
-
attr_reader :repository
|
137
|
-
attr_reader :symlinks
|
138
|
-
|
139
|
-
def initialize
|
140
|
-
@symlinks = []
|
141
|
-
end
|
142
|
-
|
143
|
-
def repo path
|
144
|
-
@repository = File.expand_path path
|
145
|
-
raise unless File.directory? @repository
|
146
|
-
end
|
147
|
-
|
148
|
-
def within path
|
149
|
-
path = File.expand_path path
|
150
|
-
raise unless File.directory? path
|
151
|
-
@within = path
|
152
|
-
yield
|
153
|
-
@within = nil
|
154
|
-
end
|
155
|
-
|
156
|
-
def symlink file, source = nil
|
157
|
-
source ||= file
|
158
|
-
s = source || file
|
159
|
-
f = File.join @repository, s
|
160
|
-
raise "Unknown file #{f}" unless File.exists? f
|
161
|
-
@symlinks << { :file => file, :source => source, :within => @within }
|
162
|
-
end
|
163
|
-
|
164
|
-
def configure &block
|
165
|
-
@self_before_instance_eval = eval "self", block.binding
|
166
|
-
instance_eval &block
|
167
|
-
@self_before_instance_eval = nil
|
168
|
-
end
|
5
|
+
VERSION = '0.0.3'
|
6
|
+
end
|
169
7
|
|
170
|
-
|
171
|
-
|
172
|
-
end
|
173
|
-
end
|
8
|
+
[ :context, :config, :controller, :symlink, :copy, :enumerator, :all_files, :dot_files, :actions ].each do |lib|
|
9
|
+
require File.join(File.dirname(__FILE__), 'gitenv', lib.to_s)
|
174
10
|
end
|
data/lib/program.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join File.dirname(__FILE__), 'gitenv'
|
2
|
+
require 'commander/import'
|
3
|
+
|
4
|
+
program :name, 'gitenv'
|
5
|
+
program :version, Gitenv::VERSION
|
6
|
+
program :description, 'Symlink manager for git repositories with configuration files.'
|
7
|
+
|
8
|
+
command :info do |c|
|
9
|
+
c.action do |args,options|
|
10
|
+
Gitenv::Controller.new(:info, options).run
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
command :update do |c|
|
15
|
+
c.action do |args,options|
|
16
|
+
Gitenv::Controller.new(:update, options).run
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
global_option '-c', '--config FILE', 'Use a custom configuration file (defaults to ~/.gitenv.rb)'
|
21
|
+
|
22
|
+
default_command :info
|
23
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitenv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: paint
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 0.8.5
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: commander
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 4.1.2
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 4.1.2
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: bundler
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -177,6 +193,16 @@ files:
|
|
177
193
|
- bin/gitenv
|
178
194
|
- gitenv.gemspec
|
179
195
|
- lib/gitenv.rb
|
196
|
+
- lib/gitenv/actions.rb
|
197
|
+
- lib/gitenv/all_files.rb
|
198
|
+
- lib/gitenv/config.rb
|
199
|
+
- lib/gitenv/context.rb
|
200
|
+
- lib/gitenv/controller.rb
|
201
|
+
- lib/gitenv/copy.rb
|
202
|
+
- lib/gitenv/dot_files.rb
|
203
|
+
- lib/gitenv/enumerator.rb
|
204
|
+
- lib/gitenv/symlink.rb
|
205
|
+
- lib/program.rb
|
180
206
|
- spec/helper.rb
|
181
207
|
- spec/version_spec.rb
|
182
208
|
homepage: http://github.com/AlphaHydrae/gitenv
|