ratch 0.4.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/COPYING +17 -669
  2. data/HISTORY +6 -0
  3. data/MANIFEST +36 -0
  4. data/METADATA +14 -0
  5. data/NEWS +7 -0
  6. data/README +67 -17
  7. data/bin/ratch +5 -78
  8. data/demo/tryme-task.ratch +12 -0
  9. data/demo/tryme1.ratch +6 -0
  10. data/lib/ratch/core_ext.rb +6 -0
  11. data/lib/ratch/core_ext/facets.rb +1 -0
  12. data/lib/ratch/core_ext/filetest.rb +52 -0
  13. data/lib/ratch/core_ext/object.rb +8 -0
  14. data/lib/ratch/core_ext/pathname.rb +38 -0
  15. data/lib/ratch/core_ext/string.rb +44 -0
  16. data/lib/ratch/{dsl/console.rb → core_ext/to_console.rb} +2 -76
  17. data/lib/ratch/core_ext/to_list.rb +29 -0
  18. data/lib/ratch/dsl.rb +494 -49
  19. data/lib/ratch/index.rb +4 -0
  20. data/lib/ratch/io.rb +116 -0
  21. data/lib/ratch/pathglob.rb +73 -0
  22. data/lib/ratch/plugin.rb +55 -0
  23. data/lib/ratch/runmode.rb +69 -0
  24. data/lib/ratch/script.rb +52 -0
  25. data/lib/ratch/service.rb +33 -0
  26. data/lib/ratch/task.rb +249 -0
  27. data/lib/ratch/task2.rb +298 -0
  28. data/test/README +1 -0
  29. data/test/test_helper.rb +4 -0
  30. data/test/test_task.rb +46 -0
  31. metadata +90 -150
  32. data/CHANGES +0 -22
  33. data/TODO +0 -2
  34. data/bin/lt +0 -56
  35. data/bin/ludo +0 -14
  36. data/bin/manifest +0 -451
  37. data/bin/ratch-find +0 -21
  38. data/demo/WILMA +0 -1
  39. data/demo/XR +0 -9
  40. data/demo/lib/foo/foo.rb +0 -7
  41. data/demo/p.rb +0 -9
  42. data/demo/r.rb +0 -6
  43. data/demo/t.rb +0 -3
  44. data/demo/task/config.yaml +0 -4
  45. data/demo/task/one +0 -6
  46. data/demo/task/simplebuild +0 -15
  47. data/demo/task/stats +0 -4
  48. data/demo/task/task +0 -6
  49. data/demo/task/tryme +0 -10
  50. data/lib/ratch/dsl/argv.rb +0 -112
  51. data/lib/ratch/dsl/batch.rb +0 -232
  52. data/lib/ratch/dsl/build.rb +0 -174
  53. data/lib/ratch/dsl/email.rb +0 -108
  54. data/lib/ratch/dsl/file.rb +0 -205
  55. data/lib/ratch/dsl/meta.rb +0 -125
  56. data/lib/ratch/dsl/options.rb +0 -98
  57. data/lib/ratch/dsl/setup.rb +0 -124
  58. data/lib/ratch/dsl/sign.rb +0 -243
  59. data/lib/ratch/dsl/stage.rb +0 -147
  60. data/lib/ratch/dsl/task.rb +0 -139
  61. data/lib/ratch/dsl/upload.rb +0 -436
  62. data/lib/ratch/dsl/zip.rb +0 -59
  63. data/lib/ratch/extra/email.rb +0 -5
  64. data/lib/ratch/extra/stage.rb +0 -5
  65. data/lib/ratch/extra/zip.rb +0 -5
  66. data/lib/ratch/manager.rb +0 -53
  67. data/lib/ratch/manifest.rb +0 -540
  68. data/lib/ratch/metadata/information.rb +0 -258
  69. data/lib/ratch/metadata/package.rb +0 -108
  70. data/lib/ratch/metadata/project.rb +0 -523
  71. data/lib/ratch/metadata/release.rb +0 -108
  72. data/lib/ratch/support/errors.rb +0 -4
  73. data/lib/ratch/support/filename.rb +0 -18
  74. data/lib/ratch/support/filetest.rb +0 -29
  75. data/lib/ratch/toolset/ruby/announce +0 -224
  76. data/lib/ratch/toolset/ruby/compile +0 -49
  77. data/lib/ratch/toolset/ruby/install +0 -77
  78. data/lib/ratch/toolset/ruby/notes +0 -185
  79. data/lib/ratch/toolset/ruby/pack/gem +0 -93
  80. data/lib/ratch/toolset/ruby/pack/tgz +0 -46
  81. data/lib/ratch/toolset/ruby/pack/zip +0 -46
  82. data/lib/ratch/toolset/ruby/publish +0 -57
  83. data/lib/ratch/toolset/ruby/release +0 -8
  84. data/lib/ratch/toolset/ruby/setup +0 -1616
  85. data/lib/ratch/toolset/ruby/stamp +0 -33
  86. data/lib/ratch/toolset/ruby/stats +0 -138
  87. data/lib/ratch/toolset/ruby/test/crosstest +0 -305
  88. data/lib/ratch/toolset/ruby/test/extest +0 -129
  89. data/lib/ratch/toolset/ruby/test/isotest +0 -293
  90. data/lib/ratch/toolset/ruby/test/load +0 -39
  91. data/lib/ratch/toolset/ruby/test/loadtest +0 -28
  92. data/lib/ratch/toolset/ruby/test/syntax +0 -29
  93. data/lib/ratch/toolset/ruby/test/test +0 -26
  94. data/lib/ratch/toolset/sandbox/query +0 -11
  95. data/man/ratch.man +0 -73
  96. data/meta/MANIFEST +0 -130
  97. data/meta/config.yaml +0 -9
  98. data/meta/icli.yaml +0 -16
  99. data/meta/project.yaml +0 -20
  100. data/meta/ratch.roll +0 -2
  101. data/meta/xProjectInfo +0 -41
  102. data/task/clobber/package +0 -10
  103. data/task/man +0 -14
  104. data/task/publish +0 -57
  105. data/task/release +0 -9
  106. data/task/setup +0 -1616
  107. data/task/stats +0 -138
@@ -1,147 +0,0 @@
1
- # = TITLE:
2
- #
3
- # Stage DSL
4
- #
5
- # = COPYING:
6
- #
7
- # Copyright (c) 2007 Psi T Corp.
8
- #
9
- # This file is part of the ProUtils' Box program.
10
- #
11
- # Box is free software: you can redistribute it and/or modify
12
- # it under the terms of the GNU General Public License as published by
13
- # the Free Software Foundation, either version 3 of the License, or
14
- # (at your option) any later version.
15
- #
16
- # Box is distributed in the hope that it will be useful,
17
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- # GNU General Public License for more details.
20
- #
21
- # You should have received a copy of the GNU General Public License
22
- # along with Box. If not, see <http://www.gnu.org/licenses/>.
23
-
24
- module Ratch
25
- module Dsl
26
-
27
- # Stage package by hard linking included files to a stage directory.
28
-
29
- module Stage
30
-
31
- # Stage package.
32
- #
33
- # stage Stage directory.
34
- # filelist Files to link to stage.
35
-
36
- def stage(stage, filelist)
37
- stage_link(stage, filelist)
38
- stage_manifest(stage)
39
- return stage
40
- end
41
-
42
- # Prepare stage directory.
43
-
44
- def stage_link(stage_directory, files)
45
- return stage_directory if dryrun? # Don't link to stage if dryrun.
46
-
47
- stage_clear(stage_directory)
48
- mkdir_p(stage_directory) #dir = File.expand_path(stage)
49
-
50
- #files = package.filelist #+ [package.manifest_file]
51
-
52
- # TODO Dryrun test here or before folder creation?
53
- files.each do |f| # Link files into staging area.
54
- file = File.join(stage_directory, f)
55
- if File.directory?(f)
56
- mkdir_p(file)
57
- else
58
- unless File.exist?(file) and File.mtime(file) >= File.mtime(f)
59
- ln(f, file) #safe_ln ?
60
- end
61
- end
62
- end
63
- return stage_directory
64
- end
65
-
66
- # Clear old stage, if any.
67
-
68
- def stage_clear(stage_directory)
69
- if File.directory?(stage_directory) # Ensure existance of staging area
70
- #raise(OverwriteError, stage_directory) unless force?
71
- rm_r(stage_directory)
72
- end
73
- end
74
-
75
- # Create manifest for stage directory.
76
- # TODO Do this programatically rather then via shell.
77
-
78
- def stage_manifest(stage_directory)
79
- #cd(stage_directory) do
80
- # sh 'manifest up'
81
- #end
82
- end
83
-
84
- end
85
-
86
- end
87
- end
88
-
89
-
90
-
91
-
92
-
93
- #
94
- # # Build packages.
95
- # # TODO Move this to Manager ?
96
- #
97
- # def generate_packages
98
- # package_files = formats.collect do |format|
99
- # #format = clean_type(format)
100
- # say '' if format == 'gem' # FIXME This is here b/c Gems outputs on it's own.
101
- # file = create_package(format)
102
- # unless dryrun? or (format == 'gem')
103
- # report_package_built(format, file) if file
104
- # end
105
- # file
106
- # end
107
- # report_packaging_complete(package_files.size)
108
- # end
109
- #
110
- # # Create package.
111
- #
112
- # def create_package(type)
113
- # package.format = type
114
- #
115
- # builder_class = FormatBuilder.registry[type]
116
- # builder = builder_class.new(package, stage_directory, options)
117
- # file = builder.build
118
- #
119
- # transfer(file) unless dryrun?
120
- #
121
- # return file
122
- # end
123
- #
124
- # # Transfer package file to storage dir.
125
- #
126
- # def transfer(file)
127
- # dest = File.join(store, File.basename(file)) # move to store, unless already there
128
- # dest = File.expand_path(dest)
129
- # mv(file, store) unless file == dest
130
- # end
131
- #
132
- # # Report that a package has been built.
133
- #
134
- # def report_package_built(type, file)
135
- # r = ''
136
- # r << "\n Successfully built #{type}"
137
- # r << "\n Name: #{package.name}"
138
- # r << "\n Version: #{package.version}"
139
- # r << "\n File: #{File.basename(file)}"
140
- # say r
141
- # end
142
- #
143
- # # Report that packaging is complete.
144
- #
145
- # def report_packaging_complete(size)
146
- # say "\nSuccessfully built #{size} packages at #{store}/."
147
- # end
@@ -1,139 +0,0 @@
1
- # = TITLE:
2
- #
3
- # Task DSL
4
- #
5
- # = COPYING:
6
- #
7
- # Copyright (c) 2007 Psi T Corp.
8
- #
9
- # This file is part of the ProUtils' Ratch program.
10
- #
11
- # Ratch is free software: you can redistribute it and/or modify
12
- # it under the terms of the GNU General Public License as published by
13
- # the Free Software Foundation, either version 3 of the License, or
14
- # (at your option) any later version.
15
- #
16
- # Ratch is distributed in the hope that it will be useful,
17
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- # GNU General Public License for more details.
20
- #
21
- # You should have received a copy of the GNU General Public License
22
- # along with Ratch. If not, see <http://www.gnu.org/licenses/>.
23
-
24
- module Ratch
25
- module Dsl
26
-
27
- module Tasks
28
-
29
- # Define main task.
30
-
31
- def main(name, &block)
32
- name, deps, block = *parse_task_dependencies(name, &block)
33
- define_main(name, *deps, &block)
34
- end
35
-
36
- # Define a task.
37
-
38
- def task(name, &block)
39
- name, deps, block = *parse_task_dependencies(name, &block)
40
- define_task(name, *deps, &block)
41
- end
42
-
43
- # Run a task.
44
-
45
- def run(name, arguments=nil)
46
- task_plan(name).each{ |name| tasks[name].call }
47
- end
48
-
49
- private
50
-
51
- def tasks ; @tasks ||= {} ; end
52
-
53
- def main_task ; @main ; end
54
-
55
- #
56
-
57
- def parse_task_dependencies(name_deps, &block)
58
- if Hash===name_deps
59
- name = name_deps.keys[0]
60
- deps = name_deps.values[0]
61
- else
62
- name = name_deps
63
- deps = []
64
- end
65
- [name, deps, block]
66
- end
67
-
68
- def define_main(name=nil, *depend, &block)
69
- @main = define_task(name, *depend, &block)
70
- #@main = Task.new(name, *depend, &block)
71
- #tasks[@main.name] = @main
72
- end
73
-
74
- def define_task(name, *depend, &block)
75
- task = Task.new(name, *depend, &block)
76
- tasks[task.name] = task
77
- end
78
-
79
- # Call main task.
80
- #--
81
- # TODO If @main is nil try task by same name a file (?)
82
- # If so, be careful of infinite loop via method_missing.
83
- #++
84
-
85
- def run_main
86
- return unless main_task
87
- run(main_task.name)
88
- end
89
-
90
- # Prepare plan, checking for circular dependencies.
91
-
92
- def task_plan(name, list=[])
93
- if list.include?(name)
94
- raise "Circular dependency #{name}."
95
- end
96
- if task = tasks[name]
97
- task.needs.each do |need|
98
- need = need.to_s
99
- next if list.include?(need)
100
- #@tasks[need].task_plan(need, list)
101
- task_plan(need, list)
102
- end
103
- list << task.name
104
- else
105
- # TODO THIS TIES TASKS INTO BATCH, BETTER WAY?
106
- if name != main_task && fname = batch?(name)
107
- task = Task.new(name) do
108
- batch(fname)
109
- end
110
- tasks[name] = task
111
- list << task.name
112
- else
113
- abort "no task -- #{name}"
114
- end
115
- end
116
- return list
117
- end
118
-
119
- end
120
-
121
- # Task is a very simple store for defined actions
122
- # and their prerequisites.
123
-
124
- class Task
125
- attr_reader :name, :needs, :action
126
-
127
- def initialize(name, *needs, &action)
128
- @name = name.to_s
129
- @needs = needs
130
- @action = action
131
- end
132
-
133
- def call
134
- @action.call if @action
135
- end
136
- end
137
-
138
- end
139
- end
@@ -1,436 +0,0 @@
1
- # = TITLE:
2
- #
3
- # Upload DSL
4
- #
5
- # = COPYING:
6
- #
7
- # Copyright (c) 2007 Psi T Corp.
8
- #
9
- # This file is part of the ProUtils' Ratch program.
10
- #
11
- # Ratch is free software: you can redistribute it and/or modify
12
- # it under the terms of the GNU General Public License as published by
13
- # the Free Software Foundation, either version 3 of the License, or
14
- # (at your option) any later version.
15
- #
16
- # Ratch is distributed in the hope that it will be useful,
17
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- # GNU General Public License for more details.
20
- #
21
- # You should have received a copy of the GNU General Public License
22
- # along with Ratch. If not, see <http://www.gnu.org/licenses/>.
23
- #
24
- # = TODO:
25
- #
26
- # - Incorporate password into scp and ftp ?
27
- # - rsync needs --delete option
28
-
29
- require 'openssl'
30
- require 'shellwords'
31
- require 'tmpdir'
32
-
33
- require 'facets/openobject'
34
-
35
- module Ratch
36
- module Dsl
37
-
38
- # Upload files to host. These means of uploading are current
39
- # supported: ftp, sftp, scp and rsync.
40
- #
41
- # user Username for host.
42
- # host Host server's domain name.
43
- # root Document root path on host.
44
- # copy Directory of files to publish, or
45
- # Files to publish using from and to.
46
- #
47
- # dryrun If true only pretend to upload.
48
- # quiet Supress all output.
49
- # verbose Provide extra details.
50
- #
51
- # The copy parameter allows you to simply specify a file
52
- # or directory which will be published to host's document
53
- # root location.
54
- #
55
- # If you need more control over which files to publish
56
- # where, you can use the copy parameter instead. Provide
57
- # an array of pattern strings in the form of "{from} {to}".
58
- # If the desitination is the host's document root you do
59
- # not need to specify the {to} part. For example:
60
- #
61
- # copy = [ 'web/*', 'doc/api/* doc/api' ]
62
- #
63
- # The first copies the files under your project's web directory
64
- # to the host's document root. The second copies your projects
65
- # doc/api files to the doc/api location on the host.
66
- #
67
- # The internal template used for the outbound destination
68
- # is 'username@host:root/'.
69
-
70
- module Upload
71
-
72
- module_function
73
-
74
- #
75
- # Upload via given protocol.
76
- #
77
-
78
- def upload( protocol, opts )
79
- send(protocol.to_s.downcase,opts)
80
- end
81
-
82
- #
83
- # Use ftp to upload files.
84
- #
85
-
86
- def ftp( keys )
87
- keys = upload_parameters(keys)
88
-
89
- # set transfer rules
90
- if keys.stage
91
- trans = stage_transfer(keys.stage)
92
- else
93
- files(keys.dir, keys.copy).each do |from|
94
- trans << [from,from]
95
- end
96
- end
97
-
98
- # append location of publication dir to from
99
- dir = keys.dir
100
- trans.collect!{ |from,to| [File.join(dir,from), to] }
101
-
102
- if keys.dryrun
103
- puts "ftp open #{keys.user}@#{keys.host}:#{keys.root}/"
104
- keys.trans.each do |f, t|
105
- puts "ftp put #{f} #{t}"
106
- end
107
- else
108
- require 'net/ftp'
109
- Net::FTP.open(keys.host) do |ftp|
110
- ftp.login(keys.user) #password?
111
- ftp.chdir(keys.root)
112
- keys.trans.each do |f, t|
113
- puts "ftp #{f} #{t}" unless keys.quiet
114
- ftp.putbinaryfile( f, t, 1024 )
115
- end
116
- end
117
- end
118
- end
119
-
120
- #
121
- # Use sftp to upload files.
122
- #
123
-
124
- def sftp( keys )
125
- keys = upload_parameters(keys)
126
-
127
- # set transfer rules
128
- if keys.stage
129
- trans = stage_transfer(keys.stage)
130
- else
131
- files(keys.dir, keys.copy).each do |from|
132
- trans << [from,from]
133
- end
134
- end
135
-
136
- # append location of publication dir to from
137
- dir = keys.dir
138
- trans.collect!{ |from,to| [File.join(dir,from), to] }
139
-
140
- if keys.dryrun
141
- puts "sftp open #{keys.user}@#{keys.host}:#{keys.root}/"
142
- keys.trans.each do |f,t|
143
- puts "sftp put #{f} #{t}"
144
- end
145
- else
146
- require 'net/sftp'
147
- Net::SFTP.start(keys.host, keys.user, keys.pass) do |sftp|
148
- #sftp.login( user )
149
- sftp.chdir(keys.root)
150
- keys.trans.each do |f,t|
151
- puts "sftp #{f} #{t}" unless keys.quiet
152
- sftp.put_file(f,t) #, 1024 )
153
- end
154
- end
155
- end
156
- end
157
-
158
- #
159
- # Use rsync to upload files.
160
- #
161
-
162
- def rsync( keys )
163
- keys = upload_parameters(keys)
164
-
165
- flags = []
166
- flags << "-n" if keys.dryrun
167
- flags << "-q" if keys.quiet
168
- flags << "-v" if keys.verbose
169
- flags << "--progress" unless keys.quiet
170
- flags = flags.join(' ').strip
171
- flags = ' ' + flags unless flags.empty?
172
-
173
- manfile = 'Publish.txt'
174
-
175
- if keys.stage
176
- dir = stage_linkdir(keys.dir, keys.stage)
177
- Dir.chdir(dir) do
178
- cpy = files(keys.copy)
179
- end
180
- manifest = File.join(dir,manfile)
181
- cmd = %{rsync#{flags} -L -arz --files-from='#{manifest}' #{dir} #{keys.user}@#{keys.host}:/#{keys.root}}
182
- else
183
- dir = keys.dir
184
- cpy = files(dir, keys.copy)
185
- manifest = File.join(dir,manfile)
186
- cmd = %{rsync#{flags} -arz --files-from='#{manifest}' #{dir} #{keys.user}@#{keys.host}:/#{keys.root}}
187
- end
188
-
189
- #Dir.chdir(keys.dir) do
190
- begin
191
- File.open(manifest, 'w'){ |f| f << cpy.join("\n") }
192
- ENV['RSYNC_PASSWORD'] = keys.pass if keys.pass
193
- puts cmd unless keys.quiet
194
- system cmd
195
- ensure
196
- ENV.delete('RSYNC_PASSWORD') if keys.pass
197
- end
198
- #end
199
-
200
- end
201
-
202
- # private (can't do b/c of module_function)
203
-
204
- # parse publishing options.
205
-
206
- def upload_parameters( keys )
207
- keys = OpenObject.new(keys)
208
-
209
- keys.copy = keys.copy || '**/*'
210
- keys.host = keys.host || keys.domain
211
- keys.user = keys.user || keys.username
212
- keys.root = keys.root || '/'
213
- #keys.pass = keys.pass || keys.password
214
-
215
- # validate
216
- raise ArgumentError, "missing publish parameter -- dir" unless keys.dir
217
- raise ArgumentError, "missing publish parameter -- host" unless keys.host
218
- raise ArgumentError, "missing publish parameter -- user" unless keys.user
219
- #raise ArgumentError, "missing publish parameter -- copy" unless keys.copy
220
- #raise ArgumentError, "missing publish parameter -- root" unless keys.root
221
-
222
- keys.root = '' if keys.root.nil?
223
- keys.root.sub!(/^\//,'')
224
-
225
- if String===keys.copy and File.directory?(keys.copy)
226
- copy = File.join(keys.copy, '*')
227
- end
228
- keys.copy = [keys.copy].flatten.compact
229
-
230
- # trans = []
231
- # keys.copy.each do |from|
232
- # #from, to = *Shellwords.shellwords(c)
233
- # #to = from if to.nil?
234
- # #to = to[1..-1] if to[0,1] == '/'
235
- # from.sub('*','**/*') unless from =~ /\*\*/
236
- # files = Dir.glob(from)
237
- # files.each do |f|
238
- # #t = File.join(to,File.basename(f))
239
- # #t = t[1..-1] if t[0,1] == '/'
240
- # trans << [f,f]
241
- # end
242
- # end
243
- # keys.trans = trans
244
-
245
- return keys
246
- end
247
-
248
- # Put together the list of files to copy.
249
-
250
- def files( dir, copy )
251
- Dir.chdir(dir) do
252
- del, add = copy.partition{ |f| /^[-]/ =~ f }
253
-
254
- # remove - and + prefixes
255
- del.collect!{ |f| f.sub(/^[-]/,'') }
256
- add.collect!{ |f| f.sub(/^[+]/,'') }
257
-
258
- #del.concat(must_exclude)
259
-
260
- files = []
261
- add.each{ |g| files += Dir.multiglob(g) }
262
- del.each{ |g| files -= Dir.multiglob(g) }
263
-
264
- files.collect!{ |f| f.sub(/^\//,'') }
265
-
266
- return files
267
- end
268
- end
269
-
270
- # Combine three part stage list into a two part from->to list.
271
- #
272
- # Using the stage list of three space separated fields.
273
- #
274
- # fromdir file todir
275
- #
276
- # This is used to generate a from -> to list of the form:
277
- #
278
- # fromdir/file todir/file
279
- #
280
-
281
- def stage_transfer( list )
282
- trans = []
283
- list.each do |line|
284
- trans << Shellwords.shellwords(line)
285
- end
286
-
287
- trans.collect! do |from, base, to|
288
- file = File.join(from,base)
289
- to = File.join(to,base)
290
- [from, to]
291
- end
292
- end
293
-
294
- # When using stage options this will create temporary linked location.
295
-
296
- def stage_linkdir( dir, list )
297
- folder = File.join(Dir.tmpdir, 'ratchets', 'project', object_id.abs.to_s)
298
- FileUtils.mkdir_p(folder)
299
-
300
- Dir.chdir(dir) do
301
- stage_transfer(list).each do |file, to|
302
- link = File.join(folder,to)
303
- FileUtils.ln_s(link,file)
304
- end
305
- end
306
-
307
- return folder
308
- end
309
-
310
- end
311
-
312
- end
313
- end
314
-
315
-
316
- =begin
317
-
318
-
319
- #--
320
- # SHELLS OUT! Need net/scp library to fix.
321
- #++
322
-
323
- # Use scp to upload files.
324
-
325
- def scp( keys )
326
- keys = upload_parameters(keys)
327
-
328
- flags = []
329
- flags << "-v" if keys.verbose
330
- flags << "-q" if keys.quiet
331
- flags = flags.join(' ').strip
332
- flags = ' ' + flags unless flags.empty?
333
-
334
- upload_stage(keys) do #|tmpdir|
335
- cmd = "scp -r#{flags} * #{keys.user}@#{keys.host}:/#{keys.root}"
336
- puts cmd unless keys.quiet
337
- system cmd unless keys.dryrun
338
- end
339
- end
340
-
341
- # Use rsync to upload files.
342
-
343
- def rsync( keys )
344
- keys = upload_parameters(keys)
345
-
346
- flags = []
347
- flags << "-n" if keys.dryrun
348
- flags << "-v" if keys.verbose
349
- flags << "-q" if keys.quiet
350
- flags = flags.join(' ').strip
351
- flags = ' ' + flags unless flags.empty?
352
-
353
- upload_stage(keys) do #|tmpdir|
354
- begin
355
- ENV['RSYNC_PASSWORD'] = keys.pass if keys.pass
356
- cmd = "rsync -R#{flags} -arz * #{keys.user}@#{keys.host} /#{keys.root}"
357
- ensure
358
- ENV.delete('RSYNC_PASSWORD') if keys.pass
359
- end
360
- end
361
- end
362
-
363
- # Use ftp to upload files.
364
-
365
- def ftp( keys )
366
- keys = upload_parameters(keys)
367
-
368
- if keys.dryrun
369
- puts "ftp open #{keys.user}@#{keys.host}:#{keys.root}/"
370
- keys.trans.each do |f, t|
371
- puts "ftp put #{f} #{t}"
372
- end
373
- else
374
- require 'net/ftp'
375
- Net::FTP.open(keys.host) do |ftp|
376
- ftp.login(keys.user) #password?
377
- ftp.chdir(keys.root)
378
- keys.trans.each do |f, t|
379
- puts "ftp #{f} #{t}" unless keys.quiet
380
- ftp.putbinaryfile( f, t, 1024 )
381
- end
382
- end
383
- end
384
- end
385
-
386
- # Use sftp to upload files.
387
-
388
- def sftp( keys )
389
- keys = upload_parameters(keys)
390
-
391
- if keys.dryrun
392
- puts "sftp open #{keys.user}@#{keys.host}:#{keys.root}/"
393
- keys.trans.each do |f,t|
394
- puts "sftp put #{f} #{t}"
395
- end
396
- else
397
- require 'net/sftp'
398
- Net::SFTP.start(keys.host, keys.user, keys.pass) do |sftp|
399
- #sftp.login( user )
400
- sftp.chdir(keys.root)
401
- keys.trans.each do |f,t|
402
- puts "sftp #{f} #{t}" unless keys.quiet
403
- sftp.put_file(f,t) #, 1024 )
404
- end
405
- end
406
- end
407
- end
408
-
409
-
410
- # Creates a stage from which the whole directory can be uploaded.
411
- # This is needed for scp and rsync which have to shelled out,
412
- # and can't conveniently copy one file at a time.
413
-
414
- def upload_stage(keys) #:yield:
415
- tmp = "scp_#{object_id.abs}_#{ Time.now.strftime("%Y%m%d%H%M%S")}"
416
- tmpdir = File.join(Dir.tmpdir,tmp)
417
-
418
- puts "mkdir -p #{tmpdir}" unless keys.quiet
419
- FileUtils.mkdir_p(tmpdir) # go ahead and do this even if dryrun
420
-
421
- fu = keys.dryrun ? FileUtils::DryRun : FileUtils
422
- keys.trans.each do |f, t|
423
- to = File.join(tmpdir, t)
424
- fu.mv(f,to)
425
- end
426
-
427
- puts "cd #{tmpdir}" unless keys.quiet
428
- Dir.chdir(tmpdir) do
429
- yield #(tmpdir)
430
- end
431
-
432
- puts "rm -r #{tmpdir}" unless keys.quiet
433
- FileUtils.rm_r(tmpdir) # now remove the temp dir
434
- end
435
-
436
- =end