added tagging
[rubygit.git] / lib / git / branch.rb
blob4b4ecfc2aa0d0ab92460f44deb1bc8dd01eaa737
1 module Git
2   class Branch < Path
3     
4     attr_accessor :full, :remote, :name
5     
6     @base = nil
7     @gcommit = nil
8     
9     def initialize(base, name)
10       @remote = nil
11       @full = name
12       @base = base
13       
14       parts = name.split('/')
15       if parts[1]
16         @remote = Git::Remote.new(@base, parts[0])
17         @name = parts[1]
18       else
19         @name = parts[0]
20       end
21     end
22     
23     def gcommit
24       @gcommit = @base.object(name) if !@gcommit
25       @gcommit
26     end
27     
28     def checkout
29       check_if_create
30       @base.checkout(@name)
31     end
32     
33     
34     # g.branch('new_branch').in_branch do
35     #   # create new file
36     #   # do other stuff
37     #   return true # auto commits and switches back
38     # end
39     def in_branch (message = 'in branch work')
40       old_current = @base.lib.branch_current
41       checkout
42       if yield
43         @base.commit_all(message)
44       else
45         @base.reset_hard
46       end
47       @base.checkout(old_current)
48     end
49     
50     def create
51       check_if_create
52     end
53     
54     def delete
55       @base.lib.branch_delete(@name)
56     end
57     
58     def current
59       determine_current
60     end
61     
62     def merge(branch = nil, message = nil)
63       if branch
64         in_branch do 
65           @base.merge(branch, message)
66           false
67         end
68         # merge a branch into this one
69       else
70         # merge this branch into the current one
71         @base.merge(@name)
72       end
73     end
74     
75     def to_s
76       @full
77     end
78     
79     private 
81       def check_if_create
82         @base.lib.branch_new(@name) rescue nil
83       end
84       
85       def determine_current
86         @base.lib.branch_current == @name
87       end
88     
89   end
90 end