mspac 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mspac +72 -24
  3. data/lib/mspac.rb +24 -19
  4. data/lib/mspac/pellet.rb +64 -13
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e386cfbe02203907947ce154b857df82129832f8
4
- data.tar.gz: 009078909806e303299d6d56691e2809edeecc4f
3
+ metadata.gz: aa634c685780667d55fcb7b238ab038b18c7ab55
4
+ data.tar.gz: 0df6dae9937571241798467cc4a36598fef8a5fe
5
5
  SHA512:
6
- metadata.gz: c3709ae67232579bd1f033ebedc25b20693f90096330191a087fcf835494a0b8c1429f75c9dfd3608bb6927ad8f76f47deff1a566961411a3e889dd32d3160d6
7
- data.tar.gz: 3d904d22450b07606bb3a7b96ce2502e38b0004deacaef08a321a217d1643915a2378aebd5cf255407a0576f4e4c32391f6b9eb92c994b5ec3befefa8cf6a2b1
6
+ metadata.gz: 4a93ebe91bc62e331ff39731547f06b8f0b9a57198db7cb3dc350dec939284f773ca295962a3adf2787871c0da1608f74cb91719575671309135cc45a421a69f
7
+ data.tar.gz: 692ece16964d0bc38ed5c8618aa6c0345a87acde1c8525dfaced15bbc6282702cb65742b2b117153cd2f2b513a3aa35406ed2f1418bb325f528cb466dd780b89
data/bin/mspac CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "colorize"
4
+ require "io/wait"
4
5
  require "mspac"
5
6
  require "optparse"
6
7
 
@@ -9,9 +10,10 @@ class MsPacExit
9
10
  INVALID_OPTION = 1
10
11
  INVALID_ARGUMENT = 2
11
12
  MISSING_ARGUMENT = 3
12
- INVALID_OPERATION = 4
13
- MULTIPLE_OPERATIONS = 5
14
- EXCEPTION = 6
13
+ EXTRA_ARGUMENTS = 4
14
+ EXCEPTION = 5
15
+ INVALID_OPERATION = 6
16
+ MULTIPLE_OPERATIONS = 7
15
17
  end
16
18
 
17
19
  class Operation
@@ -27,6 +29,7 @@ end
27
29
  def parse(args)
28
30
  options = Hash.new
29
31
  options["operation"] = nil
32
+ options["verbose"] = false
30
33
 
31
34
  # Sync options
32
35
  options["clean"] = false
@@ -48,19 +51,7 @@ def parse(args)
48
51
 
49
52
  opts.on("-h", "--help", "Display this help message") do
50
53
  puts opts
51
- exit
52
- end
53
-
54
- opts.on("--list-cached", "List cached pellets") do
55
- options["operation"] = Operation::LIST_CACHED
56
- end
57
-
58
- opts.on("--list-installed", "List installed pellets") do
59
- options["operation"] = Operation::LIST_INSTALLED
60
- end
61
-
62
- opts.on("--list-pellets", "List available pellets") do
63
- options["operation"] = Operation::LIST_PELLETS
54
+ exit MsPacExit::GOOD
64
55
  end
65
56
 
66
57
  opts.on(
@@ -99,7 +90,7 @@ def parse(args)
99
90
  options["operation"] = Operation::UNLOCK
100
91
  end
101
92
 
102
- opts.on("", "SYNC OPTIONS")
93
+ opts.on("", "SYNC_OPTIONS")
103
94
 
104
95
  opts.on(
105
96
  "-c",
@@ -135,11 +126,49 @@ def parse(args)
135
126
  options["refresh"] = true
136
127
  end
137
128
 
138
- opts.on("", "REMOVE OPTIONS")
129
+ opts.on("", "REMOVE_OPTIONS")
139
130
 
140
131
  opts.on("-n", "--nosave", "Completely remove pellet") do
141
132
  options["nosave"] = true
142
133
  end
134
+
135
+ opts.on("", "MISC_OPTIONS")
136
+
137
+ opts.on("--list-cached", "List cached pellets") do
138
+ if (options["operation"])
139
+ puts opts
140
+ exit MsPacExit::MULTIPLE_OPERATIONS
141
+ end
142
+ options["operation"] = Operation::LIST_CACHED
143
+ end
144
+
145
+ opts.on("--list-installed", "List installed pellets") do
146
+ if (options["operation"])
147
+ puts opts
148
+ exit MsPacExit::MULTIPLE_OPERATIONS
149
+ end
150
+ options["operation"] = Operation::LIST_INSTALLED
151
+ end
152
+
153
+ opts.on("--list-pellets", "List available pellets") do
154
+ if (options["operation"])
155
+ puts opts
156
+ exit MsPacExit::MULTIPLE_OPERATIONS
157
+ end
158
+ options["operation"] = Operation::LIST_PELLETS
159
+ end
160
+
161
+ opts.on("--nocolor", "Disable colorized output") do
162
+ String.disable_colorization = true
163
+ end
164
+
165
+ opts.on(
166
+ "-v",
167
+ "--verbose",
168
+ "Show backtrace when error occurs"
169
+ ) do
170
+ options["verbose"] = true
171
+ end
143
172
  end
144
173
 
145
174
  begin
@@ -282,7 +311,7 @@ end
282
311
  options = parse(ARGV)
283
312
 
284
313
  begin
285
- mspac = MsPac.new
314
+ mspac = MsPac.new(!String.disable_colorization)
286
315
 
287
316
  case options["operation"]
288
317
  when Operation::LIST_CACHED
@@ -315,11 +344,30 @@ begin
315
344
  when Operation::UNLOCK
316
345
  mspac.unlock(options["pellets"])
317
346
  end
318
- exit MsPacExit::GOOD
347
+ rescue Interrupt
348
+ # ^C
349
+ # Exit gracefully
350
+ rescue Errno::EPIPE
351
+ # Do nothing. This can happen if piping to another program such as
352
+ # less. Usually if less is closed before we're done with STDOUT.
319
353
  rescue MsPac::Error => e
320
- puts e.message.red
354
+ puts e.message
355
+ exit MsPacExit::EXCEPTION
356
+ rescue Exception => e
357
+ $stderr.puts "Oops! Looks like an error has occured! If the " \
358
+ "error persists, file a bug at:".word_wrap
359
+ $stderr.puts
360
+ $stderr.puts " https://gitlab.com/mjwhitta/mspac/issues"
361
+ $stderr.puts
362
+ $stderr.puts "Maybe the message below will help. If not, you " \
363
+ "can use the --verbose flag to get a backtrace.".word_wrap
364
+
365
+ $stderr.puts e.message.white.on_red
366
+ if (options["verbose"])
367
+ e.backtrace.each do |line|
368
+ $stderr.puts line.light_yellow
369
+ end
370
+ end
321
371
  exit MsPacExit::EXCEPTION
322
- rescue Interrupt => e
323
- # ^C
324
- puts
325
372
  end
373
+ exit MsPacExit::GOOD
@@ -18,11 +18,23 @@ class MsPac
18
18
  # FIXME will miss pellets that get deleted by refresh
19
19
  end
20
20
 
21
+ def colorize_error(error)
22
+ return error if (!@colorize)
23
+ return error.light_red
24
+ end
25
+ private :colorize_error
26
+
27
+ def colorize_status(status)
28
+ return status if (!@colorize)
29
+ return status.light_white
30
+ end
31
+ private :colorize_status
32
+
21
33
  def ensure_pellets_repo
22
34
  @pellets_dir = Pathname.new("~/.mspac/pellets").expand_path
23
35
  return if (@pellets_dir && @pellets_dir.exist?)
24
36
 
25
- puts "Installing MsPac dependencies...".white
37
+ puts colorize_status("Installing MsPac dependencies...")
26
38
  @pm.install(["git"]) if (ScoobyDoo.where_are_you("git").nil?)
27
39
  Dir.chdir(@mspac_dir) do
28
40
  @vcs.clone("https://gitlab.com/mjwhitta/pellets.git")
@@ -35,7 +47,8 @@ class MsPac
35
47
  end
36
48
  private :ensure_pellets_repo
37
49
 
38
- def initialize
50
+ def initialize(colorize = false)
51
+ @colorize = colorize
39
52
  FileUtils.mkdir_p(Pathname.new("~/.mspac").expand_path)
40
53
  @mspac_dir = Pathname.new("~/.mspac").expand_path
41
54
  @pm = PackageManager.new
@@ -78,13 +91,16 @@ class MsPac
78
91
  @pellets = Hash.new
79
92
  Dir["#{@pellets_dir}/*.pellet"].each do |pellet|
80
93
  begin
81
- p = Pellet.new(JSON.parse(File.read(pellet)))
94
+ p = Pellet.new(
95
+ JSON.parse(File.read(pellet)),
96
+ @colorize
97
+ )
82
98
  @pellets[p.name] = p
83
99
  rescue JSON::ParserError => e
84
- puts "#{pellet} is not valid JSON!".red
85
- puts e.message.red
100
+ puts colorize_error("#{pellet} is not valid JSON!")
101
+ puts e.message.white.on_red
86
102
  rescue Exception => e
87
- puts e.message.red
103
+ puts e.message.white.on_red
88
104
  end
89
105
  end
90
106
  end
@@ -109,7 +125,7 @@ class MsPac
109
125
  end
110
126
 
111
127
  def refresh
112
- puts "Refreshing pellets...".white
128
+ puts colorize_status("Refreshing pellets...")
113
129
  Dir.chdir(@pellets_dir) do
114
130
  @vcs.update
115
131
  end
@@ -134,18 +150,7 @@ class MsPac
134
150
  pellet = @pellets[name]
135
151
  name_match = pellet.name.match(/#{regex}/)
136
152
  desc_match = pellet.desc.match(/#{regex}/)
137
- if (name_match || desc_match)
138
- print "#{pellet.name}".white
139
- if (pellet.installed?)
140
- puts " [installed]".green
141
- elsif (pellet.cached?)
142
- puts " [cached]".blue
143
- else
144
- puts
145
- end
146
- puts " #{pellet.repo}"
147
- puts " #{pellet.desc}"
148
- end
153
+ puts pellet.to_s if (name_match || desc_match)
149
154
  end
150
155
  end
151
156
 
@@ -5,11 +5,50 @@ class MsPac::Pellet < Hash
5
5
  @@cache_dir = Pathname("~/.mspac/cache").expand_path
6
6
  @@install_dir = Pathname("~/.mspac/installed").expand_path
7
7
 
8
- def initialize(json)
8
+ def colorize_cached(cached)
9
+ if (!@colorize)
10
+ return "[cached]" if (cached)
11
+ else
12
+ return "[cached]".light_blue if (cached)
13
+ end
14
+ return ""
15
+ end
16
+ private :colorize_cached
17
+
18
+ def colorize_error(error)
19
+ return error if (!@colorize)
20
+ return error.light_red
21
+ end
22
+ private :colorize_error
23
+
24
+ def colorize_installed(installed)
25
+ if (!@colorize)
26
+ return "[installed]" if (installed)
27
+ else
28
+ return "[installed]".light_green if (installed)
29
+ end
30
+ return ""
31
+ end
32
+ private :colorize_installed
33
+
34
+ def colorize_name(name = @name)
35
+ return name if (!@colorize)
36
+ return name.light_white
37
+ end
38
+ private :colorize_name
39
+
40
+ def colorize_status(status)
41
+ return status if (!@colorize)
42
+ return status.light_white
43
+ end
44
+ private :colorize_status
45
+
46
+ def initialize(json, colorize = false)
9
47
  json.keys.each do |key|
10
48
  self[key] = json[key]
11
49
  end
12
50
 
51
+ @colorize = colorize
13
52
  @pm = MsPac::PackageManager.new
14
53
  @vcs = MsPac::VersionControl.new(self["vcs"])
15
54
  end
@@ -20,7 +59,7 @@ class MsPac::Pellet < Hash
20
59
 
21
60
  def compile
22
61
  return if (self["compile"].empty?)
23
- puts "Compiling #{name}...".white
62
+ puts colorize_status("Compiling #{name}...")
24
63
  execute("compile")
25
64
  end
26
65
  private :compile
@@ -42,7 +81,7 @@ class MsPac::Pellet < Hash
42
81
 
43
82
  get_deps
44
83
 
45
- puts "Fetching #{name}...".white
84
+ puts colorize_status("Fetching #{name}...")
46
85
  if (Pathname.new("#{@@cache_dir}/#{name}").expand_path.exist?)
47
86
  Dir.chdir("#{@@cache_dir}/#{name}") do
48
87
  @vcs.update
@@ -56,7 +95,7 @@ class MsPac::Pellet < Hash
56
95
  end
57
96
 
58
97
  def get_deps
59
- puts "Installing dependencies...".white
98
+ puts colorize_status("Installing dependencies...")
60
99
  @pm.install([self["vcs"]].concat(self["deps"][@pm.pkgmgr]))
61
100
  @pm.install(self["deps"]["perl"], "perl")
62
101
  @pm.install(self["deps"]["python2"], "python2")
@@ -72,7 +111,7 @@ class MsPac::Pellet < Hash
72
111
  link if (!installed?)
73
112
  compile
74
113
 
75
- puts "Installing #{name}...".white
114
+ puts colorize_status("Installing #{name}...")
76
115
  execute("install")
77
116
  end
78
117
 
@@ -85,7 +124,7 @@ class MsPac::Pellet < Hash
85
124
  raise MsPac::Error::PelletNotInstalledError.new(name)
86
125
  end
87
126
 
88
- puts "Linking #{name}...".white
127
+ puts colorize_status("Linking #{name}...")
89
128
  FileUtils.ln_sf(
90
129
  "#{@@cache_dir}/#{name}",
91
130
  "#{@@install_dir}/#{name}"
@@ -97,7 +136,7 @@ class MsPac::Pellet < Hash
97
136
  raise MsPac::Error::PelletNotInstalledError.new(name)
98
137
  end
99
138
 
100
- puts "Locking #{name}...".white
139
+ puts colorize_status("Locking #{name}...")
101
140
  FileUtils.touch("#{@@install_dir}/#{name}/.mspac_lock")
102
141
  end
103
142
 
@@ -110,7 +149,7 @@ class MsPac::Pellet < Hash
110
149
  raise MsPac::Error::PelletNotInstalledError.new(name)
111
150
  end
112
151
 
113
- puts "Purging #{name}...".white
152
+ puts colorize_status("Purging #{name}...")
114
153
  FileUtils.rm_rf("#{@@cache_dir}/#{name}")
115
154
  end
116
155
 
@@ -119,7 +158,7 @@ class MsPac::Pellet < Hash
119
158
  raise MsPac::Error::PelletNotInstalledError.new(name)
120
159
  end
121
160
 
122
- puts "Removing #{name}...".white
161
+ puts colorize_status("Removing #{name}...")
123
162
  execute("remove")
124
163
  unlink
125
164
  purge if (nosave)
@@ -129,12 +168,24 @@ class MsPac::Pellet < Hash
129
168
  return self["repo"]
130
169
  end
131
170
 
171
+ def to_s
172
+ header = [
173
+ colorize_name(name),
174
+ colorize_installed(installed?) || colorize_cached(cached?)
175
+ ].join(" ")
176
+ return [
177
+ header,
178
+ " #{repo}",
179
+ " #{desc}"
180
+ ].join("\n")
181
+ end
182
+
132
183
  def unlink
133
184
  if (!installed?)
134
185
  raise MsPac::Error::PelletNotInstalledError.new(name)
135
186
  end
136
187
 
137
- puts "Unlinking #{name}...".white
188
+ puts colorize_status("Unlinking #{name}...")
138
189
  FileUtils.rm_f("#{@@install_dir}/#{name}")
139
190
  end
140
191
 
@@ -143,7 +194,7 @@ class MsPac::Pellet < Hash
143
194
  raise MsPac::Error::PelletNotInstalledError.new(name)
144
195
  end
145
196
 
146
- puts "Unlocking #{name}...".white
197
+ puts colorize_status("Unlocking #{name}...")
147
198
  FileUtils.rm_f("#{@@install_dir}/#{name}/.mspac_lock")
148
199
  end
149
200
 
@@ -154,11 +205,11 @@ class MsPac::Pellet < Hash
154
205
 
155
206
  Dir.chdir("#{@@install_dir}/#{name}") do
156
207
  if (Pathname.new(".mspac_lock").expand_path.exist?)
157
- puts "Locked: #{name}".red
208
+ puts colorize_error("Locked: #{name}")
158
209
  return
159
210
  end
160
211
 
161
- puts "Updating #{name}...".white
212
+ puts colorize_status("Updating #{name}...")
162
213
  tip = @vcs.revision
163
214
  @vcs.update
164
215
  new_tip = @vcs.revision
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mspac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Whittaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-18 00:00:00.000000000 Z
11
+ date: 2016-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize