forked from browserstate/history.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cli
executable file
·351 lines (289 loc) · 7.49 KB
/
cli
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
#!/usr/bin/env ruby
# == Name
# cli - BalCMS Command Line Interface
#
# == Synopsis
# cli check-env
# cli birth
# cli init-commit
# cli init-new
# cli init-existing
# cli configure
# cli install
# cli permissions
# cli setup
# cli cron
#
# cli add
# cli stable
# cli master
# cli upgrade
# cli update
# cli deploy
#
# cli clean
# cli clean-media
# cli clean-config
# cli clean-styles
# cli clean-scripts
#
# cli [options]
#
# == Examples
# cli check-env
# Checks to see that our environment is properly configured and will support a BalCMS installation.
#
# cli birth
# Executes: init-new, configure, install, init-commit
#
# cli init-commit
# Performs the initial commit (commits new and modified files during the installation to the git repo).
#
# cli init-new
# Initialises the repository as a new installation. Only run this once.
#
# TODO: finish this example section
#
# == Options
# -h, --help Displays help message
# -v, --version Display the version, then exit
# -q, --quiet Output as little as possible, overrides verbose
# -V, --verbose Verbose output
#
# == Author
# Benjamin Arthur Lupton
#
# == Copyright
# Copyright (c) 2008-2011 Benjamin Arthur Lupton
# Licensed under the New BSD License
# http://creativecommons.org/licenses/BSD/
require 'optparse'
require 'rdoc/usage'
require 'ostruct'
require 'date'
class App
SOURCEMAP = './scripts/closure.map'
BUILDDIR = './.build'
UGLIFYURL = 'https://github.com/mishoo/UglifyJS/raw/master/bin/uglifyjs'
UGLIFYDIR = './.build/uglify'
UGLIFYFILE = './.build/uglify/uglify'
CLOSUREURL = 'http://closure-compiler.googlecode.com/files/compiler-latest.zip'
CLOSUREDIR = './.build/closure'
CLOSUREZIP = './.build/closure/compiler.zip'
CLOSUREFILE = './.build/closure/compiler.jar'
YUIURL = 'http://yuilibrary.com/downloads/yuicompressor/yuicompressor-2.4.2.zip'
YUIDIR = './.build/yui'
YUIZIP = './.build/yui/compiler.zip'
YUIFILE = './.build/yui/yuicompressor-2.4.2/build/yuicompressor-2.4.2.jar'
def initialize
init_env
end
def init_env
# Check for Requirements
reqs = ['mkdir','curl','tar','git']
reqs.each do |req|
has_req = `which #{req}`.strip
if has_req.empty?
abort("CLI requires the following binary which is not installed: #{req}")
end
end
# Check for Closure Compiler
if !File.exists?(CLOSUREFILE)
`mkdir -p #{CLOSUREDIR}`
puts "Downloading the Closure Compiler..."
download(CLOSUREURL, CLOSUREZIP)
extract(CLOSUREDIR, CLOSUREZIP)
`chmod +x #{CLOSUREFILE}`
end
# Check for Uglify
if !File.exists?(UGLIFYFILE)
`mkdir -p #{UGLIFYDIR}`
puts "Downloading the Uglify Compiler..."
download(UGLIFYURL, UGLIFYFILE)
`chmod +x #{UGLIFYFILE}`
end
# Check for YUI Compiler
if !File.exists?(YUIFILE)
`mkdir -p #{YUIDIR}`
puts "Downloading the YUI Compiler..."
download(YUIURL, (YUIZIP))
extract(YUIDIR, YUIZIP)
`chmod +x #{YUIFILE}`
end
end
def has_changes
result = `git status`
if result.include? 'Changed but not updated'
abort("You have un-committed changes that need to be committed before we can proceed.\n#{result}")
end
end
# ===========================================================================
# Helpers
def download ( url, file )
result = `curl -L #{url} -o #{file}`
end
def extract ( dir, file )
file = file.gsub(dir,'.')
result = `cd #{dir} ; tar -xf #{file} ; rm -Rf #{file}`
end
def compressJavascriptFile ( in_file, out_file )
# Calculate
in_file_size = File.size(in_file)
# Handle
if in_file.equal? out_file
out_file = out_file.gsub(/\.js$/, '.min.js')
compressFileUglify(in_file,out_file)
`rm #{in_file}`
`mv #{out_file} #{in_file}`
out_file = in_file
else
compressFileUglify(in_file,out_file)
out_file_size = File.size(out_file)
end
# Calculate
out_file_size = File.size(out_file)
ratio = Float(out_file_size)/Float(in_file_size)
reduction = ((1-ratio)*100).round
# Log
puts "Compressed the file [#{in_file}] to [#{out_file}] with a #{reduction}% reduction"
end
def compressFileUglify ( in_file, out_file )
result = `#{UGLIFYFILE} -o #{out_file} #{in_file}`
end
def compressFileClosure ( in_file, out_file )
result = `java -jar #{CLOSUREFILE} --js_output_file=#{out_file} --js=#{in_file}`
end
# ===========================================================================
# Installers
def build
end
# ===========================================================================
# Git Helpers
def add
puts \
` git add -u;`
end
def stable
puts \
` git checkout #{BRANCH_STABLE};`
end
def dev
puts \
` git checkout #{BRANCH_DEV};`
end
def master
puts \
` git checkout master;`
end
def upgrade
puts \
` git checkout #{BRANCH_BALCMS};
git pull balcms #{BRANCH_STABLE};
git checkout #{BRANCH_DEV};
git merge #{BRANCH_BALCMS};`
end
def update
puts \
` git pull;`
configure
end
def deploy
puts \
` git checkout #{BRANCH_STABLE};
git merge #{BRANCH_DEV};
git checkout #{BRANCH_MASTER};
git merge #{BRANCH_STABLE};
git checkout #{BRANCH_DEV};
git push origin --all;`
end
end
# ===========================================================================
# Booter
class Booter
VERSION = :'0.0.1'
attr_reader :options
def initialize(arguments, stdin)
@arguments = arguments
@stdin = stdin
# Set defaults
@options = OpenStruct.new
@options.verbose = false
@options.quiet = false
# TO DO - add additional defaults
end
# Parse options, check arguments, then process the command
def run
if parsed_options? && arguments_valid?
puts "Start at #{DateTime.now}\n\n" if @options.verbose
output_options if @options.verbose # [Optional]
process_arguments
process_command
puts "\nFinished at #{DateTime.now}" if @options.verbose
else
output_usage
end
end
protected
def parsed_options?
# Specify options
opts = OptionParser.new
opts.on('-v', '--version') { output_version ; exit 0 }
opts.on('-h', '--help') { output_help }
opts.on('-V', '--verbose') { @options.verbose = true }
opts.on('-q', '--quiet') { @options.quiet = true }
# TO DO - add additional options
opts.parse!(@arguments) rescue return false
process_options
true
end
# Performs post-parse processing on options
def process_options
@options.verbose = false if @options.quiet
end
def output_options
puts :"Options:\n"
@options.marshal_dump.each do |name, val|
puts " #{name} = #{val}"
end
end
# True if required arguments were provided
def arguments_valid?
# TO DO - implement your real logic here
true if @arguments.length == 1
end
# Setup the arguments
def process_arguments
# TO DO - place in local vars, etc
end
def output_help
output_version
RDoc::usage() #exits app
end
def output_usage
RDoc::usage(:'usage') # gets usage from comments above
end
def output_version
puts "#{File.basename(__FILE__)} version #{VERSION}"
end
def process_command
# Create Application
app = App.new
# Fetch + Execute
command = @arguments[0].gsub('-','_')
unless app.respond_to?(command)
abort("Unknown command: #{command}")
end
app.send(command)
end
def process_standard_input
input = @stdin.read
# TO DO - process input
# [Optional]
#@stdin.each do |line|
# # TO DO - process each line
#end
end
end
# Create Booter
booter = Booter.new(ARGV, STDIN)
booter.run