p4ruby 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README +11 -31
  2. data/install.rb +141 -96
  3. data/p4ruby.gemspec +1 -1
  4. metadata +3 -3
data/README CHANGED
@@ -3,24 +3,7 @@
3
3
 
4
4
  This is only an installer for the P4Ruby package by Perforce Software.
5
5
 
6
- P4Ruby was recently included as an official package supported by
7
- Perforce, with minor changes. Tony Smith's original P4Ruby public
8
- depot is here
9
- http://public.perforce.com/guest/tony_smith/perforce/API/Ruby/index.html
10
- with documentation
11
- http://public.perforce.com/guest/tony_smith/perforce/API/Ruby/main/doc/index.html.
12
- Changes in the new package are described here
13
- http://perforce.com/perforce/doc.081/user/p4rubynotes.txt.
14
-
15
- <b>Note:</b> For Windows, this installer currently only supports the
16
- cygwin version. If you are installing cygwin for the first time,
17
- select ruby along with g++ (in the Devel category) inside the cygwin
18
- installer (http://cygwin.com).
19
-
20
- Users may be interested in a simplified interface to Perforce at
21
- http://perforce.rubyforge.org (shameless plug, sorry).
22
-
23
- === Install
6
+ == Install
24
7
 
25
8
  % gem install p4ruby
26
9
 
@@ -40,25 +23,22 @@ installs it. Some options are available,
40
23
  --list-platforms List available platforms for the given version.
41
24
  --gem Gem configuration (for the gem installer).
42
25
  --uninstall Uninstall.
26
+ --local Use the local files in work/distfiles (for manual download)
43
27
 
44
- === Note
45
-
46
- If you are on a case-sensitive filesystem, be aware that 'P4' must be
47
- capitalized in the <em>require</em> line,
48
-
49
- require 'P4'
50
-
51
- === Download (this installer only)
28
+ == Download (this installer only)
52
29
 
53
30
  * http://rubyforge.org/frs/?group_id=6957
54
31
 
55
- === Repository (this installer only)
32
+ == Links
56
33
 
57
- * http://github.com/quix/p4ruby
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.
58
38
 
59
- === Credits
39
+ == Credits
60
40
 
61
- ==== P4Ruby
41
+ === P4Ruby
62
42
 
63
43
  Copyright (c) 1997-2007, Perforce Software, Inc. All rights reserved.
64
44
 
@@ -85,7 +65,7 @@ capitalized in the <em>require</em> line,
85
65
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
86
66
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
87
67
 
88
- ==== Installer and Gem
68
+ === Installer and Gem
89
69
 
90
70
  This ruby package (install.rb and associated files) was written by
91
71
  James M. Lawrence, Copyright (c) 2008 ImaginEngine, Inc. Distributed
data/install.rb CHANGED
@@ -7,18 +7,24 @@ require 'rbconfig'
7
7
  require 'ostruct'
8
8
  require 'fileutils'
9
9
  require 'optparse'
10
+ require 'pathname'
10
11
 
11
12
  class Installer
12
13
  include FileUtils
13
14
 
15
+ CONFIG = Config::CONFIG
16
+
14
17
  def parse_command_line
15
18
  OptionParser.new("Usage: ruby install.rb [options]", 24, "") { |parser|
16
- parser.on("--version NN.N",
17
- "Version to download, e.g. 08.1. Default finds latest.") {
19
+ parser.on(
20
+ "--version NN.N",
21
+ "Version to download, e.g. 08.1. Default finds latest.") {
18
22
  |version|
19
23
  @s.version = version
20
24
  }
21
- parser.on("--list-versions", "List available versions.") {
25
+ parser.on(
26
+ "--list-versions",
27
+ "List available versions.") {
22
28
  @s.list_versions = true
23
29
  }
24
30
  parser.on(
@@ -27,16 +33,26 @@ class Installer
27
33
  |platform|
28
34
  @s.platform = platform
29
35
  }
30
- parser.on("--list-platforms",
31
- "List available platforms for the given version.") {
36
+ parser.on(
37
+ "--list-platforms",
38
+ "List available platforms for the given version.") {
32
39
  @s.list_platforms = true
33
40
  }
34
- parser.on("--gem", "Gem configuration (for the gem installer).") {
41
+ parser.on(
42
+ "--gem",
43
+ "Gem configuration (for the gem installer).") {
35
44
  @s.gem = true
36
45
  }
37
- parser.on("--uninstall", "Uninstall.") {
46
+ parser.on(
47
+ "--uninstall",
48
+ "Uninstall.") {
38
49
  @s.uninstall = true
39
50
  }
51
+ parser.on(
52
+ "--local",
53
+ "Use the local files in work/distfiles (for manual download)") {
54
+ @s.local = true
55
+ }
40
56
  parser.parse(ARGV)
41
57
  }
42
58
  end
@@ -52,28 +68,36 @@ class Installer
52
68
  elsif @s.list_versions
53
69
  list_versions
54
70
  elsif @s.platform
55
- rm_rf(@s.work_dir)
56
- fetch
57
- build
58
- install
71
+ if @s.platform =~ %r!\Ant!
72
+ windows_install
73
+ else
74
+ fetch
75
+ build
76
+ install
77
+ end
59
78
  else
60
79
  platform_fail
61
80
  end
62
81
  end
63
82
 
64
83
  def config
84
+ if CONFIG["LIBRUBYARG_SHARED"].empty?
85
+ raise "error: ruby must be configured with --enable-shared"
86
+ end
65
87
  @s.server = "ftp.perforce.com"
66
- @s.server_top_dir = "perforce"
88
+ @s.server_top_dir = Pathname.new "perforce"
67
89
 
68
- @s.work_dir = "work"
69
- @s.distfiles_dir = "#{@s.work_dir}/distfiles"
70
- @s.build_dir = "#{@s.work_dir}/build"
90
+ @s.work_dir = Pathname.new "work"
91
+ @s.distfiles_dir = @s.work_dir + "distfiles"
92
+ @s.build_dir = @s.work_dir + "build"
71
93
 
72
- @s.p4api = LazyStruct.new.tap { |t| t.file = "p4api.tgz" }
73
- @s.p4ruby = LazyStruct.new.tap { |t| t.file = "p4ruby.tgz" }
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" }
74
96
  @s.specs = [ @s.p4ruby, @s.p4api ]
75
97
  @s.specs.each { |spec|
76
- spec.local = "#{@s.distfiles_dir}/#{spec.file}"
98
+ spec.attribute(:local) {
99
+ @s.distfiles_dir + spec.file
100
+ }
77
101
  }
78
102
 
79
103
  unless @s.platform
@@ -89,53 +113,66 @@ class Installer
89
113
  end
90
114
 
91
115
  @s.attribute(:version_dir) {
92
- "#{@s.server_top_dir}/r#{@s.version}"
116
+ @s.server_top_dir + "r#{@s.version}"
93
117
  }
94
118
  @s.p4api.attribute(:remote) {
95
- "#{@s.version_dir}/bin.#{@s.platform}/#{@s.p4api.file}"
119
+ @s.version_dir + "bin.#{@s.platform}" + @s.p4api.file
96
120
  }
97
121
  @s.p4ruby.attribute(:remote) {
98
- "#{@s.version_dir}/tools/#{@s.p4ruby.file}"
122
+ @s.version_dir + "tools" + @s.p4ruby.file
99
123
  }
100
124
  @s.attribute(:ftp) {
101
125
  Net::FTP.new(@s.server).tap { |t| t.passive = true ; t.login }
102
126
  }
103
127
  end
104
128
 
105
- def guess_platform
106
- base =
107
- case RUBY_PLATFORM
108
- when %r!cygwin!i
109
- "cygwin"
110
- when %r!(mswin|mingw)!i
111
- "nt"
112
- when %r!darwin!i
113
- "darwin80"
114
- when %r!linux!i
115
- "linux" +
116
- if match = `uname -a`.match(%r!linux\s+\S+\s+(\d+)\.(\d+)!i)
117
- match.captures.join
118
- else
119
- "26"
120
- end
121
- end
129
+ def find_os_version(os)
130
+ if match = `uname -a`.match(%r!#{os}\s+\S+\s+(\d+)\.(\d+)!i)
131
+ match.captures.join
132
+ end
133
+ end
122
134
 
123
- if base.nil?
124
- nil
135
+ def guess_platform(opts = {})
136
+ config_os = CONFIG["target_os"].downcase
137
+ bit64 = (1.size == 8)
138
+ windows_cpu = (bit64 ? "x64" : "x86")
139
+
140
+ if config_os =~ %r!cygwin!i
141
+ "cygwin" + windows_cpu
142
+ elsif config_os =~ %r!(mswin|mingw)!i
143
+ "nt" + windows_cpu
144
+ elsif @s.local
145
+ "<local>"
125
146
  else
126
- bit64 = (1.size == 8 ? "_64" : "")
127
-
128
- base +
129
- case RUBY_PLATFORM
130
- when %r!ia!i
131
- "ia64"
132
- when %r!86!
133
- "x86" + bit64
134
- when %r!darwin!
135
- if `uname -a`.chomp =~ %r!86\Z!
136
- "x86" + bit64
147
+ if (match = config_os.match(%r!\A\D+!)).nil?
148
+ nil
149
+ else
150
+ os = match[0]
151
+ version = find_os_version(os)
152
+ if version.nil?
153
+ nil
137
154
  else
138
- "ppc"
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
139
176
  end
140
177
  end
141
178
  end
@@ -159,7 +196,7 @@ class Installer
159
196
 
160
197
  \tftp://#{@s.server}/#{@s.p4api.remote}
161
198
 
162
- Copy it to #{@s.p4api.local} and run install.rb again.
199
+ Copy it to #{@s.p4api.local} and run install.rb --local.
163
200
  }.gsub(%r!^ +(?=\S)!, "")
164
201
 
165
202
  mkdir_p(@s.distfiles_dir)
@@ -178,11 +215,17 @@ class Installer
178
215
  sys("tar", "zxvf", distfile, "-C", target_dir)
179
216
  end
180
217
 
181
- def fetch
182
- @s.specs.each { |spec|
218
+ def fetch_spec(spec)
219
+ unless @s.local
183
220
  mkdir_p(File.dirname(spec.local))
184
221
  puts "downloading ftp://#{@s.server}/#{spec.remote} ..."
185
222
  @s.ftp.getbinaryfile(spec.remote, spec.local)
223
+ end
224
+ end
225
+
226
+ def fetch
227
+ @s.specs.each { |spec|
228
+ fetch_spec(spec)
186
229
  }
187
230
  end
188
231
 
@@ -228,19 +271,19 @@ class Installer
228
271
  versions.last
229
272
  end
230
273
 
231
- def fix_makefile
232
- replace_file("Makefile") { |contents|
233
- contents.sub(%r!^LIBS = .*?$!) { |match|
234
- match + " -lruby"
235
- }
236
- }
274
+ def make(*args)
275
+ sys("make", *args)
237
276
  end
238
277
 
239
- def build
240
- ruby = File.join(
241
- Config::CONFIG["bindir"],
242
- Config::CONFIG["RUBY_INSTALL_NAME"])
278
+ def ruby(*args)
279
+ exe = File.join(
280
+ CONFIG["bindir"],
281
+ CONFIG["RUBY_INSTALL_NAME"])
282
+ sys(exe, *args)
283
+ end
243
284
 
285
+ def build
286
+ rm_rf(@s.build_dir)
244
287
  mkdir_p(@s.build_dir)
245
288
 
246
289
  @s.specs.each { |spec|
@@ -248,39 +291,28 @@ class Installer
248
291
  }
249
292
 
250
293
  Dir.chdir(@s.build_dir) {
251
- api_dir = Dir["p4api*"].last
252
- p4ruby_dir = Dir["p4ruby*"].last
294
+ api_dir = Pathname.glob("p4api*").last
295
+ p4ruby_dir = Pathname.glob("p4ruby*").last
253
296
  Dir.chdir(p4ruby_dir) {
254
- sys(ruby, "p4conf.rb", "--apidir", "../#{api_dir}")
255
- fix_makefile
297
+ ruby("p4conf.rb", "--apidir", "../#{api_dir}")
256
298
  make
257
299
  }
258
- @s.p4ruby_build_dir = "#{@s.build_dir}/#{p4ruby_dir}"
300
+ @s.p4ruby_build_dir = @s.build_dir + p4ruby_dir
259
301
  }
260
302
  end
261
303
 
262
- def make(*args)
263
- exe =
264
- if RUBY_PLATFORM =~ %r!mswin!i
265
- "nmake"
266
- else
267
- "make"
268
- end
269
- sys(exe, *args)
270
- end
271
-
272
304
  def install
273
305
  if @s.gem
274
- rb_file = "lib/P4.rb"
306
+ rb_file = Pathname.new("lib") + "P4.rb"
275
307
  rm_f(rb_file)
276
308
  mkdir_p(File.dirname(rb_file))
277
- cp("#{@s.p4ruby_build_dir}/#{rb_file}", rb_file)
309
+ cp(@s.p4ruby_build_dir + rb_file, rb_file)
278
310
 
279
- dlext = Config::CONFIG["DLEXT"]
280
- so_file = "ext/P4.#{dlext}"
311
+ dlext = CONFIG["DLEXT"]
312
+ so_file = Pathname.new("ext") + "P4.#{dlext}"
281
313
  rm_f(so_file)
282
314
  mkdir_p(File.dirname(so_file))
283
- cp("#{@s.p4ruby_build_dir}/#{File.basename(so_file)}", so_file)
315
+ cp(@s.p4ruby_build_dir + so_file.basename, so_file)
284
316
  else
285
317
  Dir.chdir(@s.p4ruby_build_dir) {
286
318
  make "install"
@@ -288,9 +320,30 @@ class Installer
288
320
  end
289
321
  end
290
322
 
323
+ def windows_install
324
+ #
325
+ # p4ruby is where the p4api is located on the perforce server
326
+ # -- switcharoo --
327
+ #
328
+ spec = @s.p4api
329
+
330
+ version = [CONFIG["MAJOR"], CONFIG["MINOR"]].join
331
+ spec.file = "p4ruby#{version}.exe"
332
+ fetch_spec(spec)
333
+
334
+ if system(spec.local, "/S", "/v/qn")
335
+ puts "Installed files:"
336
+ puts installed_p4ruby_files
337
+ else
338
+ puts "**** The P4Ruby installer failed!"
339
+ puts "**** Re-run it manually here: "
340
+ puts File.expand_path(spec.local)
341
+ end
342
+ end
343
+
291
344
  def installed_p4ruby_files
292
- [ File.join(Config::CONFIG["sitelibdir"], "P4.rb") ] +
293
- Dir[File.join(Config::CONFIG["sitearchdir"], "P4.*")]
345
+ [ Pathname.new(CONFIG["sitelibdir"]) + "P4.rb" ] +
346
+ Pathname.glob(Pathname.new(CONFIG["sitearchdir"]) + "P4.*")
294
347
  end
295
348
 
296
349
  def uninstall
@@ -363,13 +416,5 @@ class LazyStruct < OpenStruct
363
416
  include Mixin
364
417
  end
365
418
 
366
- def replace_file(file)
367
- old_contents = File.read(file)
368
- yield(old_contents).tap { |new_contents|
369
- File.open(file, "w") { |output|
370
- output.print(new_contents)
371
- }
372
- }
373
- end
374
-
419
+ STDOUT.sync = true
375
420
  Installer.new.run
data/p4ruby.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  Gem::Specification.new { |t|
3
3
  t.name = "p4ruby"
4
- t.version = "1.0.0"
4
+ t.version = "1.0.1"
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.0
4
+ version: 1.0.1
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-09-08 00:00:00 -04:00
12
+ date: 2008-10-02 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