git-p4-sync 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README.rdoc +26 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/bin/git-p4-sync +13 -0
- data/lib/git_p4_sync.rb +103 -0
- data/lib/init.rb +3 -0
- data/lib/start.rb +43 -0
- data/test/git_p4_sync_test.rb +16 -0
- data/test/test_helper.rb +2 -0
- metadata +75 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Carl Mercier
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
= git-p4-sync
|
2
|
+
|
3
|
+
Submit changes made to a Git repository into to Perforce
|
4
|
+
|
5
|
+
== Use case
|
6
|
+
|
7
|
+
Joe starts an amazing startup with a few l337 h4x0rs buddies. Obviously, they use Git as their SCM because of their awesomeness. Amazing Startup is eventually acquired by Big Co Inc, which uses Perforce as their SCM. The l337 h4x0rs are obviously not willing to give up Git, and convincing 3000 employees and C-Level executives to drop Perforce for Git sounds like mission impossible. Enters git-p4-sync. It allows l337 h4x0rs to sync a Git repository into Perforce with a simple command. It is easier to use than git-p4, and does just one thing: sync changes made on the Git repository into Perforce.
|
8
|
+
|
9
|
+
A good way to use this script is to run it as a cronjob.
|
10
|
+
|
11
|
+
The --test switch is useful to test git-p4-sync without actually doing anything to your files.
|
12
|
+
|
13
|
+
= Example
|
14
|
+
$ git-p4-sync -h # get help
|
15
|
+
$ git-p4-sync -g ~/git/my-project/ -p ~/p4/my-project/ --pull --submit # do it
|
16
|
+
$ git-p4-sync -g ~/git/my-project/ -p ~/p4/my-project/ --pull --submit --test # fake it
|
17
|
+
|
18
|
+
== Dependencies (for tests only)
|
19
|
+
|
20
|
+
- Git command line executables
|
21
|
+
- Perforce command line executable
|
22
|
+
- diff_dirs gem
|
23
|
+
|
24
|
+
== COPYRIGHT
|
25
|
+
|
26
|
+
Copyright (c) 2009 {Carl Mercier}[http://carlmercier.com]. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
Rake::TestTask.new(:test) do |t|
|
5
|
+
t.libs << 'lib' << 'test'
|
6
|
+
t.pattern = 'test/**/*_test.rb'
|
7
|
+
t.verbose = false
|
8
|
+
end
|
9
|
+
|
10
|
+
task :default => :test
|
11
|
+
|
12
|
+
begin
|
13
|
+
require 'jeweler'
|
14
|
+
Jeweler::Tasks.new do |gemspec|
|
15
|
+
gemspec.name = "git-p4-sync"
|
16
|
+
gemspec.summary = "Submit changes made to a Git repository into to Perforce"
|
17
|
+
gemspec.email = "carl@carlmercier.com"
|
18
|
+
gemspec.homepage = "http://github.com/cmer/git-p4-sync"
|
19
|
+
gemspec.description = "Submit changes made to a Git repository into to Perforce"
|
20
|
+
gemspec.authors = ["Carl Mercier"]
|
21
|
+
gemspec.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*"]
|
22
|
+
gemspec.rubyforge_project = 'git-p4-sync'
|
23
|
+
gemspec.add_dependency('diff_dirs', '>= 0.1.2')
|
24
|
+
end
|
25
|
+
rescue LoadError
|
26
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
27
|
+
end
|
28
|
+
|
29
|
+
begin
|
30
|
+
require 'rake/contrib/sshpublisher'
|
31
|
+
namespace :rubyforge do
|
32
|
+
|
33
|
+
desc "Release gem and RDoc documentation to RubyForge"
|
34
|
+
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
35
|
+
|
36
|
+
namespace :release do
|
37
|
+
desc "Publish RDoc to RubyForge."
|
38
|
+
task :docs => [:rdoc] do
|
39
|
+
config = YAML.load(
|
40
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
41
|
+
)
|
42
|
+
|
43
|
+
host = "#{config['username']}@rubyforge.org"
|
44
|
+
remote_dir = "/var/www/cmercier/git-p4-sync/"
|
45
|
+
local_dir = 'rdoc'
|
46
|
+
|
47
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
rescue LoadError
|
52
|
+
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/bin/git-p4-sync
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
##
|
3
|
+
## git-p4-sync, by Carl Mercier (http://carlmercier.com)
|
4
|
+
## Started in May 2009
|
5
|
+
##
|
6
|
+
## This script sync changes made to a Git repository back to Perforce.
|
7
|
+
## It currently only supports one-way sync'ing: GIT -> P4
|
8
|
+
##
|
9
|
+
|
10
|
+
path = File.dirname(__FILE__)
|
11
|
+
require path + '/../lib/init'
|
12
|
+
require path + '/../lib/git_p4_sync'
|
13
|
+
require path + '/../lib/start'
|
data/lib/git_p4_sync.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
module GitP4Sync
|
2
|
+
|
3
|
+
def run(options)
|
4
|
+
# branch = options[:branch] || "master"
|
5
|
+
branch = "master"
|
6
|
+
git_path = options[:git]
|
7
|
+
p4_path = options[:p4]
|
8
|
+
simulate = options[:simulate] || false
|
9
|
+
pull = options[:pull] || false
|
10
|
+
submit = options[:submit] || false
|
11
|
+
ignore_list = ( options[:ignore] ? options[:ignore].split(",") : [".git"] )
|
12
|
+
|
13
|
+
git_path = add_slash(File.expand_path(git_path))
|
14
|
+
p4_path = add_slash(File.expand_path(p4_path))
|
15
|
+
|
16
|
+
verify_path_exist!(git_path)
|
17
|
+
verify_path_exist!(p4_path)
|
18
|
+
|
19
|
+
if pull
|
20
|
+
Dir.chdir(git_path) do
|
21
|
+
puts "Pulling Git from remote server."
|
22
|
+
run_cmd "git pull", simulate
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
diff = diff_dirs(p4_path, git_path)
|
27
|
+
|
28
|
+
if diff.size > 0
|
29
|
+
diff.each do |d|
|
30
|
+
action = d[0]
|
31
|
+
file = strip_leading_slash(d[1])
|
32
|
+
|
33
|
+
# todo: skip ignored files/directories
|
34
|
+
|
35
|
+
puts "#{action.to_s.upcase} in Git: #{file}"
|
36
|
+
|
37
|
+
Dir.chdir(p4_path) do
|
38
|
+
case action
|
39
|
+
when :new
|
40
|
+
run_cmd "cp -r #{git_path}#{file} #{p4_path}#{file}", simulate
|
41
|
+
run_cmd "#{p4_add_recursively("#{p4_path}#{file}")}", simulate
|
42
|
+
when :deleted
|
43
|
+
run_cmd "p4 delete #{p4_path}#{file}", simulate
|
44
|
+
when :modified
|
45
|
+
run_cmd "p4 edit #{p4_path}#{file}", simulate
|
46
|
+
run_cmd "cp #{git_path}#{file} #{p4_path}#{file}", simulate
|
47
|
+
else
|
48
|
+
puts "Unknown change type #{action}. Stopping."
|
49
|
+
exit 1
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
if submit
|
55
|
+
git_head_commit = ""
|
56
|
+
Dir.chdir(git_path) do
|
57
|
+
git_head_commit = `git show --pretty=oneline`.split("\n")[0]
|
58
|
+
end
|
59
|
+
|
60
|
+
Dir.chdir(p4_path) do
|
61
|
+
puts "Submitting changes to Perforce"
|
62
|
+
run_cmd "p4 submit -d '#{git_head_commit.gsub("'", "''")}'", simulate
|
63
|
+
end
|
64
|
+
end
|
65
|
+
else
|
66
|
+
puts "Directories are identical. Nothing to do."
|
67
|
+
exit 0
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def run_cmd(cmd, simulate = false, puts_prefix = " ")
|
72
|
+
if simulate
|
73
|
+
puts "#{puts_prefix}simulation: #{cmd}"
|
74
|
+
else
|
75
|
+
puts "#{puts_prefix}#{cmd}"
|
76
|
+
end
|
77
|
+
|
78
|
+
output = ""
|
79
|
+
output = `#{cmd}` unless simulate
|
80
|
+
[output, $?]
|
81
|
+
end
|
82
|
+
|
83
|
+
def add_slash(path)
|
84
|
+
path += "/" unless path[-1..-1] == "/"
|
85
|
+
path
|
86
|
+
end
|
87
|
+
|
88
|
+
def strip_leading_slash(path)
|
89
|
+
path.sub(/^\//, "")
|
90
|
+
end
|
91
|
+
|
92
|
+
def p4_add_recursively(path)
|
93
|
+
"find #{path} -type f -print | p4 -x - add -f"
|
94
|
+
end
|
95
|
+
|
96
|
+
def verify_path_exist!(path)
|
97
|
+
if !File.exist?(path) || !File.directory?(path)
|
98
|
+
puts "#{path} must exist and be a directory."
|
99
|
+
exit 1
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
data/lib/init.rb
ADDED
data/lib/start.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
include GitP4Sync
|
2
|
+
|
3
|
+
options = {}
|
4
|
+
|
5
|
+
OptionParser.new do |opts|
|
6
|
+
opts.banner = "Usage: git-p4-sync [options]"
|
7
|
+
|
8
|
+
# opts.on("-b", "--branch [STRING]", String, "Git branch") do |o|
|
9
|
+
# options[:branch] = o || "master"
|
10
|
+
# end
|
11
|
+
|
12
|
+
opts.on("-g", "--git [STRING]", String, "Path to Git repository") do |o|
|
13
|
+
options[:git] = o
|
14
|
+
end
|
15
|
+
|
16
|
+
opts.on("-p", "--p4 [STRING]", String, "Path to Perforce workspace directory") do |o|
|
17
|
+
options[:p4] = o
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.on("-P", "--pull", "Pull Git repository before processing") do |o|
|
21
|
+
options[:pull] = o
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on("-S", "--submit", "Submit to Perforce after processing") do |o|
|
25
|
+
options[:submit] = o
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on("-t", "--test", "Simulates a syncronisation without executing any command") do |o|
|
29
|
+
options[:simulate] = o
|
30
|
+
end
|
31
|
+
|
32
|
+
end.parse!
|
33
|
+
|
34
|
+
def error(msg)
|
35
|
+
puts msg
|
36
|
+
exit 1
|
37
|
+
end
|
38
|
+
|
39
|
+
error("Option --git required.") unless options[:git]
|
40
|
+
error("Option --p4 required.") unless options[:p4]
|
41
|
+
|
42
|
+
run options
|
43
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# COWBOY CODING FTW! TESTING IS FOR WUSSIES. ;-)
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/test_helper'
|
4
|
+
|
5
|
+
class CowboyTest < Test::Unit::TestCase
|
6
|
+
def test_my_awesomeness
|
7
|
+
(0..12612).each {
|
8
|
+
assert :this_code_does_not_contain_bugs
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_whos_evil
|
13
|
+
assert :git_ftw
|
14
|
+
assert :perforce_is_evil
|
15
|
+
end
|
16
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: git-p4-sync
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Carl Mercier
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-27 00:00:00 -04:00
|
13
|
+
default_executable: git-p4-sync
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: diff_dirs
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.1.2
|
24
|
+
version:
|
25
|
+
description: Submit changes made to a Git repository into to Perforce
|
26
|
+
email: carl@carlmercier.com
|
27
|
+
executables:
|
28
|
+
- git-p4-sync
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- LICENSE
|
33
|
+
- README.rdoc
|
34
|
+
files:
|
35
|
+
- LICENSE
|
36
|
+
- README.rdoc
|
37
|
+
- Rakefile
|
38
|
+
- VERSION
|
39
|
+
- bin/git-p4-sync
|
40
|
+
- lib/git_p4_sync.rb
|
41
|
+
- lib/init.rb
|
42
|
+
- lib/start.rb
|
43
|
+
- test/git_p4_sync_test.rb
|
44
|
+
- test/test_helper.rb
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: http://github.com/cmer/git-p4-sync
|
47
|
+
licenses: []
|
48
|
+
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options:
|
51
|
+
- --charset=UTF-8
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
version:
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: "0"
|
65
|
+
version:
|
66
|
+
requirements: []
|
67
|
+
|
68
|
+
rubyforge_project: git-p4-sync
|
69
|
+
rubygems_version: 1.3.2
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: Submit changes made to a Git repository into to Perforce
|
73
|
+
test_files:
|
74
|
+
- test/git_p4_sync_test.rb
|
75
|
+
- test/test_helper.rb
|