summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--EXAMPLES15
-rw-r--r--lib/git/base.rb11
-rw-r--r--lib/git/branch.rb32
-rw-r--r--lib/git/lib.rb13
-rw-r--r--tests/units/test_branch.rb4
-rw-r--r--tests/units/test_merge.rb104
6 files changed, 168 insertions, 11 deletions
diff --git a/EXAMPLES b/EXAMPLES
index 4a8d185..233cc7c 100644
--- a/EXAMPLES
+++ b/EXAMPLES
@@ -105,16 +105,17 @@ g.branch('existing_branch').checkout
g.checkout('new_branch')
g.checkout(g.branch('new_branch'))
-
-***** IMPLEMENTED *****
-
g.branch(name).merge(branch2)
-g.branch(branch2).merge
+g.branch(branch2).merge # merges HEAD with branch2
+g.branch(name).in_branch(message) { # add files } # auto-commits
g.merge('new_branch')
-g.merge(Git::Branch)
-g.merge(Git::Branch, Git::Branch)
-g.merge(Git::Remote)
+g.merge('origin/remote_branch')
+g.merge(b.branch('master'))
+g.merge([branch1, branch2])
+
+
+***** IMPLEMENTED *****
g.add_remote(uri, name) # Git::Remote
g.remotes
diff --git a/lib/git/base.rb b/lib/git/base.rb
index 342d535..0b837cb 100644
--- a/lib/git/base.rb
+++ b/lib/git/base.rb
@@ -156,7 +156,7 @@ module Git
def reset_hard(commitish = nil, opts = {})
opts = {:hard => true}.merge(opts)
- self.lib.reset(path, opts)
+ self.lib.reset(commitish, opts)
end
def commit(message, opts = {})
@@ -172,11 +172,20 @@ module Git
self.lib.checkout(branch, opts)
end
+ def merge(branch, message = 'merge')
+ self.lib.merge(branch, message)
+ end
+
# convenience methods
def revparse(objectish)
self.lib.revparse(objectish)
end
+
+ def current_branch
+ self.lib.branch_current
+ end
+
end
diff --git a/lib/git/branch.rb b/lib/git/branch.rb
index 3d8337b..1d4b64c 100644
--- a/lib/git/branch.rb
+++ b/lib/git/branch.rb
@@ -27,7 +27,24 @@ module Git
def checkout
check_if_create
- @base.lib.checkout(@name)
+ @base.checkout(@name)
+ end
+
+
+ # g.branch('new_branch').in_branch do
+ # # create new file
+ # # do other stuff
+ # return true # auto commits and switches back
+ # end
+ def in_branch (message = 'in branch work')
+ old_current = @base.lib.branch_current
+ checkout
+ if yield
+ @base.commit_all(message)
+ else
+ @base.reset_hard
+ end
+ @base.checkout(old_current)
end
def create
@@ -42,6 +59,19 @@ module Git
determine_current
end
+ def merge(branch = nil, message = nil)
+ if branch
+ in_branch do
+ @base.merge(branch, message)
+ false
+ end
+ # merge a branch into this one
+ else
+ # merge this branch into the current one
+ @base.merge(@name)
+ end
+ end
+
def to_s
@name
end
diff --git a/lib/git/lib.rb b/lib/git/lib.rb
index 41b3efb..9b3922e 100644
--- a/lib/git/lib.rb
+++ b/lib/git/lib.rb
@@ -257,6 +257,14 @@ module Git
command('checkout', arr_opts)
end
+ def merge(branch, message = nil)
+ arr_opts = []
+ arr_opts << ["-m '#{message}'"] if message
+ arr_opts << branch.to_a.join(' ')
+ command('merge', arr_opts)
+ end
+
+
private
def command_lines(cmd, opts = {})
@@ -278,7 +286,10 @@ module Git
#puts "git #{cmd} #{opts}"
#puts out
#puts
- if $?.exitstatus > 1
+ if $?.exitstatus > 0
+ if $?.exitstatus == 1 && out == ''
+ return ''
+ end
raise Git::GitExecuteError.new(out)
end
out
diff --git a/tests/units/test_branch.rb b/tests/units/test_branch.rb
index 1560c55..bc7d807 100644
--- a/tests/units/test_branch.rb
+++ b/tests/units/test_branch.rb
@@ -68,7 +68,9 @@ class TestBranch < Test::Unit::TestCase
assert(g.status.untracked.assoc('test-file1'))
assert(!g.status.added.assoc('test-file1'))
- g.branch('new_branch').delete
+ assert_raise Git::GitExecuteError do
+ g.branch('new_branch').delete
+ end
assert_equal(1, g.branches.select { |b| b.name == 'new_branch' }.size)
g.branch('master').checkout
diff --git a/tests/units/test_merge.rb b/tests/units/test_merge.rb
new file mode 100644
index 0000000..a0d74c3
--- /dev/null
+++ b/tests/units/test_merge.rb
@@ -0,0 +1,104 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class TestMerge < Test::Unit::TestCase
+ def setup
+ set_file_paths
+ end
+
+ def test_branch_and_merge
+ in_temp_dir do |path|
+ g = Git.clone(@wbare, 'branch_merge_test')
+ Dir.chdir('branch_merge_test') do
+
+ g.branch('new_branch').in_branch('test') do
+ assert_equal('new_branch', g.current_branch)
+ new_file('new_file_1', 'hello')
+ new_file('new_file_2', 'hello')
+ g.add
+ true
+ end
+
+ assert_equal('master', g.current_branch)
+
+ new_file('new_file_3', 'hello')
+ g.add
+
+ assert(!g.status['new_file_1']) # file is not there
+
+ assert(g.branch('new_branch').merge)
+ assert(g.status['new_file_1']) # file has been merged in
+ end
+ end
+ end
+
+ def test_branch_and_merge_two
+ in_temp_dir do |path|
+ g = Git.clone(@wbare, 'branch_merge_test')
+ Dir.chdir('branch_merge_test') do
+
+ g.branch('new_branch').in_branch('test') do
+ assert_equal('new_branch', g.current_branch)
+ new_file('new_file_1', 'hello')
+ new_file('new_file_2', 'hello')
+ g.add
+ true
+ end
+
+ g.branch('new_branch2').in_branch('test') do
+ assert_equal('new_branch2', g.current_branch)
+ new_file('new_file_3', 'hello')
+ new_file('new_file_4', 'hello')
+ g.add
+ true
+ end
+
+ g.branch('new_branch').merge('new_branch2')
+ assert(!g.status['new_file_3']) # still in master branch
+
+ g.branch('new_branch').checkout
+ assert(g.status['new_file_3']) # file has been merged in
+
+ g.branch('master').checkout
+ g.merge(g.branch('new_branch'))
+ assert(g.status['new_file_3']) # file has been merged in
+
+ end
+ end
+ end
+
+ def test_branch_and_merge_multiple
+ in_temp_dir do |path|
+ g = Git.clone(@wbare, 'branch_merge_test')
+ Dir.chdir('branch_merge_test') do
+
+ g.branch('new_branch').in_branch('test') do
+ assert_equal('new_branch', g.current_branch)
+ new_file('new_file_1', 'hello')
+ new_file('new_file_2', 'hello')
+ g.add
+ true
+ end
+
+ g.branch('new_branch2').in_branch('test') do
+ assert_equal('new_branch2', g.current_branch)
+ new_file('new_file_3', 'hello')
+ new_file('new_file_4', 'hello')
+ g.add
+ true
+ end
+
+ assert(!g.status['new_file_1']) # still in master branch
+ assert(!g.status['new_file_3']) # still in master branch
+
+ g.merge(['new_branch', 'new_branch2'])
+
+ assert(g.status['new_file_1']) # file has been merged in
+ assert(g.status['new_file_3']) # file has been merged in
+
+ end
+ end
+ end
+
+end \ No newline at end of file