p4util 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b7427b07b614b4b912c90eacd5d9d304c773b239
4
+ data.tar.gz: 29a165e47defc8e7c1bdc71d248f95c8532caeb8
5
+ SHA512:
6
+ metadata.gz: b1b00491f1b0dd76e43fda03fefed8aff019c0227a30e7caf5a7428529e116123da920a0b9e1eae244b713b1e95529b1b4a0dda124712a4f364b2dcb073b3d65
7
+ data.tar.gz: 0d5458e1b84fe0b6bec09381287d55333dfd7b439188ec0efb62430b1be4405d7f49ad183be4f691d597fb703016dc90c5687f7e4c517ae9954ebdaeae9bc090
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in p4_util.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Perforce Software, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # P4util
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'p4util'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install p4util
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/p4util/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/bin/p4util ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # A simplified wrapper to launch our application code mostly defined under the
4
+ #
5
+ lib_path = File.expand_path('../../lib', __FILE__)
6
+ $LOAD_PATH.unshift(lib_path)
7
+ require 'p4_util'
8
+
9
+ P4Util::run ARGV
@@ -0,0 +1,89 @@
1
+ require 'conventions'
2
+ require 'optparse'
3
+ require 'osutil'
4
+ require 'net/ftp'
5
+
6
+ module Commands
7
+
8
+ def Commands.download(options=nil)
9
+ version = 'r14.2'
10
+ binary = 'p4d'
11
+
12
+ if options and !options.params.empty?
13
+
14
+ op = OptionParser.new do |op|
15
+ op.on('-v VERSION', '--version VERSION', 'ftp.perforce.com version') do |v|
16
+ version = v
17
+ end
18
+ end
19
+
20
+ op.parse!(options.params)
21
+
22
+ if !options.params.empty?
23
+ binary = options.params.first
24
+ end
25
+ end
26
+
27
+ case binary
28
+ when 'p4d'
29
+ download_p4d_via_ftp(version)
30
+ when 'p4api'
31
+ download_p4api_via_ftp(version)
32
+ else
33
+ raise "Don't know how to download #{binary}, check 'p4util help download'"
34
+ end
35
+ end
36
+
37
+ def Commands.print_download_help
38
+ puts <<-END.gsub(/^ {6}/, '')
39
+ p4util download [p4d|p4api]
40
+
41
+ Downloads one of the following utilities (in lieu of an installer) into
42
+ a local work/ directory.
43
+
44
+ * p4d
45
+ * p4api
46
+
47
+ Will default to the latest release unless you don't know what that is.
48
+
49
+ Options:
50
+
51
+ --version X where X looks like the version in the ftp.perforce.com site,
52
+ e.g., 'r14.2' instead of '2014.2'
53
+ END
54
+ end
55
+
56
+ private
57
+
58
+ def Commands.download_p4d_via_ftp(version)
59
+ download_via_ftp(version, OsUtil.p4d_executable, OsUtil.p4d_path)
60
+
61
+ if !File.executable?(OsUtil.p4d_path)
62
+ File.chmod(0755, OsUtil.p4d_path)
63
+ end
64
+ end
65
+
66
+ def Commands.download_p4api_via_ftp(version)
67
+ download_via_ftp(version, OsUtil.p4api_file, OsUtil.p4api_path)
68
+
69
+ # um, probably should expand this guy out
70
+ end
71
+
72
+ private
73
+
74
+ def Commands.download_via_ftp(version, filename, output_path)
75
+ ftp = Net::FTP.new('ftp.perforce.com')
76
+ ftp.login
77
+
78
+ dir = OsUtil.ftp_download_dir(version)
79
+ ftp.chdir(dir)
80
+
81
+ ftp.passive=true
82
+
83
+ Conventions.init_working_dir
84
+
85
+ ftp.getbinaryfile(filename, output_path)
86
+ ensure
87
+ ftp.close if ftp and !ftp.closed?
88
+ end
89
+ end
@@ -0,0 +1,30 @@
1
+
2
+ module Commands
3
+
4
+ def Commands.help(options)
5
+ if !options.params.empty? && Commands.respond_to?(options.params.first.to_sym)
6
+ method_name = "print_#{options.params.first}_help".to_sym
7
+ Commands.method(method_name).call()
8
+ else
9
+ print_general_help
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def Commands.print_general_help
16
+ puts <<-END.gsub(/^ {6}/, '')
17
+ p4util [command] [params]
18
+
19
+ Executes various commands useful when writing Perforce applications.
20
+
21
+ Use `p4util help [command]` for more information on each command.
22
+
23
+ List of available commands:
24
+ download - Download Perforce binaries for your platform
25
+ init - Seed the local p4d instance using local configuration files
26
+ kill - Shutdown p4d processes using SIGTERM
27
+ start - Spawn the p4d process in your working directory
28
+ END
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ require 'sys/proctable'
2
+
3
+ include Sys
4
+
5
+ module Commands
6
+
7
+ def Commands.kill(options=nil)
8
+ ProcTable.ps().find_all{|p| p.comm =~ /p4d/}
9
+ .each{|p| Process.kill('TERM', p.pid)}
10
+ end
11
+
12
+ def Commands.print_kill_help
13
+ puts <<-END.gsub(/^ {6}/,'')
14
+ p4util kill
15
+
16
+ Finds local p4d processes and kills them.
17
+
18
+ There should be a timeout that will force kill anything that appears stuck.
19
+
20
+ On unix machines, will probably use `ps -x` and 'p4d', then will send
21
+ SIGTERM signals to each process.
22
+ END
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+
2
+ module Commands
3
+
4
+ def Commands.start(options)
5
+ if !File.exists?(OsUtil.p4d_path)
6
+ Commands.download
7
+ end
8
+ Conventions.init_p4droot_dir
9
+ spawn_p4d
10
+ end
11
+
12
+ def Commands.spawn_p4d
13
+ pid = Process.spawn("#{OsUtil.p4d_path} -r #{Conventions.p4droot_dir} "+
14
+ "-v server=1 -L #{Conventions.p4d_log_path}")
15
+ Process.detach(pid)
16
+ end
17
+
18
+ def Commands.print_start_help
19
+ puts <<-END.gsub(/^ {6}/,'')
20
+ p4util start
21
+
22
+ Spawns a Perforce process in your local work/p4droot directory.
23
+
24
+ If the Perforce executable does not exist, will download the binary first.
25
+
26
+ Will try to set up a server log at work/server.log. It'll be fairly
27
+ verbose by default; this is *not* intended for any kind of performance
28
+ testing.
29
+ END
30
+ end
31
+ end
data/lib/commands.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'commands/download'
2
+ require 'commands/help'
3
+ require 'commands/kill'
4
+ require 'commands/start'
@@ -0,0 +1,29 @@
1
+
2
+ require 'fileutils'
3
+
4
+ module Conventions
5
+
6
+ def Conventions.working_dir
7
+ File.expand_path('work')
8
+ end
9
+
10
+ def Conventions.init_working_dir
11
+ if !File.directory?(working_dir)
12
+ FileUtils::makedirs(working_dir)
13
+ end
14
+ end
15
+
16
+ def Conventions.p4droot_dir
17
+ File.expand_path(File.join(working_dir,'p4droot'))
18
+ end
19
+
20
+ def Conventions.init_p4droot_dir
21
+ if !File.directory?(p4droot_dir)
22
+ FileUtils::makedirs(p4droot_dir)
23
+ end
24
+ end
25
+
26
+ def Conventions.p4d_log_path
27
+ File.expand_path(File.join(working_dir, 'server.log'))
28
+ end
29
+ end
data/lib/osutil.rb ADDED
@@ -0,0 +1,52 @@
1
+
2
+ require 'rbconfig'
3
+
4
+ module OsUtil
5
+
6
+ def OsUtil.p4d_executable
7
+ if windows?
8
+ 'p4d.exe'
9
+ else
10
+ 'p4d'
11
+ end
12
+ end
13
+
14
+ def OsUtil.p4d_path
15
+ File.expand_path(File.join(Conventions.working_dir, OsUtil.p4d_executable))
16
+ end
17
+
18
+ def OsUtil.osx?
19
+ RbConfig::CONFIG['host_os'] =~ /darwin/
20
+ end
21
+
22
+ def OsUtil.windows?
23
+ RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
24
+ end
25
+
26
+ def OsUtil.platform_dir_prefix
27
+ if osx?
28
+ 'darwin90'
29
+ elsif windows?
30
+ 'nt'
31
+ else
32
+ raise "OsUtil doesn't know platform: #{RbConfig::CONFIG['host_os']}"
33
+ end
34
+ end
35
+
36
+ def OsUtil.ftp_download_dir(version)
37
+ "perforce/#{version}/bin.#{platform_dir_prefix}#{RbConfig::CONFIG['build_cpu']}"
38
+ end
39
+
40
+ def OsUtil.p4api_file
41
+ if windows?
42
+ raise 'hey you need a visual studio version defined somehow'
43
+ 'p4api.zip'
44
+ else
45
+ 'p4api.tgz'
46
+ end
47
+ end
48
+
49
+ def OsUtil.p4api_path
50
+ File.expand_path(File.join(Conventions.working_dir, OsUtil.p4api_file))
51
+ end
52
+ end
@@ -0,0 +1,3 @@
1
+ module P4Util
2
+ VERSION = "0.0.1"
3
+ end
data/lib/p4_util.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'p4_util/version'
2
+ require 'commands'
3
+ require 'optparse'
4
+ require 'ostruct'
5
+
6
+ module P4Util
7
+
8
+ def P4Util.run(args)
9
+ options = parse_options(args)
10
+ Commands.method(options.command).call(options)
11
+ end
12
+
13
+ # Returns the options as an OpenStruct object
14
+ def P4Util.parse_options(args)
15
+ options = OpenStruct.new
16
+
17
+ options.command = :help
18
+ options.params = []
19
+
20
+ if args && !args.empty?
21
+ options.command = args.first.to_sym
22
+ if args.length > 1
23
+ options.params.concat(args.drop(1))
24
+ end
25
+ end
26
+
27
+ options
28
+ end
29
+ end
data/p4util.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'p4_util/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'p4util'
8
+ spec.version = P4Util::VERSION
9
+ spec.authors = ['Tristan Juricek']
10
+ spec.email = ['tjuricek@perforce.com']
11
+ spec.summary = %q{The p4util command line app eases setup of Perforce instances, mostly for testing.}
12
+ spec.description = %q{The p4util command itself provides other commands, see 'p4util help' after install. This allows you to things like download a p4d, start it, kill it, etc mostly for quick setup of testing systems.}
13
+ spec.homepage = 'http://perforce.com'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `find . -type f -not -path '*/\.*' -not -name '*.lock'`.split
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.7'
22
+ spec.add_development_dependency 'rake', '~> 10.0'
23
+
24
+ spec.add_runtime_dependency 'sys-proctable', '~> 0.9'
25
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: p4util
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tristan Juricek
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sys-proctable
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ description: The p4util command itself provides other commands, see 'p4util help'
56
+ after install. This allows you to things like download a p4d, start it, kill it,
57
+ etc mostly for quick setup of testing systems.
58
+ email:
59
+ - tjuricek@perforce.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - "./Gemfile"
65
+ - "./LICENSE.txt"
66
+ - "./README.md"
67
+ - "./Rakefile"
68
+ - "./bin/p4util"
69
+ - "./lib/commands.rb"
70
+ - "./lib/commands/download.rb"
71
+ - "./lib/commands/help.rb"
72
+ - "./lib/commands/kill.rb"
73
+ - "./lib/commands/start.rb"
74
+ - "./lib/conventions.rb"
75
+ - "./lib/osutil.rb"
76
+ - "./lib/p4_util.rb"
77
+ - "./lib/p4_util/version.rb"
78
+ - "./p4util.gemspec"
79
+ homepage: http://perforce.com
80
+ licenses:
81
+ - MIT
82
+ metadata: {}
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 2.2.2
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: The p4util command line app eases setup of Perforce instances, mostly for
103
+ testing.
104
+ test_files: []