software_smithy 1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +114 -0
- data/bin/smithy +586 -0
- data/etc/completion/smithy-completion.bash +266 -0
- data/etc/completion/zsh/_smithy +130 -0
- data/etc/smithyrc +36 -0
- data/etc/templates/build/.owners +1 -0
- data/etc/templates/build/build-notes +0 -0
- data/etc/templates/build/dependencies +0 -0
- data/etc/templates/build/rebuild +13 -0
- data/etc/templates/build/relink +2 -0
- data/etc/templates/build/remodule.erb +21 -0
- data/etc/templates/build/retest +6 -0
- data/etc/templates/build/status +0 -0
- data/etc/templates/modulefile.erb +30 -0
- data/etc/templates/package/.check4newver +2 -0
- data/etc/templates/package/.exceptions +3 -0
- data/etc/templates/package/description +18 -0
- data/etc/templates/package/description.markdown +17 -0
- data/etc/templates/package/support +1 -0
- data/etc/templates/package/versions +3 -0
- data/etc/templates/web/all.html.erb +19 -0
- data/etc/templates/web/alphabetical.html.erb +12 -0
- data/etc/templates/web/category.html.erb +74 -0
- data/etc/templates/web/machine_version_table.html.erb +35 -0
- data/etc/templates/web/package.html.erb +53 -0
- data/etc/templates/web/version_list.html.erb +7 -0
- data/etc/templates/web/version_table.html.erb +24 -0
- data/lib/smithy/config.rb +167 -0
- data/lib/smithy/description.rb +276 -0
- data/lib/smithy/file_operations.rb +234 -0
- data/lib/smithy/format.rb +134 -0
- data/lib/smithy/helpers.rb +159 -0
- data/lib/smithy/module_file.rb +224 -0
- data/lib/smithy/package.rb +647 -0
- data/lib/smithy.rb +45 -0
- data/lib/smithy_version.rb +40 -0
- data/man/man1/smithy.1 +262 -0
- data/smithy.rdoc +281 -0
- metadata +230 -0
@@ -0,0 +1,234 @@
|
|
1
|
+
# Smithy is freely available under the terms of the BSD license given below. {{{
|
2
|
+
#
|
3
|
+
# Copyright (c) 2012. UT-BATTELLE, LLC. All rights reserved.
|
4
|
+
#
|
5
|
+
# Produced by the National Center for Computational Sciences at Oak Ridge
|
6
|
+
# National Laboratory. Smithy is a based on SWTools, more information on SWTools
|
7
|
+
# can be found at: http://www.olcf.ornl.gov/center-projects/swtools/
|
8
|
+
#
|
9
|
+
# This product includes software produced by UT-Battelle, LLC under Contract No.
|
10
|
+
# DE-AC05-00OR22725 with the Department of Energy.
|
11
|
+
#
|
12
|
+
# Redistribution and use in source and binary forms, with or without
|
13
|
+
# modification, are permitted provided that the following conditions are met:
|
14
|
+
#
|
15
|
+
# - Redistributions of source code must retain the above copyright notice, this
|
16
|
+
# list of conditions and the following disclaimer.
|
17
|
+
#
|
18
|
+
# - Redistributions in binary form must reproduce the above copyright notice, this
|
19
|
+
# list of conditions and the following disclaimer in the documentation and/or
|
20
|
+
# other materials provided with the distribution.
|
21
|
+
#
|
22
|
+
# - Neither the name of the UT-BATTELLE nor the names of its contributors may
|
23
|
+
# be used to endorse or promote products derived from this software without
|
24
|
+
# specific prior written permission.
|
25
|
+
#
|
26
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
27
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
28
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
29
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
30
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
31
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
32
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
33
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
34
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
35
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
36
|
+
# }}}
|
37
|
+
|
38
|
+
module Smithy
|
39
|
+
FILE_NOTICE_COLUMNS = 12
|
40
|
+
def notice_create(file)
|
41
|
+
puts "create ".rjust(12).color(:green).bright + file
|
42
|
+
end
|
43
|
+
def notice_exist(file)
|
44
|
+
puts "exists ".rjust(12).color(:blue).bright + file
|
45
|
+
end
|
46
|
+
def notice_link(file1, file2)
|
47
|
+
puts "link ".rjust(12).bright + file1 + " -> " + file2
|
48
|
+
end
|
49
|
+
def notice_identical(file)
|
50
|
+
puts "identical ".rjust(12).color(:blue).bright + file
|
51
|
+
end
|
52
|
+
def notice_conflict(file)
|
53
|
+
puts "conflict ".rjust(12).color(:red).bright + file
|
54
|
+
end
|
55
|
+
def notice_force(file)
|
56
|
+
puts "force ".rjust(12).color(:yellow).bright + file
|
57
|
+
end
|
58
|
+
def notice_skip(file)
|
59
|
+
puts "skip ".rjust(12).bright + file
|
60
|
+
end
|
61
|
+
|
62
|
+
class FileOperations
|
63
|
+
|
64
|
+
class << self
|
65
|
+
|
66
|
+
def make_executable(f, options = {})
|
67
|
+
unless options[:noop]
|
68
|
+
p = File.stat(f).mode | 0111
|
69
|
+
FileUtils.chmod p, f, options
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def set_group(f, new_group, options = {})
|
74
|
+
method = :chown
|
75
|
+
if options.has_key? :recursive
|
76
|
+
options.reject!{|k,v| k.eql?(:recursive)}
|
77
|
+
method = :chown_R
|
78
|
+
end
|
79
|
+
|
80
|
+
current_group = Etc.getgrgid(File.stat(f).gid).name rescue nil
|
81
|
+
return if current_group.eql?(new_group) && method == :chown
|
82
|
+
|
83
|
+
begin
|
84
|
+
FileUtils.send method, nil, new_group, f, options
|
85
|
+
rescue
|
86
|
+
raise "Could not set group \"#{new_group}\" on \"#{f}\""
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def make_group_writable(f, options = {})
|
91
|
+
f = f.path if f.class == File
|
92
|
+
# FileUtils.chmod_R doesn't work well for combinations of files
|
93
|
+
# with different bitmasks, it sets everything the same
|
94
|
+
if options.has_key? :recursive
|
95
|
+
command = "chmod -R g+w #{f}"
|
96
|
+
else
|
97
|
+
command = "chmod g+w #{f}"
|
98
|
+
unless options[:noop]
|
99
|
+
# Check to see if it's already group writeable
|
100
|
+
# convert the integer to a string in base 8
|
101
|
+
mode = File.stat(f).mode.to_s(8)
|
102
|
+
# check the group bit, convert back to integer
|
103
|
+
group_bit = mode[mode.size-2].to_i
|
104
|
+
return if group_bit == 6 || group_bit == 7
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
puts command if options[:verbose]
|
109
|
+
`#{command}` unless options[:noop]
|
110
|
+
end
|
111
|
+
|
112
|
+
def make_directory(d, options = {})
|
113
|
+
if File.directory?(d)
|
114
|
+
notice_exist d
|
115
|
+
else
|
116
|
+
FileUtils.mkdir_p d, options
|
117
|
+
notice_create d
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def make_symlink(old, new, options = {})
|
122
|
+
if File.symlink?(new)
|
123
|
+
notice_exist new
|
124
|
+
else
|
125
|
+
FileUtils.rm_f(new, options)
|
126
|
+
FileUtils.ln_sf(old, new, options)
|
127
|
+
notice_link old, new
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def install_file(source, dest, options = {})
|
132
|
+
current_time = Time.now.to_i
|
133
|
+
duplicate_dest = dest+"_copy_"+current_time.to_s
|
134
|
+
installed = false
|
135
|
+
|
136
|
+
force = options.try(:[],:force)
|
137
|
+
force = Smithy::Config.global.try(:[], :"force")
|
138
|
+
options.reject!{|k,v| k==:force}
|
139
|
+
|
140
|
+
if File.exists?(dest) && !force
|
141
|
+
if FileUtils.identical?(source, dest)
|
142
|
+
notice_identical dest
|
143
|
+
installed = true
|
144
|
+
else
|
145
|
+
notice_conflict dest
|
146
|
+
overwrite = nil
|
147
|
+
while overwrite.nil? do
|
148
|
+
prompt = Readline.readline(" "*FILE_NOTICE_COLUMNS+"Overwrite? (enter \"h\" for help) [ynsdh] ")
|
149
|
+
case prompt.downcase
|
150
|
+
when "y"
|
151
|
+
overwrite = true
|
152
|
+
when "n"
|
153
|
+
overwrite = false
|
154
|
+
when "s"
|
155
|
+
overwrite = false
|
156
|
+
duplicate = true
|
157
|
+
when "d"
|
158
|
+
puts `diff -uw #{dest} #{source}`
|
159
|
+
when "h"
|
160
|
+
indent = " "*FILE_NOTICE_COLUMNS
|
161
|
+
puts indent+"y - yes, overwrite"
|
162
|
+
puts indent+"n - no, do not overwrite"
|
163
|
+
puts indent+"s - save to a separate file"
|
164
|
+
puts indent+"d - diff, show the differences between the old and the new"
|
165
|
+
puts indent+"h - help, show this help}"
|
166
|
+
#when "q"
|
167
|
+
#raise "Abort new package"
|
168
|
+
#else
|
169
|
+
#overwrite = true
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
if overwrite
|
174
|
+
notice_force dest
|
175
|
+
FileUtils.install source, dest, options
|
176
|
+
installed = true
|
177
|
+
else
|
178
|
+
if duplicate
|
179
|
+
FileUtils.install source, duplicate_dest, options
|
180
|
+
notice_create duplicate_dest
|
181
|
+
else
|
182
|
+
notice_skip dest
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
else
|
187
|
+
FileUtils.install source, dest, options
|
188
|
+
notice_create dest
|
189
|
+
installed = true
|
190
|
+
end
|
191
|
+
|
192
|
+
return installed
|
193
|
+
end
|
194
|
+
|
195
|
+
def install_from_string(content, dest, options = {})
|
196
|
+
if options[:noop]
|
197
|
+
updated_file = File.join(ENV["HOME"]+"/.smithy_#{File.basename(dest)}_#{Time.now.to_i}")
|
198
|
+
else
|
199
|
+
updated_file = File.join(File.dirname(dest), ".#{File.basename(dest)}_#{Time.now.to_i}")
|
200
|
+
end
|
201
|
+
|
202
|
+
File.open(updated_file , "w+") do |f|
|
203
|
+
f.write(content)
|
204
|
+
end
|
205
|
+
|
206
|
+
FileOperations.install_file updated_file, dest, options
|
207
|
+
FileUtils.rm_f(updated_file) # Always remove
|
208
|
+
end
|
209
|
+
|
210
|
+
def render_erb(args = {})
|
211
|
+
options = {:noop => false, :verbose => false}
|
212
|
+
options.merge!(args[:options])
|
213
|
+
erb_filename = args[:erb]
|
214
|
+
dest = args[:destination]
|
215
|
+
|
216
|
+
if options[:noop]
|
217
|
+
rendered_file = ENV["HOME"]+"/.#{File.basename(dest)}_#{Time.now.to_i}"
|
218
|
+
else
|
219
|
+
rendered_file = "#{File.dirname(dest)}/.#{File.basename(dest)}_#{Time.now.to_i}"
|
220
|
+
end
|
221
|
+
|
222
|
+
erb = ERB.new(File.read(erb_filename), nil, "<>")
|
223
|
+
File.open(rendered_file, "w+") do |f|
|
224
|
+
f.write erb.result(args[:binding])
|
225
|
+
end
|
226
|
+
|
227
|
+
FileOperations.install_file(rendered_file, dest, options)
|
228
|
+
FileUtils.rm_f(rendered_file) # Always remove
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# Smithy is freely available under the terms of the BSD license given below. {{{
|
2
|
+
#
|
3
|
+
# Copyright (c) 2012. UT-BATTELLE, LLC. All rights reserved.
|
4
|
+
#
|
5
|
+
# Produced by the National Center for Computational Sciences at Oak Ridge
|
6
|
+
# National Laboratory. Smithy is a based on SWTools, more information on SWTools
|
7
|
+
# can be found at: http://www.olcf.ornl.gov/center-projects/swtools/
|
8
|
+
#
|
9
|
+
# This product includes software produced by UT-Battelle, LLC under Contract No.
|
10
|
+
# DE-AC05-00OR22725 with the Department of Energy.
|
11
|
+
#
|
12
|
+
# Redistribution and use in source and binary forms, with or without
|
13
|
+
# modification, are permitted provided that the following conditions are met:
|
14
|
+
#
|
15
|
+
# - Redistributions of source code must retain the above copyright notice, this
|
16
|
+
# list of conditions and the following disclaimer.
|
17
|
+
#
|
18
|
+
# - Redistributions in binary form must reproduce the above copyright notice, this
|
19
|
+
# list of conditions and the following disclaimer in the documentation and/or
|
20
|
+
# other materials provided with the distribution.
|
21
|
+
#
|
22
|
+
# - Neither the name of the UT-BATTELLE nor the names of its contributors may
|
23
|
+
# be used to endorse or promote products derived from this software without
|
24
|
+
# specific prior written permission.
|
25
|
+
#
|
26
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
27
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
28
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
29
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
30
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
31
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
32
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
33
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
34
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
35
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
36
|
+
# }}}
|
37
|
+
|
38
|
+
module Smithy
|
39
|
+
module Format
|
40
|
+
def self.print_column_list(items)
|
41
|
+
max_size = 0
|
42
|
+
items.each { |m| max_size = m.size if m.size > max_size }
|
43
|
+
width = `tput cols`.to_i
|
44
|
+
columns = (width/(max_size+3.0)).ceil
|
45
|
+
items_per_column = (items.size/columns.to_f).ceil
|
46
|
+
|
47
|
+
items_copy = items.dup
|
48
|
+
s = []
|
49
|
+
columns.times do
|
50
|
+
s << items_copy.slice!(0, items_per_column)
|
51
|
+
end
|
52
|
+
while s.last.size < items_per_column do
|
53
|
+
s.last << ""
|
54
|
+
end
|
55
|
+
table = Terminal::Table.new :rows => s.transpose
|
56
|
+
puts table.to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.software_row(s)
|
60
|
+
row = []
|
61
|
+
row << s
|
62
|
+
source = s+'/rebuild'
|
63
|
+
if File.exist?(source)
|
64
|
+
f = File.stat(source)
|
65
|
+
else
|
66
|
+
f = File.stat(s)
|
67
|
+
end
|
68
|
+
row << f.mtime.strftime("%Y-%m-%d %H:%M:%S")
|
69
|
+
begin
|
70
|
+
user = Etc.getpwuid(f.uid)
|
71
|
+
row << user.try(:name)
|
72
|
+
row << user.try(:gecos)
|
73
|
+
rescue
|
74
|
+
row << 'unknown'
|
75
|
+
row << 'unknown'
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class Table
|
80
|
+
def before
|
81
|
+
@@table = Terminal::Table.new :headings => %w(Build LastModified Username Name)
|
82
|
+
end
|
83
|
+
def format(software, root)
|
84
|
+
software.each do |s|
|
85
|
+
@@table << Smithy::Format.software_row(s)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
def after
|
89
|
+
puts @@table.to_s
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class CSV
|
94
|
+
def before
|
95
|
+
end
|
96
|
+
def format(software, root)
|
97
|
+
software.each do |s|
|
98
|
+
puts Smithy::Format.software_row(s).join(',')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
def after
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class Doku
|
106
|
+
def before
|
107
|
+
puts "^ Build ^ Last Modified ^ Username ^ Name ^"
|
108
|
+
end
|
109
|
+
def format(software, root)
|
110
|
+
software.each do |s|
|
111
|
+
puts "| " + Smithy::Format.software_row(s).join(' | ') + " |"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
def after
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class Path
|
119
|
+
def before ; end
|
120
|
+
def format(software, root)
|
121
|
+
puts software
|
122
|
+
end
|
123
|
+
def after ; end
|
124
|
+
end
|
125
|
+
|
126
|
+
class Name
|
127
|
+
def before ; end
|
128
|
+
def format(software, root)
|
129
|
+
puts software.collect{|s| s.gsub(/#{root}\//, '')}
|
130
|
+
end
|
131
|
+
def after ; end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
# Smithy is freely available under the terms of the BSD license given below. {{{
|
2
|
+
#
|
3
|
+
# Copyright (c) 2012. UT-BATTELLE, LLC. All rights reserved.
|
4
|
+
#
|
5
|
+
# Produced by the National Center for Computational Sciences at Oak Ridge
|
6
|
+
# National Laboratory. Smithy is a based on SWTools, more information on SWTools
|
7
|
+
# can be found at: http://www.olcf.ornl.gov/center-projects/swtools/
|
8
|
+
#
|
9
|
+
# This product includes software produced by UT-Battelle, LLC under Contract No.
|
10
|
+
# DE-AC05-00OR22725 with the Department of Energy.
|
11
|
+
#
|
12
|
+
# Redistribution and use in source and binary forms, with or without
|
13
|
+
# modification, are permitted provided that the following conditions are met:
|
14
|
+
#
|
15
|
+
# - Redistributions of source code must retain the above copyright notice, this
|
16
|
+
# list of conditions and the following disclaimer.
|
17
|
+
#
|
18
|
+
# - Redistributions in binary form must reproduce the above copyright notice, this
|
19
|
+
# list of conditions and the following disclaimer in the documentation and/or
|
20
|
+
# other materials provided with the distribution.
|
21
|
+
#
|
22
|
+
# - Neither the name of the UT-BATTELLE nor the names of its contributors may
|
23
|
+
# be used to endorse or promote products derived from this software without
|
24
|
+
# specific prior written permission.
|
25
|
+
#
|
26
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
27
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
28
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
29
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
30
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
31
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
32
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
33
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
34
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
35
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
36
|
+
# }}}
|
37
|
+
|
38
|
+
# try and blank? methods borrowed from rails
|
39
|
+
# See: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/try.rb
|
40
|
+
class Object
|
41
|
+
def try(method, *args, &block)
|
42
|
+
send(method, *args, &block)
|
43
|
+
end
|
44
|
+
remove_method :try
|
45
|
+
alias_method :try, :__send__
|
46
|
+
|
47
|
+
def blank?
|
48
|
+
respond_to?(:empty?) ? empty? : !self
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class NilClass #:nodoc:
|
53
|
+
def try(*args)
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def blank?
|
58
|
+
true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
module Smithy
|
63
|
+
def notice(message)
|
64
|
+
STDOUT.puts "==> ".color(:blue).bright+message.bright if STDOUT.tty?
|
65
|
+
end
|
66
|
+
|
67
|
+
def notice_warn(message)
|
68
|
+
STDOUT.puts ("==> "+message).color(:yellow) if STDOUT.tty?
|
69
|
+
end
|
70
|
+
|
71
|
+
def notice_info(message)
|
72
|
+
STDOUT.puts (message).color(:blue) if STDOUT.tty?
|
73
|
+
end
|
74
|
+
|
75
|
+
def notice_command(command, comment, width=40)
|
76
|
+
STDOUT.puts command.bright.ljust(width)+comment.color(:blue) if STDOUT.tty?
|
77
|
+
end
|
78
|
+
|
79
|
+
def notice_success(message)
|
80
|
+
if STDOUT.tty?
|
81
|
+
STDOUT.puts ("==> "+message).color(:green)
|
82
|
+
else
|
83
|
+
STDOUT.puts message
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def notice_fail(message)
|
88
|
+
if STDOUT.tty?
|
89
|
+
STDOUT.puts ("==> "+message).color(:red)
|
90
|
+
else
|
91
|
+
STDOUT.puts message
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def process_ouput(stdout, stderr, suppress_stdout = false, log_file = nil)
|
96
|
+
unless stdout.empty?
|
97
|
+
puts stdout unless suppress_stdout
|
98
|
+
log_file.puts stdout unless log_file.nil?
|
99
|
+
stdout.replace("")
|
100
|
+
end
|
101
|
+
unless stderr.empty?
|
102
|
+
puts stderr unless suppress_stdout
|
103
|
+
log_file.puts stderr unless log_file.nil?
|
104
|
+
stderr.replace("")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def launch_editor(args = {})
|
109
|
+
editor = args[:editor] || ENV['EDITOR']
|
110
|
+
raise """Please specify which editor to launch using the
|
111
|
+
$EDITOR environment variable or the --editor option.""" if editor.blank?
|
112
|
+
|
113
|
+
arg_list = [ editor ]
|
114
|
+
arg_list << "-O" if args[:split] && editor =~ /vim/
|
115
|
+
|
116
|
+
if args[:split]
|
117
|
+
args[:files].each{|f| arg_list << f}
|
118
|
+
else
|
119
|
+
arg_list << args[:files].first
|
120
|
+
end
|
121
|
+
|
122
|
+
status = Kernel::system(*arg_list)
|
123
|
+
end
|
124
|
+
|
125
|
+
def modulehelp(name)
|
126
|
+
raise "$MODULEPATH is not set" unless ENV.has_key?('MODULEPATH')
|
127
|
+
sout = ""
|
128
|
+
#serr = ""
|
129
|
+
status = Open4::popen4("script -q -c '#{ENV['MODULESHOME']}/bin/modulecmd sh help #{name}' /dev/null") do |pid, stdin, stdout, stderr|
|
130
|
+
sout += stdout.read.strip
|
131
|
+
#serr += stderr.read.strip
|
132
|
+
end
|
133
|
+
#if status.exitstatus.eql?(0)
|
134
|
+
sout.gsub!(/\r/, '')
|
135
|
+
#serr.gsub!(/\r/, '')
|
136
|
+
return sout
|
137
|
+
#list = ""
|
138
|
+
# status = Open4::popen4(ENV['MODULESHOME']+"/bin/modulecmd ruby avail -t") do |pid, stdin, stdout, stderr|
|
139
|
+
# list = stderr.read.strip
|
140
|
+
# end
|
141
|
+
# if status.exitstatus.eql?(0)
|
142
|
+
# m = {}
|
143
|
+
# key = nil
|
144
|
+
# list.split(/^(.*:)$/).each do |line|
|
145
|
+
# next if line.empty?
|
146
|
+
# if key.nil?
|
147
|
+
# if line =~ /^(.*):$/
|
148
|
+
# key = $1
|
149
|
+
# end
|
150
|
+
# else
|
151
|
+
# m[key] = line.split("\n")
|
152
|
+
# m[key].reject!{|l| l.empty?}
|
153
|
+
# key = nil
|
154
|
+
# end
|
155
|
+
# end
|
156
|
+
# end
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|