p4ruby 1.0.3 → 1.0.5

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.
Files changed (4) hide show
  1. data/README +5 -8
  2. data/install.rb +190 -140
  3. data/p4ruby.gemspec +1 -1
  4. metadata +3 -3
data/README CHANGED
@@ -25,16 +25,13 @@ installs it. Some options are available,
25
25
  --uninstall Uninstall.
26
26
  --local Use the local files in work/distfiles (for manual download)
27
27
 
28
- == Download (this installer only)
29
-
30
- * http://rubyforge.org/frs/?group_id=6957
31
-
32
28
  == Links
33
29
 
34
- * Tony Smith's original P4Ruby {public depot}[http://public.perforce.com/guest/tony_smith/perforce/API/Ruby/index.html] and {documentation}[http://public.perforce.com/guest/tony_smith/perforce/API/Ruby/main/doc/index.html].
35
- * Changes[http://perforce.com/perforce/doc.081/user/p4rubynotes.txt] in the Perforce P4Ruby official package.
36
- * {Repository (this installer only)}[http://github.com/quix/p4ruby]
37
- * Users may be interested in a simplified interface to P4Ruby at http://perforce.rubyforge.org.
30
+ * Download (this installer only): http://rubyforge.org/frs/?group_id=6957
31
+ * Simplified wrapper for P4Ruby: http://perforce.rubyforge.org
32
+ * P4Ruby documentation 2008.1: http://perforce.com/perforce/doc.081/manuals/p4script/p4script.pdf
33
+ * Perforce documentation: http://perforce.com/perforce/technical.html
34
+ * Repository (this installer only): http://github.com/quix/p4ruby
38
35
 
39
36
  == Credits
40
37
 
data/install.rb CHANGED
@@ -9,13 +9,42 @@ require 'fileutils'
9
9
  require 'optparse'
10
10
  require 'pathname'
11
11
 
12
+ def main
13
+ Installer.new.run
14
+ end
15
+
12
16
  class Installer
13
17
  include FileUtils
14
18
 
15
19
  CONFIG = Config::CONFIG
20
+ BIT64 = (1.size == 8)
21
+
22
+ RB_BASENAME = Pathname.new "P4.rb"
23
+ SO_BASENAME = Pathname.new "P4.#{CONFIG['DLEXT']}"
24
+
25
+ RAW_INSTALL_FILES = [
26
+ Pathname.new(CONFIG["sitelibdir"]) + RB_BASENAME,
27
+ Pathname.new(CONFIG["sitearchdir"]) + SO_BASENAME,
28
+ ]
29
+
30
+ GEM_INSTALL_FILES = [
31
+ Pathname.new("lib") + RB_BASENAME,
32
+ Pathname.new("ext") + SO_BASENAME,
33
+ ]
34
+
35
+ SERVER = "ftp.perforce.com"
36
+ SERVER_TOP_DIR = Pathname.new "perforce"
37
+
38
+ P4API_REMOTE_BASENAME = Pathname.new "p4api.tgz"
39
+ P4RUBY_REMOTE_BASENAME = Pathname.new "p4ruby.tgz"
40
+
41
+ WORK_DIR = Pathname.new "work"
42
+ DISTFILES_DIR = WORK_DIR + "distfiles"
43
+ BUILD_DIR = WORK_DIR + "build"
16
44
 
17
45
  def parse_command_line
18
- OptionParser.new("Usage: ruby install.rb [options]", 24, "") { |parser|
46
+ OptionParser.new("Usage: ruby install.rb [options]", 24, "") {
47
+ |parser|
19
48
  parser.on(
20
49
  "--version NN.N",
21
50
  "Version to download, e.g. 08.1. Default finds latest.") {
@@ -64,19 +93,18 @@ class Installer
64
93
  if @s.uninstall
65
94
  uninstall
66
95
  elsif @s.list_platforms
67
- list_platforms
96
+ puts platforms
68
97
  elsif @s.list_versions
69
- list_versions
70
- elsif @s.platform
71
- if @s.platform =~ %r!\Ant!
72
- windows_install
73
- else
74
- fetch
75
- build
76
- unix_install
77
- end
78
- else
98
+ puts versions
99
+ elsif @s.platform.nil?
79
100
  platform_fail
101
+ elsif @s.platform =~ %r!\Ant!
102
+ windows_install
103
+ else
104
+ fetch
105
+ build
106
+ install
107
+ verify_install
80
108
  end
81
109
  end
82
110
 
@@ -84,19 +112,19 @@ class Installer
84
112
  if CONFIG["LIBRUBYARG_SHARED"].empty?
85
113
  raise "error: ruby must be configured with --enable-shared"
86
114
  end
87
- @s.server = "ftp.perforce.com"
88
- @s.server_top_dir = Pathname.new "perforce"
89
115
 
90
- @s.work_dir = Pathname.new "work"
91
- @s.distfiles_dir = @s.work_dir + "distfiles"
92
- @s.build_dir = @s.work_dir + "build"
116
+ @s.p4api = LazyStruct.new.tap { |t|
117
+ t.basename = P4API_REMOTE_BASENAME
118
+ }
119
+
120
+ @s.p4ruby = LazyStruct.new.tap { |t|
121
+ t.basename = P4RUBY_REMOTE_BASENAME
122
+ }
93
123
 
94
- @s.p4api = LazyStruct.new.tap { |t| t.file = Pathname.new "p4api.tgz" }
95
- @s.p4ruby = LazyStruct.new.tap { |t| t.file = Pathname.new "p4ruby.tgz" }
96
124
  @s.specs = [ @s.p4ruby, @s.p4api ]
97
125
  @s.specs.each { |spec|
98
126
  spec.attribute(:local) {
99
- @s.distfiles_dir + spec.file
127
+ DISTFILES_DIR + spec.basename
100
128
  }
101
129
  }
102
130
 
@@ -113,29 +141,57 @@ class Installer
113
141
  end
114
142
 
115
143
  @s.attribute(:version_dir) {
116
- @s.server_top_dir + "r#{@s.version}"
144
+ SERVER_TOP_DIR + "r#{@s.version}"
117
145
  }
146
+
118
147
  @s.p4api.attribute(:remote) {
119
- @s.version_dir + "bin.#{@s.platform}" + @s.p4api.file
148
+ @s.version_dir + "bin.#{@s.platform}" + @s.p4api.basename
120
149
  }
121
150
  @s.p4ruby.attribute(:remote) {
122
- @s.version_dir + "tools" + @s.p4ruby.file
151
+ @s.version_dir + "tools" + @s.p4ruby.basename
123
152
  }
153
+
124
154
  @s.attribute(:ftp) {
125
- Net::FTP.new(@s.server).tap { |t| t.passive = true ; t.login }
155
+ Net::FTP.new(SERVER).tap { |t|
156
+ t.passive = true
157
+ t.login
158
+ }
126
159
  }
127
160
  end
128
161
 
129
- def find_os_version(os)
162
+ def guess_cpu
163
+ case CONFIG["target_cpu"]
164
+ when %r!ia!i
165
+ "ia64"
166
+ when %r!86!
167
+ # note: with '_'
168
+ "x86" + (BIT64 ? "_64" : "")
169
+ when %r!(ppc|sparc)!i
170
+ # note: without '_'
171
+ $1 + (BIT64 ? "64" : "")
172
+ else
173
+ ""
174
+ end
175
+ end
176
+
177
+ def guess_version(os)
130
178
  if match = `uname -a`.match(%r!#{os}\s+\S+\s+(\d+)\.(\d+)!i)
131
- match.captures.join
179
+ version = match.captures.join
180
+ cpu = guess_cpu
181
+ platforms = self.platforms
182
+ (0..version.to_i).map { |n|
183
+ [os, n.to_s, cpu].join
184
+ }.select { |platform|
185
+ platforms.include? platform
186
+ }.last
187
+ else
188
+ nil
132
189
  end
133
190
  end
134
191
 
135
192
  def guess_platform(opts = {})
136
193
  config_os = CONFIG["target_os"].downcase
137
- bit64 = (1.size == 8)
138
- windows_cpu = (bit64 ? "x64" : "x86")
194
+ windows_cpu = BIT64 ? "x64" : "x86"
139
195
 
140
196
  if config_os =~ %r!cygwin!i
141
197
  "cygwin" + windows_cpu
@@ -144,63 +200,44 @@ class Installer
144
200
  elsif @s.local
145
201
  "<local>"
146
202
  else
147
- if (match = config_os.match(%r!\A\D+!)).nil?
148
- nil
203
+ if match = config_os.match(%r!\A\D+!)
204
+ guess_version(match[0])
149
205
  else
150
- os = match[0]
151
- version = find_os_version(os)
152
- if version.nil?
153
- nil
154
- else
155
- cpu =
156
- case CONFIG["target_cpu"]
157
- when %r!ia!i
158
- "ia64"
159
- when %r!86!
160
- "x86" + (bit64 ? "_64" : "") # note: with '_'
161
- when %r!(ppc|sparc)!i
162
- $1 + (bit64 ? "64" : "") # note: without '_'
163
- else
164
- ""
165
- end
166
-
167
- available_platforms = platforms
168
- platform = nil
169
- version.to_i.downto(0) { |n|
170
- platform = [os, n.to_s, cpu].join
171
- if available_platforms.include? platform
172
- break
173
- end
174
- }
175
- platform
176
- end
206
+ nil
177
207
  end
178
208
  end
179
209
  end
180
210
 
181
211
  def platform_fail
182
- @s.version = "<VERSION>"
183
- @s.platform = "<PLATFORM>"
184
- message = %Q{
185
- Auto-fetch not yet handled for this platform. Run:
186
-
187
- \truby install.rb --list-platforms
188
-
189
- to see the available platforms, then run
190
-
191
- \truby install.rb --platform PLATFORM
192
-
193
- with your platform.
194
-
195
- If all of the above fails, manually fetch
196
-
197
- \tftp://#{@s.server}/#{@s.p4api.remote}
212
+ install_fail {
213
+ @s.version = "<version>"
214
+ @s.platform = "<platform>"
215
+ message = %Q{
216
+ Auto-fetch not yet handled for this platform. Run:
217
+
218
+ \truby install.rb --list-platforms
219
+
220
+ to see the available platforms, then run
221
+
222
+ \truby install.rb --platform PLATFORM
223
+
224
+ with your platform.
225
+
226
+ If all of the above fails, manually fetch
227
+
228
+ \tftp://#{SERVER}/#{@s.p4api.remote}
229
+
230
+ Copy it to #{@s.p4api.local} and run install.rb --local.
231
+ }.gsub(%r!^ +(?=\S)!, "")
198
232
 
199
- Copy it to #{@s.p4api.local} and run install.rb --local.
200
- }.gsub(%r!^ +(?=\S)!, "")
233
+ mkdir_p(DISTFILES_DIR)
234
+ puts message
235
+ }
236
+ end
201
237
 
202
- mkdir_p(@s.distfiles_dir)
203
- puts message
238
+ def install_fail
239
+ yield
240
+ exit(1)
204
241
  end
205
242
 
206
243
  def sys(*args)
@@ -217,8 +254,8 @@ class Installer
217
254
 
218
255
  def fetch_spec(spec)
219
256
  unless @s.local
220
- mkdir_p(File.dirname(spec.local))
221
- puts "downloading ftp://#{@s.server}/#{spec.remote} ..."
257
+ mkdir_p(spec.local.dirname)
258
+ puts "downloading ftp://#{SERVER}/#{spec.remote} ..."
222
259
  @s.ftp.getbinaryfile(spec.remote, spec.local)
223
260
  end
224
261
  end
@@ -250,23 +287,11 @@ class Installer
250
287
  end
251
288
 
252
289
  def versions
253
- remote_files_matching(@s.server_top_dir, %r!r([0-8]\d\.\d)!) { |match|
290
+ remote_files_matching(SERVER_TOP_DIR, %r!r([0-8]\d\.\d)!) { |match|
254
291
  match.captures.first
255
292
  }.sort
256
293
  end
257
294
 
258
- def list_platforms
259
- platforms.each { |platform|
260
- puts platform
261
- }
262
- end
263
-
264
- def list_versions
265
- versions.each { |version|
266
- puts version
267
- }
268
- end
269
-
270
295
  def latest_version
271
296
  versions.last
272
297
  end
@@ -276,79 +301,105 @@ class Installer
276
301
  end
277
302
 
278
303
  def ruby(*args)
279
- exe = File.join(
280
- CONFIG["bindir"],
281
- CONFIG["RUBY_INSTALL_NAME"])
304
+ exe = Pathname.new(CONFIG["bindir"]) + CONFIG["RUBY_INSTALL_NAME"]
282
305
  sys(exe, *args)
283
306
  end
284
307
 
285
308
  def build
286
- rm_rf(@s.build_dir)
287
- mkdir_p(@s.build_dir)
309
+ rm_rf(BUILD_DIR)
310
+ mkdir_p(BUILD_DIR)
288
311
 
289
312
  @s.specs.each { |spec|
290
- unpack(spec.local, @s.build_dir)
313
+ unpack(spec.local, BUILD_DIR)
291
314
  }
292
315
 
293
- Dir.chdir(@s.build_dir) {
316
+ Dir.chdir(BUILD_DIR) {
294
317
  api_dir = Pathname.glob("p4api*").last
295
318
  p4ruby_dir = Pathname.glob("p4ruby*").last
296
319
  Dir.chdir(p4ruby_dir) {
297
320
  ruby("p4conf.rb", "--apidir", "../#{api_dir}")
298
321
  make
299
322
  }
300
- @s.p4ruby_build_dir = @s.build_dir + p4ruby_dir
323
+ @s.p4ruby_build_dir = BUILD_DIR + p4ruby_dir
301
324
  }
302
325
  end
303
326
 
304
- def unix_install
327
+ def raw_install_to_gem_install
328
+ RAW_INSTALL_FILES.each_with_index { |source, index|
329
+ dest = GEM_INSTALL_FILES[index]
330
+ mkdir_p(dest.dirname)
331
+ puts "move #{source} --> #{dest}"
332
+ mv(source, dest)
333
+ }
334
+ end
335
+
336
+ def install
337
+ Dir.chdir(@s.p4ruby_build_dir) {
338
+ make("install")
339
+ }
305
340
  if @s.gem_config
306
- rb_file = Pathname.new("lib") + "P4.rb"
307
- rm_f(rb_file)
308
- mkdir_p(File.dirname(rb_file))
309
- cp(@s.p4ruby_build_dir + rb_file, rb_file)
310
-
311
- dlext = CONFIG["DLEXT"]
312
- so_file = Pathname.new("ext") + "P4.#{dlext}"
313
- rm_f(so_file)
314
- mkdir_p(File.dirname(so_file))
315
- cp(@s.p4ruby_build_dir + so_file.basename, so_file)
341
+ raw_install_to_gem_install
342
+ end
343
+ end
344
+
345
+ def verify_install(on_error = nil)
346
+ files =
347
+ if @s.gem_config
348
+ GEM_INSTALL_FILES
349
+ else
350
+ RAW_INSTALL_FILES
351
+ end.map { |t| t.expand_path }
352
+
353
+ if files.all? { |t| t.exist? }
354
+ puts "Installed files:"
355
+ puts files
356
+ elsif on_error
357
+ install_fail(&on_error)
316
358
  else
317
- Dir.chdir(@s.p4ruby_build_dir) {
318
- make "install"
359
+ install_fail {
360
+ puts "These files were supposed to be installed, but were not:"
361
+ puts files
362
+ puts "Install failed!"
319
363
  }
320
364
  end
321
365
  end
322
366
 
323
367
  def windows_install
324
368
  #
325
- # p4ruby is where the p4api is located on the perforce server
326
- # -- switcharoo --
369
+ # For Windows, p4ruby is located in the p4api directory on the
370
+ # perforce server -- switcharoo --
327
371
  #
328
372
  spec = @s.p4api
329
373
 
330
374
  version = [CONFIG["MAJOR"], CONFIG["MINOR"]].join
331
- spec.file = "p4ruby#{version}.exe"
375
+ spec.basename = "p4ruby#{version}.exe"
332
376
  fetch_spec(spec)
333
377
 
378
+ error = lambda {
379
+ puts "The Perforce Windows P4Ruby installer failed!"
380
+ puts "Re-run it manually here: "
381
+ puts spec.local.expand_path
382
+ }
383
+
334
384
  if system(spec.local, "/S", "/v/qn")
335
- puts "Installed files:"
336
- puts installed_p4ruby_files
385
+ if @s.gem_config
386
+ sleep(1)
387
+ raw_install_to_gem_install
388
+ sleep(1)
389
+ unless system(spec.local, "/V", "/x", "/S", "/v/qn")
390
+ # We don't much care if this fails; just write to the log
391
+ puts "Note: the Perforce Windows P4Ruby uninstaller failed."
392
+ end
393
+ end
394
+ verify_install(error)
337
395
  else
338
- puts "**** The P4Ruby installer failed!"
339
- puts "**** Re-run it manually here: "
340
- puts File.expand_path(spec.local)
396
+ install_fail(&error)
341
397
  end
342
398
  end
343
399
 
344
- def installed_p4ruby_files
345
- [ Pathname.new(CONFIG["sitelibdir"]) + "P4.rb" ] +
346
- Pathname.glob(Pathname.new(CONFIG["sitearchdir"]) + "P4.*")
347
- end
348
-
349
400
  def uninstall
350
- installed_p4ruby_files.each { |file|
351
- if File.exist? file
401
+ RAW_INSTALL_FILES.each { |file|
402
+ if file.exist?
352
403
  puts "delete #{file}"
353
404
  rm_f(file)
354
405
  end
@@ -356,16 +407,6 @@ class Installer
356
407
  end
357
408
  end
358
409
 
359
- # version < 1.8.7 compatibility
360
- module Kernel
361
- unless respond_to? :tap
362
- def tap
363
- yield self
364
- self
365
- end
366
- end
367
- end
368
-
369
410
  #
370
411
  # An OpenStruct with optional lazy-evaluated fields.
371
412
  #
@@ -416,5 +457,14 @@ class LazyStruct < OpenStruct
416
457
  include Mixin
417
458
  end
418
459
 
419
- STDOUT.sync = true
420
- Installer.new.run
460
+ # version < 1.8.7 compatibility
461
+ module Kernel
462
+ unless respond_to? :tap
463
+ def tap
464
+ yield self
465
+ self
466
+ end
467
+ end
468
+ end
469
+
470
+ main
@@ -1,7 +1,7 @@
1
1
 
2
2
  Gem::Specification.new { |t|
3
3
  t.name = "p4ruby"
4
- t.version = "1.0.3"
4
+ t.version = "1.0.5"
5
5
  t.summary = "Ruby interface to the Perforce API"
6
6
  t.author = "Perforce Software (ruby gem by James M. Lawrence)"
7
7
  t.email = "quixoticsycophant@gmail.com"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p4ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Perforce Software (ruby gem by James M. Lawrence)
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-03 00:00:00 -04:00
12
+ date: 2008-10-04 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -56,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
56
56
  requirements: []
57
57
 
58
58
  rubyforge_project: p4ruby
59
- rubygems_version: 1.2.0
59
+ rubygems_version: 1.3.0
60
60
  signing_key:
61
61
  specification_version: 2
62
62
  summary: Ruby interface to the Perforce API