diff options
-rw-r--r-- | EXAMPLES | 15 | ||||
-rw-r--r-- | lib/git/base.rb | 11 | ||||
-rw-r--r-- | lib/git/branch.rb | 32 | ||||
-rw-r--r-- | lib/git/lib.rb | 13 | ||||
-rw-r--r-- | tests/units/test_branch.rb | 4 | ||||
-rw-r--r-- | tests/units/test_merge.rb | 104 |
6 files changed, 168 insertions, 11 deletions
@@ -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 |