lace 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/bin/lace +10 -1
- data/lib/cmd/activate.rb +1 -1
- data/lib/cmd/deactivate.rb +1 -1
- data/lib/cmd/fetch.rb +1 -1
- data/lib/cmd/inspect.rb +11 -2
- data/lib/cmd/install.rb +1 -1
- data/lib/cmd/list.rb +4 -4
- data/lib/cmd/remove.rb +1 -1
- data/lib/cmd/update.rb +1 -1
- data/lib/extend/pathname.rb +1 -50
- data/lib/lace/download_strategy.rb +1 -1
- data/lib/lace/exceptions.rb +39 -0
- data/lib/lace/package.rb +57 -38
- data/lib/lace/version.rb +1 -1
- metadata +6 -8
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
N2EwOWNjNGJiNTg5NWE0YTM0NGVmZjcyMGJlZGEwNzkyZmRlZWU3YQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NzM4NzhkMWU0NTRhZjljYjVjZTA1OWFlMjA1MmQyMWViYjg1NmQ1Ng==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MzQ3ZjA0OWU5OTU2YWVmOTAzMDAxYjQ5MDU3NWI4MDFkMDNkMDZjMzMxZDVm
|
10
|
+
NjVmODEwMjcyYzcxZTk2MDAyMWE5NDI2MTlhMWEyMjAyYTc5NWM4NmQxMmFk
|
11
|
+
OThkODU1NzM5MWRhNDk0NmRkMjM1NDNiNTIxYjJlZjc3MTk4MmU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZjI3N2ZkMTczNDdkMWZkY2U1ZDgwMzYzYTZkMGY5NTRlMzY0ZTVhZDM5ZWJi
|
14
|
+
MjdjY2RjYjY4NDAxMjBjODkzMmM1NjkzNGM1M2Y1ZGFjNDMxNTIyOWQ4ZDAx
|
15
|
+
MmYxMTQ3ZTU1M2ZmN2ZhMzY2MDA1NjUwN2QxMTRhYmY0Y2RiMDM=
|
data/bin/lace
CHANGED
@@ -30,6 +30,14 @@ if ARGV.debug?
|
|
30
30
|
require "debugger"
|
31
31
|
end
|
32
32
|
|
33
|
+
def require? path
|
34
|
+
require path.to_s.chomp
|
35
|
+
rescue LoadError => e
|
36
|
+
# HACK :( because we should raise on syntax errors but
|
37
|
+
# not if the file doesn't exist. TODO make robust!
|
38
|
+
raise unless e.to_s.include? path
|
39
|
+
end
|
40
|
+
|
33
41
|
case ARGV.first when '-h', '--help', '--usage', '-?', 'help', nil
|
34
42
|
require 'cmd/help'
|
35
43
|
puts Lace.help_s
|
@@ -58,7 +66,8 @@ begin
|
|
58
66
|
cmd = ARGV.shift
|
59
67
|
cmd = aliases[cmd] if aliases[cmd]
|
60
68
|
|
61
|
-
|
69
|
+
|
70
|
+
if require? "cmd/" + cmd
|
62
71
|
Lace.send cmd.to_s.gsub('-', '_').downcase
|
63
72
|
else
|
64
73
|
onoe "Unknown command: #{cmd}"
|
data/lib/cmd/activate.rb
CHANGED
data/lib/cmd/deactivate.rb
CHANGED
data/lib/cmd/fetch.rb
CHANGED
data/lib/cmd/inspect.rb
CHANGED
@@ -4,10 +4,11 @@ require 'lace/package'
|
|
4
4
|
require 'lace/exceptions'
|
5
5
|
|
6
6
|
INSPECT = <<-EOS
|
7
|
-
Inspection of
|
7
|
+
Inspection of <%= package.name %>:
|
8
8
|
active: <%= package.is_active? %>
|
9
9
|
flavors: <%= package.flavors %>
|
10
10
|
version: <%= package.version %>
|
11
|
+
homepage: <%= package.homepage %>
|
11
12
|
upgradeable: <%= package.upgradeable? %>
|
12
13
|
manifest: <%= package.manifest %>
|
13
14
|
EOS
|
@@ -18,7 +19,7 @@ module Lace extend self
|
|
18
19
|
raise ResourceNotSpecified if not resource
|
19
20
|
package = PackagePresenter.new Package.new(resource, false)
|
20
21
|
puts ERB.new(INSPECT).result(binding)
|
21
|
-
|
22
|
+
end
|
22
23
|
end
|
23
24
|
|
24
25
|
class PackagePresenter
|
@@ -28,6 +29,10 @@ class PackagePresenter
|
|
28
29
|
@pkg = obj
|
29
30
|
end
|
30
31
|
|
32
|
+
def name
|
33
|
+
@pkg.name
|
34
|
+
end
|
35
|
+
|
31
36
|
def is_active?
|
32
37
|
pkg.is_active?
|
33
38
|
end
|
@@ -46,6 +51,10 @@ class PackagePresenter
|
|
46
51
|
@pkg.facts.version or 'n/a'
|
47
52
|
end
|
48
53
|
|
54
|
+
def homepage
|
55
|
+
@pkg.facts.homepage or 'n/a'
|
56
|
+
end
|
57
|
+
|
49
58
|
def upgradeable?
|
50
59
|
@pkg.is_git_repo?
|
51
60
|
end
|
data/lib/cmd/install.rb
CHANGED
data/lib/cmd/list.rb
CHANGED
@@ -10,21 +10,21 @@ module Lace extend self
|
|
10
10
|
end.compact.uniq
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
13
|
+
def active_packages
|
14
14
|
linked_files.map do |path|
|
15
15
|
Pathname.new File.dirname(path)
|
16
16
|
end.uniq
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def installed_packages
|
20
20
|
Dir.glob(File.join(LACE_PKGS_FOLDER, "**")).sort.map do |p|
|
21
21
|
Pathname.new(p).basename.to_s
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def list
|
26
|
-
if
|
27
|
-
|
26
|
+
if installed_packages.length > 0
|
27
|
+
installed_packages.map do |d|
|
28
28
|
package = Package.new d, false
|
29
29
|
puts "- [#{Tty.green}#{package.is_active? ? "*" : " "}#{Tty.reset}] #{d}"
|
30
30
|
end
|
data/lib/cmd/remove.rb
CHANGED
data/lib/cmd/update.rb
CHANGED
data/lib/extend/pathname.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'pathname'
|
2
|
-
|
2
|
+
# borrowed from brew.sh
|
3
3
|
# we enhance pathname to make our code more readable
|
4
4
|
class Pathname
|
5
5
|
|
@@ -136,55 +136,6 @@ class Pathname
|
|
136
136
|
(dirname+link).exist?
|
137
137
|
end
|
138
138
|
|
139
|
-
# perhaps confusingly, this Pathname object becomes the symlink pointing to
|
140
|
-
# the src paramter.
|
141
|
-
def make_relative_symlink src
|
142
|
-
src = Pathname.new(src) unless src.kind_of? Pathname
|
143
|
-
|
144
|
-
self.dirname.mkpath
|
145
|
-
Dir.chdir self.dirname do
|
146
|
-
# NOTE only system ln -s will create RELATIVE symlinks
|
147
|
-
quiet_system 'ln', '-s', src.relative_path_from(self.dirname), self.basename
|
148
|
-
if not $?.success?
|
149
|
-
if self.exist?
|
150
|
-
raise <<-EOS.undent
|
151
|
-
Could not symlink file: #{src.expand_path}
|
152
|
-
Target #{self} already exists. You may need to delete it.
|
153
|
-
To force the link and overwrite all other conflicting files, do:
|
154
|
-
brew link --overwrite formula_name
|
155
|
-
|
156
|
-
To list all files that would be deleted:
|
157
|
-
brew link --overwrite --dry-run formula_name
|
158
|
-
EOS
|
159
|
-
# #exist? will return false for symlinks whose target doesn't exist
|
160
|
-
elsif self.symlink?
|
161
|
-
raise <<-EOS.undent
|
162
|
-
Could not symlink file: #{src.expand_path}
|
163
|
-
Target #{self} already exists as a symlink to #{readlink}.
|
164
|
-
If this file is from another formula, you may need to
|
165
|
-
`brew unlink` it. Otherwise, you may want to delete it.
|
166
|
-
To force the link and overwrite all other conflicting files, do:
|
167
|
-
brew link --overwrite formula_name
|
168
|
-
|
169
|
-
To list all files that would be deleted:
|
170
|
-
brew link --overwrite --dry-run formula_name
|
171
|
-
EOS
|
172
|
-
elsif !dirname.writable_real?
|
173
|
-
raise <<-EOS.undent
|
174
|
-
Could not symlink file: #{src.expand_path}
|
175
|
-
#{dirname} is not writable. You should change its permissions.
|
176
|
-
EOS
|
177
|
-
else
|
178
|
-
raise <<-EOS.undent
|
179
|
-
Could not symlink file: #{src.expand_path}
|
180
|
-
#{self} may already exist.
|
181
|
-
#{dirname} may not be writable.
|
182
|
-
EOS
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
139
|
def / that
|
189
140
|
join that.to_s
|
190
141
|
end
|
data/lib/lace/exceptions.rb
CHANGED
@@ -20,6 +20,45 @@ class NonActiveFlavorError < RuntimeError
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
class PackageAlreadyInstalled < RuntimeError
|
24
|
+
def initialize
|
25
|
+
super "Package already installed"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class CannotRemoveActivePackage < RuntimeError
|
30
|
+
def initialize
|
31
|
+
super "Cannot remove active pkg, deactivate first"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class PackageNotInstalled < RuntimeError
|
36
|
+
def initialize name
|
37
|
+
super "Package #{name} is not installed"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class FlavorError < RuntimeError; end
|
42
|
+
|
43
|
+
class FlavorArgumentRequired < FlavorError
|
44
|
+
def initialize available_flavors
|
45
|
+
super FlavorArgumentMsg % available_flavors.join("\n- ")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class PackageFactsNotFound < RuntimeError
|
50
|
+
def initialize path
|
51
|
+
super "No PackageFacts found in #{path}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class PackageFlavorDoesNotExist < FlavorError
|
56
|
+
def initialize which_flavor, flavors
|
57
|
+
super "Flavor '#{which_flavor}' does not exist"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
23
62
|
FlavorArgumentMsg = <<-EOS
|
24
63
|
Sorry, this command needs a flavor argument you can choose from the following:
|
25
64
|
- %s
|
data/lib/lace/package.rb
CHANGED
@@ -1,67 +1,73 @@
|
|
1
|
+
require 'set'
|
1
2
|
require 'yaml'
|
2
3
|
require 'ostruct'
|
3
|
-
require 'set'
|
4
4
|
|
5
5
|
require 'lace/download_strategy'
|
6
6
|
require 'lace/exceptions'
|
7
7
|
|
8
8
|
class PackageUtils
|
9
|
-
def self.
|
9
|
+
def self.has_active_flavors name
|
10
10
|
@path = LACE_PKGS_FOLDER/name
|
11
11
|
facts = Facts.new @path
|
12
|
-
facts.flavors.any?{|f| Package.new(@name, f).is_active?}
|
12
|
+
facts.flavors.any?{|f| Package.new(@name, f).is_active? }
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.fetch uri
|
15
|
+
def self.fetch uri
|
16
16
|
downloader = DownloadStrategyDetector.detect(uri).new(uri)
|
17
|
-
if downloader.target_folder.exist?
|
18
|
-
raise "Package already installed"
|
19
|
-
end
|
17
|
+
raise PackageAlreadyInstalled.new if downloader.target_folder.exist?
|
20
18
|
downloader.fetch
|
19
|
+
begin
|
20
|
+
package = Package.new downloader.name, false
|
21
|
+
rescue PackageFactsNotFound => e
|
22
|
+
onoe e.message
|
23
|
+
onoe "Removing fetched files"
|
24
|
+
FileUtils.rm_rf downloader.target_folder
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
|
-
def self.remove package_name
|
24
|
-
ohai "Removing"
|
28
|
+
def self.remove package_name
|
25
29
|
package = Package.new package_name, false
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
else
|
30
|
-
ofail "Cannot remove active pkg, deactivate first"
|
31
|
-
end
|
30
|
+
raise CannotRemoveActivePackage.new if package.is_active?
|
31
|
+
ohai "Removing"
|
32
|
+
FileUtils.rm_rf package.path
|
32
33
|
end
|
33
34
|
|
34
|
-
def self.install uri
|
35
|
+
def self.install uri
|
35
36
|
downloader = DownloadStrategyDetector.detect(uri).new(uri)
|
36
|
-
|
37
|
-
|
37
|
+
self.fetch uri
|
38
|
+
begin
|
39
|
+
package = Package.new downloader.name, ARGV.first
|
40
|
+
package.activate!
|
41
|
+
package.after_install
|
42
|
+
rescue FlavorError => e
|
43
|
+
onoe e.message
|
44
|
+
onoe "Package remains installed but was not activated"
|
38
45
|
end
|
39
|
-
downloader.fetch
|
40
|
-
package = Package.new downloader.name, ARGV.first
|
41
|
-
package.activate!
|
42
|
-
package.after_install
|
43
46
|
end
|
44
47
|
|
45
|
-
def self.deactivate package_name
|
46
|
-
package = Package.new package_name, ARGV.
|
48
|
+
def self.deactivate package_name
|
49
|
+
package = Package.new package_name, ARGV.first
|
47
50
|
raise NonActiveFlavorError.new unless package.is_active?
|
51
|
+
ohai "Deactivating"
|
48
52
|
package.deactivate!
|
49
53
|
end
|
50
54
|
|
51
|
-
def self.activate package_name
|
52
|
-
package = Package.new package_name, ARGV.
|
55
|
+
def self.activate package_name
|
56
|
+
package = Package.new package_name, ARGV.first
|
53
57
|
raise AlreadyActiveError.new if Package.new(package_name, false).is_active?
|
58
|
+
ohai "Activating"
|
54
59
|
package.activate!
|
55
60
|
end
|
56
61
|
|
57
|
-
def self.update package_name
|
62
|
+
def self.update package_name
|
58
63
|
package = Package.new package_name, false
|
59
64
|
raise OnlyGitReposCanBeUpdatedError.new unless package.is_git_repo?
|
60
65
|
updater = GitUpdateStrategy.new package_name
|
61
|
-
|
66
|
+
self.deactivate package_name
|
67
|
+
ohai "Updating"
|
62
68
|
updater.update
|
63
|
-
|
64
|
-
package.
|
69
|
+
self.activate package_name
|
70
|
+
package = Package.new package_name, false
|
65
71
|
package.after_update
|
66
72
|
end
|
67
73
|
end
|
@@ -71,9 +77,9 @@ class Facts
|
|
71
77
|
def initialize location
|
72
78
|
@location = Pathname.new(location)
|
73
79
|
@facts_file = @location/".lace.yml"
|
74
|
-
raise
|
75
|
-
@facts =
|
76
|
-
@_facts =
|
80
|
+
raise PackageFactsNotFound.new(@location) unless @facts_file.exist?
|
81
|
+
@facts = facts_file_to_hash
|
82
|
+
@_facts = facts_file_to_hash
|
77
83
|
end
|
78
84
|
|
79
85
|
def config_files
|
@@ -98,6 +104,10 @@ class Facts
|
|
98
104
|
@_facts["version"] if @_facts.key? "version"
|
99
105
|
end
|
100
106
|
|
107
|
+
def homepage
|
108
|
+
@_facts["homepage"] if @_facts.key? "homepage"
|
109
|
+
end
|
110
|
+
|
101
111
|
def flavors
|
102
112
|
if @_facts && @_facts.key?("flavors")
|
103
113
|
@_facts["flavors"].keys
|
@@ -107,7 +117,7 @@ class Facts
|
|
107
117
|
end
|
108
118
|
|
109
119
|
def flavor! which_flavor
|
110
|
-
raise
|
120
|
+
raise PackageFlavorDoesNotExist.new(which_flavor, flavors) unless flavors.include? which_flavor
|
111
121
|
@facts = @_facts["flavors"][which_flavor]
|
112
122
|
end
|
113
123
|
|
@@ -123,6 +133,16 @@ class Facts
|
|
123
133
|
(post_hook[hook_point.to_s] || []).flatten
|
124
134
|
end
|
125
135
|
end
|
136
|
+
|
137
|
+
protected
|
138
|
+
def facts_file_to_hash
|
139
|
+
value = YAML.load @facts_file.read
|
140
|
+
if value.is_a?(String) && value == "---"
|
141
|
+
return Hash.new
|
142
|
+
else
|
143
|
+
value
|
144
|
+
end
|
145
|
+
end
|
126
146
|
end
|
127
147
|
|
128
148
|
class Package
|
@@ -151,7 +171,7 @@ class Package
|
|
151
171
|
|
152
172
|
def initialize name, flavor=nil
|
153
173
|
require 'cmd/list'
|
154
|
-
raise
|
174
|
+
raise PackageNotInstalled.new(name) unless Lace.installed_packages.include? name
|
155
175
|
@name = name
|
156
176
|
@path = LACE_PKGS_FOLDER/name
|
157
177
|
@flavor = flavor
|
@@ -174,16 +194,16 @@ class Package
|
|
174
194
|
end
|
175
195
|
|
176
196
|
def read_facts!
|
197
|
+
# todo simplify
|
177
198
|
@facts = Facts.new @path
|
178
199
|
if @facts.has_flavors? && @flavor.nil?
|
179
|
-
raise
|
200
|
+
raise FlavorArgumentRequired.new @facts.flavors
|
180
201
|
elsif @facts.has_flavors? && @flavor != false
|
181
202
|
@facts.flavor! @flavor
|
182
203
|
end
|
183
204
|
end
|
184
205
|
|
185
206
|
def deactivate!
|
186
|
-
ohai "Deactivating"
|
187
207
|
files = @facts.config_files
|
188
208
|
home_dir = ENV["HOME"]
|
189
209
|
files.each do |file|
|
@@ -193,7 +213,6 @@ class Package
|
|
193
213
|
end
|
194
214
|
|
195
215
|
def activate!
|
196
|
-
ohai "Activating"
|
197
216
|
files = @facts.config_files
|
198
217
|
home_dir = ENV["HOME"]
|
199
218
|
files.each do |file|
|
data/lib/lace/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Kai Richard Koenig
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-09 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: This is a simple/unfinished tool which i use to manage my dotfiles on
|
15
14
|
all the different machines
|
@@ -19,6 +18,7 @@ executables:
|
|
19
18
|
extensions: []
|
20
19
|
extra_rdoc_files: []
|
21
20
|
files:
|
21
|
+
- bin/lace
|
22
22
|
- lib/cmd/activate.rb
|
23
23
|
- lib/cmd/deactivate.rb
|
24
24
|
- lib/cmd/fetch.rb
|
@@ -36,30 +36,28 @@ files:
|
|
36
36
|
- lib/lace/package.rb
|
37
37
|
- lib/lace/utils.rb
|
38
38
|
- lib/lace/version.rb
|
39
|
-
- bin/lace
|
40
39
|
homepage: https://github.com/kairichard/lace
|
41
40
|
licenses:
|
42
41
|
- MIT
|
42
|
+
metadata: {}
|
43
43
|
post_install_message:
|
44
44
|
rdoc_options: []
|
45
45
|
require_paths:
|
46
46
|
- lib
|
47
47
|
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
-
none: false
|
49
48
|
requirements:
|
50
49
|
- - ! '>='
|
51
50
|
- !ruby/object:Gem::Version
|
52
51
|
version: 1.8.6
|
53
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
-
none: false
|
55
53
|
requirements:
|
56
54
|
- - ! '>='
|
57
55
|
- !ruby/object:Gem::Version
|
58
56
|
version: '0'
|
59
57
|
requirements: []
|
60
58
|
rubyforge_project:
|
61
|
-
rubygems_version:
|
59
|
+
rubygems_version: 2.2.0
|
62
60
|
signing_key:
|
63
|
-
specification_version:
|
61
|
+
specification_version: 4
|
64
62
|
summary: Manage your .dotfiles
|
65
63
|
test_files: []
|