lace 0.2.3 → 0.3.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 +8 -8
- data/bin/lace +1 -0
- data/lib/cmd/fetch.rb +9 -1
- data/lib/cmd/help.rb +3 -3
- data/lib/cmd/list.rb +1 -1
- data/lib/cmd/setup.rb +9 -0
- data/lib/cmd/validate.rb +6 -6
- data/lib/extend/ARGV.rb +4 -0
- data/lib/extend/pathname.rb +2 -125
- data/lib/lace/exceptions.rb +1 -1
- data/lib/lace/package.rb +16 -22
- data/lib/lace/version.rb +1 -1
- metadata +3 -3
- data/lib/cmd/install.rb +0 -10
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTE1YjU3OTUwMmFjYzNkOTYwZWFjODA1ZjUyZDU5NWY3YzYwMDA2ZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OGYxN2E5M2ZhY2VjZDQzMWJmY2I3MWFmYWM1YzRiMDA0ODRmOGRmNg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjEzNDY5ZmQxNzE5ODJlMmNiZjM2YmRkZjkxOWY1MWY5MzE1YmRmYzZlZDIx
|
10
|
+
ODRiY2EwMjYwMDEzYjJiZDEzM2JlZTVlMjllNjNhODlmZWJiNTZiZmZlNzYy
|
11
|
+
ZDc0MjVjYmZhMTNjNGM4ODYwMTMxNWJiMGZiNzhkMTUxNzI1N2M=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Y2RkNzExZWJiNzQ2NjJmNzNmNTg5NjZmZjA1OTlhM2Y2MWU3ZjE4NjJiYWU5
|
14
|
+
NWUwOTJhMzYxYWRjMTIxODg4ZTUyN2I3MWE2MjY5YWRlNzZlOWUzN2QwNWI0
|
15
|
+
NWQyM2QwNWZkZTgzYTcyZjE3NmQwNDJhOWU4M2U5NGRmNjM1ZTY=
|
data/bin/lace
CHANGED
data/lib/cmd/fetch.rb
CHANGED
@@ -5,6 +5,14 @@ module Lace extend self
|
|
5
5
|
def fetch
|
6
6
|
resource = ARGV.shift
|
7
7
|
raise ResourceNotSpecified if not resource
|
8
|
-
PackageUtils.fetch resource
|
8
|
+
package_name, target_folder = PackageUtils.fetch resource
|
9
|
+
begin
|
10
|
+
Package.new package_name, false
|
11
|
+
rescue PackageFactsNotFound => e
|
12
|
+
onoe e.message
|
13
|
+
onoe "Removing fetched files"
|
14
|
+
FileUtils.rm_rf target_folder
|
15
|
+
Lace.failed = true
|
16
|
+
end
|
9
17
|
end
|
10
18
|
end
|
data/lib/cmd/help.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
HELP = <<-EOS
|
2
2
|
Example usage:
|
3
3
|
Synopsis:
|
4
|
-
lace <cmd> <pkg-uri/name> [<flavor>] [--name=<name>] [--version] [--no-hooks]
|
4
|
+
lace <cmd> <pkg-uri/name> [<flavor>] [--name=<name>] [--version] [--no-hooks] [--force]
|
5
5
|
|
6
6
|
lace ls
|
7
7
|
|
8
8
|
lace fetch <pkg-uri>
|
9
9
|
lace fetch <pkg-uri>
|
10
10
|
|
11
|
-
lace
|
12
|
-
lace
|
11
|
+
lace setup <pkg-uri>
|
12
|
+
lace setup <pkg-uri> <flavor>
|
13
13
|
|
14
14
|
lace activate <pkg-name>
|
15
15
|
lace activate <pkg-name> <flavor>
|
data/lib/cmd/list.rb
CHANGED
@@ -26,7 +26,7 @@ module Lace extend self
|
|
26
26
|
if installed_packages.length > 0
|
27
27
|
installed_packages.map do |d|
|
28
28
|
package = Package.new d, false
|
29
|
-
puts "
|
29
|
+
puts "[#{Tty.green}#{package.is_active? ? "*" : " "}#{Tty.reset}] #{d}"
|
30
30
|
end
|
31
31
|
else
|
32
32
|
puts "There are no pkgs installed"
|
data/lib/cmd/setup.rb
ADDED
data/lib/cmd/validate.rb
CHANGED
@@ -40,7 +40,7 @@ class PackageValidator
|
|
40
40
|
validate 'config-files', :config_files_present
|
41
41
|
validate 'version', :version_present
|
42
42
|
validate 'homepage', :homepage_present
|
43
|
-
validate '
|
43
|
+
validate 'setup', :setup_ok
|
44
44
|
validate 'post-update hook', :post_update_hooks_ok
|
45
45
|
|
46
46
|
def initialize facts, flavor=nil
|
@@ -64,8 +64,8 @@ class PackageValidator
|
|
64
64
|
end.compact
|
65
65
|
end
|
66
66
|
|
67
|
-
def hook_ok
|
68
|
-
hook_cmd =
|
67
|
+
def hook_ok config_files
|
68
|
+
hook_cmd = config_files
|
69
69
|
if hook_cmd.empty?
|
70
70
|
["#{Tty.green}skipped#{Tty.reset}", nil]
|
71
71
|
else
|
@@ -78,12 +78,12 @@ class PackageValidator
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
def
|
82
|
-
hook_ok
|
81
|
+
def setup_ok
|
82
|
+
hook_ok @facts.setup_files
|
83
83
|
end
|
84
84
|
|
85
85
|
def post_update_hooks_ok
|
86
|
-
hook_ok :update
|
86
|
+
hook_ok @facts.post :update
|
87
87
|
end
|
88
88
|
|
89
89
|
def homepage_present
|
data/lib/extend/ARGV.rb
CHANGED
data/lib/extend/pathname.rb
CHANGED
@@ -12,16 +12,6 @@ class Pathname
|
|
12
12
|
return dst
|
13
13
|
end
|
14
14
|
|
15
|
-
# extended to support common double extensions
|
16
|
-
alias extname_old extname
|
17
|
-
def extname(path=to_s)
|
18
|
-
BOTTLE_EXTNAME_RX.match(path)
|
19
|
-
return $1 if $1
|
20
|
-
/(\.(tar|cpio|pax)\.(gz|bz2|xz|Z))$/.match(path)
|
21
|
-
return $1 if $1
|
22
|
-
return File.extname(path)
|
23
|
-
end
|
24
|
-
|
25
15
|
# for filetypes we support, basename without extension
|
26
16
|
def stem
|
27
17
|
File.basename((path = to_s), extname(path))
|
@@ -49,68 +39,6 @@ class Pathname
|
|
49
39
|
FileUtils.chmod_R perms, to_s
|
50
40
|
end
|
51
41
|
|
52
|
-
def abv
|
53
|
-
out=''
|
54
|
-
n=`find #{to_s} -type f ! -name .DS_Store | wc -l`.to_i
|
55
|
-
out<<"#{n} files, " if n > 1
|
56
|
-
out<<`/usr/bin/du -hs #{to_s} | cut -d"\t" -f1`.strip
|
57
|
-
end
|
58
|
-
|
59
|
-
def compression_type
|
60
|
-
# Don't treat jars or wars as compressed
|
61
|
-
return nil if self.extname == '.jar'
|
62
|
-
return nil if self.extname == '.war'
|
63
|
-
|
64
|
-
# OS X installer package
|
65
|
-
return :pkg if self.extname == '.pkg'
|
66
|
-
|
67
|
-
# If the filename ends with .gz not preceded by .tar
|
68
|
-
# then we want to gunzip but not tar
|
69
|
-
return :gzip_only if self.extname == '.gz'
|
70
|
-
|
71
|
-
# Get enough of the file to detect common file types
|
72
|
-
# POSIX tar magic has a 257 byte offset
|
73
|
-
# magic numbers stolen from /usr/share/file/magic/
|
74
|
-
case open('rb') { |f| f.read(262) }
|
75
|
-
when /^PK\003\004/n then :zip
|
76
|
-
when /^\037\213/n then :gzip
|
77
|
-
when /^BZh/n then :bzip2
|
78
|
-
when /^\037\235/n then :compress
|
79
|
-
when /^.{257}ustar/n then :tar
|
80
|
-
when /^\xFD7zXZ\x00/n then :xz
|
81
|
-
when /^Rar!/n then :rar
|
82
|
-
when /^7z\xBC\xAF\x27\x1C/n then :p7zip
|
83
|
-
else
|
84
|
-
# This code so that bad-tarballs and zips produce good error messages
|
85
|
-
# when they don't unarchive properly.
|
86
|
-
case extname
|
87
|
-
when ".tar.gz", ".tgz", ".tar.bz2", ".tbz" then :tar
|
88
|
-
when ".zip" then :zip
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def text_executable?
|
94
|
-
%r[^#!\s*\S+] === open('r') { |f| f.read(1024) }
|
95
|
-
end
|
96
|
-
|
97
|
-
def incremental_hash(hasher)
|
98
|
-
incr_hash = hasher.new
|
99
|
-
buf = ""
|
100
|
-
open('rb') { |f| incr_hash << buf while f.read(1024, buf) }
|
101
|
-
incr_hash.hexdigest
|
102
|
-
end
|
103
|
-
|
104
|
-
def sha1
|
105
|
-
require 'digest/sha1'
|
106
|
-
incremental_hash(Digest::SHA1)
|
107
|
-
end
|
108
|
-
|
109
|
-
def sha256
|
110
|
-
require 'digest/sha2'
|
111
|
-
incremental_hash(Digest::SHA2)
|
112
|
-
end
|
113
|
-
|
114
42
|
if '1.9' <= RUBY_VERSION
|
115
43
|
alias_method :to_str, :to_s
|
116
44
|
end
|
@@ -140,59 +68,8 @@ class Pathname
|
|
140
68
|
join that.to_s
|
141
69
|
end
|
142
70
|
|
143
|
-
def
|
144
|
-
|
145
|
-
unless writable_real?
|
146
|
-
saved_perms = stat.mode
|
147
|
-
chmod 0644
|
148
|
-
end
|
149
|
-
yield
|
150
|
-
ensure
|
151
|
-
chmod saved_perms if saved_perms
|
152
|
-
end
|
153
|
-
|
154
|
-
# Writes an exec script in this folder for each target pathname
|
155
|
-
def write_exec_script *targets
|
156
|
-
targets.flatten!
|
157
|
-
if targets.empty?
|
158
|
-
opoo "tried to write exec scripts to #{self} for an empty list of targets"
|
159
|
-
end
|
160
|
-
targets.each do |target|
|
161
|
-
target = Pathname.new(target) # allow pathnames or strings
|
162
|
-
(self+target.basename()).write <<-EOS.undent
|
163
|
-
#!/bin/bash
|
164
|
-
exec "#{target}" "$@"
|
165
|
-
EOS
|
166
|
-
end
|
71
|
+
def as_dotfile base_folder
|
72
|
+
Pathname.new File.join(base_folder, ".#{basename}")
|
167
73
|
end
|
168
74
|
|
169
|
-
# We redefine these private methods in order to add the /o modifier to
|
170
|
-
# the Regexp literals, which forces string interpolation to happen only
|
171
|
-
# once instead of each time the method is called. This is fixed in 1.9+.
|
172
|
-
if RUBY_VERSION <= "1.8.7"
|
173
|
-
alias_method :old_chop_basename, :chop_basename
|
174
|
-
def chop_basename(path)
|
175
|
-
base = File.basename(path)
|
176
|
-
if /\A#{Pathname::SEPARATOR_PAT}?\z/o =~ base
|
177
|
-
return nil
|
178
|
-
else
|
179
|
-
return path[0, path.rindex(base)], base
|
180
|
-
end
|
181
|
-
end
|
182
|
-
private :chop_basename
|
183
|
-
|
184
|
-
alias_method :old_prepend_prefix, :prepend_prefix
|
185
|
-
def prepend_prefix(prefix, relpath)
|
186
|
-
if relpath.empty?
|
187
|
-
File.dirname(prefix)
|
188
|
-
elsif /#{SEPARATOR_PAT}/o =~ prefix
|
189
|
-
prefix = File.dirname(prefix)
|
190
|
-
prefix = File.join(prefix, "") if File.basename(prefix + 'a') != 'a'
|
191
|
-
prefix + relpath
|
192
|
-
else
|
193
|
-
prefix + relpath
|
194
|
-
end
|
195
|
-
end
|
196
|
-
private :prepend_prefix
|
197
|
-
end
|
198
75
|
end
|
data/lib/lace/exceptions.rb
CHANGED
data/lib/lace/package.rb
CHANGED
@@ -16,14 +16,8 @@ class PackageUtils
|
|
16
16
|
downloader = DownloadStrategyDetector.detect(uri).new(uri)
|
17
17
|
raise PackageAlreadyInstalled.new if downloader.target_folder.exist?
|
18
18
|
downloader.fetch
|
19
|
-
|
20
|
-
|
21
|
-
rescue PackageFactsNotFound => e
|
22
|
-
onoe e.message
|
23
|
-
onoe "Removing fetched files"
|
24
|
-
FileUtils.rm_rf downloader.target_folder
|
25
|
-
end
|
26
|
-
end
|
19
|
+
return downloader.name, downloader.target_folder
|
20
|
+
end
|
27
21
|
|
28
22
|
def self.remove package_name
|
29
23
|
package = Package.new package_name, false
|
@@ -32,13 +26,11 @@ class PackageUtils
|
|
32
26
|
FileUtils.rm_rf package.path
|
33
27
|
end
|
34
28
|
|
35
|
-
def self.
|
36
|
-
downloader = DownloadStrategyDetector.detect(uri).new(uri)
|
37
|
-
self.fetch uri
|
29
|
+
def self.setup package_name
|
38
30
|
begin
|
39
|
-
package = Package.new
|
31
|
+
package = Package.new package_name, ARGV.first
|
40
32
|
package.activate!
|
41
|
-
package.
|
33
|
+
package.setup
|
42
34
|
rescue FlavorError => e
|
43
35
|
onoe e.message
|
44
36
|
onoe "Package remains installed but was not activated"
|
@@ -47,7 +39,7 @@ class PackageUtils
|
|
47
39
|
|
48
40
|
def self.deactivate package_name
|
49
41
|
package = Package.new package_name, ARGV.first
|
50
|
-
raise NonActiveFlavorError.new unless package.is_active?
|
42
|
+
raise NonActiveFlavorError.new unless package.is_active? || ARGV.force?
|
51
43
|
ohai "Deactivating"
|
52
44
|
package.deactivate!
|
53
45
|
end
|
@@ -104,6 +96,10 @@ class Facts
|
|
104
96
|
@_facts["version"] if @_facts.key? "version"
|
105
97
|
end
|
106
98
|
|
99
|
+
def setup_files
|
100
|
+
@facts["setup"].flatten rescue []
|
101
|
+
end
|
102
|
+
|
107
103
|
def homepage
|
108
104
|
@_facts["homepage"] if @_facts.key? "homepage"
|
109
105
|
end
|
@@ -149,11 +145,10 @@ class Package
|
|
149
145
|
include GitCommands
|
150
146
|
attr_reader :name, :facts, :path
|
151
147
|
|
152
|
-
def
|
148
|
+
def setup
|
153
149
|
return if ARGV.nohooks?
|
154
150
|
@path.cd do
|
155
|
-
|
156
|
-
facts.post(:install).each do |cmd|
|
151
|
+
facts.setup_files.each do |cmd|
|
157
152
|
safe_system cmd
|
158
153
|
end
|
159
154
|
end
|
@@ -162,7 +157,6 @@ class Package
|
|
162
157
|
def after_update
|
163
158
|
return if ARGV.nohooks?
|
164
159
|
@path.cd do
|
165
|
-
ENV["CURRENT_DOTTY"] = @path
|
166
160
|
facts.post(:update).each do |cmd|
|
167
161
|
system cmd
|
168
162
|
end
|
@@ -207,8 +201,9 @@ class Package
|
|
207
201
|
files = @facts.config_files
|
208
202
|
home_dir = ENV["HOME"]
|
209
203
|
files.each do |file|
|
210
|
-
|
211
|
-
|
204
|
+
file = Pathname.new(file)
|
205
|
+
dotfile = file.as_dotfile(home_dir)
|
206
|
+
FileUtils.rm_f dotfile if dotfile.exist? && dotfile.readlink == file
|
212
207
|
end
|
213
208
|
end
|
214
209
|
|
@@ -217,8 +212,7 @@ class Package
|
|
217
212
|
home_dir = ENV["HOME"]
|
218
213
|
files.each do |file|
|
219
214
|
# if ends in erb -> generate it
|
220
|
-
|
221
|
-
FileUtils.ln_s file, File.join(home_dir, "." + pn.basename)
|
215
|
+
FileUtils.ln_s file, Pathname.new(file).as_dotfile(home_dir), force: ARGV.force?
|
222
216
|
end
|
223
217
|
end
|
224
218
|
end
|
data/lib/lace/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kai Richard Koenig
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: This is a simple/unfinished tool which i use to manage my dotfiles on
|
14
14
|
all the different machines
|
@@ -24,9 +24,9 @@ files:
|
|
24
24
|
- lib/cmd/fetch.rb
|
25
25
|
- lib/cmd/help.rb
|
26
26
|
- lib/cmd/inspect.rb
|
27
|
-
- lib/cmd/install.rb
|
28
27
|
- lib/cmd/list.rb
|
29
28
|
- lib/cmd/remove.rb
|
29
|
+
- lib/cmd/setup.rb
|
30
30
|
- lib/cmd/update.rb
|
31
31
|
- lib/cmd/validate.rb
|
32
32
|
- lib/extend/ARGV.rb
|