p4ruby 2012.2 → 2014.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (7) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +4 -18
  3. data/README +6 -92
  4. data/install.rb +162 -463
  5. data/p4ruby.gemspec +7 -10
  6. metadata +55 -77
  7. data/Rakefile +0 -109
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dce2dda614bba83402b98a5660980efd982ac116
4
+ data.tar.gz: 96095d48458278f90f6710bed7b49a8c585f08fc
5
+ SHA512:
6
+ metadata.gz: 3943ab2ec560cb2173a433cf3311556fa525294adbba25f799fe915530c42c59fd37f85d10363db1c616335577d75d6012d2888beea76f0d1d46baea119164da
7
+ data.tar.gz: 07653d491f15c49c91cdb7287132c2e47e3e30fd36d0106d707d853ae7fdc2eaa06127bf71f0f0ed44a295d71a2805436dfc9af256aff6c374beea8a5f9487eb
data/CHANGES CHANGED
@@ -1,24 +1,10 @@
1
1
 
2
2
  = p4ruby
3
3
 
4
- == version 1.0.11
4
+ == Version 2014.1
5
+ The gem has been completely rewritten.
5
6
 
6
- * remove previous workaround; now uses list of hosed versions to avoid
7
+ Now it will build from source on Windows' provided that DevKit is present (Tested on Win7)
7
8
 
8
- == version 1.0.10
9
-
10
- * perforce ftp site has hosed 11.1 directory -- workaround hardcoded for 10.2
11
-
12
- == version 1.0.9
13
-
14
- * Non-universal p4api darwin libs were removed from Perforce ftp server
15
- * Pathname changes for 1.9 (even though P4Ruby does not compile for 1.9)
16
-
17
- == version 1.0.8
18
-
19
- * Compensate for Perforce ftp server directory changes
20
-
21
- == version 1.0.7
22
-
23
- * First release.
9
+ It also builds from source on Linux and MacOSX (tested on Ubuntu and Mavericks).
24
10
 
data/README CHANGED
@@ -1,95 +1,9 @@
1
+ Author: Brett Bates and Jennifer Bottom.
1
2
 
2
- = P4Ruby -- Ruby interface to the Perforce API
3
+ Credit to: James Lawrence
3
4
 
4
- This is only an installer for the P4Ruby package by Perforce Software.
5
+ A readme that needs to be rewritten.
6
+ Version 2014.1
7
+ An entire rewrite of the p4ruby gem installer
5
8
 
6
- == Install
7
-
8
- % gem install p4ruby
9
-
10
- Or if you are installing from the regular (non-gem) package,
11
-
12
- % ruby install.rb
13
-
14
- This installer downloads P4Ruby and the Perforce API, compiles P4Ruby,
15
- and installs it. On Windows the Perforce P4Ruby Windows installer is
16
- downloaded and executed instead. Some options are available,
17
-
18
- % ruby install.rb --help
19
-
20
- Usage: ruby install.rb [options]
21
- --version NN.N Version to download, e.g. 08.1. Default finds latest.
22
- --list-versions List available versions.
23
- --platform PLATFORM Perforce-named platform to download. Default guesses.
24
- --list-platforms List available platforms for the given version.
25
- --gem Gem configuration (for the gem installer).
26
- --uninstall Uninstall.
27
- --local Use the files in work/distfiles (manual download).
28
-
29
- == Links
30
-
31
- * P4Ruby documentation 2009.1: http://perforce.com/perforce/doc.091/manuals/p4script/p4script.pdf
32
- * Perforce documentation: http://perforce.com/perforce/technical.html
33
-
34
- * Download (this installer only): http://rubyforge.org/frs/?group_id=6957
35
- * Repository (this installer only): http://github.com/quix/p4ruby
36
- * Simplified wrapper for P4Ruby: http://perforce.rubyforge.org
37
-
38
- == Credits
39
-
40
- === P4Ruby
41
-
42
- Copyright (c) 1997-2007, Perforce Software, Inc. All rights reserved.
43
-
44
- Redistribution and use in source and binary forms, with or without
45
- modification, are permitted provided that the following conditions
46
- are met:
47
-
48
- 1. Redistributions of source code must retain the above copyright
49
- notice, this list of conditions and the following disclaimer.
50
-
51
- 2. Redistributions in binary form must reproduce the above copyright
52
- notice, this list of conditions and the following disclaimer in the
53
- documentation and/or other materials provided with the distribution.
54
-
55
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
56
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
57
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
58
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE
59
- SOFTWARE, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
60
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
61
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
62
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
63
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
64
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
65
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
66
-
67
- === Installer and Gem
68
-
69
- This ruby package (install.rb and associated files) was written by
70
- James M. Lawrence.
71
-
72
- Copyright (c) 2009 James M. Lawrence
73
- Copyright (c) 2008 ImaginEngine, Inc.
74
-
75
- Distributed under the MIT license.
76
-
77
- Permission is hereby granted, free of charge, to any person obtaining
78
- a copy of this software and associated documentation files (the
79
- "Software"), to deal in the Software without restriction, including
80
- without limitation the rights to use, copy, modify, merge, publish,
81
- distribute, sublicense, and/or sell copies of the Software, and to
82
- permit persons to whom the Software is furnished to do so, subject to
83
- the following conditions:
84
-
85
- The above copyright notice and this permission notice shall be
86
- included in all copies or substantial portions of the Software.
87
-
88
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
89
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
90
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
91
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
92
- BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
93
- ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
94
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
95
- SOFTWARE.
9
+ Now entirely based around p4conf.rb
data/install.rb CHANGED
@@ -1,507 +1,206 @@
1
- #
2
- # Author: James M. Lawrence <quixoticsycophant@gmail.com>.
3
- #
4
-
5
1
  require 'net/ftp'
6
2
  require 'rbconfig'
7
- require 'ostruct'
8
- require 'fileutils'
9
- require 'optparse'
10
- require 'pathname'
11
- require 'rubygems'
12
-
13
- class Installer
14
- include FileUtils
15
-
16
- CONFIG = Config::CONFIG
17
- BIT64 = (1.size == 8)
18
-
19
- RB_BASENAME = Pathname.new "P4.rb"
20
- SO_BASENAME = Pathname.new "P4.#{CONFIG['DLEXT']}"
3
+ require 'zlib'
4
+ require 'rubygems/package'
21
5
 
22
- RAW_INSTALL_FILES = [
23
- Pathname.new(CONFIG["sitelibdir"]) + RB_BASENAME,
24
- Pathname.new(CONFIG["sitearchdir"]) + SO_BASENAME,
25
- ]
6
+ BUILD_DIR = "./build"
7
+ DIST_DIR = "./dist"
26
8
 
27
- GEM_INSTALL_FILES = [
28
- Pathname.new("lib") + RB_BASENAME,
29
- Pathname.new("ext") + SO_BASENAME,
30
- ]
9
+ FTP_SERVER = "ftp.perforce.com"
10
+ TOP_DIR = "perforce"
11
+ P4RUBY_FTP_DIR = "bin.tools"
31
12
 
32
- SERVER = "ftp.perforce.com"
33
- SERVER_TOP_DIR = Pathname.new "perforce"
13
+ P4RUBY_ARCHIVE = "p4ruby.tgz"
34
14
 
35
- # Mysterious "ghost" releases which lack files
36
- HOSED_VERSIONS = %w[09.3 11.1]
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"
44
-
45
- def parse_command_line
46
- OptionParser.new("Usage: ruby install.rb [options]", 24, "") {
47
- |parser|
48
- parser.on(
49
- "--version NN.N",
50
- "Version to download, e.g. 08.1. Default finds latest.") {
51
- |version|
52
- @s.version = version
53
- }
54
- parser.on(
55
- "--list-versions",
56
- "List available versions.") {
57
- @s.list_versions = true
58
- }
59
- parser.on(
60
- "--platform PLATFORM",
61
- "Perforce-named platform to download. Default guesses.") {
62
- |platform|
63
- @s.platform = platform
64
- }
65
- parser.on(
66
- "--list-platforms",
67
- "List available platforms for the given version.") {
68
- @s.list_platforms = true
69
- }
70
- parser.on(
71
- "--gem",
72
- "Gem configuration (for the gem installer).") {
73
- @s.gem_config = true
74
- }
75
- parser.on(
76
- "--uninstall",
77
- "Uninstall.") {
78
- @s.uninstall = true
79
- }
80
- parser.on(
81
- "--local",
82
- "Use the files in work/distfiles (manual download).") {
83
- @s.local = true
84
- }
85
- parser.parse(ARGV)
86
- }
87
- end
15
+ class Installer
16
+ def initialize
17
+ unless File.directory?(DIST_DIR)
18
+ Dir.mkdir(DIST_DIR)
19
+ end
88
20
 
89
- def run
90
- @s = LazyStruct.new
91
- parse_command_line
92
- config
93
- if @s.uninstall
94
- uninstall
95
- elsif @s.list_platforms
96
- puts platforms
97
- elsif @s.list_versions
98
- puts versions
99
- elsif @s.platform.nil?
100
- platform_fail
101
- elsif @s.platform =~ %r!\Ant!
102
- windows_install
103
- else
104
- fetch
105
- build
106
- install
107
- verify_install
108
- end
109
- end
21
+ unless File.directory?(BUILD_DIR)
22
+ Dir.mkdir(BUILD_DIR)
23
+ end
110
24
 
111
- def config
112
- if CONFIG["LIBRUBYARG_SHARED"].empty?
113
- raise "error: ruby must be configured with --enable-shared"
25
+ @platform = guess_platform
26
+
27
+ #TODO some way of the user supplying their own ftp path/ local path for the api's
28
+ fetch
29
+ build
114
30
  end
115
31
 
116
- @s.ftp = Net::FTP.new(SERVER).tap { |t|
117
- t.passive = true
118
- t.login
119
- }
120
-
121
- @s.p4api = LazyStruct.new.tap { |t|
122
- t.basename = P4API_REMOTE_BASENAME
123
- }
124
-
125
- @s.p4ruby = LazyStruct.new.tap { |t|
126
- t.basename = P4RUBY_REMOTE_BASENAME
127
- }
128
-
129
- @s.specs = [ @s.p4ruby, @s.p4api ]
130
- @s.specs.each { |spec|
131
- spec.local = DISTFILES_DIR + spec.basename
132
- }
133
-
134
- unless @s.version
135
- @s.version = latest_version
32
+ def fetch
33
+ p4_ftp = P4Ruby_FTP.new(@platform)
34
+ p4_ftp.download
136
35
  end
137
36
 
138
- @s.version_dir = SERVER_TOP_DIR + "r#{@s.version}"
139
-
140
- unless @s.platform
141
- @s.platform = guess_platform
37
+ def build
38
+ wd = Dir.getwd
39
+ api_dir = get_api_build_dir
40
+ Dir.chdir(get_ruby_build_dir)
41
+ puts `yes | ruby p4conf.rb -d #{api_dir}`
42
+ puts `make`
43
+ puts `ruby test.rb`
44
+ puts `make install`
45
+ #TODO Deal with known issue wheree we have to ignore -Werror in Makefile
46
+ Dir.chdir(wd)
142
47
  end
143
48
 
144
- if @s.platform =~ /nt/
145
- @s.p4api.remote = @s.version_dir + "bin.#{@s.platform}"
146
- else
147
- @s.p4api.remote = @s.version_dir + "bin.#{@s.platform}" + @s.p4api.basename
148
- @s.p4ruby.remote = @s.version_dir + "bin.tools" + @s.p4ruby.basename
49
+ def guess_cpu(os)
50
+ cpu = RbConfig::CONFIG['target_cpu']
51
+ case os
52
+ when :darwin, :linux
53
+ if cpu =~ /i686/
54
+ "x86"
55
+ else
56
+ cpu
57
+ end
58
+ else
59
+ case cpu
60
+ when /ia/i
61
+ 'ia64'
62
+ else
63
+ cpu
64
+ end
65
+ end
149
66
  end
150
67
 
151
-
152
- end
153
-
154
- def guess_cpu
155
- if CONFIG["target_os"] =~ /darwin/i
156
- if CONFIG["build"] =~ /i686|x86_64/
157
- "x86_64"
158
- else
159
- "x86"
160
- end
161
- else
162
- case CONFIG["target_cpu"]
163
- when %r!ia!i
164
- "ia64"
165
- when %r!86!
166
- # note: with '_'
167
- "x86" + (BIT64 ? "_64" : "")
168
- when %r!(ppc|sparc)!i
169
- # note: without '_'
170
- $1 + (BIT64 ? "64" : "")
171
- else
172
- ""
173
- end
68
+ def guess_platform()
69
+ case RbConfig::CONFIG["target_os"].downcase
70
+ when /nt|mswin/
71
+ "nt#{guess_cpu(:windows)}"
72
+ when /mingw/
73
+ "mingwx86"
74
+ when /darwin/
75
+ #TODO look at darwin 100, can you complile bin for 90 on 100?
76
+ "darwin90#{guess_cpu(:darwin)}"
77
+ when /solaris/
78
+ "solaris10#{guess_cpu(:solaris)}"
79
+ when /linux/
80
+ "linux26#{guess_cpu(:linux)}"
81
+ when /cygwin/
82
+ #No longer built for
83
+ end
174
84
  end
175
- end
176
85
 
177
- def guess_version(os)
178
- if match = `uname -a`.match(%r!#{os}\s+\S+\s+(\d+)\.(\d+)!i)
179
- version = match.captures.join
180
- cpu = guess_cpu
181
- platforms = self.platforms
182
- built_platforms = (0..version.to_i).map { |n|
183
- [os, n.to_s, cpu].join
184
- }.select { |platform|
185
- platforms.include? platform
186
- }
187
- if os =~ /darwin/
188
- built_platforms.last
189
- else
190
- built_platforms.last
191
- end
192
- else
193
- nil
86
+ def get_ruby_build_dir
87
+ Dir.foreach(BUILD_DIR) do |d|
88
+ if d =~ /p4ruby/
89
+ return File.join(BUILD_DIR,d)
90
+ end
91
+ end
194
92
  end
195
- end
196
-
197
- def guess_platform(opts = {})
198
- config_os = CONFIG["target_os"].downcase
199
- windows_cpu = BIT64 ? "x64" : "x86"
200
93
 
201
- if config_os =~ %r!cygwin!i
202
- "cygwin" + windows_cpu
203
- elsif config_os =~ %r!(mswin|mingw)!i
204
- "nt" + windows_cpu
205
- elsif @s.local
206
- "<local>"
207
- else
208
- if match = config_os.match(%r!\A\D+!)
209
- guess_version(match[0])
210
- else
211
- nil
212
- end
94
+ def get_api_build_dir
95
+ Dir.foreach(BUILD_DIR) do |d|
96
+ if d =~ /p4api/
97
+ return File.join(Dir.getwd, BUILD_DIR,d)
98
+ end
99
+ end
213
100
  end
214
- end
101
+ end
215
102
 
216
- def platform_fail
217
- install_fail {
218
- @s.version = "<version>"
219
- @s.platform = "<platform>"
220
- message = %Q{
221
- Auto-fetch not yet handled for this platform. Run:
222
-
223
- \truby install.rb --list-platforms
224
-
225
- to see the available platforms, then run
226
-
227
- \truby install.rb --platform PLATFORM
228
-
229
- with your platform.
230
-
231
- If all of the above fails, manually fetch
232
-
233
- \tftp://#{SERVER}/#{@s.p4api.remote}
234
-
235
- Copy it to #{@s.p4api.local} and run install.rb --local.
236
- }.gsub(%r!^ +(?=\S)!, "")
237
-
238
- mkdir_p(DISTFILES_DIR)
239
- puts message
240
- }
241
- end
103
+ class P4Ruby_FTP
242
104
 
243
- def install_fail
244
- yield
245
- exit(1)
246
- end
105
+ def initialize(platform)
106
+ @ftp = Net::FTP.new(FTP_SERVER)
107
+ @ftp.login
108
+ @ftp.chdir(TOP_DIR)
247
109
 
248
- def sys(*args)
249
- system(*args).tap { |result|
250
- unless result
251
- raise "system() failed: #{args.join(" ")}"
252
- end
253
- }
254
- end
110
+ @latest = latest_version
111
+ @ftp.chdir("r#{@latest}")
255
112
 
256
- def unpack(distfile, target_dir)
257
- sys("tar", "zxvf", distfile.to_s, "-C", target_dir.to_s)
258
- end
113
+ @platform = "bin.#{platform}"
259
114
 
260
- def fetch_spec(spec)
261
- unless @s.local
262
- mkdir_p(spec.local.dirname)
263
- puts "downloading ftp://#{SERVER}/#{spec.remote} ..."
264
- @s.ftp.getbinaryfile(spec.remote.to_s, spec.local.to_s)
115
+ if @platform =~ /nt|mingw/
116
+ @p4api_archive = "p4api.zip"
117
+ else
118
+ @p4api_archive = "p4api.tgz"
119
+ end
265
120
  end
266
- end
267
-
268
- def fetch
269
- @s.specs.each { |spec|
270
- fetch_spec(spec)
271
- }
272
- end
273
121
 
274
- def remote_files_matching(dir, regex)
275
- @s.ftp.ls(dir.to_s).map { |entry|
276
- if match = entry.match(regex)
277
- yield match
278
- else
279
- nil
280
- end
281
- }.reject { |entry|
282
- entry.nil?
283
- }
284
- end
285
-
286
- def platforms
287
- remote_files_matching(@s.version_dir, %r!bin\.(\w+)!) { |match|
288
- match.captures.first
289
- }.reject { |platform|
290
- platform =~ %r!java!
291
- }.sort
292
- end
122
+ def versions
123
+ remote_files_matching(".", /r(1\d\.\d)/) { |match|
124
+ match.captures.first
125
+ }.sort
126
+ end
293
127
 
294
- def versions
295
- remote_files_matching(SERVER_TOP_DIR, %r!r([0-8]\d\.\d)!) { |match|
296
- match.captures.first
297
- }.reject { |version|
298
- HOSED_VERSIONS.include? version
299
- }.sort
300
- end
128
+ def latest_version
129
+ versions.reverse_each{ |v|
130
+ begin
131
+ remote_files_matching("r#{v}/bin.tools",/p4ruby/) do
132
+ return v
133
+ end
134
+ rescue
135
+ next
136
+ end
137
+ }
138
+ end
139
+
140
+ def remote_files_matching(dir, regex)
141
+ @ftp.ls(dir.to_s).map { |entry|
142
+ if match = entry.match(regex)
143
+ yield match
144
+ else
145
+ nil
146
+ end
147
+ }.reject { |entry|
148
+ entry.nil?
149
+ }
150
+ end
301
151
 
302
- def latest_version
303
- versions.reverse_each{ |v|
304
- begin
305
- remote_files_matching("#{SERVER_TOP_DIR}/r#{v}/bin.tools",/p4ruby/) do
306
- return v
152
+ def download
153
+ begin
154
+ download_p4api
155
+ download_p4ruby
156
+ rescue => e
157
+ puts "Failed to download API or p4ruby, please compile manually"
307
158
  end
308
- rescue
309
- next
310
- end
311
- }
312
- end
313
-
314
- def make(*args)
315
- sys("make", *args)
316
- end
317
-
318
- def ruby(*args)
319
- exe = Pathname.new(CONFIG["bindir"]) + CONFIG["RUBY_INSTALL_NAME"]
320
- sys(exe.to_s, *args)
321
- end
322
-
323
- def build
324
- puts "building..."
325
- rm_rf(BUILD_DIR)
326
- mkdir_p(BUILD_DIR)
327
-
328
- @s.specs.each { |spec|
329
- unpack(spec.local, BUILD_DIR)
330
- }
331
-
332
- Dir.chdir(BUILD_DIR) {
333
- api_dir = Pathname.glob("p4api*").last
334
- p4ruby_dir = Pathname.glob("p4ruby*").last
335
- Dir.chdir(p4ruby_dir) {
336
- ruby("p4conf.rb", "--apidir", "../#{api_dir}")
337
- make
338
- }
339
- @s.p4ruby_build_dir = BUILD_DIR + p4ruby_dir
340
- }
341
- end
342
-
343
- def raw_install_to_gem_install
344
- RAW_INSTALL_FILES.zip(GEM_INSTALL_FILES) { |source, dest|
345
- mkdir_p(dest.dirname)
346
- puts "move #{source} --> #{dest}"
347
- mv(source, dest)
348
- }
349
- end
350
-
351
- def install
352
- puts "installing..."
353
- Dir.chdir(@s.p4ruby_build_dir) {
354
- make("install")
355
- }
356
- if @s.gem_config
357
- raw_install_to_gem_install
358
159
  end
359
- end
360
160
 
361
- def verify_install(on_error = nil)
362
- puts "verifying..."
363
- files =
364
- if @s.gem_config
365
- GEM_INSTALL_FILES
366
- else
367
- RAW_INSTALL_FILES
368
- end.map { |t| t.expand_path }
161
+ def download_p4api
162
+ @ftp.chdir(@platform)
163
+ @ftp.getbinaryfile(@p4api_archive, "#{DIST_DIR}/#{@p4api_archive}", 1024)
164
+ @ftp.chdir("..")
369
165
 
370
- if files.all? { |t| t.exist? }
371
- puts "Installed files:"
372
- puts files
373
- elsif on_error
374
- install_fail(&on_error)
375
- else
376
- install_fail {
377
- puts "These files were supposed to be installed, but were not:"
378
- puts files
379
- puts "Install failed!"
380
- }
166
+ decompress("#{DIST_DIR}/#{@p4api_archive}","#{BUILD_DIR}/")
381
167
  end
382
- end
383
-
384
- def find_ruby_version(spec)
385
- remote_files_matching(spec.remote, /p4ruby\d\d.exe/) {|r_ver|
386
168
 
387
- #Find the latest version of p4ruby for this version of ruby
388
- v_max = CONFIG["MAJOR"]
389
- v_min = CONFIG["MINOR"]
390
- version = [v_max, v_min].join
391
- if r_ver.to_s =~ /p4ruby#{version}.exe/
392
- return "p4ruby#{version}.exe"
393
- end
169
+ def download_p4ruby
170
+ @ftp.chdir(P4RUBY_FTP_DIR)
171
+ @ftp.getbinaryfile(P4RUBY_ARCHIVE, "#{DIST_DIR}/#{P4RUBY_ARCHIVE}", 1024)
172
+ @ftp.chdir("..")
394
173
 
395
- }
396
- nil
397
- end
398
-
399
- def windows_install
400
- #
401
- # For Windows, p4ruby is located in the p4api directory on the
402
- # perforce server -- switcharoo --
403
- #
404
- spec = @s.p4api
405
-
406
- p4ruby_exe = find_ruby_version(spec)
407
- if p4ruby_exe && !(spec.remote.to_s =~ /p4ruby/)
408
- spec.remote += p4ruby_exe.to_s
409
- else
410
- abort("Failed to find a suitable p4ruby executable for ruby #{CONFIG["MAJOR"]}.#{CONFIG["MINOR"]}")
174
+ decompress("#{DIST_DIR}/#{P4RUBY_ARCHIVE}","#{BUILD_DIR}/")
411
175
  end
412
- fetch_spec(spec)
413
176
 
414
- error = lambda {
415
- puts "The Perforce P4Ruby Windows installer failed!"
416
- puts "You may re-run it manually here:"
417
- puts spec.local.expand_path
418
- }
419
-
420
- puts "running Perforce P4Ruby Windows installer..."
421
- if system(spec.local.to_s, "/S", "/v/qn")
422
- if @s.gem_config
423
- sleep(1)
424
- raw_install_to_gem_install
425
- sleep(1)
426
- unless system(spec.local, "/V", "/x", "/S", "/v/qn")
427
- # We don't much care if this fails; just write to the log
428
- puts "Note: the Perforce P4Ruby Windows uninstaller failed."
177
+ def decompress(tgz, destination)
178
+ if tgz =~ /\.zip/
179
+ `unzip #{tgz} -d #{destination}`
180
+ return
181
+ end
182
+ Gem::Package::TarReader.new(Zlib::GzipReader.open tgz) do |tar|
183
+ tar.each do |entry|
184
+ if entry.directory?
185
+ puts "Making dir #{File.join(destination, entry.full_name)}"
186
+ unless File.exists?(File.join(destination, entry.full_name))
187
+ Dir.mkdir(File.join(destination, entry.full_name))
188
+ end
189
+ elsif entry.file?
190
+ puts "Making file #{File.join(destination, entry.full_name)}"
191
+ unless File.exists?(File.join(destination, entry.full_name))
192
+ File.open(File.join(destination, entry.full_name), "w") do |f|
193
+ f.write(entry.read)
194
+ end
195
+ end
196
+ elsif entry.header.typeflag == '2'
197
+ #TODO remove if not necessary
198
+ binding.pry
199
+ end
200
+ end
429
201
  end
430
- end
431
- verify_install(error)
432
- else
433
- install_fail(&error)
434
- end
435
- end
436
-
437
- def uninstall
438
- RAW_INSTALL_FILES.each { |file|
439
- if file.exist?
440
- puts "delete #{file}"
441
- rm_f(file)
442
- end
443
- }
444
- end
445
- end
446
-
447
- #
448
- # An OpenStruct with optional lazy-evaluated fields.
449
- #
450
- class LazyStruct < OpenStruct
451
- #
452
- # For mixing into an existing OpenStruct instance singleton class.
453
- #
454
- module Mixin
455
- #
456
- # &block is evaluated when this attribute is requested. The
457
- # same result is returned for subsquent calls, until the field
458
- # is assigned a different value.
459
- #
460
- def attribute(reader, &block)
461
- singleton = (class << self ; self ; end)
462
- singleton.instance_eval {
463
- #
464
- # Define a special reader method in the singleton class.
465
- #
466
- define_method(reader) {
467
- block.call.tap { |value|
468
- #
469
- # The value has been computed. Replace this method with a
470
- # one-liner giving the value.
471
- #
472
- singleton.instance_eval {
473
- remove_method(reader)
474
- define_method(reader) { value }
475
- }
476
- }
477
- }
478
-
479
- #
480
- # Revert to the old OpenStruct behavior when the writer is called.
481
- #
482
- writer = "#{reader}=".to_sym
483
- define_method(writer) { |value|
484
- singleton.instance_eval {
485
- remove_method(reader)
486
- remove_method(writer)
487
- }
488
- method_missing(writer, value)
489
- }
490
- }
491
202
  end
492
- end
493
-
494
- include Mixin
495
203
  end
496
204
 
497
- # version < 1.8.7 compatibility
498
- module Kernel
499
- unless respond_to? :tap
500
- def tap
501
- yield self
502
- self
503
- end
504
- end
505
- end
205
+ i = Installer.new
506
206
 
507
- Installer.new.run
data/p4ruby.gemspec CHANGED
@@ -1,22 +1,19 @@
1
1
 
2
2
  Gem::Specification.new { |t|
3
3
  t.name = "p4ruby"
4
- t.version = "2012.2"
4
+ t.version = "2014.1"
5
5
  t.summary = "Ruby interface to the Perforce API"
6
6
  t.description = t.summary + "."
7
- t.author = "Perforce Software (ruby gem by James M. Lawrence)"
8
- t.email = "p4ruby@perforce.com"
9
- t.homepage = "http://p4ruby.rubyforge.org"
10
- t.rubyforge_project = "p4ruby"
11
- t.extensions << "Rakefile"
12
- t.add_dependency "rake"
13
- t.add_dependency "rdoc"
14
- t.require_paths << "ext"
7
+ t.author = "Perforce Software (ruby gem by Brett Bates and Jennifer Bottom)"
8
+ t.email = "jbottom@perforce.com"
9
+ t.homepage = "https://rubygems.org/gems/p4ruby"
10
+
11
+ t.add_runtime_dependency 'rake', '~> 0'
12
+ t.add_runtime_dependency 'test-unit', '>=0'
15
13
 
16
14
  t.files = %w[
17
15
  README
18
16
  CHANGES
19
- Rakefile
20
17
  install.rb
21
18
  p4ruby.gemspec
22
19
  ]
metadata CHANGED
@@ -1,107 +1,85 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: p4ruby
3
- version: !ruby/object:Gem::Version
4
- hash: 8063
5
- prerelease:
6
- segments:
7
- - 2012
8
- - 2
9
- version: "2012.2"
3
+ version: !ruby/object:Gem::Version
4
+ version: '2014.1'
10
5
  platform: ruby
11
- authors:
12
- - Perforce Software (ruby gem by James M. Lawrence)
6
+ authors:
7
+ - Perforce Software (ruby gem by Brett Bates and Jennifer Bottom)
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2012-10-11 00:00:00 Z
18
- dependencies:
19
- - !ruby/object:Gem::Dependency
11
+ date: 2014-06-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
20
14
  name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
21
  prerelease: false
22
- requirement: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: test-unit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
25
31
  - - ">="
26
- - !ruby/object:Gem::Version
27
- hash: 3
28
- segments:
29
- - 0
30
- version: "0"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
31
34
  type: :runtime
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
34
- name: rdoc
35
35
  prerelease: false
36
- requirement: &id002 !ruby/object:Gem::Requirement
37
- none: false
38
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
39
38
  - - ">="
40
- - !ruby/object:Gem::Version
41
- hash: 3
42
- segments:
43
- - 0
44
- version: "0"
45
- type: :runtime
46
- version_requirements: *id002
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
47
41
  description: Ruby interface to the Perforce API.
48
- email: p4ruby@perforce.com
42
+ email: jbottom@perforce.com
49
43
  executables: []
50
-
51
- extensions:
52
- - Rakefile
53
- extra_rdoc_files:
54
- - README
55
- files:
44
+ extensions: []
45
+ extra_rdoc_files:
56
46
  - README
47
+ files:
57
48
  - CHANGES
58
- - Rakefile
49
+ - README
59
50
  - install.rb
60
51
  - p4ruby.gemspec
61
- homepage: http://p4ruby.rubyforge.org
52
+ homepage: https://rubygems.org/gems/p4ruby
62
53
  licenses: []
63
-
54
+ metadata: {}
64
55
  post_install_message:
65
- rdoc_options:
66
- - --title
67
- - "P4Ruby: Ruby interface to the Perforce API"
68
- - --main
56
+ rdoc_options:
57
+ - "--title"
58
+ - 'P4Ruby: Ruby interface to the Perforce API'
59
+ - "--main"
69
60
  - README
70
- - --exclude
61
+ - "--exclude"
71
62
  - CHANGES
72
- - --exclude
73
- - Rakefile
74
- - --exclude
63
+ - "--exclude"
75
64
  - install.rb
76
- - --exclude
65
+ - "--exclude"
77
66
  - p4ruby.gemspec
78
- require_paths:
67
+ require_paths:
79
68
  - lib
80
- - ext
81
- required_ruby_version: !ruby/object:Gem::Requirement
82
- none: false
83
- requirements:
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
84
71
  - - ">="
85
- - !ruby/object:Gem::Version
86
- hash: 3
87
- segments:
88
- - 0
89
- version: "0"
90
- required_rubygems_version: !ruby/object:Gem::Requirement
91
- none: false
92
- requirements:
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
93
76
  - - ">="
94
- - !ruby/object:Gem::Version
95
- hash: 3
96
- segments:
97
- - 0
98
- version: "0"
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
99
79
  requirements: []
100
-
101
- rubyforge_project: p4ruby
102
- rubygems_version: 1.8.24
80
+ rubyforge_project:
81
+ rubygems_version: 2.2.2
103
82
  signing_key:
104
- specification_version: 3
83
+ specification_version: 4
105
84
  summary: Ruby interface to the Perforce API
106
85
  test_files: []
107
-
data/Rakefile DELETED
@@ -1,109 +0,0 @@
1
-
2
- begin
3
- require 'rubygems'
4
- gem 'rdoc'
5
- rescue LoadError
6
- end
7
-
8
- require 'rubygems/package_task'
9
- require 'rdoc/task'
10
- require 'rake/contrib/rubyforgepublisher'
11
- require 'fileutils'
12
-
13
- include FileUtils
14
-
15
- README = "README"
16
- GEMSPEC = eval(File.read("p4ruby.gemspec"))
17
- RAKEFILE = "Rakefile"
18
- RAKEFILE_ORIG = "Rakefile.orig"
19
-
20
- default_task_definition = %{
21
- INSTALLER = './install.rb'
22
-
23
- #
24
- # default task compiles for the gem
25
- #
26
- task :default do
27
- ARGV.clear
28
- ARGV.push "--gem"
29
- load INSTALLER
30
- end
31
- }
32
-
33
- eval(default_task_definition)
34
-
35
- task :clean => :clobber do
36
- rm_rf ["work", "lib", "ext"]
37
- end
38
-
39
- task :update_docs do
40
- ruby_path = File.join(
41
- Config::CONFIG["bindir"],
42
- Config::CONFIG["RUBY_INSTALL_NAME"])
43
-
44
- help = "--help"
45
- command = "ruby #{File.basename(INSTALLER)} #{help}"
46
- output = `#{ruby_path} #{INSTALLER} #{help}`
47
-
48
- # insert help output into README
49
- replace_file(README) { |contents|
50
- contents.sub(%r!#{command}.*?==!m) {
51
- command + "\n\n " +
52
- output + "\n=="
53
- }
54
- }
55
- end
56
-
57
- task :doc => :update_docs
58
- task :doc => :rdoc
59
-
60
- task :package => [:clean, :doc]
61
- task :gem => :clean
62
-
63
- RDoc::Task.new { |t|
64
- t.main = README
65
- t.rdoc_files.include([README])
66
- t.rdoc_dir = "html"
67
- t.title = "P4Ruby: #{GEMSPEC.summary}"
68
- }
69
-
70
- Gem::PackageTask.new(GEMSPEC) { |t|
71
- t.need_tar = true
72
- }
73
-
74
- task :publish => :doc do
75
- Rake::RubyForgePublisher.new('p4ruby', 'quix').upload
76
- end
77
-
78
- task :release do
79
- mv(RAKEFILE, RAKEFILE_ORIG)
80
- begin
81
- File.open(RAKEFILE, "w") { |out|
82
- out.puts default_task_definition.gsub(%r!^ !m, "")
83
- }
84
- Rake::Task[:package].invoke
85
- ensure
86
- mv(RAKEFILE_ORIG, RAKEFILE)
87
- end
88
- end
89
-
90
- ##################################################
91
- # util
92
-
93
- unless respond_to? :tap
94
- module Kernel
95
- def tap
96
- yield self
97
- self
98
- end
99
- end
100
- end
101
-
102
- def replace_file(file)
103
- old_contents = File.read(file)
104
- yield(old_contents).tap { |new_contents|
105
- File.open(file, "w") { |output|
106
- output.print(new_contents)
107
- }
108
- }
109
- end